diff options
Diffstat (limited to 'arch/arm/mach-ux500/cpu-db8500.c')
| -rw-r--r-- | arch/arm/mach-ux500/cpu-db8500.c | 124 |
1 files changed, 111 insertions, 13 deletions
diff --git a/arch/arm/mach-ux500/cpu-db8500.c b/arch/arm/mach-ux500/cpu-db8500.c index bcdfe6b1d453..5b286e06474c 100644 --- a/arch/arm/mach-ux500/cpu-db8500.c +++ b/arch/arm/mach-ux500/cpu-db8500.c | |||
| @@ -17,18 +17,27 @@ | |||
| 17 | #include <linux/platform_device.h> | 17 | #include <linux/platform_device.h> |
| 18 | #include <linux/io.h> | 18 | #include <linux/io.h> |
| 19 | #include <linux/mfd/abx500/ab8500.h> | 19 | #include <linux/mfd/abx500/ab8500.h> |
| 20 | #include <linux/mfd/dbx500-prcmu.h> | ||
| 21 | #include <linux/of.h> | ||
| 22 | #include <linux/of_platform.h> | ||
| 23 | #include <linux/regulator/machine.h> | ||
| 24 | #include <linux/platform_data/pinctrl-nomadik.h> | ||
| 25 | #include <linux/random.h> | ||
| 20 | 26 | ||
| 21 | #include <asm/pmu.h> | 27 | #include <asm/pmu.h> |
| 22 | #include <asm/mach/map.h> | 28 | #include <asm/mach/map.h> |
| 23 | #include <plat/gpio-nomadik.h> | 29 | #include <asm/mach/arch.h> |
| 30 | #include <asm/hardware/gic.h> | ||
| 31 | |||
| 24 | #include <mach/hardware.h> | 32 | #include <mach/hardware.h> |
| 25 | #include <mach/setup.h> | 33 | #include <mach/setup.h> |
| 26 | #include <mach/devices.h> | 34 | #include <mach/devices.h> |
| 27 | #include <linux/platform_data/usb-musb-ux500.h> | ||
| 28 | #include <mach/db8500-regs.h> | 35 | #include <mach/db8500-regs.h> |
| 36 | #include <mach/irqs.h> | ||
| 29 | 37 | ||
| 30 | #include "devices-db8500.h" | 38 | #include "devices-db8500.h" |
| 31 | #include "ste-dma40-db8500.h" | 39 | #include "ste-dma40-db8500.h" |
| 40 | #include "board-mop500.h" | ||
| 32 | 41 | ||
| 33 | /* minimum static i/o mapping required to boot U8500 platforms */ | 42 | /* minimum static i/o mapping required to boot U8500 platforms */ |
| 34 | static struct map_desc u8500_uart_io_desc[] __initdata = { | 43 | static struct map_desc u8500_uart_io_desc[] __initdata = { |
| @@ -158,7 +167,7 @@ static void __init db8500_add_gpios(struct device *parent) | |||
| 158 | 167 | ||
| 159 | dbx500_add_gpios(parent, ARRAY_AND_SIZE(db8500_gpio_base), | 168 | dbx500_add_gpios(parent, ARRAY_AND_SIZE(db8500_gpio_base), |
| 160 | IRQ_DB8500_GPIO0, &pdata); | 169 | IRQ_DB8500_GPIO0, &pdata); |
| 161 | dbx500_add_pinctrl(parent, "pinctrl-db8500"); | 170 | dbx500_add_pinctrl(parent, "pinctrl-db8500", U8500_PRCMU_BASE); |
| 162 | } | 171 | } |
| 163 | 172 | ||
| 164 | static int usb_db8500_rx_dma_cfg[] = { | 173 | static int usb_db8500_rx_dma_cfg[] = { |
| @@ -187,6 +196,8 @@ static const char *db8500_read_soc_id(void) | |||
| 187 | { | 196 | { |
| 188 | void __iomem *uid = __io_address(U8500_BB_UID_BASE); | 197 | void __iomem *uid = __io_address(U8500_BB_UID_BASE); |
| 189 | 198 | ||
| 199 | /* Throw these device-specific numbers into the entropy pool */ | ||
| 200 | add_device_randomness(uid, 0x14); | ||
| 190 | return kasprintf(GFP_KERNEL, "%08x%08x%08x%08x%08x", | 201 | return kasprintf(GFP_KERNEL, "%08x%08x%08x%08x%08x", |
| 191 | readl((u32 *)uid+1), | 202 | readl((u32 *)uid+1), |
| 192 | readl((u32 *)uid+1), readl((u32 *)uid+2), | 203 | readl((u32 *)uid+1), readl((u32 *)uid+2), |
| @@ -214,9 +225,6 @@ struct device * __init u8500_init_devices(struct ab8500_platform_data *ab8500) | |||
| 214 | db8500_add_gpios(parent); | 225 | db8500_add_gpios(parent); |
| 215 | db8500_add_usb(parent, usb_db8500_rx_dma_cfg, usb_db8500_tx_dma_cfg); | 226 | db8500_add_usb(parent, usb_db8500_rx_dma_cfg, usb_db8500_tx_dma_cfg); |
| 216 | 227 | ||
| 217 | platform_device_register_data(parent, | ||
| 218 | "cpufreq-u8500", -1, NULL, 0); | ||
| 219 | |||
| 220 | for (i = 0; i < ARRAY_SIZE(platform_devs); i++) | 228 | for (i = 0; i < ARRAY_SIZE(platform_devs); i++) |
| 221 | platform_devs[i]->dev.parent = parent; | 229 | platform_devs[i]->dev.parent = parent; |
| 222 | 230 | ||
| @@ -227,18 +235,15 @@ struct device * __init u8500_init_devices(struct ab8500_platform_data *ab8500) | |||
| 227 | return parent; | 235 | return parent; |
| 228 | } | 236 | } |
| 229 | 237 | ||
| 238 | #ifdef CONFIG_MACH_UX500_DT | ||
| 239 | |||
| 230 | /* TODO: Once all pieces are DT:ed, remove completely. */ | 240 | /* TODO: Once all pieces are DT:ed, remove completely. */ |
| 231 | struct device * __init u8500_of_init_devices(void) | 241 | static struct device * __init u8500_of_init_devices(void) |
| 232 | { | 242 | { |
| 233 | struct device *parent; | 243 | struct device *parent = db8500_soc_device_init(); |
| 234 | |||
| 235 | parent = db8500_soc_device_init(); | ||
| 236 | 244 | ||
| 237 | db8500_add_usb(parent, usb_db8500_rx_dma_cfg, usb_db8500_tx_dma_cfg); | 245 | db8500_add_usb(parent, usb_db8500_rx_dma_cfg, usb_db8500_tx_dma_cfg); |
| 238 | 246 | ||
| 239 | platform_device_register_data(parent, | ||
| 240 | "cpufreq-u8500", -1, NULL, 0); | ||
| 241 | |||
| 242 | u8500_dma40_device.dev.parent = parent; | 247 | u8500_dma40_device.dev.parent = parent; |
| 243 | 248 | ||
| 244 | /* | 249 | /* |
| @@ -251,3 +256,96 @@ struct device * __init u8500_of_init_devices(void) | |||
| 251 | 256 | ||
| 252 | return parent; | 257 | return parent; |
| 253 | } | 258 | } |
| 259 | |||
| 260 | static struct of_dev_auxdata u8500_auxdata_lookup[] __initdata = { | ||
| 261 | /* Requires call-back bindings. */ | ||
| 262 | OF_DEV_AUXDATA("arm,cortex-a9-pmu", 0, "arm-pmu", &db8500_pmu_platdata), | ||
| 263 | /* Requires DMA bindings. */ | ||
| 264 | OF_DEV_AUXDATA("arm,pl011", 0x80120000, "uart0", &uart0_plat), | ||
| 265 | OF_DEV_AUXDATA("arm,pl011", 0x80121000, "uart1", &uart1_plat), | ||
| 266 | OF_DEV_AUXDATA("arm,pl011", 0x80007000, "uart2", &uart2_plat), | ||
| 267 | OF_DEV_AUXDATA("arm,pl022", 0x80002000, "ssp0", &ssp0_plat), | ||
| 268 | OF_DEV_AUXDATA("arm,pl18x", 0x80126000, "sdi0", &mop500_sdi0_data), | ||
| 269 | OF_DEV_AUXDATA("arm,pl18x", 0x80118000, "sdi1", &mop500_sdi1_data), | ||
| 270 | OF_DEV_AUXDATA("arm,pl18x", 0x80005000, "sdi2", &mop500_sdi2_data), | ||
| 271 | OF_DEV_AUXDATA("arm,pl18x", 0x80114000, "sdi4", &mop500_sdi4_data), | ||
| 272 | /* Requires clock name bindings. */ | ||
| 273 | OF_DEV_AUXDATA("st,nomadik-gpio", 0x8012e000, "gpio.0", NULL), | ||
| 274 | OF_DEV_AUXDATA("st,nomadik-gpio", 0x8012e080, "gpio.1", NULL), | ||
| 275 | OF_DEV_AUXDATA("st,nomadik-gpio", 0x8000e000, "gpio.2", NULL), | ||
| 276 | OF_DEV_AUXDATA("st,nomadik-gpio", 0x8000e080, "gpio.3", NULL), | ||
| 277 | OF_DEV_AUXDATA("st,nomadik-gpio", 0x8000e100, "gpio.4", NULL), | ||
| 278 | OF_DEV_AUXDATA("st,nomadik-gpio", 0x8000e180, "gpio.5", NULL), | ||
| 279 | OF_DEV_AUXDATA("st,nomadik-gpio", 0x8011e000, "gpio.6", NULL), | ||
| 280 | OF_DEV_AUXDATA("st,nomadik-gpio", 0x8011e080, "gpio.7", NULL), | ||
| 281 | OF_DEV_AUXDATA("st,nomadik-gpio", 0xa03fe000, "gpio.8", NULL), | ||
| 282 | OF_DEV_AUXDATA("st,nomadik-i2c", 0x80004000, "nmk-i2c.0", NULL), | ||
| 283 | OF_DEV_AUXDATA("st,nomadik-i2c", 0x80122000, "nmk-i2c.1", NULL), | ||
| 284 | OF_DEV_AUXDATA("st,nomadik-i2c", 0x80128000, "nmk-i2c.2", NULL), | ||
| 285 | OF_DEV_AUXDATA("st,nomadik-i2c", 0x80110000, "nmk-i2c.3", NULL), | ||
| 286 | OF_DEV_AUXDATA("st,nomadik-i2c", 0x8012a000, "nmk-i2c.4", NULL), | ||
| 287 | /* Requires device name bindings. */ | ||
| 288 | OF_DEV_AUXDATA("stericsson,nmk_pinctrl", U8500_PRCMU_BASE, | ||
| 289 | "pinctrl-db8500", NULL), | ||
| 290 | /* Requires clock name and DMA bindings. */ | ||
| 291 | OF_DEV_AUXDATA("stericsson,ux500-msp-i2s", 0x80123000, | ||
| 292 | "ux500-msp-i2s.0", &msp0_platform_data), | ||
| 293 | OF_DEV_AUXDATA("stericsson,ux500-msp-i2s", 0x80124000, | ||
| 294 | "ux500-msp-i2s.1", &msp1_platform_data), | ||
| 295 | OF_DEV_AUXDATA("stericsson,ux500-msp-i2s", 0x80117000, | ||
| 296 | "ux500-msp-i2s.2", &msp2_platform_data), | ||
| 297 | OF_DEV_AUXDATA("stericsson,ux500-msp-i2s", 0x80125000, | ||
| 298 | "ux500-msp-i2s.3", &msp3_platform_data), | ||
| 299 | {}, | ||
| 300 | }; | ||
| 301 | |||
| 302 | static const struct of_device_id u8500_local_bus_nodes[] = { | ||
| 303 | /* only create devices below soc node */ | ||
| 304 | { .compatible = "stericsson,db8500", }, | ||
| 305 | { .compatible = "stericsson,db8500-prcmu", }, | ||
| 306 | { .compatible = "simple-bus"}, | ||
| 307 | { }, | ||
| 308 | }; | ||
| 309 | |||
| 310 | static void __init u8500_init_machine(void) | ||
| 311 | { | ||
| 312 | struct device *parent = NULL; | ||
| 313 | |||
| 314 | /* Pinmaps must be in place before devices register */ | ||
| 315 | if (of_machine_is_compatible("st-ericsson,mop500")) | ||
| 316 | mop500_pinmaps_init(); | ||
| 317 | else if (of_machine_is_compatible("calaosystems,snowball-a9500")) | ||
| 318 | snowball_pinmaps_init(); | ||
| 319 | else if (of_machine_is_compatible("st-ericsson,hrefv60+")) | ||
| 320 | hrefv60_pinmaps_init(); | ||
| 321 | else if (of_machine_is_compatible("st-ericsson,ccu9540")) {} | ||
| 322 | /* TODO: Add pinmaps for ccu9540 board. */ | ||
| 323 | |||
| 324 | /* TODO: Export SoC, USB, cpu-freq and DMA40 */ | ||
| 325 | parent = u8500_of_init_devices(); | ||
| 326 | |||
| 327 | /* automatically probe child nodes of db8500 device */ | ||
| 328 | of_platform_populate(NULL, u8500_local_bus_nodes, u8500_auxdata_lookup, parent); | ||
| 329 | } | ||
| 330 | |||
| 331 | static const char * stericsson_dt_platform_compat[] = { | ||
| 332 | "st-ericsson,u8500", | ||
| 333 | "st-ericsson,u8540", | ||
| 334 | "st-ericsson,u9500", | ||
| 335 | "st-ericsson,u9540", | ||
| 336 | NULL, | ||
| 337 | }; | ||
| 338 | |||
| 339 | DT_MACHINE_START(U8500_DT, "ST-Ericsson Ux5x0 platform (Device Tree Support)") | ||
| 340 | .smp = smp_ops(ux500_smp_ops), | ||
| 341 | .map_io = u8500_map_io, | ||
| 342 | .init_irq = ux500_init_irq, | ||
| 343 | /* we re-use nomadik timer here */ | ||
| 344 | .timer = &ux500_timer, | ||
| 345 | .handle_irq = gic_handle_irq, | ||
| 346 | .init_machine = u8500_init_machine, | ||
| 347 | .init_late = NULL, | ||
| 348 | .dt_compat = stericsson_dt_platform_compat, | ||
| 349 | MACHINE_END | ||
| 350 | |||
| 351 | #endif | ||
