Add clock and reset in cdns3 platform
cover Add clock and reset in cdns3 platform
The patchset is add generic clock and reset init codes in Cadence USBSS controller.
This patchset is base on v6.3-rc4.
patch 1 is add clock and reset dts in cdns3 dt-binding doc. patch 2 is cdns3 platform codes changes.
Minda Chen (2):
dt-binding: cdns,usb3: Add clock and reset
usb: cdns3: cdns3-plat: Add clk and reset init
.../devicetree/bindings/usb/cdns,usb3.yaml | 12 +++++ drivers/usb/cdns3/cdns3-plat.c | 52 +++++++++++++++++++ drivers/usb/cdns3/core.h | 3 ++ 3 files changed, 67 insertions(+)
base-commit: 197b6b60ae7bc51dd0814953c562833143b292aa
Signature · 1 line
2.17.1
PATCH 1/2 dt-binding: cdns,usb3: Add clock and reset
To support generic clock and reset init in Cadence USBSS controller. Add clock and reset dts configuration.
--- Documentation/devicetree/bindings/usb/cdns,usb3.yaml | 12 ++++++++++++ 1 file changed, 12 insertions(+)
Documentation/devicetree/bindings/usb/cdns,usb3.yaml +12 -0
@@ -42,6 +42,18 @@ properties: - const: otg - const: wakeup + clocks: + minItems: 1 + + clock-names: + minItems: 1 + + resets: + minItems: 1 + + reset-names: + minItems: 1 + dr_mode: enum: [host, otg, peripheral]
Signature · 1 line
2.17.1
Re: [PATCH v1 1/2] dt-binding: cdns,usb3: Add clock and reset
Quoted 4 lines · Minda Chen
To support generic clock and reset init in Cadence USBSS controller. Add clock and reset dts configuration.
Signed-off-by Minda Chen <[email protected]>
Subject prefix: dt-bindings
Quoted 9 lines
--- Documentation/devicetree/bindings/usb/cdns,usb3.yaml | 12 ++++++++++++ 1 file changed, 12 insertions(+)Documentation/devicetree/bindings/usb/cdns,usb3.yaml +0
-0
Documentation/devicetree/bindings/usb/cdns,usb3.yaml properties: · line 46
Quoted 5 lines
Documentation/devicetree/bindings/usb/cdns,usb3.yaml +2
-0@@ -42,6 +42,18 @@ properties: - const: otg - const: wakeup + clocks: + minItems: 1
no, this must maxItems.
Documentation/devicetree/bindings/usb/cdns,usb3.yaml properties: · line 49
Quoted 3 lines
Documentation/devicetree/bindings/usb/cdns,usb3.yaml +3
-0+ + clock-names: + minItems: 1
Drop entire property, not useful without descriptive name.
Documentation/devicetree/bindings/usb/cdns,usb3.yaml properties: · line 52
Quoted 3 lines
Documentation/devicetree/bindings/usb/cdns,usb3.yaml +3
-0+ + resets: + minItems: 1
instead maxItems.
Documentation/devicetree/bindings/usb/cdns,usb3.yaml properties: · line 55
Quoted 3 lines
Documentation/devicetree/bindings/usb/cdns,usb3.yaml +3
-0+ + reset-names: + minItems: 1
Drop entire property, not useful without descriptive name.
Documentation/devicetree/bindings/usb/cdns,usb3.yaml properties: · line 59
Quoted 4 lines
Documentation/devicetree/bindings/usb/cdns,usb3.yaml +1
-0+ dr_mode: enum: [host, otg, peripheral]
Best regards,
Krzysztof
Re: [PATCH v1 1/2] dt-binding: cdns,usb3: Add clock and reset
Quoted 8 lines · Krzysztof Kozlowski
Quoted 4 lines · Minda Chen
To support generic clock and reset init in Cadence USBSS controller. Add clock and reset dts configuration.
Signed-off-by Minda Chen <[email protected]>Subject prefix: dt-bindings
ok
Quoted 12 lines
Quoted 12 lines
--- Documentation/devicetree/bindings/usb/cdns,usb3.yaml | 12 ++++++++++++ 1 file changed, 12 insertions(+)Documentation/devicetree/bindings/usb/cdns,usb3.yaml +0
-0@@ -42,6 +42,18 @@ properties: - const: otg - const: wakeup
Quoted 5 lines
Documentation/devicetree/bindings/usb/cdns,usb3.yaml properties: · line 46
Quoted 2 lines
Documentation/devicetree/bindings/usb/cdns,usb3.yaml +2
-0+ clocks: + minItems: 1no, this must maxItems.
ok
Quoted 6 lines
Documentation/devicetree/bindings/usb/cdns,usb3.yaml properties: · line 49
Quoted 3 lines
Documentation/devicetree/bindings/usb/cdns,usb3.yaml +3
-0+ + clock-names: + minItems: 1Drop entire property, not useful without descriptive name.
So I will delete clock-names and reset-names in my starfive codes.
Quoted 20 lines
Documentation/devicetree/bindings/usb/cdns,usb3.yaml properties: · line 52
Quoted 3 lines
Documentation/devicetree/bindings/usb/cdns,usb3.yaml +3
-0+ + resets: + minItems: 1instead maxItems.
Documentation/devicetree/bindings/usb/cdns,usb3.yaml properties: · line 55
Quoted 3 lines
Documentation/devicetree/bindings/usb/cdns,usb3.yaml +3
-0+ + reset-names: + minItems: 1Drop entire property, not useful without descriptive name.
Documentation/devicetree/bindings/usb/cdns,usb3.yaml properties: · line 59
Quoted 4 lines
Documentation/devicetree/bindings/usb/cdns,usb3.yaml +1
-0+ dr_mode: enum: [host, otg, peripheral]Best regards,
Krzysztof
Re: [PATCH v1 1/2] dt-binding: cdns,usb3: Add clock and reset
In reply to Minda ChenQuoted 2 lines · Minda Chen
To support generic clock and reset init in Cadence USBSS controller. Add clock and reset dts configuration.
s/. Add/, add/
(although still weird sentence)
Quoted 4 lines
Signed-off-by Minda Chen <[email protected]>--- Documentation/devicetree/bindings/usb/cdns,usb3.yaml | 12 ++++++++++++
Also update the example or any in-tree DTS. Why existing users do not need it? Aren't you duplicating clocks with wrapping node?
Best regards,
Krzysztof
Re: [PATCH v1 1/2] dt-binding: cdns,usb3: Add clock and reset
Quoted 7 lines · Krzysztof Kozlowski
Quoted 2 lines · Minda Chen
To support generic clock and reset init in Cadence USBSS controller. Add clock and reset dts configuration.
s/. Add/, add/
(although still weird sentence)
ok
Quoted 11 lines
Quoted 4 lines
Signed-off-by Minda Chen <[email protected]>--- Documentation/devicetree/bindings/usb/cdns,usb3.yaml | 12 ++++++++++++Also update the example or any in-tree DTS. Why existing users do not need it? Aren't you duplicating clocks with wrapping node?
Best regards,
Krzysztof
I will update the example. Exiting users are NXP and TI. NXP codes do not contain clock and resets, TI usb2 refclk require to set clock rate, TI codes can't direct use it. And I don't know TI's hardware. Maybe Roger can take into account to use it.
PATCH 2/2 usb: cdns3: cdns3-plat: Add clk and reset init
In reply to Minda ChenAdd gereric clk and reset init codes to Cadence USBSS controller. The codes has been tested by starfive vf2 board.
--- drivers/usb/cdns3/cdns3-plat.c | 52 ++++++++++++++++++++++++++++++++++ drivers/usb/cdns3/core.h | 3 ++ 2 files changed, 55 insertions(+)
drivers/usb/cdns3/cdns3-plat.c +52 -0
@@ -12,11 +12,13 @@* Roger Quadros <[email protected]> */ +#include <linux/clk.h> #include <linux/module.h> #include <linux/irq.h> #include <linux/kernel.h> #include <linux/platform_device.h> #include <linux/pm_runtime.h> +#include <linux/reset.h> #include "core.h" #include "gadget-export.h"
@@ -43,6 +45,34 @@ static void set_phy_power_off(struct cdns *cdns)phy_power_off (cdns->usb2_phy); } +static int cdns3_clk_rst_init (struct cdns *cdns) +{ +int ret; + +if (cdns->num_clks) { + ret =clk_bulk_prepare_enable (cdns->num_clks, cdns->clks); +if (ret) +return ret; + } + + ret =reset_control_deassert (cdns->resets); +if (ret && cdns->num_clks) + goto err_clk_init; + +return ret; + +err_clk_init: +clk_bulk_disable_unprepare (cdns->num_clks, cdns->clks); +return ret; +} + +static void cdns3_clk_rst_deinit (struct cdns *cdns) +{ +reset_control_assert (cdns->resets); +if (cdns->num_clks) +clk_bulk_disable_unprepare (cdns->num_clks, cdns->clks); +} +/** * cdns3_plat_probe - probe for cdns3 core device * @pdev: Pointer to cdns3 core platform device
@@ -116,6 +146,16 @@ static int cdns3_plat_probe(struct platform_device *pdev) cdns->wakeup_irq =0x0 ; } + ret =devm_clk_bulk_get_all (dev, &cdns->clks); +if (ret <0 ) +return ret; + + cdns->num_clks = ret; + + cdns->resets =devm_reset_control_array_get_optional_exclusive (dev); +if (IS_ERR (cdns->resets)) +return PTR_ERR (cdns->resets); + cdns->usb2_phy =devm_phy_optional_get (dev,"cdns3,usb2-phy" );if (IS_ERR (cdns->usb2_phy))return PTR_ERR (cdns->usb2_phy);
@@ -128,6 +168,10 @@ static int cdns3_plat_probe(struct platform_device *pdev)if (IS_ERR (cdns->usb3_phy))return PTR_ERR (cdns->usb3_phy); + ret =cdns3_clk_rst_init (cdns); +if (ret) +return ret; + ret =phy_init (cdns->usb3_phy);if (ret) goto err_phy3_init;
@@ -165,6 +209,7 @@ static int cdns3_plat_probe(struct platform_device *pdev)phy_exit (cdns->usb3_phy); err_phy3_init:phy_exit (cdns->usb2_phy); +cdns3_clk_rst_deinit (cdns);return ret; }
@@ -187,6 +232,8 @@ static int cdns3_plat_remove(struct platform_device *pdev)set_phy_power_off (cdns);phy_exit (cdns->usb2_phy);phy_exit (cdns->usb3_phy); +cdns3_clk_rst_deinit (cdns); +return 0 ; }
@@ -220,6 +267,8 @@ static int cdns3_controller_suspend(struct device *dev, pm_message_t msg)cdns3_set_platform_suspend (cdns->dev, true, wakeup);set_phy_power_off (cdns); +if (!PMSG_IS_AUTO (msg)) +cdns3_clk_rst_deinit (cdns);spin_lock_irqsave (&cdns->lock, flags); cdns->in_lpm = true;spin_unlock_irqrestore (&cdns->lock, flags);
@@ -237,6 +286,9 @@ static int cdns3_controller_resume(struct device *dev, pm_message_t msg)if (!cdns->in_lpm)return 0 ; +if (!PMSG_IS_AUTO (msg)) +cdns3_clk_rst_init (cdns); +if (cdns_power_is_lost (cdns)) {phy_exit (cdns->usb2_phy); ret =phy_init (cdns->usb2_phy);
drivers/usb/cdns3/core.h +3 -0
@@ -111,6 +111,9 @@ struct cdns {struct mutex mutex;enum usb_dr_mode dr_mode;struct usb_role_switch *role_sw; +struct reset_control *resets; +struct clk_bulk_data *clks; +int num_clks;bool in_lpm;bool wakeup_pending;struct cdns3_platform_data *pdata;
Signature · 1 line
2.17.1
Roger Quadros
reviewerRe: [PATCH v1 2/2] usb: cdns3: cdns3-plat: Add clk and reset init
Hi,
Quoted 35 lines · Minda Chen
Add gereric clk and reset init codes to Cadence USBSS controller. The codes has been tested by starfive vf2 board.
Signed-off-by Minda Chen <[email protected]>--- drivers/usb/cdns3/cdns3-plat.c | 52 ++++++++++++++++++++++++++++++++++ drivers/usb/cdns3/core.h | 3 ++ 2 files changed, 55 insertions(+)drivers/usb/cdns3/cdns3-plat.c +5
-0@@ -12,11 +12,13 @@* Roger Quadros <[email protected]> */ +#include <linux/clk.h> #include <linux/module.h> #include <linux/irq.h> #include <linux/kernel.h> #include <linux/platform_device.h> #include <linux/pm_runtime.h> +#include <linux/reset.h> #include "core.h" #include "gadget-export.h" @@ -43,6 +45,34 @@ static void set_phy_power_off(struct cdns *cdns)phy_power_off (cdns->usb2_phy); } +static int cdns3_clk_rst_init (struct cdns *cdns) +{ +int ret;
drivers/usb/cdns3/cdns3-plat.c static void set_phy_power_off(struct cdns *cdns) · line 60
Quoted 10 lines
drivers/usb/cdns3/cdns3-plat.c +10
-0+ +if (cdns->num_clks) { + ret =clk_bulk_prepare_enable (cdns->num_clks, cdns->clks); +if (ret) +return ret; + } + + ret =reset_control_deassert (cdns->resets); +if (ret && cdns->num_clks) + goto err_clk_init;
if (ret)
goto err_clk_init;
drivers/usb/cdns3/cdns3-plat.c static void set_phy_power_off(struct cdns *cdns) · line 65
Quoted 5 lines
drivers/usb/cdns3/cdns3-plat.c +5
-0+ +return ret; + +err_clk_init: +clk_bulk_disable_unprepare (cdns->num_clks, cdns->clks);
if (cdns->num_clks)
clk_bulk_disable_unprepare(cdns->num_clks, cdns->clks);
This way is more nicer I think.
Quoted 59 lines
drivers/usb/cdns3/cdns3-plat.c +27
-0+return ret; +} + +static void cdns3_clk_rst_deinit (struct cdns *cdns) +{ +reset_control_assert (cdns->resets); +if (cdns->num_clks) +clk_bulk_disable_unprepare (cdns->num_clks, cdns->clks); +} +/** * cdns3_plat_probe - probe for cdns3 core device * @pdev: Pointer to cdns3 core platform device @@ -116,6 +146,16 @@ static int cdns3_plat_probe(struct platform_device *pdev) cdns->wakeup_irq =0x0 ; } + ret =devm_clk_bulk_get_all (dev, &cdns->clks); +if (ret <0 ) +return ret; + + cdns->num_clks = ret; + + cdns->resets =devm_reset_control_array_get_optional_exclusive (dev); +if (IS_ERR (cdns->resets)) +return PTR_ERR (cdns->resets); + cdns->usb2_phy =devm_phy_optional_get (dev,"cdns3,usb2-phy" );if (IS_ERR (cdns->usb2_phy))return PTR_ERR (cdns->usb2_phy);@@ -128,6 +168,10 @@ static int cdns3_plat_probe(struct platform_device *pdev)if (IS_ERR (cdns->usb3_phy))return PTR_ERR (cdns->usb3_phy); + ret =cdns3_clk_rst_init (cdns); +if (ret) +return ret; + ret =phy_init (cdns->usb3_phy);if (ret) goto err_phy3_init;@@ -165,6 +209,7 @@ static int cdns3_plat_probe(struct platform_device *pdev)phy_exit (cdns->usb3_phy); err_phy3_init:phy_exit (cdns->usb2_phy); +cdns3_clk_rst_deinit (cdns);return ret; }@@ -187,6 +232,8 @@ static int cdns3_plat_remove(struct platform_device *pdev)set_phy_power_off (cdns);phy_exit (cdns->usb2_phy);phy_exit (cdns->usb3_phy); +cdns3_clk_rst_deinit (cdns); +return 0 ; }
drivers/usb/cdns3/cdns3-plat.c static int cdns3_controller_suspend(struct device *dev, pm_message_t msg) · line 271
Quoted 5 lines
drivers/usb/cdns3/cdns3-plat.c +2
-0@@ -220,6 +267,8 @@ static int cdns3_controller_suspend(struct device *dev, pm_message_t msg)cdns3_set_platform_suspend (cdns->dev, true, wakeup);set_phy_power_off (cdns); +if (!PMSG_IS_AUTO (msg)) +cdns3_clk_rst_deinit (cdns);
If you reset the controller here all state will be lost. How is it expected to work on system resume?
Quoted 18 lines
drivers/usb/cdns3/cdns3-plat.c +3
-0spin_lock_irqsave (&cdns->lock, flags); cdns->in_lpm = true;spin_unlock_irqrestore (&cdns->lock, flags);@@ -237,6 +286,9 @@ static int cdns3_controller_resume(struct device *dev, pm_message_t msg)if (!cdns->in_lpm)return 0 ; +if (!PMSG_IS_AUTO (msg)) +cdns3_clk_rst_init (cdns); +if (cdns_power_is_lost (cdns)) {phy_exit (cdns->usb2_phy); ret =phy_init (cdns->usb2_phy);drivers/usb/cdns3/core.h +0
-0
drivers/usb/cdns3/core.h struct cdns { · line 119
Quoted 9 lines
drivers/usb/cdns3/core.h +3
-0@@ -111,6 +111,9 @@ struct cdns {struct mutex mutex;enum usb_dr_mode dr_mode;struct usb_role_switch *role_sw; +struct reset_control *resets; +struct clk_bulk_data *clks; +int num_clks;bool in_lpm;bool wakeup_pending;struct cdns3_platform_data *pdata;
cheers,
-roger
Re: [PATCH v1 2/2] usb: cdns3: cdns3-plat: Add clk and reset init
Quoted 59 lines · Roger Quadros
Hi,
Quoted 35 lines · Minda Chen
Add gereric clk and reset init codes to Cadence USBSS controller. The codes has been tested by starfive vf2 board.
Signed-off-by Minda Chen <[email protected]>--- drivers/usb/cdns3/cdns3-plat.c | 52 ++++++++++++++++++++++++++++++++++ drivers/usb/cdns3/core.h | 3 ++ 2 files changed, 55 insertions(+)drivers/usb/cdns3/cdns3-plat.c +5
-0@@ -12,11 +12,13 @@* Roger Quadros <[email protected]> */ +#include <linux/clk.h> #include <linux/module.h> #include <linux/irq.h> #include <linux/kernel.h> #include <linux/platform_device.h> #include <linux/pm_runtime.h> +#include <linux/reset.h> #include "core.h" #include "gadget-export.h" @@ -43,6 +45,34 @@ static void set_phy_power_off(struct cdns *cdns)phy_power_off (cdns->usb2_phy); } +static int cdns3_clk_rst_init (struct cdns *cdns) +{ +int ret;drivers/usb/cdns3/cdns3-plat.c static void set_phy_power_off(struct cdns *cdns) · line 60
Quoted 10 lines
drivers/usb/cdns3/cdns3-plat.c +10
-0+ +if (cdns->num_clks) { + ret =clk_bulk_prepare_enable (cdns->num_clks, cdns->clks); +if (ret) +return ret; + } + + ret =reset_control_deassert (cdns->resets); +if (ret && cdns->num_clks) + goto err_clk_init;if (ret)
goto err_clk_init;drivers/usb/cdns3/cdns3-plat.c static void set_phy_power_off(struct cdns *cdns) · line 65
Quoted 5 lines
drivers/usb/cdns3/cdns3-plat.c +5
-0+ +return ret; + +err_clk_init: +clk_bulk_disable_unprepare (cdns->num_clks, cdns->clks);if (
cdns->num_clks)
Quoted 4 lines
clk_bulk_disable_unprepare(cdns->num_clks, cdns->clks);This way is more nicer I think.
OK, thanks.
Quoted 60 lines
Quoted 60 lines
drivers/usb/cdns3/cdns3-plat.c +27
-0+return ret; +} + +static void cdns3_clk_rst_deinit (struct cdns *cdns) +{ +reset_control_assert (cdns->resets); +if (cdns->num_clks) +clk_bulk_disable_unprepare (cdns->num_clks, cdns->clks); +} +/** * cdns3_plat_probe - probe for cdns3 core device * @pdev: Pointer to cdns3 core platform device @@ -116,6 +146,16 @@ static int cdns3_plat_probe(struct platform_device *pdev) cdns->wakeup_irq =0x0 ; } + ret =devm_clk_bulk_get_all (dev, &cdns->clks); +if (ret <0 ) +return ret; + + cdns->num_clks = ret; + + cdns->resets =devm_reset_control_array_get_optional_exclusive (dev); +if (IS_ERR (cdns->resets)) +return PTR_ERR (cdns->resets); + cdns->usb2_phy =devm_phy_optional_get (dev,"cdns3,usb2-phy" );if (IS_ERR (cdns->usb2_phy))return PTR_ERR (cdns->usb2_phy);@@ -128,6 +168,10 @@ static int cdns3_plat_probe(struct platform_device *pdev)if (IS_ERR (cdns->usb3_phy))return PTR_ERR (cdns->usb3_phy); + ret =cdns3_clk_rst_init (cdns); +if (ret) +return ret; + ret =phy_init (cdns->usb3_phy);if (ret) goto err_phy3_init;@@ -165,6 +209,7 @@ static int cdns3_plat_probe(struct platform_device *pdev)phy_exit (cdns->usb3_phy); err_phy3_init:phy_exit (cdns->usb2_phy); +cdns3_clk_rst_deinit (cdns);return ret; }@@ -187,6 +232,8 @@ static int cdns3_plat_remove(struct platform_device *pdev)set_phy_power_off (cdns);phy_exit (cdns->usb2_phy);phy_exit (cdns->usb3_phy); +cdns3_clk_rst_deinit (cdns); +return 0 ; }@@ -220,6 +267,8 @@ static int cdns3_controller_suspend(struct device *dev, pm_message_t msg)
Quoted 8 lines
drivers/usb/cdns3/cdns3-plat.c static int cdns3_controller_suspend(struct device *dev, pm_message_t msg) · line 271
Quoted 4 lines
drivers/usb/cdns3/cdns3-plat.c +2
-0cdns3_set_platform_suspend (cdns->dev, true, wakeup);set_phy_power_off (cdns); +if (!PMSG_IS_AUTO (msg)) +cdns3_clk_rst_deinit (cdns);If you reset the controller here all state will be lost. How is it expected to work on system resume?
I will delete them. This is platform codes.
Quoted 30 lines
Quoted 18 lines
drivers/usb/cdns3/cdns3-plat.c +3
-0spin_lock_irqsave (&cdns->lock, flags); cdns->in_lpm = true;spin_unlock_irqrestore (&cdns->lock, flags);@@ -237,6 +286,9 @@ static int cdns3_controller_resume(struct device *dev, pm_message_t msg)if (!cdns->in_lpm)return 0 ; +if (!PMSG_IS_AUTO (msg)) +cdns3_clk_rst_init (cdns); +if (cdns_power_is_lost (cdns)) {phy_exit (cdns->usb2_phy); ret =phy_init (cdns->usb2_phy);drivers/usb/cdns3/core.h +0
-0drivers/usb/cdns3/core.h struct cdns { · line 119
Quoted 9 lines
drivers/usb/cdns3/core.h +3
-0@@ -111,6 +111,9 @@ struct cdns {struct mutex mutex;enum usb_dr_mode dr_mode;struct usb_role_switch *role_sw; +struct reset_control *resets; +struct clk_bulk_data *clks; +int num_clks;bool in_lpm;bool wakeup_pending;struct cdns3_platform_data *pdata;cheers,
-roger