Re: [PATCH 3/3] iio: ak8975: Don't bail out for irq setup error

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




On March 17, 2014 3:44:43 PM GMT+00:00, Srinivas Pandruvada <srinivas.pandruvada@xxxxxxxxxxxxxxx> wrote:
>On 03/15/2014 08:14 AM, Jonathan Cameron wrote:
>> On 11/03/14 21:15, Srinivas Pandruvada wrote:
>>> This driver can very well work via polling, if request_irq failed.
>>> The problem is that many times i2c interrupts are shared. This
>>> driver is not ready for shared interrupt as it will return
>IRQ_HANDLED,
>>> in every case. Here we will get EBUSY when some other driver
>registered
>>> handler and this driver is grabbing in exclusive mode.
>>> So in this case just print error and continue in polling mode.
>>>
>>> Signed-off-by: Srinivas Pandruvada
><srinivas.pandruvada@xxxxxxxxxxxxxxx>
>> I'm not sure this is a good solution as it means that we will get
>very 
>> different
>> results depending on the probe order of various drivers.  How do
>other 
>> i2c drivers
>> cope with the fact that there is no way of knowing within the 
>> interrupt routine
>> that the device was the one causing the interrupt?
>>
>Agreed. The i2c driver currently don't receive irq flags in the client 
>structure. They
>only get irq number. We do get irq flags from the ACPI in this case or 
>from some
>platform init code. I have another patch to enhance ACPI i2c binding
>and 
>also enhance
>i2c_client structure.
>In addition this driver can be enhanced to use shared irq.
Let's hold this patch and do it properly once support is in place... 
>
>Thanks,
>Srinivas
>
>
>> A quick grep suggests that the normal trick is to had over to an irq 
>> thread
>> then return IRQ_NONE from that once we know it isn't our irq. Could
>we 
>> have
>> move the queue wakeup into a a thread (converting to a threaded 
>> interrupt) but
>> before it query the hardware to establish it is actually our
>interrupt?
>>> ---
>>>   drivers/iio/magnetometer/ak8975.c | 12 +++++++++---
>>>   1 file changed, 9 insertions(+), 3 deletions(-)
>>>
>>> diff --git a/drivers/iio/magnetometer/ak8975.c 
>>> b/drivers/iio/magnetometer/ak8975.c
>>> index fe5e9c8..0f9c407 100644
>>> --- a/drivers/iio/magnetometer/ak8975.c
>>> +++ b/drivers/iio/magnetometer/ak8975.c
>>> @@ -236,9 +236,15 @@ static int ak8975_setup(struct i2c_client
>*client)
>>>       if (data->eoc_gpio > 0 || client->irq) {
>>>           ret = ak8975_setup_irq(data);
>>>           if (ret < 0) {
>>> -            dev_err(&client->dev,
>>> -                "Error setting data ready interrupt\n");
>>> -            return ret;
>>> +            if (ret == -EBUSY) {
>>> +                dev_err(&client->dev,
>>> +                    "device Intr busy:polling required\n");
>>> +                ret = 0;
>>> +            } else {
>>> +                dev_err(&client->dev,
>>> +                    "Error setting data ready interrupt\n");
>>> +                return ret;
>>> +            }
>>>           }
>>>       }
>>>
>>>
>>
>>
>
>--
>To unsubscribe from this list: send the line "unsubscribe linux-iio" in
>the body of a message to majordomo@xxxxxxxxxxxxxxx
>More majordomo info at  http://vger.kernel.org/majordomo-info.html

-- 
Sent from my Android phone with K-9 Mail. Please excuse my brevity.
--
To unsubscribe from this list: send the line "unsubscribe linux-iio" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Input]     [Linux Kernel]     [Linux SCSI]     [X.org]

  Powered by Linux