diff options
author | Herbert Xu <herbert@gondor.apana.org.au> | 2012-05-15 03:21:26 -0400 |
---|---|---|
committer | Herbert Xu <herbert@gondor.apana.org.au> | 2012-05-15 03:21:26 -0400 |
commit | b29e2679d0da91c60d3ac190d9c3bd65ac2f68c5 (patch) | |
tree | 518ec8f4bfd316e91bcc30f434edb78529557eba /arch/arm/mach-ux500 | |
parent | 8a63b1994c500d4825ee73dc71502deffe5b135b (diff) | |
parent | 4bb2d1009f671815870e8f78e826e4f9071392a7 (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux
Merge mainline to add prerequisite for ARM ux500 crypto support.
Diffstat (limited to 'arch/arm/mach-ux500')
31 files changed, 591 insertions, 431 deletions
diff --git a/arch/arm/mach-ux500/Kconfig b/arch/arm/mach-ux500/Kconfig index c59e8b892d6b..8904d18de01a 100644 --- a/arch/arm/mach-ux500/Kconfig +++ b/arch/arm/mach-ux500/Kconfig | |||
@@ -8,47 +8,56 @@ config UX500_SOC_COMMON | |||
8 | select PL310_ERRATA_753970 | 8 | select PL310_ERRATA_753970 |
9 | select ARM_ERRATA_754322 | 9 | select ARM_ERRATA_754322 |
10 | select ARM_ERRATA_764369 | 10 | select ARM_ERRATA_764369 |
11 | 11 | select CACHE_L2X0 | |
12 | menu "Ux500 SoC" | ||
13 | 12 | ||
14 | config UX500_SOC_DB5500 | 13 | config UX500_SOC_DB5500 |
15 | bool "DB5500" | 14 | bool |
16 | select MFD_DB5500_PRCMU | 15 | select MFD_DB5500_PRCMU |
17 | 16 | ||
18 | config UX500_SOC_DB8500 | 17 | config UX500_SOC_DB8500 |
19 | bool "DB8500" | 18 | bool |
20 | select MFD_DB8500_PRCMU | 19 | select MFD_DB8500_PRCMU |
21 | select REGULATOR_DB8500_PRCMU | 20 | select REGULATOR_DB8500_PRCMU |
22 | 21 | select CPU_FREQ_TABLE if CPU_FREQ | |
23 | endmenu | ||
24 | 22 | ||
25 | menu "Ux500 target platform (boards)" | 23 | menu "Ux500 target platform (boards)" |
26 | 24 | ||
27 | config MACH_U8500 | 25 | config MACH_MOP500 |
28 | bool "U8500 Development platform" | 26 | bool "U8500 Development platform, MOP500 versions" |
29 | depends on UX500_SOC_DB8500 | 27 | select UX500_SOC_DB8500 |
30 | select TPS6105X | 28 | select I2C |
29 | select I2C_NOMADIK | ||
30 | select SOC_BUS | ||
31 | help | 31 | help |
32 | Include support for the mop500 development platform. | 32 | Include support for the MOP500 development platform. |
33 | 33 | ||
34 | config MACH_HREFV60 | 34 | config MACH_HREFV60 |
35 | bool "U85000 Development platform, HREFv60 version" | 35 | bool "U8500 Development platform, HREFv60 version" |
36 | depends on UX500_SOC_DB8500 | 36 | select MACH_MOP500 |
37 | help | 37 | help |
38 | Include support for the HREFv60 new development platform. | 38 | Include support for the HREFv60 new development platform. |
39 | Includes HREFv70, v71 etc. | ||
39 | 40 | ||
40 | config MACH_SNOWBALL | 41 | config MACH_SNOWBALL |
41 | bool "U8500 Snowball platform" | 42 | bool "U8500 Snowball platform" |
42 | depends on UX500_SOC_DB8500 | 43 | select MACH_MOP500 |
43 | select MACH_U8500 | ||
44 | help | 44 | help |
45 | Include support for the snowball development platform. | 45 | Include support for the snowball development platform. |
46 | 46 | ||
47 | config MACH_U5500 | 47 | config MACH_U5500 |
48 | bool "U5500 Development platform" | 48 | bool "U5500 Development platform" |
49 | depends on UX500_SOC_DB5500 | 49 | select UX500_SOC_DB5500 |
50 | help | 50 | help |
51 | Include support for the U5500 development platform. | 51 | Include support for the U5500 development platform. |
52 | |||
53 | config UX500_AUTO_PLATFORM | ||
54 | def_bool y | ||
55 | depends on !MACH_U5500 | ||
56 | select MACH_MOP500 | ||
57 | help | ||
58 | At least one platform needs to be selected in order to build | ||
59 | a working kernel. If everything else is disabled, this | ||
60 | automatically enables MACH_MOP500. | ||
52 | endmenu | 61 | endmenu |
53 | 62 | ||
54 | config UX500_DEBUG_UART | 63 | config UX500_DEBUG_UART |
diff --git a/arch/arm/mach-ux500/Makefile b/arch/arm/mach-ux500/Makefile index 6bd2f451c185..465b9ec9510a 100644 --- a/arch/arm/mach-ux500/Makefile +++ b/arch/arm/mach-ux500/Makefile | |||
@@ -7,7 +7,7 @@ obj-y := clock.o cpu.o devices.o devices-common.o \ | |||
7 | obj-$(CONFIG_CACHE_L2X0) += cache-l2x0.o | 7 | obj-$(CONFIG_CACHE_L2X0) += cache-l2x0.o |
8 | obj-$(CONFIG_UX500_SOC_DB5500) += cpu-db5500.o dma-db5500.o | 8 | obj-$(CONFIG_UX500_SOC_DB5500) += cpu-db5500.o dma-db5500.o |
9 | obj-$(CONFIG_UX500_SOC_DB8500) += cpu-db8500.o devices-db8500.o | 9 | obj-$(CONFIG_UX500_SOC_DB8500) += cpu-db8500.o devices-db8500.o |
10 | obj-$(CONFIG_MACH_U8500) += board-mop500.o board-mop500-sdi.o \ | 10 | obj-$(CONFIG_MACH_MOP500) += board-mop500.o board-mop500-sdi.o \ |
11 | board-mop500-regulators.o \ | 11 | board-mop500-regulators.o \ |
12 | board-mop500-uib.o board-mop500-stuib.o \ | 12 | board-mop500-uib.o board-mop500-stuib.o \ |
13 | board-mop500-u8500uib.o \ | 13 | board-mop500-u8500uib.o \ |
@@ -15,7 +15,6 @@ obj-$(CONFIG_MACH_U8500) += board-mop500.o board-mop500-sdi.o \ | |||
15 | obj-$(CONFIG_MACH_U5500) += board-u5500.o board-u5500-sdi.o | 15 | obj-$(CONFIG_MACH_U5500) += board-u5500.o board-u5500-sdi.o |
16 | obj-$(CONFIG_SMP) += platsmp.o headsmp.o | 16 | obj-$(CONFIG_SMP) += platsmp.o headsmp.o |
17 | obj-$(CONFIG_HOTPLUG_CPU) += hotplug.o | 17 | obj-$(CONFIG_HOTPLUG_CPU) += hotplug.o |
18 | obj-$(CONFIG_LOCAL_TIMERS) += localtimer.o | ||
19 | obj-$(CONFIG_U5500_MODEM_IRQ) += modem-irq-db5500.o | 18 | obj-$(CONFIG_U5500_MODEM_IRQ) += modem-irq-db5500.o |
20 | obj-$(CONFIG_U5500_MBOX) += mbox-db5500.o | 19 | obj-$(CONFIG_U5500_MBOX) += mbox-db5500.o |
21 | 20 | ||
diff --git a/arch/arm/mach-ux500/board-mop500-pins.c b/arch/arm/mach-ux500/board-mop500-pins.c index 74bfcff2bdf3..f5413dca532c 100644 --- a/arch/arm/mach-ux500/board-mop500-pins.c +++ b/arch/arm/mach-ux500/board-mop500-pins.c | |||
@@ -6,6 +6,7 @@ | |||
6 | 6 | ||
7 | #include <linux/kernel.h> | 7 | #include <linux/kernel.h> |
8 | #include <linux/init.h> | 8 | #include <linux/init.h> |
9 | #include <linux/bug.h> | ||
9 | 10 | ||
10 | #include <asm/mach-types.h> | 11 | #include <asm/mach-types.h> |
11 | #include <plat/pincfg.h> | 12 | #include <plat/pincfg.h> |
diff --git a/arch/arm/mach-ux500/board-mop500-regulators.c b/arch/arm/mach-ux500/board-mop500-regulators.c index 2735d03996cf..52426a425787 100644 --- a/arch/arm/mach-ux500/board-mop500-regulators.c +++ b/arch/arm/mach-ux500/board-mop500-regulators.c | |||
@@ -74,6 +74,26 @@ static struct regulator_consumer_supply ab8500_vtvout_consumers[] = { | |||
74 | REGULATOR_SUPPLY("vddadc", "ab8500-gpadc.0"), | 74 | REGULATOR_SUPPLY("vddadc", "ab8500-gpadc.0"), |
75 | }; | 75 | }; |
76 | 76 | ||
77 | static struct regulator_consumer_supply ab8500_vaud_consumers[] = { | ||
78 | /* AB8500 audio-codec main supply */ | ||
79 | REGULATOR_SUPPLY("vaud", "ab8500-codec.0"), | ||
80 | }; | ||
81 | |||
82 | static struct regulator_consumer_supply ab8500_vamic1_consumers[] = { | ||
83 | /* AB8500 audio-codec Mic1 supply */ | ||
84 | REGULATOR_SUPPLY("vamic1", "ab8500-codec.0"), | ||
85 | }; | ||
86 | |||
87 | static struct regulator_consumer_supply ab8500_vamic2_consumers[] = { | ||
88 | /* AB8500 audio-codec Mic2 supply */ | ||
89 | REGULATOR_SUPPLY("vamic2", "ab8500-codec.0"), | ||
90 | }; | ||
91 | |||
92 | static struct regulator_consumer_supply ab8500_vdmic_consumers[] = { | ||
93 | /* AB8500 audio-codec DMic supply */ | ||
94 | REGULATOR_SUPPLY("vdmic", "ab8500-codec.0"), | ||
95 | }; | ||
96 | |||
77 | static struct regulator_consumer_supply ab8500_vintcore_consumers[] = { | 97 | static struct regulator_consumer_supply ab8500_vintcore_consumers[] = { |
78 | /* SoC core supply, no device */ | 98 | /* SoC core supply, no device */ |
79 | REGULATOR_SUPPLY("v-intcore", NULL), | 99 | REGULATOR_SUPPLY("v-intcore", NULL), |
@@ -323,6 +343,8 @@ struct regulator_init_data ab8500_regulators[AB8500_NUM_REGULATORS] = { | |||
323 | .name = "V-AUD", | 343 | .name = "V-AUD", |
324 | .valid_ops_mask = REGULATOR_CHANGE_STATUS, | 344 | .valid_ops_mask = REGULATOR_CHANGE_STATUS, |
325 | }, | 345 | }, |
346 | .num_consumer_supplies = ARRAY_SIZE(ab8500_vaud_consumers), | ||
347 | .consumer_supplies = ab8500_vaud_consumers, | ||
326 | }, | 348 | }, |
327 | /* supply for v-anamic1 VAMic1-LDO */ | 349 | /* supply for v-anamic1 VAMic1-LDO */ |
328 | [AB8500_LDO_ANAMIC1] = { | 350 | [AB8500_LDO_ANAMIC1] = { |
@@ -330,6 +352,8 @@ struct regulator_init_data ab8500_regulators[AB8500_NUM_REGULATORS] = { | |||
330 | .name = "V-AMIC1", | 352 | .name = "V-AMIC1", |
331 | .valid_ops_mask = REGULATOR_CHANGE_STATUS, | 353 | .valid_ops_mask = REGULATOR_CHANGE_STATUS, |
332 | }, | 354 | }, |
355 | .num_consumer_supplies = ARRAY_SIZE(ab8500_vamic1_consumers), | ||
356 | .consumer_supplies = ab8500_vamic1_consumers, | ||
333 | }, | 357 | }, |
334 | /* supply for v-amic2, VAMIC2 LDO, reuse constants for AMIC1 */ | 358 | /* supply for v-amic2, VAMIC2 LDO, reuse constants for AMIC1 */ |
335 | [AB8500_LDO_ANAMIC2] = { | 359 | [AB8500_LDO_ANAMIC2] = { |
@@ -337,6 +361,8 @@ struct regulator_init_data ab8500_regulators[AB8500_NUM_REGULATORS] = { | |||
337 | .name = "V-AMIC2", | 361 | .name = "V-AMIC2", |
338 | .valid_ops_mask = REGULATOR_CHANGE_STATUS, | 362 | .valid_ops_mask = REGULATOR_CHANGE_STATUS, |
339 | }, | 363 | }, |
364 | .num_consumer_supplies = ARRAY_SIZE(ab8500_vamic2_consumers), | ||
365 | .consumer_supplies = ab8500_vamic2_consumers, | ||
340 | }, | 366 | }, |
341 | /* supply for v-dmic, VDMIC LDO */ | 367 | /* supply for v-dmic, VDMIC LDO */ |
342 | [AB8500_LDO_DMIC] = { | 368 | [AB8500_LDO_DMIC] = { |
@@ -344,6 +370,8 @@ struct regulator_init_data ab8500_regulators[AB8500_NUM_REGULATORS] = { | |||
344 | .name = "V-DMIC", | 370 | .name = "V-DMIC", |
345 | .valid_ops_mask = REGULATOR_CHANGE_STATUS, | 371 | .valid_ops_mask = REGULATOR_CHANGE_STATUS, |
346 | }, | 372 | }, |
373 | .num_consumer_supplies = ARRAY_SIZE(ab8500_vdmic_consumers), | ||
374 | .consumer_supplies = ab8500_vdmic_consumers, | ||
347 | }, | 375 | }, |
348 | /* supply for v-intcore12, VINTCORE12 LDO */ | 376 | /* supply for v-intcore12, VINTCORE12 LDO */ |
349 | [AB8500_LDO_INTCORE] = { | 377 | [AB8500_LDO_INTCORE] = { |
diff --git a/arch/arm/mach-ux500/board-mop500-sdi.c b/arch/arm/mach-ux500/board-mop500-sdi.c index 5dde4d4ebe88..920251cf834c 100644 --- a/arch/arm/mach-ux500/board-mop500-sdi.c +++ b/arch/arm/mach-ux500/board-mop500-sdi.c | |||
@@ -31,21 +31,13 @@ | |||
31 | * SDI 0 (MicroSD slot) | 31 | * SDI 0 (MicroSD slot) |
32 | */ | 32 | */ |
33 | 33 | ||
34 | /* MMCIPOWER bits */ | ||
35 | #define MCI_DATA2DIREN (1 << 2) | ||
36 | #define MCI_CMDDIREN (1 << 3) | ||
37 | #define MCI_DATA0DIREN (1 << 4) | ||
38 | #define MCI_DATA31DIREN (1 << 5) | ||
39 | #define MCI_FBCLKEN (1 << 7) | ||
40 | |||
41 | /* GPIO pins used by the sdi0 level shifter */ | 34 | /* GPIO pins used by the sdi0 level shifter */ |
42 | static int sdi0_en = -1; | 35 | static int sdi0_en = -1; |
43 | static int sdi0_vsel = -1; | 36 | static int sdi0_vsel = -1; |
44 | 37 | ||
45 | static u32 mop500_sdi0_vdd_handler(struct device *dev, unsigned int vdd, | 38 | static int mop500_sdi0_ios_handler(struct device *dev, struct mmc_ios *ios) |
46 | unsigned char power_mode) | ||
47 | { | 39 | { |
48 | switch (power_mode) { | 40 | switch (ios->power_mode) { |
49 | case MMC_POWER_UP: | 41 | case MMC_POWER_UP: |
50 | case MMC_POWER_ON: | 42 | case MMC_POWER_ON: |
51 | /* | 43 | /* |
@@ -65,8 +57,7 @@ static u32 mop500_sdi0_vdd_handler(struct device *dev, unsigned int vdd, | |||
65 | break; | 57 | break; |
66 | } | 58 | } |
67 | 59 | ||
68 | return MCI_FBCLKEN | MCI_CMDDIREN | MCI_DATA0DIREN | | 60 | return 0; |
69 | MCI_DATA2DIREN | MCI_DATA31DIREN; | ||
70 | } | 61 | } |
71 | 62 | ||
72 | #ifdef CONFIG_STE_DMA40 | 63 | #ifdef CONFIG_STE_DMA40 |
@@ -90,13 +81,17 @@ static struct stedma40_chan_cfg mop500_sdi0_dma_cfg_tx = { | |||
90 | #endif | 81 | #endif |
91 | 82 | ||
92 | static struct mmci_platform_data mop500_sdi0_data = { | 83 | static struct mmci_platform_data mop500_sdi0_data = { |
93 | .vdd_handler = mop500_sdi0_vdd_handler, | 84 | .ios_handler = mop500_sdi0_ios_handler, |
94 | .ocr_mask = MMC_VDD_29_30, | 85 | .ocr_mask = MMC_VDD_29_30, |
95 | .f_max = 50000000, | 86 | .f_max = 50000000, |
96 | .capabilities = MMC_CAP_4_BIT_DATA | | 87 | .capabilities = MMC_CAP_4_BIT_DATA | |
97 | MMC_CAP_SD_HIGHSPEED | | 88 | MMC_CAP_SD_HIGHSPEED | |
98 | MMC_CAP_MMC_HIGHSPEED, | 89 | MMC_CAP_MMC_HIGHSPEED, |
99 | .gpio_wp = -1, | 90 | .gpio_wp = -1, |
91 | .sigdir = MCI_ST_FBCLKEN | | ||
92 | MCI_ST_CMDDIREN | | ||
93 | MCI_ST_DATA0DIREN | | ||
94 | MCI_ST_DATA2DIREN, | ||
100 | #ifdef CONFIG_STE_DMA40 | 95 | #ifdef CONFIG_STE_DMA40 |
101 | .dma_filter = stedma40_filter, | 96 | .dma_filter = stedma40_filter, |
102 | .dma_rx_param = &mop500_sdi0_dma_cfg_rx, | 97 | .dma_rx_param = &mop500_sdi0_dma_cfg_rx, |
@@ -104,7 +99,7 @@ static struct mmci_platform_data mop500_sdi0_data = { | |||
104 | #endif | 99 | #endif |
105 | }; | 100 | }; |
106 | 101 | ||
107 | static void sdi0_configure(void) | 102 | static void sdi0_configure(struct device *parent) |
108 | { | 103 | { |
109 | int ret; | 104 | int ret; |
110 | 105 | ||
@@ -123,15 +118,15 @@ static void sdi0_configure(void) | |||
123 | gpio_direction_output(sdi0_en, 1); | 118 | gpio_direction_output(sdi0_en, 1); |
124 | 119 | ||
125 | /* Add the device, force v2 to subrevision 1 */ | 120 | /* Add the device, force v2 to subrevision 1 */ |
126 | db8500_add_sdi0(&mop500_sdi0_data, U8500_SDI_V2_PERIPHID); | 121 | db8500_add_sdi0(parent, &mop500_sdi0_data, U8500_SDI_V2_PERIPHID); |
127 | } | 122 | } |
128 | 123 | ||
129 | void mop500_sdi_tc35892_init(void) | 124 | void mop500_sdi_tc35892_init(struct device *parent) |
130 | { | 125 | { |
131 | mop500_sdi0_data.gpio_cd = GPIO_SDMMC_CD; | 126 | mop500_sdi0_data.gpio_cd = GPIO_SDMMC_CD; |
132 | sdi0_en = GPIO_SDMMC_EN; | 127 | sdi0_en = GPIO_SDMMC_EN; |
133 | sdi0_vsel = GPIO_SDMMC_1V8_3V_SEL; | 128 | sdi0_vsel = GPIO_SDMMC_1V8_3V_SEL; |
134 | sdi0_configure(); | 129 | sdi0_configure(parent); |
135 | } | 130 | } |
136 | 131 | ||
137 | /* | 132 | /* |
@@ -246,12 +241,13 @@ static struct mmci_platform_data mop500_sdi4_data = { | |||
246 | #endif | 241 | #endif |
247 | }; | 242 | }; |
248 | 243 | ||
249 | void __init mop500_sdi_init(void) | 244 | void __init mop500_sdi_init(struct device *parent) |
250 | { | 245 | { |
251 | /* PoP:ed eMMC */ | 246 | /* PoP:ed eMMC */ |
252 | db8500_add_sdi2(&mop500_sdi2_data, U8500_SDI_V2_PERIPHID); | 247 | db8500_add_sdi2(parent, &mop500_sdi2_data, U8500_SDI_V2_PERIPHID); |
253 | /* On-board eMMC */ | 248 | /* On-board eMMC */ |
254 | db8500_add_sdi4(&mop500_sdi4_data, U8500_SDI_V2_PERIPHID); | 249 | db8500_add_sdi4(parent, &mop500_sdi4_data, U8500_SDI_V2_PERIPHID); |
250 | |||
255 | /* | 251 | /* |
256 | * On boards with the TC35892 GPIO expander, sdi0 will finally | 252 | * On boards with the TC35892 GPIO expander, sdi0 will finally |
257 | * be added when the TC35892 initializes and calls | 253 | * be added when the TC35892 initializes and calls |
@@ -259,31 +255,31 @@ void __init mop500_sdi_init(void) | |||
259 | */ | 255 | */ |
260 | } | 256 | } |
261 | 257 | ||
262 | void __init snowball_sdi_init(void) | 258 | void __init snowball_sdi_init(struct device *parent) |
263 | { | 259 | { |
264 | /* On Snowball MMC_CAP_SD_HIGHSPEED isn't supported (Hardware issue?) */ | 260 | /* On Snowball MMC_CAP_SD_HIGHSPEED isn't supported (Hardware issue?) */ |
265 | mop500_sdi0_data.capabilities &= ~MMC_CAP_SD_HIGHSPEED; | 261 | mop500_sdi0_data.capabilities &= ~MMC_CAP_SD_HIGHSPEED; |
266 | /* On-board eMMC */ | 262 | /* On-board eMMC */ |
267 | db8500_add_sdi4(&mop500_sdi4_data, U8500_SDI_V2_PERIPHID); | 263 | db8500_add_sdi4(parent, &mop500_sdi4_data, U8500_SDI_V2_PERIPHID); |
268 | /* External Micro SD slot */ | 264 | /* External Micro SD slot */ |
269 | mop500_sdi0_data.gpio_cd = SNOWBALL_SDMMC_CD_GPIO; | 265 | mop500_sdi0_data.gpio_cd = SNOWBALL_SDMMC_CD_GPIO; |
270 | mop500_sdi0_data.cd_invert = true; | 266 | mop500_sdi0_data.cd_invert = true; |
271 | sdi0_en = SNOWBALL_SDMMC_EN_GPIO; | 267 | sdi0_en = SNOWBALL_SDMMC_EN_GPIO; |
272 | sdi0_vsel = SNOWBALL_SDMMC_1V8_3V_GPIO; | 268 | sdi0_vsel = SNOWBALL_SDMMC_1V8_3V_GPIO; |
273 | sdi0_configure(); | 269 | sdi0_configure(parent); |
274 | } | 270 | } |
275 | 271 | ||
276 | void __init hrefv60_sdi_init(void) | 272 | void __init hrefv60_sdi_init(struct device *parent) |
277 | { | 273 | { |
278 | /* PoP:ed eMMC */ | 274 | /* PoP:ed eMMC */ |
279 | db8500_add_sdi2(&mop500_sdi2_data, U8500_SDI_V2_PERIPHID); | 275 | db8500_add_sdi2(parent, &mop500_sdi2_data, U8500_SDI_V2_PERIPHID); |
280 | /* On-board eMMC */ | 276 | /* On-board eMMC */ |
281 | db8500_add_sdi4(&mop500_sdi4_data, U8500_SDI_V2_PERIPHID); | 277 | db8500_add_sdi4(parent, &mop500_sdi4_data, U8500_SDI_V2_PERIPHID); |
282 | /* External Micro SD slot */ | 278 | /* External Micro SD slot */ |
283 | mop500_sdi0_data.gpio_cd = HREFV60_SDMMC_CD_GPIO; | 279 | mop500_sdi0_data.gpio_cd = HREFV60_SDMMC_CD_GPIO; |
284 | sdi0_en = HREFV60_SDMMC_EN_GPIO; | 280 | sdi0_en = HREFV60_SDMMC_EN_GPIO; |
285 | sdi0_vsel = HREFV60_SDMMC_1V8_3V_GPIO; | 281 | sdi0_vsel = HREFV60_SDMMC_1V8_3V_GPIO; |
286 | sdi0_configure(); | 282 | sdi0_configure(parent); |
287 | /* WLAN SDIO channel */ | 283 | /* WLAN SDIO channel */ |
288 | db8500_add_sdi1(&mop500_sdi1_data, U8500_SDI_V2_PERIPHID); | 284 | db8500_add_sdi1(parent, &mop500_sdi1_data, U8500_SDI_V2_PERIPHID); |
289 | } | 285 | } |
diff --git a/arch/arm/mach-ux500/board-mop500-u8500uib.c b/arch/arm/mach-ux500/board-mop500-u8500uib.c index feb5744d98b7..ead91c968ff4 100644 --- a/arch/arm/mach-ux500/board-mop500-u8500uib.c +++ b/arch/arm/mach-ux500/board-mop500-u8500uib.c | |||
@@ -8,7 +8,6 @@ | |||
8 | #include <linux/kernel.h> | 8 | #include <linux/kernel.h> |
9 | #include <linux/init.h> | 9 | #include <linux/init.h> |
10 | #include <linux/i2c.h> | 10 | #include <linux/i2c.h> |
11 | #include <linux/gpio.h> | ||
12 | #include <linux/interrupt.h> | 11 | #include <linux/interrupt.h> |
13 | #include <linux/mfd/tc3589x.h> | 12 | #include <linux/mfd/tc3589x.h> |
14 | #include <linux/input/matrix_keypad.h> | 13 | #include <linux/input/matrix_keypad.h> |
diff --git a/arch/arm/mach-ux500/board-mop500.c b/arch/arm/mach-ux500/board-mop500.c index 5c00712907d1..29d330374994 100644 --- a/arch/arm/mach-ux500/board-mop500.c +++ b/arch/arm/mach-ux500/board-mop500.c | |||
@@ -72,7 +72,7 @@ static struct platform_device snowball_led_dev = { | |||
72 | }; | 72 | }; |
73 | 73 | ||
74 | static struct ab8500_gpio_platform_data ab8500_gpio_pdata = { | 74 | static struct ab8500_gpio_platform_data ab8500_gpio_pdata = { |
75 | .gpio_base = MOP500_AB8500_GPIO(0), | 75 | .gpio_base = MOP500_AB8500_PIN_GPIO(1), |
76 | .irq_base = MOP500_AB8500_VIR_GPIO_IRQ_BASE, | 76 | .irq_base = MOP500_AB8500_VIR_GPIO_IRQ_BASE, |
77 | /* config_reg is the initial configuration of ab8500 pins. | 77 | /* config_reg is the initial configuration of ab8500 pins. |
78 | * The pins can be configured as GPIO or alt functions based | 78 | * The pins can be configured as GPIO or alt functions based |
@@ -226,7 +226,12 @@ static struct tps6105x_platform_data mop500_tps61052_data = { | |||
226 | 226 | ||
227 | static void mop500_tc35892_init(struct tc3589x *tc3589x, unsigned int base) | 227 | static void mop500_tc35892_init(struct tc3589x *tc3589x, unsigned int base) |
228 | { | 228 | { |
229 | mop500_sdi_tc35892_init(); | 229 | struct device *parent = NULL; |
230 | #if 0 | ||
231 | /* FIXME: Is the sdi actually part of tc3589x? */ | ||
232 | parent = tc3589x->dev; | ||
233 | #endif | ||
234 | mop500_sdi_tc35892_init(parent); | ||
230 | } | 235 | } |
231 | 236 | ||
232 | static struct tc3589x_gpio_platform_data mop500_tc35892_gpio_data = { | 237 | static struct tc3589x_gpio_platform_data mop500_tc35892_gpio_data = { |
@@ -353,12 +358,12 @@ U8500_I2C_CONTROLLER(1, 0xe, 1, 8, 100000, 200, I2C_FREQ_MODE_FAST); | |||
353 | U8500_I2C_CONTROLLER(2, 0xe, 1, 8, 100000, 200, I2C_FREQ_MODE_FAST); | 358 | U8500_I2C_CONTROLLER(2, 0xe, 1, 8, 100000, 200, I2C_FREQ_MODE_FAST); |
354 | U8500_I2C_CONTROLLER(3, 0xe, 1, 8, 100000, 200, I2C_FREQ_MODE_FAST); | 359 | U8500_I2C_CONTROLLER(3, 0xe, 1, 8, 100000, 200, I2C_FREQ_MODE_FAST); |
355 | 360 | ||
356 | static void __init mop500_i2c_init(void) | 361 | static void __init mop500_i2c_init(struct device *parent) |
357 | { | 362 | { |
358 | db8500_add_i2c0(&u8500_i2c0_data); | 363 | db8500_add_i2c0(parent, &u8500_i2c0_data); |
359 | db8500_add_i2c1(&u8500_i2c1_data); | 364 | db8500_add_i2c1(parent, &u8500_i2c1_data); |
360 | db8500_add_i2c2(&u8500_i2c2_data); | 365 | db8500_add_i2c2(parent, &u8500_i2c2_data); |
361 | db8500_add_i2c3(&u8500_i2c3_data); | 366 | db8500_add_i2c3(parent, &u8500_i2c3_data); |
362 | } | 367 | } |
363 | 368 | ||
364 | static struct gpio_keys_button mop500_gpio_keys[] = { | 369 | static struct gpio_keys_button mop500_gpio_keys[] = { |
@@ -451,9 +456,9 @@ static struct pl022_ssp_controller ssp0_platform_data = { | |||
451 | .num_chipselect = 5, | 456 | .num_chipselect = 5, |
452 | }; | 457 | }; |
453 | 458 | ||
454 | static void __init mop500_spi_init(void) | 459 | static void __init mop500_spi_init(struct device *parent) |
455 | { | 460 | { |
456 | db8500_add_ssp0(&ssp0_platform_data); | 461 | db8500_add_ssp0(parent, &ssp0_platform_data); |
457 | } | 462 | } |
458 | 463 | ||
459 | #ifdef CONFIG_STE_DMA40 | 464 | #ifdef CONFIG_STE_DMA40 |
@@ -587,11 +592,11 @@ static struct amba_pl011_data uart2_plat = { | |||
587 | #endif | 592 | #endif |
588 | }; | 593 | }; |
589 | 594 | ||
590 | static void __init mop500_uart_init(void) | 595 | static void __init mop500_uart_init(struct device *parent) |
591 | { | 596 | { |
592 | db8500_add_uart0(&uart0_plat); | 597 | db8500_add_uart0(parent, &uart0_plat); |
593 | db8500_add_uart1(&uart1_plat); | 598 | db8500_add_uart1(parent, &uart1_plat); |
594 | db8500_add_uart2(&uart2_plat); | 599 | db8500_add_uart2(parent, &uart2_plat); |
595 | } | 600 | } |
596 | 601 | ||
597 | static struct platform_device *snowball_platform_devs[] __initdata = { | 602 | static struct platform_device *snowball_platform_devs[] __initdata = { |
@@ -603,21 +608,26 @@ static struct platform_device *snowball_platform_devs[] __initdata = { | |||
603 | 608 | ||
604 | static void __init mop500_init_machine(void) | 609 | static void __init mop500_init_machine(void) |
605 | { | 610 | { |
611 | struct device *parent = NULL; | ||
606 | int i2c0_devs; | 612 | int i2c0_devs; |
613 | int i; | ||
607 | 614 | ||
608 | mop500_gpio_keys[0].gpio = GPIO_PROX_SENSOR; | 615 | mop500_gpio_keys[0].gpio = GPIO_PROX_SENSOR; |
609 | 616 | ||
610 | u8500_init_devices(); | 617 | parent = u8500_init_devices(); |
611 | 618 | ||
612 | mop500_pins_init(); | 619 | mop500_pins_init(); |
613 | 620 | ||
621 | for (i = 0; i < ARRAY_SIZE(mop500_platform_devs); i++) | ||
622 | mop500_platform_devs[i]->dev.parent = parent; | ||
623 | |||
614 | platform_add_devices(mop500_platform_devs, | 624 | platform_add_devices(mop500_platform_devs, |
615 | ARRAY_SIZE(mop500_platform_devs)); | 625 | ARRAY_SIZE(mop500_platform_devs)); |
616 | 626 | ||
617 | mop500_i2c_init(); | 627 | mop500_i2c_init(parent); |
618 | mop500_sdi_init(); | 628 | mop500_sdi_init(parent); |
619 | mop500_spi_init(); | 629 | mop500_spi_init(parent); |
620 | mop500_uart_init(); | 630 | mop500_uart_init(parent); |
621 | 631 | ||
622 | i2c0_devs = ARRAY_SIZE(mop500_i2c0_devices); | 632 | i2c0_devs = ARRAY_SIZE(mop500_i2c0_devices); |
623 | 633 | ||
@@ -631,19 +641,24 @@ static void __init mop500_init_machine(void) | |||
631 | 641 | ||
632 | static void __init snowball_init_machine(void) | 642 | static void __init snowball_init_machine(void) |
633 | { | 643 | { |
644 | struct device *parent = NULL; | ||
634 | int i2c0_devs; | 645 | int i2c0_devs; |
646 | int i; | ||
635 | 647 | ||
636 | u8500_init_devices(); | 648 | parent = u8500_init_devices(); |
637 | 649 | ||
638 | snowball_pins_init(); | 650 | snowball_pins_init(); |
639 | 651 | ||
652 | for (i = 0; i < ARRAY_SIZE(snowball_platform_devs); i++) | ||
653 | snowball_platform_devs[i]->dev.parent = parent; | ||
654 | |||
640 | platform_add_devices(snowball_platform_devs, | 655 | platform_add_devices(snowball_platform_devs, |
641 | ARRAY_SIZE(snowball_platform_devs)); | 656 | ARRAY_SIZE(snowball_platform_devs)); |
642 | 657 | ||
643 | mop500_i2c_init(); | 658 | mop500_i2c_init(parent); |
644 | snowball_sdi_init(); | 659 | snowball_sdi_init(parent); |
645 | mop500_spi_init(); | 660 | mop500_spi_init(parent); |
646 | mop500_uart_init(); | 661 | mop500_uart_init(parent); |
647 | 662 | ||
648 | i2c0_devs = ARRAY_SIZE(mop500_i2c0_devices); | 663 | i2c0_devs = ARRAY_SIZE(mop500_i2c0_devices); |
649 | i2c_register_board_info(0, mop500_i2c0_devices, i2c0_devs); | 664 | i2c_register_board_info(0, mop500_i2c0_devices, i2c0_devs); |
@@ -656,7 +671,9 @@ static void __init snowball_init_machine(void) | |||
656 | 671 | ||
657 | static void __init hrefv60_init_machine(void) | 672 | static void __init hrefv60_init_machine(void) |
658 | { | 673 | { |
674 | struct device *parent = NULL; | ||
659 | int i2c0_devs; | 675 | int i2c0_devs; |
676 | int i; | ||
660 | 677 | ||
661 | /* | 678 | /* |
662 | * The HREFv60 board removed a GPIO expander and routed | 679 | * The HREFv60 board removed a GPIO expander and routed |
@@ -665,17 +682,20 @@ static void __init hrefv60_init_machine(void) | |||
665 | */ | 682 | */ |
666 | mop500_gpio_keys[0].gpio = HREFV60_PROX_SENSE_GPIO; | 683 | mop500_gpio_keys[0].gpio = HREFV60_PROX_SENSE_GPIO; |
667 | 684 | ||
668 | u8500_init_devices(); | 685 | parent = u8500_init_devices(); |
669 | 686 | ||
670 | hrefv60_pins_init(); | 687 | hrefv60_pins_init(); |
671 | 688 | ||
689 | for (i = 0; i < ARRAY_SIZE(mop500_platform_devs); i++) | ||
690 | mop500_platform_devs[i]->dev.parent = parent; | ||
691 | |||
672 | platform_add_devices(mop500_platform_devs, | 692 | platform_add_devices(mop500_platform_devs, |
673 | ARRAY_SIZE(mop500_platform_devs)); | 693 | ARRAY_SIZE(mop500_platform_devs)); |
674 | 694 | ||
675 | mop500_i2c_init(); | 695 | mop500_i2c_init(parent); |
676 | hrefv60_sdi_init(); | 696 | hrefv60_sdi_init(parent); |
677 | mop500_spi_init(); | 697 | mop500_spi_init(parent); |
678 | mop500_uart_init(); | 698 | mop500_uart_init(parent); |
679 | 699 | ||
680 | i2c0_devs = ARRAY_SIZE(mop500_i2c0_devices); | 700 | i2c0_devs = ARRAY_SIZE(mop500_i2c0_devices); |
681 | 701 | ||
diff --git a/arch/arm/mach-ux500/board-mop500.h b/arch/arm/mach-ux500/board-mop500.h index f926d3db6207..fdcfa8721bb4 100644 --- a/arch/arm/mach-ux500/board-mop500.h +++ b/arch/arm/mach-ux500/board-mop500.h | |||
@@ -63,7 +63,7 @@ | |||
63 | * because the AB8500 GPIO pins are enumbered starting from 1, so the value in | 63 | * because the AB8500 GPIO pins are enumbered starting from 1, so the value in |
64 | * parens matches the GPIO pin number in the data sheet. | 64 | * parens matches the GPIO pin number in the data sheet. |
65 | */ | 65 | */ |
66 | #define MOP500_AB8500_GPIO(x) (MOP500_EGPIO_END + (x) - 1) | 66 | #define MOP500_AB8500_PIN_GPIO(x) (MOP500_EGPIO_END + (x) - 1) |
67 | /*Snowball AB8500 GPIO */ | 67 | /*Snowball AB8500 GPIO */ |
68 | #define SNOWBALL_VSMPS2_1V8_GPIO MOP500_AB8500_PIN_GPIO(1) /* SYSCLKREQ2/GPIO1 */ | 68 | #define SNOWBALL_VSMPS2_1V8_GPIO MOP500_AB8500_PIN_GPIO(1) /* SYSCLKREQ2/GPIO1 */ |
69 | #define SNOWBALL_PM_GPIO1_GPIO MOP500_AB8500_PIN_GPIO(2) /* SYSCLKREQ3/GPIO2 */ | 69 | #define SNOWBALL_PM_GPIO1_GPIO MOP500_AB8500_PIN_GPIO(2) /* SYSCLKREQ3/GPIO2 */ |
@@ -75,10 +75,10 @@ | |||
75 | 75 | ||
76 | struct i2c_board_info; | 76 | struct i2c_board_info; |
77 | 77 | ||
78 | extern void mop500_sdi_init(void); | 78 | extern void mop500_sdi_init(struct device *parent); |
79 | extern void snowball_sdi_init(void); | 79 | extern void snowball_sdi_init(struct device *parent); |
80 | extern void hrefv60_sdi_init(void); | 80 | extern void hrefv60_sdi_init(struct device *parent); |
81 | extern void mop500_sdi_tc35892_init(void); | 81 | extern void mop500_sdi_tc35892_init(struct device *parent); |
82 | void __init mop500_u8500uib_init(void); | 82 | void __init mop500_u8500uib_init(void); |
83 | void __init mop500_stuib_init(void); | 83 | void __init mop500_stuib_init(void); |
84 | void __init mop500_pins_init(void); | 84 | void __init mop500_pins_init(void); |
diff --git a/arch/arm/mach-ux500/board-u5500-sdi.c b/arch/arm/mach-ux500/board-u5500-sdi.c index 63c3f8058ffc..836112eedde7 100644 --- a/arch/arm/mach-ux500/board-u5500-sdi.c +++ b/arch/arm/mach-ux500/board-u5500-sdi.c | |||
@@ -66,9 +66,9 @@ static struct mmci_platform_data u5500_sdi0_data = { | |||
66 | #endif | 66 | #endif |
67 | }; | 67 | }; |
68 | 68 | ||
69 | void __init u5500_sdi_init(void) | 69 | void __init u5500_sdi_init(struct device *parent) |
70 | { | 70 | { |
71 | nmk_config_pins(u5500_sdi_pins, ARRAY_SIZE(u5500_sdi_pins)); | 71 | nmk_config_pins(u5500_sdi_pins, ARRAY_SIZE(u5500_sdi_pins)); |
72 | 72 | ||
73 | db5500_add_sdi0(&u5500_sdi0_data); | 73 | db5500_add_sdi0(parent, &u5500_sdi0_data); |
74 | } | 74 | } |
diff --git a/arch/arm/mach-ux500/board-u5500.c b/arch/arm/mach-ux500/board-u5500.c index 9de9e9c4dbbb..0ff4be72a809 100644 --- a/arch/arm/mach-ux500/board-u5500.c +++ b/arch/arm/mach-ux500/board-u5500.c | |||
@@ -97,9 +97,9 @@ static struct i2c_board_info __initdata u5500_i2c2_devices[] = { | |||
97 | }, | 97 | }, |
98 | }; | 98 | }; |
99 | 99 | ||
100 | static void __init u5500_i2c_init(void) | 100 | static void __init u5500_i2c_init(struct device *parent) |
101 | { | 101 | { |
102 | db5500_add_i2c2(&u5500_i2c2_data); | 102 | db5500_add_i2c2(parent, &u5500_i2c2_data); |
103 | i2c_register_board_info(2, ARRAY_AND_SIZE(u5500_i2c2_devices)); | 103 | i2c_register_board_info(2, ARRAY_AND_SIZE(u5500_i2c2_devices)); |
104 | } | 104 | } |
105 | 105 | ||
@@ -126,20 +126,27 @@ static struct platform_device *u5500_platform_devices[] __initdata = { | |||
126 | &ab5500_device, | 126 | &ab5500_device, |
127 | }; | 127 | }; |
128 | 128 | ||
129 | static void __init u5500_uart_init(void) | 129 | static void __init u5500_uart_init(struct device *parent) |
130 | { | 130 | { |
131 | db5500_add_uart0(NULL); | 131 | db5500_add_uart0(parent, NULL); |
132 | db5500_add_uart1(NULL); | 132 | db5500_add_uart1(parent, NULL); |
133 | db5500_add_uart2(NULL); | 133 | db5500_add_uart2(parent, NULL); |
134 | } | 134 | } |
135 | 135 | ||
136 | static void __init u5500_init_machine(void) | 136 | static void __init u5500_init_machine(void) |
137 | { | 137 | { |
138 | u5500_init_devices(); | 138 | struct device *parent = NULL; |
139 | int i; | ||
140 | |||
141 | parent = u5500_init_devices(); | ||
139 | nmk_config_pins(u5500_pins, ARRAY_SIZE(u5500_pins)); | 142 | nmk_config_pins(u5500_pins, ARRAY_SIZE(u5500_pins)); |
140 | u5500_i2c_init(); | 143 | |
141 | u5500_sdi_init(); | 144 | u5500_i2c_init(parent); |
142 | u5500_uart_init(); | 145 | u5500_sdi_init(parent); |
146 | u5500_uart_init(parent); | ||
147 | |||
148 | for (i = 0; i < ARRAY_SIZE(u5500_platform_devices); i++) | ||
149 | u5500_platform_devices[i]->dev.parent = parent; | ||
143 | 150 | ||
144 | platform_add_devices(u5500_platform_devices, | 151 | platform_add_devices(u5500_platform_devices, |
145 | ARRAY_SIZE(u5500_platform_devices)); | 152 | ARRAY_SIZE(u5500_platform_devices)); |
diff --git a/arch/arm/mach-ux500/clock.c b/arch/arm/mach-ux500/clock.c index 737907537004..ec35f0aa5665 100644 --- a/arch/arm/mach-ux500/clock.c +++ b/arch/arm/mach-ux500/clock.c | |||
@@ -223,6 +223,13 @@ int clk_set_rate(struct clk *clk, unsigned long rate) | |||
223 | } | 223 | } |
224 | EXPORT_SYMBOL(clk_set_rate); | 224 | EXPORT_SYMBOL(clk_set_rate); |
225 | 225 | ||
226 | int clk_set_parent(struct clk *clk, struct clk *parent) | ||
227 | { | ||
228 | /*TODO*/ | ||
229 | return -ENOSYS; | ||
230 | } | ||
231 | EXPORT_SYMBOL(clk_set_parent); | ||
232 | |||
226 | static void clk_prcmu_enable(struct clk *clk) | 233 | static void clk_prcmu_enable(struct clk *clk) |
227 | { | 234 | { |
228 | void __iomem *cg_set_reg = __io_address(U8500_PRCMU_BASE) | 235 | void __iomem *cg_set_reg = __io_address(U8500_PRCMU_BASE) |
diff --git a/arch/arm/mach-ux500/clock.h b/arch/arm/mach-ux500/clock.h index 074490705229..d776ada08dbf 100644 --- a/arch/arm/mach-ux500/clock.h +++ b/arch/arm/mach-ux500/clock.h | |||
@@ -21,6 +21,7 @@ struct clkops { | |||
21 | void (*enable) (struct clk *); | 21 | void (*enable) (struct clk *); |
22 | void (*disable) (struct clk *); | 22 | void (*disable) (struct clk *); |
23 | unsigned long (*get_rate) (struct clk *); | 23 | unsigned long (*get_rate) (struct clk *); |
24 | int (*set_parent)(struct clk *, struct clk *); | ||
24 | }; | 25 | }; |
25 | 26 | ||
26 | /** | 27 | /** |
diff --git a/arch/arm/mach-ux500/cpu-db5500.c b/arch/arm/mach-ux500/cpu-db5500.c index 18aa5c05c69e..bca47f32082f 100644 --- a/arch/arm/mach-ux500/cpu-db5500.c +++ b/arch/arm/mach-ux500/cpu-db5500.c | |||
@@ -147,13 +147,13 @@ static resource_size_t __initdata db5500_gpio_base[] = { | |||
147 | U5500_GPIOBANK7_BASE, | 147 | U5500_GPIOBANK7_BASE, |
148 | }; | 148 | }; |
149 | 149 | ||
150 | static void __init db5500_add_gpios(void) | 150 | static void __init db5500_add_gpios(struct device *parent) |
151 | { | 151 | { |
152 | struct nmk_gpio_platform_data pdata = { | 152 | struct nmk_gpio_platform_data pdata = { |
153 | /* No custom data yet */ | 153 | /* No custom data yet */ |
154 | }; | 154 | }; |
155 | 155 | ||
156 | dbx500_add_gpios(ARRAY_AND_SIZE(db5500_gpio_base), | 156 | dbx500_add_gpios(parent, ARRAY_AND_SIZE(db5500_gpio_base), |
157 | IRQ_DB5500_GPIO0, &pdata); | 157 | IRQ_DB5500_GPIO0, &pdata); |
158 | } | 158 | } |
159 | 159 | ||
@@ -212,14 +212,36 @@ static int usb_db5500_tx_dma_cfg[] = { | |||
212 | DB5500_DMA_DEV38_USB_OTG_OEP_8 | 212 | DB5500_DMA_DEV38_USB_OTG_OEP_8 |
213 | }; | 213 | }; |
214 | 214 | ||
215 | void __init u5500_init_devices(void) | 215 | static const char *db5500_read_soc_id(void) |
216 | { | 216 | { |
217 | db5500_add_gpios(); | 217 | return kasprintf(GFP_KERNEL, "u5500 currently unsupported\n"); |
218 | } | ||
219 | |||
220 | static struct device * __init db5500_soc_device_init(void) | ||
221 | { | ||
222 | const char *soc_id = db5500_read_soc_id(); | ||
223 | |||
224 | return ux500_soc_device_init(soc_id); | ||
225 | } | ||
226 | |||
227 | struct device * __init u5500_init_devices(void) | ||
228 | { | ||
229 | struct device *parent; | ||
230 | int i; | ||
231 | |||
232 | parent = db5500_soc_device_init(); | ||
233 | |||
234 | db5500_add_gpios(parent); | ||
218 | db5500_pmu_init(); | 235 | db5500_pmu_init(); |
219 | db5500_dma_init(); | 236 | db5500_dma_init(parent); |
220 | db5500_add_rtc(); | 237 | db5500_add_rtc(parent); |
221 | db5500_add_usb(usb_db5500_rx_dma_cfg, usb_db5500_tx_dma_cfg); | 238 | db5500_add_usb(parent, usb_db5500_rx_dma_cfg, usb_db5500_tx_dma_cfg); |
239 | |||
240 | for (i = 0; i < ARRAY_SIZE(db5500_platform_devs); i++) | ||
241 | db5500_platform_devs[i]->dev.parent = parent; | ||
222 | 242 | ||
223 | platform_add_devices(db5500_platform_devs, | 243 | platform_add_devices(db5500_platform_devs, |
224 | ARRAY_SIZE(db5500_platform_devs)); | 244 | ARRAY_SIZE(db5500_platform_devs)); |
245 | |||
246 | return parent; | ||
225 | } | 247 | } |
diff --git a/arch/arm/mach-ux500/cpu-db8500.c b/arch/arm/mach-ux500/cpu-db8500.c index 7176ee7491ab..9bd8163896cf 100644 --- a/arch/arm/mach-ux500/cpu-db8500.c +++ b/arch/arm/mach-ux500/cpu-db8500.c | |||
@@ -24,6 +24,7 @@ | |||
24 | #include <mach/setup.h> | 24 | #include <mach/setup.h> |
25 | #include <mach/devices.h> | 25 | #include <mach/devices.h> |
26 | #include <mach/usb.h> | 26 | #include <mach/usb.h> |
27 | #include <mach/db8500-regs.h> | ||
27 | 28 | ||
28 | #include "devices-db8500.h" | 29 | #include "devices-db8500.h" |
29 | #include "ste-dma40-db8500.h" | 30 | #include "ste-dma40-db8500.h" |
@@ -132,13 +133,13 @@ static resource_size_t __initdata db8500_gpio_base[] = { | |||
132 | U8500_GPIOBANK8_BASE, | 133 | U8500_GPIOBANK8_BASE, |
133 | }; | 134 | }; |
134 | 135 | ||
135 | static void __init db8500_add_gpios(void) | 136 | static void __init db8500_add_gpios(struct device *parent) |
136 | { | 137 | { |
137 | struct nmk_gpio_platform_data pdata = { | 138 | struct nmk_gpio_platform_data pdata = { |
138 | .supports_sleepmode = true, | 139 | .supports_sleepmode = true, |
139 | }; | 140 | }; |
140 | 141 | ||
141 | dbx500_add_gpios(ARRAY_AND_SIZE(db8500_gpio_base), | 142 | dbx500_add_gpios(parent, ARRAY_AND_SIZE(db8500_gpio_base), |
142 | IRQ_DB8500_GPIO0, &pdata); | 143 | IRQ_DB8500_GPIO0, &pdata); |
143 | } | 144 | } |
144 | 145 | ||
@@ -164,17 +165,44 @@ static int usb_db8500_tx_dma_cfg[] = { | |||
164 | DB8500_DMA_DEV39_USB_OTG_OEP_8 | 165 | DB8500_DMA_DEV39_USB_OTG_OEP_8 |
165 | }; | 166 | }; |
166 | 167 | ||
168 | static const char *db8500_read_soc_id(void) | ||
169 | { | ||
170 | void __iomem *uid = __io_address(U8500_BB_UID_BASE); | ||
171 | |||
172 | return kasprintf(GFP_KERNEL, "%08x%08x%08x%08x%08x", | ||
173 | readl((u32 *)uid+1), | ||
174 | readl((u32 *)uid+1), readl((u32 *)uid+2), | ||
175 | readl((u32 *)uid+3), readl((u32 *)uid+4)); | ||
176 | } | ||
177 | |||
178 | static struct device * __init db8500_soc_device_init(void) | ||
179 | { | ||
180 | const char *soc_id = db8500_read_soc_id(); | ||
181 | |||
182 | return ux500_soc_device_init(soc_id); | ||
183 | } | ||
184 | |||
167 | /* | 185 | /* |
168 | * This function is called from the board init | 186 | * This function is called from the board init |
169 | */ | 187 | */ |
170 | void __init u8500_init_devices(void) | 188 | struct device * __init u8500_init_devices(void) |
171 | { | 189 | { |
172 | db8500_add_rtc(); | 190 | struct device *parent; |
173 | db8500_add_gpios(); | 191 | int i; |
174 | db8500_add_usb(usb_db8500_rx_dma_cfg, usb_db8500_tx_dma_cfg); | 192 | |
193 | parent = db8500_soc_device_init(); | ||
194 | |||
195 | db8500_add_rtc(parent); | ||
196 | db8500_add_gpios(parent); | ||
197 | db8500_add_usb(parent, usb_db8500_rx_dma_cfg, usb_db8500_tx_dma_cfg); | ||
198 | |||
199 | platform_device_register_data(parent, | ||
200 | "cpufreq-u8500", -1, NULL, 0); | ||
201 | |||
202 | for (i = 0; i < ARRAY_SIZE(platform_devs); i++) | ||
203 | platform_devs[i]->dev.parent = parent; | ||
175 | 204 | ||
176 | platform_device_register_simple("cpufreq-u8500", -1, NULL, 0); | ||
177 | platform_add_devices(platform_devs, ARRAY_SIZE(platform_devs)); | 205 | platform_add_devices(platform_devs, ARRAY_SIZE(platform_devs)); |
178 | 206 | ||
179 | return ; | 207 | return parent; |
180 | } | 208 | } |
diff --git a/arch/arm/mach-ux500/cpu.c b/arch/arm/mach-ux500/cpu.c index f41857494375..6242e88e5fd3 100644 --- a/arch/arm/mach-ux500/cpu.c +++ b/arch/arm/mach-ux500/cpu.c | |||
@@ -2,6 +2,7 @@ | |||
2 | * Copyright (C) ST-Ericsson SA 2010 | 2 | * Copyright (C) ST-Ericsson SA 2010 |
3 | * | 3 | * |
4 | * Author: Rabin Vincent <rabin.vincent@stericsson.com> for ST-Ericsson | 4 | * Author: Rabin Vincent <rabin.vincent@stericsson.com> for ST-Ericsson |
5 | * Author: Lee Jones <lee.jones@linaro.org> for ST-Ericsson | ||
5 | * License terms: GNU General Public License (GPL) version 2 | 6 | * License terms: GNU General Public License (GPL) version 2 |
6 | */ | 7 | */ |
7 | 8 | ||
@@ -11,10 +12,13 @@ | |||
11 | #include <linux/mfd/db8500-prcmu.h> | 12 | #include <linux/mfd/db8500-prcmu.h> |
12 | #include <linux/mfd/db5500-prcmu.h> | 13 | #include <linux/mfd/db5500-prcmu.h> |
13 | #include <linux/clksrc-dbx500-prcmu.h> | 14 | #include <linux/clksrc-dbx500-prcmu.h> |
15 | #include <linux/sys_soc.h> | ||
16 | #include <linux/err.h> | ||
17 | #include <linux/slab.h> | ||
18 | #include <linux/stat.h> | ||
14 | 19 | ||
15 | #include <asm/hardware/gic.h> | 20 | #include <asm/hardware/gic.h> |
16 | #include <asm/mach/map.h> | 21 | #include <asm/mach/map.h> |
17 | #include <asm/localtimer.h> | ||
18 | 22 | ||
19 | #include <mach/hardware.h> | 23 | #include <mach/hardware.h> |
20 | #include <mach/setup.h> | 24 | #include <mach/setup.h> |
@@ -50,3 +54,73 @@ void __init ux500_init_irq(void) | |||
50 | db8500_prcmu_early_init(); | 54 | db8500_prcmu_early_init(); |
51 | clk_init(); | 55 | clk_init(); |
52 | } | 56 | } |
57 | |||
58 | static const char * __init ux500_get_machine(void) | ||
59 | { | ||
60 | return kasprintf(GFP_KERNEL, "DB%4x", dbx500_partnumber()); | ||
61 | } | ||
62 | |||
63 | static const char * __init ux500_get_family(void) | ||
64 | { | ||
65 | return kasprintf(GFP_KERNEL, "ux500"); | ||
66 | } | ||
67 | |||
68 | static const char * __init ux500_get_revision(void) | ||
69 | { | ||
70 | unsigned int rev = dbx500_revision(); | ||
71 | |||
72 | if (rev == 0x01) | ||
73 | return kasprintf(GFP_KERNEL, "%s", "ED"); | ||
74 | else if (rev >= 0xA0) | ||
75 | return kasprintf(GFP_KERNEL, "%d.%d", | ||
76 | (rev >> 4) - 0xA + 1, rev & 0xf); | ||
77 | |||
78 | return kasprintf(GFP_KERNEL, "%s", "Unknown"); | ||
79 | } | ||
80 | |||
81 | static ssize_t ux500_get_process(struct device *dev, | ||
82 | struct device_attribute *attr, | ||
83 | char *buf) | ||
84 | { | ||
85 | if (dbx500_id.process == 0x00) | ||
86 | return sprintf(buf, "Standard\n"); | ||
87 | |||
88 | return sprintf(buf, "%02xnm\n", dbx500_id.process); | ||
89 | } | ||
90 | |||
91 | static void __init soc_info_populate(struct soc_device_attribute *soc_dev_attr, | ||
92 | const char *soc_id) | ||
93 | { | ||
94 | soc_dev_attr->soc_id = soc_id; | ||
95 | soc_dev_attr->machine = ux500_get_machine(); | ||
96 | soc_dev_attr->family = ux500_get_family(); | ||
97 | soc_dev_attr->revision = ux500_get_revision(); | ||
98 | } | ||
99 | |||
100 | struct device_attribute ux500_soc_attr = | ||
101 | __ATTR(process, S_IRUGO, ux500_get_process, NULL); | ||
102 | |||
103 | struct device * __init ux500_soc_device_init(const char *soc_id) | ||
104 | { | ||
105 | struct device *parent; | ||
106 | struct soc_device *soc_dev; | ||
107 | struct soc_device_attribute *soc_dev_attr; | ||
108 | |||
109 | soc_dev_attr = kzalloc(sizeof(*soc_dev_attr), GFP_KERNEL); | ||
110 | if (!soc_dev_attr) | ||
111 | return ERR_PTR(-ENOMEM); | ||
112 | |||
113 | soc_info_populate(soc_dev_attr, soc_id); | ||
114 | |||
115 | soc_dev = soc_device_register(soc_dev_attr); | ||
116 | if (IS_ERR_OR_NULL(soc_dev)) { | ||
117 | kfree(soc_dev_attr); | ||
118 | return NULL; | ||
119 | } | ||
120 | |||
121 | parent = soc_device_to_device(soc_dev); | ||
122 | if (!IS_ERR_OR_NULL(parent)) | ||
123 | device_create_file(parent, &ux500_soc_attr); | ||
124 | |||
125 | return parent; | ||
126 | } | ||
diff --git a/arch/arm/mach-ux500/devices-common.c b/arch/arm/mach-ux500/devices-common.c index c563e5418d80..c5312a4b49f5 100644 --- a/arch/arm/mach-ux500/devices-common.c +++ b/arch/arm/mach-ux500/devices-common.c | |||
@@ -20,35 +20,31 @@ | |||
20 | #include "devices-common.h" | 20 | #include "devices-common.h" |
21 | 21 | ||
22 | struct amba_device * | 22 | struct amba_device * |
23 | dbx500_add_amba_device(const char *name, resource_size_t base, | 23 | dbx500_add_amba_device(struct device *parent, const char *name, |
24 | int irq, void *pdata, unsigned int periphid) | 24 | resource_size_t base, int irq, void *pdata, |
25 | unsigned int periphid) | ||
25 | { | 26 | { |
26 | struct amba_device *dev; | 27 | struct amba_device *dev; |
27 | int ret; | 28 | int ret; |
28 | 29 | ||
29 | dev = kzalloc(sizeof *dev, GFP_KERNEL); | 30 | dev = amba_device_alloc(name, base, SZ_4K); |
30 | if (!dev) | 31 | if (!dev) |
31 | return ERR_PTR(-ENOMEM); | 32 | return ERR_PTR(-ENOMEM); |
32 | 33 | ||
33 | dev->dev.init_name = name; | ||
34 | |||
35 | dev->res.start = base; | ||
36 | dev->res.end = base + SZ_4K - 1; | ||
37 | dev->res.flags = IORESOURCE_MEM; | ||
38 | |||
39 | dev->dma_mask = DMA_BIT_MASK(32); | 34 | dev->dma_mask = DMA_BIT_MASK(32); |
40 | dev->dev.coherent_dma_mask = DMA_BIT_MASK(32); | 35 | dev->dev.coherent_dma_mask = DMA_BIT_MASK(32); |
41 | 36 | ||
42 | dev->irq[0] = irq; | 37 | dev->irq[0] = irq; |
43 | dev->irq[1] = NO_IRQ; | ||
44 | 38 | ||
45 | dev->periphid = periphid; | 39 | dev->periphid = periphid; |
46 | 40 | ||
47 | dev->dev.platform_data = pdata; | 41 | dev->dev.platform_data = pdata; |
48 | 42 | ||
49 | ret = amba_device_register(dev, &iomem_resource); | 43 | dev->dev.parent = parent; |
44 | |||
45 | ret = amba_device_add(dev, &iomem_resource); | ||
50 | if (ret) { | 46 | if (ret) { |
51 | kfree(dev); | 47 | amba_device_put(dev); |
52 | return ERR_PTR(ret); | 48 | return ERR_PTR(ret); |
53 | } | 49 | } |
54 | 50 | ||
@@ -56,60 +52,7 @@ dbx500_add_amba_device(const char *name, resource_size_t base, | |||
56 | } | 52 | } |
57 | 53 | ||
58 | static struct platform_device * | 54 | static struct platform_device * |
59 | dbx500_add_platform_device(const char *name, int id, void *pdata, | 55 | dbx500_add_gpio(struct device *parent, int id, resource_size_t addr, int irq, |
60 | struct resource *res, int resnum) | ||
61 | { | ||
62 | struct platform_device *dev; | ||
63 | int ret; | ||
64 | |||
65 | dev = platform_device_alloc(name, id); | ||
66 | if (!dev) | ||
67 | return ERR_PTR(-ENOMEM); | ||
68 | |||
69 | dev->dev.coherent_dma_mask = DMA_BIT_MASK(32); | ||
70 | dev->dev.dma_mask = &dev->dev.coherent_dma_mask; | ||
71 | |||
72 | ret = platform_device_add_resources(dev, res, resnum); | ||
73 | if (ret) | ||
74 | goto out_free; | ||
75 | |||
76 | dev->dev.platform_data = pdata; | ||
77 | |||
78 | ret = platform_device_add(dev); | ||
79 | if (ret) | ||
80 | goto out_free; | ||
81 | |||
82 | return dev; | ||
83 | |||
84 | out_free: | ||
85 | platform_device_put(dev); | ||
86 | return ERR_PTR(ret); | ||
87 | } | ||
88 | |||
89 | struct platform_device * | ||
90 | dbx500_add_platform_device_4k1irq(const char *name, int id, | ||
91 | resource_size_t base, | ||
92 | int irq, void *pdata) | ||
93 | { | ||
94 | struct resource resources[] = { | ||
95 | [0] = { | ||
96 | .start = base, | ||
97 | .end = base + SZ_4K - 1, | ||
98 | .flags = IORESOURCE_MEM, | ||
99 | }, | ||
100 | [1] = { | ||
101 | .start = irq, | ||
102 | .end = irq, | ||
103 | .flags = IORESOURCE_IRQ, | ||
104 | } | ||
105 | }; | ||
106 | |||
107 | return dbx500_add_platform_device(name, id, pdata, resources, | ||
108 | ARRAY_SIZE(resources)); | ||
109 | } | ||
110 | |||
111 | static struct platform_device * | ||
112 | dbx500_add_gpio(int id, resource_size_t addr, int irq, | ||
113 | struct nmk_gpio_platform_data *pdata) | 56 | struct nmk_gpio_platform_data *pdata) |
114 | { | 57 | { |
115 | struct resource resources[] = { | 58 | struct resource resources[] = { |
@@ -125,13 +68,18 @@ dbx500_add_gpio(int id, resource_size_t addr, int irq, | |||
125 | } | 68 | } |
126 | }; | 69 | }; |
127 | 70 | ||
128 | return platform_device_register_resndata(NULL, "gpio", id, | 71 | return platform_device_register_resndata( |
129 | resources, ARRAY_SIZE(resources), | 72 | parent, |
130 | pdata, sizeof(*pdata)); | 73 | "gpio", |
74 | id, | ||
75 | resources, | ||
76 | ARRAY_SIZE(resources), | ||
77 | pdata, | ||
78 | sizeof(*pdata)); | ||
131 | } | 79 | } |
132 | 80 | ||
133 | void dbx500_add_gpios(resource_size_t *base, int num, int irq, | 81 | void dbx500_add_gpios(struct device *parent, resource_size_t *base, int num, |
134 | struct nmk_gpio_platform_data *pdata) | 82 | int irq, struct nmk_gpio_platform_data *pdata) |
135 | { | 83 | { |
136 | int first = 0; | 84 | int first = 0; |
137 | int i; | 85 | int i; |
@@ -141,6 +89,6 @@ void dbx500_add_gpios(resource_size_t *base, int num, int irq, | |||
141 | pdata->first_irq = NOMADIK_GPIO_TO_IRQ(first); | 89 | pdata->first_irq = NOMADIK_GPIO_TO_IRQ(first); |
142 | pdata->num_gpio = 32; | 90 | pdata->num_gpio = 32; |
143 | 91 | ||
144 | dbx500_add_gpio(i, base[i], irq, pdata); | 92 | dbx500_add_gpio(parent, i, base[i], irq, pdata); |
145 | } | 93 | } |
146 | } | 94 | } |
diff --git a/arch/arm/mach-ux500/devices-common.h b/arch/arm/mach-ux500/devices-common.h index 7825705033bf..39c74ec82add 100644 --- a/arch/arm/mach-ux500/devices-common.h +++ b/arch/arm/mach-ux500/devices-common.h | |||
@@ -8,80 +8,89 @@ | |||
8 | #ifndef __DEVICES_COMMON_H | 8 | #ifndef __DEVICES_COMMON_H |
9 | #define __DEVICES_COMMON_H | 9 | #define __DEVICES_COMMON_H |
10 | 10 | ||
11 | extern struct amba_device * | 11 | #include <linux/platform_device.h> |
12 | dbx500_add_amba_device(const char *name, resource_size_t base, | 12 | #include <linux/dma-mapping.h> |
13 | int irq, void *pdata, unsigned int periphid); | 13 | #include <linux/sys_soc.h> |
14 | #include <plat/i2c.h> | ||
14 | 15 | ||
15 | extern struct platform_device * | 16 | extern struct amba_device * |
16 | dbx500_add_platform_device_4k1irq(const char *name, int id, | 17 | dbx500_add_amba_device(struct device *parent, const char *name, |
17 | resource_size_t base, | 18 | resource_size_t base, int irq, void *pdata, |
18 | int irq, void *pdata); | 19 | unsigned int periphid); |
19 | 20 | ||
20 | struct spi_master_cntlr; | 21 | struct spi_master_cntlr; |
21 | 22 | ||
22 | static inline struct amba_device * | 23 | static inline struct amba_device * |
23 | dbx500_add_msp_spi(const char *name, resource_size_t base, int irq, | 24 | dbx500_add_msp_spi(struct device *parent, const char *name, |
25 | resource_size_t base, int irq, | ||
24 | struct spi_master_cntlr *pdata) | 26 | struct spi_master_cntlr *pdata) |
25 | { | 27 | { |
26 | return dbx500_add_amba_device(name, base, irq, pdata, 0); | 28 | return dbx500_add_amba_device(parent, name, base, irq, |
29 | pdata, 0); | ||
27 | } | 30 | } |
28 | 31 | ||
29 | static inline struct amba_device * | 32 | static inline struct amba_device * |
30 | dbx500_add_spi(const char *name, resource_size_t base, int irq, | 33 | dbx500_add_spi(struct device *parent, const char *name, resource_size_t base, |
31 | struct spi_master_cntlr *pdata, | 34 | int irq, struct spi_master_cntlr *pdata, |
32 | u32 periphid) | 35 | u32 periphid) |
33 | { | 36 | { |
34 | return dbx500_add_amba_device(name, base, irq, pdata, periphid); | 37 | return dbx500_add_amba_device(parent, name, base, irq, |
38 | pdata, periphid); | ||
35 | } | 39 | } |
36 | 40 | ||
37 | struct mmci_platform_data; | 41 | struct mmci_platform_data; |
38 | 42 | ||
39 | static inline struct amba_device * | 43 | static inline struct amba_device * |
40 | dbx500_add_sdi(const char *name, resource_size_t base, int irq, | 44 | dbx500_add_sdi(struct device *parent, const char *name, resource_size_t base, |
41 | struct mmci_platform_data *pdata, | 45 | int irq, struct mmci_platform_data *pdata, u32 periphid) |
42 | u32 periphid) | ||
43 | { | 46 | { |
44 | return dbx500_add_amba_device(name, base, irq, pdata, periphid); | 47 | return dbx500_add_amba_device(parent, name, base, irq, |
48 | pdata, periphid); | ||
45 | } | 49 | } |
46 | 50 | ||
47 | struct amba_pl011_data; | 51 | struct amba_pl011_data; |
48 | 52 | ||
49 | static inline struct amba_device * | 53 | static inline struct amba_device * |
50 | dbx500_add_uart(const char *name, resource_size_t base, int irq, | 54 | dbx500_add_uart(struct device *parent, const char *name, resource_size_t base, |
51 | struct amba_pl011_data *pdata) | 55 | int irq, struct amba_pl011_data *pdata) |
52 | { | 56 | { |
53 | return dbx500_add_amba_device(name, base, irq, pdata, 0); | 57 | return dbx500_add_amba_device(parent, name, base, irq, pdata, 0); |
54 | } | 58 | } |
55 | 59 | ||
56 | struct nmk_i2c_controller; | 60 | struct nmk_i2c_controller; |
57 | 61 | ||
58 | static inline struct platform_device * | 62 | static inline struct platform_device * |
59 | dbx500_add_i2c(int id, resource_size_t base, int irq, | 63 | dbx500_add_i2c(struct device *parent, int id, resource_size_t base, int irq, |
60 | struct nmk_i2c_controller *pdata) | 64 | struct nmk_i2c_controller *data) |
61 | { | ||
62 | return dbx500_add_platform_device_4k1irq("nmk-i2c", id, base, irq, | ||
63 | pdata); | ||
64 | } | ||
65 | |||
66 | struct msp_i2s_platform_data; | ||
67 | |||
68 | static inline struct platform_device * | ||
69 | dbx500_add_msp_i2s(int id, resource_size_t base, int irq, | ||
70 | struct msp_i2s_platform_data *pdata) | ||
71 | { | 65 | { |
72 | return dbx500_add_platform_device_4k1irq("MSP_I2S", id, base, irq, | 66 | struct resource res[] = { |
73 | pdata); | 67 | DEFINE_RES_MEM(base, SZ_4K), |
68 | DEFINE_RES_IRQ(irq), | ||
69 | }; | ||
70 | |||
71 | struct platform_device_info pdevinfo = { | ||
72 | .parent = parent, | ||
73 | .name = "nmk-i2c", | ||
74 | .id = id, | ||
75 | .res = res, | ||
76 | .num_res = ARRAY_SIZE(res), | ||
77 | .data = data, | ||
78 | .size_data = sizeof(*data), | ||
79 | .dma_mask = DMA_BIT_MASK(32), | ||
80 | }; | ||
81 | |||
82 | return platform_device_register_full(&pdevinfo); | ||
74 | } | 83 | } |
75 | 84 | ||
76 | static inline struct amba_device * | 85 | static inline struct amba_device * |
77 | dbx500_add_rtc(resource_size_t base, int irq) | 86 | dbx500_add_rtc(struct device *parent, resource_size_t base, int irq) |
78 | { | 87 | { |
79 | return dbx500_add_amba_device("rtc-pl031", base, irq, NULL, 0); | 88 | return dbx500_add_amba_device(parent, "rtc-pl031", base, irq, NULL, 0); |
80 | } | 89 | } |
81 | 90 | ||
82 | struct nmk_gpio_platform_data; | 91 | struct nmk_gpio_platform_data; |
83 | 92 | ||
84 | void dbx500_add_gpios(resource_size_t *base, int num, int irq, | 93 | void dbx500_add_gpios(struct device *parent, resource_size_t *base, int num, |
85 | struct nmk_gpio_platform_data *pdata); | 94 | int irq, struct nmk_gpio_platform_data *pdata); |
86 | 95 | ||
87 | #endif | 96 | #endif |
diff --git a/arch/arm/mach-ux500/devices-db5500.h b/arch/arm/mach-ux500/devices-db5500.h index 0c4bccd02b90..e70955502c35 100644 --- a/arch/arm/mach-ux500/devices-db5500.h +++ b/arch/arm/mach-ux500/devices-db5500.h | |||
@@ -10,70 +10,90 @@ | |||
10 | 10 | ||
11 | #include "devices-common.h" | 11 | #include "devices-common.h" |
12 | 12 | ||
13 | #define db5500_add_i2c1(pdata) \ | 13 | #define db5500_add_i2c1(parent, pdata) \ |
14 | dbx500_add_i2c(1, U5500_I2C1_BASE, IRQ_DB5500_I2C1, pdata) | 14 | dbx500_add_i2c(parent, 1, U5500_I2C1_BASE, IRQ_DB5500_I2C1, pdata) |
15 | #define db5500_add_i2c2(pdata) \ | 15 | #define db5500_add_i2c2(parent, pdata) \ |
16 | dbx500_add_i2c(2, U5500_I2C2_BASE, IRQ_DB5500_I2C2, pdata) | 16 | dbx500_add_i2c(parent, 2, U5500_I2C2_BASE, IRQ_DB5500_I2C2, pdata) |
17 | #define db5500_add_i2c3(pdata) \ | 17 | #define db5500_add_i2c3(parent, pdata) \ |
18 | dbx500_add_i2c(3, U5500_I2C3_BASE, IRQ_DB5500_I2C3, pdata) | 18 | dbx500_add_i2c(parent, 3, U5500_I2C3_BASE, IRQ_DB5500_I2C3, pdata) |
19 | 19 | ||
20 | #define db5500_add_msp0_i2s(pdata) \ | 20 | #define db5500_add_msp0_spi(parent, pdata) \ |
21 | dbx500_add_msp_i2s(0, U5500_MSP0_BASE, IRQ_DB5500_MSP0, pdata) | 21 | dbx500_add_msp_spi(parent, "msp0", U5500_MSP0_BASE, \ |
22 | #define db5500_add_msp1_i2s(pdata) \ | 22 | IRQ_DB5500_MSP0, pdata) |
23 | dbx500_add_msp_i2s(1, U5500_MSP1_BASE, IRQ_DB5500_MSP1, pdata) | 23 | #define db5500_add_msp1_spi(parent, pdata) \ |
24 | #define db5500_add_msp2_i2s(pdata) \ | 24 | dbx500_add_msp_spi(parent, "msp1", U5500_MSP1_BASE, \ |
25 | dbx500_add_msp_i2s(2, U5500_MSP2_BASE, IRQ_DB5500_MSP2, pdata) | 25 | IRQ_DB5500_MSP1, pdata) |
26 | #define db5500_add_msp2_spi(parent, pdata) \ | ||
27 | dbx500_add_msp_spi(parent, "msp2", U5500_MSP2_BASE, \ | ||
28 | IRQ_DB5500_MSP2, pdata) | ||
26 | 29 | ||
27 | #define db5500_add_msp0_spi(pdata) \ | 30 | #define db5500_add_msp0_spi(parent, pdata) \ |
28 | dbx500_add_msp_spi("msp0", U5500_MSP0_BASE, IRQ_DB5500_MSP0, pdata) | 31 | dbx500_add_msp_spi(parent, "msp0", U5500_MSP0_BASE, \ |
29 | #define db5500_add_msp1_spi(pdata) \ | 32 | IRQ_DB5500_MSP0, pdata) |
30 | dbx500_add_msp_spi("msp1", U5500_MSP1_BASE, IRQ_DB5500_MSP1, pdata) | 33 | #define db5500_add_msp1_spi(parent, pdata) \ |
31 | #define db5500_add_msp2_spi(pdata) \ | 34 | dbx500_add_msp_spi(parent, "msp1", U5500_MSP1_BASE, \ |
32 | dbx500_add_msp_spi("msp2", U5500_MSP2_BASE, IRQ_DB5500_MSP2, pdata) | 35 | IRQ_DB5500_MSP1, pdata) |
36 | #define db5500_add_msp2_spi(parent, pdata) \ | ||
37 | dbx500_add_msp_spi(parent, "msp2", U5500_MSP2_BASE, \ | ||
38 | IRQ_DB5500_MSP2, pdata) | ||
33 | 39 | ||
34 | #define db5500_add_rtc() \ | 40 | #define db5500_add_rtc(parent) \ |
35 | dbx500_add_rtc(U5500_RTC_BASE, IRQ_DB5500_RTC); | 41 | dbx500_add_rtc(parent, U5500_RTC_BASE, IRQ_DB5500_RTC); |
36 | 42 | ||
37 | #define db5500_add_usb(rx_cfg, tx_cfg) \ | 43 | #define db5500_add_usb(parent, rx_cfg, tx_cfg) \ |
38 | ux500_add_usb(U5500_USBOTG_BASE, IRQ_DB5500_USBOTG, rx_cfg, tx_cfg) | 44 | ux500_add_usb(parent, U5500_USBOTG_BASE, \ |
45 | IRQ_DB5500_USBOTG, rx_cfg, tx_cfg) | ||
39 | 46 | ||
40 | #define db5500_add_sdi0(pdata) \ | 47 | #define db5500_add_sdi0(parent, pdata) \ |
41 | dbx500_add_sdi("sdi0", U5500_SDI0_BASE, IRQ_DB5500_SDMMC0, pdata, \ | 48 | dbx500_add_sdi(parent, "sdi0", U5500_SDI0_BASE, \ |
49 | IRQ_DB5500_SDMMC0, pdata, \ | ||
42 | 0x10480180) | 50 | 0x10480180) |
43 | #define db5500_add_sdi1(pdata) \ | 51 | #define db5500_add_sdi1(parent, pdata) \ |
44 | dbx500_add_sdi("sdi1", U5500_SDI1_BASE, IRQ_DB5500_SDMMC1, pdata, \ | 52 | dbx500_add_sdi(parent, "sdi1", U5500_SDI1_BASE, \ |
53 | IRQ_DB5500_SDMMC1, pdata, \ | ||
45 | 0x10480180) | 54 | 0x10480180) |
46 | #define db5500_add_sdi2(pdata) \ | 55 | #define db5500_add_sdi2(parent, pdata) \ |
47 | dbx500_add_sdi("sdi2", U5500_SDI2_BASE, IRQ_DB5500_SDMMC2, pdata \ | 56 | dbx500_add_sdi(parent, "sdi2", U5500_SDI2_BASE, \ |
57 | IRQ_DB5500_SDMMC2, pdata \ | ||
48 | 0x10480180) | 58 | 0x10480180) |
49 | #define db5500_add_sdi3(pdata) \ | 59 | #define db5500_add_sdi3(parent, pdata) \ |
50 | dbx500_add_sdi("sdi3", U5500_SDI3_BASE, IRQ_DB5500_SDMMC3, pdata \ | 60 | dbx500_add_sdi(parent, "sdi3", U5500_SDI3_BASE, \ |
61 | IRQ_DB5500_SDMMC3, pdata \ | ||
51 | 0x10480180) | 62 | 0x10480180) |
52 | #define db5500_add_sdi4(pdata) \ | 63 | #define db5500_add_sdi4(parent, pdata) \ |
53 | dbx500_add_sdi("sdi4", U5500_SDI4_BASE, IRQ_DB5500_SDMMC4, pdata \ | 64 | dbx500_add_sdi(parent, "sdi4", U5500_SDI4_BASE, \ |
65 | IRQ_DB5500_SDMMC4, pdata \ | ||
54 | 0x10480180) | 66 | 0x10480180) |
55 | 67 | ||
56 | /* This one has a bad peripheral ID in the U5500 silicon */ | 68 | /* This one has a bad peripheral ID in the U5500 silicon */ |
57 | #define db5500_add_spi0(pdata) \ | 69 | #define db5500_add_spi0(parent, pdata) \ |
58 | dbx500_add_spi("spi0", U5500_SPI0_BASE, IRQ_DB5500_SPI0, pdata, \ | 70 | dbx500_add_spi(parent, "spi0", U5500_SPI0_BASE, \ |
71 | IRQ_DB5500_SPI0, pdata, \ | ||
59 | 0x10080023) | 72 | 0x10080023) |
60 | #define db5500_add_spi1(pdata) \ | 73 | #define db5500_add_spi1(parent, pdata) \ |
61 | dbx500_add_spi("spi1", U5500_SPI1_BASE, IRQ_DB5500_SPI1, pdata, \ | 74 | dbx500_add_spi(parent, "spi1", U5500_SPI1_BASE, \ |
75 | IRQ_DB5500_SPI1, pdata, \ | ||
62 | 0x10080023) | 76 | 0x10080023) |
63 | #define db5500_add_spi2(pdata) \ | 77 | #define db5500_add_spi2(parent, pdata) \ |
64 | dbx500_add_spi("spi2", U5500_SPI2_BASE, IRQ_DB5500_SPI2, pdata \ | 78 | dbx500_add_spi(parent, "spi2", U5500_SPI2_BASE, \ |
79 | IRQ_DB5500_SPI2, pdata \ | ||
65 | 0x10080023) | 80 | 0x10080023) |
66 | #define db5500_add_spi3(pdata) \ | 81 | #define db5500_add_spi3(parent, pdata) \ |
67 | dbx500_add_spi("spi3", U5500_SPI3_BASE, IRQ_DB5500_SPI3, pdata \ | 82 | dbx500_add_spi(parent, "spi3", U5500_SPI3_BASE, \ |
83 | IRQ_DB5500_SPI3, pdata \ | ||
68 | 0x10080023) | 84 | 0x10080023) |
69 | 85 | ||
70 | #define db5500_add_uart0(plat) \ | 86 | #define db5500_add_uart0(parent, plat) \ |
71 | dbx500_add_uart("uart0", U5500_UART0_BASE, IRQ_DB5500_UART0, plat) | 87 | dbx500_add_uart(parent, "uart0", U5500_UART0_BASE, \ |
72 | #define db5500_add_uart1(plat) \ | 88 | IRQ_DB5500_UART0, plat) |
73 | dbx500_add_uart("uart1", U5500_UART1_BASE, IRQ_DB5500_UART1, plat) | 89 | #define db5500_add_uart1(parent, plat) \ |
74 | #define db5500_add_uart2(plat) \ | 90 | dbx500_add_uart(parent, "uart1", U5500_UART1_BASE, \ |
75 | dbx500_add_uart("uart2", U5500_UART2_BASE, IRQ_DB5500_UART2, plat) | 91 | IRQ_DB5500_UART1, plat) |
76 | #define db5500_add_uart3(plat) \ | 92 | #define db5500_add_uart2(parent, plat) \ |
77 | dbx500_add_uart("uart3", U5500_UART3_BASE, IRQ_DB5500_UART3, plat) | 93 | dbx500_add_uart(parent, "uart2", U5500_UART2_BASE, \ |
94 | IRQ_DB5500_UART2, plat) | ||
95 | #define db5500_add_uart3(parent, plat) \ | ||
96 | dbx500_add_uart(parent, "uart3", U5500_UART3_BASE, \ | ||
97 | IRQ_DB5500_UART3, plat) | ||
78 | 98 | ||
79 | #endif | 99 | #endif |
diff --git a/arch/arm/mach-ux500/devices-db8500.c b/arch/arm/mach-ux500/devices-db8500.c index a7c6cdc9b11e..6e66d3777ed5 100644 --- a/arch/arm/mach-ux500/devices-db8500.c +++ b/arch/arm/mach-ux500/devices-db8500.c | |||
@@ -101,6 +101,9 @@ static const dma_addr_t dma40_tx_map[DB8500_DMA_NR_DEV] = { | |||
101 | [DB8500_DMA_DEV41_SD_MM3_TX] = -1, | 101 | [DB8500_DMA_DEV41_SD_MM3_TX] = -1, |
102 | [DB8500_DMA_DEV42_SD_MM4_TX] = -1, | 102 | [DB8500_DMA_DEV42_SD_MM4_TX] = -1, |
103 | [DB8500_DMA_DEV43_SD_MM5_TX] = -1, | 103 | [DB8500_DMA_DEV43_SD_MM5_TX] = -1, |
104 | [DB8500_DMA_DEV14_MSP2_TX] = U8500_MSP2_BASE + MSP_TX_RX_REG_OFFSET, | ||
105 | [DB8500_DMA_DEV30_MSP1_TX] = U8500_MSP1_BASE + MSP_TX_RX_REG_OFFSET, | ||
106 | [DB8500_DMA_DEV31_MSP0_TX_SLIM0_CH0_TX] = U8500_MSP0_BASE + MSP_TX_RX_REG_OFFSET, | ||
104 | }; | 107 | }; |
105 | 108 | ||
106 | /* Mapping between source event lines and physical device address */ | 109 | /* Mapping between source event lines and physical device address */ |
@@ -133,6 +136,9 @@ static const dma_addr_t dma40_rx_map[DB8500_DMA_NR_DEV] = { | |||
133 | [DB8500_DMA_DEV41_SD_MM3_RX] = -1, | 136 | [DB8500_DMA_DEV41_SD_MM3_RX] = -1, |
134 | [DB8500_DMA_DEV42_SD_MM4_RX] = -1, | 137 | [DB8500_DMA_DEV42_SD_MM4_RX] = -1, |
135 | [DB8500_DMA_DEV43_SD_MM5_RX] = -1, | 138 | [DB8500_DMA_DEV43_SD_MM5_RX] = -1, |
139 | [DB8500_DMA_DEV14_MSP2_RX] = U8500_MSP2_BASE + MSP_TX_RX_REG_OFFSET, | ||
140 | [DB8500_DMA_DEV30_MSP3_RX] = U8500_MSP3_BASE + MSP_TX_RX_REG_OFFSET, | ||
141 | [DB8500_DMA_DEV31_MSP0_RX_SLIM0_CH0_RX] = U8500_MSP0_BASE + MSP_TX_RX_REG_OFFSET, | ||
136 | }; | 142 | }; |
137 | 143 | ||
138 | /* Reserved event lines for memcpy only */ | 144 | /* Reserved event lines for memcpy only */ |
diff --git a/arch/arm/mach-ux500/devices-db8500.h b/arch/arm/mach-ux500/devices-db8500.h index cbd4a9ae8109..9fd93e9da529 100644 --- a/arch/arm/mach-ux500/devices-db8500.h +++ b/arch/arm/mach-ux500/devices-db8500.h | |||
@@ -14,88 +14,114 @@ struct ske_keypad_platform_data; | |||
14 | struct pl022_ssp_controller; | 14 | struct pl022_ssp_controller; |
15 | 15 | ||
16 | static inline struct platform_device * | 16 | static inline struct platform_device * |
17 | db8500_add_ske_keypad(struct ske_keypad_platform_data *pdata) | 17 | db8500_add_ske_keypad(struct device *parent, |
18 | struct ske_keypad_platform_data *pdata, | ||
19 | size_t size) | ||
18 | { | 20 | { |
19 | return dbx500_add_platform_device_4k1irq("nmk-ske-keypad", -1, | 21 | struct resource resources[] = { |
20 | U8500_SKE_BASE, | 22 | DEFINE_RES_MEM(U8500_SKE_BASE, SZ_4K), |
21 | IRQ_DB8500_KB, pdata); | 23 | DEFINE_RES_IRQ(IRQ_DB8500_KB), |
24 | }; | ||
25 | |||
26 | return platform_device_register_resndata(parent, "nmk-ske-keypad", -1, | ||
27 | resources, 2, pdata, size); | ||
22 | } | 28 | } |
23 | 29 | ||
24 | static inline struct amba_device * | 30 | static inline struct amba_device * |
25 | db8500_add_ssp(const char *name, resource_size_t base, int irq, | 31 | db8500_add_ssp(struct device *parent, const char *name, resource_size_t base, |
26 | struct pl022_ssp_controller *pdata) | 32 | int irq, struct pl022_ssp_controller *pdata) |
27 | { | 33 | { |
28 | return dbx500_add_amba_device(name, base, irq, pdata, 0); | 34 | return dbx500_add_amba_device(parent, name, base, irq, pdata, 0); |
29 | } | 35 | } |
30 | 36 | ||
31 | 37 | ||
32 | #define db8500_add_i2c0(pdata) \ | 38 | #define db8500_add_i2c0(parent, pdata) \ |
33 | dbx500_add_i2c(0, U8500_I2C0_BASE, IRQ_DB8500_I2C0, pdata) | 39 | dbx500_add_i2c(parent, 0, U8500_I2C0_BASE, IRQ_DB8500_I2C0, pdata) |
34 | #define db8500_add_i2c1(pdata) \ | 40 | #define db8500_add_i2c1(parent, pdata) \ |
35 | dbx500_add_i2c(1, U8500_I2C1_BASE, IRQ_DB8500_I2C1, pdata) | 41 | dbx500_add_i2c(parent, 1, U8500_I2C1_BASE, IRQ_DB8500_I2C1, pdata) |
36 | #define db8500_add_i2c2(pdata) \ | 42 | #define db8500_add_i2c2(parent, pdata) \ |
37 | dbx500_add_i2c(2, U8500_I2C2_BASE, IRQ_DB8500_I2C2, pdata) | 43 | dbx500_add_i2c(parent, 2, U8500_I2C2_BASE, IRQ_DB8500_I2C2, pdata) |
38 | #define db8500_add_i2c3(pdata) \ | 44 | #define db8500_add_i2c3(parent, pdata) \ |
39 | dbx500_add_i2c(3, U8500_I2C3_BASE, IRQ_DB8500_I2C3, pdata) | 45 | dbx500_add_i2c(parent, 3, U8500_I2C3_BASE, IRQ_DB8500_I2C3, pdata) |
40 | #define db8500_add_i2c4(pdata) \ | 46 | #define db8500_add_i2c4(parent, pdata) \ |
41 | dbx500_add_i2c(4, U8500_I2C4_BASE, IRQ_DB8500_I2C4, pdata) | 47 | dbx500_add_i2c(parent, 4, U8500_I2C4_BASE, IRQ_DB8500_I2C4, pdata) |
42 | 48 | ||
43 | #define db8500_add_msp0_i2s(pdata) \ | 49 | #define db8500_add_msp0_i2s(parent, pdata) \ |
44 | dbx500_add_msp_i2s(0, U8500_MSP0_BASE, IRQ_DB8500_MSP0, pdata) | 50 | dbx500_add_msp_i2s(parent, 0, U8500_MSP0_BASE, IRQ_DB8500_MSP0, pdata) |
45 | #define db8500_add_msp1_i2s(pdata) \ | 51 | #define db8500_add_msp1_i2s(parent, pdata) \ |
46 | dbx500_add_msp_i2s(1, U8500_MSP1_BASE, IRQ_DB8500_MSP1, pdata) | 52 | dbx500_add_msp_i2s(parent, 1, U8500_MSP1_BASE, IRQ_DB8500_MSP1, pdata) |
47 | #define db8500_add_msp2_i2s(pdata) \ | 53 | #define db8500_add_msp2_i2s(parent, pdata) \ |
48 | dbx500_add_msp_i2s(2, U8500_MSP2_BASE, IRQ_DB8500_MSP2, pdata) | 54 | dbx500_add_msp_i2s(parent, 2, U8500_MSP2_BASE, IRQ_DB8500_MSP2, pdata) |
49 | #define db8500_add_msp3_i2s(pdata) \ | 55 | #define db8500_add_msp3_i2s(parent, pdata) \ |
50 | dbx500_add_msp_i2s(3, U8500_MSP3_BASE, IRQ_DB8500_MSP1, pdata) | 56 | dbx500_add_msp_i2s(parent, 3, U8500_MSP3_BASE, IRQ_DB8500_MSP1, pdata) |
51 | 57 | ||
52 | #define db8500_add_msp0_spi(pdata) \ | 58 | #define db8500_add_msp0_spi(parent, pdata) \ |
53 | dbx500_add_msp_spi("msp0", U8500_MSP0_BASE, IRQ_DB8500_MSP0, pdata) | 59 | dbx500_add_msp_spi(parent, "msp0", U8500_MSP0_BASE, \ |
54 | #define db8500_add_msp1_spi(pdata) \ | 60 | IRQ_DB8500_MSP0, pdata) |
55 | dbx500_add_msp_spi("msp1", U8500_MSP1_BASE, IRQ_DB8500_MSP1, pdata) | 61 | #define db8500_add_msp1_spi(parent, pdata) \ |
56 | #define db8500_add_msp2_spi(pdata) \ | 62 | dbx500_add_msp_spi(parent, "msp1", U8500_MSP1_BASE, \ |
57 | dbx500_add_msp_spi("msp2", U8500_MSP2_BASE, IRQ_DB8500_MSP2, pdata) | 63 | IRQ_DB8500_MSP1, pdata) |
58 | #define db8500_add_msp3_spi(pdata) \ | 64 | #define db8500_add_msp2_spi(parent, pdata) \ |
59 | dbx500_add_msp_spi("msp3", U8500_MSP3_BASE, IRQ_DB8500_MSP1, pdata) | 65 | dbx500_add_msp_spi(parent, "msp2", U8500_MSP2_BASE, \ |
60 | 66 | IRQ_DB8500_MSP2, pdata) | |
61 | #define db8500_add_rtc() \ | 67 | #define db8500_add_msp3_spi(parent, pdata) \ |
62 | dbx500_add_rtc(U8500_RTC_BASE, IRQ_DB8500_RTC); | 68 | dbx500_add_msp_spi(parent, "msp3", U8500_MSP3_BASE, \ |
63 | 69 | IRQ_DB8500_MSP1, pdata) | |
64 | #define db8500_add_usb(rx_cfg, tx_cfg) \ | 70 | |
65 | ux500_add_usb(U8500_USBOTG_BASE, IRQ_DB8500_USBOTG, rx_cfg, tx_cfg) | 71 | #define db8500_add_rtc(parent) \ |
66 | 72 | dbx500_add_rtc(parent, U8500_RTC_BASE, IRQ_DB8500_RTC); | |
67 | #define db8500_add_sdi0(pdata, pid) \ | 73 | |
68 | dbx500_add_sdi("sdi0", U8500_SDI0_BASE, IRQ_DB8500_SDMMC0, pdata, pid) | 74 | #define db8500_add_usb(parent, rx_cfg, tx_cfg) \ |
69 | #define db8500_add_sdi1(pdata, pid) \ | 75 | ux500_add_usb(parent, U8500_USBOTG_BASE, \ |
70 | dbx500_add_sdi("sdi1", U8500_SDI1_BASE, IRQ_DB8500_SDMMC1, pdata, pid) | 76 | IRQ_DB8500_USBOTG, rx_cfg, tx_cfg) |
71 | #define db8500_add_sdi2(pdata, pid) \ | 77 | |
72 | dbx500_add_sdi("sdi2", U8500_SDI2_BASE, IRQ_DB8500_SDMMC2, pdata, pid) | 78 | #define db8500_add_sdi0(parent, pdata, pid) \ |
73 | #define db8500_add_sdi3(pdata, pid) \ | 79 | dbx500_add_sdi(parent, "sdi0", U8500_SDI0_BASE, \ |
74 | dbx500_add_sdi("sdi3", U8500_SDI3_BASE, IRQ_DB8500_SDMMC3, pdata, pid) | 80 | IRQ_DB8500_SDMMC0, pdata, pid) |
75 | #define db8500_add_sdi4(pdata, pid) \ | 81 | #define db8500_add_sdi1(parent, pdata, pid) \ |
76 | dbx500_add_sdi("sdi4", U8500_SDI4_BASE, IRQ_DB8500_SDMMC4, pdata, pid) | 82 | dbx500_add_sdi(parent, "sdi1", U8500_SDI1_BASE, \ |
77 | #define db8500_add_sdi5(pdata, pid) \ | 83 | IRQ_DB8500_SDMMC1, pdata, pid) |
78 | dbx500_add_sdi("sdi5", U8500_SDI5_BASE, IRQ_DB8500_SDMMC5, pdata, pid) | 84 | #define db8500_add_sdi2(parent, pdata, pid) \ |
79 | 85 | dbx500_add_sdi(parent, "sdi2", U8500_SDI2_BASE, \ | |
80 | #define db8500_add_ssp0(pdata) \ | 86 | IRQ_DB8500_SDMMC2, pdata, pid) |
81 | db8500_add_ssp("ssp0", U8500_SSP0_BASE, IRQ_DB8500_SSP0, pdata) | 87 | #define db8500_add_sdi3(parent, pdata, pid) \ |
82 | #define db8500_add_ssp1(pdata) \ | 88 | dbx500_add_sdi(parent, "sdi3", U8500_SDI3_BASE, \ |
83 | db8500_add_ssp("ssp1", U8500_SSP1_BASE, IRQ_DB8500_SSP1, pdata) | 89 | IRQ_DB8500_SDMMC3, pdata, pid) |
84 | 90 | #define db8500_add_sdi4(parent, pdata, pid) \ | |
85 | #define db8500_add_spi0(pdata) \ | 91 | dbx500_add_sdi(parent, "sdi4", U8500_SDI4_BASE, \ |
86 | dbx500_add_spi("spi0", U8500_SPI0_BASE, IRQ_DB8500_SPI0, pdata, 0) | 92 | IRQ_DB8500_SDMMC4, pdata, pid) |
87 | #define db8500_add_spi1(pdata) \ | 93 | #define db8500_add_sdi5(parent, pdata, pid) \ |
88 | dbx500_add_spi("spi1", U8500_SPI1_BASE, IRQ_DB8500_SPI1, pdata, 0) | 94 | dbx500_add_sdi(parent, "sdi5", U8500_SDI5_BASE, \ |
89 | #define db8500_add_spi2(pdata) \ | 95 | IRQ_DB8500_SDMMC5, pdata, pid) |
90 | dbx500_add_spi("spi2", U8500_SPI2_BASE, IRQ_DB8500_SPI2, pdata, 0) | 96 | |
91 | #define db8500_add_spi3(pdata) \ | 97 | #define db8500_add_ssp0(parent, pdata) \ |
92 | dbx500_add_spi("spi3", U8500_SPI3_BASE, IRQ_DB8500_SPI3, pdata, 0) | 98 | db8500_add_ssp(parent, "ssp0", U8500_SSP0_BASE, \ |
93 | 99 | IRQ_DB8500_SSP0, pdata) | |
94 | #define db8500_add_uart0(pdata) \ | 100 | #define db8500_add_ssp1(parent, pdata) \ |
95 | dbx500_add_uart("uart0", U8500_UART0_BASE, IRQ_DB8500_UART0, pdata) | 101 | db8500_add_ssp(parent, "ssp1", U8500_SSP1_BASE, \ |
96 | #define db8500_add_uart1(pdata) \ | 102 | IRQ_DB8500_SSP1, pdata) |
97 | dbx500_add_uart("uart1", U8500_UART1_BASE, IRQ_DB8500_UART1, pdata) | 103 | |
98 | #define db8500_add_uart2(pdata) \ | 104 | #define db8500_add_spi0(parent, pdata) \ |
99 | dbx500_add_uart("uart2", U8500_UART2_BASE, IRQ_DB8500_UART2, pdata) | 105 | dbx500_add_spi(parent, "spi0", U8500_SPI0_BASE, \ |
106 | IRQ_DB8500_SPI0, pdata, 0) | ||
107 | #define db8500_add_spi1(parent, pdata) \ | ||
108 | dbx500_add_spi(parent, "spi1", U8500_SPI1_BASE, \ | ||
109 | IRQ_DB8500_SPI1, pdata, 0) | ||
110 | #define db8500_add_spi2(parent, pdata) \ | ||
111 | dbx500_add_spi(parent, "spi2", U8500_SPI2_BASE, \ | ||
112 | IRQ_DB8500_SPI2, pdata, 0) | ||
113 | #define db8500_add_spi3(parent, pdata) \ | ||
114 | dbx500_add_spi(parent, "spi3", U8500_SPI3_BASE, \ | ||
115 | IRQ_DB8500_SPI3, pdata, 0) | ||
116 | |||
117 | #define db8500_add_uart0(parent, pdata) \ | ||
118 | dbx500_add_uart(parent, "uart0", U8500_UART0_BASE, \ | ||
119 | IRQ_DB8500_UART0, pdata) | ||
120 | #define db8500_add_uart1(parent, pdata) \ | ||
121 | dbx500_add_uart(parent, "uart1", U8500_UART1_BASE, \ | ||
122 | IRQ_DB8500_UART1, pdata) | ||
123 | #define db8500_add_uart2(parent, pdata) \ | ||
124 | dbx500_add_uart(parent, "uart2", U8500_UART2_BASE, \ | ||
125 | IRQ_DB8500_UART2, pdata) | ||
100 | 126 | ||
101 | #endif | 127 | #endif |
diff --git a/arch/arm/mach-ux500/dma-db5500.c b/arch/arm/mach-ux500/dma-db5500.c index 1cfab68ae417..41e9470fa0e6 100644 --- a/arch/arm/mach-ux500/dma-db5500.c +++ b/arch/arm/mach-ux500/dma-db5500.c | |||
@@ -125,10 +125,11 @@ static struct platform_device dma40_device = { | |||
125 | .resource = dma40_resources | 125 | .resource = dma40_resources |
126 | }; | 126 | }; |
127 | 127 | ||
128 | void __init db5500_dma_init(void) | 128 | void __init db5500_dma_init(struct device *parent) |
129 | { | 129 | { |
130 | int ret; | 130 | int ret; |
131 | 131 | ||
132 | dma40_device.dev.parent = parent; | ||
132 | ret = platform_device_register(&dma40_device); | 133 | ret = platform_device_register(&dma40_device); |
133 | if (ret) | 134 | if (ret) |
134 | dev_err(&dma40_device.dev, "unable to register device: %d\n", ret); | 135 | dev_err(&dma40_device.dev, "unable to register device: %d\n", ret); |
diff --git a/arch/arm/mach-ux500/include/mach/db8500-regs.h b/arch/arm/mach-ux500/include/mach/db8500-regs.h index 80e10f50282e..9ec20b96d8f2 100644 --- a/arch/arm/mach-ux500/include/mach/db8500-regs.h +++ b/arch/arm/mach-ux500/include/mach/db8500-regs.h | |||
@@ -161,4 +161,7 @@ | |||
161 | #define U8500_MODEM_BASE 0xe000000 | 161 | #define U8500_MODEM_BASE 0xe000000 |
162 | #define U8500_APE_BASE 0x6000000 | 162 | #define U8500_APE_BASE 0x6000000 |
163 | 163 | ||
164 | /* SoC identification number information */ | ||
165 | #define U8500_BB_UID_BASE (U8500_BACKUPRAM1_BASE + 0xFC0) | ||
166 | |||
164 | #endif | 167 | #endif |
diff --git a/arch/arm/mach-ux500/include/mach/entry-macro.S b/arch/arm/mach-ux500/include/mach/entry-macro.S deleted file mode 100644 index e16299e1020a..000000000000 --- a/arch/arm/mach-ux500/include/mach/entry-macro.S +++ /dev/null | |||
@@ -1,18 +0,0 @@ | |||
1 | /* | ||
2 | * Low-level IRQ helper macros for U8500 platforms | ||
3 | * | ||
4 | * Copyright (C) 2009 ST-Ericsson. | ||
5 | * | ||
6 | * This file is a copy of ARM Realview platform. | ||
7 | * -just satisfied checkpatch script. | ||
8 | * | ||
9 | * This file is licensed under the terms of the GNU General Public | ||
10 | * License version 2. This program is licensed "as is" without any | ||
11 | * warranty of any kind, whether express or implied. | ||
12 | */ | ||
13 | |||
14 | .macro disable_fiq | ||
15 | .endm | ||
16 | |||
17 | .macro arch_ret_to_user, tmp1, tmp2 | ||
18 | .endm | ||
diff --git a/arch/arm/mach-ux500/include/mach/hardware.h b/arch/arm/mach-ux500/include/mach/hardware.h index b6ba26a1367d..d93d6dbef25b 100644 --- a/arch/arm/mach-ux500/include/mach/hardware.h +++ b/arch/arm/mach-ux500/include/mach/hardware.h | |||
@@ -30,6 +30,8 @@ | |||
30 | #include <mach/db8500-regs.h> | 30 | #include <mach/db8500-regs.h> |
31 | #include <mach/db5500-regs.h> | 31 | #include <mach/db5500-regs.h> |
32 | 32 | ||
33 | #define MSP_TX_RX_REG_OFFSET 0 | ||
34 | |||
33 | #ifndef __ASSEMBLY__ | 35 | #ifndef __ASSEMBLY__ |
34 | 36 | ||
35 | #include <mach/id.h> | 37 | #include <mach/id.h> |
diff --git a/arch/arm/mach-ux500/include/mach/irqs.h b/arch/arm/mach-ux500/include/mach/irqs.h index 9db68d264c5f..c23a6b5f0c4e 100644 --- a/arch/arm/mach-ux500/include/mach/irqs.h +++ b/arch/arm/mach-ux500/include/mach/irqs.h | |||
@@ -43,7 +43,7 @@ | |||
43 | /* This will be overridden by board-specific irq headers */ | 43 | /* This will be overridden by board-specific irq headers */ |
44 | #define IRQ_BOARD_END IRQ_BOARD_START | 44 | #define IRQ_BOARD_END IRQ_BOARD_START |
45 | 45 | ||
46 | #ifdef CONFIG_MACH_U8500 | 46 | #ifdef CONFIG_MACH_MOP500 |
47 | #include <mach/irqs-board-mop500.h> | 47 | #include <mach/irqs-board-mop500.h> |
48 | #endif | 48 | #endif |
49 | 49 | ||
diff --git a/arch/arm/mach-ux500/include/mach/setup.h b/arch/arm/mach-ux500/include/mach/setup.h index a7d363fdb4cd..3dc00ffa7bfa 100644 --- a/arch/arm/mach-ux500/include/mach/setup.h +++ b/arch/arm/mach-ux500/include/mach/setup.h | |||
@@ -18,17 +18,16 @@ void __init ux500_map_io(void); | |||
18 | extern void __init u5500_map_io(void); | 18 | extern void __init u5500_map_io(void); |
19 | extern void __init u8500_map_io(void); | 19 | extern void __init u8500_map_io(void); |
20 | 20 | ||
21 | extern void __init u5500_init_devices(void); | 21 | extern struct device * __init u5500_init_devices(void); |
22 | extern void __init u8500_init_devices(void); | 22 | extern struct device * __init u8500_init_devices(void); |
23 | 23 | ||
24 | extern void __init ux500_init_irq(void); | 24 | extern void __init ux500_init_irq(void); |
25 | 25 | ||
26 | extern void __init u5500_sdi_init(void); | 26 | extern void __init u5500_sdi_init(struct device *parent); |
27 | 27 | ||
28 | extern void __init db5500_dma_init(void); | 28 | extern void __init db5500_dma_init(struct device *parent); |
29 | 29 | ||
30 | /* We re-use nomadik_timer for this platform */ | 30 | extern struct device *ux500_soc_device_init(const char *soc_id); |
31 | extern void nmdk_timer_init(void); | ||
32 | 31 | ||
33 | struct amba_device; | 32 | struct amba_device; |
34 | extern void __init amba_add_devices(struct amba_device *devs[], int num); | 33 | extern void __init amba_add_devices(struct amba_device *devs[], int num); |
diff --git a/arch/arm/mach-ux500/include/mach/system.h b/arch/arm/mach-ux500/include/mach/system.h deleted file mode 100644 index 258e5c919c24..000000000000 --- a/arch/arm/mach-ux500/include/mach/system.h +++ /dev/null | |||
@@ -1,20 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2009 ST-Ericsson. | ||
3 | * | ||
4 | * This file is licensed under the terms of the GNU General Public | ||
5 | * License version 2. This program is licensed "as is" without any | ||
6 | * warranty of any kind, whether express or implied. | ||
7 | */ | ||
8 | #ifndef __ASM_ARCH_SYSTEM_H | ||
9 | #define __ASM_ARCH_SYSTEM_H | ||
10 | |||
11 | static inline void arch_idle(void) | ||
12 | { | ||
13 | /* | ||
14 | * This should do all the clock switching | ||
15 | * and wait for interrupt tricks | ||
16 | */ | ||
17 | cpu_do_idle(); | ||
18 | } | ||
19 | |||
20 | #endif | ||
diff --git a/arch/arm/mach-ux500/include/mach/usb.h b/arch/arm/mach-ux500/include/mach/usb.h index d3739d418813..4c1cc50a595a 100644 --- a/arch/arm/mach-ux500/include/mach/usb.h +++ b/arch/arm/mach-ux500/include/mach/usb.h | |||
@@ -20,6 +20,6 @@ struct ux500_musb_board_data { | |||
20 | bool (*dma_filter)(struct dma_chan *chan, void *filter_param); | 20 | bool (*dma_filter)(struct dma_chan *chan, void *filter_param); |
21 | }; | 21 | }; |
22 | 22 | ||
23 | void ux500_add_usb(resource_size_t base, int irq, int *dma_rx_cfg, | 23 | void ux500_add_usb(struct device *parent, resource_size_t base, |
24 | int *dma_tx_cfg); | 24 | int irq, int *dma_rx_cfg, int *dma_tx_cfg); |
25 | #endif | 25 | #endif |
diff --git a/arch/arm/mach-ux500/localtimer.c b/arch/arm/mach-ux500/localtimer.c deleted file mode 100644 index 5ba113309a0b..000000000000 --- a/arch/arm/mach-ux500/localtimer.c +++ /dev/null | |||
@@ -1,29 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2008-2009 ST-Ericsson | ||
3 | * Srinidhi Kasagar <srinidhi.kasagar@stericsson.com> | ||
4 | * | ||
5 | * This file is heavily based on relaview platform, almost a copy. | ||
6 | * | ||
7 | * Copyright (C) 2002 ARM Ltd. | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or modify | ||
10 | * it under the terms of the GNU General Public License version 2 as | ||
11 | * published by the Free Software Foundation. | ||
12 | */ | ||
13 | #include <linux/init.h> | ||
14 | #include <linux/smp.h> | ||
15 | #include <linux/clockchips.h> | ||
16 | |||
17 | #include <asm/irq.h> | ||
18 | #include <asm/smp_twd.h> | ||
19 | #include <asm/localtimer.h> | ||
20 | |||
21 | /* | ||
22 | * Setup the local clock events for a CPU. | ||
23 | */ | ||
24 | int __cpuinit local_timer_setup(struct clock_event_device *evt) | ||
25 | { | ||
26 | evt->irq = IRQ_LOCALTIMER; | ||
27 | twd_timer_setup(evt); | ||
28 | return 0; | ||
29 | } | ||
diff --git a/arch/arm/mach-ux500/timer.c b/arch/arm/mach-ux500/timer.c index aea467d04ff7..e9d580702fbb 100644 --- a/arch/arm/mach-ux500/timer.c +++ b/arch/arm/mach-ux500/timer.c | |||
@@ -8,28 +8,46 @@ | |||
8 | #include <linux/errno.h> | 8 | #include <linux/errno.h> |
9 | #include <linux/clksrc-dbx500-prcmu.h> | 9 | #include <linux/clksrc-dbx500-prcmu.h> |
10 | 10 | ||
11 | #include <asm/localtimer.h> | 11 | #include <asm/smp_twd.h> |
12 | 12 | ||
13 | #include <plat/mtu.h> | 13 | #include <plat/mtu.h> |
14 | 14 | ||
15 | #include <mach/setup.h> | 15 | #include <mach/setup.h> |
16 | #include <mach/hardware.h> | 16 | #include <mach/hardware.h> |
17 | #include <mach/irqs.h> | ||
18 | |||
19 | #ifdef CONFIG_HAVE_ARM_TWD | ||
20 | static DEFINE_TWD_LOCAL_TIMER(u5500_twd_local_timer, | ||
21 | U5500_TWD_BASE, IRQ_LOCALTIMER); | ||
22 | static DEFINE_TWD_LOCAL_TIMER(u8500_twd_local_timer, | ||
23 | U8500_TWD_BASE, IRQ_LOCALTIMER); | ||
24 | |||
25 | static void __init ux500_twd_init(void) | ||
26 | { | ||
27 | struct twd_local_timer *twd_local_timer; | ||
28 | int err; | ||
29 | |||
30 | twd_local_timer = cpu_is_u5500() ? &u5500_twd_local_timer : | ||
31 | &u8500_twd_local_timer; | ||
32 | |||
33 | err = twd_local_timer_register(twd_local_timer); | ||
34 | if (err) | ||
35 | pr_err("twd_local_timer_register failed %d\n", err); | ||
36 | } | ||
37 | #else | ||
38 | #define ux500_twd_init() do { } while(0) | ||
39 | #endif | ||
17 | 40 | ||
18 | static void __init ux500_timer_init(void) | 41 | static void __init ux500_timer_init(void) |
19 | { | 42 | { |
43 | void __iomem *mtu_timer_base; | ||
20 | void __iomem *prcmu_timer_base; | 44 | void __iomem *prcmu_timer_base; |
21 | 45 | ||
22 | if (cpu_is_u5500()) { | 46 | if (cpu_is_u5500()) { |
23 | #ifdef CONFIG_LOCAL_TIMERS | 47 | mtu_timer_base = __io_address(U5500_MTU0_BASE); |
24 | twd_base = __io_address(U5500_TWD_BASE); | ||
25 | #endif | ||
26 | mtu_base = __io_address(U5500_MTU0_BASE); | ||
27 | prcmu_timer_base = __io_address(U5500_PRCMU_TIMER_3_BASE); | 48 | prcmu_timer_base = __io_address(U5500_PRCMU_TIMER_3_BASE); |
28 | } else if (cpu_is_u8500()) { | 49 | } else if (cpu_is_u8500()) { |
29 | #ifdef CONFIG_LOCAL_TIMERS | 50 | mtu_timer_base = __io_address(U8500_MTU0_BASE); |
30 | twd_base = __io_address(U8500_TWD_BASE); | ||
31 | #endif | ||
32 | mtu_base = __io_address(U8500_MTU0_BASE); | ||
33 | prcmu_timer_base = __io_address(U8500_PRCMU_TIMER_4_BASE); | 51 | prcmu_timer_base = __io_address(U8500_PRCMU_TIMER_4_BASE); |
34 | } else { | 52 | } else { |
35 | ux500_unknown_soc(); | 53 | ux500_unknown_soc(); |
@@ -52,8 +70,9 @@ static void __init ux500_timer_init(void) | |||
52 | * | 70 | * |
53 | */ | 71 | */ |
54 | 72 | ||
55 | nmdk_timer_init(); | 73 | nmdk_timer_init(mtu_timer_base); |
56 | clksrc_dbx500_prcmu_init(prcmu_timer_base); | 74 | clksrc_dbx500_prcmu_init(prcmu_timer_base); |
75 | ux500_twd_init(); | ||
57 | } | 76 | } |
58 | 77 | ||
59 | static void ux500_timer_reset(void) | 78 | static void ux500_timer_reset(void) |
diff --git a/arch/arm/mach-ux500/usb.c b/arch/arm/mach-ux500/usb.c index 9f9e1c203061..a74af389bc63 100644 --- a/arch/arm/mach-ux500/usb.c +++ b/arch/arm/mach-ux500/usb.c | |||
@@ -7,6 +7,7 @@ | |||
7 | #include <linux/platform_device.h> | 7 | #include <linux/platform_device.h> |
8 | #include <linux/usb/musb.h> | 8 | #include <linux/usb/musb.h> |
9 | #include <linux/dma-mapping.h> | 9 | #include <linux/dma-mapping.h> |
10 | |||
10 | #include <plat/ste_dma40.h> | 11 | #include <plat/ste_dma40.h> |
11 | #include <mach/hardware.h> | 12 | #include <mach/hardware.h> |
12 | #include <mach/usb.h> | 13 | #include <mach/usb.h> |
@@ -140,8 +141,8 @@ static inline void ux500_usb_dma_update_tx_ch_config(int *dst_dev_type) | |||
140 | musb_dma_tx_ch[idx].dst_dev_type = dst_dev_type[idx]; | 141 | musb_dma_tx_ch[idx].dst_dev_type = dst_dev_type[idx]; |
141 | } | 142 | } |
142 | 143 | ||
143 | void ux500_add_usb(resource_size_t base, int irq, int *dma_rx_cfg, | 144 | void ux500_add_usb(struct device *parent, resource_size_t base, int irq, |
144 | int *dma_tx_cfg) | 145 | int *dma_rx_cfg, int *dma_tx_cfg) |
145 | { | 146 | { |
146 | ux500_musb_device.resource[0].start = base; | 147 | ux500_musb_device.resource[0].start = base; |
147 | ux500_musb_device.resource[0].end = base + SZ_64K - 1; | 148 | ux500_musb_device.resource[0].end = base + SZ_64K - 1; |
@@ -151,5 +152,7 @@ void ux500_add_usb(resource_size_t base, int irq, int *dma_rx_cfg, | |||
151 | ux500_usb_dma_update_rx_ch_config(dma_rx_cfg); | 152 | ux500_usb_dma_update_rx_ch_config(dma_rx_cfg); |
152 | ux500_usb_dma_update_tx_ch_config(dma_tx_cfg); | 153 | ux500_usb_dma_update_tx_ch_config(dma_tx_cfg); |
153 | 154 | ||
155 | ux500_musb_device.dev.parent = parent; | ||
156 | |||
154 | platform_device_register(&ux500_musb_device); | 157 | platform_device_register(&ux500_musb_device); |
155 | } | 158 | } |