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 -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iEYEABECAAYFAlYqU/AACgkQCwYYjhRyO9VP1gCfcJsUQ9UlgCypLYuK7FqQShf6 vnEAn3QT7pXLmwYNlRFI6EF8y6l5bgH9 =HKUh -----END PGP SIGNATURE----- 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>
This commit is contained in:
commit
a5ac4a66c6
5 changed files with 41 additions and 98 deletions
|
@ -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 = {
|
||||||
|
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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)
|
||||||
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++) {
|
|
||||||
if (*(mac_page + (i * 3) + 2) != ':') {
|
|
||||||
goto error_fail;
|
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,54 +53,13 @@ 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;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Enforce "xx:xx:xx:xx:xx:xx\n" format.
|
|
||||||
*/
|
|
||||||
if (addr_str[(i * 3) + 2] != ((i < 5) ? ':' : '\n'))
|
|
||||||
return -1;
|
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);
|
||||||
|
|
||||||
memcpy(qnap_tsx09_eth_data.mac_addr, addr, 6);
|
memcpy(qnap_tsx09_eth_data.mac_addr, addr, 6);
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue