Files
BPI-CM9-Linux/build/patch/u-boot/v2024.07/board_rk322x-box/u-boot-1006-usbphy-otg-ehci-support.patch

214 lines
6.3 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Paolo Sabatino <[email protected]>
Date: Sun, 30 Jun 2024 16:46:51 +0200
Subject: OTG/EHCI USB support for rk322x
---
arch/arm/mach-rockchip/rk322x/syscon_rk322x.c | 3 +
drivers/clk/rockchip/clk_rk322x.c | 121 ++++++++++
drivers/phy/rockchip/phy-rockchip-inno-usb2.c | 32 +++
3 files changed, 156 insertions(+)
diff --git a/arch/arm/mach-rockchip/rk322x/syscon_rk322x.c b/arch/arm/mach-rockchip/rk322x/syscon_rk322x.c
index 111111111111..222222222222 100644
--- a/arch/arm/mach-rockchip/rk322x/syscon_rk322x.c
+++ b/arch/arm/mach-rockchip/rk322x/syscon_rk322x.c
@@ -17,5 +17,8 @@ static const struct udevice_id rk322x_syscon_ids[] = {
U_BOOT_DRIVER(syscon_rk322x) = {
.name = "rk322x_syscon",
.id = UCLASS_SYSCON,
+#if !CONFIG_IS_ENABLED(OF_PLATDATA)
+ .bind = dm_scan_fdt_dev,
+#endif
.of_match = rk322x_syscon_ids,
};
diff --git a/drivers/clk/rockchip/clk_rk322x.c b/drivers/clk/rockchip/clk_rk322x.c
index 111111111111..222222222222 100644
--- a/drivers/clk/rockchip/clk_rk322x.c
+++ b/drivers/clk/rockchip/clk_rk322x.c
@@ -596,10 +596,131 @@ static int rk322x_clk_set_parent(struct clk *clk, struct clk *parent)
return -ENOENT;
}
+static int rk322x_clk_enable(struct clk *clk)
+{
+
+ struct rk322x_clk_priv *priv = dev_get_priv(clk->dev);
+ struct rk322x_cru *cru = priv->cru;
+
+ switch (clk->id) {
+ case SCLK_OTGPHY0:
+ rk_clrreg(&cru->cru_clkgate_con[1], BIT(5));
+ break;
+ case SCLK_OTGPHY1:
+ rk_clrreg(&cru->cru_clkgate_con[1], BIT(6));
+ break;
+ case HCLK_OTG:
+ rk_clrreg(&cru->cru_clkgate_con[11], BIT(12));
+ break;
+ case HCLK_HOST0:
+ rk_clrreg(&cru->cru_clkgate_con[11], BIT(6));
+ break;
+ case HCLK_HOST1:
+ rk_clrreg(&cru->cru_clkgate_con[11], BIT(8));
+ break;
+ case HCLK_HOST2:
+ rk_clrreg(&cru->cru_clkgate_con[11], BIT(10));
+ break;
+ case SCLK_MAC:
+ rk_clrreg(&cru->cru_clkgate_con[1], BIT(6));
+ break;
+ case SCLK_MAC_SRC:
+ rk_clrreg(&cru->cru_clkgate_con[1], BIT(7));
+ break;
+ case SCLK_MAC_RX:
+ rk_clrreg(&cru->cru_clkgate_con[5], BIT(5));
+ break;
+ case SCLK_MAC_TX:
+ rk_clrreg(&cru->cru_clkgate_con[5], BIT(6));
+ break;
+ case SCLK_MAC_REF:
+ rk_clrreg(&cru->cru_clkgate_con[5], BIT(3));
+ break;
+ case SCLK_MAC_REFOUT:
+ rk_clrreg(&cru->cru_clkgate_con[5], BIT(4));
+ break;
+ case SCLK_MAC_PHY:
+ rk_clrreg(&cru->cru_clkgate_con[5], BIT(7));
+ break;
+ case ACLK_GMAC:
+ rk_clrreg(&cru->cru_clkgate_con[11], BIT(4));
+ break;
+ case PCLK_GMAC:
+ rk_clrreg(&cru->cru_clkgate_con[11], BIT(5));
+ break;
+ default:
+ log_debug("%s: unsupported clk %ld\n", __func__, clk->id);
+ return -ENOENT;
+ }
+
+ return 0;
+
+}
+
+static int rk322x_clk_disable(struct clk *clk)
+{
+
+ struct rk322x_clk_priv *priv = dev_get_priv(clk->dev);
+ struct rk322x_cru *cru = priv->cru;
+
+ switch (clk->id) {
+ case SCLK_OTGPHY0:
+ rk_setreg(&cru->cru_clkgate_con[1], BIT(5));
+ break;
+ case SCLK_OTGPHY1:
+ rk_setreg(&cru->cru_clkgate_con[1], BIT(6));
+ break;
+ case HCLK_OTG:
+ rk_setreg(&cru->cru_clkgate_con[11], BIT(12));
+ break;
+ case HCLK_HOST0:
+ rk_setreg(&cru->cru_clkgate_con[11], BIT(6));
+ break;
+ case HCLK_HOST1:
+ rk_setreg(&cru->cru_clkgate_con[11], BIT(8));
+ break;
+ case HCLK_HOST2:
+ rk_setreg(&cru->cru_clkgate_con[11], BIT(10));
+ break;
+ case SCLK_MAC_SRC:
+ rk_setreg(&cru->cru_clkgate_con[1], BIT(7));
+ break;
+ case SCLK_MAC_RX:
+ rk_setreg(&cru->cru_clkgate_con[5], BIT(5));
+ break;
+ case SCLK_MAC_TX:
+ rk_setreg(&cru->cru_clkgate_con[5], BIT(6));
+ break;
+ case SCLK_MAC_REF:
+ rk_setreg(&cru->cru_clkgate_con[5], BIT(3));
+ break;
+ case SCLK_MAC_REFOUT:
+ rk_setreg(&cru->cru_clkgate_con[5], BIT(4));
+ break;
+ case SCLK_MAC_PHY:
+ rk_setreg(&cru->cru_clkgate_con[5], BIT(7));
+ break;
+ case ACLK_GMAC:
+ rk_setreg(&cru->cru_clkgate_con[11], BIT(4));
+ break;
+ case PCLK_GMAC:
+ rk_setreg(&cru->cru_clkgate_con[11], BIT(5));
+ break;
+ default:
+ log_debug("%s: unsupported clk %ld\n", __func__, clk->id);
+ return -ENOENT;
+ }
+
+ return 0;
+
+}
+
static struct clk_ops rk322x_clk_ops = {
.get_rate = rk322x_clk_get_rate,
.set_rate = rk322x_clk_set_rate,
.set_parent = rk322x_clk_set_parent,
+ .enable = rk322x_clk_enable,
+ .disable = rk322x_clk_disable
};
static int rk322x_clk_of_to_plat(struct udevice *dev)
diff --git a/drivers/phy/rockchip/phy-rockchip-inno-usb2.c b/drivers/phy/rockchip/phy-rockchip-inno-usb2.c
index 111111111111..222222222222 100644
--- a/drivers/phy/rockchip/phy-rockchip-inno-usb2.c
+++ b/drivers/phy/rockchip/phy-rockchip-inno-usb2.c
@@ -361,6 +361,34 @@ static const struct rockchip_usb2phy_cfg rk3328_usb2phy_cfgs[] = {
{ /* sentinel */ }
};
+static const struct rockchip_usb2phy_cfg rk3228_phy_cfgs[] = {
+ {
+ .reg = 0x760,
+ .clkout_ctl = { 0x0768, 4, 4, 1, 0 },
+ .port_cfgs = {
+ [USB2PHY_PORT_OTG] = {
+ .phy_sus = { 0x0760, 15, 0, 0, 0x1d1 },
+ },
+ [USB2PHY_PORT_HOST] = {
+ .phy_sus = { 0x0764, 15, 0, 0, 0x1d1 },
+ }
+ },
+ },
+ {
+ .reg = 0x800,
+ .clkout_ctl = { 0x0808, 4, 4, 1, 0 },
+ .port_cfgs = {
+ [USB2PHY_PORT_OTG] = {
+ .phy_sus = { 0x800, 15, 0, 0, 0x1d1 },
+ },
+ [USB2PHY_PORT_HOST] = {
+ .phy_sus = { 0x804, 15, 0, 0, 0x1d1 },
+ }
+ },
+ },
+ { /* sentinel */ }
+};
+
static const struct rockchip_usb2phy_cfg rk3399_usb2phy_cfgs[] = {
{
.reg = 0xe450,
@@ -466,6 +494,10 @@ static const struct udevice_id rockchip_usb2phy_ids[] = {
.compatible = "rockchip,rk3328-usb2phy",
.data = (ulong)&rk3328_usb2phy_cfgs,
},
+ {
+ .compatible = "rockchip,rk3228-usb2phy",
+ .data = (ulong)&rk3228_phy_cfgs,
+ },
{
.compatible = "rockchip,rk3399-usb2phy",
.data = (ulong)&rk3399_usb2phy_cfgs,
--
Armbian