lkml.org 
[lkml]   [2017]   [Sep]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    SubjectApplied "Input: wm97xx: split out touchscreen registering" to the asoc tree
    Date
    The patch

    Input: wm97xx: split out touchscreen registering

    has been applied to the asoc tree at

    git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git

    All being well this means that it will be integrated into the linux-next
    tree (usually sometime in the next 24 hours) and sent to Linus during
    the next merge window (or sooner if it is a bug fix), however if
    problems are discovered then the patch may be dropped or reverted.

    You may get further e-mails resulting from automated or manual testing
    and review of the tree, please engage with people reporting problems and
    send followup patches addressing any issues that are reported if needed.

    If any updates are required or you are submitting further changes they
    should be sent as incremental updates against current git, existing
    patches will not be replaced.

    Please add any relevant lists and maintainers to the CCs when replying
    to this mail.

    Thanks,
    Mark

    From c72f61e7407335dfa5fe5947827777b1429cd883 Mon Sep 17 00:00:00 2001
    From: Robert Jarzmik <robert.jarzmik@free.fr>
    Date: Wed, 13 Sep 2017 21:37:16 +0200
    Subject: [PATCH] Input: wm97xx: split out touchscreen registering

    wm97xx-core does several things in it initialization :
    - touchscreen input device setup
    - battery device creation

    As the wm97xx is actually a multi-function device handling an audio
    codec, a touchscreen, a gpio block and an ADC, reshape the probing to
    isolate what is truly input/touchscreen specific from the remaining
    part.

    This is only code shuffling, there is no functional change.

    Signed-off-by: Robert Jarzmik <robert.jarzmik@free.fr>
    Acked-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
    Acked-by: Charles Keepax <ckeepax@opensource.wolfsonmicro.com>
    Signed-off-by: Mark Brown <broonie@kernel.org>
    ---
    drivers/input/touchscreen/wm97xx-core.c | 196 +++++++++++++++++++-------------
    1 file changed, 115 insertions(+), 81 deletions(-)

    diff --git a/drivers/input/touchscreen/wm97xx-core.c b/drivers/input/touchscreen/wm97xx-core.c
    index c9d1c91e1887..39869ffdc4fa 100644
    --- a/drivers/input/touchscreen/wm97xx-core.c
    +++ b/drivers/input/touchscreen/wm97xx-core.c
    @@ -581,27 +581,85 @@ static void wm97xx_ts_input_close(struct input_dev *idev)
    wm->codec->acc_enable(wm, 0);
    }

    -static int wm97xx_probe(struct device *dev)
    +static int wm97xx_register_touch(struct wm97xx *wm)
    {
    - struct wm97xx *wm;
    - struct wm97xx_pdata *pdata = dev_get_platdata(dev);
    - int ret = 0, id = 0;
    + struct wm97xx_pdata *pdata = dev_get_platdata(wm->dev);
    + int ret;

    - wm = kzalloc(sizeof(struct wm97xx), GFP_KERNEL);
    - if (!wm)
    + wm->input_dev = devm_input_allocate_device(wm->dev);
    + if (wm->input_dev == NULL)
    return -ENOMEM;
    - mutex_init(&wm->codec_mutex);

    - wm->dev = dev;
    - dev_set_drvdata(dev, wm);
    - wm->ac97 = to_ac97_t(dev);
    + /* set up touch configuration */
    + wm->input_dev->name = "wm97xx touchscreen";
    + wm->input_dev->phys = "wm97xx";
    + wm->input_dev->open = wm97xx_ts_input_open;
    + wm->input_dev->close = wm97xx_ts_input_close;
    +
    + __set_bit(EV_ABS, wm->input_dev->evbit);
    + __set_bit(EV_KEY, wm->input_dev->evbit);
    + __set_bit(BTN_TOUCH, wm->input_dev->keybit);
    +
    + input_set_abs_params(wm->input_dev, ABS_X, abs_x[0], abs_x[1],
    + abs_x[2], 0);
    + input_set_abs_params(wm->input_dev, ABS_Y, abs_y[0], abs_y[1],
    + abs_y[2], 0);
    + input_set_abs_params(wm->input_dev, ABS_PRESSURE, abs_p[0], abs_p[1],
    + abs_p[2], 0);
    +
    + input_set_drvdata(wm->input_dev, wm);
    + wm->input_dev->dev.parent = wm->dev;
    +
    + ret = input_register_device(wm->input_dev);
    + if (ret)
    + return ret;
    +
    + /*
    + * register our extended touch device (for machine specific
    + * extensions)
    + */
    + wm->touch_dev = platform_device_alloc("wm97xx-touch", -1);
    + if (!wm->touch_dev) {
    + ret = -ENOMEM;
    + goto touch_err;
    + }
    + platform_set_drvdata(wm->touch_dev, wm);
    + wm->touch_dev->dev.parent = wm->dev;
    + wm->touch_dev->dev.platform_data = pdata;
    + ret = platform_device_add(wm->touch_dev);
    + if (ret < 0)
    + goto touch_reg_err;
    +
    + return 0;
    +touch_reg_err:
    + platform_device_put(wm->touch_dev);
    +touch_err:
    + input_unregister_device(wm->input_dev);
    + wm->input_dev = NULL;
    +
    + return ret;
    +}
    +
    +static void wm97xx_unregister_touch(struct wm97xx *wm)
    +{
    + platform_device_unregister(wm->touch_dev);
    + input_unregister_device(wm->input_dev);
    + wm->input_dev = NULL;
    +}
    +
    +static int _wm97xx_probe(struct wm97xx *wm)
    +{
    + int id = 0;
    +
    + mutex_init(&wm->codec_mutex);
    + dev_set_drvdata(wm->dev, wm);

    /* check that we have a supported codec */
    id = wm97xx_reg_read(wm, AC97_VENDOR_ID1);
    if (id != WM97XX_ID1) {
    - dev_err(dev, "Device with vendor %04x is not a wm97xx\n", id);
    - ret = -ENODEV;
    - goto alloc_err;
    + dev_err(wm->dev,
    + "Device with vendor %04x is not a wm97xx\n", id);
    + return -ENODEV;
    }

    wm->id = wm97xx_reg_read(wm, AC97_VENDOR_ID2);
    @@ -629,8 +687,7 @@ static int wm97xx_probe(struct device *dev)
    default:
    dev_err(wm->dev, "Support for wm97%02x not compiled in.\n",
    wm->id & 0xff);
    - ret = -ENODEV;
    - goto alloc_err;
    + return -ENODEV;
    }

    /* set up physical characteristics */
    @@ -644,79 +701,58 @@ static int wm97xx_probe(struct device *dev)
    wm->gpio[4] = wm97xx_reg_read(wm, AC97_GPIO_STATUS);
    wm->gpio[5] = wm97xx_reg_read(wm, AC97_MISC_AFE);

    - wm->input_dev = input_allocate_device();
    - if (wm->input_dev == NULL) {
    - ret = -ENOMEM;
    - goto alloc_err;
    - }
    -
    - /* set up touch configuration */
    - wm->input_dev->name = "wm97xx touchscreen";
    - wm->input_dev->phys = "wm97xx";
    - wm->input_dev->open = wm97xx_ts_input_open;
    - wm->input_dev->close = wm97xx_ts_input_close;
    -
    - __set_bit(EV_ABS, wm->input_dev->evbit);
    - __set_bit(EV_KEY, wm->input_dev->evbit);
    - __set_bit(BTN_TOUCH, wm->input_dev->keybit);
    -
    - input_set_abs_params(wm->input_dev, ABS_X, abs_x[0], abs_x[1],
    - abs_x[2], 0);
    - input_set_abs_params(wm->input_dev, ABS_Y, abs_y[0], abs_y[1],
    - abs_y[2], 0);
    - input_set_abs_params(wm->input_dev, ABS_PRESSURE, abs_p[0], abs_p[1],
    - abs_p[2], 0);
    + return wm97xx_register_touch(wm);
    +}

    - input_set_drvdata(wm->input_dev, wm);
    - wm->input_dev->dev.parent = dev;
    +static void wm97xx_remove_battery(struct wm97xx *wm)
    +{
    + platform_device_unregister(wm->battery_dev);
    +}

    - ret = input_register_device(wm->input_dev);
    - if (ret < 0)
    - goto dev_alloc_err;
    +static int wm97xx_add_battery(struct wm97xx *wm,
    + struct wm97xx_batt_pdata *pdata)
    +{
    + int ret;

    - /* register our battery device */
    wm->battery_dev = platform_device_alloc("wm97xx-battery", -1);
    - if (!wm->battery_dev) {
    - ret = -ENOMEM;
    - goto batt_err;
    - }
    + if (!wm->battery_dev)
    + return -ENOMEM;
    +
    platform_set_drvdata(wm->battery_dev, wm);
    - wm->battery_dev->dev.parent = dev;
    - wm->battery_dev->dev.platform_data = pdata ? pdata->batt_pdata : NULL;
    + wm->battery_dev->dev.parent = wm->dev;
    + wm->battery_dev->dev.platform_data = pdata;
    ret = platform_device_add(wm->battery_dev);
    - if (ret < 0)
    - goto batt_reg_err;
    + if (ret)
    + platform_device_put(wm->battery_dev);

    - /* register our extended touch device (for machine specific
    - * extensions) */
    - wm->touch_dev = platform_device_alloc("wm97xx-touch", -1);
    - if (!wm->touch_dev) {
    - ret = -ENOMEM;
    - goto touch_err;
    - }
    - platform_set_drvdata(wm->touch_dev, wm);
    - wm->touch_dev->dev.parent = dev;
    - wm->touch_dev->dev.platform_data = pdata;
    - ret = platform_device_add(wm->touch_dev);
    + return ret;
    +}
    +
    +static int wm97xx_probe(struct device *dev)
    +{
    + struct wm97xx *wm;
    + int ret;
    + struct wm97xx_pdata *pdata = dev_get_platdata(dev);
    +
    + wm = devm_kzalloc(dev, sizeof(struct wm97xx), GFP_KERNEL);
    + if (!wm)
    + return -ENOMEM;
    +
    + wm->dev = dev;
    + wm->ac97 = to_ac97_t(dev);
    +
    + ret = _wm97xx_probe(wm);
    + if (ret)
    + return ret;
    +
    + ret = wm97xx_add_battery(wm, pdata ? pdata->batt_pdata : NULL);
    if (ret < 0)
    - goto touch_reg_err;
    + goto batt_err;

    return ret;

    - touch_reg_err:
    - platform_device_put(wm->touch_dev);
    - touch_err:
    - platform_device_del(wm->battery_dev);
    - batt_reg_err:
    - platform_device_put(wm->battery_dev);
    - batt_err:
    - input_unregister_device(wm->input_dev);
    - wm->input_dev = NULL;
    - dev_alloc_err:
    - input_free_device(wm->input_dev);
    - alloc_err:
    - kfree(wm);
    -
    +batt_err:
    + wm97xx_unregister_touch(wm);
    return ret;
    }

    @@ -724,10 +760,8 @@ static int wm97xx_remove(struct device *dev)
    {
    struct wm97xx *wm = dev_get_drvdata(dev);

    - platform_device_unregister(wm->battery_dev);
    - platform_device_unregister(wm->touch_dev);
    - input_unregister_device(wm->input_dev);
    - kfree(wm);
    + wm97xx_remove_battery(wm);
    + wm97xx_unregister_touch(wm);

    return 0;
    }
    --
    2.14.1
    \
     
     \ /
      Last update: 2017-09-19 18:13    [W:2.946 / U:0.028 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site