Re: [PATCH] gpio: add gpio_of_helper

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

 



Hi Alexandre,

> On Oct 23, 2014, at 11:53 AM, Alexandre Courbot <gnurou@xxxxxxxxx> wrote:
> 
> On Thu, Oct 23, 2014 at 3:23 PM, Jiří Prchal <jiri.prchal@xxxxxxxxxxx> wrote:
>> 
>> 
>> Dne 23.10.2014 v 07:08 Alexandre Courbot napsal(a):
>> 
>>> On Wed, Oct 22, 2014 at 6:58 PM, Pantelis Antoniou
>>> <panto@xxxxxxxxxxxxxxxxxxxxxxx> wrote:
>>>> 
>>>> Hi Alexandre,
>>>> 
>>>>> On Oct 22, 2014, at 12:41 PM, Alexandre Courbot <gnurou@xxxxxxxxx>
>>>>> wrote:
>>>>> 
>>>>> On Wed, Oct 22, 2014 at 6:24 PM, Pantelis Antoniou
>>>>> <panto@xxxxxxxxxxxxxxxxxxxxxxx> wrote:
>>>>>> 
>>>>>> Hi Alexandre,
>>>>>> 
>>>>>>> On Oct 22, 2014, at 12:18 PM, Alexandre Courbot <gnurou@xxxxxxxxx>
>>>>>>> wrote:
>>>>>>> 
>>>>>>> On Wed, Oct 22, 2014 at 5:26 PM, Jiri Prchal <jiri.prchal@xxxxxxxxxxx>
>>>>>>> wrote:
>>>>>>>> 
>>>>>>>> This patch adds new driver "gpio-of-helper", witch has possibility to
>>>>>>>> export
>>>>>>>> gpios defined in dt. It exports them in defined name under
>>>>>>>> /sysfs/class/gpio/name.
>>>>>>>> It's rebased from Pantelis Antoniou patch to new kernel.
>>>>>>>> Usage example:
>>>>>>>>       gpio {
>>>>>>>>               compatible = "gpio-of-helper";
>>>>>>>>               status = "okay";
>>>>>>>>               pinctrl-names = "default";
>>>>>>>>               pinctrl-0 = <&pinctrl_gpio>;
>>>>>>>> 
>>>>>>>>               gsm_on {
>>>>>>>>                       gpio-name = "gsm_on";
>>>>>>>>                       gpio = <&pioB 13 GPIO_ACTIVE_HIGH>;
>>>>>>>>                       output;
>>>>>>>>                       init-low;
>>>>>>>>               };
>>>>>>>>       };
>>>>>>>> 
>>>>>>>> This patch needs Alexey Ignatov [PATCH] gpiolib: allow exporting
>>>>>>>> gpios with
>>>>>>>> custom names.
>>>>>>> 
>>>>>>> 
>>>>>>> We will need to see whether the pre-requisite patch can get merged
>>>>>>> first, but there are a couple of things that are wrong with your patch
>>>>>>> anyway:
>>>>>>> 
>>>>>>> - it is missing a bindings documentation
>>>>>>> - it is using the legacy integer GPIOs instead of the descriptor
>>>>>>> interface (see include/linux/gpio/consumer.h). Since this is DT-based,
>>>>>>> there is absolutely no reason to not use the descriptors interface.
>>>>>>> - it seems quite long for what it needs to do
>>>>>>> - the MODULE_AUTHOR has not signed-off this patch (?)
>>>>>>> 
>>>>>>> But what makes me nervous is that this encourages more usage of the
>>>>>>> sysfs interface, an in a way that is potentially harmful.
>>>>>>> 
>>>>>>> Also, I don't know if the DT people will be happy with this idea.
>>>>>>> Since this concerns DT, please also add the devicetree list and get a
>>>>>>> Acked-by for the bindings you want to push by a DT maintainer.
>>>>>> 
>>>>>> 
>>>>>> Since I’m the original perpetrator, let me put a few words here for
>>>>>> posterity.
>>>>>> 
>>>>>> This patch was meant as a quick and dirty method for doing the
>>>>>> automatic export
>>>>>> and pinmux configuration from DT on a 3.8 kernel. The kernel APIs have
>>>>>> moved on
>>>>>> since. It wasn’t meant to be submitted for mainline right as it is.
>>>>>> 
>>>>>> Unfortunately (or fortunately for many people) it does what a lot of
>>>>>> people need
>>>>>> i.e. configures a board with heavily pinmuxed GPIO right at boot time.
>>>>>> 
>>>>>> I’m open at having a small discussion about how to do what the users of
>>>>>> this patch
>>>>>> do ‘right’.
>>>>> 
>>>>> 
>>>>> Sure, although the discussion might turn out to not be that "small". :)
>>>>> 
>>>> 
>>>> Heh ;)
>>>> 
>>>>> Pinmux configuration sounds like a job for pinmux more than GPIO, and
>>>>> exporting potentially many GPIOs to user-space sounds like a work for
>>>>> a proper driver.
>>>>> 
>>>> 
>>>> I’m afraid that’s not the case. A great many users do not require
>>>> anything
>>>> more than setting a pinmux and the GPIO configuration (input/output).
>>>> They can then do low speed I/O using the sysfs interface, without having
>>>> to
>>>> use any complex APIs (shell works just fine).
>>>> 
>>>> Think of stuff like controlling a sprinkler valve, or something like a
>>>> mechanical
>>>> door detection open state.
>>> 
>>> 
>>> That sounds like any kind of arbitrary device that can be temporarily
>>> connected to a set of GPIOs that will be bit-banged. Is my
>>> interpretation correct?
>> 
>> 
>> Not only temporarily. For example on/off switch of some hw on board like gsm
>> modem.
> 
> ... which should be handled in-kernel.
> 

Not really. This is part of some kind user-space ABI but which has to do
with the mapping of an named GPIO in the board schematics to user-space.

>> Or some optocoupler isoleted in/outs for general use from userspace.
> 
> ... which should thus be configured from userspace.
> 

No. It is used from userspace, but the the configuration of such is performed
by board specific means in the kernel.
 
>>> 
>>> 
>>> In that case, I seriously doubt that this should be part of the DT.
>>> Right now the DT is part of the firmware, and an immutable description
>>> of the hardware layout of a board - definitely such devices do not fit
>> 
>> This is our case of gpio. It's like LEDs, they are hw layout of board,
>> but they are in/out instead of LEDs are only output.
>>> 
>>> into that definition. This might change once the Device Tree Overlays
>>> are merged, but we are not there yet. If the DT maintainers say this
>>> is a valid use-case for overlays, then I will reconsider my position,
>>> but in any case it really looks like this could/should be done from
>>> user-space.
>> 
>> I don't think so as I explained - HW layout of boerd.
> 
> If it is a static hardware layout that makes the case even clearer -
> these devices should have a proper kernel driver that configures these
> GPIOs, and exports a proper interface to userspace, not just raw
> GPIOs.

Raw GPIOs is what the user-space application wants to use. There is no
higher abstraction possible.

What these applications need are:

1. A way to map a GPIO to a name that is board invariant. Many boards
move GPIOs around but the function typically stays the same. So for
instance rev-0 might have GARAGE_DOOR to GPIO_A10, and on subsequent
revision rev-1 it might be GARAGE_DOOR to GPIO_B08. The user-space
application that controls everything does not want to deal with revisions
ideally, just to know that the named GARAGE_DOOR gpio exists.

2. A way to have the pinmux configuration of said GPIO configured without
having to do anything explicit. I.e. on am335x the pinmux configuration is
decoupled from the GPIO driver; having a GPIO configured as a GPIO does not
alter the pinmux settings.

3. The user-space facing API must be simple, preferably file based like the
sysfs method right now. It is very simple to use even from within scripts.
 
> 
>> In other way I'm looking forward for DT overlays.
>>> 
>>> 
>>> You have almost all the necessary pieces: you can export, configure
>>> and manipulate any GPIO from the sysfs interface. The only thing you
>>> would be missing is a way to give a name to a GPIO, something that can
>>> easily be fixed.
>> 
>> But isn't it nice to have already exported gpios which are layouted out
>> from board. All other unexported gpios aren't connected to anywhere on
>> board. So user don't have to export or unexport anything.
>>> 
>>> 
>>> Since the devices you want to configure that way are typically
>>> removable or usage-specific, why would you want to store that
>>> information all the way up into the firmware? A commonly accepted
>>> wisdom is that what can be done in user-space should be done in
>>> user-space, and it really looks like this applies here.
>> 
>> They are NOT removable.
>>> 
>>> 
>>> Say you buy a Jetson TK1 to control that sprinkler valve (a good use
>>> for all these GPU cores!). The mainline DT has no knowledge about the
>>> valve, so using your proposed way you will have to re-build and flash
>>> a custom device tree just to be able to use your sprinkler. If you
>>> decide to assign your board to something else, you will need another
>>> DT.
>> 
>> But if you buy more "real world ready" board with for example 8 power
>> outputs for sprinkler valves, why has user think about what gpio to
>> export, if there could be valve0 - 7 ready. If he will use only valve0
>> does not mater, all unused gpio can't be used for anything else since
>> they has layout for valves.
> 
> The problem is indeed different.
> 
> If your sprinkler valves are wired on your board and the lines cannot
> be used for anything else, then what you need is a driver for the
> valve that will acquire the GPIOs and export its own userspace
> interface under /sys/.
> 
> You device tree must reflect the layout of the board ; in this case
> "here is a valve that uses this GPIO active-low". Saying "this GPIO is
> output active-low and named valve0" is not a good description of your
> hardware.
> 

There is no higher layer driver API. We don’t want to litter the kernel
with ‘valve’ drivers, there’s no such thing. There’s only digital I/Os
that’s connected to low speed devices.

If we are going for a higher layer API that would be something very thin
like a user-space GPIO driver. Do you see the conundrum?

>>> 
>>> 
>>> Instead, have a shell script or a systemd unit tmpfile that will
>>> perform the correct setup at boot time. Then you can easily switch
>>> usages from user-space (systemctl stop sprinkler && systemctl start
>>> doordetect). This is much, much more flexible. At least until the
>>> Device Tree Overlays are merged, but even then this seems overkill.
>> 
>> I seriously think about it, but I think if LEDs are in DT, GPIOs should
>> be there too. In other way, I don't like exporting without given name.
> 
> LEDs are actually a perfect example of what you should do. They are a
> simple device often plugged to a GPIO that controls them. We could
> very well do what you propose: export GPIOs named "ledXX" and call it
> a day. Instead we have a driver that exports a proper device node in
> /sys with the operations that are relevant to a LED.
> 
> Once your GPIOs are assigned to a given function, they are not
> "general purpose" anymore. Therefore you should expose the right
> abstraction to your users, even if that means writing some more code.

Please, try to understand how our users use our linux kernel drivers.

Jiri’s concerns are valid and I have seen his use patterns in countless
other cases.

Regards

— Pantelis
  --
To unsubscribe from this list: send the line "unsubscribe linux-gpio" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux SPI]     [Linux Kernel]     [Linux ARM (vger)]     [Linux ARM MSM]     [Linux Omap]     [Linux Arm]     [Linux Tegra]     [Fedora ARM]     [Linux for Samsung SOC]     [eCos]     [Linux Fastboot]     [Gcc Help]     [Git]     [DCCP]     [IETF Announce]     [Security]     [Linux MIPS]     [Yosemite Campsites]

  Powered by Linux