Skip to content

Commit a1788cd

Browse files
Russell King (Oracle)NipaLocal
authored andcommitted
net: stmmac: loongson1: get ls1b resource only once
ls1b_dwmac_syscon_init() was getting the stmmac iomem resource to detect which GMAC block is being used. Move this to a separate setup() function that only runs at probe time, so it can sensibly behave with an unrecognised resource adress. Use this to set a MAC index (id) which is then used in place of testing the base address. Signed-off-by: Russell King (Oracle) <[email protected]> Signed-off-by: NipaLocal <nipa@local>
1 parent ed67b5d commit a1788cd

File tree

1 file changed

+37
-12
lines changed

1 file changed

+37
-12
lines changed

drivers/net/ethernet/stmicro/stmmac/dwmac-loongson1.c

Lines changed: 37 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -44,28 +44,50 @@
4444
struct ls1x_dwmac {
4545
struct plat_stmmacenet_data *plat_dat;
4646
struct regmap *regmap;
47+
unsigned int id;
4748
};
4849

4950
struct ls1x_data {
51+
int (*setup)(struct platform_device *pdev,
52+
struct plat_stmmacenet_data *plat_dat);
5053
int (*init)(struct platform_device *pdev, void *bsp_priv);
5154
};
5255

53-
static int ls1b_dwmac_syscon_init(struct platform_device *pdev, void *priv)
56+
static int ls1b_dwmac_setup(struct platform_device *pdev,
57+
struct plat_stmmacenet_data *plat_dat)
5458
{
55-
struct ls1x_dwmac *dwmac = priv;
56-
struct plat_stmmacenet_data *plat = dwmac->plat_dat;
57-
struct regmap *regmap = dwmac->regmap;
59+
struct ls1x_dwmac *dwmac = plat_dat->bsp_priv;
5860
struct resource *res;
59-
unsigned long reg_base;
6061

6162
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
6263
if (!res) {
64+
/* This shouldn't fail - stmmac_get_platform_resources()
65+
* already mapped this resource.
66+
*/
6367
dev_err(&pdev->dev, "Could not get IO_MEM resources\n");
6468
return -EINVAL;
6569
}
66-
reg_base = (unsigned long)res->start;
6770

68-
if (reg_base == LS1B_GMAC0_BASE) {
71+
if (res->start == LS1B_GMAC0_BASE) {
72+
dwmac->id = 0;
73+
} else if (res->start == LS1B_GMAC1_BASE) {
74+
dwmac->id = 1;
75+
} else {
76+
dev_err(&pdev->dev, "Invalid Ethernet MAC base address %pR",
77+
res);
78+
return -EINVAL;
79+
}
80+
81+
return 0;
82+
}
83+
84+
static int ls1b_dwmac_syscon_init(struct platform_device *pdev, void *priv)
85+
{
86+
struct ls1x_dwmac *dwmac = priv;
87+
struct plat_stmmacenet_data *plat = dwmac->plat_dat;
88+
struct regmap *regmap = dwmac->regmap;
89+
90+
if (dwmac->id == 0) {
6991
switch (plat->phy_interface) {
7092
case PHY_INTERFACE_MODE_RGMII_ID:
7193
regmap_update_bits(regmap, LS1X_SYSCON0,
@@ -84,7 +106,7 @@ static int ls1b_dwmac_syscon_init(struct platform_device *pdev, void *priv)
84106
}
85107

86108
regmap_update_bits(regmap, LS1X_SYSCON0, GMAC0_SHUT, 0);
87-
} else if (reg_base == LS1B_GMAC1_BASE) {
109+
} else if (dwmac->id == 1) {
88110
regmap_update_bits(regmap, LS1X_SYSCON0,
89111
GMAC1_USE_UART1 | GMAC1_USE_UART0,
90112
GMAC1_USE_UART1 | GMAC1_USE_UART0);
@@ -108,10 +130,6 @@ static int ls1b_dwmac_syscon_init(struct platform_device *pdev, void *priv)
108130
}
109131

110132
regmap_update_bits(regmap, LS1X_SYSCON1, GMAC1_SHUT, 0);
111-
} else {
112-
dev_err(&pdev->dev, "Invalid Ethernet MAC base address %lx",
113-
reg_base);
114-
return -EINVAL;
115133
}
116134

117135
return 0;
@@ -183,10 +201,17 @@ static int ls1x_dwmac_probe(struct platform_device *pdev)
183201
dwmac->plat_dat = plat_dat;
184202
dwmac->regmap = regmap;
185203

204+
if (data->setup) {
205+
ret = data->setup(pdev, plat_dat);
206+
if (ret)
207+
return ret;
208+
}
209+
186210
return devm_stmmac_pltfr_probe(pdev, plat_dat, &stmmac_res);
187211
}
188212

189213
static const struct ls1x_data ls1b_dwmac_data = {
214+
.setup = ls1b_dwmac_setup,
190215
.init = ls1b_dwmac_syscon_init,
191216
};
192217

0 commit comments

Comments
 (0)