1
2
3
4
5
6
7
8
9
10
11#include <linux/kernel.h>
12#include <linux/init.h>
13#include <linux/interrupt.h>
14#include <linux/platform_device.h>
15#include <linux/io.h>
16#include <linux/i2c.h>
17#include <linux/gpio.h>
18#include <linux/amba/bus.h>
19#include <linux/amba/pl022.h>
20#include <linux/amba/serial.h>
21#include <linux/spi/spi.h>
22#include <linux/mfd/ab8500.h>
23#include <linux/regulator/ab8500.h>
24#include <linux/mfd/tc3589x.h>
25#include <linux/mfd/tps6105x.h>
26#include <linux/mfd/ab8500/gpio.h>
27#include <linux/leds-lp5521.h>
28#include <linux/input.h>
29#include <linux/smsc911x.h>
30#include <linux/gpio_keys.h>
31#include <linux/delay.h>
32
33#include <linux/leds.h>
34#include <asm/mach-types.h>
35#include <asm/mach/arch.h>
36
37#include <plat/i2c.h>
38#include <plat/ste_dma40.h>
39#include <plat/pincfg.h>
40
41#include <mach/hardware.h>
42#include <mach/setup.h>
43#include <mach/devices.h>
44#include <mach/irqs.h>
45
46#include "pins-db8500.h"
47#include "ste-dma40-db8500.h"
48#include "devices-db8500.h"
49#include "board-mop500.h"
50#include "board-mop500-regulators.h"
51
52static struct gpio_led snowball_led_array[] = {
53 {
54 .name = "user_led",
55 .default_trigger = "none",
56 .gpio = 142,
57 },
58};
59
60static struct gpio_led_platform_data snowball_led_data = {
61 .leds = snowball_led_array,
62 .num_leds = ARRAY_SIZE(snowball_led_array),
63};
64
65static struct platform_device snowball_led_dev = {
66 .name = "leds-gpio",
67 .dev = {
68 .platform_data = &snowball_led_data,
69 },
70};
71
72static struct ab8500_gpio_platform_data ab8500_gpio_pdata = {
73 .gpio_base = MOP500_AB8500_GPIO(0),
74 .irq_base = MOP500_AB8500_VIR_GPIO_IRQ_BASE,
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90 .config_reg = {0x00, 0x1E, 0x80, 0x01,
91 0x7A, 0x00, 0x00},
92};
93
94static struct gpio_keys_button snowball_key_array[] = {
95 {
96 .gpio = 32,
97 .type = EV_KEY,
98 .code = KEY_1,
99 .desc = "userpb",
100 .active_low = 1,
101 .debounce_interval = 50,
102 .wakeup = 1,
103 },
104 {
105 .gpio = 151,
106 .type = EV_KEY,
107 .code = KEY_2,
108 .desc = "extkb1",
109 .active_low = 1,
110 .debounce_interval = 50,
111 .wakeup = 1,
112 },
113 {
114 .gpio = 152,
115 .type = EV_KEY,
116 .code = KEY_3,
117 .desc = "extkb2",
118 .active_low = 1,
119 .debounce_interval = 50,
120 .wakeup = 1,
121 },
122 {
123 .gpio = 161,
124 .type = EV_KEY,
125 .code = KEY_4,
126 .desc = "extkb3",
127 .active_low = 1,
128 .debounce_interval = 50,
129 .wakeup = 1,
130 },
131 {
132 .gpio = 162,
133 .type = EV_KEY,
134 .code = KEY_5,
135 .desc = "extkb4",
136 .active_low = 1,
137 .debounce_interval = 50,
138 .wakeup = 1,
139 },
140};
141
142static struct gpio_keys_platform_data snowball_key_data = {
143 .buttons = snowball_key_array,
144 .nbuttons = ARRAY_SIZE(snowball_key_array),
145};
146
147static struct platform_device snowball_key_dev = {
148 .name = "gpio-keys",
149 .id = -1,
150 .dev = {
151 .platform_data = &snowball_key_data,
152 }
153};
154
155static struct smsc911x_platform_config snowball_sbnet_cfg = {
156 .irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_HIGH,
157 .irq_type = SMSC911X_IRQ_TYPE_PUSH_PULL,
158 .flags = SMSC911X_USE_16BIT | SMSC911X_FORCE_INTERNAL_PHY,
159 .shift = 1,
160};
161
162static struct resource sbnet_res[] = {
163 {
164 .name = "smsc911x-memory",
165 .start = (0x5000 << 16),
166 .end = (0x5000 << 16) + 0xffff,
167 .flags = IORESOURCE_MEM,
168 },
169 {
170 .start = NOMADIK_GPIO_TO_IRQ(140),
171 .end = NOMADIK_GPIO_TO_IRQ(140),
172 .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE,
173 },
174};
175
176static struct platform_device snowball_sbnet_dev = {
177 .name = "smsc911x",
178 .num_resources = ARRAY_SIZE(sbnet_res),
179 .resource = sbnet_res,
180 .dev = {
181 .platform_data = &snowball_sbnet_cfg,
182 },
183};
184
185static struct ab8500_platform_data ab8500_platdata = {
186 .irq_base = MOP500_AB8500_IRQ_BASE,
187 .regulator_reg_init = ab8500_regulator_reg_init,
188 .num_regulator_reg_init = ARRAY_SIZE(ab8500_regulator_reg_init),
189 .regulator = ab8500_regulators,
190 .num_regulator = ARRAY_SIZE(ab8500_regulators),
191 .gpio = &ab8500_gpio_pdata,
192};
193
194static struct resource ab8500_resources[] = {
195 [0] = {
196 .start = IRQ_DB8500_AB8500,
197 .end = IRQ_DB8500_AB8500,
198 .flags = IORESOURCE_IRQ
199 }
200};
201
202struct platform_device ab8500_device = {
203 .name = "ab8500-i2c",
204 .id = 0,
205 .dev = {
206 .platform_data = &ab8500_platdata,
207 },
208 .num_resources = 1,
209 .resource = ab8500_resources,
210};
211
212
213
214
215
216static struct tps6105x_platform_data mop500_tps61052_data = {
217 .mode = TPS6105X_MODE_VOLTAGE,
218 .regulator_data = &tps61052_regulator,
219};
220
221
222
223
224
225static void mop500_tc35892_init(struct tc3589x *tc3589x, unsigned int base)
226{
227 mop500_sdi_tc35892_init();
228}
229
230static struct tc3589x_gpio_platform_data mop500_tc35892_gpio_data = {
231 .gpio_base = MOP500_EGPIO(0),
232 .setup = mop500_tc35892_init,
233};
234
235static struct tc3589x_platform_data mop500_tc35892_data = {
236 .block = TC3589x_BLOCK_GPIO,
237 .gpio = &mop500_tc35892_gpio_data,
238 .irq_base = MOP500_EGPIO_IRQ_BASE,
239};
240
241static struct lp5521_led_config lp5521_pri_led[] = {
242 [0] = {
243 .chan_nr = 0,
244 .led_current = 0x2f,
245 .max_current = 0x5f,
246 },
247 [1] = {
248 .chan_nr = 1,
249 .led_current = 0x2f,
250 .max_current = 0x5f,
251 },
252 [2] = {
253 .chan_nr = 2,
254 .led_current = 0x2f,
255 .max_current = 0x5f,
256 },
257};
258
259static struct lp5521_platform_data __initdata lp5521_pri_data = {
260 .label = "lp5521_pri",
261 .led_config = &lp5521_pri_led[0],
262 .num_channels = 3,
263 .clock_mode = LP5521_CLOCK_EXT,
264};
265
266static struct lp5521_led_config lp5521_sec_led[] = {
267 [0] = {
268 .chan_nr = 0,
269 .led_current = 0x2f,
270 .max_current = 0x5f,
271 },
272 [1] = {
273 .chan_nr = 1,
274 .led_current = 0x2f,
275 .max_current = 0x5f,
276 },
277 [2] = {
278 .chan_nr = 2,
279 .led_current = 0x2f,
280 .max_current = 0x5f,
281 },
282};
283
284static struct lp5521_platform_data __initdata lp5521_sec_data = {
285 .label = "lp5521_sec",
286 .led_config = &lp5521_sec_led[0],
287 .num_channels = 3,
288 .clock_mode = LP5521_CLOCK_EXT,
289};
290
291static struct i2c_board_info __initdata mop500_i2c0_devices[] = {
292 {
293 I2C_BOARD_INFO("tc3589x", 0x42),
294 .irq = NOMADIK_GPIO_TO_IRQ(217),
295 .platform_data = &mop500_tc35892_data,
296 },
297
298 {
299 I2C_BOARD_INFO("tps61052", 0x33),
300 .platform_data = &mop500_tps61052_data,
301 },
302};
303
304#define NUM_PRE_V60_I2C0_DEVICES 1
305
306static struct i2c_board_info __initdata mop500_i2c2_devices[] = {
307 {
308
309 I2C_BOARD_INFO("lp5521", 0x33),
310 .platform_data = &lp5521_pri_data,
311 },
312 {
313
314 I2C_BOARD_INFO("lp5521", 0x34),
315 .platform_data = &lp5521_sec_data,
316 },
317 {
318
319 I2C_BOARD_INFO("bh1780", 0x29),
320 },
321};
322
323#define U8500_I2C_CONTROLLER(id, _slsu, _tft, _rft, clk, t_out, _sm) \
324static struct nmk_i2c_controller u8500_i2c##id##_data = { \
325
326
327
328
329
330 \
331 .slsu = _slsu, \
332 \
333 .tft = _tft, \
334 \
335 .rft = _rft, \
336 \
337 .clk_freq = clk, \
338 \
339 .timeout = t_out, \
340 .sm = _sm, \
341}
342
343
344
345
346
347
348
349U8500_I2C_CONTROLLER(0, 0xe, 1, 8, 100000, 200, I2C_FREQ_MODE_FAST);
350U8500_I2C_CONTROLLER(1, 0xe, 1, 8, 100000, 200, I2C_FREQ_MODE_FAST);
351U8500_I2C_CONTROLLER(2, 0xe, 1, 8, 100000, 200, I2C_FREQ_MODE_FAST);
352U8500_I2C_CONTROLLER(3, 0xe, 1, 8, 100000, 200, I2C_FREQ_MODE_FAST);
353
354static void __init mop500_i2c_init(void)
355{
356 db8500_add_i2c0(&u8500_i2c0_data);
357 db8500_add_i2c1(&u8500_i2c1_data);
358 db8500_add_i2c2(&u8500_i2c2_data);
359 db8500_add_i2c3(&u8500_i2c3_data);
360}
361
362static struct gpio_keys_button mop500_gpio_keys[] = {
363 {
364 .desc = "SFH7741 Proximity Sensor",
365 .type = EV_SW,
366 .code = SW_FRONT_PROXIMITY,
367 .active_low = 0,
368 .can_disable = 1,
369 }
370};
371
372static struct regulator *prox_regulator;
373static int mop500_prox_activate(struct device *dev);
374static void mop500_prox_deactivate(struct device *dev);
375
376static struct gpio_keys_platform_data mop500_gpio_keys_data = {
377 .buttons = mop500_gpio_keys,
378 .nbuttons = ARRAY_SIZE(mop500_gpio_keys),
379 .enable = mop500_prox_activate,
380 .disable = mop500_prox_deactivate,
381};
382
383static struct platform_device mop500_gpio_keys_device = {
384 .name = "gpio-keys",
385 .id = 0,
386 .dev = {
387 .platform_data = &mop500_gpio_keys_data,
388 },
389};
390
391static int mop500_prox_activate(struct device *dev)
392{
393 prox_regulator = regulator_get(&mop500_gpio_keys_device.dev,
394 "vcc");
395 if (IS_ERR(prox_regulator)) {
396 dev_err(&mop500_gpio_keys_device.dev,
397 "no regulator\n");
398 return PTR_ERR(prox_regulator);
399 }
400 regulator_enable(prox_regulator);
401 return 0;
402}
403
404static void mop500_prox_deactivate(struct device *dev)
405{
406 regulator_disable(prox_regulator);
407 regulator_put(prox_regulator);
408}
409
410
411static struct platform_device *mop500_platform_devs[] __initdata = {
412 &mop500_gpio_keys_device,
413 &ab8500_device,
414};
415
416#ifdef CONFIG_STE_DMA40
417static struct stedma40_chan_cfg ssp0_dma_cfg_rx = {
418 .mode = STEDMA40_MODE_LOGICAL,
419 .dir = STEDMA40_PERIPH_TO_MEM,
420 .src_dev_type = DB8500_DMA_DEV8_SSP0_RX,
421 .dst_dev_type = STEDMA40_DEV_DST_MEMORY,
422 .src_info.data_width = STEDMA40_BYTE_WIDTH,
423 .dst_info.data_width = STEDMA40_BYTE_WIDTH,
424};
425
426static struct stedma40_chan_cfg ssp0_dma_cfg_tx = {
427 .mode = STEDMA40_MODE_LOGICAL,
428 .dir = STEDMA40_MEM_TO_PERIPH,
429 .src_dev_type = STEDMA40_DEV_SRC_MEMORY,
430 .dst_dev_type = DB8500_DMA_DEV8_SSP0_TX,
431 .src_info.data_width = STEDMA40_BYTE_WIDTH,
432 .dst_info.data_width = STEDMA40_BYTE_WIDTH,
433};
434#endif
435
436static struct pl022_ssp_controller ssp0_platform_data = {
437 .bus_id = 0,
438#ifdef CONFIG_STE_DMA40
439 .enable_dma = 1,
440 .dma_filter = stedma40_filter,
441 .dma_rx_param = &ssp0_dma_cfg_rx,
442 .dma_tx_param = &ssp0_dma_cfg_tx,
443#else
444 .enable_dma = 0,
445#endif
446
447
448
449 .num_chipselect = 5,
450};
451
452static void __init mop500_spi_init(void)
453{
454 db8500_add_ssp0(&ssp0_platform_data);
455}
456
457#ifdef CONFIG_STE_DMA40
458static struct stedma40_chan_cfg uart0_dma_cfg_rx = {
459 .mode = STEDMA40_MODE_LOGICAL,
460 .dir = STEDMA40_PERIPH_TO_MEM,
461 .src_dev_type = DB8500_DMA_DEV13_UART0_RX,
462 .dst_dev_type = STEDMA40_DEV_DST_MEMORY,
463 .src_info.data_width = STEDMA40_BYTE_WIDTH,
464 .dst_info.data_width = STEDMA40_BYTE_WIDTH,
465};
466
467static struct stedma40_chan_cfg uart0_dma_cfg_tx = {
468 .mode = STEDMA40_MODE_LOGICAL,
469 .dir = STEDMA40_MEM_TO_PERIPH,
470 .src_dev_type = STEDMA40_DEV_SRC_MEMORY,
471 .dst_dev_type = DB8500_DMA_DEV13_UART0_TX,
472 .src_info.data_width = STEDMA40_BYTE_WIDTH,
473 .dst_info.data_width = STEDMA40_BYTE_WIDTH,
474};
475
476static struct stedma40_chan_cfg uart1_dma_cfg_rx = {
477 .mode = STEDMA40_MODE_LOGICAL,
478 .dir = STEDMA40_PERIPH_TO_MEM,
479 .src_dev_type = DB8500_DMA_DEV12_UART1_RX,
480 .dst_dev_type = STEDMA40_DEV_DST_MEMORY,
481 .src_info.data_width = STEDMA40_BYTE_WIDTH,
482 .dst_info.data_width = STEDMA40_BYTE_WIDTH,
483};
484
485static struct stedma40_chan_cfg uart1_dma_cfg_tx = {
486 .mode = STEDMA40_MODE_LOGICAL,
487 .dir = STEDMA40_MEM_TO_PERIPH,
488 .src_dev_type = STEDMA40_DEV_SRC_MEMORY,
489 .dst_dev_type = DB8500_DMA_DEV12_UART1_TX,
490 .src_info.data_width = STEDMA40_BYTE_WIDTH,
491 .dst_info.data_width = STEDMA40_BYTE_WIDTH,
492};
493
494static struct stedma40_chan_cfg uart2_dma_cfg_rx = {
495 .mode = STEDMA40_MODE_LOGICAL,
496 .dir = STEDMA40_PERIPH_TO_MEM,
497 .src_dev_type = DB8500_DMA_DEV11_UART2_RX,
498 .dst_dev_type = STEDMA40_DEV_DST_MEMORY,
499 .src_info.data_width = STEDMA40_BYTE_WIDTH,
500 .dst_info.data_width = STEDMA40_BYTE_WIDTH,
501};
502
503static struct stedma40_chan_cfg uart2_dma_cfg_tx = {
504 .mode = STEDMA40_MODE_LOGICAL,
505 .dir = STEDMA40_MEM_TO_PERIPH,
506 .src_dev_type = STEDMA40_DEV_SRC_MEMORY,
507 .dst_dev_type = DB8500_DMA_DEV11_UART2_TX,
508 .src_info.data_width = STEDMA40_BYTE_WIDTH,
509 .dst_info.data_width = STEDMA40_BYTE_WIDTH,
510};
511#endif
512
513
514static pin_cfg_t mop500_pins_uart0[] = {
515 GPIO0_U0_CTSn | PIN_INPUT_PULLUP,
516 GPIO1_U0_RTSn | PIN_OUTPUT_HIGH,
517 GPIO2_U0_RXD | PIN_INPUT_PULLUP,
518 GPIO3_U0_TXD | PIN_OUTPUT_HIGH,
519};
520
521#define PRCC_K_SOFTRST_SET 0x18
522#define PRCC_K_SOFTRST_CLEAR 0x1C
523static void ux500_uart0_reset(void)
524{
525 void __iomem *prcc_rst_set, *prcc_rst_clr;
526
527 prcc_rst_set = (void __iomem *)IO_ADDRESS(U8500_CLKRST1_BASE +
528 PRCC_K_SOFTRST_SET);
529 prcc_rst_clr = (void __iomem *)IO_ADDRESS(U8500_CLKRST1_BASE +
530 PRCC_K_SOFTRST_CLEAR);
531
532
533 writel((readl(prcc_rst_clr) | 0x1), prcc_rst_clr);
534 udelay(1);
535
536
537 writel((readl(prcc_rst_set) | 0x1), prcc_rst_set);
538 udelay(1);
539}
540
541static void ux500_uart0_init(void)
542{
543 int ret;
544
545 ret = nmk_config_pins(mop500_pins_uart0,
546 ARRAY_SIZE(mop500_pins_uart0));
547 if (ret < 0)
548 pr_err("pl011: uart pins_enable failed\n");
549}
550
551static void ux500_uart0_exit(void)
552{
553 int ret;
554
555 ret = nmk_config_pins_sleep(mop500_pins_uart0,
556 ARRAY_SIZE(mop500_pins_uart0));
557 if (ret < 0)
558 pr_err("pl011: uart pins_disable failed\n");
559}
560
561static struct amba_pl011_data uart0_plat = {
562#ifdef CONFIG_STE_DMA40
563 .dma_filter = stedma40_filter,
564 .dma_rx_param = &uart0_dma_cfg_rx,
565 .dma_tx_param = &uart0_dma_cfg_tx,
566#endif
567 .init = ux500_uart0_init,
568 .exit = ux500_uart0_exit,
569 .reset = ux500_uart0_reset,
570};
571
572static struct amba_pl011_data uart1_plat = {
573#ifdef CONFIG_STE_DMA40
574 .dma_filter = stedma40_filter,
575 .dma_rx_param = &uart1_dma_cfg_rx,
576 .dma_tx_param = &uart1_dma_cfg_tx,
577#endif
578};
579
580static struct amba_pl011_data uart2_plat = {
581#ifdef CONFIG_STE_DMA40
582 .dma_filter = stedma40_filter,
583 .dma_rx_param = &uart2_dma_cfg_rx,
584 .dma_tx_param = &uart2_dma_cfg_tx,
585#endif
586};
587
588static void __init mop500_uart_init(void)
589{
590 db8500_add_uart0(&uart0_plat);
591 db8500_add_uart1(&uart1_plat);
592 db8500_add_uart2(&uart2_plat);
593}
594
595static struct platform_device *snowball_platform_devs[] __initdata = {
596 &snowball_led_dev,
597 &snowball_key_dev,
598 &snowball_sbnet_dev,
599 &ab8500_device,
600};
601
602static void __init mop500_init_machine(void)
603{
604 int i2c0_devs;
605
606
607
608
609
610
611 if (!machine_is_snowball()) {
612 if (machine_is_hrefv60())
613 mop500_gpio_keys[0].gpio = HREFV60_PROX_SENSE_GPIO;
614 else
615 mop500_gpio_keys[0].gpio = GPIO_PROX_SENSOR;
616 }
617
618 u8500_init_devices();
619
620 mop500_pins_init();
621
622 if (machine_is_snowball())
623 platform_add_devices(snowball_platform_devs,
624 ARRAY_SIZE(snowball_platform_devs));
625 else
626 platform_add_devices(mop500_platform_devs,
627 ARRAY_SIZE(mop500_platform_devs));
628
629 mop500_i2c_init();
630 mop500_sdi_init();
631 mop500_spi_init();
632 mop500_uart_init();
633
634 i2c0_devs = ARRAY_SIZE(mop500_i2c0_devices);
635 if (machine_is_hrefv60())
636 i2c0_devs -= NUM_PRE_V60_I2C0_DEVICES;
637
638 i2c_register_board_info(0, mop500_i2c0_devices, i2c0_devs);
639 i2c_register_board_info(2, mop500_i2c2_devices,
640 ARRAY_SIZE(mop500_i2c2_devices));
641
642
643 regulator_has_full_constraints();
644}
645
646MACHINE_START(U8500, "ST-Ericsson MOP500 platform")
647
648 .boot_params = 0x100,
649 .map_io = u8500_map_io,
650 .init_irq = ux500_init_irq,
651
652 .timer = &ux500_timer,
653 .init_machine = mop500_init_machine,
654MACHINE_END
655
656MACHINE_START(HREFV60, "ST-Ericsson U8500 Platform HREFv60+")
657 .boot_params = 0x100,
658 .map_io = u8500_map_io,
659 .init_irq = ux500_init_irq,
660 .timer = &ux500_timer,
661 .init_machine = mop500_init_machine,
662MACHINE_END
663
664MACHINE_START(SNOWBALL, "Calao Systems Snowball platform")
665 .boot_params = 0x100,
666 .map_io = u8500_map_io,
667 .init_irq = ux500_init_irq,
668
669 .timer = &ux500_timer,
670 .init_machine = mop500_init_machine,
671MACHINE_END
672