diff options
author | Peter Chen <peter.chen@nxp.com> | 2016-03-03 17:25:51 +0800 |
---|---|---|
committer | Peter Chen <peter.chen@nxp.com> | 2016-06-21 10:32:04 +0800 |
commit | 236dd95c9a8872af797cc504ea9d0fe74b8c55d3 (patch) | |
tree | 09ad94e25f352e69df70fed6cdcd8af4a5c9175c | |
parent | 18a1cdd4b6f301dd0b55d8b3c4874ef8bc375c99 (diff) | |
download | usb-add_pwrseq_for_usb.tar.gz |
usb: core: example for power sequence at imx6sx sdb boardadd_pwrseq_for_usb
Signed-off-by: Peter Chen <peter.chen@nxp.com>
-rw-r--r-- | arch/arm/boot/dts/imx6sx-sdb.dtsi | 39 | ||||
-rw-r--r-- | drivers/power/pwrseq/pwrseq_usb_generic.c | 4 | ||||
-rw-r--r-- | drivers/usb/core/hub.c | 1 |
3 files changed, 44 insertions, 0 deletions
diff --git a/arch/arm/boot/dts/imx6sx-sdb.dtsi b/arch/arm/boot/dts/imx6sx-sdb.dtsi index e5eafe4d9a701a..ea58e81a44fef5 100644 --- a/arch/arm/boot/dts/imx6sx-sdb.dtsi +++ b/arch/arm/boot/dts/imx6sx-sdb.dtsi @@ -146,6 +146,20 @@ mux-int-port = <2>; mux-ext-port = <6>; }; + + hub_genesys_1_pwrseq: hub_genesys_1_pwrseq { + compatible = "usb-pwrseq-generic"; + reset-gpios = <&gpio4 5 GPIO_ACTIVE_LOW>; /* hub reset pin */ + reset-duration-us = <10>; + clocks = <&clks IMX6SX_CLK_CKO>; + }; + + ethernet_asix_1_pwrseq: ethernet_asix_1_pwrseq { + compatible = "usb-pwrseq-generic"; + reset-gpios = <&gpio4 6 GPIO_ACTIVE_LOW>; /* ethernet_rst */ + reset-duration-us = <15>; + clocks = <&clks IMX6SX_CLK_IPG>; + }; }; &audmux { @@ -282,12 +296,37 @@ pinctrl-names = "default"; pinctrl-0 = <&pinctrl_usb_otg1_id>; status = "okay"; + + #address-cells = <1>; + #size-cells = <0>; + hub: genesys@1 { + compatible = "usb5e3,608"; + reg = <1>; + + power-sequence; + reset-gpios = <&gpio4 5 GPIO_ACTIVE_LOW>; /* hub reset pin */ + reset-duration-us = <10>; + clocks = <&clks IMX6SX_CLK_CKO>; + + #address-cells = <1>; + #size-cells = <0>; + ethernet: asix@1 { + compatible = "usbb95,1708"; + reg = <1>; + + power-sequence; + reset-gpios = <&gpio4 6 GPIO_ACTIVE_LOW>; /* ethernet_rst */ + reset-duration-us = <15>; + clocks = <&clks IMX6SX_CLK_IPG>; + }; + }; }; &usbotg2 { vbus-supply = <®_usb_otg2_vbus>; dr_mode = "host"; status = "okay"; + }; &usdhc2 { diff --git a/drivers/power/pwrseq/pwrseq_usb_generic.c b/drivers/power/pwrseq/pwrseq_usb_generic.c index 00e14580a4cbd2..b98b06883e8207 100644 --- a/drivers/power/pwrseq/pwrseq_usb_generic.c +++ b/drivers/power/pwrseq/pwrseq_usb_generic.c @@ -63,6 +63,7 @@ static int usb_pwrseq_power_on(struct pwrseq *_pwrseq) u32 duration_us = 50, clk_rate = 0; int ret; + dev_info(dev, "%s\n", __func__); if (pwrseq->clk) { ret = clk_prepare_enable(pwrseq->clk); if (ret) { @@ -72,6 +73,7 @@ static int usb_pwrseq_power_on(struct pwrseq *_pwrseq) return ret; } + dev_info(dev, "clock is enabled\n"); of_property_read_u32(node, "clock-frequency", &clk_rate); if (clk_rate) { ret = clk_set_rate(pwrseq->clk, clk_rate); @@ -85,6 +87,7 @@ static int usb_pwrseq_power_on(struct pwrseq *_pwrseq) if (gpiod_reset) { of_property_read_u32(node, "reset-duration-us", &duration_us); gpiod_direction_output(gpiod_reset, 1); + dev_info(dev, "duration is %d\n", duration_us); gpiod_set_value(gpiod_reset, 1); usleep_range(duration_us, duration_us + 10); @@ -171,6 +174,7 @@ static int usb_pwrseq_generic_probe(struct platform_device *pdev) pwrseq->pwrseq.owner = THIS_MODULE; platform_set_drvdata(pdev, pwrseq); + dev_info(dev, "%s\n", __func__); return pwrseq_register(&pwrseq->pwrseq); } diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index d92f20f776e737..a09d8a259503f5 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c @@ -1714,6 +1714,7 @@ static int hub_of_pwrseq_on(struct usb_hub *hub) else parent = bus_to_hcd(hdev->bus)->self.controller; + dev_info(&hdev->dev, "%s\n", __func__); for_each_child_of_node(parent->of_node, node) { hdev_pwrseq = pwrseq_alloc(node, "usb_pwrseq_generic"); if (!IS_ERR_OR_NULL(hdev_pwrseq)) { |