[PATCH 0/2] [v5] pinctrl: qcom: add support for sparse GPIOs
Timur Tabi
timur at codeaurora.org
Fri Sep 22 06:37:07 PDT 2017
On 09/22/2017 08:29 AM, Linus Walleij wrote:
>
> What is your response to Stephen's comment:
>
>> [Stephen Boyd]
>> Perhaps we can add another hook for our purposes here that
>> tells gpiolib that the gpio is not usable and to skip it. The
>> semantics would be clear, it's just about probing availability of
>> this pin as a gpio and doesn't mux any pins.
> I think this kind of related to my response (after I realized it
> was not just about IRQs):
We already have 95% of this. We can already specify individual pin
ranges, and the vast majority of the code recognizes the ranges. There
is only one small loophole, and that's in gpiochip_add_data(). The
for-loop iterates over all GPIOs:
for (i = 0; i < chip->ngpio; i++) {
struct gpio_desc *desc = &gdev->descs[i];
desc->gdev = gdev;
/*
* REVISIT: most hardware initializes GPIOs as inputs
* (often with pullups enabled) so power usage is
* minimized. Linux code should set the gpio direction
* first thing; but until it does, and in case
* chip->get_direction is not set, we may expose the
* wrong direction in sysfs.
*/
I believe the real problem is that this for-loop should be moved from
gpiochip_add_data() into some other function that is called *after* the
pin ranges are defined. We can put it in gpiochip_add_pin_range(), maybe.
My patch covers the loophole by adding a check inside get_direction().
If we fix gpiochip_add_data(), I can remove that patch.
However, I think that change is risky and will require a lot of testing
and review.
--
Qualcomm Datacenter Technologies, Inc. as an affiliate of Qualcomm
Technologies, Inc. Qualcomm Technologies, Inc. is a member of the
Code Aurora Forum, a Linux Foundation Collaborative Project.
More information about the linux-arm-kernel
mailing list