Blame view

arch/arm/mach-ux500/board-mop500.c 17.9 KB
aa44ef4d4   Srinidhi Kasagar   ARM: 5831/1: ARM:...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  /*
   * Copyright (C) 2008-2009 ST-Ericsson
   *
   * Author: Srinidhi KASAGAR <srinidhi.kasagar@stericsson.com>
   *
   * This program is free software; you can redistribute it and/or modify
   * it under the terms of the GNU General Public License version 2, as
   * published by the Free Software Foundation.
   *
   */
  #include <linux/kernel.h>
  #include <linux/init.h>
  #include <linux/interrupt.h>
  #include <linux/platform_device.h>
  #include <linux/io.h>
b8410a150   Rabin Vincent   ux500: mop500: ad...
16
  #include <linux/i2c.h>
ea05a57f6   Rabin Vincent   ARM: 6161/1: mop5...
17
  #include <linux/gpio.h>
aa44ef4d4   Srinidhi Kasagar   ARM: 5831/1: ARM:...
18
19
  #include <linux/amba/bus.h>
  #include <linux/amba/pl022.h>
5d7b8467e   Linus Walleij   mach-ux500: confi...
20
  #include <linux/amba/serial.h>
aa44ef4d4   Srinidhi Kasagar   ARM: 5831/1: ARM:...
21
  #include <linux/spi/spi.h>
ee66e653c   Linus Walleij   mfd: Unify abx500...
22
  #include <linux/mfd/abx500/ab8500.h>
79568b941   Bengt Jonsson   regulator: initia...
23
  #include <linux/regulator/ab8500.h>
20406ebff   Sundar Iyer   mfd/tc3589x: rena...
24
  #include <linux/mfd/tc3589x.h>
fe67dfc87   Linus Walleij   mach-ux500: confi...
25
  #include <linux/mfd/tps6105x.h>
ee66e653c   Linus Walleij   mfd: Unify abx500...
26
  #include <linux/mfd/abx500/ab8500-gpio.h>
dd7b2a055   Philippe Langlais   mach-ux500: platf...
27
  #include <linux/leds-lp5521.h>
a71b819b6   Philippe Langlais   mach-ux500: platf...
28
  #include <linux/input.h>
350abe037   Robert Marklund   mach-ux500: add b...
29
  #include <linux/smsc911x.h>
a71b819b6   Philippe Langlais   mach-ux500: platf...
30
  #include <linux/gpio_keys.h>
1a7d4369b   Shreshtha Kumar Sahu   amba pl011: platf...
31
  #include <linux/delay.h>
aa44ef4d4   Srinidhi Kasagar   ARM: 5831/1: ARM:...
32

350abe037   Robert Marklund   mach-ux500: add b...
33
  #include <linux/leds.h>
aa44ef4d4   Srinidhi Kasagar   ARM: 5831/1: ARM:...
34
35
  #include <asm/mach-types.h>
  #include <asm/mach/arch.h>
bbf5f3859   Marc Zyngier   ARM: ux500: conve...
36
  #include <asm/hardware/gic.h>
aa44ef4d4   Srinidhi Kasagar   ARM: 5831/1: ARM:...
37

d48a41c18   Srinidhi Kasagar   ARM: 5913/1: ARM ...
38
  #include <plat/i2c.h>
5d7b8467e   Linus Walleij   mach-ux500: confi...
39
  #include <plat/ste_dma40.h>
1a7d4369b   Shreshtha Kumar Sahu   amba pl011: platf...
40
  #include <plat/pincfg.h>
0f3328619   Linus Walleij   ARM: 7032/1: plat...
41
  #include <plat/gpio-nomadik.h>
aa44ef4d4   Srinidhi Kasagar   ARM: 5831/1: ARM:...
42
43
44
  
  #include <mach/hardware.h>
  #include <mach/setup.h>
9e4e7fe1a   Rabin Vincent   ARM: 6083/1: ux50...
45
  #include <mach/devices.h>
29aeb3cfe   Linus Walleij   ARM: 6337/2: AB85...
46
  #include <mach/irqs.h>
aa44ef4d4   Srinidhi Kasagar   ARM: 5831/1: ARM:...
47

1a7d4369b   Shreshtha Kumar Sahu   amba pl011: platf...
48
  #include "pins-db8500.h"
5d7b8467e   Linus Walleij   mach-ux500: confi...
49
  #include "ste-dma40-db8500.h"
fbf1eadf9   Rabin Vincent   ux500: rework dev...
50
  #include "devices-db8500.h"
008f8a2f7   Hanumath Prasad   ARM: 6335/1: ux50...
51
  #include "board-mop500.h"
a1e516e3a   Bengt Jonsson   mach-ux500: Updat...
52
  #include "board-mop500-regulators.h"
ea05a57f6   Rabin Vincent   ARM: 6161/1: mop5...
53

350abe037   Robert Marklund   mach-ux500: add b...
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
  static struct gpio_led snowball_led_array[] = {
  	{
  		.name = "user_led",
  		.default_trigger = "none",
  		.gpio = 142,
  	},
  };
  
  static struct gpio_led_platform_data snowball_led_data = {
  	.leds = snowball_led_array,
  	.num_leds = ARRAY_SIZE(snowball_led_array),
  };
  
  static struct platform_device snowball_led_dev = {
  	.name = "leds-gpio",
  	.dev = {
  		.platform_data = &snowball_led_data,
  	},
  };
3ef374a22   Bibek Basu   mach-ux500: board...
73
74
75
76
77
78
79
80
  static struct ab8500_gpio_platform_data ab8500_gpio_pdata = {
  	.gpio_base		= MOP500_AB8500_GPIO(0),
  	.irq_base		= MOP500_AB8500_VIR_GPIO_IRQ_BASE,
  	/* config_reg is the initial configuration of ab8500 pins.
  	 * The pins can be configured as GPIO or alt functions based
  	 * on value present in GpioSel1 to GpioSel6 and AlternatFunction
  	 * register. This is the array of 7 configuration settings.
  	 * One has to compile time decide these settings. Below is the
25985edce   Lucas De Marchi   Fix common misspe...
81
  	 * explanation of these setting
3ef374a22   Bibek Basu   mach-ux500: board...
82
83
84
85
86
87
88
89
90
91
92
93
  	 * GpioSel1 = 0x00 => Pins GPIO1 to GPIO8 are not used as GPIO
  	 * GpioSel2 = 0x1E => Pins GPIO10 to GPIO13 are configured as GPIO
  	 * GpioSel3 = 0x80 => Pin GPIO24 is configured as GPIO
  	 * GpioSel4 = 0x01 => Pin GPIo25 is configured as GPIO
  	 * GpioSel5 = 0x7A => Pins GPIO34, GPIO36 to GPIO39 are conf as GPIO
  	 * GpioSel6 = 0x00 => Pins GPIO41 & GPIo42 are not configured as GPIO
  	 * AlternaFunction = 0x00 => If Pins GPIO10 to 13 are not configured
  	 * as GPIO then this register selectes the alternate fucntions
  	 */
  	.config_reg		= {0x00, 0x1E, 0x80, 0x01,
  					0x7A, 0x00, 0x00},
  };
350abe037   Robert Marklund   mach-ux500: add b...
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
  static struct gpio_keys_button snowball_key_array[] = {
  	{
  		.gpio           = 32,
  		.type           = EV_KEY,
  		.code           = KEY_1,
  		.desc           = "userpb",
  		.active_low     = 1,
  		.debounce_interval = 50,
  		.wakeup         = 1,
  	},
  	{
  		.gpio           = 151,
  		.type           = EV_KEY,
  		.code           = KEY_2,
  		.desc           = "extkb1",
  		.active_low     = 1,
  		.debounce_interval = 50,
  		.wakeup         = 1,
  	},
  	{
  		.gpio           = 152,
  		.type           = EV_KEY,
  		.code           = KEY_3,
  		.desc           = "extkb2",
  		.active_low     = 1,
  		.debounce_interval = 50,
  		.wakeup         = 1,
  	},
  	{
  		.gpio           = 161,
  		.type           = EV_KEY,
  		.code           = KEY_4,
  		.desc           = "extkb3",
  		.active_low     = 1,
  		.debounce_interval = 50,
  		.wakeup         = 1,
  	},
  	{
  		.gpio           = 162,
  		.type           = EV_KEY,
  		.code           = KEY_5,
  		.desc           = "extkb4",
  		.active_low     = 1,
  		.debounce_interval = 50,
  		.wakeup         = 1,
  	},
  };
  
  static struct gpio_keys_platform_data snowball_key_data = {
  	.buttons        = snowball_key_array,
  	.nbuttons       = ARRAY_SIZE(snowball_key_array),
  };
  
  static struct platform_device snowball_key_dev = {
  	.name           = "gpio-keys",
  	.id             = -1,
  	.dev            = {
  		.platform_data  = &snowball_key_data,
  	}
  };
  
  static struct smsc911x_platform_config snowball_sbnet_cfg = {
  	.irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_HIGH,
  	.irq_type = SMSC911X_IRQ_TYPE_PUSH_PULL,
  	.flags = SMSC911X_USE_16BIT | SMSC911X_FORCE_INTERNAL_PHY,
  	.shift = 1,
  };
  
  static struct resource sbnet_res[] = {
  	{
  		.name = "smsc911x-memory",
  		.start = (0x5000 << 16),
  		.end  =  (0x5000 << 16) + 0xffff,
  		.flags = IORESOURCE_MEM,
  	},
  	{
  		.start = NOMADIK_GPIO_TO_IRQ(140),
  		.end = NOMADIK_GPIO_TO_IRQ(140),
  		.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE,
  	},
  };
  
  static struct platform_device snowball_sbnet_dev = {
  	.name           = "smsc911x",
  	.num_resources  = ARRAY_SIZE(sbnet_res),
  	.resource       = sbnet_res,
  	.dev            = {
  		.platform_data = &snowball_sbnet_cfg,
  	},
  };
39ae702cd   Rabin Vincent   ARM: 6267/1: mop5...
184
185
  static struct ab8500_platform_data ab8500_platdata = {
  	.irq_base	= MOP500_AB8500_IRQ_BASE,
dfa3a824d   Bengt Jonsson   mach-ux500: provi...
186
187
  	.regulator_reg_init = ab8500_regulator_reg_init,
  	.num_regulator_reg_init	= ARRAY_SIZE(ab8500_regulator_reg_init),
a1e516e3a   Bengt Jonsson   mach-ux500: Updat...
188
189
  	.regulator	= ab8500_regulators,
  	.num_regulator	= ARRAY_SIZE(ab8500_regulators),
3ef374a22   Bibek Basu   mach-ux500: board...
190
  	.gpio		= &ab8500_gpio_pdata,
39ae702cd   Rabin Vincent   ARM: 6267/1: mop5...
191
  };
29aeb3cfe   Linus Walleij   ARM: 6337/2: AB85...
192
193
  static struct resource ab8500_resources[] = {
  	[0] = {
22039b7cc   Rabin Vincent   ux500: remove amb...
194
195
196
  		.start	= IRQ_DB8500_AB8500,
  		.end	= IRQ_DB8500_AB8500,
  		.flags	= IORESOURCE_IRQ
29aeb3cfe   Linus Walleij   ARM: 6337/2: AB85...
197
198
199
200
201
202
203
204
205
206
207
208
  	}
  };
  
  struct platform_device ab8500_device = {
  	.name = "ab8500-i2c",
  	.id = 0,
  	.dev = {
  		.platform_data = &ab8500_platdata,
  	},
  	.num_resources = 1,
  	.resource = ab8500_resources,
  };
b8410a150   Rabin Vincent   ux500: mop500: ad...
209
  /*
fe67dfc87   Linus Walleij   mach-ux500: confi...
210
211
212
213
214
215
216
217
218
   * TPS61052
   */
  
  static struct tps6105x_platform_data mop500_tps61052_data = {
  	.mode = TPS6105X_MODE_VOLTAGE,
  	.regulator_data = &tps61052_regulator,
  };
  
  /*
b8410a150   Rabin Vincent   ux500: mop500: ad...
219
220
   * TC35892
   */
20406ebff   Sundar Iyer   mfd/tc3589x: rena...
221
  static void mop500_tc35892_init(struct tc3589x *tc3589x, unsigned int base)
b8410a150   Rabin Vincent   ux500: mop500: ad...
222
223
224
  {
  	mop500_sdi_tc35892_init();
  }
20406ebff   Sundar Iyer   mfd/tc3589x: rena...
225
  static struct tc3589x_gpio_platform_data mop500_tc35892_gpio_data = {
b8410a150   Rabin Vincent   ux500: mop500: ad...
226
227
228
  	.gpio_base	= MOP500_EGPIO(0),
  	.setup		= mop500_tc35892_init,
  };
20406ebff   Sundar Iyer   mfd/tc3589x: rena...
229
  static struct tc3589x_platform_data mop500_tc35892_data = {
611b7590a   Sundar Iyer   mfd/tc3589x: add ...
230
  	.block		= TC3589x_BLOCK_GPIO,
b8410a150   Rabin Vincent   ux500: mop500: ad...
231
232
233
  	.gpio		= &mop500_tc35892_gpio_data,
  	.irq_base	= MOP500_EGPIO_IRQ_BASE,
  };
dd7b2a055   Philippe Langlais   mach-ux500: platf...
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
  static struct lp5521_led_config lp5521_pri_led[] = {
         [0] = {
  	       .chan_nr = 0,
  	       .led_current = 0x2f,
  	       .max_current = 0x5f,
         },
         [1] = {
  	       .chan_nr = 1,
  	       .led_current = 0x2f,
  	       .max_current = 0x5f,
         },
         [2] = {
  	       .chan_nr = 2,
  	       .led_current = 0x2f,
  	       .max_current = 0x5f,
         },
  };
  
  static struct lp5521_platform_data __initdata lp5521_pri_data = {
         .label = "lp5521_pri",
         .led_config     = &lp5521_pri_led[0],
         .num_channels   = 3,
         .clock_mode     = LP5521_CLOCK_EXT,
  };
  
  static struct lp5521_led_config lp5521_sec_led[] = {
         [0] = {
  	       .chan_nr = 0,
  	       .led_current = 0x2f,
  	       .max_current = 0x5f,
         },
         [1] = {
  	       .chan_nr = 1,
  	       .led_current = 0x2f,
  	       .max_current = 0x5f,
         },
         [2] = {
  	       .chan_nr = 2,
  	       .led_current = 0x2f,
  	       .max_current = 0x5f,
         },
  };
  
  static struct lp5521_platform_data __initdata lp5521_sec_data = {
         .label = "lp5521_sec",
         .led_config     = &lp5521_sec_led[0],
         .num_channels   = 3,
         .clock_mode     = LP5521_CLOCK_EXT,
  };
fe67dfc87   Linus Walleij   mach-ux500: confi...
283
  static struct i2c_board_info __initdata mop500_i2c0_devices[] = {
b8410a150   Rabin Vincent   ux500: mop500: ad...
284
  	{
20406ebff   Sundar Iyer   mfd/tc3589x: rena...
285
  		I2C_BOARD_INFO("tc3589x", 0x42),
dd7b2a055   Philippe Langlais   mach-ux500: platf...
286
  		.irq		= NOMADIK_GPIO_TO_IRQ(217),
b8410a150   Rabin Vincent   ux500: mop500: ad...
287
288
  		.platform_data  = &mop500_tc35892_data,
  	},
cf568c58e   Linus Walleij   mach-ux500: fix i...
289
  	/* I2C0 devices only available prior to HREFv60 */
fe67dfc87   Linus Walleij   mach-ux500: confi...
290
291
292
293
294
  	{
  		I2C_BOARD_INFO("tps61052", 0x33),
  		.platform_data  = &mop500_tps61052_data,
  	},
  };
cf568c58e   Linus Walleij   mach-ux500: fix i...
295
  #define NUM_PRE_V60_I2C0_DEVICES 1
dd7b2a055   Philippe Langlais   mach-ux500: platf...
296
297
298
299
300
301
302
303
304
305
306
  static struct i2c_board_info __initdata mop500_i2c2_devices[] = {
  	{
  		/* lp5521 LED driver, 1st device */
  		I2C_BOARD_INFO("lp5521", 0x33),
  		.platform_data = &lp5521_pri_data,
  	},
  	{
  		/* lp5521 LED driver, 2st device */
  		I2C_BOARD_INFO("lp5521", 0x34),
  		.platform_data = &lp5521_sec_data,
  	},
bb3b21875   Lee Jones   mach-ux500: Add R...
307
308
309
310
  	{
  		/* Light sensor Rohm BH1780GLI */
  		I2C_BOARD_INFO("bh1780", 0x29),
  	},
dd7b2a055   Philippe Langlais   mach-ux500: platf...
311
  };
2b030bda6   Linus Walleij   mach-ux500: set p...
312
  #define U8500_I2C_CONTROLLER(id, _slsu, _tft, _rft, clk, t_out, _sm)	\
f9faf2379   Rabin Vincent   ARM: 6085/1: ux50...
313
  static struct nmk_i2c_controller u8500_i2c##id##_data = { \
d48a41c18   Srinidhi Kasagar   ARM: 5913/1: ARM ...
314
315
316
317
318
319
320
321
322
323
324
325
326
  	/*				\
  	 * slave data setup time, which is	\
  	 * 250 ns,100ns,10ns which is 14,6,2	\
  	 * respectively for a 48 Mhz	\
  	 * i2c clock			\
  	 */				\
  	.slsu		= _slsu,	\
  	/* Tx FIFO threshold */		\
  	.tft		= _tft,		\
  	/* Rx FIFO threshold */		\
  	.rft		= _rft,		\
  	/* std. mode operation */	\
  	.clk_freq	= clk,		\
2b030bda6   Linus Walleij   mach-ux500: set p...
327
328
  	/* Slave response timeout(ms) */\
  	.timeout	= t_out,	\
d48a41c18   Srinidhi Kasagar   ARM: 5913/1: ARM ...
329
330
331
332
333
334
  	.sm		= _sm,		\
  }
  
  /*
   * The board uses 4 i2c controllers, initialize all of
   * them with slave data setup time of 250 ns,
2b030bda6   Linus Walleij   mach-ux500: set p...
335
   * Tx & Rx FIFO threshold values as 8 and standard
d48a41c18   Srinidhi Kasagar   ARM: 5913/1: ARM ...
336
337
   * mode of operation
   */
2b030bda6   Linus Walleij   mach-ux500: set p...
338
339
340
341
  U8500_I2C_CONTROLLER(0, 0xe, 1, 8, 100000, 200, I2C_FREQ_MODE_FAST);
  U8500_I2C_CONTROLLER(1, 0xe, 1, 8, 100000, 200, I2C_FREQ_MODE_FAST);
  U8500_I2C_CONTROLLER(2,	0xe, 1, 8, 100000, 200, I2C_FREQ_MODE_FAST);
  U8500_I2C_CONTROLLER(3,	0xe, 1, 8, 100000, 200, I2C_FREQ_MODE_FAST);
d48a41c18   Srinidhi Kasagar   ARM: 5913/1: ARM ...
342

fbf1eadf9   Rabin Vincent   ux500: rework dev...
343
344
345
346
347
348
349
  static void __init mop500_i2c_init(void)
  {
  	db8500_add_i2c0(&u8500_i2c0_data);
  	db8500_add_i2c1(&u8500_i2c1_data);
  	db8500_add_i2c2(&u8500_i2c2_data);
  	db8500_add_i2c3(&u8500_i2c3_data);
  }
aa44ef4d4   Srinidhi Kasagar   ARM: 5831/1: ARM:...
350

a71b819b6   Philippe Langlais   mach-ux500: platf...
351
352
353
354
355
  static struct gpio_keys_button mop500_gpio_keys[] = {
  	{
  		.desc			= "SFH7741 Proximity Sensor",
  		.type			= EV_SW,
  		.code			= SW_FRONT_PROXIMITY,
a71b819b6   Philippe Langlais   mach-ux500: platf...
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
  		.active_low		= 0,
  		.can_disable		= 1,
  	}
  };
  
  static struct regulator *prox_regulator;
  static int mop500_prox_activate(struct device *dev);
  static void mop500_prox_deactivate(struct device *dev);
  
  static struct gpio_keys_platform_data mop500_gpio_keys_data = {
  	.buttons	= mop500_gpio_keys,
  	.nbuttons	= ARRAY_SIZE(mop500_gpio_keys),
  	.enable		= mop500_prox_activate,
  	.disable	= mop500_prox_deactivate,
  };
  
  static struct platform_device mop500_gpio_keys_device = {
  	.name	= "gpio-keys",
  	.id	= 0,
  	.dev	= {
  		.platform_data	= &mop500_gpio_keys_data,
  	},
  };
  
  static int mop500_prox_activate(struct device *dev)
  {
  	prox_regulator = regulator_get(&mop500_gpio_keys_device.dev,
  						"vcc");
  	if (IS_ERR(prox_regulator)) {
  		dev_err(&mop500_gpio_keys_device.dev,
  			"no regulator
  ");
  		return PTR_ERR(prox_regulator);
  	}
  	regulator_enable(prox_regulator);
  	return 0;
  }
  
  static void mop500_prox_deactivate(struct device *dev)
  {
  	regulator_disable(prox_regulator);
  	regulator_put(prox_regulator);
  }
d48a41c18   Srinidhi Kasagar   ARM: 5913/1: ARM ...
399
  /* add any platform devices here - TODO */
350abe037   Robert Marklund   mach-ux500: add b...
400
  static struct platform_device *mop500_platform_devs[] __initdata = {
a71b819b6   Philippe Langlais   mach-ux500: platf...
401
  	&mop500_gpio_keys_device,
350abe037   Robert Marklund   mach-ux500: add b...
402
  	&ab8500_device,
d48a41c18   Srinidhi Kasagar   ARM: 5913/1: ARM ...
403
  };
5d7b8467e   Linus Walleij   mach-ux500: confi...
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
  #ifdef CONFIG_STE_DMA40
  static struct stedma40_chan_cfg ssp0_dma_cfg_rx = {
  	.mode = STEDMA40_MODE_LOGICAL,
  	.dir = STEDMA40_PERIPH_TO_MEM,
  	.src_dev_type =  DB8500_DMA_DEV8_SSP0_RX,
  	.dst_dev_type = STEDMA40_DEV_DST_MEMORY,
  	.src_info.data_width = STEDMA40_BYTE_WIDTH,
  	.dst_info.data_width = STEDMA40_BYTE_WIDTH,
  };
  
  static struct stedma40_chan_cfg ssp0_dma_cfg_tx = {
  	.mode = STEDMA40_MODE_LOGICAL,
  	.dir = STEDMA40_MEM_TO_PERIPH,
  	.src_dev_type = STEDMA40_DEV_SRC_MEMORY,
  	.dst_dev_type = DB8500_DMA_DEV8_SSP0_TX,
  	.src_info.data_width = STEDMA40_BYTE_WIDTH,
  	.dst_info.data_width = STEDMA40_BYTE_WIDTH,
  };
  #endif
  
  static struct pl022_ssp_controller ssp0_platform_data = {
  	.bus_id = 0,
  #ifdef CONFIG_STE_DMA40
  	.enable_dma = 1,
  	.dma_filter = stedma40_filter,
  	.dma_rx_param = &ssp0_dma_cfg_rx,
  	.dma_tx_param = &ssp0_dma_cfg_tx,
  #else
  	.enable_dma = 0,
  #endif
  	/* on this platform, gpio 31,142,144,214 &
  	 * 224 are connected as chip selects
  	 */
  	.num_chipselect = 5,
  };
fbf1eadf9   Rabin Vincent   ux500: rework dev...
439
  static void __init mop500_spi_init(void)
aa44ef4d4   Srinidhi Kasagar   ARM: 5831/1: ARM:...
440
  {
fbf1eadf9   Rabin Vincent   ux500: rework dev...
441
442
  	db8500_add_ssp0(&ssp0_platform_data);
  }
aa44ef4d4   Srinidhi Kasagar   ARM: 5831/1: ARM:...
443

5d7b8467e   Linus Walleij   mach-ux500: confi...
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
  #ifdef CONFIG_STE_DMA40
  static struct stedma40_chan_cfg uart0_dma_cfg_rx = {
  	.mode = STEDMA40_MODE_LOGICAL,
  	.dir = STEDMA40_PERIPH_TO_MEM,
  	.src_dev_type =  DB8500_DMA_DEV13_UART0_RX,
  	.dst_dev_type = STEDMA40_DEV_DST_MEMORY,
  	.src_info.data_width = STEDMA40_BYTE_WIDTH,
  	.dst_info.data_width = STEDMA40_BYTE_WIDTH,
  };
  
  static struct stedma40_chan_cfg uart0_dma_cfg_tx = {
  	.mode = STEDMA40_MODE_LOGICAL,
  	.dir = STEDMA40_MEM_TO_PERIPH,
  	.src_dev_type = STEDMA40_DEV_SRC_MEMORY,
  	.dst_dev_type = DB8500_DMA_DEV13_UART0_TX,
  	.src_info.data_width = STEDMA40_BYTE_WIDTH,
  	.dst_info.data_width = STEDMA40_BYTE_WIDTH,
  };
  
  static struct stedma40_chan_cfg uart1_dma_cfg_rx = {
  	.mode = STEDMA40_MODE_LOGICAL,
  	.dir = STEDMA40_PERIPH_TO_MEM,
  	.src_dev_type =  DB8500_DMA_DEV12_UART1_RX,
  	.dst_dev_type = STEDMA40_DEV_DST_MEMORY,
  	.src_info.data_width = STEDMA40_BYTE_WIDTH,
  	.dst_info.data_width = STEDMA40_BYTE_WIDTH,
  };
  
  static struct stedma40_chan_cfg uart1_dma_cfg_tx = {
  	.mode = STEDMA40_MODE_LOGICAL,
  	.dir = STEDMA40_MEM_TO_PERIPH,
  	.src_dev_type = STEDMA40_DEV_SRC_MEMORY,
  	.dst_dev_type = DB8500_DMA_DEV12_UART1_TX,
  	.src_info.data_width = STEDMA40_BYTE_WIDTH,
  	.dst_info.data_width = STEDMA40_BYTE_WIDTH,
  };
  
  static struct stedma40_chan_cfg uart2_dma_cfg_rx = {
  	.mode = STEDMA40_MODE_LOGICAL,
  	.dir = STEDMA40_PERIPH_TO_MEM,
  	.src_dev_type =  DB8500_DMA_DEV11_UART2_RX,
  	.dst_dev_type = STEDMA40_DEV_DST_MEMORY,
  	.src_info.data_width = STEDMA40_BYTE_WIDTH,
  	.dst_info.data_width = STEDMA40_BYTE_WIDTH,
  };
  
  static struct stedma40_chan_cfg uart2_dma_cfg_tx = {
  	.mode = STEDMA40_MODE_LOGICAL,
  	.dir = STEDMA40_MEM_TO_PERIPH,
  	.src_dev_type = STEDMA40_DEV_SRC_MEMORY,
  	.dst_dev_type = DB8500_DMA_DEV11_UART2_TX,
  	.src_info.data_width = STEDMA40_BYTE_WIDTH,
  	.dst_info.data_width = STEDMA40_BYTE_WIDTH,
  };
  #endif
1a7d4369b   Shreshtha Kumar Sahu   amba pl011: platf...
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
  
  static pin_cfg_t mop500_pins_uart0[] = {
  	GPIO0_U0_CTSn   | PIN_INPUT_PULLUP,
  	GPIO1_U0_RTSn   | PIN_OUTPUT_HIGH,
  	GPIO2_U0_RXD    | PIN_INPUT_PULLUP,
  	GPIO3_U0_TXD    | PIN_OUTPUT_HIGH,
  };
  
  #define PRCC_K_SOFTRST_SET      0x18
  #define PRCC_K_SOFTRST_CLEAR    0x1C
  static void ux500_uart0_reset(void)
  {
  	void __iomem *prcc_rst_set, *prcc_rst_clr;
  
  	prcc_rst_set = (void __iomem *)IO_ADDRESS(U8500_CLKRST1_BASE +
  			PRCC_K_SOFTRST_SET);
  	prcc_rst_clr = (void __iomem *)IO_ADDRESS(U8500_CLKRST1_BASE +
  			PRCC_K_SOFTRST_CLEAR);
  
  	/* Activate soft reset PRCC_K_SOFTRST_CLEAR */
  	writel((readl(prcc_rst_clr) | 0x1), prcc_rst_clr);
  	udelay(1);
  
  	/* Release soft reset PRCC_K_SOFTRST_SET */
  	writel((readl(prcc_rst_set) | 0x1), prcc_rst_set);
  	udelay(1);
  }
  
  static void ux500_uart0_init(void)
  {
  	int ret;
  
  	ret = nmk_config_pins(mop500_pins_uart0,
  			ARRAY_SIZE(mop500_pins_uart0));
  	if (ret < 0)
  		pr_err("pl011: uart pins_enable failed
  ");
  }
  
  static void ux500_uart0_exit(void)
  {
  	int ret;
  
  	ret = nmk_config_pins_sleep(mop500_pins_uart0,
  			ARRAY_SIZE(mop500_pins_uart0));
  	if (ret < 0)
  		pr_err("pl011: uart pins_disable failed
  ");
  }
5d7b8467e   Linus Walleij   mach-ux500: confi...
548
549
550
551
552
553
  static struct amba_pl011_data uart0_plat = {
  #ifdef CONFIG_STE_DMA40
  	.dma_filter = stedma40_filter,
  	.dma_rx_param = &uart0_dma_cfg_rx,
  	.dma_tx_param = &uart0_dma_cfg_tx,
  #endif
1a7d4369b   Shreshtha Kumar Sahu   amba pl011: platf...
554
555
556
  	.init = ux500_uart0_init,
  	.exit = ux500_uart0_exit,
  	.reset = ux500_uart0_reset,
5d7b8467e   Linus Walleij   mach-ux500: confi...
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
  };
  
  static struct amba_pl011_data uart1_plat = {
  #ifdef CONFIG_STE_DMA40
  	.dma_filter = stedma40_filter,
  	.dma_rx_param = &uart1_dma_cfg_rx,
  	.dma_tx_param = &uart1_dma_cfg_tx,
  #endif
  };
  
  static struct amba_pl011_data uart2_plat = {
  #ifdef CONFIG_STE_DMA40
  	.dma_filter = stedma40_filter,
  	.dma_rx_param = &uart2_dma_cfg_rx,
  	.dma_tx_param = &uart2_dma_cfg_tx,
  #endif
  };
fbf1eadf9   Rabin Vincent   ux500: rework dev...
574
575
  static void __init mop500_uart_init(void)
  {
5d7b8467e   Linus Walleij   mach-ux500: confi...
576
577
578
  	db8500_add_uart0(&uart0_plat);
  	db8500_add_uart1(&uart1_plat);
  	db8500_add_uart2(&uart2_plat);
fbf1eadf9   Rabin Vincent   ux500: rework dev...
579
  }
350abe037   Robert Marklund   mach-ux500: add b...
580
581
582
583
584
585
  static struct platform_device *snowball_platform_devs[] __initdata = {
  	&snowball_led_dev,
  	&snowball_key_dev,
  	&snowball_sbnet_dev,
  	&ab8500_device,
  };
4b4f757c8   Linus Walleij   mach-ux500: basic...
586
  static void __init mop500_init_machine(void)
fbf1eadf9   Rabin Vincent   ux500: rework dev...
587
  {
cf568c58e   Linus Walleij   mach-ux500: fix i...
588
  	int i2c0_devs;
110c2c2f4   Lee Jones   mach-ux500: remov...
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
  	mop500_gpio_keys[0].gpio = GPIO_PROX_SENSOR;
  
  	u8500_init_devices();
  
  	mop500_pins_init();
  
  	platform_add_devices(mop500_platform_devs,
  			ARRAY_SIZE(mop500_platform_devs));
  
  	mop500_i2c_init();
  	mop500_sdi_init();
  	mop500_spi_init();
  	mop500_uart_init();
  
  	i2c0_devs = ARRAY_SIZE(mop500_i2c0_devices);
  
  	i2c_register_board_info(0, mop500_i2c0_devices, i2c0_devs);
  	i2c_register_board_info(2, mop500_i2c2_devices,
  				ARRAY_SIZE(mop500_i2c2_devices));
  
  	/* This board has full regulator constraints */
  	regulator_has_full_constraints();
  }
  
  static void __init snowball_init_machine(void)
  {
  	int i2c0_devs;
  
  	u8500_init_devices();
  
  	snowball_pins_init();
  
  	platform_add_devices(snowball_platform_devs,
  			ARRAY_SIZE(snowball_platform_devs));
  
  	mop500_i2c_init();
  	snowball_sdi_init();
  	mop500_spi_init();
  	mop500_uart_init();
  
  	i2c0_devs = ARRAY_SIZE(mop500_i2c0_devices);
  	i2c_register_board_info(0, mop500_i2c0_devices, i2c0_devs);
  	i2c_register_board_info(2, mop500_i2c2_devices,
  				ARRAY_SIZE(mop500_i2c2_devices));
  
  	/* This board has full regulator constraints */
  	regulator_has_full_constraints();
  }
  
  static void __init hrefv60_init_machine(void)
  {
  	int i2c0_devs;
4b4f757c8   Linus Walleij   mach-ux500: basic...
641
642
643
644
645
  	/*
  	 * The HREFv60 board removed a GPIO expander and routed
  	 * all these GPIO pins to the internal GPIO controller
  	 * instead.
  	 */
110c2c2f4   Lee Jones   mach-ux500: remov...
646
  	mop500_gpio_keys[0].gpio = HREFV60_PROX_SENSE_GPIO;
4b4f757c8   Linus Walleij   mach-ux500: basic...
647

ea05a57f6   Rabin Vincent   ARM: 6161/1: mop5...
648
  	u8500_init_devices();
110c2c2f4   Lee Jones   mach-ux500: remov...
649
  	hrefv60_pins_init();
ea05a57f6   Rabin Vincent   ARM: 6161/1: mop5...
650

110c2c2f4   Lee Jones   mach-ux500: remov...
651
652
  	platform_add_devices(mop500_platform_devs,
  			ARRAY_SIZE(mop500_platform_devs));
d48a41c18   Srinidhi Kasagar   ARM: 5913/1: ARM ...
653

fbf1eadf9   Rabin Vincent   ux500: rework dev...
654
  	mop500_i2c_init();
559f7a034   Stefan Nilsson XK   ARM: ux500: suppo...
655
  	hrefv60_sdi_init();
fbf1eadf9   Rabin Vincent   ux500: rework dev...
656
657
  	mop500_spi_init();
  	mop500_uart_init();
008f8a2f7   Hanumath Prasad   ARM: 6335/1: ux50...
658

cf568c58e   Linus Walleij   mach-ux500: fix i...
659
  	i2c0_devs = ARRAY_SIZE(mop500_i2c0_devices);
110c2c2f4   Lee Jones   mach-ux500: remov...
660
661
  
  	i2c0_devs -= NUM_PRE_V60_I2C0_DEVICES;
cf568c58e   Linus Walleij   mach-ux500: fix i...
662
663
  
  	i2c_register_board_info(0, mop500_i2c0_devices, i2c0_devs);
dd7b2a055   Philippe Langlais   mach-ux500: platf...
664
665
  	i2c_register_board_info(2, mop500_i2c2_devices,
  				ARRAY_SIZE(mop500_i2c2_devices));
db24520f9   Linus Walleij   mach-ux500: compl...
666
667
668
  
  	/* This board has full regulator constraints */
  	regulator_has_full_constraints();
aa44ef4d4   Srinidhi Kasagar   ARM: 5831/1: ARM:...
669
670
671
672
  }
  
  MACHINE_START(U8500, "ST-Ericsson MOP500 platform")
  	/* Maintainer: Srinidhi Kasagar <srinidhi.kasagar@stericsson.com> */
bc77b1aa0   Nicolas Pitre   ARM: mach-ux500: ...
673
  	.atag_offset	= 0x100,
aa44ef4d4   Srinidhi Kasagar   ARM: 5831/1: ARM:...
674
  	.map_io		= u8500_map_io,
178980f98   Rabin Vincent   ARM: 6080/1: ux50...
675
  	.init_irq	= ux500_init_irq,
aa44ef4d4   Srinidhi Kasagar   ARM: 5831/1: ARM:...
676
  	/* we re-use nomadik timer here */
41ac329f6   Rabin Vincent   ARM: 6087/1: ux50...
677
  	.timer		= &ux500_timer,
bbf5f3859   Marc Zyngier   ARM: ux500: conve...
678
  	.handle_irq	= gic_handle_irq,
4b4f757c8   Linus Walleij   mach-ux500: basic...
679
680
681
682
  	.init_machine	= mop500_init_machine,
  MACHINE_END
  
  MACHINE_START(HREFV60, "ST-Ericsson U8500 Platform HREFv60+")
bc77b1aa0   Nicolas Pitre   ARM: mach-ux500: ...
683
  	.atag_offset	= 0x100,
4b4f757c8   Linus Walleij   mach-ux500: basic...
684
685
686
  	.map_io		= u8500_map_io,
  	.init_irq	= ux500_init_irq,
  	.timer		= &ux500_timer,
bbf5f3859   Marc Zyngier   ARM: ux500: conve...
687
  	.handle_irq	= gic_handle_irq,
110c2c2f4   Lee Jones   mach-ux500: remov...
688
  	.init_machine	= hrefv60_init_machine,
aa44ef4d4   Srinidhi Kasagar   ARM: 5831/1: ARM:...
689
  MACHINE_END
350abe037   Robert Marklund   mach-ux500: add b...
690
691
  
  MACHINE_START(SNOWBALL, "Calao Systems Snowball platform")
bc77b1aa0   Nicolas Pitre   ARM: mach-ux500: ...
692
  	.atag_offset	= 0x100,
350abe037   Robert Marklund   mach-ux500: add b...
693
694
695
696
  	.map_io		= u8500_map_io,
  	.init_irq	= ux500_init_irq,
  	/* we re-use nomadik timer here */
  	.timer		= &ux500_timer,
bbf5f3859   Marc Zyngier   ARM: ux500: conve...
697
  	.handle_irq	= gic_handle_irq,
110c2c2f4   Lee Jones   mach-ux500: remov...
698
  	.init_machine	= snowball_init_machine,
350abe037   Robert Marklund   mach-ux500: add b...
699
  MACHINE_END