• Johan Hovold's avatar
    driver core: fix automatic pinctrl management · ed032c1b
    Johan Hovold authored
    Commit ab78029e ("drivers/pinctrl: grab default handles from device
    core") added automatic pin-control management to driver core by looking
    up and setting any default pinctrl state found in device tree while a
    device is being probed.
    
    This obviously runs into problems as soon as device-tree nodes are
    reused for child devices which are later also probed as pins would
    already have been claimed by the ancestor device.
    
    For example if a USB host controller claims a pin, its root hub would
    consequently fail to probe when its device-tree node is set to the node
    of the controller:
    
        pinctrl-single 48002030.pinmux: pin PIN204 already requested by 48064800.ehci; cannot claim for usb1
        pinctrl-single 48002030.pinmux: pin-204 (usb1) status -22
        pinctrl-single 48002030.pinmux: could not request pin 204 (PIN204) from group usb_dbg_pins  on device pinctrl-single
        usb usb1: Error applying setting, reverse things back
        usb: probe of usb1 failed with error -22
    
    Fix this by checking the new of_node_reused flag and skipping automatic
    pinctrl configuration during probe if set.
    
    Note that the flag is checked in driver core rather than in pinctrl
    (e.g. in pinctrl_dt_to_map()) which would specifically have prevented
    intentional use of a parent's pinctrl properties by a child device
    (should such a need ever arise).
    
    Fixes: ab78029e ("drivers/pinctrl: grab default handles from device core")
    Acked-by: default avatarLinus Walleij <linus.walleij@linaro.org>
    Signed-off-by: default avatarJohan Hovold <johan@kernel.org>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    ed032c1b
pinctrl.c 2.7 KB