* [PATCH v5 1/3] phy: rockchip: inno-usb2: convert clock management to bulk
@ 2024-10-11 6:51 Frank Wang
2024-10-11 6:51 ` [PATCH v5 2/3] dt-bindings: phy: rockchip,inno-usb2phy: add rk3576 Frank Wang
` (2 more replies)
0 siblings, 3 replies; 7+ messages in thread
From: Frank Wang @ 2024-10-11 6:51 UTC (permalink / raw)
To: vkoul, kishon, robh, krzk+dt, conor+dt, heiko
Cc: linux-phy, devicetree, linux-arm-kernel, linux-kernel,
linux-rockchip, william.wu, tim.chen, Frank Wang
From: Frank Wang <frank.wang@rock-chips.com>
Since some Rockchip SoCs (e.g RK3576) have more than one clock,
this converts the clock management from single to bulk method to
make the driver more flexible.
Signed-off-by: Frank Wang <frank.wang@rock-chips.com>
---
Changelog:
V5:
- use dev_err_probe() in clock enable error path in probe.
v4:
- a new patch split from the [PATCH v3 2/2], suggestions from Heiko.
v1-v3:
- none
drivers/phy/rockchip/phy-rockchip-inno-usb2.c | 45 +++++++++++++++----
1 file changed, 37 insertions(+), 8 deletions(-)
diff --git a/drivers/phy/rockchip/phy-rockchip-inno-usb2.c b/drivers/phy/rockchip/phy-rockchip-inno-usb2.c
index 6e5214862b8a3..f71266c27091e 100644
--- a/drivers/phy/rockchip/phy-rockchip-inno-usb2.c
+++ b/drivers/phy/rockchip/phy-rockchip-inno-usb2.c
@@ -229,9 +229,10 @@ struct rockchip_usb2phy_port {
* @dev: pointer to device.
* @grf: General Register Files regmap.
* @usbgrf: USB General Register Files regmap.
- * @clk: clock struct of phy input clk.
+ * @clks: array of phy input clocks.
* @clk480m: clock struct of phy output clk.
* @clk480m_hw: clock struct of phy output clk management.
+ * @num_clks: number of phy input clocks.
* @phy_reset: phy reset control.
* @chg_state: states involved in USB charger detection.
* @chg_type: USB charger types.
@@ -246,9 +247,10 @@ struct rockchip_usb2phy {
struct device *dev;
struct regmap *grf;
struct regmap *usbgrf;
- struct clk *clk;
+ struct clk_bulk_data *clks;
struct clk *clk480m;
struct clk_hw clk480m_hw;
+ int num_clks;
struct reset_control *phy_reset;
enum usb_chg_state chg_state;
enum power_supply_type chg_type;
@@ -310,6 +312,13 @@ static int rockchip_usb2phy_reset(struct rockchip_usb2phy *rphy)
return 0;
}
+static void rockchip_usb2phy_clk_bulk_disable(void *data)
+{
+ struct rockchip_usb2phy *rphy = data;
+
+ clk_bulk_disable_unprepare(rphy->num_clks, rphy->clks);
+}
+
static int rockchip_usb2phy_clk480m_prepare(struct clk_hw *hw)
{
struct rockchip_usb2phy *rphy =
@@ -376,7 +385,9 @@ rockchip_usb2phy_clk480m_register(struct rockchip_usb2phy *rphy)
{
struct device_node *node = rphy->dev->of_node;
struct clk_init_data init;
+ struct clk *refclk = NULL;
const char *clk_name;
+ int i;
int ret = 0;
init.flags = 0;
@@ -386,8 +397,15 @@ rockchip_usb2phy_clk480m_register(struct rockchip_usb2phy *rphy)
/* optional override of the clockname */
of_property_read_string(node, "clock-output-names", &init.name);
- if (rphy->clk) {
- clk_name = __clk_get_name(rphy->clk);
+ for (i = 0; i < rphy->num_clks; i++) {
+ if (!strncmp(rphy->clks[i].id, "phyclk", 6)) {
+ refclk = rphy->clks[i].clk;
+ break;
+ }
+ }
+
+ if (!IS_ERR(refclk)) {
+ clk_name = __clk_get_name(refclk);
init.parent_names = &clk_name;
init.num_parents = 1;
} else {
@@ -1399,15 +1417,26 @@ static int rockchip_usb2phy_probe(struct platform_device *pdev)
if (IS_ERR(rphy->phy_reset))
return PTR_ERR(rphy->phy_reset);
- rphy->clk = devm_clk_get_optional_enabled(dev, "phyclk");
- if (IS_ERR(rphy->clk))
- return dev_err_probe(&pdev->dev, PTR_ERR(rphy->clk),
- "failed to get phyclk\n");
+ ret = devm_clk_bulk_get_all(dev, &rphy->clks);
+ if (ret == -EPROBE_DEFER)
+ return dev_err_probe(&pdev->dev, -EPROBE_DEFER,
+ "failed to get phy clock\n");
+
+ /* Clocks are optional */
+ rphy->num_clks = ret < 0 ? 0 : ret;
ret = rockchip_usb2phy_clk480m_register(rphy);
if (ret)
return dev_err_probe(dev, ret, "failed to register 480m output clock\n");
+ ret = clk_bulk_prepare_enable(rphy->num_clks, rphy->clks);
+ if (ret)
+ return dev_err_probe(dev, ret, "failed to enable phy clock\n");
+
+ ret = devm_add_action_or_reset(dev, rockchip_usb2phy_clk_bulk_disable, rphy);
+ if (ret)
+ return ret;
+
if (rphy->phy_cfg->phy_tuning) {
ret = rphy->phy_cfg->phy_tuning(rphy);
if (ret)
--
2.45.2
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v5 2/3] dt-bindings: phy: rockchip,inno-usb2phy: add rk3576
2024-10-11 6:51 [PATCH v5 1/3] phy: rockchip: inno-usb2: convert clock management to bulk Frank Wang
@ 2024-10-11 6:51 ` Frank Wang
2024-10-11 14:38 ` Krzysztof Kozlowski
2024-10-15 6:19 ` Heiko Stübner
2024-10-11 6:51 ` [PATCH v5 3/3] phy: rockchip: inno-usb2: Add usb2 phys support for rk3576 Frank Wang
2024-10-15 6:18 ` [PATCH v5 1/3] phy: rockchip: inno-usb2: convert clock management to bulk Heiko Stübner
2 siblings, 2 replies; 7+ messages in thread
From: Frank Wang @ 2024-10-11 6:51 UTC (permalink / raw)
To: vkoul, kishon, robh, krzk+dt, conor+dt, heiko
Cc: linux-phy, devicetree, linux-arm-kernel, linux-kernel,
linux-rockchip, william.wu, tim.chen, Frank Wang
From: Frank Wang <frank.wang@rock-chips.com>
Add compatible for the USB2 phy in the Rockchip RK3576 SoC.
This change also refactor the clocks list as there are new clocks
adding used for the USB MMU in RK3576 SoC.
Signed-off-by: Frank Wang <frank.wang@rock-chips.com>
---
Changelog:
v5:
- move the clock-names item list to top-level property.
- only defined minItems/maxItems in each if: then block.
v4:
- refactor the clocks list used if:then:
v3:
- narrowed rk3576 clocks by compatible property.
v2:
- Categorize clock names by oneOf keyword.
v1:
- https://patchwork.kernel.org/project/linux-phy/patch/20240923025326.10467-1-frank.wang@rock-chips.com/
.../bindings/phy/rockchip,inno-usb2phy.yaml | 45 ++++++++++++++++++-
1 file changed, 43 insertions(+), 2 deletions(-)
diff --git a/Documentation/devicetree/bindings/phy/rockchip,inno-usb2phy.yaml b/Documentation/devicetree/bindings/phy/rockchip,inno-usb2phy.yaml
index 5254413137c64..6a7ef556414ce 100644
--- a/Documentation/devicetree/bindings/phy/rockchip,inno-usb2phy.yaml
+++ b/Documentation/devicetree/bindings/phy/rockchip,inno-usb2phy.yaml
@@ -20,6 +20,7 @@ properties:
- rockchip,rk3366-usb2phy
- rockchip,rk3399-usb2phy
- rockchip,rk3568-usb2phy
+ - rockchip,rk3576-usb2phy
- rockchip,rk3588-usb2phy
- rockchip,rv1108-usb2phy
@@ -34,10 +35,15 @@ properties:
const: 0
clocks:
- maxItems: 1
+ minItems: 1
+ maxItems: 3
clock-names:
- const: phyclk
+ minItems: 1
+ items:
+ - const: phyclk
+ - const: aclk
+ - const: aclk_slv
assigned-clocks:
description:
@@ -172,6 +178,41 @@ allOf:
- interrupts
- interrupt-names
+ - if:
+ properties:
+ compatible:
+ contains:
+ enum:
+ - rockchip,px30-usb2phy
+ - rockchip,rk3128-usb2phy
+ - rockchip,rk3228-usb2phy
+ - rockchip,rk3308-usb2phy
+ - rockchip,rk3328-usb2phy
+ - rockchip,rk3366-usb2phy
+ - rockchip,rk3399-usb2phy
+ - rockchip,rk3568-usb2phy
+ - rockchip,rk3588-usb2phy
+ - rockchip,rv1108-usb2phy
+ then:
+ properties:
+ clocks:
+ maxItems: 1
+ clock-names:
+ maxItems: 1
+
+ - if:
+ properties:
+ compatible:
+ contains:
+ enum:
+ - rockchip,rk3576-usb2phy
+ then:
+ properties:
+ clocks:
+ minItems: 3
+ clock-names:
+ minItems: 3
+
additionalProperties: false
examples:
--
2.45.2
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v5 3/3] phy: rockchip: inno-usb2: Add usb2 phys support for rk3576
2024-10-11 6:51 [PATCH v5 1/3] phy: rockchip: inno-usb2: convert clock management to bulk Frank Wang
2024-10-11 6:51 ` [PATCH v5 2/3] dt-bindings: phy: rockchip,inno-usb2phy: add rk3576 Frank Wang
@ 2024-10-11 6:51 ` Frank Wang
2024-10-15 6:23 ` Heiko Stübner
2024-10-15 6:18 ` [PATCH v5 1/3] phy: rockchip: inno-usb2: convert clock management to bulk Heiko Stübner
2 siblings, 1 reply; 7+ messages in thread
From: Frank Wang @ 2024-10-11 6:51 UTC (permalink / raw)
To: vkoul, kishon, robh, krzk+dt, conor+dt, heiko
Cc: linux-phy, devicetree, linux-arm-kernel, linux-kernel,
linux-rockchip, william.wu, tim.chen, Frank Wang
From: William Wu <william.wu@rock-chips.com>
The RK3576 SoC has two independent USB2.0 PHYs, and each PHY has
one port. This adds device specific data for it.
Signed-off-by: William Wu <william.wu@rock-chips.com>
Signed-off-by: Frank Wang <frank.wang@rock-chips.com>
---
Changelog:
v5:
- no changes.
v4:
- split the bulk clock management as a new patch, and this just leave
adding rk3576-specific data.
v3:
- amend the commit log adds clocks converting.
- retrieve the clock by "clks.id" in *_clk480m_register() function.
v2:
- no changes.
v1:
- https://patchwork.kernel.org/project/linux-phy/patch/20240923025326.10467-2-frank.wang@rock-chips.com/
drivers/phy/rockchip/phy-rockchip-inno-usb2.c | 103 ++++++++++++++++++
1 file changed, 103 insertions(+)
diff --git a/drivers/phy/rockchip/phy-rockchip-inno-usb2.c b/drivers/phy/rockchip/phy-rockchip-inno-usb2.c
index f71266c27091e..96f3d868a526f 100644
--- a/drivers/phy/rockchip/phy-rockchip-inno-usb2.c
+++ b/drivers/phy/rockchip/phy-rockchip-inno-usb2.c
@@ -1510,6 +1510,30 @@ static int rk3128_usb2phy_tuning(struct rockchip_usb2phy *rphy)
BIT(2) << BIT_WRITEABLE_SHIFT | 0);
}
+static int rk3576_usb2phy_tuning(struct rockchip_usb2phy *rphy)
+{
+ int ret;
+ u32 reg = rphy->phy_cfg->reg;
+
+ /* Deassert SIDDQ to power on analog block */
+ ret = regmap_write(rphy->grf, reg + 0x0010, GENMASK(29, 29) | 0x0000);
+ if (ret)
+ return ret;
+
+ /* Do reset after exit IDDQ mode */
+ ret = rockchip_usb2phy_reset(rphy);
+ if (ret)
+ return ret;
+
+ /* HS DC Voltage Level Adjustment 4'b1001 : +5.89% */
+ ret |= regmap_write(rphy->grf, reg + 0x000c, GENMASK(27, 24) | 0x0900);
+
+ /* HS Transmitter Pre-Emphasis Current Control 2'b10 : 2x */
+ ret |= regmap_write(rphy->grf, reg + 0x0010, GENMASK(20, 19) | 0x0010);
+
+ return ret;
+}
+
static int rk3588_usb2phy_tuning(struct rockchip_usb2phy *rphy)
{
int ret;
@@ -1938,6 +1962,84 @@ static const struct rockchip_usb2phy_cfg rk3568_phy_cfgs[] = {
{ /* sentinel */ }
};
+static const struct rockchip_usb2phy_cfg rk3576_phy_cfgs[] = {
+ {
+ .reg = 0x0,
+ .num_ports = 1,
+ .phy_tuning = rk3576_usb2phy_tuning,
+ .clkout_ctl = { 0x0008, 0, 0, 1, 0 },
+ .port_cfgs = {
+ [USB2PHY_PORT_OTG] = {
+ .phy_sus = { 0x0000, 8, 0, 0, 0x1d1 },
+ .bvalid_det_en = { 0x00c0, 1, 1, 0, 1 },
+ .bvalid_det_st = { 0x00c4, 1, 1, 0, 1 },
+ .bvalid_det_clr = { 0x00c8, 1, 1, 0, 1 },
+ .ls_det_en = { 0x00c0, 0, 0, 0, 1 },
+ .ls_det_st = { 0x00c4, 0, 0, 0, 1 },
+ .ls_det_clr = { 0x00c8, 0, 0, 0, 1 },
+ .disfall_en = { 0x00c0, 6, 6, 0, 1 },
+ .disfall_st = { 0x00c4, 6, 6, 0, 1 },
+ .disfall_clr = { 0x00c8, 6, 6, 0, 1 },
+ .disrise_en = { 0x00c0, 5, 5, 0, 1 },
+ .disrise_st = { 0x00c4, 5, 5, 0, 1 },
+ .disrise_clr = { 0x00c8, 5, 5, 0, 1 },
+ .utmi_avalid = { 0x0080, 1, 1, 0, 1 },
+ .utmi_bvalid = { 0x0080, 0, 0, 0, 1 },
+ .utmi_ls = { 0x0080, 5, 4, 0, 1 },
+ }
+ },
+ .chg_det = {
+ .cp_det = { 0x0080, 8, 8, 0, 1 },
+ .dcp_det = { 0x0080, 8, 8, 0, 1 },
+ .dp_det = { 0x0080, 9, 9, 1, 0 },
+ .idm_sink_en = { 0x0010, 5, 5, 1, 0 },
+ .idp_sink_en = { 0x0010, 5, 5, 0, 1 },
+ .idp_src_en = { 0x0010, 14, 14, 0, 1 },
+ .rdm_pdwn_en = { 0x0010, 14, 14, 0, 1 },
+ .vdm_src_en = { 0x0010, 7, 6, 0, 3 },
+ .vdp_src_en = { 0x0010, 7, 6, 0, 3 },
+ },
+ },
+ {
+ .reg = 0x2000,
+ .num_ports = 1,
+ .phy_tuning = rk3576_usb2phy_tuning,
+ .clkout_ctl = { 0x2008, 0, 0, 1, 0 },
+ .port_cfgs = {
+ [USB2PHY_PORT_OTG] = {
+ .phy_sus = { 0x2000, 8, 0, 0, 0x1d1 },
+ .bvalid_det_en = { 0x20c0, 1, 1, 0, 1 },
+ .bvalid_det_st = { 0x20c4, 1, 1, 0, 1 },
+ .bvalid_det_clr = { 0x20c8, 1, 1, 0, 1 },
+ .ls_det_en = { 0x20c0, 0, 0, 0, 1 },
+ .ls_det_st = { 0x20c4, 0, 0, 0, 1 },
+ .ls_det_clr = { 0x20c8, 0, 0, 0, 1 },
+ .disfall_en = { 0x20c0, 6, 6, 0, 1 },
+ .disfall_st = { 0x20c4, 6, 6, 0, 1 },
+ .disfall_clr = { 0x20c8, 6, 6, 0, 1 },
+ .disrise_en = { 0x20c0, 5, 5, 0, 1 },
+ .disrise_st = { 0x20c4, 5, 5, 0, 1 },
+ .disrise_clr = { 0x20c8, 5, 5, 0, 1 },
+ .utmi_avalid = { 0x2080, 1, 1, 0, 1 },
+ .utmi_bvalid = { 0x2080, 0, 0, 0, 1 },
+ .utmi_ls = { 0x2080, 5, 4, 0, 1 },
+ }
+ },
+ .chg_det = {
+ .cp_det = { 0x2080, 8, 8, 0, 1 },
+ .dcp_det = { 0x2080, 8, 8, 0, 1 },
+ .dp_det = { 0x2080, 9, 9, 1, 0 },
+ .idm_sink_en = { 0x2010, 5, 5, 1, 0 },
+ .idp_sink_en = { 0x2010, 5, 5, 0, 1 },
+ .idp_src_en = { 0x2010, 14, 14, 0, 1 },
+ .rdm_pdwn_en = { 0x2010, 14, 14, 0, 1 },
+ .vdm_src_en = { 0x2010, 7, 6, 0, 3 },
+ .vdp_src_en = { 0x2010, 7, 6, 0, 3 },
+ },
+ },
+ { /* sentinel */ }
+};
+
static const struct rockchip_usb2phy_cfg rk3588_phy_cfgs[] = {
{
.reg = 0x0000,
@@ -2109,6 +2211,7 @@ static const struct of_device_id rockchip_usb2phy_dt_match[] = {
{ .compatible = "rockchip,rk3366-usb2phy", .data = &rk3366_phy_cfgs },
{ .compatible = "rockchip,rk3399-usb2phy", .data = &rk3399_phy_cfgs },
{ .compatible = "rockchip,rk3568-usb2phy", .data = &rk3568_phy_cfgs },
+ { .compatible = "rockchip,rk3576-usb2phy", .data = &rk3576_phy_cfgs },
{ .compatible = "rockchip,rk3588-usb2phy", .data = &rk3588_phy_cfgs },
{ .compatible = "rockchip,rv1108-usb2phy", .data = &rv1108_phy_cfgs },
{}
--
2.45.2
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH v5 2/3] dt-bindings: phy: rockchip,inno-usb2phy: add rk3576
2024-10-11 6:51 ` [PATCH v5 2/3] dt-bindings: phy: rockchip,inno-usb2phy: add rk3576 Frank Wang
@ 2024-10-11 14:38 ` Krzysztof Kozlowski
2024-10-15 6:19 ` Heiko Stübner
1 sibling, 0 replies; 7+ messages in thread
From: Krzysztof Kozlowski @ 2024-10-11 14:38 UTC (permalink / raw)
To: Frank Wang
Cc: vkoul, kishon, robh, krzk+dt, conor+dt, heiko, linux-phy,
devicetree, linux-arm-kernel, linux-kernel, linux-rockchip,
william.wu, tim.chen, Frank Wang
On Fri, Oct 11, 2024 at 02:51:39PM +0800, Frank Wang wrote:
> From: Frank Wang <frank.wang@rock-chips.com>
>
> Add compatible for the USB2 phy in the Rockchip RK3576 SoC.
>
> This change also refactor the clocks list as there are new clocks
> adding used for the USB MMU in RK3576 SoC.
>
> Signed-off-by: Frank Wang <frank.wang@rock-chips.com>
> ---
Thanks for the changes.
Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v5 1/3] phy: rockchip: inno-usb2: convert clock management to bulk
2024-10-11 6:51 [PATCH v5 1/3] phy: rockchip: inno-usb2: convert clock management to bulk Frank Wang
2024-10-11 6:51 ` [PATCH v5 2/3] dt-bindings: phy: rockchip,inno-usb2phy: add rk3576 Frank Wang
2024-10-11 6:51 ` [PATCH v5 3/3] phy: rockchip: inno-usb2: Add usb2 phys support for rk3576 Frank Wang
@ 2024-10-15 6:18 ` Heiko Stübner
2 siblings, 0 replies; 7+ messages in thread
From: Heiko Stübner @ 2024-10-15 6:18 UTC (permalink / raw)
To: vkoul, kishon, robh, krzk+dt, conor+dt, Frank Wang
Cc: linux-phy, devicetree, linux-arm-kernel, linux-kernel,
linux-rockchip, william.wu, tim.chen, Frank Wang
Am Freitag, 11. Oktober 2024, 08:51:38 CEST schrieb Frank Wang:
> From: Frank Wang <frank.wang@rock-chips.com>
>
> Since some Rockchip SoCs (e.g RK3576) have more than one clock,
> this converts the clock management from single to bulk method to
> make the driver more flexible.
>
> Signed-off-by: Frank Wang <frank.wang@rock-chips.com>
thanks a lot for all the work you did on this
Reviewed-by: Heiko Stuebner <heiko@sntech.de>
> ---
> Changelog:
> V5:
> - use dev_err_probe() in clock enable error path in probe.
>
> v4:
> - a new patch split from the [PATCH v3 2/2], suggestions from Heiko.
>
> v1-v3:
> - none
>
> drivers/phy/rockchip/phy-rockchip-inno-usb2.c | 45 +++++++++++++++----
> 1 file changed, 37 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/phy/rockchip/phy-rockchip-inno-usb2.c b/drivers/phy/rockchip/phy-rockchip-inno-usb2.c
> index 6e5214862b8a3..f71266c27091e 100644
> --- a/drivers/phy/rockchip/phy-rockchip-inno-usb2.c
> +++ b/drivers/phy/rockchip/phy-rockchip-inno-usb2.c
> @@ -229,9 +229,10 @@ struct rockchip_usb2phy_port {
> * @dev: pointer to device.
> * @grf: General Register Files regmap.
> * @usbgrf: USB General Register Files regmap.
> - * @clk: clock struct of phy input clk.
> + * @clks: array of phy input clocks.
> * @clk480m: clock struct of phy output clk.
> * @clk480m_hw: clock struct of phy output clk management.
> + * @num_clks: number of phy input clocks.
> * @phy_reset: phy reset control.
> * @chg_state: states involved in USB charger detection.
> * @chg_type: USB charger types.
> @@ -246,9 +247,10 @@ struct rockchip_usb2phy {
> struct device *dev;
> struct regmap *grf;
> struct regmap *usbgrf;
> - struct clk *clk;
> + struct clk_bulk_data *clks;
> struct clk *clk480m;
> struct clk_hw clk480m_hw;
> + int num_clks;
> struct reset_control *phy_reset;
> enum usb_chg_state chg_state;
> enum power_supply_type chg_type;
> @@ -310,6 +312,13 @@ static int rockchip_usb2phy_reset(struct rockchip_usb2phy *rphy)
> return 0;
> }
>
> +static void rockchip_usb2phy_clk_bulk_disable(void *data)
> +{
> + struct rockchip_usb2phy *rphy = data;
> +
> + clk_bulk_disable_unprepare(rphy->num_clks, rphy->clks);
> +}
> +
> static int rockchip_usb2phy_clk480m_prepare(struct clk_hw *hw)
> {
> struct rockchip_usb2phy *rphy =
> @@ -376,7 +385,9 @@ rockchip_usb2phy_clk480m_register(struct rockchip_usb2phy *rphy)
> {
> struct device_node *node = rphy->dev->of_node;
> struct clk_init_data init;
> + struct clk *refclk = NULL;
> const char *clk_name;
> + int i;
> int ret = 0;
>
> init.flags = 0;
> @@ -386,8 +397,15 @@ rockchip_usb2phy_clk480m_register(struct rockchip_usb2phy *rphy)
> /* optional override of the clockname */
> of_property_read_string(node, "clock-output-names", &init.name);
>
> - if (rphy->clk) {
> - clk_name = __clk_get_name(rphy->clk);
> + for (i = 0; i < rphy->num_clks; i++) {
> + if (!strncmp(rphy->clks[i].id, "phyclk", 6)) {
> + refclk = rphy->clks[i].clk;
> + break;
> + }
> + }
> +
> + if (!IS_ERR(refclk)) {
> + clk_name = __clk_get_name(refclk);
> init.parent_names = &clk_name;
> init.num_parents = 1;
> } else {
> @@ -1399,15 +1417,26 @@ static int rockchip_usb2phy_probe(struct platform_device *pdev)
> if (IS_ERR(rphy->phy_reset))
> return PTR_ERR(rphy->phy_reset);
>
> - rphy->clk = devm_clk_get_optional_enabled(dev, "phyclk");
> - if (IS_ERR(rphy->clk))
> - return dev_err_probe(&pdev->dev, PTR_ERR(rphy->clk),
> - "failed to get phyclk\n");
> + ret = devm_clk_bulk_get_all(dev, &rphy->clks);
> + if (ret == -EPROBE_DEFER)
> + return dev_err_probe(&pdev->dev, -EPROBE_DEFER,
> + "failed to get phy clock\n");
> +
> + /* Clocks are optional */
> + rphy->num_clks = ret < 0 ? 0 : ret;
>
> ret = rockchip_usb2phy_clk480m_register(rphy);
> if (ret)
> return dev_err_probe(dev, ret, "failed to register 480m output clock\n");
>
> + ret = clk_bulk_prepare_enable(rphy->num_clks, rphy->clks);
> + if (ret)
> + return dev_err_probe(dev, ret, "failed to enable phy clock\n");
> +
> + ret = devm_add_action_or_reset(dev, rockchip_usb2phy_clk_bulk_disable, rphy);
> + if (ret)
> + return ret;
> +
> if (rphy->phy_cfg->phy_tuning) {
> ret = rphy->phy_cfg->phy_tuning(rphy);
> if (ret)
>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v5 2/3] dt-bindings: phy: rockchip,inno-usb2phy: add rk3576
2024-10-11 6:51 ` [PATCH v5 2/3] dt-bindings: phy: rockchip,inno-usb2phy: add rk3576 Frank Wang
2024-10-11 14:38 ` Krzysztof Kozlowski
@ 2024-10-15 6:19 ` Heiko Stübner
1 sibling, 0 replies; 7+ messages in thread
From: Heiko Stübner @ 2024-10-15 6:19 UTC (permalink / raw)
To: vkoul, kishon, robh, krzk+dt, conor+dt, Frank Wang
Cc: linux-phy, devicetree, linux-arm-kernel, linux-kernel,
linux-rockchip, william.wu, tim.chen, Frank Wang
Am Freitag, 11. Oktober 2024, 08:51:39 CEST schrieb Frank Wang:
> From: Frank Wang <frank.wang@rock-chips.com>
>
> Add compatible for the USB2 phy in the Rockchip RK3576 SoC.
>
> This change also refactor the clocks list as there are new clocks
> adding used for the USB MMU in RK3576 SoC.
>
> Signed-off-by: Frank Wang <frank.wang@rock-chips.com>
Reviewed-by: Heiko Stuebner <heiko@sntech.de>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v5 3/3] phy: rockchip: inno-usb2: Add usb2 phys support for rk3576
2024-10-11 6:51 ` [PATCH v5 3/3] phy: rockchip: inno-usb2: Add usb2 phys support for rk3576 Frank Wang
@ 2024-10-15 6:23 ` Heiko Stübner
0 siblings, 0 replies; 7+ messages in thread
From: Heiko Stübner @ 2024-10-15 6:23 UTC (permalink / raw)
To: vkoul, kishon, robh, krzk+dt, conor+dt, Frank Wang
Cc: linux-phy, devicetree, linux-arm-kernel, linux-kernel,
linux-rockchip, william.wu, tim.chen, Frank Wang
Hi Frank,
Am Freitag, 11. Oktober 2024, 08:51:40 CEST schrieb Frank Wang:
> From: William Wu <william.wu@rock-chips.com>
>
> The RK3576 SoC has two independent USB2.0 PHYs, and each PHY has
> one port. This adds device specific data for it.
>
> Signed-off-by: William Wu <william.wu@rock-chips.com>
> Signed-off-by: Frank Wang <frank.wang@rock-chips.com>
this matches nicely with how the other phy variants are done in the
driver. I am not a big fan of the numeric values, but at least the
comments explain what happens.
Reviewed-by: Heiko Stuebner <heiko@sntech.de>
> ---
> Changelog:
> v5:
> - no changes.
>
> v4:
> - split the bulk clock management as a new patch, and this just leave
> adding rk3576-specific data.
>
> v3:
> - amend the commit log adds clocks converting.
> - retrieve the clock by "clks.id" in *_clk480m_register() function.
>
> v2:
> - no changes.
>
> v1:
> - https://patchwork.kernel.org/project/linux-phy/patch/20240923025326.10467-2-frank.wang@rock-chips.com/
>
> drivers/phy/rockchip/phy-rockchip-inno-usb2.c | 103 ++++++++++++++++++
> 1 file changed, 103 insertions(+)
>
> diff --git a/drivers/phy/rockchip/phy-rockchip-inno-usb2.c b/drivers/phy/rockchip/phy-rockchip-inno-usb2.c
> index f71266c27091e..96f3d868a526f 100644
> --- a/drivers/phy/rockchip/phy-rockchip-inno-usb2.c
> +++ b/drivers/phy/rockchip/phy-rockchip-inno-usb2.c
> @@ -1510,6 +1510,30 @@ static int rk3128_usb2phy_tuning(struct rockchip_usb2phy *rphy)
> BIT(2) << BIT_WRITEABLE_SHIFT | 0);
> }
>
> +static int rk3576_usb2phy_tuning(struct rockchip_usb2phy *rphy)
> +{
> + int ret;
> + u32 reg = rphy->phy_cfg->reg;
> +
> + /* Deassert SIDDQ to power on analog block */
> + ret = regmap_write(rphy->grf, reg + 0x0010, GENMASK(29, 29) | 0x0000);
> + if (ret)
> + return ret;
> +
> + /* Do reset after exit IDDQ mode */
> + ret = rockchip_usb2phy_reset(rphy);
> + if (ret)
> + return ret;
> +
> + /* HS DC Voltage Level Adjustment 4'b1001 : +5.89% */
> + ret |= regmap_write(rphy->grf, reg + 0x000c, GENMASK(27, 24) | 0x0900);
> +
> + /* HS Transmitter Pre-Emphasis Current Control 2'b10 : 2x */
> + ret |= regmap_write(rphy->grf, reg + 0x0010, GENMASK(20, 19) | 0x0010);
> +
> + return ret;
> +}
> +
> static int rk3588_usb2phy_tuning(struct rockchip_usb2phy *rphy)
> {
> int ret;
> @@ -1938,6 +1962,84 @@ static const struct rockchip_usb2phy_cfg rk3568_phy_cfgs[] = {
> { /* sentinel */ }
> };
>
> +static const struct rockchip_usb2phy_cfg rk3576_phy_cfgs[] = {
> + {
> + .reg = 0x0,
> + .num_ports = 1,
> + .phy_tuning = rk3576_usb2phy_tuning,
> + .clkout_ctl = { 0x0008, 0, 0, 1, 0 },
> + .port_cfgs = {
> + [USB2PHY_PORT_OTG] = {
> + .phy_sus = { 0x0000, 8, 0, 0, 0x1d1 },
> + .bvalid_det_en = { 0x00c0, 1, 1, 0, 1 },
> + .bvalid_det_st = { 0x00c4, 1, 1, 0, 1 },
> + .bvalid_det_clr = { 0x00c8, 1, 1, 0, 1 },
> + .ls_det_en = { 0x00c0, 0, 0, 0, 1 },
> + .ls_det_st = { 0x00c4, 0, 0, 0, 1 },
> + .ls_det_clr = { 0x00c8, 0, 0, 0, 1 },
> + .disfall_en = { 0x00c0, 6, 6, 0, 1 },
> + .disfall_st = { 0x00c4, 6, 6, 0, 1 },
> + .disfall_clr = { 0x00c8, 6, 6, 0, 1 },
> + .disrise_en = { 0x00c0, 5, 5, 0, 1 },
> + .disrise_st = { 0x00c4, 5, 5, 0, 1 },
> + .disrise_clr = { 0x00c8, 5, 5, 0, 1 },
> + .utmi_avalid = { 0x0080, 1, 1, 0, 1 },
> + .utmi_bvalid = { 0x0080, 0, 0, 0, 1 },
> + .utmi_ls = { 0x0080, 5, 4, 0, 1 },
> + }
> + },
> + .chg_det = {
> + .cp_det = { 0x0080, 8, 8, 0, 1 },
> + .dcp_det = { 0x0080, 8, 8, 0, 1 },
> + .dp_det = { 0x0080, 9, 9, 1, 0 },
> + .idm_sink_en = { 0x0010, 5, 5, 1, 0 },
> + .idp_sink_en = { 0x0010, 5, 5, 0, 1 },
> + .idp_src_en = { 0x0010, 14, 14, 0, 1 },
> + .rdm_pdwn_en = { 0x0010, 14, 14, 0, 1 },
> + .vdm_src_en = { 0x0010, 7, 6, 0, 3 },
> + .vdp_src_en = { 0x0010, 7, 6, 0, 3 },
> + },
> + },
> + {
> + .reg = 0x2000,
> + .num_ports = 1,
> + .phy_tuning = rk3576_usb2phy_tuning,
> + .clkout_ctl = { 0x2008, 0, 0, 1, 0 },
> + .port_cfgs = {
> + [USB2PHY_PORT_OTG] = {
> + .phy_sus = { 0x2000, 8, 0, 0, 0x1d1 },
> + .bvalid_det_en = { 0x20c0, 1, 1, 0, 1 },
> + .bvalid_det_st = { 0x20c4, 1, 1, 0, 1 },
> + .bvalid_det_clr = { 0x20c8, 1, 1, 0, 1 },
> + .ls_det_en = { 0x20c0, 0, 0, 0, 1 },
> + .ls_det_st = { 0x20c4, 0, 0, 0, 1 },
> + .ls_det_clr = { 0x20c8, 0, 0, 0, 1 },
> + .disfall_en = { 0x20c0, 6, 6, 0, 1 },
> + .disfall_st = { 0x20c4, 6, 6, 0, 1 },
> + .disfall_clr = { 0x20c8, 6, 6, 0, 1 },
> + .disrise_en = { 0x20c0, 5, 5, 0, 1 },
> + .disrise_st = { 0x20c4, 5, 5, 0, 1 },
> + .disrise_clr = { 0x20c8, 5, 5, 0, 1 },
> + .utmi_avalid = { 0x2080, 1, 1, 0, 1 },
> + .utmi_bvalid = { 0x2080, 0, 0, 0, 1 },
> + .utmi_ls = { 0x2080, 5, 4, 0, 1 },
> + }
> + },
> + .chg_det = {
> + .cp_det = { 0x2080, 8, 8, 0, 1 },
> + .dcp_det = { 0x2080, 8, 8, 0, 1 },
> + .dp_det = { 0x2080, 9, 9, 1, 0 },
> + .idm_sink_en = { 0x2010, 5, 5, 1, 0 },
> + .idp_sink_en = { 0x2010, 5, 5, 0, 1 },
> + .idp_src_en = { 0x2010, 14, 14, 0, 1 },
> + .rdm_pdwn_en = { 0x2010, 14, 14, 0, 1 },
> + .vdm_src_en = { 0x2010, 7, 6, 0, 3 },
> + .vdp_src_en = { 0x2010, 7, 6, 0, 3 },
> + },
> + },
> + { /* sentinel */ }
> +};
> +
> static const struct rockchip_usb2phy_cfg rk3588_phy_cfgs[] = {
> {
> .reg = 0x0000,
> @@ -2109,6 +2211,7 @@ static const struct of_device_id rockchip_usb2phy_dt_match[] = {
> { .compatible = "rockchip,rk3366-usb2phy", .data = &rk3366_phy_cfgs },
> { .compatible = "rockchip,rk3399-usb2phy", .data = &rk3399_phy_cfgs },
> { .compatible = "rockchip,rk3568-usb2phy", .data = &rk3568_phy_cfgs },
> + { .compatible = "rockchip,rk3576-usb2phy", .data = &rk3576_phy_cfgs },
> { .compatible = "rockchip,rk3588-usb2phy", .data = &rk3588_phy_cfgs },
> { .compatible = "rockchip,rv1108-usb2phy", .data = &rv1108_phy_cfgs },
> {}
>
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2024-10-15 6:23 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-10-11 6:51 [PATCH v5 1/3] phy: rockchip: inno-usb2: convert clock management to bulk Frank Wang
2024-10-11 6:51 ` [PATCH v5 2/3] dt-bindings: phy: rockchip,inno-usb2phy: add rk3576 Frank Wang
2024-10-11 14:38 ` Krzysztof Kozlowski
2024-10-15 6:19 ` Heiko Stübner
2024-10-11 6:51 ` [PATCH v5 3/3] phy: rockchip: inno-usb2: Add usb2 phys support for rk3576 Frank Wang
2024-10-15 6:23 ` Heiko Stübner
2024-10-15 6:18 ` [PATCH v5 1/3] phy: rockchip: inno-usb2: convert clock management to bulk Heiko Stübner
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).