Lines Matching +full:bus +full:- +full:addr

1 // SPDX-License-Identifier: GPL-2.0
20 #define AN7583_MII_RDY BIT(30) /* RO signal BUS is ready */
51 return regmap_read_poll_timeout(priv->regmap, priv->base_addr, busy, in airoha_mdio_wait_busy()
63 * Example: (only one PHY on the BUS at 0x1f) in airoha_mdio_reset()
64 * - read at 0x1f report at 0x2 0x7500 in airoha_mdio_reset()
65 * - read at 0x0 report 0x7500 on every address in airoha_mdio_reset()
67 * To workaround this, we reset the Mdio BUS at every read in airoha_mdio_reset()
70 reset_control_assert(priv->reset); in airoha_mdio_reset()
71 reset_control_deassert(priv->reset); in airoha_mdio_reset()
74 static int airoha_mdio_read(struct mii_bus *bus, int addr, int regnum) in airoha_mdio_read() argument
76 struct airoha_mdio_data *priv = bus->priv; in airoha_mdio_read()
84 val |= FIELD_PREP(AN7583_MII_PHY_ADDR, addr); in airoha_mdio_read()
87 ret = regmap_write(priv->regmap, priv->base_addr, val); in airoha_mdio_read()
95 ret = regmap_read(priv->regmap, priv->base_addr, &val); in airoha_mdio_read()
102 static int airoha_mdio_write(struct mii_bus *bus, int addr, int regnum, in airoha_mdio_write() argument
105 struct airoha_mdio_data *priv = bus->priv; in airoha_mdio_write()
111 val |= FIELD_PREP(AN7583_MII_PHY_ADDR, addr); in airoha_mdio_write()
115 ret = regmap_write(priv->regmap, priv->base_addr, val); in airoha_mdio_write()
124 static int airoha_mdio_cl45_read(struct mii_bus *bus, int addr, int devnum, in airoha_mdio_cl45_read() argument
127 struct airoha_mdio_data *priv = bus->priv; in airoha_mdio_cl45_read()
135 val |= FIELD_PREP(AN7583_MII_PHY_ADDR, addr); in airoha_mdio_cl45_read()
139 ret = regmap_write(priv->regmap, priv->base_addr, val); in airoha_mdio_cl45_read()
149 val |= FIELD_PREP(AN7583_MII_PHY_ADDR, addr); in airoha_mdio_cl45_read()
152 ret = regmap_write(priv->regmap, priv->base_addr, val); in airoha_mdio_cl45_read()
160 ret = regmap_read(priv->regmap, priv->base_addr, &val); in airoha_mdio_cl45_read()
167 static int airoha_mdio_cl45_write(struct mii_bus *bus, int addr, int devnum, in airoha_mdio_cl45_write() argument
170 struct airoha_mdio_data *priv = bus->priv; in airoha_mdio_cl45_write()
176 val |= FIELD_PREP(AN7583_MII_PHY_ADDR, addr); in airoha_mdio_cl45_write()
180 ret = regmap_write(priv->regmap, priv->base_addr, val); in airoha_mdio_cl45_write()
190 val |= FIELD_PREP(AN7583_MII_PHY_ADDR, addr); in airoha_mdio_cl45_write()
194 ret = regmap_write(priv->regmap, priv->base_addr, val); in airoha_mdio_cl45_write()
205 struct device *dev = &pdev->dev; in airoha_mdio_probe()
207 struct mii_bus *bus; in airoha_mdio_probe() local
208 u32 addr, freq; in airoha_mdio_probe() local
211 ret = of_property_read_u32(dev->of_node, "reg", &addr); in airoha_mdio_probe()
215 bus = devm_mdiobus_alloc_size(dev, sizeof(*priv)); in airoha_mdio_probe()
216 if (!bus) in airoha_mdio_probe()
217 return -ENOMEM; in airoha_mdio_probe()
219 priv = bus->priv; in airoha_mdio_probe()
220 priv->base_addr = addr; in airoha_mdio_probe()
221 priv->regmap = device_node_to_regmap(dev->parent->of_node); in airoha_mdio_probe()
222 if (IS_ERR(priv->regmap)) in airoha_mdio_probe()
223 return PTR_ERR(priv->regmap); in airoha_mdio_probe()
225 priv->clk = devm_clk_get_enabled(dev, NULL); in airoha_mdio_probe()
226 if (IS_ERR(priv->clk)) in airoha_mdio_probe()
227 return PTR_ERR(priv->clk); in airoha_mdio_probe()
229 priv->reset = devm_reset_control_get_exclusive(dev, NULL); in airoha_mdio_probe()
230 if (IS_ERR(priv->reset)) in airoha_mdio_probe()
231 return PTR_ERR(priv->reset); in airoha_mdio_probe()
233 reset_control_deassert(priv->reset); in airoha_mdio_probe()
235 bus->name = "airoha_mdio_bus"; in airoha_mdio_probe()
236 snprintf(bus->id, MII_BUS_ID_SIZE, "%s-mii", dev_name(dev)); in airoha_mdio_probe()
237 bus->parent = dev; in airoha_mdio_probe()
238 bus->read = airoha_mdio_read; in airoha_mdio_probe()
239 bus->write = airoha_mdio_write; in airoha_mdio_probe()
240 bus->read_c45 = airoha_mdio_cl45_read; in airoha_mdio_probe()
241 bus->write_c45 = airoha_mdio_cl45_write; in airoha_mdio_probe()
244 if (of_property_read_u32(dev->of_node, "clock-frequency", &freq)) in airoha_mdio_probe()
247 ret = clk_set_rate(priv->clk, freq); in airoha_mdio_probe()
251 ret = devm_of_mdiobus_register(dev, bus, dev->of_node); in airoha_mdio_probe()
253 reset_control_assert(priv->reset); in airoha_mdio_probe()
261 { .compatible = "airoha,an7583-mdio" },
269 .name = "airoha-mdio",