Move gpio related code to descriptor-based interface. This makes driver to respect active physical level as specified in DT. Existing DT nodes are adjusted to reflect the former behaviour. Signed-off-by: Pavel Löbl <pavel@xxxxxxxx> --- arch/arm/boot/dts/exynos5250-arndale.dts | 4 +- .../boot/dts/sun8i-a83t-cubietruck-plus.dts | 2 +- arch/arm64/boot/dts/qcom/apq8016-sbc.dtsi | 2 +- drivers/usb/misc/usb3503.c | 79 +++++++------------ include/linux/platform_data/usb3503.h | 6 +- 5 files changed, 35 insertions(+), 58 deletions(-) diff --git a/arch/arm/boot/dts/exynos5250-arndale.dts b/arch/arm/boot/dts/exynos5250-arndale.dts index d6c85efdb465..344e15a4c959 100644 --- a/arch/arm/boot/dts/exynos5250-arndale.dts +++ b/arch/arm/boot/dts/exynos5250-arndale.dts @@ -153,8 +153,8 @@ xxti { usb_hub: usb-hub { compatible = "smsc,usb3503a"; - reset-gpios = <&gpx3 5 GPIO_ACTIVE_LOW>; - connect-gpios = <&gpd1 7 GPIO_ACTIVE_LOW>; + reset-gpios = <&gpx3 5 GPIO_ACTIVE_HIGH>; + connect-gpios = <&gpd1 7 GPIO_ACTIVE_HIGH>; }; }; diff --git a/arch/arm/boot/dts/sun8i-a83t-cubietruck-plus.dts b/arch/arm/boot/dts/sun8i-a83t-cubietruck-plus.dts index d9be511f054f..fb928503ad45 100644 --- a/arch/arm/boot/dts/sun8i-a83t-cubietruck-plus.dts +++ b/arch/arm/boot/dts/sun8i-a83t-cubietruck-plus.dts @@ -101,7 +101,7 @@ usb-hub { initial-mode = <1>; /* initialize in HUB mode */ disabled-ports = <1>; intn-gpios = <&pio 7 5 GPIO_ACTIVE_HIGH>; /* PH5 */ - reset-gpios = <&pio 4 16 GPIO_ACTIVE_LOW>; /* PE16 */ + reset-gpios = <&pio 4 16 GPIO_ACTIVE_HIGH>; /* PE16 */ connect-gpios = <&pio 4 17 GPIO_ACTIVE_HIGH>; /* PE17 */ refclk-frequency = <19200000>; }; diff --git a/arch/arm64/boot/dts/qcom/apq8016-sbc.dtsi b/arch/arm64/boot/dts/qcom/apq8016-sbc.dtsi index e12a36ce5d93..a1d3575edb39 100644 --- a/arch/arm64/boot/dts/qcom/apq8016-sbc.dtsi +++ b/arch/arm64/boot/dts/qcom/apq8016-sbc.dtsi @@ -498,7 +498,7 @@ wcnss@a21b000 { usb2513 { compatible = "smsc,usb3503"; - reset-gpios = <&pm8916_gpios 3 GPIO_ACTIVE_LOW>; + reset-gpios = <&pm8916_gpios 3 GPIO_ACTIVE_HIGH>; initial-mode = <1>; }; diff --git a/drivers/usb/misc/usb3503.c b/drivers/usb/misc/usb3503.c index 72f39a9751b5..d9ffb2d5c318 100644 --- a/drivers/usb/misc/usb3503.c +++ b/drivers/usb/misc/usb3503.c @@ -47,19 +47,19 @@ struct usb3503 { struct device *dev; struct clk *clk; u8 port_off_mask; - int gpio_intn; - int gpio_reset; - int gpio_connect; + struct gpio_desc *gpio_intn; + struct gpio_desc *gpio_reset; + struct gpio_desc *gpio_connect; bool secondary_ref_clk; }; static int usb3503_reset(struct usb3503 *hub, int state) { - if (!state && gpio_is_valid(hub->gpio_connect)) - gpio_set_value_cansleep(hub->gpio_connect, 0); + if (!state && hub->gpio_connect) + gpiod_set_value_cansleep(hub->gpio_connect, 0); - if (gpio_is_valid(hub->gpio_reset)) - gpio_set_value_cansleep(hub->gpio_reset, state); + if (hub->gpio_reset) + gpiod_set_value_cansleep(hub->gpio_reset, state); /* Wait T_HUBINIT == 4ms for hub logic to stabilize */ if (state) @@ -115,8 +115,8 @@ static int usb3503_connect(struct usb3503 *hub) } } - if (gpio_is_valid(hub->gpio_connect)) - gpio_set_value_cansleep(hub->gpio_connect, 1); + if (hub->gpio_connect) + gpiod_set_value_cansleep(hub->gpio_connect, 1); hub->mode = USB3503_MODE_HUB; dev_info(dev, "switched to HUB mode\n"); @@ -164,6 +164,7 @@ static int usb3503_probe(struct usb3503 *hub) u32 mode = USB3503_MODE_HUB; const u32 *property; int len; + int intn_level; if (pdata) { hub->port_off_mask = pdata->port_off_mask; @@ -230,59 +231,35 @@ static int usb3503_probe(struct usb3503 *hub) } } - hub->gpio_intn = of_get_named_gpio(np, "intn-gpios", 0); - if (hub->gpio_intn == -EPROBE_DEFER) - return -EPROBE_DEFER; - hub->gpio_connect = of_get_named_gpio(np, "connect-gpios", 0); - if (hub->gpio_connect == -EPROBE_DEFER) - return -EPROBE_DEFER; - hub->gpio_reset = of_get_named_gpio(np, "reset-gpios", 0); - if (hub->gpio_reset == -EPROBE_DEFER) - return -EPROBE_DEFER; - of_property_read_u32(np, "initial-mode", &mode); - hub->mode = mode; - } - - if (hub->port_off_mask && !hub->regmap) - dev_err(dev, "Ports disabled with no control interface\n"); - - if (gpio_is_valid(hub->gpio_intn)) { - int val = hub->secondary_ref_clk ? GPIOF_OUT_INIT_LOW : - GPIOF_OUT_INIT_HIGH; - err = devm_gpio_request_one(dev, hub->gpio_intn, val, - "usb3503 intn"); + intn_level = hub->secondary_ref_clk ? GPIOD_OUT_LOW : GPIOD_OUT_HIGH; + hub->gpio_intn = devm_gpiod_get_optional(dev, "intn", intn_level); + err = PTR_ERR_OR_ZERO(hub->gpio_intn); if (err) { - dev_err(dev, - "unable to request GPIO %d as interrupt pin (%d)\n", - hub->gpio_intn, err); + if (err != -EPROBE_DEFER) + dev_err(dev, "failed to get interrupt GPIO"); return err; } - } - - if (gpio_is_valid(hub->gpio_connect)) { - err = devm_gpio_request_one(dev, hub->gpio_connect, - GPIOF_OUT_INIT_LOW, "usb3503 connect"); + hub->gpio_connect = devm_gpiod_get_optional(dev, "connect", GPIOD_OUT_LOW); + err = PTR_ERR_OR_ZERO(hub->gpio_connect); if (err) { - dev_err(dev, - "unable to request GPIO %d as connect pin (%d)\n", - hub->gpio_connect, err); + if (err != -EPROBE_DEFER) + dev_err(dev, "failed to get GPIO for connect"); return err; } - } - - if (gpio_is_valid(hub->gpio_reset)) { - err = devm_gpio_request_one(dev, hub->gpio_reset, - GPIOF_OUT_INIT_LOW, "usb3503 reset"); - /* Datasheet defines a hardware reset to be at least 100us */ - usleep_range(100, 10000); + hub->gpio_reset = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_LOW); + err = PTR_ERR_OR_ZERO(hub->gpio_reset); if (err) { - dev_err(dev, - "unable to request GPIO %d as reset pin (%d)\n", - hub->gpio_reset, err); + if (err != -EPROBE_DEFER) + dev_err(dev, "failed to get reset GPIO"); return err; } + of_property_read_u32(np, "initial-mode", &mode); + hub->mode = mode; } + if (hub->port_off_mask && !hub->regmap) + dev_err(dev, "Ports disabled with no control interface\n"); + usb3503_switch_mode(hub, hub->mode); dev_info(dev, "%s: probed in %s mode\n", __func__, diff --git a/include/linux/platform_data/usb3503.h b/include/linux/platform_data/usb3503.h index e049d51c1353..3e966a62277e 100644 --- a/include/linux/platform_data/usb3503.h +++ b/include/linux/platform_data/usb3503.h @@ -17,9 +17,9 @@ enum usb3503_mode { struct usb3503_platform_data { enum usb3503_mode initial_mode; u8 port_off_mask; - int gpio_intn; - int gpio_connect; - int gpio_reset; + struct gpio_desc *gpio_intn; + struct gpio_desc *gpio_connect; + struct gpio_desc *gpio_reset; }; #endif -- 2.24.1