Message ID | 20170511200211.20985-1-nikita.yoush@cogentembedded.com |
---|---|
State | New |
Headers | show |
* Nikita Yushchenko <nikita.yoush@cogentembedded.com> [170511 13:05]: > When pinctrl device registers, it automatically claims hogs, that is, > maps that pinctrl device serves for itself. > > It is possible that in addition to SoC's pinctrl device, other pinctrl > devices get registered. E.g. some gpio expander devies are registered > as pinctrl devices. For such devices, pinctrl maps could be defined > that set up SoC's pins (e.g. interrupt pin for gpio expander). Such > a map will have target device set to gpio expander. > > Here is device tree snippet that causes this scenario: > > &i2c0 { > sx1503@20 { > compatible = "semtech,sx1503q"; > pinctrl-names = "default"; > pinctrl-0 = <&pinctrl_sx1503_20>; > ... > }; > }; > ... > &iomuxc { > pinctrl_sx1503_20: pinctrl-sx1503-20 { > fsl,pins = < > VF610_PAD_PTB1__GPIO_23 0x219d > >; > }; > }; > > Such a map will have target device set to gpio expander. However is not > a hog, it is a regular map that is claimed by core before gpio expander > device is probed. > > Thus when looking for hogs, it is not enough to check that map's target > device is set to pinctrl device being registered. Need also check that > map's control device is also set to the same. > > Signed-off-by: Nikita Yushchenko <nikita.yoush@cogentembedded.com> > --- > drivers/pinctrl/core.c | 10 ++++++++++ > 1 file changed, 10 insertions(+) > > diff --git a/drivers/pinctrl/core.c b/drivers/pinctrl/core.c > index 1653cbda6a82..682ebd360030 100644 > --- a/drivers/pinctrl/core.c > +++ b/drivers/pinctrl/core.c > @@ -1038,6 +1038,16 @@ static struct pinctrl *create_pinctrl(struct device *dev, > /* Map must be for this device */ > if (strcmp(map->dev_name, devname)) > continue; > + /* > + * If pctldev is not null, we are claiming hog for it, > + * that means, setting that is served by pctldev by itself. > + * > + * Thus we must skip map that is for this device but is served > + * by other device. > + */ > + if (pctldev && > + strcmp(dev_name(pctldev->dev), map->ctrl_dev_name)) > + continue; > > ret = add_setting(p, pctldev, map); > /* > -- Maybe add a comment saying pctldev is NULL in the regular case and only exists in the hog case? Other than that: Acked-by: Tony Lindgren <tony@atomide.com> -- To unsubscribe from this list: send the line "unsubscribe linux-gpio" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
>> + /* >> + * If pctldev is not null, we are claiming hog for it, >> + * that means, setting that is served by pctldev by itself. >> + * >> + * Thus we must skip map that is for this device but is served >> + * by other device. >> + */ >> + if (pctldev && >> + strcmp(dev_name(pctldev->dev), map->ctrl_dev_name)) >> + continue; >> >> ret = add_setting(p, pctldev, map); >> /* >> -- > > Maybe add a comment saying pctldev is NULL in the regular case > and only exists in the hog case? Isn't comment above saying exactly that? -- To unsubscribe from this list: send the line "unsubscribe linux-gpio" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
* Nikita Yushchenko <nikita.yoush@cogentembedded.com> [170512 01:22]: > >> + /* > >> + * If pctldev is not null, we are claiming hog for it, > >> + * that means, setting that is served by pctldev by itself. > >> + * > >> + * Thus we must skip map that is for this device but is served > >> + * by other device. > >> + */ > >> + if (pctldev && > >> + strcmp(dev_name(pctldev->dev), map->ctrl_dev_name)) > >> + continue; > >> > >> ret = add_setting(p, pctldev, map); > >> /* > >> -- > > > > Maybe add a comment saying pctldev is NULL in the regular case > > and only exists in the hog case? > > Isn't comment above saying exactly that? Yes it is, you're right :) Tony -- To unsubscribe from this list: send the line "unsubscribe linux-gpio" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Thu, May 11, 2017 at 10:02 PM, Nikita Yushchenko <nikita.yoush@cogentembedded.com> wrote: > When pinctrl device registers, it automatically claims hogs, that is, > maps that pinctrl device serves for itself. > > It is possible that in addition to SoC's pinctrl device, other pinctrl > devices get registered. E.g. some gpio expander devies are registered > as pinctrl devices. For such devices, pinctrl maps could be defined > that set up SoC's pins (e.g. interrupt pin for gpio expander). Such > a map will have target device set to gpio expander. > > Here is device tree snippet that causes this scenario: > > &i2c0 { > sx1503@20 { > compatible = "semtech,sx1503q"; > pinctrl-names = "default"; > pinctrl-0 = <&pinctrl_sx1503_20>; > ... > }; > }; > ... > &iomuxc { > pinctrl_sx1503_20: pinctrl-sx1503-20 { > fsl,pins = < > VF610_PAD_PTB1__GPIO_23 0x219d > >; > }; > }; > > Such a map will have target device set to gpio expander. However is not > a hog, it is a regular map that is claimed by core before gpio expander > device is probed. > > Thus when looking for hogs, it is not enough to check that map's target > device is set to pinctrl device being registered. Need also check that > map's control device is also set to the same. > > Signed-off-by: Nikita Yushchenko <nikita.yoush@cogentembedded.com> Oh that looks logically correct, good find. I guess I tested multiple pin control devices on a system but not with also using hogs on them... Patch applied with Tony's ACK. Yours, Linus Walleij -- To unsubscribe from this list: send the line "unsubscribe linux-gpio" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/pinctrl/core.c b/drivers/pinctrl/core.c index 1653cbda6a82..682ebd360030 100644 --- a/drivers/pinctrl/core.c +++ b/drivers/pinctrl/core.c @@ -1038,6 +1038,16 @@ static struct pinctrl *create_pinctrl(struct device *dev, /* Map must be for this device */ if (strcmp(map->dev_name, devname)) continue; + /* + * If pctldev is not null, we are claiming hog for it, + * that means, setting that is served by pctldev by itself. + * + * Thus we must skip map that is for this device but is served + * by other device. + */ + if (pctldev && + strcmp(dev_name(pctldev->dev), map->ctrl_dev_name)) + continue; ret = add_setting(p, pctldev, map); /*