All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jacek Anaszewski <j.anaszewski@samsung.com>
To: mark.rutland@arm.com
Cc: swarren@wwwdotorg.org,
	Jacek Anaszewski <j.anaszewski@samsung.com>,
	devicetree@vger.kernel.org, linux-iio@vger.kernel.org,
	Jonathan Cameron <jic23@kernel.org>,
	maxime.ripard@free-electrons.com, lars@metafoo.de,
	l.czerwinski@samsung.com, rob.herring@calxeda.com,
	pawel.moll@arm.com, ian.campbell@citrix.com,
	s.nawrocki@samsung.com
Subject: Re: passing two interrupts two an I2C driver
Date: Wed, 21 Aug 2013 13:53:54 +0200	[thread overview]
Message-ID: <5214AA52.2060209@samsung.com> (raw)
In-Reply-To: <20130819084227.GC3719@e106331-lin.cambridge.arm.com>

On 08/19/2013 10:42 AM, Mark Rutland wrote:
> On Fri, Aug 16, 2013 at 07:48:55PM +0100, Stephen Warren wrote:
>> On 08/16/2013 08:47 AM, Jacek Anaszewski wrote:
>>> Hi all,
>>>
>>> I'd like to consult the implementation of DT binding for the I2C device
>>> that exposes two interrupt pins (INT1 and INT2). Both pins can be
>>> configured to generate either data ready interrupts or event interrupts.
>>> I want to implement DT binding that will handle also the situation
>>> when only one of the interrupt sources is routed from the device
>>> to the CPU.
>>>
>>> Below is my implementation using interrupt-map:
>>
>>> +  - interrupt-parent : phandle to the interrupt map subnode
>>
>> When using interrupt-parent to point at an interrupt map, I believe you
>> usually just point at the current node; there's no need to a child node.
>>
>>> +  - interrupts : interrupt mapping for LPS331AP interrupt sources:
>>> +                2 sources: 0 - data ready, 1 - threshold event
>>
>>> +  - irq-map : irq sub-node defining interrupt map
>>> +             (all properties listed below are required):
>>
>> So, this node isn't required.
>>
>>> +      - #interrupt-cells : should be 1
>>
>>> +      - #address-cells : should be 0
>>> +      - #size-cells : should be 0
>>
>> There are no addressed entities in this node, so I don't see why those
>> two properties are needed.
>>
>>> +      - interrupt-map : table of entries consisting of three child elements:
>>> +         - unit_interrupt_specifier - 0 : data ready, 1 : threshold event
>>> +         - interrupt parent phandle
>>> +         - parent unit interrupt specifier consisiting of two elements:
>>> +             - index of the interrupt within the controller
>>> +             - flags : should be 0
>>
>> It's up to the binding for the node referenced by the phandle to define
>> how many cells need be present for "flags", and their meaning. This
>> binding shouldn't attempt to describe those. Equally, the concept of
>> interrupt-map should be defined elsewwere (e.g.
>> Documentation/devicetree/bindings/interrupt-controller/interrupts.txt);
>> it's a generic that shouldn't need duplication in each binding that uses
>> interrupts.
>>
>>> +Example:
>>> +
>>> +lps331ap@5d {
>>> +       compatible = "st,lps331ap";
>>> +       reg =<0x5d>;
>>> +       drdy-int-pin = /bits/ 8<2>;
>>> +       interrupt-parent =<&irq_map>;
>>> +       interrupts =<0>,<1>;
>>> +
>>> +       irq_map: irq-map {
>>> +               #interrupt-cells =<1>;
>>> +               #address-cells =<0>;
>>> +               #size-cells =<0>;
>>> +               interrupt-map =<0&gpf0 5 0>;
>>> +       };
>>> +};
>>>
>>> And here is how the driver uses this information:
>>>
>>>   - if interrupt-map is empty then the driver configures
>>>     itself to work without interrupt support
>>
>> The presence or lack of interrupt support should be driven by the
>> presence of the interrupts property. interrupt-map should only be used
>> (if present) to assist in the parsing of the interrupts property.
>>
>>>   - if only one interrupt source is available then the driver
>>>     configures the device to generate data ready interrupts on
>>>     the corresponding INTx pin (in this case the driver must know which
>>>     of the device pins is routed to the cpu -
>>>     st,data-ready-interrupt-pin property conveys this information)
>>>   - if both interrupt sources are available then the driver configures
>>>     the device to generate data ready interrupts on the interrupt pin
>>>     corresponding to the interrupt source with index 0 and event
>>>     interrupts to the interrupt source with index 1.
>>>
>>> This solution seems to be a little awkward so I'd like to ask
>>> if there is any neater way to handle presented requirements.
>>> The solution must facilitate passing information about two
>>> interrupt sources two the I2C driver. I have been unable to find
>>> similar solution in the kernel so far.
>>
>> Indeed. I think it would be better to work as follows:
>>
>> interrupts: contains one or two interrupt specifiers. The first entry
>> always defines the data ready interrupt. The second entry, if present,
>> defines the threshold event interrupt. This at least allows the
>> following combinations to be very simple expressed:
>>
>> * no interrrupts
>> * just data
>> * both data and threshold (assuming they're routed to the same parent)
>>
>> (you could swap the order if it's likely to be more common to have just
>> a threshold interrupt without any data interrupt).
>>
>> In order to allow the presence of a threshold interrupt but no data
>> interrupt, then I think you would need interrupt-map:
>>
>> lps331ap: lps331ap@5d {
>> 	compatible = "st,lps331ap";
>> 	reg =<0x5d>;
>> 	interrupt-parent =<&lps331ap>;
>> 	interrupts =<0>,<1>;
>> 	interrupt-map =	<0 0>, /* nowhere */
>> 			<1&gpf0 6 0>;
>> };
>
> The interrupt-names property exists for this purpose (describing
> interrupts which may or may not be present). Describing a nonexistent
> interrupt and mapping it nowhere feels like a hack to me when we can
> describe exactly what's present.
>
> Thanks,
> Mark.

 From what I've figured out in order to obtain the interrupt id
by name the function

platform_get_irq_by_name(struct platform_device *dev, const char *name)

has to be exploited. Unfortunately required platform_device structure
is not available in the struct i2c_client that is passed to the
probe function of an i2c driver. Is there some different way to parse
the interrupt-names property from the I2C driver?

Thanks,
Jacek

  parent reply	other threads:[~2013-08-21 11:53 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-08-16 14:47 passing two interrupts two an I2C driver Jacek Anaszewski
2013-08-16 18:48 ` Stephen Warren
2013-08-19  8:42   ` Mark Rutland
2013-08-19 16:09     ` Stephen Warren
2013-08-20  8:44       ` Mark Rutland
2013-08-20 16:25         ` Stephen Warren
2013-08-21  8:54           ` Mark Rutland
2013-08-22 12:45             ` Rob Herring
2013-08-22 20:26               ` Stephen Warren
2013-08-21 11:53     ` Jacek Anaszewski [this message]
2013-08-21 12:34       ` Pawel Moll
     [not found]       ` <5214AA52.2060209-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>
2013-08-21 12:37         ` Pawel Moll
2013-08-21 12:37           ` Pawel Moll
2013-08-21 12:37           ` Pawel Moll
2013-08-21 17:54           ` Mark Brown
2013-08-21 17:54             ` Mark Brown
     [not found]             ` <20130821175446.GI26118-GFdadSzt00ze9xe1eoZjHA@public.gmane.org>
2013-08-22  9:23               ` Pawel Moll
2013-08-22  9:23                 ` Pawel Moll
2013-08-22  9:23                 ` Pawel Moll
2013-08-22 11:26                 ` Mark Brown
2013-08-22 11:26                   ` Mark Brown
     [not found]                   ` <20130822112619.GD26118-GFdadSzt00ze9xe1eoZjHA@public.gmane.org>
2013-08-22 11:44                     ` Pawel Moll
2013-08-22 11:44                       ` Pawel Moll
2013-08-22 11:44                       ` Pawel Moll
2013-08-22 13:19                       ` Mark Brown
2013-08-22 13:19                         ` Mark Brown

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=5214AA52.2060209@samsung.com \
    --to=j.anaszewski@samsung.com \
    --cc=devicetree@vger.kernel.org \
    --cc=ian.campbell@citrix.com \
    --cc=jic23@kernel.org \
    --cc=l.czerwinski@samsung.com \
    --cc=lars@metafoo.de \
    --cc=linux-iio@vger.kernel.org \
    --cc=mark.rutland@arm.com \
    --cc=maxime.ripard@free-electrons.com \
    --cc=pawel.moll@arm.com \
    --cc=rob.herring@calxeda.com \
    --cc=s.nawrocki@samsung.com \
    --cc=swarren@wwwdotorg.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.