Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c3a07134 authored by Florian Fainelli's avatar Florian Fainelli Committed by David S. Miller
Browse files

mv643xx_eth: convert to use the Marvell Orion MDIO driver



This patch converts the Marvell MV643XX ethernet driver to use the
Marvell Orion MDIO driver. As a result, PowerPC and ARM platforms
registering the Marvell MV643XX ethernet driver are also updated to
register a Marvell Orion MDIO driver. This driver voluntarily overlaps
with the Marvell Ethernet shared registers because it will use a subset
of this shared register (shared_base + 0x4 to shared_base + 0x84). The
Ethernet driver is also updated to look up for a PHY device using the
Orion MDIO bus driver.

For ARM and PowerPC we register a single instance of the "mvmdio" driver
in the system like it used to be done with the use of the "shared_smi"
platform_data cookie on ARM.

Note that it is safe to register the mvmdio driver only for the "ge00"
instance of the driver because this "ge00" interface is guaranteed to
always be explicitely registered by consumers of
arch/arm/plat-orion/common.c and other instances (ge01, ge10 and ge11)
were all pointing their shared_smi to ge00. For PowerPC the in-tree
Device Tree Source files mention only one MV643XX ethernet MAC instance
so the MDIO bus driver is registered only when id == 0.

Signed-off-by: default avatarFlorian Fainelli <florian@openwrt.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 2ec98521
Loading
Loading
Loading
Loading
+31 −23
Original line number Diff line number Diff line
@@ -238,6 +238,7 @@ static __init void ge_complete(
	struct mv643xx_eth_shared_platform_data *orion_ge_shared_data,
	struct resource *orion_ge_resource, unsigned long irq,
	struct platform_device *orion_ge_shared,
	struct platform_device *orion_ge_mvmdio,
	struct mv643xx_eth_platform_data *eth_data,
	struct platform_device *orion_ge)
{
@@ -247,6 +248,8 @@ static __init void ge_complete(
	orion_ge->dev.platform_data = eth_data;

	platform_device_register(orion_ge_shared);
	if (orion_ge_mvmdio)
		platform_device_register(orion_ge_mvmdio);
	platform_device_register(orion_ge);
}

@@ -258,8 +261,6 @@ struct mv643xx_eth_shared_platform_data orion_ge00_shared_data;
static struct resource orion_ge00_shared_resources[] = {
	{
		.name	= "ge00 base",
	}, {
		.name	= "ge00 err irq",
	},
};

@@ -271,6 +272,19 @@ static struct platform_device orion_ge00_shared = {
	},
};

static struct resource orion_ge_mvmdio_resources[] = {
	{
		.name	= "ge00 mvmdio base",
	}, {
		.name	= "ge00 mvmdio err irq",
	},
};

static struct platform_device orion_ge_mvmdio = {
	.name		= "orion-mdio",
	.id		= -1,
};

static struct resource orion_ge00_resources[] = {
	{
		.name	= "ge00 irq",
@@ -295,26 +309,25 @@ void __init orion_ge00_init(struct mv643xx_eth_platform_data *eth_data,
			    unsigned int tx_csum_limit)
{
	fill_resources(&orion_ge00_shared, orion_ge00_shared_resources,
		       mapbase + 0x2000, SZ_16K - 1, irq_err);
		       mapbase + 0x2000, SZ_16K - 1, NO_IRQ);
	fill_resources(&orion_ge_mvmdio, orion_ge_mvmdio_resources,
			mapbase + 0x2004, 0x84 - 1, irq_err);
	orion_ge00_shared_data.tx_csum_limit = tx_csum_limit;
	ge_complete(&orion_ge00_shared_data,
		    orion_ge00_resources, irq, &orion_ge00_shared,
		    &orion_ge_mvmdio,
		    eth_data, &orion_ge00);
}

/*****************************************************************************
 * GE01
 ****************************************************************************/
struct mv643xx_eth_shared_platform_data orion_ge01_shared_data = {
	.shared_smi	= &orion_ge00_shared,
};
struct mv643xx_eth_shared_platform_data orion_ge01_shared_data;

static struct resource orion_ge01_shared_resources[] = {
	{
		.name	= "ge01 base",
	}, {
		.name	= "ge01 err irq",
	},
	}
};

static struct platform_device orion_ge01_shared = {
@@ -349,26 +362,23 @@ void __init orion_ge01_init(struct mv643xx_eth_platform_data *eth_data,
			    unsigned int tx_csum_limit)
{
	fill_resources(&orion_ge01_shared, orion_ge01_shared_resources,
		       mapbase + 0x2000, SZ_16K - 1, irq_err);
		       mapbase + 0x2000, SZ_16K - 1, NO_IRQ);
	orion_ge01_shared_data.tx_csum_limit = tx_csum_limit;
	ge_complete(&orion_ge01_shared_data,
		    orion_ge01_resources, irq, &orion_ge01_shared,
		    NULL,
		    eth_data, &orion_ge01);
}

/*****************************************************************************
 * GE10
 ****************************************************************************/
struct mv643xx_eth_shared_platform_data orion_ge10_shared_data = {
	.shared_smi	= &orion_ge00_shared,
};
struct mv643xx_eth_shared_platform_data orion_ge10_shared_data;

static struct resource orion_ge10_shared_resources[] = {
	{
		.name	= "ge10 base",
	}, {
		.name	= "ge10 err irq",
	},
	}
};

static struct platform_device orion_ge10_shared = {
@@ -402,24 +412,21 @@ void __init orion_ge10_init(struct mv643xx_eth_platform_data *eth_data,
			    unsigned long irq_err)
{
	fill_resources(&orion_ge10_shared, orion_ge10_shared_resources,
		       mapbase + 0x2000, SZ_16K - 1, irq_err);
		       mapbase + 0x2000, SZ_16K - 1, NO_IRQ);
	ge_complete(&orion_ge10_shared_data,
		    orion_ge10_resources, irq, &orion_ge10_shared,
		    NULL,
		    eth_data, &orion_ge10);
}

/*****************************************************************************
 * GE11
 ****************************************************************************/
struct mv643xx_eth_shared_platform_data orion_ge11_shared_data = {
	.shared_smi	= &orion_ge00_shared,
};
struct mv643xx_eth_shared_platform_data orion_ge11_shared_data;

static struct resource orion_ge11_shared_resources[] = {
	{
		.name	= "ge11 base",
	}, {
		.name	= "ge11 err irq",
	},
};

@@ -454,9 +461,10 @@ void __init orion_ge11_init(struct mv643xx_eth_platform_data *eth_data,
			    unsigned long irq_err)
{
	fill_resources(&orion_ge11_shared, orion_ge11_shared_resources,
		       mapbase + 0x2000, SZ_16K - 1, irq_err);
		       mapbase + 0x2000, SZ_16K - 1, NO_IRQ);
	ge_complete(&orion_ge11_shared_data,
		    orion_ge11_resources, irq, &orion_ge11_shared,
		    NULL,
		    eth_data, &orion_ge11);
}

+20 −0
Original line number Diff line number Diff line
@@ -47,6 +47,25 @@ static struct platform_device mv643xx_eth_shared_device = {
	.resource	= mv643xx_eth_shared_resources,
};

/*
 * The orion mdio driver only covers shared + 0x4 up to shared + 0x84 - 1
 */
static struct resource mv643xx_eth_mvmdio_resources[] = {
	[0] = {
		.name	= "ethernet mdio base",
		.start	= 0xf1000000 + MV643XX_ETH_SHARED_REGS + 0x4,
		.end	= 0xf1000000 + MV643XX_ETH_SHARED_REGS + 0x83,
		.flags	= IORESOURCE_MEM,
	},
};

static struct platform_device mv643xx_eth_mvmdio_device = {
	.name		= "orion-mdio",
	.id		= -1,
	.num_resources	= ARRAY_SIZE(mv643xx_eth_mvmdio_resources),
	.resource	= mv643xx_eth_shared_resources,
};

static struct resource mv643xx_eth_port1_resources[] = {
	[0] = {
		.name	= "eth port1 irq",
@@ -82,6 +101,7 @@ static struct platform_device eth_port1_device = {

static struct platform_device *mv643xx_eth_pd_devs[] __initdata = {
	&mv643xx_eth_shared_device,
	&mv643xx_eth_mvmdio_device,
	&eth_port1_device,
};

+14 −2
Original line number Diff line number Diff line
@@ -214,15 +214,27 @@ static struct platform_device * __init mv64x60_eth_register_shared_pdev(
						struct device_node *np, int id)
{
	struct platform_device *pdev;
	struct resource r[1];
	struct resource r[2];
	int err;

	err = of_address_to_resource(np, 0, &r[0]);
	if (err)
		return ERR_PTR(err);

	/* register an orion mdio bus driver */
	r[1].start = r[0].start + 0x4;
	r[1].end = r[0].start + 0x84 - 1;
	r[1].flags = IORESOURCE_MEM;

	if (id == 0) {
		pdev = platform_device_register_simple("orion-mdio", -1, &r[1], 1);
		if (!pdev)
			return pdev;
	}

	pdev = platform_device_register_simple(MV643XX_ETH_SHARED_NAME, id,
					       r, 1);
					       &r[0], 1);

	return pdev;
}

+2 −3
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ config MV643XX_ETH
	depends on (MV64X60 || PPC32 || PLAT_ORION) && INET
	select INET_LRO
	select PHYLIB
	select MVMDIO
	---help---
	  This driver supports the gigabit ethernet MACs in the
	  Marvell Discovery PPC/MIPS chipset family (MV643XX) and
@@ -38,9 +39,7 @@ config MVMDIO
	  interface units of the Marvell EBU SoCs (Kirkwood, Orion5x,
	  Dove, Armada 370 and Armada XP).

	  For now, this driver is only needed for the MVNETA driver
	  (used on Armada 370 and XP), but it could be used in the
	  future by the MV643XX_ETH driver.
	  This driver is used by the MV643XX_ETH and MVNETA drivers.

config MVNETA
	tristate "Marvell Armada 370/XP network interface support"
+1 −1
Original line number Diff line number Diff line
@@ -2,8 +2,8 @@
# Makefile for the Marvell device drivers.
#

obj-$(CONFIG_MV643XX_ETH) += mv643xx_eth.o
obj-$(CONFIG_MVMDIO) += mvmdio.o
obj-$(CONFIG_MV643XX_ETH) += mv643xx_eth.o
obj-$(CONFIG_MVNETA) += mvneta.o
obj-$(CONFIG_PXA168_ETH) += pxa168_eth.o
obj-$(CONFIG_SKGE) += skge.o
Loading