lkml.org 
[lkml]   [2018]   [May]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.14 450/496] pinctrl: devicetree: Fix dt_to_map_one_config handling of hogs
    Date
    4.14-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Richard Fitzgerald <rf@opensource.cirrus.com>

    [ Upstream commit b89405b6102fcc3746f43697b826028caa94c823 ]

    When dt_to_map_one_config() is called with a pinctrl_dev passed
    in, it should only be using this if the node being looked up
    is a hog. The code was always using the passed pinctrl_dev
    without checking whether the dt node referred to it.

    A pin controller can have pinctrl-n dependencies on other pin
    controllers in these cases:

    - the pin controller hardware is external, for example I2C, so
    needs other pin controller(s) to be setup to communicate with
    the hardware device.

    - it is a child of a composite MFD so its of_node is shared with
    the parent MFD and other children of that MFD. Any part of that
    MFD could have dependencies on other pin controllers.

    Because of this, dt_to_map_one_config() can't assume that if it
    has a pinctrl_dev passed in then the node it looks up must be
    a hog. It could be a reference to some other pin controller.

    Signed-off-by: Richard Fitzgerald <rf@opensource.cirrus.com>
    Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
    Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    drivers/pinctrl/devicetree.c | 6 ++++--
    1 file changed, 4 insertions(+), 2 deletions(-)

    --- a/drivers/pinctrl/devicetree.c
    +++ b/drivers/pinctrl/devicetree.c
    @@ -122,8 +122,10 @@ static int dt_to_map_one_config(struct p
    /* OK let's just assume this will appear later then */
    return -EPROBE_DEFER;
    }
    - if (!pctldev)
    - pctldev = get_pinctrl_dev_from_of_node(np_pctldev);
    + /* If we're creating a hog we can use the passed pctldev */
    + if (pctldev && (np_pctldev == p->dev->of_node))
    + break;
    + pctldev = get_pinctrl_dev_from_of_node(np_pctldev);
    if (pctldev)
    break;
    /* Do not defer probing of hogs (circular loop) */

    \
     
     \ /
      Last update: 2018-05-28 14:24    [W:4.021 / U:0.100 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site