uboot-sunxi: t113: refresh patches to fix clock issues
[openwrt/staging/wigyori.git] / package / boot / uboot-sunxi / patches / 4003-net-sun8i-emac-Add-a-structure-for-variant-data.patch
1 From 418993044499a9466a6be214c9d996e6e3b09798 Mon Sep 17 00:00:00 2001
2 From: Samuel Holland <samuel@sholland.org>
3 Date: Sun, 22 Jan 2023 16:51:02 -0600
4 Subject: [PATCH 4003/4044] net: sun8i-emac: Add a structure for variant data
5
6 Currently, EMAC variants are distinguished by their identity, but this
7 gets unwieldy as more overlapping variants are added. Add a structure so
8 we can describe the individual feature differences between the variants.
9
10 Signed-off-by: Samuel Holland <samuel@sholland.org>
11 Reviewed-by: Andre Przywara <andre.przywara@arm.com>
12 Reviewed-by: Ramon Fried <rfried.dev@gmail.com>
13 ---
14 drivers/net/sun8i_emac.c | 65 +++++++++++++++++++++++++++-------------
15 1 file changed, 45 insertions(+), 20 deletions(-)
16
17 diff --git a/drivers/net/sun8i_emac.c b/drivers/net/sun8i_emac.c
18 index e800a326b8..986e565cd8 100644
19 --- a/drivers/net/sun8i_emac.c
20 +++ b/drivers/net/sun8i_emac.c
21 @@ -127,7 +127,7 @@
22
23 DECLARE_GLOBAL_DATA_PTR;
24
25 -enum emac_variant {
26 +enum emac_variant_id {
27 A83T_EMAC = 1,
28 H3_EMAC,
29 A64_EMAC,
30 @@ -135,6 +135,10 @@ enum emac_variant {
31 H6_EMAC,
32 };
33
34 +struct emac_variant {
35 + enum emac_variant_id variant;
36 +};
37 +
38 struct emac_dma_desc {
39 u32 status;
40 u32 ctl_size;
41 @@ -160,7 +164,7 @@ struct emac_eth_dev {
42 u32 tx_slot;
43 bool use_internal_phy;
44
45 - enum emac_variant variant;
46 + const struct emac_variant *variant;
47 void *mac_reg;
48 phys_addr_t sysctl_reg;
49 struct phy_device *phydev;
50 @@ -317,7 +321,7 @@ static int sun8i_emac_set_syscon(struct sun8i_eth_pdata *pdata,
51 {
52 u32 reg;
53
54 - if (priv->variant == R40_GMAC) {
55 + if (priv->variant->variant == R40_GMAC) {
56 /* Select RGMII for R40 */
57 reg = readl(priv->sysctl_reg + 0x164);
58 reg |= SC_ETCS_INT_GMII |
59 @@ -333,9 +337,9 @@ static int sun8i_emac_set_syscon(struct sun8i_eth_pdata *pdata,
60 reg = sun8i_emac_set_syscon_ephy(priv, reg);
61
62 reg &= ~(SC_ETCS_MASK | SC_EPIT);
63 - if (priv->variant == H3_EMAC ||
64 - priv->variant == A64_EMAC ||
65 - priv->variant == H6_EMAC)
66 + if (priv->variant->variant == H3_EMAC ||
67 + priv->variant->variant == A64_EMAC ||
68 + priv->variant->variant == H6_EMAC)
69 reg &= ~SC_RMII_EN;
70
71 switch (priv->interface) {
72 @@ -349,9 +353,9 @@ static int sun8i_emac_set_syscon(struct sun8i_eth_pdata *pdata,
73 reg |= SC_EPIT | SC_ETCS_INT_GMII;
74 break;
75 case PHY_INTERFACE_MODE_RMII:
76 - if (priv->variant == H3_EMAC ||
77 - priv->variant == A64_EMAC ||
78 - priv->variant == H6_EMAC) {
79 + if (priv->variant->variant == H3_EMAC ||
80 + priv->variant->variant == A64_EMAC ||
81 + priv->variant->variant == H6_EMAC) {
82 reg |= SC_RMII_EN | SC_ETCS_EXT_GMII;
83 break;
84 }
85 @@ -806,7 +810,7 @@ static int sun8i_emac_eth_of_to_plat(struct udevice *dev)
86 return -EINVAL;
87 }
88
89 - priv->variant = dev_get_driver_data(dev);
90 + priv->variant = (const void *)dev_get_driver_data(dev);
91
92 if (!priv->variant) {
93 printf("%s: Missing variant\n", __func__);
94 @@ -860,7 +864,7 @@ static int sun8i_emac_eth_of_to_plat(struct udevice *dev)
95 if (pdata->phy_interface == PHY_INTERFACE_MODE_NA)
96 return -EINVAL;
97
98 - if (priv->variant == H3_EMAC) {
99 + if (priv->variant->variant == H3_EMAC) {
100 ret = sun8i_handle_internal_phy(dev, priv);
101 if (ret)
102 return ret;
103 @@ -900,16 +904,37 @@ static int sun8i_emac_eth_of_to_plat(struct udevice *dev)
104 return 0;
105 }
106
107 +static const struct emac_variant emac_variant_a83t = {
108 + .variant = A83T_EMAC,
109 +};
110 +
111 +static const struct emac_variant emac_variant_h3 = {
112 + .variant = H3_EMAC,
113 +};
114 +
115 +static const struct emac_variant emac_variant_r40 = {
116 + .variant = R40_GMAC,
117 +};
118 +
119 +static const struct emac_variant emac_variant_a64 = {
120 + .variant = A64_EMAC,
121 +};
122 +
123 +static const struct emac_variant emac_variant_h6 = {
124 + .variant = H6_EMAC,
125 +};
126 +
127 static const struct udevice_id sun8i_emac_eth_ids[] = {
128 - {.compatible = "allwinner,sun8i-h3-emac", .data = (uintptr_t)H3_EMAC },
129 - {.compatible = "allwinner,sun50i-a64-emac",
130 - .data = (uintptr_t)A64_EMAC },
131 - {.compatible = "allwinner,sun8i-a83t-emac",
132 - .data = (uintptr_t)A83T_EMAC },
133 - {.compatible = "allwinner,sun8i-r40-gmac",
134 - .data = (uintptr_t)R40_GMAC },
135 - {.compatible = "allwinner,sun50i-h6-emac",
136 - .data = (uintptr_t)H6_EMAC },
137 + { .compatible = "allwinner,sun8i-a83t-emac",
138 + .data = (ulong)&emac_variant_a83t },
139 + { .compatible = "allwinner,sun8i-h3-emac",
140 + .data = (ulong)&emac_variant_h3 },
141 + { .compatible = "allwinner,sun8i-r40-gmac",
142 + .data = (ulong)&emac_variant_r40 },
143 + { .compatible = "allwinner,sun50i-a64-emac",
144 + .data = (ulong)&emac_variant_a64 },
145 + { .compatible = "allwinner,sun50i-h6-emac",
146 + .data = (ulong)&emac_variant_h6 },
147 { }
148 };
149
150 --
151 2.20.1
152