• Home
  • Raw
  • Download

Lines Matching +full:data +full:- +full:bus

4  * Copyright 2012-2013 Stefan Roese <sr@denx.de>
5 * Copyright 2013 Maxime Ripard <maxime.ripard@free-electrons.com>
39 static int sun4i_mdio_read(struct mii_bus *bus, int mii_id, int regnum) in sun4i_mdio_read() argument
41 struct sun4i_mdio_data *data = bus->priv; in sun4i_mdio_read() local
46 writel((mii_id << 8) | regnum, data->membase + EMAC_MAC_MADR_REG); in sun4i_mdio_read()
48 writel(0x1, data->membase + EMAC_MAC_MCMD_REG); in sun4i_mdio_read()
52 while (readl(data->membase + EMAC_MAC_MIND_REG) & 0x1) { in sun4i_mdio_read()
54 return -ETIMEDOUT; in sun4i_mdio_read()
59 writel(0x0, data->membase + EMAC_MAC_MCMD_REG); in sun4i_mdio_read()
60 /* and read data */ in sun4i_mdio_read()
61 value = readl(data->membase + EMAC_MAC_MRDD_REG); in sun4i_mdio_read()
66 static int sun4i_mdio_write(struct mii_bus *bus, int mii_id, int regnum, in sun4i_mdio_write() argument
69 struct sun4i_mdio_data *data = bus->priv; in sun4i_mdio_write() local
73 writel((mii_id << 8) | regnum, data->membase + EMAC_MAC_MADR_REG); in sun4i_mdio_write()
75 writel(0x1, data->membase + EMAC_MAC_MCMD_REG); in sun4i_mdio_write()
79 while (readl(data->membase + EMAC_MAC_MIND_REG) & 0x1) { in sun4i_mdio_write()
81 return -ETIMEDOUT; in sun4i_mdio_write()
86 writel(0x0, data->membase + EMAC_MAC_MCMD_REG); in sun4i_mdio_write()
87 /* and write data */ in sun4i_mdio_write()
88 writel(value, data->membase + EMAC_MAC_MWTD_REG); in sun4i_mdio_write()
95 struct device_node *np = pdev->dev.of_node; in sun4i_mdio_probe()
96 struct mii_bus *bus; in sun4i_mdio_probe() local
97 struct sun4i_mdio_data *data; in sun4i_mdio_probe() local
101 bus = mdiobus_alloc_size(sizeof(*data)); in sun4i_mdio_probe()
102 if (!bus) in sun4i_mdio_probe()
103 return -ENOMEM; in sun4i_mdio_probe()
105 bus->name = "sun4i_mii_bus"; in sun4i_mdio_probe()
106 bus->read = &sun4i_mdio_read; in sun4i_mdio_probe()
107 bus->write = &sun4i_mdio_write; in sun4i_mdio_probe()
108 snprintf(bus->id, MII_BUS_ID_SIZE, "%s-mii", dev_name(&pdev->dev)); in sun4i_mdio_probe()
109 bus->parent = &pdev->dev; in sun4i_mdio_probe()
111 data = bus->priv; in sun4i_mdio_probe()
113 data->membase = devm_ioremap_resource(&pdev->dev, res); in sun4i_mdio_probe()
114 if (IS_ERR(data->membase)) { in sun4i_mdio_probe()
115 ret = PTR_ERR(data->membase); in sun4i_mdio_probe()
119 data->regulator = devm_regulator_get(&pdev->dev, "phy"); in sun4i_mdio_probe()
120 if (IS_ERR(data->regulator)) { in sun4i_mdio_probe()
121 if (PTR_ERR(data->regulator) == -EPROBE_DEFER) { in sun4i_mdio_probe()
122 ret = -EPROBE_DEFER; in sun4i_mdio_probe()
126 dev_info(&pdev->dev, "no regulator found\n"); in sun4i_mdio_probe()
127 data->regulator = NULL; in sun4i_mdio_probe()
129 ret = regulator_enable(data->regulator); in sun4i_mdio_probe()
134 ret = of_mdiobus_register(bus, np); in sun4i_mdio_probe()
138 platform_set_drvdata(pdev, bus); in sun4i_mdio_probe()
143 if (data->regulator) in sun4i_mdio_probe()
144 regulator_disable(data->regulator); in sun4i_mdio_probe()
146 mdiobus_free(bus); in sun4i_mdio_probe()
152 struct mii_bus *bus = platform_get_drvdata(pdev); in sun4i_mdio_remove() local
154 mdiobus_unregister(bus); in sun4i_mdio_remove()
155 mdiobus_free(bus); in sun4i_mdio_remove()
161 { .compatible = "allwinner,sun4i-a10-mdio" },
164 { .compatible = "allwinner,sun4i-mdio" },
173 .name = "sun4i-mdio",
181 MODULE_AUTHOR("Maxime Ripard <maxime.ripard@free-electrons.com>");