Commit a5ac4a66 authored by Olof Johansson's avatar Olof Johansson

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: default avatarOlof Johansson <olof@lixom.net>
parents c2c2b3d3 9d2ea95a
...@@ -27,6 +27,11 @@ Required properties: ...@@ -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 {
......
...@@ -379,6 +379,16 @@ static struct notifier_block mvebu_v7_cpu_pm_notifier = { ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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;
} }
......
...@@ -45,6 +45,7 @@ config MACH_KUROBOX_PRO ...@@ -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 ...@@ -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 ...@@ -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.
......
...@@ -173,42 +173,10 @@ static struct mv643xx_eth_platform_data dns323_eth_data = { ...@@ -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; void __iomem *mac_page;
char *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) ...@@ -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 */ if (!mac_pton((__force const char *) mac_page, addr))
for (i = 0; i < 5; i++) { goto error_fail;
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;
}
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);
......
...@@ -53,53 +53,12 @@ struct mv643xx_eth_platform_data qnap_tsx09_eth_data = { ...@@ -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++) { if (!mac_pton(addr_str, addr))
int byte; return -1;
/*
* 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;
}
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) ...@@ -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);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment