Lines Matching refs:data

105 static void __davinci_mdio_reset(struct davinci_mdio_data *data)  in __davinci_mdio_reset()  argument
109 mdio_in = clk_get_rate(data->clk); in __davinci_mdio_reset()
110 div = (mdio_in / data->pdata.bus_freq) - 1; in __davinci_mdio_reset()
115 __raw_writel(div | CONTROL_ENABLE, &data->regs->control); in __davinci_mdio_reset()
132 data->access_time = usecs_to_jiffies(access_time * 4); in __davinci_mdio_reset()
133 if (!data->access_time) in __davinci_mdio_reset()
134 data->access_time = 1; in __davinci_mdio_reset()
139 struct davinci_mdio_data *data = bus->priv; in davinci_mdio_reset() local
142 __davinci_mdio_reset(data); in davinci_mdio_reset()
145 msleep(PHY_MAX_ADDR * data->access_time); in davinci_mdio_reset()
148 ver = __raw_readl(&data->regs->version); in davinci_mdio_reset()
149 dev_info(data->dev, "davinci mdio revision %d.%d\n", in davinci_mdio_reset()
152 if (data->skip_scan) in davinci_mdio_reset()
156 phy_mask = __raw_readl(&data->regs->alive); in davinci_mdio_reset()
159 dev_info(data->dev, "detected phy mask %x\n", ~phy_mask); in davinci_mdio_reset()
163 dev_warn(data->dev, "no live phy, scanning all\n"); in davinci_mdio_reset()
166 data->bus->phy_mask = phy_mask; in davinci_mdio_reset()
172 static inline int wait_for_user_access(struct davinci_mdio_data *data) in wait_for_user_access() argument
174 struct davinci_mdio_regs __iomem *regs = data->regs; in wait_for_user_access()
192 dev_warn(data->dev, "resetting idled controller\n"); in wait_for_user_access()
193 __davinci_mdio_reset(data); in wait_for_user_access()
201 dev_err(data->dev, "timed out waiting for user access\n"); in wait_for_user_access()
206 static inline int wait_for_idle(struct davinci_mdio_data *data) in wait_for_idle() argument
208 struct davinci_mdio_regs __iomem *regs = data->regs; in wait_for_idle()
215 dev_err(data->dev, "timed out waiting for idle\n"); in wait_for_idle()
221 struct davinci_mdio_data *data = bus->priv; in davinci_mdio_read() local
228 spin_lock(&data->lock); in davinci_mdio_read()
230 if (data->suspended) { in davinci_mdio_read()
231 spin_unlock(&data->lock); in davinci_mdio_read()
239 ret = wait_for_user_access(data); in davinci_mdio_read()
245 __raw_writel(reg, &data->regs->user[0].access); in davinci_mdio_read()
247 ret = wait_for_user_access(data); in davinci_mdio_read()
253 reg = __raw_readl(&data->regs->user[0].access); in davinci_mdio_read()
258 spin_unlock(&data->lock); in davinci_mdio_read()
266 struct davinci_mdio_data *data = bus->priv; in davinci_mdio_write() local
273 spin_lock(&data->lock); in davinci_mdio_write()
275 if (data->suspended) { in davinci_mdio_write()
276 spin_unlock(&data->lock); in davinci_mdio_write()
284 ret = wait_for_user_access(data); in davinci_mdio_write()
290 __raw_writel(reg, &data->regs->user[0].access); in davinci_mdio_write()
292 ret = wait_for_user_access(data); in davinci_mdio_write()
298 spin_unlock(&data->lock); in davinci_mdio_write()
304 static int davinci_mdio_probe_dt(struct mdio_platform_data *data, in davinci_mdio_probe_dt() argument
317 data->bus_freq = prop; in davinci_mdio_probe_dt()
327 struct davinci_mdio_data *data; in davinci_mdio_probe() local
332 data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL); in davinci_mdio_probe()
333 if (!data) in davinci_mdio_probe()
336 data->bus = devm_mdiobus_alloc(dev); in davinci_mdio_probe()
337 if (!data->bus) { in davinci_mdio_probe()
343 if (davinci_mdio_probe_dt(&data->pdata, pdev)) in davinci_mdio_probe()
344 data->pdata = default_pdata; in davinci_mdio_probe()
345 snprintf(data->bus->id, MII_BUS_ID_SIZE, "%s", pdev->name); in davinci_mdio_probe()
347 data->pdata = pdata ? (*pdata) : default_pdata; in davinci_mdio_probe()
348 snprintf(data->bus->id, MII_BUS_ID_SIZE, "%s-%x", in davinci_mdio_probe()
352 data->bus->name = dev_name(dev); in davinci_mdio_probe()
353 data->bus->read = davinci_mdio_read, in davinci_mdio_probe()
354 data->bus->write = davinci_mdio_write, in davinci_mdio_probe()
355 data->bus->reset = davinci_mdio_reset, in davinci_mdio_probe()
356 data->bus->parent = dev; in davinci_mdio_probe()
357 data->bus->priv = data; in davinci_mdio_probe()
361 data->clk = devm_clk_get(dev, "fck"); in davinci_mdio_probe()
362 if (IS_ERR(data->clk)) { in davinci_mdio_probe()
364 ret = PTR_ERR(data->clk); in davinci_mdio_probe()
365 data->clk = NULL; in davinci_mdio_probe()
369 dev_set_drvdata(dev, data); in davinci_mdio_probe()
370 data->dev = dev; in davinci_mdio_probe()
371 spin_lock_init(&data->lock); in davinci_mdio_probe()
374 data->regs = devm_ioremap_resource(dev, res); in davinci_mdio_probe()
375 if (IS_ERR(data->regs)) { in davinci_mdio_probe()
376 ret = PTR_ERR(data->regs); in davinci_mdio_probe()
386 data->skip_scan = true; in davinci_mdio_probe()
387 ret = of_mdiobus_register(data->bus, dev->of_node); in davinci_mdio_probe()
389 ret = mdiobus_register(data->bus); in davinci_mdio_probe()
396 phy = data->bus->phy_map[addr]; in davinci_mdio_probe()
415 struct davinci_mdio_data *data = platform_get_drvdata(pdev); in davinci_mdio_remove() local
417 if (data->bus) in davinci_mdio_remove()
418 mdiobus_unregister(data->bus); in davinci_mdio_remove()
429 struct davinci_mdio_data *data = dev_get_drvdata(dev); in davinci_mdio_suspend() local
432 spin_lock(&data->lock); in davinci_mdio_suspend()
435 ctrl = __raw_readl(&data->regs->control); in davinci_mdio_suspend()
437 __raw_writel(ctrl, &data->regs->control); in davinci_mdio_suspend()
438 wait_for_idle(data); in davinci_mdio_suspend()
440 data->suspended = true; in davinci_mdio_suspend()
441 spin_unlock(&data->lock); in davinci_mdio_suspend()
442 pm_runtime_put_sync(data->dev); in davinci_mdio_suspend()
452 struct davinci_mdio_data *data = dev_get_drvdata(dev); in davinci_mdio_resume() local
457 pm_runtime_get_sync(data->dev); in davinci_mdio_resume()
459 spin_lock(&data->lock); in davinci_mdio_resume()
461 __davinci_mdio_reset(data); in davinci_mdio_resume()
463 data->suspended = false; in davinci_mdio_resume()
464 spin_unlock(&data->lock); in davinci_mdio_resume()