diff options
| -rw-r--r-- | arch/arm/boot/dts/integratorap.dts | 5 | ||||
| -rw-r--r-- | arch/arm/mach-integrator/Kconfig | 1 | ||||
| -rw-r--r-- | arch/arm/mach-integrator/common.h | 1 | ||||
| -rw-r--r-- | arch/arm/mach-integrator/core.c | 91 | ||||
| -rw-r--r-- | arch/arm/mach-integrator/integrator_ap.c | 57 |
5 files changed, 153 insertions, 2 deletions
diff --git a/arch/arm/boot/dts/integratorap.dts b/arch/arm/boot/dts/integratorap.dts index 61767757b50a..c9c3fa344647 100644 --- a/arch/arm/boot/dts/integratorap.dts +++ b/arch/arm/boot/dts/integratorap.dts | |||
| @@ -18,6 +18,11 @@ | |||
| 18 | bootargs = "root=/dev/ram0 console=ttyAM0,38400n8 earlyprintk"; | 18 | bootargs = "root=/dev/ram0 console=ttyAM0,38400n8 earlyprintk"; |
| 19 | }; | 19 | }; |
| 20 | 20 | ||
| 21 | syscon { | ||
| 22 | /* AP system controller registers */ | ||
| 23 | reg = <0x11000000 0x100>; | ||
| 24 | }; | ||
| 25 | |||
| 21 | timer0: timer@13000000 { | 26 | timer0: timer@13000000 { |
| 22 | compatible = "arm,integrator-timer"; | 27 | compatible = "arm,integrator-timer"; |
| 23 | }; | 28 | }; |
diff --git a/arch/arm/mach-integrator/Kconfig b/arch/arm/mach-integrator/Kconfig index 350e26636a06..3961942c9e11 100644 --- a/arch/arm/mach-integrator/Kconfig +++ b/arch/arm/mach-integrator/Kconfig | |||
| @@ -8,6 +8,7 @@ config ARCH_INTEGRATOR_AP | |||
| 8 | select MIGHT_HAVE_PCI | 8 | select MIGHT_HAVE_PCI |
| 9 | select SERIAL_AMBA_PL010 | 9 | select SERIAL_AMBA_PL010 |
| 10 | select SERIAL_AMBA_PL010_CONSOLE | 10 | select SERIAL_AMBA_PL010_CONSOLE |
| 11 | select SOC_BUS | ||
| 11 | help | 12 | help |
| 12 | Include support for the ARM(R) Integrator/AP and | 13 | Include support for the ARM(R) Integrator/AP and |
| 13 | Integrator/PP2 platforms. | 14 | Integrator/PP2 platforms. |
diff --git a/arch/arm/mach-integrator/common.h b/arch/arm/mach-integrator/common.h index c3ff21b5ea24..fc9f47d289f4 100644 --- a/arch/arm/mach-integrator/common.h +++ b/arch/arm/mach-integrator/common.h | |||
| @@ -4,3 +4,4 @@ void integrator_init_early(void); | |||
| 4 | int integrator_init(bool is_cp); | 4 | int integrator_init(bool is_cp); |
| 5 | void integrator_reserve(void); | 5 | void integrator_reserve(void); |
| 6 | void integrator_restart(char, const char *); | 6 | void integrator_restart(char, const char *); |
| 7 | void integrator_init_sysfs(struct device *parent, u32 id); | ||
diff --git a/arch/arm/mach-integrator/core.c b/arch/arm/mach-integrator/core.c index ea22a17246d7..161fbf8596bd 100644 --- a/arch/arm/mach-integrator/core.c +++ b/arch/arm/mach-integrator/core.c | |||
| @@ -22,6 +22,7 @@ | |||
| 22 | #include <linux/amba/bus.h> | 22 | #include <linux/amba/bus.h> |
| 23 | #include <linux/amba/serial.h> | 23 | #include <linux/amba/serial.h> |
| 24 | #include <linux/io.h> | 24 | #include <linux/io.h> |
| 25 | #include <linux/stat.h> | ||
| 25 | 26 | ||
| 26 | #include <mach/hardware.h> | 27 | #include <mach/hardware.h> |
| 27 | #include <mach/platform.h> | 28 | #include <mach/platform.h> |
| @@ -169,3 +170,93 @@ void integrator_restart(char mode, const char *cmd) | |||
| 169 | { | 170 | { |
| 170 | cm_control(CM_CTRL_RESET, CM_CTRL_RESET); | 171 | cm_control(CM_CTRL_RESET, CM_CTRL_RESET); |
| 171 | } | 172 | } |
| 173 | |||
| 174 | static u32 integrator_id; | ||
| 175 | |||
| 176 | static ssize_t intcp_get_manf(struct device *dev, | ||
| 177 | struct device_attribute *attr, | ||
| 178 | char *buf) | ||
| 179 | { | ||
| 180 | return sprintf(buf, "%02x\n", integrator_id >> 24); | ||
| 181 | } | ||
| 182 | |||
| 183 | static struct device_attribute intcp_manf_attr = | ||
| 184 | __ATTR(manufacturer, S_IRUGO, intcp_get_manf, NULL); | ||
| 185 | |||
| 186 | static ssize_t intcp_get_arch(struct device *dev, | ||
| 187 | struct device_attribute *attr, | ||
| 188 | char *buf) | ||
| 189 | { | ||
| 190 | const char *arch; | ||
| 191 | |||
| 192 | switch ((integrator_id >> 16) & 0xff) { | ||
| 193 | case 0x00: | ||
| 194 | arch = "ASB little-endian"; | ||
| 195 | break; | ||
| 196 | case 0x01: | ||
| 197 | arch = "AHB little-endian"; | ||
| 198 | break; | ||
| 199 | case 0x03: | ||
| 200 | arch = "AHB-Lite system bus, bi-endian"; | ||
| 201 | break; | ||
| 202 | case 0x04: | ||
| 203 | arch = "AHB"; | ||
| 204 | break; | ||
| 205 | default: | ||
| 206 | arch = "Unknown"; | ||
| 207 | break; | ||
| 208 | } | ||
| 209 | |||
| 210 | return sprintf(buf, "%s\n", arch); | ||
| 211 | } | ||
| 212 | |||
| 213 | static struct device_attribute intcp_arch_attr = | ||
| 214 | __ATTR(architecture, S_IRUGO, intcp_get_arch, NULL); | ||
| 215 | |||
| 216 | static ssize_t intcp_get_fpga(struct device *dev, | ||
| 217 | struct device_attribute *attr, | ||
| 218 | char *buf) | ||
| 219 | { | ||
| 220 | const char *fpga; | ||
| 221 | |||
| 222 | switch ((integrator_id >> 12) & 0xf) { | ||
| 223 | case 0x01: | ||
| 224 | fpga = "XC4062"; | ||
| 225 | break; | ||
| 226 | case 0x02: | ||
| 227 | fpga = "XC4085"; | ||
| 228 | break; | ||
| 229 | case 0x04: | ||
| 230 | fpga = "EPM7256AE (Altera PLD)"; | ||
| 231 | break; | ||
| 232 | default: | ||
| 233 | fpga = "Unknown"; | ||
| 234 | break; | ||
| 235 | } | ||
| 236 | |||
| 237 | return sprintf(buf, "%s\n", fpga); | ||
| 238 | } | ||
| 239 | |||
| 240 | static struct device_attribute intcp_fpga_attr = | ||
| 241 | __ATTR(fpga, S_IRUGO, intcp_get_fpga, NULL); | ||
| 242 | |||
| 243 | static ssize_t intcp_get_build(struct device *dev, | ||
| 244 | struct device_attribute *attr, | ||
| 245 | char *buf) | ||
| 246 | { | ||
| 247 | return sprintf(buf, "%02x\n", (integrator_id >> 4) & 0xFF); | ||
| 248 | } | ||
| 249 | |||
| 250 | static struct device_attribute intcp_build_attr = | ||
| 251 | __ATTR(build, S_IRUGO, intcp_get_build, NULL); | ||
| 252 | |||
| 253 | |||
| 254 | |||
| 255 | void integrator_init_sysfs(struct device *parent, u32 id) | ||
| 256 | { | ||
| 257 | integrator_id = id; | ||
| 258 | device_create_file(parent, &intcp_manf_attr); | ||
| 259 | device_create_file(parent, &intcp_arch_attr); | ||
| 260 | device_create_file(parent, &intcp_fpga_attr); | ||
| 261 | device_create_file(parent, &intcp_build_attr); | ||
| 262 | } | ||
diff --git a/arch/arm/mach-integrator/integrator_ap.c b/arch/arm/mach-integrator/integrator_ap.c index e6617c134faf..7d84080f9aa3 100644 --- a/arch/arm/mach-integrator/integrator_ap.c +++ b/arch/arm/mach-integrator/integrator_ap.c | |||
| @@ -37,6 +37,8 @@ | |||
| 37 | #include <linux/of_irq.h> | 37 | #include <linux/of_irq.h> |
| 38 | #include <linux/of_address.h> | 38 | #include <linux/of_address.h> |
| 39 | #include <linux/of_platform.h> | 39 | #include <linux/of_platform.h> |
| 40 | #include <linux/stat.h> | ||
| 41 | #include <linux/sys_soc.h> | ||
| 40 | #include <video/vga.h> | 42 | #include <video/vga.h> |
| 41 | 43 | ||
| 42 | #include <mach/hardware.h> | 44 | #include <mach/hardware.h> |
| @@ -462,13 +464,64 @@ static struct of_dev_auxdata ap_auxdata_lookup[] __initdata = { | |||
| 462 | { /* sentinel */ }, | 464 | { /* sentinel */ }, |
| 463 | }; | 465 | }; |
| 464 | 466 | ||
| 467 | /* Base address to the AP system controller */ | ||
| 468 | static void __iomem *ap_syscon_base; | ||
| 469 | |||
| 465 | static void __init ap_init_of(void) | 470 | static void __init ap_init_of(void) |
| 466 | { | 471 | { |
| 467 | unsigned long sc_dec; | 472 | unsigned long sc_dec; |
| 473 | struct device_node *root; | ||
| 474 | struct device_node *syscon; | ||
| 475 | struct device *parent; | ||
| 476 | struct soc_device *soc_dev; | ||
| 477 | struct soc_device_attribute *soc_dev_attr; | ||
| 478 | u32 ap_sc_id; | ||
| 479 | int err; | ||
| 468 | int i; | 480 | int i; |
| 469 | 481 | ||
| 470 | of_platform_populate(NULL, of_default_bus_match_table, | 482 | /* Here we create an SoC device for the root node */ |
| 471 | ap_auxdata_lookup, NULL); | 483 | root = of_find_node_by_path("/"); |
| 484 | if (!root) | ||
| 485 | return; | ||
| 486 | syscon = of_find_node_by_path("/syscon"); | ||
| 487 | if (!syscon) | ||
| 488 | return; | ||
| 489 | |||
| 490 | ap_syscon_base = of_iomap(syscon, 0); | ||
| 491 | if (!ap_syscon_base) | ||
| 492 | return; | ||
| 493 | |||
| 494 | ap_sc_id = readl(ap_syscon_base); | ||
| 495 | |||
| 496 | soc_dev_attr = kzalloc(sizeof(*soc_dev_attr), GFP_KERNEL); | ||
| 497 | if (!soc_dev_attr) | ||
| 498 | return; | ||
| 499 | |||
| 500 | err = of_property_read_string(root, "compatible", | ||
| 501 | &soc_dev_attr->soc_id); | ||
| 502 | if (err) | ||
| 503 | return; | ||
| 504 | err = of_property_read_string(root, "model", &soc_dev_attr->machine); | ||
| 505 | if (err) | ||
| 506 | return; | ||
| 507 | soc_dev_attr->family = "Integrator"; | ||
| 508 | soc_dev_attr->revision = kasprintf(GFP_KERNEL, "%c", | ||
| 509 | 'A' + (ap_sc_id & 0x0f)); | ||
| 510 | |||
| 511 | soc_dev = soc_device_register(soc_dev_attr); | ||
| 512 | if (IS_ERR_OR_NULL(soc_dev)) { | ||
| 513 | kfree(soc_dev_attr->revision); | ||
| 514 | kfree(soc_dev_attr); | ||
| 515 | return; | ||
| 516 | } | ||
| 517 | |||
| 518 | parent = soc_device_to_device(soc_dev); | ||
| 519 | |||
| 520 | if (!IS_ERR_OR_NULL(parent)) | ||
| 521 | integrator_init_sysfs(parent, ap_sc_id); | ||
| 522 | |||
| 523 | of_platform_populate(root, of_default_bus_match_table, | ||
| 524 | ap_auxdata_lookup, parent); | ||
| 472 | 525 | ||
| 473 | sc_dec = readl(VA_SC_BASE + INTEGRATOR_SC_DEC_OFFSET); | 526 | sc_dec = readl(VA_SC_BASE + INTEGRATOR_SC_DEC_OFFSET); |
| 474 | for (i = 0; i < 4; i++) { | 527 | for (i = 0; i < 4; i++) { |
