]> rtime.felk.cvut.cz Git - can-eth-gw-linux.git/blob - arch/arm/mach-ux500/board-mop500.c
Merge branch 'for-next' of git://git.samba.org/sfrench/cifs-2.6
[can-eth-gw-linux.git] / arch / arm / mach-ux500 / board-mop500.c
1
2 /*
3  * Copyright (C) 2008-2009 ST-Ericsson
4  *
5  * Author: Srinidhi KASAGAR <srinidhi.kasagar@stericsson.com>
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License version 2, as
9  * published by the Free Software Foundation.
10  *
11  */
12 #include <linux/kernel.h>
13 #include <linux/init.h>
14 #include <linux/interrupt.h>
15 #include <linux/platform_device.h>
16 #include <linux/io.h>
17 #include <linux/i2c.h>
18 #include <linux/platform_data/i2c-nomadik.h>
19 #include <linux/platform_data/db8500_thermal.h>
20 #include <linux/gpio.h>
21 #include <linux/amba/bus.h>
22 #include <linux/amba/pl022.h>
23 #include <linux/amba/serial.h>
24 #include <linux/spi/spi.h>
25 #include <linux/mfd/abx500/ab8500.h>
26 #include <linux/regulator/ab8500.h>
27 #include <linux/regulator/fixed.h>
28 #include <linux/mfd/tc3589x.h>
29 #include <linux/mfd/tps6105x.h>
30 #include <linux/mfd/abx500/ab8500-gpio.h>
31 #include <linux/mfd/abx500/ab8500-codec.h>
32 #include <linux/leds-lp5521.h>
33 #include <linux/input.h>
34 #include <linux/smsc911x.h>
35 #include <linux/gpio_keys.h>
36 #include <linux/delay.h>
37 #include <linux/of.h>
38 #include <linux/of_platform.h>
39 #include <linux/leds.h>
40 #include <linux/pinctrl/consumer.h>
41 #include <linux/platform_data/pinctrl-nomadik.h>
42
43 #include <asm/mach-types.h>
44 #include <asm/mach/arch.h>
45 #include <asm/hardware/gic.h>
46
47 #include <plat/ste_dma40.h>
48
49 #include <mach/hardware.h>
50 #include <mach/setup.h>
51 #include <mach/devices.h>
52 #include <mach/irqs.h>
53 #include <linux/platform_data/crypto-ux500.h>
54
55 #include "ste-dma40-db8500.h"
56 #include "devices-db8500.h"
57 #include "board-mop500.h"
58 #include "board-mop500-regulators.h"
59
60 static struct gpio_led snowball_led_array[] = {
61         {
62                 .name = "user_led",
63                 .default_trigger = "heartbeat",
64                 .gpio = 142,
65         },
66 };
67
68 static struct gpio_led_platform_data snowball_led_data = {
69         .leds = snowball_led_array,
70         .num_leds = ARRAY_SIZE(snowball_led_array),
71 };
72
73 static struct platform_device snowball_led_dev = {
74         .name = "leds-gpio",
75         .dev = {
76                 .platform_data = &snowball_led_data,
77         },
78 };
79
80 static struct fixed_voltage_config snowball_gpio_en_3v3_data = {
81        .supply_name            = "EN-3V3",
82        .gpio                   = SNOWBALL_EN_3V3_ETH_GPIO,
83        .microvolts             = 3300000,
84        .enable_high            = 1,
85        .init_data              = &gpio_en_3v3_regulator,
86        .startup_delay          = 5000, /* 1200us */
87 };
88
89 static struct platform_device snowball_gpio_en_3v3_regulator_dev = {
90        .name   = "reg-fixed-voltage",
91        .id     = 1,
92        .dev    = {
93                .platform_data  = &snowball_gpio_en_3v3_data,
94        },
95 };
96
97 static struct ab8500_gpio_platform_data ab8500_gpio_pdata = {
98         .gpio_base              = MOP500_AB8500_PIN_GPIO(1),
99         .irq_base               = MOP500_AB8500_VIR_GPIO_IRQ_BASE,
100         /* config_reg is the initial configuration of ab8500 pins.
101          * The pins can be configured as GPIO or alt functions based
102          * on value present in GpioSel1 to GpioSel6 and AlternatFunction
103          * register. This is the array of 7 configuration settings.
104          * One has to compile time decide these settings. Below is the
105          * explanation of these setting
106          * GpioSel1 = 0x00 => Pins GPIO1 to GPIO8 are not used as GPIO
107          * GpioSel2 = 0x1E => Pins GPIO10 to GPIO13 are configured as GPIO
108          * GpioSel3 = 0x80 => Pin GPIO24 is configured as GPIO
109          * GpioSel4 = 0x01 => Pin GPIo25 is configured as GPIO
110          * GpioSel5 = 0x7A => Pins GPIO34, GPIO36 to GPIO39 are conf as GPIO
111          * GpioSel6 = 0x00 => Pins GPIO41 & GPIo42 are not configured as GPIO
112          * AlternaFunction = 0x00 => If Pins GPIO10 to 13 are not configured
113          * as GPIO then this register selectes the alternate fucntions
114          */
115         .config_reg             = {0x00, 0x1E, 0x80, 0x01,
116                                         0x7A, 0x00, 0x00},
117 };
118
119 /* ab8500-codec */
120 static struct ab8500_codec_platform_data ab8500_codec_pdata = {
121         .amics =  {
122                 .mic1_type = AMIC_TYPE_DIFFERENTIAL,
123                 .mic2_type = AMIC_TYPE_DIFFERENTIAL,
124                 .mic1a_micbias = AMIC_MICBIAS_VAMIC1,
125                 .mic1b_micbias = AMIC_MICBIAS_VAMIC1,
126                 .mic2_micbias = AMIC_MICBIAS_VAMIC2
127         },
128         .ear_cmv = EAR_CMV_0_95V
129 };
130
131 static struct gpio_keys_button snowball_key_array[] = {
132         {
133                 .gpio           = 32,
134                 .type           = EV_KEY,
135                 .code           = KEY_1,
136                 .desc           = "userpb",
137                 .active_low     = 1,
138                 .debounce_interval = 50,
139                 .wakeup         = 1,
140         },
141         {
142                 .gpio           = 151,
143                 .type           = EV_KEY,
144                 .code           = KEY_2,
145                 .desc           = "extkb1",
146                 .active_low     = 1,
147                 .debounce_interval = 50,
148                 .wakeup         = 1,
149         },
150         {
151                 .gpio           = 152,
152                 .type           = EV_KEY,
153                 .code           = KEY_3,
154                 .desc           = "extkb2",
155                 .active_low     = 1,
156                 .debounce_interval = 50,
157                 .wakeup         = 1,
158         },
159         {
160                 .gpio           = 161,
161                 .type           = EV_KEY,
162                 .code           = KEY_4,
163                 .desc           = "extkb3",
164                 .active_low     = 1,
165                 .debounce_interval = 50,
166                 .wakeup         = 1,
167         },
168         {
169                 .gpio           = 162,
170                 .type           = EV_KEY,
171                 .code           = KEY_5,
172                 .desc           = "extkb4",
173                 .active_low     = 1,
174                 .debounce_interval = 50,
175                 .wakeup         = 1,
176         },
177 };
178
179 static struct gpio_keys_platform_data snowball_key_data = {
180         .buttons        = snowball_key_array,
181         .nbuttons       = ARRAY_SIZE(snowball_key_array),
182 };
183
184 static struct platform_device snowball_key_dev = {
185         .name           = "gpio-keys",
186         .id             = -1,
187         .dev            = {
188                 .platform_data  = &snowball_key_data,
189         }
190 };
191
192 static struct smsc911x_platform_config snowball_sbnet_cfg = {
193         .irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_HIGH,
194         .irq_type = SMSC911X_IRQ_TYPE_PUSH_PULL,
195         .flags = SMSC911X_USE_16BIT | SMSC911X_FORCE_INTERNAL_PHY,
196         .shift = 1,
197 };
198
199 static struct resource sbnet_res[] = {
200         {
201                 .name = "smsc911x-memory",
202                 .start = (0x5000 << 16),
203                 .end  =  (0x5000 << 16) + 0xffff,
204                 .flags = IORESOURCE_MEM,
205         },
206         {
207                 .start = NOMADIK_GPIO_TO_IRQ(140),
208                 .end = NOMADIK_GPIO_TO_IRQ(140),
209                 .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE,
210         },
211 };
212
213 static struct platform_device snowball_sbnet_dev = {
214         .name           = "smsc911x",
215         .num_resources  = ARRAY_SIZE(sbnet_res),
216         .resource       = sbnet_res,
217         .dev            = {
218                 .platform_data = &snowball_sbnet_cfg,
219         },
220 };
221
222 static struct ab8500_platform_data ab8500_platdata = {
223         .irq_base       = MOP500_AB8500_IRQ_BASE,
224         .regulator_reg_init = ab8500_regulator_reg_init,
225         .num_regulator_reg_init = ARRAY_SIZE(ab8500_regulator_reg_init),
226         .regulator      = ab8500_regulators,
227         .num_regulator  = ARRAY_SIZE(ab8500_regulators),
228         .gpio           = &ab8500_gpio_pdata,
229         .codec          = &ab8500_codec_pdata,
230 };
231
232 /*
233  * Thermal Sensor
234  */
235
236 static struct resource db8500_thsens_resources[] = {
237         {
238                 .name = "IRQ_HOTMON_LOW",
239                 .start  = IRQ_PRCMU_HOTMON_LOW,
240                 .end    = IRQ_PRCMU_HOTMON_LOW,
241                 .flags  = IORESOURCE_IRQ,
242         },
243         {
244                 .name = "IRQ_HOTMON_HIGH",
245                 .start  = IRQ_PRCMU_HOTMON_HIGH,
246                 .end    = IRQ_PRCMU_HOTMON_HIGH,
247                 .flags  = IORESOURCE_IRQ,
248         },
249 };
250
251 static struct db8500_thsens_platform_data db8500_thsens_data = {
252         .trip_points[0] = {
253                 .temp = 70000,
254                 .type = THERMAL_TRIP_ACTIVE,
255                 .cdev_name = {
256                         [0] = "thermal-cpufreq-0",
257                 },
258         },
259         .trip_points[1] = {
260                 .temp = 75000,
261                 .type = THERMAL_TRIP_ACTIVE,
262                 .cdev_name = {
263                         [0] = "thermal-cpufreq-0",
264                 },
265         },
266         .trip_points[2] = {
267                 .temp = 80000,
268                 .type = THERMAL_TRIP_ACTIVE,
269                 .cdev_name = {
270                         [0] = "thermal-cpufreq-0",
271                 },
272         },
273         .trip_points[3] = {
274                 .temp = 85000,
275                 .type = THERMAL_TRIP_CRITICAL,
276         },
277         .num_trips = 4,
278 };
279
280 static struct platform_device u8500_thsens_device = {
281         .name           = "db8500-thermal",
282         .resource       = db8500_thsens_resources,
283         .num_resources  = ARRAY_SIZE(db8500_thsens_resources),
284         .dev    = {
285                 .platform_data  = &db8500_thsens_data,
286         },
287 };
288
289 static struct platform_device u8500_cpufreq_cooling_device = {
290         .name           = "db8500-cpufreq-cooling",
291 };
292
293 /*
294  * TPS61052
295  */
296
297 static struct tps6105x_platform_data mop500_tps61052_data = {
298         .mode = TPS6105X_MODE_VOLTAGE,
299         .regulator_data = &tps61052_regulator,
300 };
301
302 /*
303  * TC35892
304  */
305
306 static void mop500_tc35892_init(struct tc3589x *tc3589x, unsigned int base)
307 {
308         struct device *parent = NULL;
309 #if 0
310         /* FIXME: Is the sdi actually part of tc3589x? */
311         parent = tc3589x->dev;
312 #endif
313         mop500_sdi_tc35892_init(parent);
314 }
315
316 static struct tc3589x_gpio_platform_data mop500_tc35892_gpio_data = {
317         .gpio_base      = MOP500_EGPIO(0),
318         .setup          = mop500_tc35892_init,
319 };
320
321 static struct tc3589x_platform_data mop500_tc35892_data = {
322         .block          = TC3589x_BLOCK_GPIO,
323         .gpio           = &mop500_tc35892_gpio_data,
324         .irq_base       = MOP500_EGPIO_IRQ_BASE,
325 };
326
327 static struct lp5521_led_config lp5521_pri_led[] = {
328        [0] = {
329                .chan_nr = 0,
330                .led_current = 0x2f,
331                .max_current = 0x5f,
332        },
333        [1] = {
334                .chan_nr = 1,
335                .led_current = 0x2f,
336                .max_current = 0x5f,
337        },
338        [2] = {
339                .chan_nr = 2,
340                .led_current = 0x2f,
341                .max_current = 0x5f,
342        },
343 };
344
345 static struct lp5521_platform_data __initdata lp5521_pri_data = {
346        .label = "lp5521_pri",
347        .led_config     = &lp5521_pri_led[0],
348        .num_channels   = 3,
349        .clock_mode     = LP5521_CLOCK_EXT,
350 };
351
352 static struct lp5521_led_config lp5521_sec_led[] = {
353        [0] = {
354                .chan_nr = 0,
355                .led_current = 0x2f,
356                .max_current = 0x5f,
357        },
358        [1] = {
359                .chan_nr = 1,
360                .led_current = 0x2f,
361                .max_current = 0x5f,
362        },
363        [2] = {
364                .chan_nr = 2,
365                .led_current = 0x2f,
366                .max_current = 0x5f,
367        },
368 };
369
370 static struct lp5521_platform_data __initdata lp5521_sec_data = {
371        .label = "lp5521_sec",
372        .led_config     = &lp5521_sec_led[0],
373        .num_channels   = 3,
374        .clock_mode     = LP5521_CLOCK_EXT,
375 };
376
377 static struct i2c_board_info __initdata mop500_i2c0_devices[] = {
378         {
379                 I2C_BOARD_INFO("tc3589x", 0x42),
380                 .irq            = NOMADIK_GPIO_TO_IRQ(217),
381                 .platform_data  = &mop500_tc35892_data,
382         },
383         /* I2C0 devices only available prior to HREFv60 */
384         {
385                 I2C_BOARD_INFO("tps61052", 0x33),
386                 .platform_data  = &mop500_tps61052_data,
387         },
388 };
389
390 #define NUM_PRE_V60_I2C0_DEVICES 1
391
392 static struct i2c_board_info __initdata mop500_i2c2_devices[] = {
393         {
394                 /* lp5521 LED driver, 1st device */
395                 I2C_BOARD_INFO("lp5521", 0x33),
396                 .platform_data = &lp5521_pri_data,
397         },
398         {
399                 /* lp5521 LED driver, 2st device */
400                 I2C_BOARD_INFO("lp5521", 0x34),
401                 .platform_data = &lp5521_sec_data,
402         },
403         {
404                 /* Light sensor Rohm BH1780GLI */
405                 I2C_BOARD_INFO("bh1780", 0x29),
406         },
407 };
408
409 static void __init mop500_i2c_init(struct device *parent)
410 {
411         db8500_add_i2c0(parent, NULL);
412         db8500_add_i2c1(parent, NULL);
413         db8500_add_i2c2(parent, NULL);
414         db8500_add_i2c3(parent, NULL);
415 }
416
417 static struct gpio_keys_button mop500_gpio_keys[] = {
418         {
419                 .desc                   = "SFH7741 Proximity Sensor",
420                 .type                   = EV_SW,
421                 .code                   = SW_FRONT_PROXIMITY,
422                 .active_low             = 0,
423                 .can_disable            = 1,
424         }
425 };
426
427 static struct regulator *prox_regulator;
428 static int mop500_prox_activate(struct device *dev);
429 static void mop500_prox_deactivate(struct device *dev);
430
431 static struct gpio_keys_platform_data mop500_gpio_keys_data = {
432         .buttons        = mop500_gpio_keys,
433         .nbuttons       = ARRAY_SIZE(mop500_gpio_keys),
434         .enable         = mop500_prox_activate,
435         .disable        = mop500_prox_deactivate,
436 };
437
438 static struct platform_device mop500_gpio_keys_device = {
439         .name   = "gpio-keys",
440         .id     = 0,
441         .dev    = {
442                 .platform_data  = &mop500_gpio_keys_data,
443         },
444 };
445
446 static int mop500_prox_activate(struct device *dev)
447 {
448         prox_regulator = regulator_get(&mop500_gpio_keys_device.dev,
449                                                 "vcc");
450         if (IS_ERR(prox_regulator)) {
451                 dev_err(&mop500_gpio_keys_device.dev,
452                         "no regulator\n");
453                 return PTR_ERR(prox_regulator);
454         }
455         regulator_enable(prox_regulator);
456         return 0;
457 }
458
459 static void mop500_prox_deactivate(struct device *dev)
460 {
461         regulator_disable(prox_regulator);
462         regulator_put(prox_regulator);
463 }
464
465 static struct cryp_platform_data u8500_cryp1_platform_data = {
466                 .mem_to_engine = {
467                                 .dir = STEDMA40_MEM_TO_PERIPH,
468                                 .src_dev_type = STEDMA40_DEV_SRC_MEMORY,
469                                 .dst_dev_type = DB8500_DMA_DEV48_CAC1_TX,
470                                 .src_info.data_width = STEDMA40_WORD_WIDTH,
471                                 .dst_info.data_width = STEDMA40_WORD_WIDTH,
472                                 .mode = STEDMA40_MODE_LOGICAL,
473                                 .src_info.psize = STEDMA40_PSIZE_LOG_4,
474                                 .dst_info.psize = STEDMA40_PSIZE_LOG_4,
475                 },
476                 .engine_to_mem = {
477                                 .dir = STEDMA40_PERIPH_TO_MEM,
478                                 .src_dev_type = DB8500_DMA_DEV48_CAC1_RX,
479                                 .dst_dev_type = STEDMA40_DEV_DST_MEMORY,
480                                 .src_info.data_width = STEDMA40_WORD_WIDTH,
481                                 .dst_info.data_width = STEDMA40_WORD_WIDTH,
482                                 .mode = STEDMA40_MODE_LOGICAL,
483                                 .src_info.psize = STEDMA40_PSIZE_LOG_4,
484                                 .dst_info.psize = STEDMA40_PSIZE_LOG_4,
485                 }
486 };
487
488 static struct stedma40_chan_cfg u8500_hash_dma_cfg_tx = {
489                 .dir = STEDMA40_MEM_TO_PERIPH,
490                 .src_dev_type = STEDMA40_DEV_SRC_MEMORY,
491                 .dst_dev_type = DB8500_DMA_DEV50_HAC1_TX,
492                 .src_info.data_width = STEDMA40_WORD_WIDTH,
493                 .dst_info.data_width = STEDMA40_WORD_WIDTH,
494                 .mode = STEDMA40_MODE_LOGICAL,
495                 .src_info.psize = STEDMA40_PSIZE_LOG_16,
496                 .dst_info.psize = STEDMA40_PSIZE_LOG_16,
497 };
498
499 static struct hash_platform_data u8500_hash1_platform_data = {
500                 .mem_to_engine = &u8500_hash_dma_cfg_tx,
501                 .dma_filter = stedma40_filter,
502 };
503
504 /* add any platform devices here - TODO */
505 static struct platform_device *mop500_platform_devs[] __initdata = {
506         &mop500_gpio_keys_device,
507 };
508
509 #ifdef CONFIG_STE_DMA40
510 static struct stedma40_chan_cfg ssp0_dma_cfg_rx = {
511         .mode = STEDMA40_MODE_LOGICAL,
512         .dir = STEDMA40_PERIPH_TO_MEM,
513         .src_dev_type =  DB8500_DMA_DEV8_SSP0_RX,
514         .dst_dev_type = STEDMA40_DEV_DST_MEMORY,
515         .src_info.data_width = STEDMA40_BYTE_WIDTH,
516         .dst_info.data_width = STEDMA40_BYTE_WIDTH,
517 };
518
519 static struct stedma40_chan_cfg ssp0_dma_cfg_tx = {
520         .mode = STEDMA40_MODE_LOGICAL,
521         .dir = STEDMA40_MEM_TO_PERIPH,
522         .src_dev_type = STEDMA40_DEV_SRC_MEMORY,
523         .dst_dev_type = DB8500_DMA_DEV8_SSP0_TX,
524         .src_info.data_width = STEDMA40_BYTE_WIDTH,
525         .dst_info.data_width = STEDMA40_BYTE_WIDTH,
526 };
527 #endif
528
529 static struct pl022_ssp_controller ssp0_plat = {
530         .bus_id = 0,
531 #ifdef CONFIG_STE_DMA40
532         .enable_dma = 1,
533         .dma_filter = stedma40_filter,
534         .dma_rx_param = &ssp0_dma_cfg_rx,
535         .dma_tx_param = &ssp0_dma_cfg_tx,
536 #else
537         .enable_dma = 0,
538 #endif
539         /* on this platform, gpio 31,142,144,214 &
540          * 224 are connected as chip selects
541          */
542         .num_chipselect = 5,
543 };
544
545 static void __init mop500_spi_init(struct device *parent)
546 {
547         db8500_add_ssp0(parent, &ssp0_plat);
548 }
549
550 #ifdef CONFIG_STE_DMA40
551 static struct stedma40_chan_cfg uart0_dma_cfg_rx = {
552         .mode = STEDMA40_MODE_LOGICAL,
553         .dir = STEDMA40_PERIPH_TO_MEM,
554         .src_dev_type =  DB8500_DMA_DEV13_UART0_RX,
555         .dst_dev_type = STEDMA40_DEV_DST_MEMORY,
556         .src_info.data_width = STEDMA40_BYTE_WIDTH,
557         .dst_info.data_width = STEDMA40_BYTE_WIDTH,
558 };
559
560 static struct stedma40_chan_cfg uart0_dma_cfg_tx = {
561         .mode = STEDMA40_MODE_LOGICAL,
562         .dir = STEDMA40_MEM_TO_PERIPH,
563         .src_dev_type = STEDMA40_DEV_SRC_MEMORY,
564         .dst_dev_type = DB8500_DMA_DEV13_UART0_TX,
565         .src_info.data_width = STEDMA40_BYTE_WIDTH,
566         .dst_info.data_width = STEDMA40_BYTE_WIDTH,
567 };
568
569 static struct stedma40_chan_cfg uart1_dma_cfg_rx = {
570         .mode = STEDMA40_MODE_LOGICAL,
571         .dir = STEDMA40_PERIPH_TO_MEM,
572         .src_dev_type =  DB8500_DMA_DEV12_UART1_RX,
573         .dst_dev_type = STEDMA40_DEV_DST_MEMORY,
574         .src_info.data_width = STEDMA40_BYTE_WIDTH,
575         .dst_info.data_width = STEDMA40_BYTE_WIDTH,
576 };
577
578 static struct stedma40_chan_cfg uart1_dma_cfg_tx = {
579         .mode = STEDMA40_MODE_LOGICAL,
580         .dir = STEDMA40_MEM_TO_PERIPH,
581         .src_dev_type = STEDMA40_DEV_SRC_MEMORY,
582         .dst_dev_type = DB8500_DMA_DEV12_UART1_TX,
583         .src_info.data_width = STEDMA40_BYTE_WIDTH,
584         .dst_info.data_width = STEDMA40_BYTE_WIDTH,
585 };
586
587 static struct stedma40_chan_cfg uart2_dma_cfg_rx = {
588         .mode = STEDMA40_MODE_LOGICAL,
589         .dir = STEDMA40_PERIPH_TO_MEM,
590         .src_dev_type =  DB8500_DMA_DEV11_UART2_RX,
591         .dst_dev_type = STEDMA40_DEV_DST_MEMORY,
592         .src_info.data_width = STEDMA40_BYTE_WIDTH,
593         .dst_info.data_width = STEDMA40_BYTE_WIDTH,
594 };
595
596 static struct stedma40_chan_cfg uart2_dma_cfg_tx = {
597         .mode = STEDMA40_MODE_LOGICAL,
598         .dir = STEDMA40_MEM_TO_PERIPH,
599         .src_dev_type = STEDMA40_DEV_SRC_MEMORY,
600         .dst_dev_type = DB8500_DMA_DEV11_UART2_TX,
601         .src_info.data_width = STEDMA40_BYTE_WIDTH,
602         .dst_info.data_width = STEDMA40_BYTE_WIDTH,
603 };
604 #endif
605
606 static struct amba_pl011_data uart0_plat = {
607 #ifdef CONFIG_STE_DMA40
608         .dma_filter = stedma40_filter,
609         .dma_rx_param = &uart0_dma_cfg_rx,
610         .dma_tx_param = &uart0_dma_cfg_tx,
611 #endif
612 };
613
614 static struct amba_pl011_data uart1_plat = {
615 #ifdef CONFIG_STE_DMA40
616         .dma_filter = stedma40_filter,
617         .dma_rx_param = &uart1_dma_cfg_rx,
618         .dma_tx_param = &uart1_dma_cfg_tx,
619 #endif
620 };
621
622 static struct amba_pl011_data uart2_plat = {
623 #ifdef CONFIG_STE_DMA40
624         .dma_filter = stedma40_filter,
625         .dma_rx_param = &uart2_dma_cfg_rx,
626         .dma_tx_param = &uart2_dma_cfg_tx,
627 #endif
628 };
629
630 static void __init mop500_uart_init(struct device *parent)
631 {
632         db8500_add_uart0(parent, &uart0_plat);
633         db8500_add_uart1(parent, &uart1_plat);
634         db8500_add_uart2(parent, &uart2_plat);
635 }
636
637 static void __init u8500_cryp1_hash1_init(struct device *parent)
638 {
639         db8500_add_cryp1(parent, &u8500_cryp1_platform_data);
640         db8500_add_hash1(parent, &u8500_hash1_platform_data);
641 }
642
643 static struct platform_device *snowball_platform_devs[] __initdata = {
644         &snowball_led_dev,
645         &snowball_key_dev,
646         &snowball_sbnet_dev,
647         &snowball_gpio_en_3v3_regulator_dev,
648         &u8500_thsens_device,
649         &u8500_cpufreq_cooling_device,
650 };
651
652 static void __init mop500_init_machine(void)
653 {
654         struct device *parent = NULL;
655         int i2c0_devs;
656         int i;
657
658         mop500_gpio_keys[0].gpio = GPIO_PROX_SENSOR;
659
660         mop500_pinmaps_init();
661         parent = u8500_init_devices(&ab8500_platdata);
662
663         for (i = 0; i < ARRAY_SIZE(mop500_platform_devs); i++)
664                 mop500_platform_devs[i]->dev.parent = parent;
665
666         platform_add_devices(mop500_platform_devs,
667                         ARRAY_SIZE(mop500_platform_devs));
668
669         mop500_i2c_init(parent);
670         mop500_sdi_init(parent);
671         mop500_spi_init(parent);
672         mop500_audio_init(parent);
673         mop500_uart_init(parent);
674
675         u8500_cryp1_hash1_init(parent);
676
677         i2c0_devs = ARRAY_SIZE(mop500_i2c0_devices);
678
679         i2c_register_board_info(0, mop500_i2c0_devices, i2c0_devs);
680         i2c_register_board_info(2, mop500_i2c2_devices,
681                                 ARRAY_SIZE(mop500_i2c2_devices));
682
683         /* This board has full regulator constraints */
684         regulator_has_full_constraints();
685
686         mop500_uib_init();
687 }
688
689 static void __init snowball_init_machine(void)
690 {
691         struct device *parent = NULL;
692         int i;
693
694         snowball_pinmaps_init();
695         parent = u8500_init_devices(&ab8500_platdata);
696
697         for (i = 0; i < ARRAY_SIZE(snowball_platform_devs); i++)
698                 snowball_platform_devs[i]->dev.parent = parent;
699
700         platform_add_devices(snowball_platform_devs,
701                         ARRAY_SIZE(snowball_platform_devs));
702
703         mop500_i2c_init(parent);
704         snowball_sdi_init(parent);
705         mop500_spi_init(parent);
706         mop500_audio_init(parent);
707         mop500_uart_init(parent);
708
709         /* This board has full regulator constraints */
710         regulator_has_full_constraints();
711 }
712
713 static void __init hrefv60_init_machine(void)
714 {
715         struct device *parent = NULL;
716         int i2c0_devs;
717         int i;
718
719         /*
720          * The HREFv60 board removed a GPIO expander and routed
721          * all these GPIO pins to the internal GPIO controller
722          * instead.
723          */
724         mop500_gpio_keys[0].gpio = HREFV60_PROX_SENSE_GPIO;
725
726         hrefv60_pinmaps_init();
727         parent = u8500_init_devices(&ab8500_platdata);
728
729         for (i = 0; i < ARRAY_SIZE(mop500_platform_devs); i++)
730                 mop500_platform_devs[i]->dev.parent = parent;
731
732         platform_add_devices(mop500_platform_devs,
733                         ARRAY_SIZE(mop500_platform_devs));
734
735         mop500_i2c_init(parent);
736         hrefv60_sdi_init(parent);
737         mop500_spi_init(parent);
738         mop500_audio_init(parent);
739         mop500_uart_init(parent);
740
741         i2c0_devs = ARRAY_SIZE(mop500_i2c0_devices);
742
743         i2c0_devs -= NUM_PRE_V60_I2C0_DEVICES;
744
745         i2c_register_board_info(0, mop500_i2c0_devices, i2c0_devs);
746         i2c_register_board_info(2, mop500_i2c2_devices,
747                                 ARRAY_SIZE(mop500_i2c2_devices));
748
749         /* This board has full regulator constraints */
750         regulator_has_full_constraints();
751
752         mop500_uib_init();
753 }
754
755 MACHINE_START(U8500, "ST-Ericsson MOP500 platform")
756         /* Maintainer: Srinidhi Kasagar <srinidhi.kasagar@stericsson.com> */
757         .atag_offset    = 0x100,
758         .smp            = smp_ops(ux500_smp_ops),
759         .map_io         = u8500_map_io,
760         .init_irq       = ux500_init_irq,
761         /* we re-use nomadik timer here */
762         .timer          = &ux500_timer,
763         .handle_irq     = gic_handle_irq,
764         .init_machine   = mop500_init_machine,
765         .init_late      = ux500_init_late,
766 MACHINE_END
767
768 MACHINE_START(HREFV60, "ST-Ericsson U8500 Platform HREFv60+")
769         .atag_offset    = 0x100,
770         .smp            = smp_ops(ux500_smp_ops),
771         .map_io         = u8500_map_io,
772         .init_irq       = ux500_init_irq,
773         .timer          = &ux500_timer,
774         .handle_irq     = gic_handle_irq,
775         .init_machine   = hrefv60_init_machine,
776         .init_late      = ux500_init_late,
777 MACHINE_END
778
779 MACHINE_START(SNOWBALL, "Calao Systems Snowball platform")
780         .atag_offset    = 0x100,
781         .smp            = smp_ops(ux500_smp_ops),
782         .map_io         = u8500_map_io,
783         .init_irq       = ux500_init_irq,
784         /* we re-use nomadik timer here */
785         .timer          = &ux500_timer,
786         .handle_irq     = gic_handle_irq,
787         .init_machine   = snowball_init_machine,
788         .init_late      = ux500_init_late,
789 MACHINE_END
790
791 #ifdef CONFIG_MACH_UX500_DT
792
793 struct of_dev_auxdata u8500_auxdata_lookup[] __initdata = {
794         /* Requires call-back bindings. */
795         OF_DEV_AUXDATA("arm,cortex-a9-pmu", 0, "arm-pmu", &db8500_pmu_platdata),
796         /* Requires DMA and call-back bindings. */
797         OF_DEV_AUXDATA("arm,pl011", 0x80120000, "uart0", &uart0_plat),
798         OF_DEV_AUXDATA("arm,pl011", 0x80121000, "uart1", &uart1_plat),
799         OF_DEV_AUXDATA("arm,pl011", 0x80007000, "uart2", &uart2_plat),
800         /* Requires DMA bindings. */
801         OF_DEV_AUXDATA("arm,pl022", 0x80002000, "ssp0",  &ssp0_plat),
802         OF_DEV_AUXDATA("arm,pl18x", 0x80126000, "sdi0",  &mop500_sdi0_data),
803         OF_DEV_AUXDATA("arm,pl18x", 0x80118000, "sdi1",  &mop500_sdi1_data),
804         OF_DEV_AUXDATA("arm,pl18x", 0x80005000, "sdi2",  &mop500_sdi2_data),
805         OF_DEV_AUXDATA("arm,pl18x", 0x80114000, "sdi4",  &mop500_sdi4_data),
806         /* Requires clock name bindings. */
807         OF_DEV_AUXDATA("st,nomadik-gpio", 0x8012e000, "gpio.0", NULL),
808         OF_DEV_AUXDATA("st,nomadik-gpio", 0x8012e080, "gpio.1", NULL),
809         OF_DEV_AUXDATA("st,nomadik-gpio", 0x8000e000, "gpio.2", NULL),
810         OF_DEV_AUXDATA("st,nomadik-gpio", 0x8000e080, "gpio.3", NULL),
811         OF_DEV_AUXDATA("st,nomadik-gpio", 0x8000e100, "gpio.4", NULL),
812         OF_DEV_AUXDATA("st,nomadik-gpio", 0x8000e180, "gpio.5", NULL),
813         OF_DEV_AUXDATA("st,nomadik-gpio", 0x8011e000, "gpio.6", NULL),
814         OF_DEV_AUXDATA("st,nomadik-gpio", 0x8011e080, "gpio.7", NULL),
815         OF_DEV_AUXDATA("st,nomadik-gpio", 0xa03fe000, "gpio.8", NULL),
816         OF_DEV_AUXDATA("st,nomadik-i2c", 0x80004000, "nmk-i2c.0", NULL),
817         OF_DEV_AUXDATA("st,nomadik-i2c", 0x80122000, "nmk-i2c.1", NULL),
818         OF_DEV_AUXDATA("st,nomadik-i2c", 0x80128000, "nmk-i2c.2", NULL),
819         OF_DEV_AUXDATA("st,nomadik-i2c", 0x80110000, "nmk-i2c.3", NULL),
820         OF_DEV_AUXDATA("st,nomadik-i2c", 0x8012a000, "nmk-i2c.4", NULL),
821         /* Requires device name bindings. */
822         OF_DEV_AUXDATA("stericsson,nmk_pinctrl", 0, "pinctrl-db8500", NULL),
823         /* Requires clock name and DMA bindings. */
824         OF_DEV_AUXDATA("stericsson,ux500-msp-i2s", 0x80123000,
825                 "ux500-msp-i2s.0", &msp0_platform_data),
826         OF_DEV_AUXDATA("stericsson,ux500-msp-i2s", 0x80124000,
827                 "ux500-msp-i2s.1", &msp1_platform_data),
828         OF_DEV_AUXDATA("stericsson,ux500-msp-i2s", 0x80117000,
829                 "ux500-msp-i2s.2", &msp2_platform_data),
830         OF_DEV_AUXDATA("stericsson,ux500-msp-i2s", 0x80125000,
831                 "ux500-msp-i2s.3", &msp3_platform_data),
832         {},
833 };
834
835 static const struct of_device_id u8500_local_bus_nodes[] = {
836         /* only create devices below soc node */
837         { .compatible = "stericsson,db8500", },
838         { .compatible = "stericsson,db8500-prcmu", },
839         { .compatible = "simple-bus"},
840         { },
841 };
842
843 static void __init u8500_init_machine(void)
844 {
845         struct device *parent = NULL;
846         int i2c0_devs;
847         int i;
848
849         /* Pinmaps must be in place before devices register */
850         if (of_machine_is_compatible("st-ericsson,mop500"))
851                 mop500_pinmaps_init();
852         else if (of_machine_is_compatible("calaosystems,snowball-a9500"))
853                 snowball_pinmaps_init();
854         else if (of_machine_is_compatible("st-ericsson,hrefv60+"))
855                 hrefv60_pinmaps_init();
856
857         parent = u8500_of_init_devices();
858
859         for (i = 0; i < ARRAY_SIZE(mop500_platform_devs); i++)
860                 mop500_platform_devs[i]->dev.parent = parent;
861
862         /* automatically probe child nodes of db8500 device */
863         of_platform_populate(NULL, u8500_local_bus_nodes, u8500_auxdata_lookup, parent);
864
865         if (of_machine_is_compatible("st-ericsson,mop500")) {
866                 mop500_gpio_keys[0].gpio = GPIO_PROX_SENSOR;
867
868                 platform_add_devices(mop500_platform_devs,
869                                 ARRAY_SIZE(mop500_platform_devs));
870
871                 mop500_sdi_init(parent);
872                 mop500_audio_init(parent);
873                 i2c0_devs = ARRAY_SIZE(mop500_i2c0_devices);
874                 i2c_register_board_info(0, mop500_i2c0_devices, i2c0_devs);
875                 i2c_register_board_info(2, mop500_i2c2_devices,
876                                         ARRAY_SIZE(mop500_i2c2_devices));
877
878                 mop500_uib_init();
879
880         } else if (of_machine_is_compatible("calaosystems,snowball-a9500")) {
881                 mop500_of_audio_init(parent);
882         } else if (of_machine_is_compatible("st-ericsson,hrefv60+")) {
883                 /*
884                  * The HREFv60 board removed a GPIO expander and routed
885                  * all these GPIO pins to the internal GPIO controller
886                  * instead.
887                  */
888                 mop500_gpio_keys[0].gpio = HREFV60_PROX_SENSE_GPIO;
889                 platform_add_devices(mop500_platform_devs,
890                                 ARRAY_SIZE(mop500_platform_devs));
891
892                 mop500_uib_init();
893         }
894
895         /* This board has full regulator constraints */
896         regulator_has_full_constraints();
897 }
898
899 static const char * u8500_dt_board_compat[] = {
900         "calaosystems,snowball-a9500",
901         "st-ericsson,hrefv60+",
902         "st-ericsson,u8500",
903         "st-ericsson,mop500",
904         NULL,
905 };
906
907
908 DT_MACHINE_START(U8500_DT, "ST-Ericsson U8500 platform (Device Tree Support)")
909         .smp            = smp_ops(ux500_smp_ops),
910         .map_io         = u8500_map_io,
911         .init_irq       = ux500_init_irq,
912         /* we re-use nomadik timer here */
913         .timer          = &ux500_timer,
914         .handle_irq     = gic_handle_irq,
915         .init_machine   = u8500_init_machine,
916         .init_late      = ux500_init_late,
917         .dt_compat      = u8500_dt_board_compat,
918 MACHINE_END
919 #endif