Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/arch/arm/amlogic fix to work with various clock frequenc...
details: https://anonhg.NetBSD.org/src/rev/12bc74f02c2f
branches: trunk
changeset: 1017582:12bc74f02c2f
user: ryo <ryo%NetBSD.org@localhost>
date: Fri Jan 01 07:18:23 2021 +0000
description:
fix to work with various clock frequencies, and add support "amlogic,meson-axg-dwmac"
diffstat:
sys/arch/arm/amlogic/meson_dwmac.c | 34 +++++++++++++++++++++++++++++-----
1 files changed, 29 insertions(+), 5 deletions(-)
diffs (85 lines):
diff -r 0959d4c39f4a -r 12bc74f02c2f sys/arch/arm/amlogic/meson_dwmac.c
--- a/sys/arch/arm/amlogic/meson_dwmac.c Fri Jan 01 07:17:36 2021 +0000
+++ b/sys/arch/arm/amlogic/meson_dwmac.c Fri Jan 01 07:18:23 2021 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: meson_dwmac.c,v 1.8 2020/02/06 00:32:07 rjs Exp $ */
+/* $NetBSD: meson_dwmac.c,v 1.9 2021/01/01 07:18:23 ryo Exp $ */
/*-
* Copyright (c) 2017 Jared McNeill <jmcneill%invisible.ca@localhost>
@@ -28,7 +28,7 @@
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: meson_dwmac.c,v 1.8 2020/02/06 00:32:07 rjs Exp $");
+__KERNEL_RCSID(0, "$NetBSD: meson_dwmac.c,v 1.9 2021/01/01 07:18:23 ryo Exp $");
#include <sys/param.h>
#include <sys/bus.h>
@@ -61,6 +61,7 @@
"amlogic,meson8b-dwmac",
"amlogic,meson-gx-dwmac",
"amlogic,meson-gxbb-dwmac",
+ "amlogic,meson-axg-dwmac",
NULL
};
@@ -101,7 +102,8 @@
u_int tx_delay;
uint32_t val;
- const u_int div = clk_get_rate(clkin) / 250000000;
+#define DIV_ROUND_OFF(x, y) (((x) + (y) / 2) / (y))
+ const u_int div = DIV_ROUND_OFF(clk_get_rate(clkin), 250000000);
if (of_getprop_uint32(phandle, "amlogic,tx-delay-ns", &tx_delay) != 0)
tx_delay = 2;
@@ -153,6 +155,8 @@
struct dwc_gmac_softc * const sc = device_private(self);
struct fdt_attach_args * const faa = aux;
const int phandle = faa->faa_phandle;
+ int miiclk, phandle_phy, phy = MII_PHY_ANY;
+ u_int miiclk_rate;
bus_space_handle_t prgeth_bsh;
struct fdtbus_reset *rst_gmac;
struct clk *clk_gmac, *clk_in[2];
@@ -196,6 +200,12 @@
aprint_error(": missing 'phy-mode' property\n");
return;
}
+ phandle_phy = fdtbus_get_phandle(phandle, "phy-handle");
+ if (phandle_phy > 0) {
+ of_getprop_uint32(phandle_phy, "reg", &phy);
+ } else {
+ phandle_phy = phandle;
+ }
if (strcmp(phy_mode, "rgmii") == 0) {
meson_dwmac_set_mode_rgmii(phandle, sc->sc_bst, prgeth_bsh, clk_in[0]);
@@ -226,10 +236,24 @@
}
aprint_normal_dev(self, "interrupting on %s\n", intrstr);
- if (meson_dwmac_reset(phandle) != 0)
+ if (meson_dwmac_reset(phandle_phy) != 0)
aprint_error_dev(self, "PHY reset failed\n");
- dwc_gmac_attach(sc, MII_PHY_ANY, GMAC_MII_CLK_100_150M_DIV62);
+ miiclk_rate = clk_get_rate(clk_gmac);
+ if (miiclk_rate > 250 * 1000 * 1000)
+ miiclk = GMAC_MII_CLK_250_300M_DIV124;
+ else if (miiclk_rate > 150 * 1000 * 1000)
+ miiclk = GMAC_MII_CLK_150_250M_DIV102;
+ else if (miiclk_rate > 100 * 1000 * 1000)
+ miiclk = GMAC_MII_CLK_100_150M_DIV62;
+ else if (miiclk_rate > 60 * 1000 * 1000)
+ miiclk = GMAC_MII_CLK_60_100M_DIV42;
+ else if (miiclk_rate > 35 * 1000 * 1000)
+ miiclk = GMAC_MII_CLK_35_60M_DIV26;
+ else
+ miiclk = GMAC_MII_CLK_25_35M_DIV16;
+
+ dwc_gmac_attach(sc, phy, miiclk);
}
CFATTACH_DECL_NEW(meson_dwmac, sizeof(struct dwc_gmac_softc),
Home |
Main Index |
Thread Index |
Old Index