Commit b5b23822 authored by David S. Miller's avatar David S. Miller
Browse files

Merge branch 'ACPI-support-for-xgmac_mdio-drivers'



Calvin Johnson says:

====================
ACPI support for xgmac_mdio drivers.

This patch series provides ACPI support for xgmac_mdio driver.

Changes in v3:
- handle case MDIOBUS_NO_CAP

Changes in v2:
- Reserve "0" to mean that no mdiobus capabilities have been declared.
- bus->id: change to appropriate printk format specifier
- clean up xgmac_acpi_match
- clariy platform_get_resource() usage with comments
====================

Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 1c59bb6b 0f183fd1
Loading
Loading
Loading
Loading
+23 −10
Original line number Diff line number Diff line
@@ -245,14 +245,19 @@ static int xgmac_mdio_probe(struct platform_device *pdev)
{
	struct device_node *np = pdev->dev.of_node;
	struct mii_bus *bus;
	struct resource res;
	struct resource *res;
	struct mdio_fsl_priv *priv;
	int ret;

	ret = of_address_to_resource(np, 0, &res);
	if (ret) {
	/* In DPAA-1, MDIO is one of the many FMan sub-devices. The FMan
	 * defines a register space that spans a large area, covering all the
	 * subdevice areas. Therefore, MDIO cannot claim exclusive access to
	 * this register area.
	 */
	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	if (!res) {
		dev_err(&pdev->dev, "could not obtain address\n");
		return ret;
		return -EINVAL;
	}

	bus = mdiobus_alloc_size(sizeof(struct mdio_fsl_priv));
@@ -263,20 +268,21 @@ static int xgmac_mdio_probe(struct platform_device *pdev)
	bus->read = xgmac_mdio_read;
	bus->write = xgmac_mdio_write;
	bus->parent = &pdev->dev;
	snprintf(bus->id, MII_BUS_ID_SIZE, "%llx", (unsigned long long)res.start);
	bus->probe_capabilities = MDIOBUS_C22_C45;
	snprintf(bus->id, MII_BUS_ID_SIZE, "%pa", &res->start);

	/* Set the PHY base address */
	priv = bus->priv;
	priv->mdio_base = of_iomap(np, 0);
	priv->mdio_base = ioremap(res->start, resource_size(res));
	if (!priv->mdio_base) {
		ret = -ENOMEM;
		goto err_ioremap;
	}

	priv->is_little_endian = of_property_read_bool(pdev->dev.of_node,
	priv->is_little_endian = device_property_read_bool(&pdev->dev,
							   "little-endian");

	priv->has_a011043 = of_property_read_bool(pdev->dev.of_node,
	priv->has_a011043 = device_property_read_bool(&pdev->dev,
						      "fsl,erratum-a011043");

	ret = of_mdiobus_register(bus, np);
@@ -320,10 +326,17 @@ static const struct of_device_id xgmac_mdio_match[] = {
};
MODULE_DEVICE_TABLE(of, xgmac_mdio_match);

static const struct acpi_device_id xgmac_acpi_match[] = {
	{ "NXP0006" },
	{ }
};
MODULE_DEVICE_TABLE(acpi, xgmac_acpi_match);

static struct platform_driver xgmac_mdio_driver = {
	.driver = {
		.name = "fsl-fman_xmdio",
		.of_match_table = xgmac_mdio_match,
		.acpi_match_table = xgmac_acpi_match,
	},
	.probe = xgmac_mdio_probe,
	.remove = xgmac_mdio_remove,
+16 −2
Original line number Diff line number Diff line
@@ -739,10 +739,24 @@ EXPORT_SYMBOL(mdiobus_free);
 */
struct phy_device *mdiobus_scan(struct mii_bus *bus, int addr)
{
	struct phy_device *phydev;
	struct phy_device *phydev = ERR_PTR(-ENODEV);
	int err;

	switch (bus->probe_capabilities) {
	case MDIOBUS_NO_CAP:
	case MDIOBUS_C22:
		phydev = get_phy_device(bus, addr, false);
		break;
	case MDIOBUS_C45:
		phydev = get_phy_device(bus, addr, true);
		break;
	case MDIOBUS_C22_C45:
		phydev = get_phy_device(bus, addr, false);
		if (IS_ERR(phydev))
			phydev = get_phy_device(bus, addr, true);
		break;
	}

	if (IS_ERR(phydev))
		return phydev;

+8 −0
Original line number Diff line number Diff line
@@ -298,6 +298,14 @@ struct mii_bus {
	/* RESET GPIO descriptor pointer */
	struct gpio_desc *reset_gpiod;

	/* bus capabilities, used for probing */
	enum {
		MDIOBUS_NO_CAP = 0,
		MDIOBUS_C22,
		MDIOBUS_C45,
		MDIOBUS_C22_C45,
	} probe_capabilities;

	/* protect access to the shared element */
	struct mutex shared_lock;