Lines Matching +full:realtek +full:- +full:mdio
1 // SPDX-License-Identifier: GPL-2.0+
2 /* Realtek MDIO interface driver
6 * RTL8366 - The original version, apparently
7 * RTL8369 - Similar enough to have the same datsheet as RTL8366
8 * RTL8366RB - Probably reads out "RTL8366 revision B", has a quite
10 * RTL8366S - Is this "RTL8366 super"?
11 * RTL8367 - Has an OpenWRT driver as well
12 * RTL8368S - Seems to be an alternative name for RTL8366RB
13 * RTL8370 - Also uses SMI
19 * Copyright (C) 2009-2010 Gabor Juhos <juhosg@openwrt.org>
27 #include "realtek.h"
45 struct mii_bus *bus = priv->bus; in realtek_mdio_write()
48 mutex_lock(&bus->mdio_lock); in realtek_mdio_write()
50 ret = bus->write(bus, priv->mdio_addr, REALTEK_MDIO_CTRL0_REG, REALTEK_MDIO_ADDR_OP); in realtek_mdio_write()
54 ret = bus->write(bus, priv->mdio_addr, REALTEK_MDIO_ADDRESS_REG, reg); in realtek_mdio_write()
58 ret = bus->write(bus, priv->mdio_addr, REALTEK_MDIO_DATA_WRITE_REG, val); in realtek_mdio_write()
62 ret = bus->write(bus, priv->mdio_addr, REALTEK_MDIO_CTRL1_REG, REALTEK_MDIO_WRITE_OP); in realtek_mdio_write()
65 mutex_unlock(&bus->mdio_lock); in realtek_mdio_write()
73 struct mii_bus *bus = priv->bus; in realtek_mdio_read()
76 mutex_lock(&bus->mdio_lock); in realtek_mdio_read()
78 ret = bus->write(bus, priv->mdio_addr, REALTEK_MDIO_CTRL0_REG, REALTEK_MDIO_ADDR_OP); in realtek_mdio_read()
82 ret = bus->write(bus, priv->mdio_addr, REALTEK_MDIO_ADDRESS_REG, reg); in realtek_mdio_read()
86 ret = bus->write(bus, priv->mdio_addr, REALTEK_MDIO_CTRL1_REG, REALTEK_MDIO_READ_OP); in realtek_mdio_read()
90 ret = bus->read(bus, priv->mdio_addr, REALTEK_MDIO_DATA_READ_REG); in realtek_mdio_read()
97 mutex_unlock(&bus->mdio_lock); in realtek_mdio_read()
106 mutex_lock(&priv->map_lock); in realtek_mdio_lock()
113 mutex_unlock(&priv->map_lock); in realtek_mdio_unlock()
146 struct device *dev = &mdiodev->dev; in realtek_mdio_probe()
154 return -EINVAL; in realtek_mdio_probe()
156 priv = devm_kzalloc(&mdiodev->dev, in realtek_mdio_probe()
157 size_add(sizeof(*priv), var->chip_data_sz), in realtek_mdio_probe()
160 return -ENOMEM; in realtek_mdio_probe()
162 mutex_init(&priv->map_lock); in realtek_mdio_probe()
166 priv->map = devm_regmap_init(dev, NULL, priv, &rc); in realtek_mdio_probe()
167 if (IS_ERR(priv->map)) { in realtek_mdio_probe()
168 ret = PTR_ERR(priv->map); in realtek_mdio_probe()
174 priv->map_nolock = devm_regmap_init(dev, NULL, priv, &rc); in realtek_mdio_probe()
175 if (IS_ERR(priv->map_nolock)) { in realtek_mdio_probe()
176 ret = PTR_ERR(priv->map_nolock); in realtek_mdio_probe()
181 priv->mdio_addr = mdiodev->addr; in realtek_mdio_probe()
182 priv->bus = mdiodev->bus; in realtek_mdio_probe()
183 priv->dev = &mdiodev->dev; in realtek_mdio_probe()
184 priv->chip_data = (void *)priv + sizeof(*priv); in realtek_mdio_probe()
186 priv->clk_delay = var->clk_delay; in realtek_mdio_probe()
187 priv->cmd_read = var->cmd_read; in realtek_mdio_probe()
188 priv->cmd_write = var->cmd_write; in realtek_mdio_probe()
189 priv->ops = var->ops; in realtek_mdio_probe()
191 priv->write_reg_noack = realtek_mdio_write; in realtek_mdio_probe()
193 np = dev->of_node; in realtek_mdio_probe()
198 priv->leds_disabled = of_property_read_bool(np, "realtek,disable-leds"); in realtek_mdio_probe()
200 priv->reset = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_LOW); in realtek_mdio_probe()
201 if (IS_ERR(priv->reset)) { in realtek_mdio_probe()
203 return PTR_ERR(priv->reset); in realtek_mdio_probe()
206 if (priv->reset) { in realtek_mdio_probe()
207 gpiod_set_value(priv->reset, 1); in realtek_mdio_probe()
210 gpiod_set_value(priv->reset, 0); in realtek_mdio_probe()
215 ret = priv->ops->detect(priv); in realtek_mdio_probe()
221 priv->ds = devm_kzalloc(dev, sizeof(*priv->ds), GFP_KERNEL); in realtek_mdio_probe()
222 if (!priv->ds) in realtek_mdio_probe()
223 return -ENOMEM; in realtek_mdio_probe()
225 priv->ds->dev = dev; in realtek_mdio_probe()
226 priv->ds->num_ports = priv->num_ports; in realtek_mdio_probe()
227 priv->ds->priv = priv; in realtek_mdio_probe()
228 priv->ds->ops = var->ds_ops_mdio; in realtek_mdio_probe()
230 ret = dsa_register_switch(priv->ds); in realtek_mdio_probe()
232 dev_err(priv->dev, "unable to register switch ret = %d\n", ret); in realtek_mdio_probe()
241 struct realtek_priv *priv = dev_get_drvdata(&mdiodev->dev); in realtek_mdio_remove()
246 dsa_unregister_switch(priv->ds); in realtek_mdio_remove()
249 if (priv->reset) in realtek_mdio_remove()
250 gpiod_set_value(priv->reset, 1); in realtek_mdio_remove()
255 struct realtek_priv *priv = dev_get_drvdata(&mdiodev->dev); in realtek_mdio_shutdown()
260 dsa_switch_shutdown(priv->ds); in realtek_mdio_shutdown()
262 dev_set_drvdata(&mdiodev->dev, NULL); in realtek_mdio_shutdown()
267 { .compatible = "realtek,rtl8366rb", .data = &rtl8366rb_variant, },
270 { .compatible = "realtek,rtl8365mb", .data = &rtl8365mb_variant, },
278 .name = "realtek-mdio",
289 MODULE_DESCRIPTION("Driver for Realtek ethernet switch connected via MDIO interface");