[Differential] D40716: rk3308 minor patches for usb, ethernet, pwm,, temperature sensors

"titus_edc.ro (Titus Manea)" <[email protected]>
Newsgroups gmane.os.freebsd.devel.arm
Message-ID <[email protected]>
titus_edc.ro created this revision.
titus_edc.ro added a reviewer: arm64.
Herald added a reviewer: andrew.
Herald added a reviewer: andrew.
Herald added a subscriber: emaste.
Herald added a reviewer: manu.
titus_edc.ro requested review of this revision.

REVISION SUMMARY
  ported from linux, openbsd

REVISION DETAIL
  https://reviews.freebsd.org/D40716

AFFECTED FILES
  sys/arm64/rockchip/if_dwc_rk.c
  sys/arm64/rockchip/rk_grf.c
  sys/arm64/rockchip/rk_pwm.c
  sys/arm64/rockchip/rk_spi.c
  sys/arm64/rockchip/rk_tsadc.c
  sys/arm64/rockchip/rk_usb2phy.c

EMAIL PREFERENCES
  https://reviews.freebsd.org/settings/panel/emailpreferences/

To: titus_edc.ro, #arm64, andrew, manu
Cc: freebsd-arm-list, emaste
D40716.123651.patch (text/x-patch, 6.2 KB)
diff --git a/sys/arm64/rockchip/rk_usb2phy.c b/sys/arm64/rockchip/rk_usb2phy.c
--- a/sys/arm64/rockchip/rk_usb2phy.c
+++ b/sys/arm64/rockchip/rk_usb2phy.c
@@ -81,10 +81,19 @@
 		.disable_mask = 0x100010,
 	}
 };
+struct rk_usb2phy_regs rk3308_regs = {
+	.clk_ctl = {
+		.offset = 0x0108,
+		.enable_mask = 0x100000,
+		/* bit 4 put pll in suspend */
+		.disable_mask = 0x100010,
+	}	
+};
 
 static struct ofw_compat_data compat_data[] = {
 	{ "rockchip,rk3399-usb2phy",	(uintptr_t)&rk3399_regs },
 	{ "rockchip,rk3568-usb2phy",	(uintptr_t)&rk3568_regs },
+	{ "rockchip,rk3308-usb2phy",	(uintptr_t)&rk3308_regs },	
 	{ NULL,				0 }
 };
 
diff --git a/sys/arm64/rockchip/rk_tsadc.c b/sys/arm64/rockchip/rk_tsadc.c
--- a/sys/arm64/rockchip/rk_tsadc.c
+++ b/sys/arm64/rockchip/rk_tsadc.c
@@ -375,9 +375,30 @@
 	}
 };
 
+static struct tsensor rk3308_tsensors[] = {
+	{ .channel = 0, .id = 0, .name = "CPU"},
+	{ .channel = 1, .id = 1, .name = "GPU"},
+};
+
+static struct tsadc_conf rk3308_tsadc_conf = {
+	.version =		TSADC_V2,
+	.q_sel_ntc =		1,
+	.shutdown_temp =	95000,
+	.shutdown_mode =	0, /* CRU */
+	.shutdown_pol =		0, /* Low  */
+	.tsensors = 		rk3308_tsensors,
+	.ntsensors = 		nitems(rk3308_tsensors),
+	.calib_info = 	{
+			.table = rk3328_calib_data,
+			.nentries = nitems(rk3328_calib_data),
+	}
+};
+
+
 static struct ofw_compat_data compat_data[] = {
 	{"rockchip,rk3288-tsadc",	(uintptr_t)&rk3288_tsadc_conf},
 	{"rockchip,rk3328-tsadc",	(uintptr_t)&rk3328_tsadc_conf},
+	{"rockchip,rk3308-tsadc",	(uintptr_t)&rk3328_tsadc_conf},	
 	{"rockchip,rk3399-tsadc",	(uintptr_t)&rk3399_tsadc_conf},
 	{"rockchip,rk3568-tsadc",	(uintptr_t)&rk3568_tsadc_conf},
 	{NULL,		0}
diff --git a/sys/arm64/rockchip/rk_spi.c b/sys/arm64/rockchip/rk_spi.c
--- a/sys/arm64/rockchip/rk_spi.c
+++ b/sys/arm64/rockchip/rk_spi.c
@@ -90,6 +90,7 @@
 #define	CS_MAX			1
 
 static struct ofw_compat_data compat_data[] = {
+	{ "rockchip,rk3308-spi",		1 },
 	{ "rockchip,rk3328-spi",		1 },
 	{ "rockchip,rk3399-spi",		1 },
 	{ "rockchip,rk3568-spi",		1 },
diff --git a/sys/arm64/rockchip/rk_pwm.c b/sys/arm64/rockchip/rk_pwm.c
--- a/sys/arm64/rockchip/rk_pwm.c
+++ b/sys/arm64/rockchip/rk_pwm.c
@@ -1,5 +1,5 @@
 /*-
- * SPDX-License-Identifier: BSD-2-Clause
+ * SPDX-License-Identifier: BSD-2
  *
  * Copyright (c) 2018 Emmanuel Vadot <[email protected]>
  * Copyright (c) 2019 Brandon Bergren <[email protected]>
@@ -100,6 +100,7 @@
 
 static struct ofw_compat_data compat_data[] = {
 	{ "rockchip,rk3288-pwm",		1 },
+	{ "rockchip,rk3328-pwm",		1 },	
 	{ "rockchip,rk3399-pwm",		1 },
 	{ NULL,					0 }
 };
@@ -398,5 +399,7 @@
 	sizeof(struct rk_pwm_softc),
 };
 
-DRIVER_MODULE(rk_pwm, simplebus, rk_pwm_driver, 0, 0);
+static devclass_t rk_pwm_devclass;
+
+EARLY_DRIVER_MODULE(rk_pwm, simplebus, rk_pwm_driver, rk_pwm_devclass, 0, 0,BUS_PASS_BUS + BUS_PASS_ORDER_LATE);
 SIMPLEBUS_PNP_INFO(compat_data);
diff --git a/sys/arm64/rockchip/rk_grf.c b/sys/arm64/rockchip/rk_grf.c
--- a/sys/arm64/rockchip/rk_grf.c
+++ b/sys/arm64/rockchip/rk_grf.c
@@ -55,6 +55,7 @@
 	{"rockchip,rk3568-pipe-grf", 1},
 	{"rockchip,rk3568-pipe-phy-grf", 1},
 	{"rockchip,rk3568-pcie3-phy-grf", 1},
+	{"rockchip,rk3308-grf", 1},	
 	{NULL,             0}
 };
 
diff --git a/sys/arm64/rockchip/if_dwc_rk.c b/sys/arm64/rockchip/if_dwc_rk.c
--- a/sys/arm64/rockchip/if_dwc_rk.c
+++ b/sys/arm64/rockchip/if_dwc_rk.c
@@ -103,6 +103,13 @@
 #define	 SOC_CON6_GMAC_RXCLK_DLY_ENA		(1 << 15)
 #define	 SOC_CON6_RX_DL_CFG_SHIFT		8
 
+/* RK3308 registers */
+#define RK3308_GRF_MAC_CON0	0x04a0
+#define RK3308_MAC_SPEED_100M	((0x1 << 0) << 16 | (0x1 << 0))
+#define RK3308_MAC_SPEED_10M	((0x1 << 0) << 16 | (0x0 << 0))
+#define RK3308_INTF_SEL_RMII	((0x1 << 4) << 16 | (0x1 << 4))
+
+
 struct if_dwc_rk_softc;
 
 typedef void (*if_dwc_rk_set_delaysfn_t)(struct if_dwc_rk_softc *);
@@ -147,6 +154,9 @@
 static void rk3399_set_delays(struct if_dwc_rk_softc *sc);
 static int rk3399_set_speed(struct if_dwc_rk_softc *sc, int speed);
 
+static int rk3308_set_speed(struct if_dwc_rk_softc *sc, int speed);
+static void rk3308_set_phy_mode(struct if_dwc_rk_softc *sc);
+
 static struct if_dwc_rk_ops rk3288_ops = {
 };
 
@@ -162,10 +172,16 @@
 	.set_speed = rk3399_set_speed,
 };
 
+static struct if_dwc_rk_ops rk3308_ops = {
+	.set_speed = rk3308_set_speed,
+	.set_phy_mode = rk3308_set_phy_mode,
+};
+
 static struct ofw_compat_data compat_data[] = {
 	{"rockchip,rk3288-gmac", (uintptr_t)&rk3288_ops},
 	{"rockchip,rk3328-gmac", (uintptr_t)&rk3328_ops},
 	{"rockchip,rk3399-gmac", (uintptr_t)&rk3399_ops},
+	{"rockchip,rk3308-gmac", (uintptr_t)&rk3308_ops},	
 	{NULL,			 0}
 };
 
@@ -338,6 +354,47 @@
 	return (0);
 }
 
+static int
+rk3308_set_speed(struct if_dwc_rk_softc *sc, int speed)
+{
+	uint32_t reg;
+
+	switch (sc->base.phy_mode) {
+	case PHY_MODE_RGMII:
+		break;
+	case PHY_MODE_RMII:
+		switch (speed) {
+		case IFM_100_TX:
+			reg = RK3308_INTF_SEL_RMII | RK3308_MAC_SPEED_100M;
+			break;
+		case IFM_10_T:
+			 reg = RK3308_INTF_SEL_RMII | RK3308_MAC_SPEED_10M;
+			break;
+		default:
+			device_printf(sc->base.dev, "unsupported RMII media %u\n", speed);
+			return (-1);
+		}
+
+		SYSCON_WRITE_4(sc->grf, RK3308_GRF_MAC_CON0, reg);
+		break;
+	}
+
+	return (0);
+}
+
+static void
+rk3308_set_phy_mode(struct if_dwc_rk_softc *sc)
+{
+	switch (sc->base.phy_mode) {
+	case PHY_MODE_RGMII:
+		break;
+	case PHY_MODE_RMII:
+		SYSCON_WRITE_4(sc->grf, RK3308_GRF_MAC_CON0,RK3308_INTF_SEL_RMII);
+
+		break;
+	}
+}
+
 static int
 if_dwc_rk_sysctl_delays(SYSCTL_HANDLER_ARGS)
 {
@@ -407,7 +464,7 @@
 	if (error != 0) {
 		device_printf(dev, "could not find clock stmmaceth\n");
 		return (error);
-	}
+	} 
 
 	if (clk_get_by_ofw_name(dev, 0, "mac_clk_rx", &sc->mac_clk_rx) != 0) {
 		device_printf(sc->base.dev, "could not get mac_clk_rx clock\n");
@@ -440,7 +497,6 @@
 				device_printf(sc->base.dev, "could not get clk_mac_refout clock\n");
 				sc->clk_mac_refout = NULL;
 			}
-
 			clk_set_freq(sc->clk_stmmaceth, 50000000, 0);
 		}
 	}
@@ -464,7 +520,7 @@
 		if (sc->clk_mac_refout)
 			clk_enable(sc->clk_mac_refout);
 	}
-	if (sc->clk_phy)
+	if (sc->clk_phy) 
 		clk_enable(sc->clk_phy);
 	if (sc->aclk_mac)
 		clk_enable(sc->aclk_mac);
@@ -615,6 +671,8 @@
 	DEVMETHOD_END
 };
 
+static devclass_t dwc_rk_devclass;
+
 extern driver_t dwc_driver;
 
 DEFINE_CLASS_1(dwc, dwc_rk_driver, if_dwc_rk_methods,
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.