// SPDX-License-Identifier: GPL-2.0+ /* Realtek Simple Management Interface (SMI) driver * It can be discussed how "simple" this interface is. * * The SMI protocol piggy-backs the MDIO MDC and MDIO signals levels * but the protocol is not MDIO at all. Instead it is a Realtek * pecularity that need to bit-bang the lines in a special way to * communicate with the switch. * * ASICs we intend to support with this driver: * * RTL8366 - The original version, apparently * RTL8369 - Similar enough to have the same datsheet as RTL8366 * RTL8366RB - Probably reads out "RTL8366 revision B", has a quite * different register layout from the other two * RTL8366S - Is this "RTL8366 super"? * RTL8367 - Has an OpenWRT driver as well * RTL8368S - Seems to be an alternative name for RTL8366RB * RTL8370 - Also uses SMI * * Copyright (C) 2017 Linus Walleij <linus.walleij@linaro.org> * Copyright (C) 2010 Antti Seppälä <a.seppala@gmail.com> * Copyright (C) 2010 Roman Yeryomin <roman@advem.lv> * Copyright (C) 2011 Colin Leitner <colin.leitner@googlemail.com> * Copyright (C) 2009-2010 Gabor Juhos <juhosg@openwrt.org>
*/
/* Send WRITE command */
ret = realtek_smi_write_byte(priv, priv->variant->cmd_write); if (ret) goto out;
/* Set ADDR[7:0] */
ret = realtek_smi_write_byte(priv, addr & 0xff); if (ret) goto out;
/* Set ADDR[15:8] */
ret = realtek_smi_write_byte(priv, addr >> 8); if (ret) goto out;
/* Write DATA[7:0] */
ret = realtek_smi_write_byte(priv, data & 0xff); if (ret) goto out;
/* Write DATA[15:8] */ if (ack)
ret = realtek_smi_write_byte(priv, data >> 8); else
ret = realtek_smi_write_byte_noack(priv, data >> 8); if (ret) goto out;
/* There is one single case when we need to use this accessor and that * is when issueing soft reset. Since the device reset as soon as we write * that bit, no ACK will come back for natural reasons.
*/ staticint realtek_smi_write_reg_noack(void *ctx, u32 reg, u32 val)
{ return realtek_smi_write_reg(ctx, reg, val, false);
}
/** * realtek_smi_probe() - Probe a platform device for an SMI-connected switch * @pdev: platform_device to probe on. * * This function should be used as the .probe in a platform_driver. After * calling the common probe function for both interfaces, it initializes the * values specific for SMI-connected devices. Finally, it calls a common * function to register the DSA switch. * * Context: Can sleep. Takes and releases priv->map_lock. * Return: Returns 0 on success, a negative error on failure.
*/ int realtek_smi_probe(struct platform_device *pdev)
{ struct device *dev = &pdev->dev; struct realtek_priv *priv; int ret;
priv = rtl83xx_probe(dev, &realtek_smi_info); if (IS_ERR(priv)) return PTR_ERR(priv);
/** * realtek_smi_remove() - Remove the driver of a SMI-connected switch * @pdev: platform_device to be removed. * * This function should be used as the .remove in a platform_driver. First * it unregisters the DSA switch and then it calls the common remove function. * * Context: Can sleep. * Return: Nothing.
*/ void realtek_smi_remove(struct platform_device *pdev)
{ struct realtek_priv *priv = platform_get_drvdata(pdev);
/** * realtek_smi_shutdown() - Shutdown the driver of a SMI-connected switch * @pdev: platform_device shutting down. * * This function should be used as the .shutdown in a platform_driver. It calls * the common shutdown function. * * Context: Can sleep. * Return: Nothing.
*/ void realtek_smi_shutdown(struct platform_device *pdev)
{ struct realtek_priv *priv = platform_get_drvdata(pdev);
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.