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

Commit b2b3dc2f authored by Ronen Shitrit's avatar Ronen Shitrit Committed by Nicolas Pitre
Browse files

[ARM] Kirkwood: add support for newer SoC models



Add support to the Kirkwood port for newer device models and silicon
revisions.  Instead of looking at the DEVICE_ID register, the device
version is now determined by looking at the PCI-Express device ID and
revision registers, as it is done for orion5x, and this information
is used to determine the TCLK frequency, again, as it is done for
orion5x.

Signed-off-by: default avatarRonen Shitrit <rshitrit@marvell.com>
Signed-off-by: default avatarLennert Buytenhek <buytenh@marvell.com>
parent 79d4dd77
Loading
Loading
Loading
Loading
+34 −9
Original line number Diff line number Diff line
@@ -532,6 +532,12 @@ int kirkwood_tclk;

int __init kirkwood_find_tclk(void)
{
	u32 dev, rev;

	kirkwood_pcie_id(&dev, &rev);
	if (dev == MV88F6281_DEV_ID && rev == MV88F6281_REV_A0)
		return 200000000;

	return 166666667;
}

@@ -549,18 +555,37 @@ struct sys_timer kirkwood_timer = {
/*****************************************************************************
 * General
 ****************************************************************************/
/*
 * Identify device ID and revision.
 */
static char * __init kirkwood_id(void)
{
	switch (readl(DEVICE_ID) & 0x3) {
	case 0:
		return "88F6180";
	case 1:
		return "88F6192";
	case 2:
		return "88F6281";
	u32 dev, rev;

	kirkwood_pcie_id(&dev, &rev);

	if (dev == MV88F6281_DEV_ID) {
		if (rev == MV88F6281_REV_Z0)
			return "MV88F6281-Z0";
		else if (rev == MV88F6281_REV_A0)
			return "MV88F6281-A0";
		else
			return "MV88F6281-Rev-Unsupported";
	} else if (dev == MV88F6192_DEV_ID) {
		if (rev == MV88F6192_REV_Z0)
			return "MV88F6192-Z0";
		else if (rev == MV88F6192_REV_A0)
			return "MV88F6192-A0";
		else
			return "MV88F6192-Rev-Unsupported";
	} else if (dev == MV88F6180_DEV_ID) {
		if (rev == MV88F6180_REV_A0)
			return "MV88F6180-Rev-A0";
		else
			return "MV88F6180-Rev-Unsupported";
	} else {
		return "Device-Unknown";
	}

	return "unknown 88F6000 variant";
}

static int __init is_l2_writethrough(void)
+2 −0
Original line number Diff line number Diff line
@@ -28,6 +28,8 @@ void kirkwood_setup_pcie_io_win(int window, u32 base, u32 size,
void kirkwood_setup_pcie_mem_win(int window, u32 base, u32 size,
				 int maj, int min);

void kirkwood_pcie_id(u32 *dev, u32 *rev);

void kirkwood_ehci_init(void);
void kirkwood_ge00_init(struct mv643xx_eth_platform_data *eth_data);
void kirkwood_pcie_init(void);
+14 −0
Original line number Diff line number Diff line
@@ -67,6 +67,20 @@
#define  L2_CONFIG_REG		(BRIDGE_VIRT_BASE | 0x0128)
#define   L2_WRITETHROUGH	0x00000010

/*
 * Supported devices and revisions.
 */
#define MV88F6281_DEV_ID	0x6281
#define MV88F6281_REV_Z0	0
#define MV88F6281_REV_A0	2

#define MV88F6192_DEV_ID	0x6192
#define MV88F6192_REV_Z0	0
#define MV88F6192_REV_A0	2

#define MV88F6180_DEV_ID	0x6180
#define MV88F6180_REV_A0	2

/*
 * Register Map
 */
+6 −0
Original line number Diff line number Diff line
@@ -18,6 +18,12 @@

#define PCIE_BASE	((void __iomem *)PCIE_VIRT_BASE)

void __init kirkwood_pcie_id(u32 *dev, u32 *rev)
{
	*dev = orion_pcie_dev_id(PCIE_BASE);
	*rev = orion_pcie_rev(PCIE_BASE);
}

static int pcie_valid_config(int bus, int dev)
{
	/*