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
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.
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>
14 drivers/net/sun8i_emac.c | 65 +++++++++++++++++++++++++++-------------
15 1 file changed, 45 insertions(+), 20 deletions(-)
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
23 DECLARE_GLOBAL_DATA_PTR;
26 +enum emac_variant_id {
30 @@ -135,6 +135,10 @@ enum emac_variant {
34 +struct emac_variant {
35 + enum emac_variant_id variant;
38 struct emac_dma_desc {
41 @@ -160,7 +164,7 @@ struct emac_eth_dev {
43 bool use_internal_phy;
45 - enum emac_variant variant;
46 + const struct emac_variant *variant;
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,
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);
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)
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;
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;
85 @@ -806,7 +810,7 @@ static int sun8i_emac_eth_of_to_plat(struct udevice *dev)
89 - priv->variant = dev_get_driver_data(dev);
90 + priv->variant = (const void *)dev_get_driver_data(dev);
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)
98 - if (priv->variant == H3_EMAC) {
99 + if (priv->variant->variant == H3_EMAC) {
100 ret = sun8i_handle_internal_phy(dev, priv);
103 @@ -900,16 +904,37 @@ static int sun8i_emac_eth_of_to_plat(struct udevice *dev)
107 +static const struct emac_variant emac_variant_a83t = {
108 + .variant = A83T_EMAC,
111 +static const struct emac_variant emac_variant_h3 = {
112 + .variant = H3_EMAC,
115 +static const struct emac_variant emac_variant_r40 = {
116 + .variant = R40_GMAC,
119 +static const struct emac_variant emac_variant_a64 = {
120 + .variant = A64_EMAC,
123 +static const struct emac_variant emac_variant_h6 = {
124 + .variant = H6_EMAC,
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 },