From: Dmitry Torokhov <dmitry.torokhov@gmail.com>
To: Nick Dyer <nick@shmanahar.org>
Cc: Andrew Duggan <aduggan@synaptics.com>,
Chris Healy <cphealy@gmail.com>,
Henrik Rydberg <rydberg@bitmath.org>,
Benjamin Tissoires <benjamin.tissoires@redhat.com>,
Linus Walleij <linus.walleij@linaro.org>,
Bjorn Andersson <bjorn.andersson@linaro.org>,
linux-input@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v5 1/7] Input: synaptics-rmi4 - factor out functions from probe
Date: Mon, 7 Nov 2016 17:48:49 -0800 [thread overview]
Message-ID: <20161108014849.GC10133@dtor-ws> (raw)
In-Reply-To: <1477345917-25326-2-git-send-email-nick@shmanahar.org>
On Mon, Oct 24, 2016 at 10:51:51PM +0100, Nick Dyer wrote:
> Signed-off-by: Nick Dyer <nick@shmanahar.org>
> Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
Applied, thank you.
> ---
> drivers/input/rmi4/rmi_driver.c | 139 +++++++++++++++++++++++++---------------
> 1 file changed, 86 insertions(+), 53 deletions(-)
>
> diff --git a/drivers/input/rmi4/rmi_driver.c b/drivers/input/rmi4/rmi_driver.c
> index 4a88312..63c9e22 100644
> --- a/drivers/input/rmi4/rmi_driver.c
> +++ b/drivers/input/rmi4/rmi_driver.c
> @@ -38,6 +38,8 @@ static void rmi_free_function_list(struct rmi_device *rmi_dev)
> struct rmi_function *fn, *tmp;
> struct rmi_driver_data *data = dev_get_drvdata(&rmi_dev->dev);
>
> + rmi_dbg(RMI_DEBUG_CORE, &rmi_dev->dev, "Freeing function list\n");
> +
> data->f01_container = NULL;
>
> /* Doing it in the reverse order so F01 will be removed last */
> @@ -842,15 +844,90 @@ static inline int rmi_driver_of_probe(struct device *dev,
> }
> #endif
>
> +static int rmi_probe_interrupts(struct rmi_driver_data *data)
> +{
> + struct rmi_device *rmi_dev = data->rmi_dev;
> + struct device *dev = &rmi_dev->dev;
> + int irq_count;
> + size_t size;
> + void *irq_memory;
> + int retval;
> +
> + /*
> + * We need to count the IRQs and allocate their storage before scanning
> + * the PDT and creating the function entries, because adding a new
> + * function can trigger events that result in the IRQ related storage
> + * being accessed.
> + */
> + rmi_dbg(RMI_DEBUG_CORE, dev, "%s: Counting IRQs.\n", __func__);
> + irq_count = 0;
> + retval = rmi_scan_pdt(rmi_dev, &irq_count, rmi_count_irqs);
> + if (retval < 0) {
> + dev_err(dev, "IRQ counting failed with code %d.\n", retval);
> + return retval;
> + }
> + data->irq_count = irq_count;
> + data->num_of_irq_regs = (data->irq_count + 7) / 8;
> +
> + size = BITS_TO_LONGS(data->irq_count) * sizeof(unsigned long);
> + irq_memory = devm_kzalloc(dev, size * 4, GFP_KERNEL);
> + if (!irq_memory) {
> + dev_err(dev, "Failed to allocate memory for irq masks.\n");
> + return retval;
> + }
> +
> + data->irq_status = irq_memory + size * 0;
> + data->fn_irq_bits = irq_memory + size * 1;
> + data->current_irq_mask = irq_memory + size * 2;
> + data->new_irq_mask = irq_memory + size * 3;
> +
> + return retval;
> +}
> +
> +static int rmi_init_functions(struct rmi_driver_data *data)
> +{
> + struct rmi_device *rmi_dev = data->rmi_dev;
> + struct device *dev = &rmi_dev->dev;
> + int irq_count;
> + int retval;
> +
> + irq_count = 0;
> + rmi_dbg(RMI_DEBUG_CORE, dev, "%s: Creating functions.\n", __func__);
> + retval = rmi_scan_pdt(rmi_dev, &irq_count, rmi_create_function);
> + if (retval < 0) {
> + dev_err(dev, "Function creation failed with code %d.\n",
> + retval);
> + goto err_destroy_functions;
> + }
> +
> + if (!data->f01_container) {
> + dev_err(dev, "Missing F01 container!\n");
> + retval = -EINVAL;
> + goto err_destroy_functions;
> + }
> +
> + retval = rmi_read_block(rmi_dev,
> + data->f01_container->fd.control_base_addr + 1,
> + data->current_irq_mask, data->num_of_irq_regs);
> + if (retval < 0) {
> + dev_err(dev, "%s: Failed to read current IRQ mask.\n",
> + __func__);
> + goto err_destroy_functions;
> + }
> +
> + return 0;
> +
> +err_destroy_functions:
> + rmi_free_function_list(rmi_dev);
> + return retval;
> +}
> +
> static int rmi_driver_probe(struct device *dev)
> {
> struct rmi_driver *rmi_driver;
> struct rmi_driver_data *data;
> struct rmi_device_platform_data *pdata;
> struct rmi_device *rmi_dev;
> - size_t size;
> - void *irq_memory;
> - int irq_count;
> int retval;
>
> rmi_dbg(RMI_DEBUG_CORE, dev, "%s: Starting probe.\n",
> @@ -916,35 +993,11 @@ static int rmi_driver_probe(struct device *dev)
> PDT_PROPERTIES_LOCATION, retval);
> }
>
> - /*
> - * We need to count the IRQs and allocate their storage before scanning
> - * the PDT and creating the function entries, because adding a new
> - * function can trigger events that result in the IRQ related storage
> - * being accessed.
> - */
> - rmi_dbg(RMI_DEBUG_CORE, dev, "Counting IRQs.\n");
> - irq_count = 0;
> - retval = rmi_scan_pdt(rmi_dev, &irq_count, rmi_count_irqs);
> - if (retval < 0) {
> - dev_err(dev, "IRQ counting failed with code %d.\n", retval);
> - goto err;
> - }
> - data->irq_count = irq_count;
> - data->num_of_irq_regs = (data->irq_count + 7) / 8;
> -
> mutex_init(&data->irq_mutex);
>
> - size = BITS_TO_LONGS(data->irq_count) * sizeof(unsigned long);
> - irq_memory = devm_kzalloc(dev, size * 4, GFP_KERNEL);
> - if (!irq_memory) {
> - dev_err(dev, "Failed to allocate memory for irq masks.\n");
> + retval = rmi_probe_interrupts(data);
> + if (retval)
> goto err;
> - }
> -
> - data->irq_status = irq_memory + size * 0;
> - data->fn_irq_bits = irq_memory + size * 1;
> - data->current_irq_mask = irq_memory + size * 2;
> - data->new_irq_mask = irq_memory + size * 3;
>
> if (rmi_dev->xport->input) {
> /*
> @@ -961,36 +1014,16 @@ static int rmi_driver_probe(struct device *dev)
> dev_err(dev, "%s: Failed to allocate input device.\n",
> __func__);
> retval = -ENOMEM;
> - goto err_destroy_functions;
> + goto err;
> }
> rmi_driver_set_input_params(rmi_dev, data->input);
> data->input->phys = devm_kasprintf(dev, GFP_KERNEL,
> "%s/input0", dev_name(dev));
> }
>
> - irq_count = 0;
> - rmi_dbg(RMI_DEBUG_CORE, dev, "Creating functions.");
> - retval = rmi_scan_pdt(rmi_dev, &irq_count, rmi_create_function);
> - if (retval < 0) {
> - dev_err(dev, "Function creation failed with code %d.\n",
> - retval);
> - goto err_destroy_functions;
> - }
> -
> - if (!data->f01_container) {
> - dev_err(dev, "Missing F01 container!\n");
> - retval = -EINVAL;
> - goto err_destroy_functions;
> - }
> -
> - retval = rmi_read_block(rmi_dev,
> - data->f01_container->fd.control_base_addr + 1,
> - data->current_irq_mask, data->num_of_irq_regs);
> - if (retval < 0) {
> - dev_err(dev, "%s: Failed to read current IRQ mask.\n",
> - __func__);
> - goto err_destroy_functions;
> - }
> + retval = rmi_init_functions(data);
> + if (retval)
> + goto err;
>
> if (data->input) {
> rmi_driver_set_input_name(rmi_dev, data->input);
> --
> 2.7.4
>
--
Dmitry
next prev parent reply other threads:[~2016-11-08 2:06 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-10-24 21:51 [PATCH v5 0/7] Input: synaptics-rmi4 - F34 device reflash support Nick Dyer
2016-10-24 21:51 ` [PATCH v5 1/7] Input: synaptics-rmi4 - factor out functions from probe Nick Dyer
2016-11-08 1:48 ` Dmitry Torokhov [this message]
2016-10-24 21:51 ` [PATCH v5 2/7] Input: synaptics-rmi4 - add a couple of debug lines Nick Dyer
2016-11-08 1:49 ` Dmitry Torokhov
2016-10-24 21:51 ` [PATCH v5 3/7] Input: synaptics-rmi4 - add support for F34 device reflash Nick Dyer
2016-11-08 1:47 ` Dmitry Torokhov
2016-10-24 21:51 ` [PATCH v5 4/7] Input: synaptics-rmi4 - add support for F34 V7 bootloader Nick Dyer
2016-10-24 21:51 ` [PATCH v5 5/7] Input: synaptics-rmi4 - add sysfs attribute update_fw_status Nick Dyer
2016-10-24 21:51 ` [PATCH v5 6/7] Input: synaptics-rmi4 - add sysfs interfaces for hardware IDs Nick Dyer
2016-10-24 21:51 ` [PATCH v5 7/7] Input: synaptics-rmi4 - add package_id sysfs attribute Nick Dyer
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20161108014849.GC10133@dtor-ws \
--to=dmitry.torokhov@gmail.com \
--cc=aduggan@synaptics.com \
--cc=benjamin.tissoires@redhat.com \
--cc=bjorn.andersson@linaro.org \
--cc=cphealy@gmail.com \
--cc=linus.walleij@linaro.org \
--cc=linux-input@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=nick@shmanahar.org \
--cc=rydberg@bitmath.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).