浏览代码

Merge tag 'mvebu-soc-4.4-2' of git://git.infradead.org/linux-mvebu into next/soc

mvebu soc for 4.4 (part 2)

- Use mac_pton() helper in the oropn5x board instead of duplicating it
- Add the broken-idle option allowing to boot boards with a mistake in
  the hardware design

* tag 'mvebu-soc-4.4-2' of git://git.infradead.org/linux-mvebu:
  ARM: mvebu: add broken-idle option
  ARM: orion5x: use mac_pton() helper

Signed-off-by: Olof Johansson <olof@lixom.net>
Olof Johansson 9 年之前
父节点
当前提交
a5ac4a66c6

+ 5 - 0
Documentation/devicetree/bindings/arm/coherency-fabric.txt

@@ -27,6 +27,11 @@ Required properties:
  * For "marvell,armada-380-coherency-fabric", only one pair is needed
  * For "marvell,armada-380-coherency-fabric", only one pair is needed
    for the per-CPU fabric registers.
    for the per-CPU fabric registers.
 
 
+Optional properties:
+
+- broken-idle: boolean to set when the Idle mode is not supported by the
+  hardware.
+
 Examples:
 Examples:
 
 
 coherency-fabric@d0020200 {
 coherency-fabric@d0020200 {

+ 26 - 3
arch/arm/mach-mvebu/pmsu.c

@@ -379,6 +379,16 @@ static struct notifier_block mvebu_v7_cpu_pm_notifier = {
 
 
 static struct platform_device mvebu_v7_cpuidle_device;
 static struct platform_device mvebu_v7_cpuidle_device;
 
 
+static int broken_idle(struct device_node *np)
+{
+	if (of_property_read_bool(np, "broken-idle")) {
+		pr_warn("CPU idle is currently broken: disabling\n");
+		return 1;
+	}
+
+	return 0;
+}
+
 static __init int armada_370_cpuidle_init(void)
 static __init int armada_370_cpuidle_init(void)
 {
 {
 	struct device_node *np;
 	struct device_node *np;
@@ -387,7 +397,9 @@ static __init int armada_370_cpuidle_init(void)
 	np = of_find_compatible_node(NULL, NULL, "marvell,coherency-fabric");
 	np = of_find_compatible_node(NULL, NULL, "marvell,coherency-fabric");
 	if (!np)
 	if (!np)
 		return -ENODEV;
 		return -ENODEV;
-	of_node_put(np);
+
+	if (broken_idle(np))
+		goto end;
 
 
 	/*
 	/*
 	 * On Armada 370, there is "a slow exit process from the deep
 	 * On Armada 370, there is "a slow exit process from the deep
@@ -406,6 +418,8 @@ static __init int armada_370_cpuidle_init(void)
 	mvebu_v7_cpuidle_device.dev.platform_data = armada_370_xp_cpu_suspend;
 	mvebu_v7_cpuidle_device.dev.platform_data = armada_370_xp_cpu_suspend;
 	mvebu_v7_cpuidle_device.name = "cpuidle-armada-370";
 	mvebu_v7_cpuidle_device.name = "cpuidle-armada-370";
 
 
+end:
+	of_node_put(np);
 	return 0;
 	return 0;
 }
 }
 
 
@@ -422,6 +436,10 @@ static __init int armada_38x_cpuidle_init(void)
 				     "marvell,armada-380-coherency-fabric");
 				     "marvell,armada-380-coherency-fabric");
 	if (!np)
 	if (!np)
 		return -ENODEV;
 		return -ENODEV;
+
+	if (broken_idle(np))
+		goto end;
+
 	of_node_put(np);
 	of_node_put(np);
 
 
 	np = of_find_compatible_node(NULL, NULL,
 	np = of_find_compatible_node(NULL, NULL,
@@ -430,7 +448,6 @@ static __init int armada_38x_cpuidle_init(void)
 		return -ENODEV;
 		return -ENODEV;
 	mpsoc_base = of_iomap(np, 0);
 	mpsoc_base = of_iomap(np, 0);
 	BUG_ON(!mpsoc_base);
 	BUG_ON(!mpsoc_base);
-	of_node_put(np);
 
 
 	/* Set up reset mask when powering down the cpus */
 	/* Set up reset mask when powering down the cpus */
 	reg = readl(mpsoc_base + MPCORE_RESET_CTL);
 	reg = readl(mpsoc_base + MPCORE_RESET_CTL);
@@ -450,6 +467,8 @@ static __init int armada_38x_cpuidle_init(void)
 	mvebu_v7_cpuidle_device.dev.platform_data = armada_38x_cpu_suspend;
 	mvebu_v7_cpuidle_device.dev.platform_data = armada_38x_cpu_suspend;
 	mvebu_v7_cpuidle_device.name = "cpuidle-armada-38x";
 	mvebu_v7_cpuidle_device.name = "cpuidle-armada-38x";
 
 
+end:
+	of_node_put(np);
 	return 0;
 	return 0;
 }
 }
 
 
@@ -460,12 +479,16 @@ static __init int armada_xp_cpuidle_init(void)
 	np = of_find_compatible_node(NULL, NULL, "marvell,coherency-fabric");
 	np = of_find_compatible_node(NULL, NULL, "marvell,coherency-fabric");
 	if (!np)
 	if (!np)
 		return -ENODEV;
 		return -ENODEV;
-	of_node_put(np);
+
+	if (broken_idle(np))
+		goto end;
 
 
 	mvebu_cpu_resume = armada_370_xp_cpu_resume;
 	mvebu_cpu_resume = armada_370_xp_cpu_resume;
 	mvebu_v7_cpuidle_device.dev.platform_data = armada_370_xp_cpu_suspend;
 	mvebu_v7_cpuidle_device.dev.platform_data = armada_370_xp_cpu_suspend;
 	mvebu_v7_cpuidle_device.name = "cpuidle-armada-xp";
 	mvebu_v7_cpuidle_device.name = "cpuidle-armada-xp";
 
 
+end:
+	of_node_put(np);
 	return 0;
 	return 0;
 }
 }
 
 

+ 3 - 0
arch/arm/mach-orion5x/Kconfig

@@ -45,6 +45,7 @@ config MACH_KUROBOX_PRO
 
 
 config MACH_DNS323
 config MACH_DNS323
 	bool "D-Link DNS-323"
 	bool "D-Link DNS-323"
+	select GENERIC_NET_UTILS
 	select I2C_BOARDINFO
 	select I2C_BOARDINFO
 	help
 	help
 	  Say 'Y' here if you want your kernel to support the
 	  Say 'Y' here if you want your kernel to support the
@@ -52,6 +53,7 @@ config MACH_DNS323
 
 
 config MACH_TS209
 config MACH_TS209
 	bool "QNAP TS-109/TS-209"
 	bool "QNAP TS-109/TS-209"
+	select GENERIC_NET_UTILS
 	help
 	help
 	  Say 'Y' here if you want your kernel to support the
 	  Say 'Y' here if you want your kernel to support the
 	  QNAP TS-109/TS-209 platform.
 	  QNAP TS-109/TS-209 platform.
@@ -93,6 +95,7 @@ config MACH_LINKSTATION_LS_HGL
 
 
 config MACH_TS409
 config MACH_TS409
 	bool "QNAP TS-409"
 	bool "QNAP TS-409"
+	select GENERIC_NET_UTILS
 	help
 	help
 	  Say 'Y' here if you want your kernel to support the
 	  Say 'Y' here if you want your kernel to support the
 	  QNAP TS-409 platform.
 	  QNAP TS-409 platform.

+ 3 - 50
arch/arm/mach-orion5x/dns323-setup.c

@@ -173,42 +173,10 @@ static struct mv643xx_eth_platform_data dns323_eth_data = {
 	.phy_addr = MV643XX_ETH_PHY_ADDR(8),
 	.phy_addr = MV643XX_ETH_PHY_ADDR(8),
 };
 };
 
 
-/* dns323_parse_hex_*() taken from tsx09-common.c; should a common copy of these
- * functions be kept somewhere?
- */
-static int __init dns323_parse_hex_nibble(char n)
-{
-	if (n >= '0' && n <= '9')
-		return n - '0';
-
-	if (n >= 'A' && n <= 'F')
-		return n - 'A' + 10;
-
-	if (n >= 'a' && n <= 'f')
-		return n - 'a' + 10;
-
-	return -1;
-}
-
-static int __init dns323_parse_hex_byte(const char *b)
-{
-	int hi;
-	int lo;
-
-	hi = dns323_parse_hex_nibble(b[0]);
-	lo = dns323_parse_hex_nibble(b[1]);
-
-	if (hi < 0 || lo < 0)
-		return -1;
-
-	return (hi << 4) | lo;
-}
-
 static int __init dns323_read_mac_addr(void)
 static int __init dns323_read_mac_addr(void)
 {
 {
 	u_int8_t addr[6];
 	u_int8_t addr[6];
-	int i;
-	char *mac_page;
+	void __iomem *mac_page;
 
 
 	/* MAC address is stored as a regular ol' string in /dev/mtdblock4
 	/* MAC address is stored as a regular ol' string in /dev/mtdblock4
 	 * (0x007d0000-0x00800000) starting at offset 196480 (0x2ff80).
 	 * (0x007d0000-0x00800000) starting at offset 196480 (0x2ff80).
@@ -217,23 +185,8 @@ static int __init dns323_read_mac_addr(void)
 	if (!mac_page)
 	if (!mac_page)
 		return -ENOMEM;
 		return -ENOMEM;
 
 
-	/* Sanity check the string we're looking at */
-	for (i = 0; i < 5; i++) {
-		if (*(mac_page + (i * 3) + 2) != ':') {
-			goto error_fail;
-		}
-	}
-
-	for (i = 0; i < 6; i++)	{
-		int byte;
-
-		byte = dns323_parse_hex_byte(mac_page + (i * 3));
-		if (byte < 0) {
-			goto error_fail;
-		}
-
-		addr[i] = byte;
-	}
+	if (!mac_pton((__force const char *) mac_page, addr))
+		goto error_fail;
 
 
 	iounmap(mac_page);
 	iounmap(mac_page);
 	printk("DNS-323: Found ethernet MAC address: %pM\n", addr);
 	printk("DNS-323: Found ethernet MAC address: %pM\n", addr);

+ 4 - 45
arch/arm/mach-orion5x/tsx09-common.c

@@ -53,53 +53,12 @@ struct mv643xx_eth_platform_data qnap_tsx09_eth_data = {
 	.phy_addr	= MV643XX_ETH_PHY_ADDR(8),
 	.phy_addr	= MV643XX_ETH_PHY_ADDR(8),
 };
 };
 
 
-static int __init qnap_tsx09_parse_hex_nibble(char n)
-{
-	if (n >= '0' && n <= '9')
-		return n - '0';
-
-	if (n >= 'A' && n <= 'F')
-		return n - 'A' + 10;
-
-	if (n >= 'a' && n <= 'f')
-		return n - 'a' + 10;
-
-	return -1;
-}
-
-static int __init qnap_tsx09_parse_hex_byte(const char *b)
-{
-	int hi;
-	int lo;
-
-	hi = qnap_tsx09_parse_hex_nibble(b[0]);
-	lo = qnap_tsx09_parse_hex_nibble(b[1]);
-
-	if (hi < 0 || lo < 0)
-		return -1;
-
-	return (hi << 4) | lo;
-}
-
 static int __init qnap_tsx09_check_mac_addr(const char *addr_str)
 static int __init qnap_tsx09_check_mac_addr(const char *addr_str)
 {
 {
 	u_int8_t addr[6];
 	u_int8_t addr[6];
-	int i;
 
 
-	for (i = 0; i < 6; i++) {
-		int byte;
-
-		/*
-		 * Enforce "xx:xx:xx:xx:xx:xx\n" format.
-		 */
-		if (addr_str[(i * 3) + 2] != ((i < 5) ? ':' : '\n'))
-			return -1;
-
-		byte = qnap_tsx09_parse_hex_byte(addr_str + (i * 3));
-		if (byte < 0)
-			return -1;
-		addr[i] = byte;
-	}
+	if (!mac_pton(addr_str, addr))
+		return -1;
 
 
 	printk(KERN_INFO "tsx09: found ethernet mac address %pM\n", addr);
 	printk(KERN_INFO "tsx09: found ethernet mac address %pM\n", addr);
 
 
@@ -118,12 +77,12 @@ void __init qnap_tsx09_find_mac_addr(u32 mem_base, u32 size)
 	unsigned long addr;
 	unsigned long addr;
 
 
 	for (addr = mem_base; addr < (mem_base + size); addr += 1024) {
 	for (addr = mem_base; addr < (mem_base + size); addr += 1024) {
-		char *nor_page;
+		void __iomem *nor_page;
 		int ret = 0;
 		int ret = 0;
 
 
 		nor_page = ioremap(addr, 1024);
 		nor_page = ioremap(addr, 1024);
 		if (nor_page != NULL) {
 		if (nor_page != NULL) {
-			ret = qnap_tsx09_check_mac_addr(nor_page);
+			ret = qnap_tsx09_check_mac_addr((__force const char *)nor_page);
 			iounmap(nor_page);
 			iounmap(nor_page);
 		}
 		}