diff options
author | Russell King <rmk@dyn-67.arm.linux.org.uk> | 2009-03-13 17:44:51 -0400 |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2009-03-13 17:44:51 -0400 |
commit | 97fb44eb6bc01f4ffed4300e475aa15e44877375 (patch) | |
tree | 481ed6efd0babe7185cae04f2fd295426b36411d /arch/arm/mach-at91 | |
parent | e4707dd3e9d0cb57597b6568a5e51fea5d6fca41 (diff) | |
parent | 148854c65ea8046b045672fd49f4333aefaa3ab5 (diff) |
Merge branch 'for-rmk' of git://git.pengutronix.de/git/imx/linux-2.6 into devel
Conflicts:
arch/arm/mach-at91/gpio.c
Diffstat (limited to 'arch/arm/mach-at91')
-rw-r--r-- | arch/arm/mach-at91/at91cap9_devices.c | 2 | ||||
-rw-r--r-- | arch/arm/mach-at91/at91sam9260_devices.c | 2 | ||||
-rw-r--r-- | arch/arm/mach-at91/at91sam9261_devices.c | 2 | ||||
-rw-r--r-- | arch/arm/mach-at91/at91sam9263_devices.c | 107 | ||||
-rw-r--r-- | arch/arm/mach-at91/at91sam9rl_devices.c | 2 | ||||
-rw-r--r-- | arch/arm/mach-at91/gpio.c | 69 | ||||
-rw-r--r-- | arch/arm/mach-at91/include/mach/board.h | 4 | ||||
-rw-r--r-- | arch/arm/mach-at91/pm.c | 1 |
8 files changed, 179 insertions, 10 deletions
diff --git a/arch/arm/mach-at91/at91cap9_devices.c b/arch/arm/mach-at91/at91cap9_devices.c index 9eca2209cde6..412aa49ad2fb 100644 --- a/arch/arm/mach-at91/at91cap9_devices.c +++ b/arch/arm/mach-at91/at91cap9_devices.c | |||
@@ -697,7 +697,7 @@ static void __init at91_add_device_rtt(void) | |||
697 | * Watchdog | 697 | * Watchdog |
698 | * -------------------------------------------------------------------- */ | 698 | * -------------------------------------------------------------------- */ |
699 | 699 | ||
700 | #if defined(CONFIG_AT91SAM9_WATCHDOG) || defined(CONFIG_AT91SAM9_WATCHDOG_MODULE) | 700 | #if defined(CONFIG_AT91SAM9X_WATCHDOG) || defined(CONFIG_AT91SAM9X_WATCHDOG_MODULE) |
701 | static struct platform_device at91cap9_wdt_device = { | 701 | static struct platform_device at91cap9_wdt_device = { |
702 | .name = "at91_wdt", | 702 | .name = "at91_wdt", |
703 | .id = -1, | 703 | .id = -1, |
diff --git a/arch/arm/mach-at91/at91sam9260_devices.c b/arch/arm/mach-at91/at91sam9260_devices.c index fdde1ea21b07..d74c9ac007e7 100644 --- a/arch/arm/mach-at91/at91sam9260_devices.c +++ b/arch/arm/mach-at91/at91sam9260_devices.c | |||
@@ -643,7 +643,7 @@ static void __init at91_add_device_rtt(void) | |||
643 | * Watchdog | 643 | * Watchdog |
644 | * -------------------------------------------------------------------- */ | 644 | * -------------------------------------------------------------------- */ |
645 | 645 | ||
646 | #if defined(CONFIG_AT91SAM9_WATCHDOG) || defined(CONFIG_AT91SAM9_WATCHDOG_MODULE) | 646 | #if defined(CONFIG_AT91SAM9X_WATCHDOG) || defined(CONFIG_AT91SAM9X_WATCHDOG_MODULE) |
647 | static struct platform_device at91sam9260_wdt_device = { | 647 | static struct platform_device at91sam9260_wdt_device = { |
648 | .name = "at91_wdt", | 648 | .name = "at91_wdt", |
649 | .id = -1, | 649 | .id = -1, |
diff --git a/arch/arm/mach-at91/at91sam9261_devices.c b/arch/arm/mach-at91/at91sam9261_devices.c index 17289756f80f..59fc48311fb0 100644 --- a/arch/arm/mach-at91/at91sam9261_devices.c +++ b/arch/arm/mach-at91/at91sam9261_devices.c | |||
@@ -621,7 +621,7 @@ static void __init at91_add_device_rtt(void) | |||
621 | * Watchdog | 621 | * Watchdog |
622 | * -------------------------------------------------------------------- */ | 622 | * -------------------------------------------------------------------- */ |
623 | 623 | ||
624 | #if defined(CONFIG_AT91SAM9_WATCHDOG) || defined(CONFIG_AT91SAM9_WATCHDOG_MODULE) | 624 | #if defined(CONFIG_AT91SAM9X_WATCHDOG) || defined(CONFIG_AT91SAM9X_WATCHDOG_MODULE) |
625 | static struct platform_device at91sam9261_wdt_device = { | 625 | static struct platform_device at91sam9261_wdt_device = { |
626 | .name = "at91_wdt", | 626 | .name = "at91_wdt", |
627 | .id = -1, | 627 | .id = -1, |
diff --git a/arch/arm/mach-at91/at91sam9263_devices.c b/arch/arm/mach-at91/at91sam9263_devices.c index b753cb879d8e..b7f233242315 100644 --- a/arch/arm/mach-at91/at91sam9263_devices.c +++ b/arch/arm/mach-at91/at91sam9263_devices.c | |||
@@ -347,6 +347,111 @@ void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data) | |||
347 | void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data) {} | 347 | void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data) {} |
348 | #endif | 348 | #endif |
349 | 349 | ||
350 | /* -------------------------------------------------------------------- | ||
351 | * Compact Flash (PCMCIA or IDE) | ||
352 | * -------------------------------------------------------------------- */ | ||
353 | |||
354 | #if defined(CONFIG_AT91_CF) || defined(CONFIG_AT91_CF_MODULE) || \ | ||
355 | defined(CONFIG_BLK_DEV_IDE_AT91) || defined(CONFIG_BLK_DEV_IDE_AT91_MODULE) | ||
356 | |||
357 | static struct at91_cf_data cf0_data; | ||
358 | |||
359 | static struct resource cf0_resources[] = { | ||
360 | [0] = { | ||
361 | .start = AT91_CHIPSELECT_4, | ||
362 | .end = AT91_CHIPSELECT_4 + SZ_256M - 1, | ||
363 | .flags = IORESOURCE_MEM | IORESOURCE_MEM_8AND16BIT, | ||
364 | } | ||
365 | }; | ||
366 | |||
367 | static struct platform_device cf0_device = { | ||
368 | .id = 0, | ||
369 | .dev = { | ||
370 | .platform_data = &cf0_data, | ||
371 | }, | ||
372 | .resource = cf0_resources, | ||
373 | .num_resources = ARRAY_SIZE(cf0_resources), | ||
374 | }; | ||
375 | |||
376 | static struct at91_cf_data cf1_data; | ||
377 | |||
378 | static struct resource cf1_resources[] = { | ||
379 | [0] = { | ||
380 | .start = AT91_CHIPSELECT_5, | ||
381 | .end = AT91_CHIPSELECT_5 + SZ_256M - 1, | ||
382 | .flags = IORESOURCE_MEM | IORESOURCE_MEM_8AND16BIT, | ||
383 | } | ||
384 | }; | ||
385 | |||
386 | static struct platform_device cf1_device = { | ||
387 | .id = 1, | ||
388 | .dev = { | ||
389 | .platform_data = &cf1_data, | ||
390 | }, | ||
391 | .resource = cf1_resources, | ||
392 | .num_resources = ARRAY_SIZE(cf1_resources), | ||
393 | }; | ||
394 | |||
395 | void __init at91_add_device_cf(struct at91_cf_data *data) | ||
396 | { | ||
397 | unsigned long ebi0_csa; | ||
398 | struct platform_device *pdev; | ||
399 | |||
400 | if (!data) | ||
401 | return; | ||
402 | |||
403 | /* | ||
404 | * assign CS4 or CS5 to SMC with Compact Flash logic support, | ||
405 | * we assume SMC timings are configured by board code, | ||
406 | * except True IDE where timings are controlled by driver | ||
407 | */ | ||
408 | ebi0_csa = at91_sys_read(AT91_MATRIX_EBI0CSA); | ||
409 | switch (data->chipselect) { | ||
410 | case 4: | ||
411 | at91_set_A_periph(AT91_PIN_PD6, 0); /* EBI0_NCS4/CFCS0 */ | ||
412 | ebi0_csa |= AT91_MATRIX_EBI0_CS4A_SMC_CF1; | ||
413 | cf0_data = *data; | ||
414 | pdev = &cf0_device; | ||
415 | break; | ||
416 | case 5: | ||
417 | at91_set_A_periph(AT91_PIN_PD7, 0); /* EBI0_NCS5/CFCS1 */ | ||
418 | ebi0_csa |= AT91_MATRIX_EBI0_CS5A_SMC_CF2; | ||
419 | cf1_data = *data; | ||
420 | pdev = &cf1_device; | ||
421 | break; | ||
422 | default: | ||
423 | printk(KERN_ERR "AT91 CF: bad chip-select requested (%u)\n", | ||
424 | data->chipselect); | ||
425 | return; | ||
426 | } | ||
427 | at91_sys_write(AT91_MATRIX_EBI0CSA, ebi0_csa); | ||
428 | |||
429 | if (data->det_pin) { | ||
430 | at91_set_gpio_input(data->det_pin, 1); | ||
431 | at91_set_deglitch(data->det_pin, 1); | ||
432 | } | ||
433 | |||
434 | if (data->irq_pin) { | ||
435 | at91_set_gpio_input(data->irq_pin, 1); | ||
436 | at91_set_deglitch(data->irq_pin, 1); | ||
437 | } | ||
438 | |||
439 | if (data->vcc_pin) | ||
440 | /* initially off */ | ||
441 | at91_set_gpio_output(data->vcc_pin, 0); | ||
442 | |||
443 | /* enable EBI controlled pins */ | ||
444 | at91_set_A_periph(AT91_PIN_PD5, 1); /* NWAIT */ | ||
445 | at91_set_A_periph(AT91_PIN_PD8, 0); /* CFCE1 */ | ||
446 | at91_set_A_periph(AT91_PIN_PD9, 0); /* CFCE2 */ | ||
447 | at91_set_A_periph(AT91_PIN_PD14, 0); /* CFNRW */ | ||
448 | |||
449 | pdev->name = (data->flags & AT91_CF_TRUE_IDE) ? "at91_ide" : "at91_cf"; | ||
450 | platform_device_register(pdev); | ||
451 | } | ||
452 | #else | ||
453 | void __init at91_add_device_cf(struct at91_cf_data *data) {} | ||
454 | #endif | ||
350 | 455 | ||
351 | /* -------------------------------------------------------------------- | 456 | /* -------------------------------------------------------------------- |
352 | * NAND / SmartMedia | 457 | * NAND / SmartMedia |
@@ -854,7 +959,7 @@ static void __init at91_add_device_rtt(void) | |||
854 | * Watchdog | 959 | * Watchdog |
855 | * -------------------------------------------------------------------- */ | 960 | * -------------------------------------------------------------------- */ |
856 | 961 | ||
857 | #if defined(CONFIG_AT91SAM9_WATCHDOG) || defined(CONFIG_AT91SAM9_WATCHDOG_MODULE) | 962 | #if defined(CONFIG_AT91SAM9X_WATCHDOG) || defined(CONFIG_AT91SAM9X_WATCHDOG_MODULE) |
858 | static struct platform_device at91sam9263_wdt_device = { | 963 | static struct platform_device at91sam9263_wdt_device = { |
859 | .name = "at91_wdt", | 964 | .name = "at91_wdt", |
860 | .id = -1, | 965 | .id = -1, |
diff --git a/arch/arm/mach-at91/at91sam9rl_devices.c b/arch/arm/mach-at91/at91sam9rl_devices.c index 145324f4ec56..728186515cdf 100644 --- a/arch/arm/mach-at91/at91sam9rl_devices.c +++ b/arch/arm/mach-at91/at91sam9rl_devices.c | |||
@@ -609,7 +609,7 @@ static void __init at91_add_device_rtt(void) | |||
609 | * Watchdog | 609 | * Watchdog |
610 | * -------------------------------------------------------------------- */ | 610 | * -------------------------------------------------------------------- */ |
611 | 611 | ||
612 | #if defined(CONFIG_AT91SAM9_WATCHDOG) || defined(CONFIG_AT91SAM9_WATCHDOG_MODULE) | 612 | #if defined(CONFIG_AT91SAM9X_WATCHDOG) || defined(CONFIG_AT91SAM9X_WATCHDOG_MODULE) |
613 | static struct platform_device at91sam9rl_wdt_device = { | 613 | static struct platform_device at91sam9rl_wdt_device = { |
614 | .name = "at91_wdt", | 614 | .name = "at91_wdt", |
615 | .id = -1, | 615 | .id = -1, |
diff --git a/arch/arm/mach-at91/gpio.c b/arch/arm/mach-at91/gpio.c index 028e4f7a88be..f2236f0e101f 100644 --- a/arch/arm/mach-at91/gpio.c +++ b/arch/arm/mach-at91/gpio.c | |||
@@ -437,7 +437,68 @@ static void gpio_irq_handler(unsigned irq, struct irq_desc *desc) | |||
437 | 437 | ||
438 | /*--------------------------------------------------------------------------*/ | 438 | /*--------------------------------------------------------------------------*/ |
439 | 439 | ||
440 | /* This lock class tells lockdep that GPIO irqs are in a different | 440 | #ifdef CONFIG_DEBUG_FS |
441 | |||
442 | static int at91_gpio_show(struct seq_file *s, void *unused) | ||
443 | { | ||
444 | int bank, j; | ||
445 | |||
446 | /* print heading */ | ||
447 | seq_printf(s, "Pin\t"); | ||
448 | for (bank = 0; bank < gpio_banks; bank++) { | ||
449 | seq_printf(s, "PIO%c\t", 'A' + bank); | ||
450 | }; | ||
451 | seq_printf(s, "\n\n"); | ||
452 | |||
453 | /* print pin status */ | ||
454 | for (j = 0; j < 32; j++) { | ||
455 | seq_printf(s, "%i:\t", j); | ||
456 | |||
457 | for (bank = 0; bank < gpio_banks; bank++) { | ||
458 | unsigned pin = PIN_BASE + (32 * bank) + j; | ||
459 | void __iomem *pio = pin_to_controller(pin); | ||
460 | unsigned mask = pin_to_mask(pin); | ||
461 | |||
462 | if (__raw_readl(pio + PIO_PSR) & mask) | ||
463 | seq_printf(s, "GPIO:%s", __raw_readl(pio + PIO_PDSR) & mask ? "1" : "0"); | ||
464 | else | ||
465 | seq_printf(s, "%s", __raw_readl(pio + PIO_ABSR) & mask ? "B" : "A"); | ||
466 | |||
467 | seq_printf(s, "\t"); | ||
468 | } | ||
469 | |||
470 | seq_printf(s, "\n"); | ||
471 | } | ||
472 | |||
473 | return 0; | ||
474 | } | ||
475 | |||
476 | static int at91_gpio_open(struct inode *inode, struct file *file) | ||
477 | { | ||
478 | return single_open(file, at91_gpio_show, NULL); | ||
479 | } | ||
480 | |||
481 | static const struct file_operations at91_gpio_operations = { | ||
482 | .open = at91_gpio_open, | ||
483 | .read = seq_read, | ||
484 | .llseek = seq_lseek, | ||
485 | .release = single_release, | ||
486 | }; | ||
487 | |||
488 | static int __init at91_gpio_debugfs_init(void) | ||
489 | { | ||
490 | /* /sys/kernel/debug/at91_gpio */ | ||
491 | (void) debugfs_create_file("at91_gpio", S_IFREG | S_IRUGO, NULL, NULL, &at91_gpio_operations); | ||
492 | return 0; | ||
493 | } | ||
494 | postcore_initcall(at91_gpio_debugfs_init); | ||
495 | |||
496 | #endif | ||
497 | |||
498 | /*--------------------------------------------------------------------------*/ | ||
499 | |||
500 | /* | ||
501 | * This lock class tells lockdep that GPIO irqs are in a different | ||
441 | * category than their parents, so it won't report false recursion. | 502 | * category than their parents, so it won't report false recursion. |
442 | */ | 503 | */ |
443 | static struct lock_class_key gpio_lock_class; | 504 | static struct lock_class_key gpio_lock_class; |
@@ -456,9 +517,6 @@ void __init at91_gpio_irq_setup(void) | |||
456 | unsigned id = this->bank->id; | 517 | unsigned id = this->bank->id; |
457 | unsigned i; | 518 | unsigned i; |
458 | 519 | ||
459 | /* enable PIO controller's clock */ | ||
460 | clk_enable(this->bank->clock); | ||
461 | |||
462 | __raw_writel(~0, this->regbase + PIO_IDR); | 520 | __raw_writel(~0, this->regbase + PIO_IDR); |
463 | 521 | ||
464 | for (i = 0, pin = this->chip.base; i < 32; i++, pin++) { | 522 | for (i = 0, pin = this->chip.base; i < 32; i++, pin++) { |
@@ -589,6 +647,9 @@ void __init at91_gpio_init(struct at91_gpio_bank *data, int nr_banks) | |||
589 | at91_gpio->regbase = at91_gpio->bank->offset + | 647 | at91_gpio->regbase = at91_gpio->bank->offset + |
590 | (void __iomem *)AT91_VA_BASE_SYS; | 648 | (void __iomem *)AT91_VA_BASE_SYS; |
591 | 649 | ||
650 | /* enable PIO controller's clock */ | ||
651 | clk_enable(at91_gpio->bank->clock); | ||
652 | |||
592 | /* AT91SAM9263_ID_PIOCDE groups PIOC, PIOD, PIOE */ | 653 | /* AT91SAM9263_ID_PIOCDE groups PIOC, PIOD, PIOE */ |
593 | if (last && last->bank->id == at91_gpio->bank->id) | 654 | if (last && last->bank->id == at91_gpio->bank->id) |
594 | last->next = at91_gpio; | 655 | last->next = at91_gpio; |
diff --git a/arch/arm/mach-at91/include/mach/board.h b/arch/arm/mach-at91/include/mach/board.h index fb51f0e0a83f..793fe7b25f36 100644 --- a/arch/arm/mach-at91/include/mach/board.h +++ b/arch/arm/mach-at91/include/mach/board.h | |||
@@ -56,6 +56,9 @@ struct at91_cf_data { | |||
56 | u8 vcc_pin; /* power switching */ | 56 | u8 vcc_pin; /* power switching */ |
57 | u8 rst_pin; /* card reset */ | 57 | u8 rst_pin; /* card reset */ |
58 | u8 chipselect; /* EBI Chip Select number */ | 58 | u8 chipselect; /* EBI Chip Select number */ |
59 | u8 flags; | ||
60 | #define AT91_CF_TRUE_IDE 0x01 | ||
61 | #define AT91_IDE_SWAP_A0_A2 0x02 | ||
59 | }; | 62 | }; |
60 | extern void __init at91_add_device_cf(struct at91_cf_data *data); | 63 | extern void __init at91_add_device_cf(struct at91_cf_data *data); |
61 | 64 | ||
@@ -93,6 +96,7 @@ struct atmel_nand_data { | |||
93 | u8 enable_pin; /* chip enable */ | 96 | u8 enable_pin; /* chip enable */ |
94 | u8 det_pin; /* card detect */ | 97 | u8 det_pin; /* card detect */ |
95 | u8 rdy_pin; /* ready/busy */ | 98 | u8 rdy_pin; /* ready/busy */ |
99 | u8 rdy_pin_active_low; /* rdy_pin value is inverted */ | ||
96 | u8 ale; /* address line number connected to ALE */ | 100 | u8 ale; /* address line number connected to ALE */ |
97 | u8 cle; /* address line number connected to CLE */ | 101 | u8 cle; /* address line number connected to CLE */ |
98 | u8 bus_width_16; /* buswidth is 16 bit */ | 102 | u8 bus_width_16; /* buswidth is 16 bit */ |
diff --git a/arch/arm/mach-at91/pm.c b/arch/arm/mach-at91/pm.c index 9bb4f043aa22..7ac812dc055a 100644 --- a/arch/arm/mach-at91/pm.c +++ b/arch/arm/mach-at91/pm.c | |||
@@ -332,7 +332,6 @@ static int at91_pm_enter(suspend_state_t state) | |||
332 | at91_sys_read(AT91_AIC_IPR) & at91_sys_read(AT91_AIC_IMR)); | 332 | at91_sys_read(AT91_AIC_IPR) & at91_sys_read(AT91_AIC_IMR)); |
333 | 333 | ||
334 | error: | 334 | error: |
335 | sdram_selfrefresh_disable(); | ||
336 | target_state = PM_SUSPEND_ON; | 335 | target_state = PM_SUSPEND_ON; |
337 | at91_irq_resume(); | 336 | at91_irq_resume(); |
338 | at91_gpio_resume(); | 337 | at91_gpio_resume(); |