summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Kettenis <kettenis@cvs.openbsd.org>2018-02-24 22:28:09 +0000
committerMark Kettenis <kettenis@cvs.openbsd.org>2018-02-24 22:28:09 +0000
commit0a669210999a464946af742944d941ab32b38bc1 (patch)
tree06d834358cc22a34d28089fdc7d734cb67c4eb4d
parent7ba731c35167741cccbca93a37fadf32d4a41b31 (diff)
RK3328 support.
-rw-r--r--sys/dev/fdt/if_dwge_fdt.c38
1 files changed, 37 insertions, 1 deletions
diff --git a/sys/dev/fdt/if_dwge_fdt.c b/sys/dev/fdt/if_dwge_fdt.c
index edfe5acb992..6e54f1ee4a2 100644
--- a/sys/dev/fdt/if_dwge_fdt.c
+++ b/sys/dev/fdt/if_dwge_fdt.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: if_dwge_fdt.c,v 1.5 2017/08/13 10:42:15 jsg Exp $ */
+/* $OpenBSD: if_dwge_fdt.c,v 1.6 2018/02/24 22:28:08 kettenis Exp $ */
/*
* Copyright (c) 2016 Patrick Wildt <patrick@blueri.se>
* Copyright (c) 2016 Mark Kettenis <kettenis@openbsd.org>
@@ -78,6 +78,7 @@ dwge_fdt_match(struct device *parent, void *match, void *aux)
return (OF_is_compatible(faa->fa_node, "allwinner,sun7i-a20-gmac") ||
OF_is_compatible(faa->fa_node, "rockchip,rk3288-gmac") ||
+ OF_is_compatible(faa->fa_node, "rockchip,rk3328-gmac") ||
OF_is_compatible(faa->fa_node, "rockchip,rk3399-gmac"));
}
@@ -122,6 +123,8 @@ dwge_fdt_attach(struct device *parent, struct device *self, void *aux)
dwge_fdt_attach_allwinner(fsc);
else if (OF_is_compatible(faa->fa_node, "rockchip,rk3288-gmac"))
dwge_fdt_attach_rockchip(fsc);
+ else if (OF_is_compatible(faa->fa_node, "rockchip,rk3328-gmac"))
+ dwge_fdt_attach_rockchip(fsc);
else if (OF_is_compatible(faa->fa_node, "rockchip,rk3399-gmac"))
dwge_fdt_attach_rockchip(fsc);
@@ -237,6 +240,22 @@ dwge_fdt_attach_allwinner(struct dwge_fdt_softc *sc)
#define RK3288_GMAC_TXCLK_DLY_ENA ((1 << 14) << 16 | (1 << 14))
#define RK3288_GMAC_CLK_TX_DL_CFG(val) ((0x7f << 0) << 16 | ((val) << 0))
+/* RK3328 registers */
+#define RK3328_GRF_MAC_CON0 0x0900
+#define RK3328_GMAC_CLK_RX_DL_CFG(val) ((0x7f << 7) << 16 | ((val) << 7))
+#define RK3328_GMAC_CLK_TX_DL_CFG(val) ((0x7f << 0) << 16 | ((val) << 0))
+
+#define RK3328_GRF_MAC_CON1 0x0904
+#define RK3328_GMAC_PHY_INTF_SEL_RGMII ((0x7 << 4) << 16 | (0x1 << 4))
+#define RK3328_GMAC_PHY_INTF_SEL_RMII ((0x7 << 4) << 16 | (0x4 << 4))
+#define RK3328_RMII_MODE_RMII ((1 << 9) << 16 | (1 << 9))
+#define RK3328_RMII_MODE_MII ((1 << 9) << 16 | (0 << 9))
+#define RK3328_GMAC_CLK_SEL_125 ((0x3 << 11) << 16 | (0x0 << 11))
+#define RK3328_GMAC_CLK_SEL_25 ((0x3 << 11) << 16 | (0x3 << 11))
+#define RK3328_GMAC_CLK_SEL_2_5 ((0x3 << 11) << 16 | (0x2 << 11))
+#define RK3328_GMAC_RXCLK_DLY_ENA ((1 << 1) << 16 | (1 << 1))
+#define RK3328_GMAC_TXCLK_DLY_ENA ((1 << 0) << 16 | (1 << 0))
+
/* RK3399 registers */
#define RK3399_GRF_SOC_CON5 0xc214
#define RK3399_GMAC_PHY_INTF_SEL_RGMII ((0x7 << 9) << 16 | (0x1 << 9))
@@ -290,6 +309,23 @@ dwge_fdt_attach_rockchip(struct dwge_fdt_softc *sc)
sc->sc_clk_sel_2_5 = RK3288_GMAC_CLK_SEL_2_5;
sc->sc_clk_sel_25 = RK3288_GMAC_CLK_SEL_25;
sc->sc_clk_sel_125 = RK3288_GMAC_CLK_SEL_125;
+ } else if (OF_is_compatible(sc->sc_node, "rockchip,rk3328-gmac")) {
+ /* Use RGMII interface. */
+ regmap_write_4(rm, RK3328_GRF_MAC_CON1,
+ RK3328_GMAC_PHY_INTF_SEL_RGMII | RK3399_RMII_MODE_MII);
+
+ /* Program clock delay lines. */
+ regmap_write_4(rm, RK3328_GRF_MAC_CON0,
+ RK3328_GMAC_CLK_TX_DL_CFG(tx_delay) |
+ RK3328_GMAC_CLK_RX_DL_CFG(rx_delay));
+ regmap_write_4(rm, RK3328_GRF_MAC_CON1,
+ RK3328_GMAC_TXCLK_DLY_ENA | RK3328_GMAC_RXCLK_DLY_ENA);
+
+ /* Clock speed bits. */
+ sc->sc_clk_sel = RK3328_GRF_MAC_CON1;
+ sc->sc_clk_sel_2_5 = RK3328_GMAC_CLK_SEL_2_5;
+ sc->sc_clk_sel_25 = RK3328_GMAC_CLK_SEL_25;
+ sc->sc_clk_sel_125 = RK3328_GMAC_CLK_SEL_125;
} else {
/* Use RGMII interface. */
regmap_write_4(rm, RK3399_GRF_SOC_CON5,