aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPeter Chen <peter.chen@nxp.com>2016-03-03 17:25:51 +0800
committerPeter Chen <peter.chen@nxp.com>2016-06-21 10:32:04 +0800
commit236dd95c9a8872af797cc504ea9d0fe74b8c55d3 (patch)
tree09ad94e25f352e69df70fed6cdcd8af4a5c9175c
parent18a1cdd4b6f301dd0b55d8b3c4874ef8bc375c99 (diff)
downloadusb-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.dtsi39
-rw-r--r--drivers/power/pwrseq/pwrseq_usb_generic.c4
-rw-r--r--drivers/usb/core/hub.c1
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 = <&reg_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)) {