spear3xx.c 11.8 KB
Newer Older
1 2 3 4 5
/*
 * arch/arm/mach-spear3xx/spear3xx.c
 *
 * SPEAr3XX machines common source file
 *
6 7
 * Copyright (C) 2009-2012 ST Microelectronics
 * Viresh Kumar <viresh.kumar@st.com>
8 9 10 11 12 13
 *
 * This file is licensed under the terms of the GNU General Public
 * License version 2. This program is licensed "as is" without any
 * warranty of any kind, whether express or implied.
 */

14 15
#define pr_fmt(fmt) "SPEAr3xx: " fmt

16 17 18
#include <linux/amba/pl022.h>
#include <linux/amba/pl08x.h>
#include <linux/of_irq.h>
19
#include <linux/io.h>
20
#include <asm/hardware/pl080.h>
21
#include <asm/hardware/vic.h>
22
#include <plat/pl080.h>
23
#include <mach/generic.h>
24
#include <mach/spear.h>
25

26 27
/* pad multiplexing support */
/* devices */
28
static struct pmx_dev_mode pmx_firda_modes[] = {
29 30 31 32 33 34
	{
		.ids = 0xffffffff,
		.mask = PMX_FIRDA_MASK,
	},
};

35
struct pmx_dev spear3xx_pmx_firda = {
36 37 38 39 40 41
	.name = "firda",
	.modes = pmx_firda_modes,
	.mode_count = ARRAY_SIZE(pmx_firda_modes),
	.enb_on_reset = 0,
};

42
static struct pmx_dev_mode pmx_i2c_modes[] = {
43 44 45 46 47 48
	{
		.ids = 0xffffffff,
		.mask = PMX_I2C_MASK,
	},
};

49
struct pmx_dev spear3xx_pmx_i2c = {
50 51 52 53 54 55
	.name = "i2c",
	.modes = pmx_i2c_modes,
	.mode_count = ARRAY_SIZE(pmx_i2c_modes),
	.enb_on_reset = 0,
};

56
static struct pmx_dev_mode pmx_ssp_cs_modes[] = {
57 58 59 60 61 62
	{
		.ids = 0xffffffff,
		.mask = PMX_SSP_CS_MASK,
	},
};

63
struct pmx_dev spear3xx_pmx_ssp_cs = {
64 65 66 67 68 69
	.name = "ssp_chip_selects",
	.modes = pmx_ssp_cs_modes,
	.mode_count = ARRAY_SIZE(pmx_ssp_cs_modes),
	.enb_on_reset = 0,
};

70
static struct pmx_dev_mode pmx_ssp_modes[] = {
71 72 73 74 75 76
	{
		.ids = 0xffffffff,
		.mask = PMX_SSP_MASK,
	},
};

77
struct pmx_dev spear3xx_pmx_ssp = {
78 79 80 81 82 83
	.name = "ssp",
	.modes = pmx_ssp_modes,
	.mode_count = ARRAY_SIZE(pmx_ssp_modes),
	.enb_on_reset = 0,
};

84
static struct pmx_dev_mode pmx_mii_modes[] = {
85 86 87 88 89 90
	{
		.ids = 0xffffffff,
		.mask = PMX_MII_MASK,
	},
};

91
struct pmx_dev spear3xx_pmx_mii = {
92 93 94 95 96 97
	.name = "mii",
	.modes = pmx_mii_modes,
	.mode_count = ARRAY_SIZE(pmx_mii_modes),
	.enb_on_reset = 0,
};

98
static struct pmx_dev_mode pmx_gpio_pin0_modes[] = {
99 100 101 102 103 104
	{
		.ids = 0xffffffff,
		.mask = PMX_GPIO_PIN0_MASK,
	},
};

105
struct pmx_dev spear3xx_pmx_gpio_pin0 = {
106 107 108 109 110 111
	.name = "gpio_pin0",
	.modes = pmx_gpio_pin0_modes,
	.mode_count = ARRAY_SIZE(pmx_gpio_pin0_modes),
	.enb_on_reset = 0,
};

112
static struct pmx_dev_mode pmx_gpio_pin1_modes[] = {
113 114 115 116 117 118
	{
		.ids = 0xffffffff,
		.mask = PMX_GPIO_PIN1_MASK,
	},
};

119
struct pmx_dev spear3xx_pmx_gpio_pin1 = {
120 121 122 123 124 125
	.name = "gpio_pin1",
	.modes = pmx_gpio_pin1_modes,
	.mode_count = ARRAY_SIZE(pmx_gpio_pin1_modes),
	.enb_on_reset = 0,
};

126
static struct pmx_dev_mode pmx_gpio_pin2_modes[] = {
127 128 129 130 131 132
	{
		.ids = 0xffffffff,
		.mask = PMX_GPIO_PIN2_MASK,
	},
};

133
struct pmx_dev spear3xx_pmx_gpio_pin2 = {
134 135 136 137 138 139
	.name = "gpio_pin2",
	.modes = pmx_gpio_pin2_modes,
	.mode_count = ARRAY_SIZE(pmx_gpio_pin2_modes),
	.enb_on_reset = 0,
};

140
static struct pmx_dev_mode pmx_gpio_pin3_modes[] = {
141 142 143 144 145 146
	{
		.ids = 0xffffffff,
		.mask = PMX_GPIO_PIN3_MASK,
	},
};

147
struct pmx_dev spear3xx_pmx_gpio_pin3 = {
148 149 150 151 152 153
	.name = "gpio_pin3",
	.modes = pmx_gpio_pin3_modes,
	.mode_count = ARRAY_SIZE(pmx_gpio_pin3_modes),
	.enb_on_reset = 0,
};

154
static struct pmx_dev_mode pmx_gpio_pin4_modes[] = {
155 156 157 158 159 160
	{
		.ids = 0xffffffff,
		.mask = PMX_GPIO_PIN4_MASK,
	},
};

161
struct pmx_dev spear3xx_pmx_gpio_pin4 = {
162 163 164 165 166 167
	.name = "gpio_pin4",
	.modes = pmx_gpio_pin4_modes,
	.mode_count = ARRAY_SIZE(pmx_gpio_pin4_modes),
	.enb_on_reset = 0,
};

168
static struct pmx_dev_mode pmx_gpio_pin5_modes[] = {
169 170 171 172 173 174
	{
		.ids = 0xffffffff,
		.mask = PMX_GPIO_PIN5_MASK,
	},
};

175
struct pmx_dev spear3xx_pmx_gpio_pin5 = {
176 177 178 179 180 181
	.name = "gpio_pin5",
	.modes = pmx_gpio_pin5_modes,
	.mode_count = ARRAY_SIZE(pmx_gpio_pin5_modes),
	.enb_on_reset = 0,
};

182
static struct pmx_dev_mode pmx_uart0_modem_modes[] = {
183 184 185 186 187 188
	{
		.ids = 0xffffffff,
		.mask = PMX_UART0_MODEM_MASK,
	},
};

189
struct pmx_dev spear3xx_pmx_uart0_modem = {
190 191 192 193 194 195
	.name = "uart0_modem",
	.modes = pmx_uart0_modem_modes,
	.mode_count = ARRAY_SIZE(pmx_uart0_modem_modes),
	.enb_on_reset = 0,
};

196
static struct pmx_dev_mode pmx_uart0_modes[] = {
197 198 199 200 201 202
	{
		.ids = 0xffffffff,
		.mask = PMX_UART0_MASK,
	},
};

203
struct pmx_dev spear3xx_pmx_uart0 = {
204 205 206 207 208 209
	.name = "uart0",
	.modes = pmx_uart0_modes,
	.mode_count = ARRAY_SIZE(pmx_uart0_modes),
	.enb_on_reset = 0,
};

210
static struct pmx_dev_mode pmx_timer_3_4_modes[] = {
211 212 213 214 215 216
	{
		.ids = 0xffffffff,
		.mask = PMX_TIMER_3_4_MASK,
	},
};

217
struct pmx_dev spear3xx_pmx_timer_3_4 = {
218 219 220 221 222 223
	.name = "timer_3_4",
	.modes = pmx_timer_3_4_modes,
	.mode_count = ARRAY_SIZE(pmx_timer_3_4_modes),
	.enb_on_reset = 0,
};

224
static struct pmx_dev_mode pmx_timer_1_2_modes[] = {
225 226 227 228 229 230
	{
		.ids = 0xffffffff,
		.mask = PMX_TIMER_1_2_MASK,
	},
};

231
struct pmx_dev spear3xx_pmx_timer_1_2 = {
232 233 234 235 236 237 238 239
	.name = "timer_1_2",
	.modes = pmx_timer_1_2_modes,
	.mode_count = ARRAY_SIZE(pmx_timer_1_2_modes),
	.enb_on_reset = 0,
};

#if defined(CONFIG_MACH_SPEAR310) || defined(CONFIG_MACH_SPEAR320)
/* plgpios devices */
240
static struct pmx_dev_mode pmx_plgpio_0_1_modes[] = {
241 242 243 244 245 246
	{
		.ids = 0x00,
		.mask = PMX_FIRDA_MASK,
	},
};

247
struct pmx_dev spear3xx_pmx_plgpio_0_1 = {
248 249 250 251 252 253
	.name = "plgpio 0 and 1",
	.modes = pmx_plgpio_0_1_modes,
	.mode_count = ARRAY_SIZE(pmx_plgpio_0_1_modes),
	.enb_on_reset = 1,
};

254
static struct pmx_dev_mode pmx_plgpio_2_3_modes[] = {
255 256 257 258 259 260
	{
		.ids = 0x00,
		.mask = PMX_UART0_MASK,
	},
};

261
struct pmx_dev spear3xx_pmx_plgpio_2_3 = {
262 263 264 265 266 267
	.name = "plgpio 2 and 3",
	.modes = pmx_plgpio_2_3_modes,
	.mode_count = ARRAY_SIZE(pmx_plgpio_2_3_modes),
	.enb_on_reset = 1,
};

268
static struct pmx_dev_mode pmx_plgpio_4_5_modes[] = {
269 270 271 272 273 274
	{
		.ids = 0x00,
		.mask = PMX_I2C_MASK,
	},
};

275
struct pmx_dev spear3xx_pmx_plgpio_4_5 = {
276 277 278 279 280 281
	.name = "plgpio 4 and 5",
	.modes = pmx_plgpio_4_5_modes,
	.mode_count = ARRAY_SIZE(pmx_plgpio_4_5_modes),
	.enb_on_reset = 1,
};

282
static struct pmx_dev_mode pmx_plgpio_6_9_modes[] = {
283 284 285 286 287 288
	{
		.ids = 0x00,
		.mask = PMX_SSP_MASK,
	},
};

289
struct pmx_dev spear3xx_pmx_plgpio_6_9 = {
290 291 292 293 294 295
	.name = "plgpio 6 to 9",
	.modes = pmx_plgpio_6_9_modes,
	.mode_count = ARRAY_SIZE(pmx_plgpio_6_9_modes),
	.enb_on_reset = 1,
};

296
static struct pmx_dev_mode pmx_plgpio_10_27_modes[] = {
297 298 299 300 301 302
	{
		.ids = 0x00,
		.mask = PMX_MII_MASK,
	},
};

303
struct pmx_dev spear3xx_pmx_plgpio_10_27 = {
304 305 306 307 308 309
	.name = "plgpio 10 to 27",
	.modes = pmx_plgpio_10_27_modes,
	.mode_count = ARRAY_SIZE(pmx_plgpio_10_27_modes),
	.enb_on_reset = 1,
};

310
static struct pmx_dev_mode pmx_plgpio_28_modes[] = {
311 312 313 314 315 316
	{
		.ids = 0x00,
		.mask = PMX_GPIO_PIN0_MASK,
	},
};

317
struct pmx_dev spear3xx_pmx_plgpio_28 = {
318 319 320 321 322 323
	.name = "plgpio 28",
	.modes = pmx_plgpio_28_modes,
	.mode_count = ARRAY_SIZE(pmx_plgpio_28_modes),
	.enb_on_reset = 1,
};

324
static struct pmx_dev_mode pmx_plgpio_29_modes[] = {
325 326 327 328 329 330
	{
		.ids = 0x00,
		.mask = PMX_GPIO_PIN1_MASK,
	},
};

331
struct pmx_dev spear3xx_pmx_plgpio_29 = {
332 333 334 335 336 337
	.name = "plgpio 29",
	.modes = pmx_plgpio_29_modes,
	.mode_count = ARRAY_SIZE(pmx_plgpio_29_modes),
	.enb_on_reset = 1,
};

338
static struct pmx_dev_mode pmx_plgpio_30_modes[] = {
339 340 341 342 343 344
	{
		.ids = 0x00,
		.mask = PMX_GPIO_PIN2_MASK,
	},
};

345
struct pmx_dev spear3xx_pmx_plgpio_30 = {
346 347 348 349 350 351
	.name = "plgpio 30",
	.modes = pmx_plgpio_30_modes,
	.mode_count = ARRAY_SIZE(pmx_plgpio_30_modes),
	.enb_on_reset = 1,
};

352
static struct pmx_dev_mode pmx_plgpio_31_modes[] = {
353 354 355 356 357 358
	{
		.ids = 0x00,
		.mask = PMX_GPIO_PIN3_MASK,
	},
};

359
struct pmx_dev spear3xx_pmx_plgpio_31 = {
360 361 362 363 364 365
	.name = "plgpio 31",
	.modes = pmx_plgpio_31_modes,
	.mode_count = ARRAY_SIZE(pmx_plgpio_31_modes),
	.enb_on_reset = 1,
};

366
static struct pmx_dev_mode pmx_plgpio_32_modes[] = {
367 368 369 370 371 372
	{
		.ids = 0x00,
		.mask = PMX_GPIO_PIN4_MASK,
	},
};

373
struct pmx_dev spear3xx_pmx_plgpio_32 = {
374 375 376 377 378 379
	.name = "plgpio 32",
	.modes = pmx_plgpio_32_modes,
	.mode_count = ARRAY_SIZE(pmx_plgpio_32_modes),
	.enb_on_reset = 1,
};

380
static struct pmx_dev_mode pmx_plgpio_33_modes[] = {
381 382 383 384 385 386
	{
		.ids = 0x00,
		.mask = PMX_GPIO_PIN5_MASK,
	},
};

387
struct pmx_dev spear3xx_pmx_plgpio_33 = {
388 389 390 391 392 393
	.name = "plgpio 33",
	.modes = pmx_plgpio_33_modes,
	.mode_count = ARRAY_SIZE(pmx_plgpio_33_modes),
	.enb_on_reset = 1,
};

394
static struct pmx_dev_mode pmx_plgpio_34_36_modes[] = {
395 396 397 398 399 400
	{
		.ids = 0x00,
		.mask = PMX_SSP_CS_MASK,
	},
};

401
struct pmx_dev spear3xx_pmx_plgpio_34_36 = {
402 403 404 405 406 407
	.name = "plgpio 34 to 36",
	.modes = pmx_plgpio_34_36_modes,
	.mode_count = ARRAY_SIZE(pmx_plgpio_34_36_modes),
	.enb_on_reset = 1,
};

408
static struct pmx_dev_mode pmx_plgpio_37_42_modes[] = {
409 410 411 412 413 414
	{
		.ids = 0x00,
		.mask = PMX_UART0_MODEM_MASK,
	},
};

415
struct pmx_dev spear3xx_pmx_plgpio_37_42 = {
416 417 418 419 420 421
	.name = "plgpio 37 to 42",
	.modes = pmx_plgpio_37_42_modes,
	.mode_count = ARRAY_SIZE(pmx_plgpio_37_42_modes),
	.enb_on_reset = 1,
};

422
static struct pmx_dev_mode pmx_plgpio_43_44_47_48_modes[] = {
423 424 425 426 427 428
	{
		.ids = 0x00,
		.mask = PMX_TIMER_1_2_MASK,
	},
};

429
struct pmx_dev spear3xx_pmx_plgpio_43_44_47_48 = {
430 431 432 433 434 435
	.name = "plgpio 43, 44, 47 and 48",
	.modes = pmx_plgpio_43_44_47_48_modes,
	.mode_count = ARRAY_SIZE(pmx_plgpio_43_44_47_48_modes),
	.enb_on_reset = 1,
};

436
static struct pmx_dev_mode pmx_plgpio_45_46_49_50_modes[] = {
437 438 439 440 441 442
	{
		.ids = 0x00,
		.mask = PMX_TIMER_3_4_MASK,
	},
};

443
struct pmx_dev spear3xx_pmx_plgpio_45_46_49_50 = {
444 445 446 447 448
	.name = "plgpio 45, 46, 49 and 50",
	.modes = pmx_plgpio_45_46_49_50_modes,
	.mode_count = ARRAY_SIZE(pmx_plgpio_45_46_49_50_modes),
	.enb_on_reset = 1,
};
449
#endif /* CONFIG_MACH_SPEAR310 || CONFIG_MACH_SPEAR320 */
450

451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469
/* ssp device registration */
struct pl022_ssp_controller pl022_plat_data = {
	.bus_id = 0,
	.enable_dma = 1,
	.dma_filter = pl08x_filter_id,
	.dma_tx_param = "ssp0_tx",
	.dma_rx_param = "ssp0_rx",
	/*
	 * This is number of spi devices that can be connected to spi. There are
	 * two type of chipselects on which slave devices can work. One is chip
	 * select provided by spi masters other is controlled through external
	 * gpio's. We can't use chipselect provided from spi master (because as
	 * soon as FIFO becomes empty, CS is disabled and transfer ends). So
	 * this number now depends on number of gpios available for spi. each
	 * slave on each master requires a separate gpio pin.
	 */
	.num_chipselect = 2,
};

470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486
/* dmac device registration */
struct pl08x_platform_data pl080_plat_data = {
	.memcpy_channel = {
		.bus_id = "memcpy",
		.cctl = (PL080_BSIZE_16 << PL080_CONTROL_SB_SIZE_SHIFT | \
			PL080_BSIZE_16 << PL080_CONTROL_DB_SIZE_SHIFT | \
			PL080_WIDTH_32BIT << PL080_CONTROL_SWIDTH_SHIFT | \
			PL080_WIDTH_32BIT << PL080_CONTROL_DWIDTH_SHIFT | \
			PL080_CONTROL_PROT_BUFF | PL080_CONTROL_PROT_CACHE | \
			PL080_CONTROL_PROT_SYS),
	},
	.lli_buses = PL08X_AHB1,
	.mem_buses = PL08X_AHB1,
	.get_signal = pl080_get_signal,
	.put_signal = pl080_put_signal,
};

487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512
/*
 * Following will create 16MB static virtual/physical mappings
 * PHYSICAL		VIRTUAL
 * 0xD0000000		0xFD000000
 * 0xFC000000		0xFC000000
 */
struct map_desc spear3xx_io_desc[] __initdata = {
	{
		.virtual	= VA_SPEAR3XX_ICM1_2_BASE,
		.pfn		= __phys_to_pfn(SPEAR3XX_ICM1_2_BASE),
		.length		= SZ_16M,
		.type		= MT_DEVICE
	}, {
		.virtual	= VA_SPEAR3XX_ICM3_SMI_CTRL_BASE,
		.pfn		= __phys_to_pfn(SPEAR3XX_ICM3_SMI_CTRL_BASE),
		.length		= SZ_16M,
		.type		= MT_DEVICE
	},
};

/* This will create static memory mapping for selected devices */
void __init spear3xx_map_io(void)
{
	iotable_init(spear3xx_io_desc, ARRAY_SIZE(spear3xx_io_desc));
}

513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536
static void __init spear3xx_timer_init(void)
{
	char pclk_name[] = "pll3_48m_clk";
	struct clk *gpt_clk, *pclk;

	/* get the system timer clock */
	gpt_clk = clk_get_sys("gpt0", NULL);
	if (IS_ERR(gpt_clk)) {
		pr_err("%s:couldn't get clk for gpt\n", __func__);
		BUG();
	}

	/* get the suitable parent clock for timer*/
	pclk = clk_get(NULL, pclk_name);
	if (IS_ERR(pclk)) {
		pr_err("%s:couldn't get %s as parent for gpt\n",
				__func__, pclk_name);
		BUG();
	}

	clk_set_parent(gpt_clk, pclk);
	clk_put(gpt_clk);
	clk_put(pclk);

537
	spear_setup_timer(SPEAR3XX_CPU_TMR_BASE, SPEAR3XX_IRQ_CPU_GPT1_1);
538 539 540 541 542
}

struct sys_timer spear3xx_timer = {
	.init = spear3xx_timer_init,
};
543 544 545 546 547 548 549 550 551 552

static const struct of_device_id vic_of_match[] __initconst = {
	{ .compatible = "arm,pl190-vic", .data = vic_of_init, },
	{ /* Sentinel */ }
};

void __init spear3xx_dt_init_irq(void)
{
	of_irq_init(vic_of_match);
}