Lines Matching refs:priv

47 static inline void realtek_smi_clk_delay(struct realtek_priv *priv)  in realtek_smi_clk_delay()  argument
49 ndelay(priv->clk_delay); in realtek_smi_clk_delay()
52 static void realtek_smi_start(struct realtek_priv *priv) in realtek_smi_start() argument
57 gpiod_direction_output(priv->mdc, 0); in realtek_smi_start()
58 gpiod_direction_output(priv->mdio, 1); in realtek_smi_start()
59 realtek_smi_clk_delay(priv); in realtek_smi_start()
62 gpiod_set_value(priv->mdc, 1); in realtek_smi_start()
63 realtek_smi_clk_delay(priv); in realtek_smi_start()
64 gpiod_set_value(priv->mdc, 0); in realtek_smi_start()
65 realtek_smi_clk_delay(priv); in realtek_smi_start()
68 gpiod_set_value(priv->mdc, 1); in realtek_smi_start()
69 realtek_smi_clk_delay(priv); in realtek_smi_start()
70 gpiod_set_value(priv->mdio, 0); in realtek_smi_start()
71 realtek_smi_clk_delay(priv); in realtek_smi_start()
72 gpiod_set_value(priv->mdc, 0); in realtek_smi_start()
73 realtek_smi_clk_delay(priv); in realtek_smi_start()
74 gpiod_set_value(priv->mdio, 1); in realtek_smi_start()
77 static void realtek_smi_stop(struct realtek_priv *priv) in realtek_smi_stop() argument
79 realtek_smi_clk_delay(priv); in realtek_smi_stop()
80 gpiod_set_value(priv->mdio, 0); in realtek_smi_stop()
81 gpiod_set_value(priv->mdc, 1); in realtek_smi_stop()
82 realtek_smi_clk_delay(priv); in realtek_smi_stop()
83 gpiod_set_value(priv->mdio, 1); in realtek_smi_stop()
84 realtek_smi_clk_delay(priv); in realtek_smi_stop()
85 gpiod_set_value(priv->mdc, 1); in realtek_smi_stop()
86 realtek_smi_clk_delay(priv); in realtek_smi_stop()
87 gpiod_set_value(priv->mdc, 0); in realtek_smi_stop()
88 realtek_smi_clk_delay(priv); in realtek_smi_stop()
89 gpiod_set_value(priv->mdc, 1); in realtek_smi_stop()
92 realtek_smi_clk_delay(priv); in realtek_smi_stop()
93 gpiod_set_value(priv->mdc, 0); in realtek_smi_stop()
94 realtek_smi_clk_delay(priv); in realtek_smi_stop()
95 gpiod_set_value(priv->mdc, 1); in realtek_smi_stop()
98 gpiod_direction_input(priv->mdio); in realtek_smi_stop()
99 gpiod_direction_input(priv->mdc); in realtek_smi_stop()
102 static void realtek_smi_write_bits(struct realtek_priv *priv, u32 data, u32 len) in realtek_smi_write_bits() argument
105 realtek_smi_clk_delay(priv); in realtek_smi_write_bits()
108 gpiod_set_value(priv->mdio, !!(data & (1 << (len - 1)))); in realtek_smi_write_bits()
109 realtek_smi_clk_delay(priv); in realtek_smi_write_bits()
112 gpiod_set_value(priv->mdc, 1); in realtek_smi_write_bits()
113 realtek_smi_clk_delay(priv); in realtek_smi_write_bits()
114 gpiod_set_value(priv->mdc, 0); in realtek_smi_write_bits()
118 static void realtek_smi_read_bits(struct realtek_priv *priv, u32 len, u32 *data) in realtek_smi_read_bits() argument
120 gpiod_direction_input(priv->mdio); in realtek_smi_read_bits()
125 realtek_smi_clk_delay(priv); in realtek_smi_read_bits()
128 gpiod_set_value(priv->mdc, 1); in realtek_smi_read_bits()
129 realtek_smi_clk_delay(priv); in realtek_smi_read_bits()
130 u = !!gpiod_get_value(priv->mdio); in realtek_smi_read_bits()
131 gpiod_set_value(priv->mdc, 0); in realtek_smi_read_bits()
136 gpiod_direction_output(priv->mdio, 0); in realtek_smi_read_bits()
139 static int realtek_smi_wait_for_ack(struct realtek_priv *priv) in realtek_smi_wait_for_ack() argument
147 realtek_smi_read_bits(priv, 1, &ack); in realtek_smi_wait_for_ack()
152 dev_err(priv->dev, "ACK timeout\n"); in realtek_smi_wait_for_ack()
160 static int realtek_smi_write_byte(struct realtek_priv *priv, u8 data) in realtek_smi_write_byte() argument
162 realtek_smi_write_bits(priv, data, 8); in realtek_smi_write_byte()
163 return realtek_smi_wait_for_ack(priv); in realtek_smi_write_byte()
166 static int realtek_smi_write_byte_noack(struct realtek_priv *priv, u8 data) in realtek_smi_write_byte_noack() argument
168 realtek_smi_write_bits(priv, data, 8); in realtek_smi_write_byte_noack()
172 static int realtek_smi_read_byte0(struct realtek_priv *priv, u8 *data) in realtek_smi_read_byte0() argument
177 realtek_smi_read_bits(priv, 8, &t); in realtek_smi_read_byte0()
181 realtek_smi_write_bits(priv, 0x00, 1); in realtek_smi_read_byte0()
186 static int realtek_smi_read_byte1(struct realtek_priv *priv, u8 *data) in realtek_smi_read_byte1() argument
191 realtek_smi_read_bits(priv, 8, &t); in realtek_smi_read_byte1()
195 realtek_smi_write_bits(priv, 0x01, 1); in realtek_smi_read_byte1()
200 static int realtek_smi_read_reg(struct realtek_priv *priv, u32 addr, u32 *data) in realtek_smi_read_reg() argument
207 spin_lock_irqsave(&priv->lock, flags); in realtek_smi_read_reg()
209 realtek_smi_start(priv); in realtek_smi_read_reg()
212 ret = realtek_smi_write_byte(priv, priv->cmd_read); in realtek_smi_read_reg()
217 ret = realtek_smi_write_byte(priv, addr & 0xff); in realtek_smi_read_reg()
222 ret = realtek_smi_write_byte(priv, addr >> 8); in realtek_smi_read_reg()
227 realtek_smi_read_byte0(priv, &lo); in realtek_smi_read_reg()
229 realtek_smi_read_byte1(priv, &hi); in realtek_smi_read_reg()
236 realtek_smi_stop(priv); in realtek_smi_read_reg()
237 spin_unlock_irqrestore(&priv->lock, flags); in realtek_smi_read_reg()
242 static int realtek_smi_write_reg(struct realtek_priv *priv, in realtek_smi_write_reg() argument
248 spin_lock_irqsave(&priv->lock, flags); in realtek_smi_write_reg()
250 realtek_smi_start(priv); in realtek_smi_write_reg()
253 ret = realtek_smi_write_byte(priv, priv->cmd_write); in realtek_smi_write_reg()
258 ret = realtek_smi_write_byte(priv, addr & 0xff); in realtek_smi_write_reg()
263 ret = realtek_smi_write_byte(priv, addr >> 8); in realtek_smi_write_reg()
268 ret = realtek_smi_write_byte(priv, data & 0xff); in realtek_smi_write_reg()
274 ret = realtek_smi_write_byte(priv, data >> 8); in realtek_smi_write_reg()
276 ret = realtek_smi_write_byte_noack(priv, data >> 8); in realtek_smi_write_reg()
283 realtek_smi_stop(priv); in realtek_smi_write_reg()
284 spin_unlock_irqrestore(&priv->lock, flags); in realtek_smi_write_reg()
302 struct realtek_priv *priv = ctx; in realtek_smi_write() local
304 return realtek_smi_write_reg(priv, reg, val, true); in realtek_smi_write()
309 struct realtek_priv *priv = ctx; in realtek_smi_read() local
311 return realtek_smi_read_reg(priv, reg, val); in realtek_smi_read()
316 struct realtek_priv *priv = ctx; in realtek_smi_lock() local
318 mutex_lock(&priv->map_lock); in realtek_smi_lock()
323 struct realtek_priv *priv = ctx; in realtek_smi_unlock() local
325 mutex_unlock(&priv->map_lock); in realtek_smi_unlock()
357 struct realtek_priv *priv = bus->priv; in realtek_smi_mdio_read() local
359 return priv->ops->phy_read(priv, addr, regnum); in realtek_smi_mdio_read()
365 struct realtek_priv *priv = bus->priv; in realtek_smi_mdio_write() local
367 return priv->ops->phy_write(priv, addr, regnum, val); in realtek_smi_mdio_write()
372 struct realtek_priv *priv = ds->priv; in realtek_smi_setup_mdio() local
376 mdio_np = of_get_compatible_child(priv->dev->of_node, "realtek,smi-mdio"); in realtek_smi_setup_mdio()
378 dev_err(priv->dev, "no MDIO bus node\n"); in realtek_smi_setup_mdio()
382 priv->slave_mii_bus = devm_mdiobus_alloc(priv->dev); in realtek_smi_setup_mdio()
383 if (!priv->slave_mii_bus) { in realtek_smi_setup_mdio()
387 priv->slave_mii_bus->priv = priv; in realtek_smi_setup_mdio()
388 priv->slave_mii_bus->name = "SMI slave MII"; in realtek_smi_setup_mdio()
389 priv->slave_mii_bus->read = realtek_smi_mdio_read; in realtek_smi_setup_mdio()
390 priv->slave_mii_bus->write = realtek_smi_mdio_write; in realtek_smi_setup_mdio()
391 snprintf(priv->slave_mii_bus->id, MII_BUS_ID_SIZE, "SMI-%d", in realtek_smi_setup_mdio()
393 priv->slave_mii_bus->dev.of_node = mdio_np; in realtek_smi_setup_mdio()
394 priv->slave_mii_bus->parent = priv->dev; in realtek_smi_setup_mdio()
395 ds->slave_mii_bus = priv->slave_mii_bus; in realtek_smi_setup_mdio()
397 ret = devm_of_mdiobus_register(priv->dev, priv->slave_mii_bus, mdio_np); in realtek_smi_setup_mdio()
399 dev_err(priv->dev, "unable to register MDIO bus %s\n", in realtek_smi_setup_mdio()
400 priv->slave_mii_bus->id); in realtek_smi_setup_mdio()
416 struct realtek_priv *priv; in realtek_smi_probe() local
424 priv = devm_kzalloc(dev, sizeof(*priv) + var->chip_data_sz, GFP_KERNEL); in realtek_smi_probe()
425 if (!priv) in realtek_smi_probe()
427 priv->chip_data = (void *)priv + sizeof(*priv); in realtek_smi_probe()
429 mutex_init(&priv->map_lock); in realtek_smi_probe()
432 rc.lock_arg = priv; in realtek_smi_probe()
433 priv->map = devm_regmap_init(dev, NULL, priv, &rc); in realtek_smi_probe()
434 if (IS_ERR(priv->map)) { in realtek_smi_probe()
435 ret = PTR_ERR(priv->map); in realtek_smi_probe()
441 priv->map_nolock = devm_regmap_init(dev, NULL, priv, &rc); in realtek_smi_probe()
442 if (IS_ERR(priv->map_nolock)) { in realtek_smi_probe()
443 ret = PTR_ERR(priv->map_nolock); in realtek_smi_probe()
449 priv->dev = dev; in realtek_smi_probe()
450 priv->clk_delay = var->clk_delay; in realtek_smi_probe()
451 priv->cmd_read = var->cmd_read; in realtek_smi_probe()
452 priv->cmd_write = var->cmd_write; in realtek_smi_probe()
453 priv->ops = var->ops; in realtek_smi_probe()
455 priv->setup_interface = realtek_smi_setup_mdio; in realtek_smi_probe()
456 priv->write_reg_noack = realtek_smi_write_reg_noack; in realtek_smi_probe()
458 dev_set_drvdata(dev, priv); in realtek_smi_probe()
459 spin_lock_init(&priv->lock); in realtek_smi_probe()
463 priv->reset = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_LOW); in realtek_smi_probe()
464 if (IS_ERR(priv->reset)) { in realtek_smi_probe()
466 return PTR_ERR(priv->reset); in realtek_smi_probe()
468 if (priv->reset) { in realtek_smi_probe()
469 gpiod_set_value(priv->reset, 1); in realtek_smi_probe()
472 gpiod_set_value(priv->reset, 0); in realtek_smi_probe()
478 priv->mdc = devm_gpiod_get_optional(dev, "mdc", GPIOD_OUT_LOW); in realtek_smi_probe()
479 if (IS_ERR(priv->mdc)) in realtek_smi_probe()
480 return PTR_ERR(priv->mdc); in realtek_smi_probe()
481 priv->mdio = devm_gpiod_get_optional(dev, "mdio", GPIOD_OUT_LOW); in realtek_smi_probe()
482 if (IS_ERR(priv->mdio)) in realtek_smi_probe()
483 return PTR_ERR(priv->mdio); in realtek_smi_probe()
485 priv->leds_disabled = of_property_read_bool(np, "realtek,disable-leds"); in realtek_smi_probe()
487 ret = priv->ops->detect(priv); in realtek_smi_probe()
493 priv->ds = devm_kzalloc(dev, sizeof(*priv->ds), GFP_KERNEL); in realtek_smi_probe()
494 if (!priv->ds) in realtek_smi_probe()
497 priv->ds->dev = dev; in realtek_smi_probe()
498 priv->ds->num_ports = priv->num_ports; in realtek_smi_probe()
499 priv->ds->priv = priv; in realtek_smi_probe()
501 priv->ds->ops = var->ds_ops_smi; in realtek_smi_probe()
502 ret = dsa_register_switch(priv->ds); in realtek_smi_probe()
512 struct realtek_priv *priv = platform_get_drvdata(pdev); in realtek_smi_remove() local
514 if (!priv) in realtek_smi_remove()
517 dsa_unregister_switch(priv->ds); in realtek_smi_remove()
518 if (priv->slave_mii_bus) in realtek_smi_remove()
519 of_node_put(priv->slave_mii_bus->dev.of_node); in realtek_smi_remove()
522 if (priv->reset) in realtek_smi_remove()
523 gpiod_set_value(priv->reset, 1); in realtek_smi_remove()
530 struct realtek_priv *priv = platform_get_drvdata(pdev); in realtek_smi_shutdown() local
532 if (!priv) in realtek_smi_shutdown()
535 dsa_switch_shutdown(priv->ds); in realtek_smi_shutdown()