Lines Matching full:data
96 static void __davinci_mdio_reset(struct davinci_mdio_data *data) in __davinci_mdio_reset() argument
100 mdio_in = clk_get_rate(data->clk); in __davinci_mdio_reset()
101 div = (mdio_in / data->pdata.bus_freq) - 1; in __davinci_mdio_reset()
106 __raw_writel(div | CONTROL_ENABLE, &data->regs->control); in __davinci_mdio_reset()
111 * 32 bits of transferred data in __davinci_mdio_reset()
123 data->access_time = usecs_to_jiffies(access_time * 4); in __davinci_mdio_reset()
124 if (!data->access_time) in __davinci_mdio_reset()
125 data->access_time = 1; in __davinci_mdio_reset()
130 struct davinci_mdio_data *data = bus->priv; in davinci_mdio_reset() local
133 __davinci_mdio_reset(data); in davinci_mdio_reset()
136 msleep(PHY_MAX_ADDR * data->access_time); in davinci_mdio_reset()
139 ver = __raw_readl(&data->regs->version); in davinci_mdio_reset()
140 dev_info(data->dev, "davinci mdio revision %d.%d\n", in davinci_mdio_reset()
144 phy_mask = __raw_readl(&data->regs->alive); in davinci_mdio_reset()
147 dev_info(data->dev, "detected phy mask %x\n", ~phy_mask); in davinci_mdio_reset()
151 dev_warn(data->dev, "no live phy, scanning all\n"); in davinci_mdio_reset()
154 data->bus->phy_mask = phy_mask; in davinci_mdio_reset()
160 static inline int wait_for_user_access(struct davinci_mdio_data *data) in wait_for_user_access() argument
162 struct davinci_mdio_regs __iomem *regs = data->regs; in wait_for_user_access()
180 dev_warn(data->dev, "resetting idled controller\n"); in wait_for_user_access()
181 __davinci_mdio_reset(data); in wait_for_user_access()
184 dev_err(data->dev, "timed out waiting for user access\n"); in wait_for_user_access()
189 static inline int wait_for_idle(struct davinci_mdio_data *data) in wait_for_idle() argument
191 struct davinci_mdio_regs __iomem *regs = data->regs; in wait_for_idle()
198 dev_err(data->dev, "timed out waiting for idle\n"); in wait_for_idle()
204 struct davinci_mdio_data *data = bus->priv; in davinci_mdio_read() local
211 spin_lock(&data->lock); in davinci_mdio_read()
213 if (data->suspended) { in davinci_mdio_read()
214 spin_unlock(&data->lock); in davinci_mdio_read()
222 ret = wait_for_user_access(data); in davinci_mdio_read()
228 __raw_writel(reg, &data->regs->user[0].access); in davinci_mdio_read()
230 ret = wait_for_user_access(data); in davinci_mdio_read()
236 reg = __raw_readl(&data->regs->user[0].access); in davinci_mdio_read()
241 spin_unlock(&data->lock); in davinci_mdio_read()
249 struct davinci_mdio_data *data = bus->priv; in davinci_mdio_write() local
256 spin_lock(&data->lock); in davinci_mdio_write()
258 if (data->suspended) { in davinci_mdio_write()
259 spin_unlock(&data->lock); in davinci_mdio_write()
267 ret = wait_for_user_access(data); in davinci_mdio_write()
273 __raw_writel(reg, &data->regs->user[0].access); in davinci_mdio_write()
275 ret = wait_for_user_access(data); in davinci_mdio_write()
281 spin_unlock(&data->lock); in davinci_mdio_write()
290 struct davinci_mdio_data *data; in davinci_mdio_probe() local
295 data = kzalloc(sizeof(*data), GFP_KERNEL); in davinci_mdio_probe()
296 if (!data) { in davinci_mdio_probe()
297 dev_err(dev, "failed to alloc device data\n"); in davinci_mdio_probe()
301 data->pdata = pdata ? (*pdata) : default_pdata; in davinci_mdio_probe()
303 data->bus = mdiobus_alloc(); in davinci_mdio_probe()
304 if (!data->bus) { in davinci_mdio_probe()
310 data->bus->name = dev_name(dev); in davinci_mdio_probe()
311 data->bus->read = davinci_mdio_read, in davinci_mdio_probe()
312 data->bus->write = davinci_mdio_write, in davinci_mdio_probe()
313 data->bus->reset = davinci_mdio_reset, in davinci_mdio_probe()
314 data->bus->parent = dev; in davinci_mdio_probe()
315 data->bus->priv = data; in davinci_mdio_probe()
316 snprintf(data->bus->id, MII_BUS_ID_SIZE, "%s-%x", in davinci_mdio_probe()
319 data->clk = clk_get(dev, NULL); in davinci_mdio_probe()
320 if (IS_ERR(data->clk)) { in davinci_mdio_probe()
322 ret = PTR_ERR(data->clk); in davinci_mdio_probe()
323 data->clk = NULL; in davinci_mdio_probe()
327 clk_enable(data->clk); in davinci_mdio_probe()
329 dev_set_drvdata(dev, data); in davinci_mdio_probe()
330 data->dev = dev; in davinci_mdio_probe()
331 spin_lock_init(&data->lock); in davinci_mdio_probe()
348 data->regs = devm_ioremap_nocache(dev, res->start, resource_size(res)); in davinci_mdio_probe()
349 if (!data->regs) { in davinci_mdio_probe()
356 ret = mdiobus_register(data->bus); in davinci_mdio_probe()
362 phy = data->bus->phy_map[addr]; in davinci_mdio_probe()
373 if (data->bus) in davinci_mdio_probe()
374 mdiobus_free(data->bus); in davinci_mdio_probe()
376 if (data->clk) { in davinci_mdio_probe()
377 clk_disable(data->clk); in davinci_mdio_probe()
378 clk_put(data->clk); in davinci_mdio_probe()
381 kfree(data); in davinci_mdio_probe()
389 struct davinci_mdio_data *data = dev_get_drvdata(dev); in davinci_mdio_remove() local
391 if (data->bus) in davinci_mdio_remove()
392 mdiobus_free(data->bus); in davinci_mdio_remove()
394 if (data->clk) { in davinci_mdio_remove()
395 clk_disable(data->clk); in davinci_mdio_remove()
396 clk_put(data->clk); in davinci_mdio_remove()
401 kfree(data); in davinci_mdio_remove()
408 struct davinci_mdio_data *data = dev_get_drvdata(dev); in davinci_mdio_suspend() local
411 spin_lock(&data->lock); in davinci_mdio_suspend()
414 ctrl = __raw_readl(&data->regs->control); in davinci_mdio_suspend()
416 __raw_writel(ctrl, &data->regs->control); in davinci_mdio_suspend()
417 wait_for_idle(data); in davinci_mdio_suspend()
419 if (data->clk) in davinci_mdio_suspend()
420 clk_disable(data->clk); in davinci_mdio_suspend()
422 data->suspended = true; in davinci_mdio_suspend()
423 spin_unlock(&data->lock); in davinci_mdio_suspend()
430 struct davinci_mdio_data *data = dev_get_drvdata(dev); in davinci_mdio_resume() local
433 spin_lock(&data->lock); in davinci_mdio_resume()
434 if (data->clk) in davinci_mdio_resume()
435 clk_enable(data->clk); in davinci_mdio_resume()
438 ctrl = __raw_readl(&data->regs->control); in davinci_mdio_resume()
440 __raw_writel(ctrl, &data->regs->control); in davinci_mdio_resume()
442 data->suspended = false; in davinci_mdio_resume()
443 spin_unlock(&data->lock); in davinci_mdio_resume()