blob: cd100d569f4d2165f5b18525610b8d7fce0e711a [file] [log] [blame]
Srinidhi Kasagaraa44ef42009-11-28 08:17:18 +01001/*
Linus Walleija3a6c6a2012-10-01 09:37:39 +02002 * Copyright (C) 2008-2012 ST-Ericsson
Srinidhi Kasagaraa44ef42009-11-28 08:17:18 +01003 *
4 * Author: Srinidhi KASAGAR <srinidhi.kasagar@stericsson.com>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2, as
8 * published by the Free Software Foundation.
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>
Rabin Vincentb8410a12010-08-09 19:18:17 +053016#include <linux/i2c.h>
Alessandro Rubiniaf97bac2012-06-11 22:56:26 +020017#include <linux/platform_data/i2c-nomadik.h>
hongbo.zhangdc1956b2012-11-15 18:56:43 +080018#include <linux/platform_data/db8500_thermal.h>
Rabin Vincentea05a572010-06-03 07:58:42 +010019#include <linux/gpio.h>
Srinidhi Kasagaraa44ef42009-11-28 08:17:18 +010020#include <linux/amba/bus.h>
21#include <linux/amba/pl022.h>
Linus Walleij5d7b8462010-10-14 13:57:59 +020022#include <linux/amba/serial.h>
Srinidhi Kasagaraa44ef42009-11-28 08:17:18 +010023#include <linux/spi/spi.h>
Linus Walleijee66e652011-12-02 14:16:33 +010024#include <linux/mfd/abx500/ab8500.h>
Bengt Jonsson79568b942011-03-11 11:54:46 +010025#include <linux/regulator/ab8500.h>
Lee Jones0b5ea1e2012-09-03 14:33:39 +010026#include <linux/regulator/fixed.h>
Lee Jonescd2fa6d2013-01-31 11:31:16 +000027#include <linux/regulator/driver.h>
28#include <linux/regulator/gpio-regulator.h>
Sundar Iyer20406eb2010-12-13 09:33:14 +053029#include <linux/mfd/tc3589x.h>
Linus Walleijfe67dfc2011-03-07 11:48:15 +010030#include <linux/mfd/tps6105x.h>
Linus Walleijee66e652011-12-02 14:16:33 +010031#include <linux/mfd/abx500/ab8500-gpio.h>
Ola Liljaf242e502012-06-07 14:00:46 +020032#include <linux/mfd/abx500/ab8500-codec.h>
Milo(Woogyom) Kimdf4094d2013-02-05 19:26:59 +090033#include <linux/platform_data/leds-lp55xx.h>
Philippe Langlaisa71b8192011-01-14 10:53:59 +010034#include <linux/input.h>
Robert Marklund350abe02011-06-20 15:55:46 +020035#include <linux/smsc911x.h>
Philippe Langlaisa71b8192011-01-14 10:53:59 +010036#include <linux/gpio_keys.h>
Shreshtha Kumar Sahu1a7d4362011-06-13 10:11:44 +020037#include <linux/delay.h>
Robert Marklund350abe02011-06-20 15:55:46 +020038#include <linux/leds.h>
Linus Walleija0980662012-05-07 01:33:24 +020039#include <linux/pinctrl/consumer.h>
Linus Walleijbb16bd92012-10-10 14:27:58 +020040#include <linux/platform_data/pinctrl-nomadik.h>
Linus Walleij865fab62012-10-18 14:20:16 +020041#include <linux/platform_data/dma-ste-dma40.h>
Linus Walleija0980662012-05-07 01:33:24 +020042
Srinidhi Kasagaraa44ef42009-11-28 08:17:18 +010043#include <asm/mach-types.h>
44#include <asm/mach/arch.h>
45
Srinidhi Kasagaraa44ef42009-11-28 08:17:18 +010046#include <mach/hardware.h>
47#include <mach/setup.h>
Rabin Vincent9e4e7fe2010-05-03 08:03:52 +010048#include <mach/devices.h>
Linus Walleij29aeb3c2010-09-06 22:15:08 +010049#include <mach/irqs.h>
Arnd Bergmanndb298da2012-08-24 15:19:33 +020050#include <linux/platform_data/crypto-ux500.h>
Srinidhi Kasagaraa44ef42009-11-28 08:17:18 +010051
Linus Walleij5d7b8462010-10-14 13:57:59 +020052#include "ste-dma40-db8500.h"
Rabin Vincentfbf1ead2010-09-29 19:46:32 +053053#include "devices-db8500.h"
Hanumath Prasad008f8a22010-08-19 12:06:32 +010054#include "board-mop500.h"
Bengt Jonssona1e516e2010-12-10 11:08:48 +010055#include "board-mop500-regulators.h"
Rabin Vincentea05a572010-06-03 07:58:42 +010056
Robert Marklund350abe02011-06-20 15:55:46 +020057static struct gpio_led snowball_led_array[] = {
58 {
59 .name = "user_led",
Lee Jonesc525f072012-05-02 09:20:37 +010060 .default_trigger = "heartbeat",
Robert Marklund350abe02011-06-20 15:55:46 +020061 .gpio = 142,
62 },
63};
64
65static struct gpio_led_platform_data snowball_led_data = {
66 .leds = snowball_led_array,
67 .num_leds = ARRAY_SIZE(snowball_led_array),
68};
69
70static struct platform_device snowball_led_dev = {
71 .name = "leds-gpio",
72 .dev = {
73 .platform_data = &snowball_led_data,
74 },
75};
76
Lee Jones0b5ea1e2012-09-03 14:33:39 +010077static struct fixed_voltage_config snowball_gpio_en_3v3_data = {
78 .supply_name = "EN-3V3",
79 .gpio = SNOWBALL_EN_3V3_ETH_GPIO,
80 .microvolts = 3300000,
81 .enable_high = 1,
82 .init_data = &gpio_en_3v3_regulator,
83 .startup_delay = 5000, /* 1200us */
84};
85
86static struct platform_device snowball_gpio_en_3v3_regulator_dev = {
87 .name = "reg-fixed-voltage",
88 .id = 1,
89 .dev = {
90 .platform_data = &snowball_gpio_en_3v3_data,
91 },
92};
93
Lee Jonescd2fa6d2013-01-31 11:31:16 +000094/* Dynamically populated. */
95static struct gpio sdi0_reg_gpios[] = {
96 { 0, GPIOF_OUT_INIT_LOW, "mmci_vsel" },
97};
98
99static struct gpio_regulator_state sdi0_reg_states[] = {
100 { .value = 2900000, .gpios = (0 << 0) },
101 { .value = 1800000, .gpios = (1 << 0) },
102};
103
104static struct gpio_regulator_config sdi0_reg_info = {
105 .supply_name = "ext-mmc-level-shifter",
106 .gpios = sdi0_reg_gpios,
107 .nr_gpios = ARRAY_SIZE(sdi0_reg_gpios),
108 .states = sdi0_reg_states,
109 .nr_states = ARRAY_SIZE(sdi0_reg_states),
110 .type = REGULATOR_VOLTAGE,
111 .enable_high = 1,
112 .enabled_at_boot = 0,
113 .init_data = &sdi0_reg_init_data,
114 .startup_delay = 100,
115};
116
117static struct platform_device sdi0_regulator = {
118 .name = "gpio-regulator",
119 .id = -1,
120 .dev = {
121 .platform_data = &sdi0_reg_info,
122 },
123};
124
Patrice Chotard0493e642013-01-08 10:41:02 +0100125static struct abx500_gpio_platform_data ab8500_gpio_pdata = {
Philippe Langlaisa1524ee2012-02-13 10:52:25 +0100126 .gpio_base = MOP500_AB8500_PIN_GPIO(1),
Bibek Basu3ef374a2011-02-15 12:56:16 +0530127};
128
Ola Liljaf242e502012-06-07 14:00:46 +0200129/* ab8500-codec */
130static struct ab8500_codec_platform_data ab8500_codec_pdata = {
131 .amics = {
132 .mic1_type = AMIC_TYPE_DIFFERENTIAL,
133 .mic2_type = AMIC_TYPE_DIFFERENTIAL,
134 .mic1a_micbias = AMIC_MICBIAS_VAMIC1,
135 .mic1b_micbias = AMIC_MICBIAS_VAMIC1,
136 .mic2_micbias = AMIC_MICBIAS_VAMIC2
137 },
138 .ear_cmv = EAR_CMV_0_95V
139};
140
Robert Marklund350abe02011-06-20 15:55:46 +0200141static struct gpio_keys_button snowball_key_array[] = {
142 {
143 .gpio = 32,
144 .type = EV_KEY,
145 .code = KEY_1,
146 .desc = "userpb",
147 .active_low = 1,
148 .debounce_interval = 50,
149 .wakeup = 1,
150 },
151 {
152 .gpio = 151,
153 .type = EV_KEY,
154 .code = KEY_2,
155 .desc = "extkb1",
156 .active_low = 1,
157 .debounce_interval = 50,
158 .wakeup = 1,
159 },
160 {
161 .gpio = 152,
162 .type = EV_KEY,
163 .code = KEY_3,
164 .desc = "extkb2",
165 .active_low = 1,
166 .debounce_interval = 50,
167 .wakeup = 1,
168 },
169 {
170 .gpio = 161,
171 .type = EV_KEY,
172 .code = KEY_4,
173 .desc = "extkb3",
174 .active_low = 1,
175 .debounce_interval = 50,
176 .wakeup = 1,
177 },
178 {
179 .gpio = 162,
180 .type = EV_KEY,
181 .code = KEY_5,
182 .desc = "extkb4",
183 .active_low = 1,
184 .debounce_interval = 50,
185 .wakeup = 1,
186 },
187};
188
189static struct gpio_keys_platform_data snowball_key_data = {
190 .buttons = snowball_key_array,
191 .nbuttons = ARRAY_SIZE(snowball_key_array),
192};
193
194static struct platform_device snowball_key_dev = {
195 .name = "gpio-keys",
196 .id = -1,
197 .dev = {
198 .platform_data = &snowball_key_data,
199 }
200};
201
202static struct smsc911x_platform_config snowball_sbnet_cfg = {
203 .irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_HIGH,
204 .irq_type = SMSC911X_IRQ_TYPE_PUSH_PULL,
205 .flags = SMSC911X_USE_16BIT | SMSC911X_FORCE_INTERNAL_PHY,
206 .shift = 1,
207};
208
209static struct resource sbnet_res[] = {
210 {
211 .name = "smsc911x-memory",
212 .start = (0x5000 << 16),
213 .end = (0x5000 << 16) + 0xffff,
214 .flags = IORESOURCE_MEM,
215 },
216 {
217 .start = NOMADIK_GPIO_TO_IRQ(140),
218 .end = NOMADIK_GPIO_TO_IRQ(140),
219 .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE,
220 },
221};
222
223static struct platform_device snowball_sbnet_dev = {
224 .name = "smsc911x",
225 .num_resources = ARRAY_SIZE(sbnet_res),
226 .resource = sbnet_res,
227 .dev = {
228 .platform_data = &snowball_sbnet_cfg,
229 },
230};
231
Linus Walleij05ec2602013-02-07 10:17:31 +0100232struct ab8500_platform_data ab8500_platdata = {
Rabin Vincent39ae7022010-07-26 11:12:15 +0100233 .irq_base = MOP500_AB8500_IRQ_BASE,
Bengt Jonssondfa3a822011-03-09 13:34:17 +0100234 .regulator_reg_init = ab8500_regulator_reg_init,
235 .num_regulator_reg_init = ARRAY_SIZE(ab8500_regulator_reg_init),
Bengt Jonssona1e516e2010-12-10 11:08:48 +0100236 .regulator = ab8500_regulators,
237 .num_regulator = ARRAY_SIZE(ab8500_regulators),
Bibek Basu3ef374a2011-02-15 12:56:16 +0530238 .gpio = &ab8500_gpio_pdata,
Ola Liljaf242e502012-06-07 14:00:46 +0200239 .codec = &ab8500_codec_pdata,
Rabin Vincent39ae7022010-07-26 11:12:15 +0100240};
241
Rabin Vincentb8410a12010-08-09 19:18:17 +0530242/*
hongbo.zhangdc1956b2012-11-15 18:56:43 +0800243 * Thermal Sensor
244 */
245
246static struct resource db8500_thsens_resources[] = {
247 {
248 .name = "IRQ_HOTMON_LOW",
249 .start = IRQ_PRCMU_HOTMON_LOW,
250 .end = IRQ_PRCMU_HOTMON_LOW,
251 .flags = IORESOURCE_IRQ,
252 },
253 {
254 .name = "IRQ_HOTMON_HIGH",
255 .start = IRQ_PRCMU_HOTMON_HIGH,
256 .end = IRQ_PRCMU_HOTMON_HIGH,
257 .flags = IORESOURCE_IRQ,
258 },
259};
260
261static struct db8500_thsens_platform_data db8500_thsens_data = {
262 .trip_points[0] = {
263 .temp = 70000,
264 .type = THERMAL_TRIP_ACTIVE,
265 .cdev_name = {
266 [0] = "thermal-cpufreq-0",
267 },
268 },
269 .trip_points[1] = {
270 .temp = 75000,
271 .type = THERMAL_TRIP_ACTIVE,
272 .cdev_name = {
273 [0] = "thermal-cpufreq-0",
274 },
275 },
276 .trip_points[2] = {
277 .temp = 80000,
278 .type = THERMAL_TRIP_ACTIVE,
279 .cdev_name = {
280 [0] = "thermal-cpufreq-0",
281 },
282 },
283 .trip_points[3] = {
284 .temp = 85000,
285 .type = THERMAL_TRIP_CRITICAL,
286 },
287 .num_trips = 4,
288};
289
290static struct platform_device u8500_thsens_device = {
291 .name = "db8500-thermal",
292 .resource = db8500_thsens_resources,
293 .num_resources = ARRAY_SIZE(db8500_thsens_resources),
294 .dev = {
295 .platform_data = &db8500_thsens_data,
296 },
297};
298
299static struct platform_device u8500_cpufreq_cooling_device = {
300 .name = "db8500-cpufreq-cooling",
301};
302
303/*
Linus Walleijfe67dfc2011-03-07 11:48:15 +0100304 * TPS61052
305 */
306
307static struct tps6105x_platform_data mop500_tps61052_data = {
308 .mode = TPS6105X_MODE_VOLTAGE,
309 .regulator_data = &tps61052_regulator,
310};
311
312/*
Rabin Vincentb8410a12010-08-09 19:18:17 +0530313 * TC35892
314 */
315
Sundar Iyer20406eb2010-12-13 09:33:14 +0530316static void mop500_tc35892_init(struct tc3589x *tc3589x, unsigned int base)
Rabin Vincentb8410a12010-08-09 19:18:17 +0530317{
Lee Jones18403422012-02-06 11:22:21 -0800318 struct device *parent = NULL;
319#if 0
320 /* FIXME: Is the sdi actually part of tc3589x? */
321 parent = tc3589x->dev;
322#endif
323 mop500_sdi_tc35892_init(parent);
Rabin Vincentb8410a12010-08-09 19:18:17 +0530324}
325
Sundar Iyer20406eb2010-12-13 09:33:14 +0530326static struct tc3589x_gpio_platform_data mop500_tc35892_gpio_data = {
Rabin Vincentb8410a12010-08-09 19:18:17 +0530327 .gpio_base = MOP500_EGPIO(0),
328 .setup = mop500_tc35892_init,
329};
330
Sundar Iyer20406eb2010-12-13 09:33:14 +0530331static struct tc3589x_platform_data mop500_tc35892_data = {
Sundar Iyer611b7592010-12-13 09:33:15 +0530332 .block = TC3589x_BLOCK_GPIO,
Rabin Vincentb8410a12010-08-09 19:18:17 +0530333 .gpio = &mop500_tc35892_gpio_data,
334 .irq_base = MOP500_EGPIO_IRQ_BASE,
335};
336
Milo(Woogyom) Kimdf4094d2013-02-05 19:26:59 +0900337static struct lp55xx_led_config lp5521_pri_led[] = {
Philippe Langlaisdd7b2a02011-01-12 11:26:20 +0100338 [0] = {
339 .chan_nr = 0,
340 .led_current = 0x2f,
341 .max_current = 0x5f,
342 },
343 [1] = {
344 .chan_nr = 1,
345 .led_current = 0x2f,
346 .max_current = 0x5f,
347 },
348 [2] = {
349 .chan_nr = 2,
350 .led_current = 0x2f,
351 .max_current = 0x5f,
352 },
353};
354
Milo(Woogyom) Kimdf4094d2013-02-05 19:26:59 +0900355static struct lp55xx_platform_data __initdata lp5521_pri_data = {
Philippe Langlaisdd7b2a02011-01-12 11:26:20 +0100356 .label = "lp5521_pri",
357 .led_config = &lp5521_pri_led[0],
358 .num_channels = 3,
Milo(Woogyom) Kimdf4094d2013-02-05 19:26:59 +0900359 .clock_mode = LP55XX_CLOCK_EXT,
Philippe Langlaisdd7b2a02011-01-12 11:26:20 +0100360};
361
Milo(Woogyom) Kimdf4094d2013-02-05 19:26:59 +0900362static struct lp55xx_led_config lp5521_sec_led[] = {
Philippe Langlaisdd7b2a02011-01-12 11:26:20 +0100363 [0] = {
364 .chan_nr = 0,
365 .led_current = 0x2f,
366 .max_current = 0x5f,
367 },
368 [1] = {
369 .chan_nr = 1,
370 .led_current = 0x2f,
371 .max_current = 0x5f,
372 },
373 [2] = {
374 .chan_nr = 2,
375 .led_current = 0x2f,
376 .max_current = 0x5f,
377 },
378};
379
Milo(Woogyom) Kimdf4094d2013-02-05 19:26:59 +0900380static struct lp55xx_platform_data __initdata lp5521_sec_data = {
Philippe Langlaisdd7b2a02011-01-12 11:26:20 +0100381 .label = "lp5521_sec",
382 .led_config = &lp5521_sec_led[0],
383 .num_channels = 3,
Milo(Woogyom) Kimdf4094d2013-02-05 19:26:59 +0900384 .clock_mode = LP55XX_CLOCK_EXT,
Philippe Langlaisdd7b2a02011-01-12 11:26:20 +0100385};
386
Linus Walleijfe67dfc2011-03-07 11:48:15 +0100387static struct i2c_board_info __initdata mop500_i2c0_devices[] = {
Rabin Vincentb8410a12010-08-09 19:18:17 +0530388 {
Sundar Iyer20406eb2010-12-13 09:33:14 +0530389 I2C_BOARD_INFO("tc3589x", 0x42),
Philippe Langlaisdd7b2a02011-01-12 11:26:20 +0100390 .irq = NOMADIK_GPIO_TO_IRQ(217),
Rabin Vincentb8410a12010-08-09 19:18:17 +0530391 .platform_data = &mop500_tc35892_data,
392 },
Linus Walleijcf568c52011-03-30 14:31:42 +0200393 /* I2C0 devices only available prior to HREFv60 */
Linus Walleijfe67dfc2011-03-07 11:48:15 +0100394 {
395 I2C_BOARD_INFO("tps61052", 0x33),
396 .platform_data = &mop500_tps61052_data,
397 },
398};
399
Linus Walleijcf568c52011-03-30 14:31:42 +0200400#define NUM_PRE_V60_I2C0_DEVICES 1
401
Philippe Langlaisdd7b2a02011-01-12 11:26:20 +0100402static struct i2c_board_info __initdata mop500_i2c2_devices[] = {
403 {
404 /* lp5521 LED driver, 1st device */
405 I2C_BOARD_INFO("lp5521", 0x33),
406 .platform_data = &lp5521_pri_data,
407 },
408 {
409 /* lp5521 LED driver, 2st device */
410 I2C_BOARD_INFO("lp5521", 0x34),
411 .platform_data = &lp5521_sec_data,
412 },
Lee Jonesbb3b2182011-01-13 14:41:22 +0000413 {
414 /* Light sensor Rohm BH1780GLI */
415 I2C_BOARD_INFO("bh1780", 0x29),
416 },
Philippe Langlaisdd7b2a02011-01-12 11:26:20 +0100417};
418
Lee Jones18403422012-02-06 11:22:21 -0800419static void __init mop500_i2c_init(struct device *parent)
Rabin Vincentfbf1ead2010-09-29 19:46:32 +0530420{
Lee Jones98582d92012-04-17 15:52:26 +0100421 db8500_add_i2c0(parent, NULL);
422 db8500_add_i2c1(parent, NULL);
423 db8500_add_i2c2(parent, NULL);
424 db8500_add_i2c3(parent, NULL);
Rabin Vincentfbf1ead2010-09-29 19:46:32 +0530425}
Srinidhi Kasagaraa44ef42009-11-28 08:17:18 +0100426
Philippe Langlaisa71b8192011-01-14 10:53:59 +0100427static struct gpio_keys_button mop500_gpio_keys[] = {
428 {
429 .desc = "SFH7741 Proximity Sensor",
430 .type = EV_SW,
431 .code = SW_FRONT_PROXIMITY,
Philippe Langlaisa71b8192011-01-14 10:53:59 +0100432 .active_low = 0,
433 .can_disable = 1,
434 }
435};
436
437static struct regulator *prox_regulator;
438static int mop500_prox_activate(struct device *dev);
439static void mop500_prox_deactivate(struct device *dev);
440
441static struct gpio_keys_platform_data mop500_gpio_keys_data = {
442 .buttons = mop500_gpio_keys,
443 .nbuttons = ARRAY_SIZE(mop500_gpio_keys),
444 .enable = mop500_prox_activate,
445 .disable = mop500_prox_deactivate,
446};
447
448static struct platform_device mop500_gpio_keys_device = {
449 .name = "gpio-keys",
450 .id = 0,
451 .dev = {
452 .platform_data = &mop500_gpio_keys_data,
453 },
454};
455
456static int mop500_prox_activate(struct device *dev)
457{
458 prox_regulator = regulator_get(&mop500_gpio_keys_device.dev,
459 "vcc");
460 if (IS_ERR(prox_regulator)) {
461 dev_err(&mop500_gpio_keys_device.dev,
462 "no regulator\n");
463 return PTR_ERR(prox_regulator);
464 }
465 regulator_enable(prox_regulator);
466 return 0;
467}
468
469static void mop500_prox_deactivate(struct device *dev)
470{
471 regulator_disable(prox_regulator);
472 regulator_put(prox_regulator);
473}
474
Andreas Westin585d1882012-05-10 10:14:06 +0200475static struct cryp_platform_data u8500_cryp1_platform_data = {
476 .mem_to_engine = {
477 .dir = STEDMA40_MEM_TO_PERIPH,
478 .src_dev_type = STEDMA40_DEV_SRC_MEMORY,
479 .dst_dev_type = DB8500_DMA_DEV48_CAC1_TX,
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 .engine_to_mem = {
487 .dir = STEDMA40_PERIPH_TO_MEM,
488 .src_dev_type = DB8500_DMA_DEV48_CAC1_RX,
489 .dst_dev_type = STEDMA40_DEV_DST_MEMORY,
490 .src_info.data_width = STEDMA40_WORD_WIDTH,
491 .dst_info.data_width = STEDMA40_WORD_WIDTH,
492 .mode = STEDMA40_MODE_LOGICAL,
493 .src_info.psize = STEDMA40_PSIZE_LOG_4,
494 .dst_info.psize = STEDMA40_PSIZE_LOG_4,
495 }
496};
497
498static struct stedma40_chan_cfg u8500_hash_dma_cfg_tx = {
499 .dir = STEDMA40_MEM_TO_PERIPH,
500 .src_dev_type = STEDMA40_DEV_SRC_MEMORY,
501 .dst_dev_type = DB8500_DMA_DEV50_HAC1_TX,
502 .src_info.data_width = STEDMA40_WORD_WIDTH,
503 .dst_info.data_width = STEDMA40_WORD_WIDTH,
504 .mode = STEDMA40_MODE_LOGICAL,
505 .src_info.psize = STEDMA40_PSIZE_LOG_16,
506 .dst_info.psize = STEDMA40_PSIZE_LOG_16,
507};
508
509static struct hash_platform_data u8500_hash1_platform_data = {
510 .mem_to_engine = &u8500_hash_dma_cfg_tx,
511 .dma_filter = stedma40_filter,
512};
513
Srinidhi Kasagard48a41c2010-02-03 13:02:48 +0100514/* add any platform devices here - TODO */
Robert Marklund350abe02011-06-20 15:55:46 +0200515static struct platform_device *mop500_platform_devs[] __initdata = {
Philippe Langlaisa71b8192011-01-14 10:53:59 +0100516 &mop500_gpio_keys_device,
Lee Jonescd2fa6d2013-01-31 11:31:16 +0000517 &sdi0_regulator,
Srinidhi Kasagard48a41c2010-02-03 13:02:48 +0100518};
519
Linus Walleij5d7b8462010-10-14 13:57:59 +0200520#ifdef CONFIG_STE_DMA40
521static struct stedma40_chan_cfg ssp0_dma_cfg_rx = {
522 .mode = STEDMA40_MODE_LOGICAL,
523 .dir = STEDMA40_PERIPH_TO_MEM,
524 .src_dev_type = DB8500_DMA_DEV8_SSP0_RX,
525 .dst_dev_type = STEDMA40_DEV_DST_MEMORY,
526 .src_info.data_width = STEDMA40_BYTE_WIDTH,
527 .dst_info.data_width = STEDMA40_BYTE_WIDTH,
528};
529
530static struct stedma40_chan_cfg ssp0_dma_cfg_tx = {
531 .mode = STEDMA40_MODE_LOGICAL,
532 .dir = STEDMA40_MEM_TO_PERIPH,
533 .src_dev_type = STEDMA40_DEV_SRC_MEMORY,
534 .dst_dev_type = DB8500_DMA_DEV8_SSP0_TX,
535 .src_info.data_width = STEDMA40_BYTE_WIDTH,
536 .dst_info.data_width = STEDMA40_BYTE_WIDTH,
537};
538#endif
539
Lee Jonesfa86a762012-09-27 10:17:36 +0100540struct pl022_ssp_controller ssp0_plat = {
Linus Walleij5d7b8462010-10-14 13:57:59 +0200541 .bus_id = 0,
542#ifdef CONFIG_STE_DMA40
543 .enable_dma = 1,
544 .dma_filter = stedma40_filter,
545 .dma_rx_param = &ssp0_dma_cfg_rx,
546 .dma_tx_param = &ssp0_dma_cfg_tx,
547#else
548 .enable_dma = 0,
549#endif
550 /* on this platform, gpio 31,142,144,214 &
551 * 224 are connected as chip selects
552 */
553 .num_chipselect = 5,
554};
555
Lee Jones18403422012-02-06 11:22:21 -0800556static void __init mop500_spi_init(struct device *parent)
Rabin Vincentfbf1ead2010-09-29 19:46:32 +0530557{
Lee Jones15daf692012-03-15 16:47:11 +0000558 db8500_add_ssp0(parent, &ssp0_plat);
Rabin Vincentfbf1ead2010-09-29 19:46:32 +0530559}
560
Linus Walleij5d7b8462010-10-14 13:57:59 +0200561#ifdef CONFIG_STE_DMA40
562static struct stedma40_chan_cfg uart0_dma_cfg_rx = {
563 .mode = STEDMA40_MODE_LOGICAL,
564 .dir = STEDMA40_PERIPH_TO_MEM,
565 .src_dev_type = DB8500_DMA_DEV13_UART0_RX,
566 .dst_dev_type = STEDMA40_DEV_DST_MEMORY,
567 .src_info.data_width = STEDMA40_BYTE_WIDTH,
568 .dst_info.data_width = STEDMA40_BYTE_WIDTH,
569};
570
571static struct stedma40_chan_cfg uart0_dma_cfg_tx = {
572 .mode = STEDMA40_MODE_LOGICAL,
573 .dir = STEDMA40_MEM_TO_PERIPH,
574 .src_dev_type = STEDMA40_DEV_SRC_MEMORY,
575 .dst_dev_type = DB8500_DMA_DEV13_UART0_TX,
576 .src_info.data_width = STEDMA40_BYTE_WIDTH,
577 .dst_info.data_width = STEDMA40_BYTE_WIDTH,
578};
579
580static struct stedma40_chan_cfg uart1_dma_cfg_rx = {
581 .mode = STEDMA40_MODE_LOGICAL,
582 .dir = STEDMA40_PERIPH_TO_MEM,
583 .src_dev_type = DB8500_DMA_DEV12_UART1_RX,
584 .dst_dev_type = STEDMA40_DEV_DST_MEMORY,
585 .src_info.data_width = STEDMA40_BYTE_WIDTH,
586 .dst_info.data_width = STEDMA40_BYTE_WIDTH,
587};
588
589static struct stedma40_chan_cfg uart1_dma_cfg_tx = {
590 .mode = STEDMA40_MODE_LOGICAL,
591 .dir = STEDMA40_MEM_TO_PERIPH,
592 .src_dev_type = STEDMA40_DEV_SRC_MEMORY,
593 .dst_dev_type = DB8500_DMA_DEV12_UART1_TX,
594 .src_info.data_width = STEDMA40_BYTE_WIDTH,
595 .dst_info.data_width = STEDMA40_BYTE_WIDTH,
596};
597
598static struct stedma40_chan_cfg uart2_dma_cfg_rx = {
599 .mode = STEDMA40_MODE_LOGICAL,
600 .dir = STEDMA40_PERIPH_TO_MEM,
601 .src_dev_type = DB8500_DMA_DEV11_UART2_RX,
602 .dst_dev_type = STEDMA40_DEV_DST_MEMORY,
603 .src_info.data_width = STEDMA40_BYTE_WIDTH,
604 .dst_info.data_width = STEDMA40_BYTE_WIDTH,
605};
606
607static struct stedma40_chan_cfg uart2_dma_cfg_tx = {
608 .mode = STEDMA40_MODE_LOGICAL,
609 .dir = STEDMA40_MEM_TO_PERIPH,
610 .src_dev_type = STEDMA40_DEV_SRC_MEMORY,
611 .dst_dev_type = DB8500_DMA_DEV11_UART2_TX,
612 .src_info.data_width = STEDMA40_BYTE_WIDTH,
613 .dst_info.data_width = STEDMA40_BYTE_WIDTH,
614};
615#endif
616
Lee Jonesfa86a762012-09-27 10:17:36 +0100617struct amba_pl011_data uart0_plat = {
Linus Walleij5d7b8462010-10-14 13:57:59 +0200618#ifdef CONFIG_STE_DMA40
619 .dma_filter = stedma40_filter,
620 .dma_rx_param = &uart0_dma_cfg_rx,
621 .dma_tx_param = &uart0_dma_cfg_tx,
622#endif
623};
624
Lee Jonesfa86a762012-09-27 10:17:36 +0100625struct amba_pl011_data uart1_plat = {
Linus Walleij5d7b8462010-10-14 13:57:59 +0200626#ifdef CONFIG_STE_DMA40
627 .dma_filter = stedma40_filter,
628 .dma_rx_param = &uart1_dma_cfg_rx,
629 .dma_tx_param = &uart1_dma_cfg_tx,
630#endif
631};
632
Lee Jonesfa86a762012-09-27 10:17:36 +0100633struct amba_pl011_data uart2_plat = {
Linus Walleij5d7b8462010-10-14 13:57:59 +0200634#ifdef CONFIG_STE_DMA40
635 .dma_filter = stedma40_filter,
636 .dma_rx_param = &uart2_dma_cfg_rx,
637 .dma_tx_param = &uart2_dma_cfg_tx,
638#endif
639};
640
Lee Jones18403422012-02-06 11:22:21 -0800641static void __init mop500_uart_init(struct device *parent)
Rabin Vincentfbf1ead2010-09-29 19:46:32 +0530642{
Linus Walleij78d80c52012-05-23 21:18:46 +0200643 db8500_add_uart0(parent, &uart0_plat);
Lee Jones18403422012-02-06 11:22:21 -0800644 db8500_add_uart1(parent, &uart1_plat);
645 db8500_add_uart2(parent, &uart2_plat);
Rabin Vincentfbf1ead2010-09-29 19:46:32 +0530646}
647
Andreas Westin585d1882012-05-10 10:14:06 +0200648static void __init u8500_cryp1_hash1_init(struct device *parent)
649{
650 db8500_add_cryp1(parent, &u8500_cryp1_platform_data);
651 db8500_add_hash1(parent, &u8500_hash1_platform_data);
652}
653
Robert Marklund350abe02011-06-20 15:55:46 +0200654static struct platform_device *snowball_platform_devs[] __initdata = {
655 &snowball_led_dev,
656 &snowball_key_dev,
Lee Jonese6fada52012-05-17 13:18:36 +0100657 &snowball_sbnet_dev,
Lee Jones0b5ea1e2012-09-03 14:33:39 +0100658 &snowball_gpio_en_3v3_regulator_dev,
hongbo.zhangdc1956b2012-11-15 18:56:43 +0800659 &u8500_thsens_device,
660 &u8500_cpufreq_cooling_device,
Lee Jonescd2fa6d2013-01-31 11:31:16 +0000661 &sdi0_regulator,
Robert Marklund350abe02011-06-20 15:55:46 +0200662};
663
Linus Walleij4b4f7572011-02-15 15:01:35 +0100664static void __init mop500_init_machine(void)
Srinidhi Kasagaraa44ef42009-11-28 08:17:18 +0100665{
Lee Jones18403422012-02-06 11:22:21 -0800666 struct device *parent = NULL;
Linus Walleijcf568c52011-03-30 14:31:42 +0200667 int i2c0_devs;
Lee Jonesb024a0c2012-02-06 11:22:25 -0800668 int i;
Linus Walleijcf568c52011-03-30 14:31:42 +0200669
Linus Walleij05ec2602013-02-07 10:17:31 +0100670 platform_device_register(&db8500_prcmu_device);
Lee Jones110c2c22011-08-26 16:54:07 +0100671 mop500_gpio_keys[0].gpio = GPIO_PROX_SENSOR;
Linus Walleij4b4f7572011-02-15 15:01:35 +0100672
Lee Jonescd2fa6d2013-01-31 11:31:16 +0000673 sdi0_reg_info.enable_gpio = GPIO_SDMMC_EN;
674 sdi0_reg_info.gpios[0].gpio = GPIO_SDMMC_1V8_3V_SEL;
675
Linus Walleijed781d392012-05-03 00:44:52 +0200676 mop500_pinmaps_init();
Lee Jones3a8e39c2012-07-06 12:46:23 +0200677 parent = u8500_init_devices(&ab8500_platdata);
Rabin Vincentea05a572010-06-03 07:58:42 +0100678
Lee Jonesb024a0c2012-02-06 11:22:25 -0800679 for (i = 0; i < ARRAY_SIZE(mop500_platform_devs); i++)
680 mop500_platform_devs[i]->dev.parent = parent;
681
Lee Jones110c2c22011-08-26 16:54:07 +0100682 platform_add_devices(mop500_platform_devs,
683 ARRAY_SIZE(mop500_platform_devs));
Srinidhi Kasagard48a41c2010-02-03 13:02:48 +0100684
Lee Jones18403422012-02-06 11:22:21 -0800685 mop500_i2c_init(parent);
686 mop500_sdi_init(parent);
687 mop500_spi_init(parent);
Lee Jones39b740b2012-09-14 15:46:29 +0100688 mop500_audio_init(parent);
Lee Jones18403422012-02-06 11:22:21 -0800689 mop500_uart_init(parent);
Hanumath Prasad008f8a22010-08-19 12:06:32 +0100690
Andreas Westin585d1882012-05-10 10:14:06 +0200691 u8500_cryp1_hash1_init(parent);
692
Linus Walleijcf568c52011-03-30 14:31:42 +0200693 i2c0_devs = ARRAY_SIZE(mop500_i2c0_devices);
Lee Jones110c2c22011-08-26 16:54:07 +0100694
695 i2c_register_board_info(0, mop500_i2c0_devices, i2c0_devs);
696 i2c_register_board_info(2, mop500_i2c2_devices,
697 ARRAY_SIZE(mop500_i2c2_devices));
698
699 /* This board has full regulator constraints */
700 regulator_has_full_constraints();
701}
702
703static void __init snowball_init_machine(void)
704{
Lee Jones18403422012-02-06 11:22:21 -0800705 struct device *parent = NULL;
Lee Jonesb024a0c2012-02-06 11:22:25 -0800706 int i;
Lee Jones110c2c22011-08-26 16:54:07 +0100707
Linus Walleij05ec2602013-02-07 10:17:31 +0100708 platform_device_register(&db8500_prcmu_device);
Lee Jonescd2fa6d2013-01-31 11:31:16 +0000709
710 sdi0_reg_info.enable_gpio = SNOWBALL_SDMMC_EN_GPIO;
711 sdi0_reg_info.gpios[0].gpio = SNOWBALL_SDMMC_1V8_3V_GPIO;
712
Linus Walleijed781d392012-05-03 00:44:52 +0200713 snowball_pinmaps_init();
Lee Jones3a8e39c2012-07-06 12:46:23 +0200714 parent = u8500_init_devices(&ab8500_platdata);
Lee Jones110c2c22011-08-26 16:54:07 +0100715
Lee Jonesb024a0c2012-02-06 11:22:25 -0800716 for (i = 0; i < ARRAY_SIZE(snowball_platform_devs); i++)
717 snowball_platform_devs[i]->dev.parent = parent;
718
Lee Jones110c2c22011-08-26 16:54:07 +0100719 platform_add_devices(snowball_platform_devs,
720 ARRAY_SIZE(snowball_platform_devs));
721
Lee Jones18403422012-02-06 11:22:21 -0800722 mop500_i2c_init(parent);
723 snowball_sdi_init(parent);
724 mop500_spi_init(parent);
Lee Jones39b740b2012-09-14 15:46:29 +0100725 mop500_audio_init(parent);
Lee Jones18403422012-02-06 11:22:21 -0800726 mop500_uart_init(parent);
Lee Jones110c2c22011-08-26 16:54:07 +0100727
Lee Jones110c2c22011-08-26 16:54:07 +0100728 /* This board has full regulator constraints */
729 regulator_has_full_constraints();
730}
731
732static void __init hrefv60_init_machine(void)
733{
Lee Jones18403422012-02-06 11:22:21 -0800734 struct device *parent = NULL;
Lee Jones110c2c22011-08-26 16:54:07 +0100735 int i2c0_devs;
Lee Jonesb024a0c2012-02-06 11:22:25 -0800736 int i;
Lee Jones110c2c22011-08-26 16:54:07 +0100737
Linus Walleij05ec2602013-02-07 10:17:31 +0100738 platform_device_register(&db8500_prcmu_device);
Lee Jones110c2c22011-08-26 16:54:07 +0100739 /*
740 * The HREFv60 board removed a GPIO expander and routed
741 * all these GPIO pins to the internal GPIO controller
742 * instead.
743 */
744 mop500_gpio_keys[0].gpio = HREFV60_PROX_SENSE_GPIO;
745
Lee Jonescd2fa6d2013-01-31 11:31:16 +0000746 sdi0_reg_info.enable_gpio = HREFV60_SDMMC_EN_GPIO;
747 sdi0_reg_info.gpios[0].gpio = HREFV60_SDMMC_1V8_3V_GPIO;
748
Linus Walleijed781d392012-05-03 00:44:52 +0200749 hrefv60_pinmaps_init();
Lee Jones3a8e39c2012-07-06 12:46:23 +0200750 parent = u8500_init_devices(&ab8500_platdata);
Lee Jones110c2c22011-08-26 16:54:07 +0100751
Lee Jonesb024a0c2012-02-06 11:22:25 -0800752 for (i = 0; i < ARRAY_SIZE(mop500_platform_devs); i++)
753 mop500_platform_devs[i]->dev.parent = parent;
754
Lee Jones110c2c22011-08-26 16:54:07 +0100755 platform_add_devices(mop500_platform_devs,
756 ARRAY_SIZE(mop500_platform_devs));
757
Lee Jones18403422012-02-06 11:22:21 -0800758 mop500_i2c_init(parent);
759 hrefv60_sdi_init(parent);
760 mop500_spi_init(parent);
Lee Jones39b740b2012-09-14 15:46:29 +0100761 mop500_audio_init(parent);
Lee Jones18403422012-02-06 11:22:21 -0800762 mop500_uart_init(parent);
Lee Jones110c2c22011-08-26 16:54:07 +0100763
764 i2c0_devs = ARRAY_SIZE(mop500_i2c0_devices);
765
766 i2c0_devs -= NUM_PRE_V60_I2C0_DEVICES;
Linus Walleijcf568c52011-03-30 14:31:42 +0200767
768 i2c_register_board_info(0, mop500_i2c0_devices, i2c0_devs);
Philippe Langlaisdd7b2a02011-01-12 11:26:20 +0100769 i2c_register_board_info(2, mop500_i2c2_devices,
770 ARRAY_SIZE(mop500_i2c2_devices));
Linus Walleijdb245202011-04-04 10:44:51 +0200771
772 /* This board has full regulator constraints */
773 regulator_has_full_constraints();
Srinidhi Kasagaraa44ef42009-11-28 08:17:18 +0100774}
775
776MACHINE_START(U8500, "ST-Ericsson MOP500 platform")
777 /* Maintainer: Srinidhi Kasagar <srinidhi.kasagar@stericsson.com> */
Nicolas Pitrebc77b1a2011-07-05 22:38:18 -0400778 .atag_offset = 0x100,
Marc Zyngier5ac21a92011-09-08 13:15:22 +0100779 .smp = smp_ops(ux500_smp_ops),
Srinidhi Kasagaraa44ef42009-11-28 08:17:18 +0100780 .map_io = u8500_map_io,
Rabin Vincent178980f2010-05-03 07:39:02 +0100781 .init_irq = ux500_init_irq,
Srinidhi Kasagaraa44ef42009-11-28 08:17:18 +0100782 /* we re-use nomadik timer here */
Stephen Warren6bb27d72012-11-08 12:40:59 -0700783 .init_time = ux500_timer_init,
Linus Walleij4b4f7572011-02-15 15:01:35 +0100784 .init_machine = mop500_init_machine,
Shawn Guoa010bc22012-05-02 17:10:07 +0800785 .init_late = ux500_init_late,
Linus Walleij4b4f7572011-02-15 15:01:35 +0100786MACHINE_END
787
Linus Walleija3a6c6a2012-10-01 09:37:39 +0200788MACHINE_START(U8520, "ST-Ericsson U8520 Platform HREFP520")
789 .atag_offset = 0x100,
790 .map_io = u8500_map_io,
791 .init_irq = ux500_init_irq,
Stephen Warren6bb27d72012-11-08 12:40:59 -0700792 .init_time = ux500_timer_init,
Linus Walleija3a6c6a2012-10-01 09:37:39 +0200793 .init_machine = mop500_init_machine,
794 .init_late = ux500_init_late,
795MACHINE_END
796
Linus Walleij4b4f7572011-02-15 15:01:35 +0100797MACHINE_START(HREFV60, "ST-Ericsson U8500 Platform HREFv60+")
Nicolas Pitrebc77b1a2011-07-05 22:38:18 -0400798 .atag_offset = 0x100,
Marc Zyngier5ac21a92011-09-08 13:15:22 +0100799 .smp = smp_ops(ux500_smp_ops),
Linus Walleij4b4f7572011-02-15 15:01:35 +0100800 .map_io = u8500_map_io,
801 .init_irq = ux500_init_irq,
Stephen Warren6bb27d72012-11-08 12:40:59 -0700802 .init_time = ux500_timer_init,
Lee Jones110c2c22011-08-26 16:54:07 +0100803 .init_machine = hrefv60_init_machine,
Shawn Guoa010bc22012-05-02 17:10:07 +0800804 .init_late = ux500_init_late,
Srinidhi Kasagaraa44ef42009-11-28 08:17:18 +0100805MACHINE_END
Robert Marklund350abe02011-06-20 15:55:46 +0200806
807MACHINE_START(SNOWBALL, "Calao Systems Snowball platform")
Nicolas Pitrebc77b1a2011-07-05 22:38:18 -0400808 .atag_offset = 0x100,
Marc Zyngier5ac21a92011-09-08 13:15:22 +0100809 .smp = smp_ops(ux500_smp_ops),
Robert Marklund350abe02011-06-20 15:55:46 +0200810 .map_io = u8500_map_io,
811 .init_irq = ux500_init_irq,
812 /* we re-use nomadik timer here */
Stephen Warren6bb27d72012-11-08 12:40:59 -0700813 .init_time = ux500_timer_init,
Lee Jones110c2c22011-08-26 16:54:07 +0100814 .init_machine = snowball_init_machine,
Lee Jones0ddf8552012-09-25 16:03:45 +0100815 .init_late = NULL,
Robert Marklund350abe02011-06-20 15:55:46 +0200816MACHINE_END