Lines Matching +full:data +full:- +full:bus
1 // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
38 static int ipq4019_mdio_wait_busy(struct mii_bus *bus) in ipq4019_mdio_wait_busy() argument
40 struct ipq4019_mdio_data *priv = bus->priv; in ipq4019_mdio_wait_busy()
43 return readl_poll_timeout(priv->membase + MDIO_CMD_REG, busy, in ipq4019_mdio_wait_busy()
48 static int ipq4019_mdio_read(struct mii_bus *bus, int mii_id, int regnum) in ipq4019_mdio_read() argument
50 struct ipq4019_mdio_data *priv = bus->priv; in ipq4019_mdio_read()
51 unsigned int data; in ipq4019_mdio_read() local
54 if (ipq4019_mdio_wait_busy(bus)) in ipq4019_mdio_read()
55 return -ETIMEDOUT; in ipq4019_mdio_read()
63 data = readl(priv->membase + MDIO_MODE_REG); in ipq4019_mdio_read()
65 data |= MDIO_MODE_C45; in ipq4019_mdio_read()
67 writel(data, priv->membase + MDIO_MODE_REG); in ipq4019_mdio_read()
70 writel((mii_id << 8) | mmd, priv->membase + MDIO_ADDR_REG); in ipq4019_mdio_read()
73 writel(reg, priv->membase + MDIO_DATA_WRITE_REG); in ipq4019_mdio_read()
78 data = readl(priv->membase + MDIO_MODE_REG); in ipq4019_mdio_read()
80 data &= ~MDIO_MODE_C45; in ipq4019_mdio_read()
82 writel(data, priv->membase + MDIO_MODE_REG); in ipq4019_mdio_read()
85 writel((mii_id << 8) | regnum, priv->membase + MDIO_ADDR_REG); in ipq4019_mdio_read()
91 writel(cmd, priv->membase + MDIO_CMD_REG); in ipq4019_mdio_read()
94 if (ipq4019_mdio_wait_busy(bus)) in ipq4019_mdio_read()
95 return -ETIMEDOUT; in ipq4019_mdio_read()
100 writel(cmd, priv->membase + MDIO_CMD_REG); in ipq4019_mdio_read()
102 if (ipq4019_mdio_wait_busy(bus)) in ipq4019_mdio_read()
103 return -ETIMEDOUT; in ipq4019_mdio_read()
106 /* Read and return data */ in ipq4019_mdio_read()
107 return readl(priv->membase + MDIO_DATA_READ_REG); in ipq4019_mdio_read()
110 static int ipq4019_mdio_write(struct mii_bus *bus, int mii_id, int regnum, in ipq4019_mdio_write() argument
113 struct ipq4019_mdio_data *priv = bus->priv; in ipq4019_mdio_write()
114 unsigned int data; in ipq4019_mdio_write() local
117 if (ipq4019_mdio_wait_busy(bus)) in ipq4019_mdio_write()
118 return -ETIMEDOUT; in ipq4019_mdio_write()
126 data = readl(priv->membase + MDIO_MODE_REG); in ipq4019_mdio_write()
128 data |= MDIO_MODE_C45; in ipq4019_mdio_write()
130 writel(data, priv->membase + MDIO_MODE_REG); in ipq4019_mdio_write()
133 writel((mii_id << 8) | mmd, priv->membase + MDIO_ADDR_REG); in ipq4019_mdio_write()
136 writel(reg, priv->membase + MDIO_DATA_WRITE_REG); in ipq4019_mdio_write()
140 writel(cmd, priv->membase + MDIO_CMD_REG); in ipq4019_mdio_write()
142 if (ipq4019_mdio_wait_busy(bus)) in ipq4019_mdio_write()
143 return -ETIMEDOUT; in ipq4019_mdio_write()
146 data = readl(priv->membase + MDIO_MODE_REG); in ipq4019_mdio_write()
148 data &= ~MDIO_MODE_C45; in ipq4019_mdio_write()
150 writel(data, priv->membase + MDIO_MODE_REG); in ipq4019_mdio_write()
153 writel((mii_id << 8) | regnum, priv->membase + MDIO_ADDR_REG); in ipq4019_mdio_write()
156 /* issue write data */ in ipq4019_mdio_write()
157 writel(value, priv->membase + MDIO_DATA_WRITE_REG); in ipq4019_mdio_write()
165 writel(cmd, priv->membase + MDIO_CMD_REG); in ipq4019_mdio_write()
168 if (ipq4019_mdio_wait_busy(bus)) in ipq4019_mdio_write()
169 return -ETIMEDOUT; in ipq4019_mdio_write()
177 struct mii_bus *bus; in ipq4019_mdio_probe() local
180 bus = devm_mdiobus_alloc_size(&pdev->dev, sizeof(*priv)); in ipq4019_mdio_probe()
181 if (!bus) in ipq4019_mdio_probe()
182 return -ENOMEM; in ipq4019_mdio_probe()
184 priv = bus->priv; in ipq4019_mdio_probe()
186 priv->membase = devm_platform_ioremap_resource(pdev, 0); in ipq4019_mdio_probe()
187 if (IS_ERR(priv->membase)) in ipq4019_mdio_probe()
188 return PTR_ERR(priv->membase); in ipq4019_mdio_probe()
190 bus->name = "ipq4019_mdio"; in ipq4019_mdio_probe()
191 bus->read = ipq4019_mdio_read; in ipq4019_mdio_probe()
192 bus->write = ipq4019_mdio_write; in ipq4019_mdio_probe()
193 bus->parent = &pdev->dev; in ipq4019_mdio_probe()
194 snprintf(bus->id, MII_BUS_ID_SIZE, "%s%d", pdev->name, pdev->id); in ipq4019_mdio_probe()
196 ret = of_mdiobus_register(bus, pdev->dev.of_node); in ipq4019_mdio_probe()
198 dev_err(&pdev->dev, "Cannot register MDIO bus!\n"); in ipq4019_mdio_probe()
202 platform_set_drvdata(pdev, bus); in ipq4019_mdio_probe()
209 struct mii_bus *bus = platform_get_drvdata(pdev); in ipq4019_mdio_remove() local
211 mdiobus_unregister(bus); in ipq4019_mdio_remove()
217 { .compatible = "qcom,ipq4019-mdio" },
226 .name = "ipq4019-mdio",