diff options
| author | Andrew Victor <linux@maxim.org.za> | 2008-09-18 14:42:37 -0400 |
|---|---|---|
| committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2008-09-21 17:58:37 -0400 |
| commit | bb1ad68b96a68e577a87ad62fe1aa26d052a52b5 (patch) | |
| tree | a98d65d54a4f441329f83988ffb9bea16e7d396e | |
| parent | e505240b6a6fd47b84cfeb1272ffeacd3e0874b3 (diff) | |
[ARM] 5258/1: [AT91] PWM controller initialization
Add platform_devices and configuration of the PWM controller found on
Atmel AT91CAP9, SAM9263 and SAM9RL processors.
SAM9263 support by Sedji Gaouaou.
Signed-off-by: Andrew Victor <linux@maxim.org.za>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
| -rw-r--r-- | arch/arm/mach-at91/at91cap9.c | 6 | ||||
| -rw-r--r-- | arch/arm/mach-at91/at91cap9_devices.c | 54 | ||||
| -rw-r--r-- | arch/arm/mach-at91/at91sam9263.c | 6 | ||||
| -rw-r--r-- | arch/arm/mach-at91/at91sam9263_devices.c | 53 | ||||
| -rw-r--r-- | arch/arm/mach-at91/at91sam9rl.c | 6 | ||||
| -rw-r--r-- | arch/arm/mach-at91/at91sam9rl_devices.c | 53 | ||||
| -rw-r--r-- | arch/arm/mach-at91/include/mach/board.h | 10 |
7 files changed, 179 insertions, 9 deletions
diff --git a/arch/arm/mach-at91/at91cap9.c b/arch/arm/mach-at91/at91cap9.c index 638948c16770..0fc0adaebd58 100644 --- a/arch/arm/mach-at91/at91cap9.c +++ b/arch/arm/mach-at91/at91cap9.c | |||
| @@ -141,8 +141,8 @@ static struct clk tcb_clk = { | |||
| 141 | .pmc_mask = 1 << AT91CAP9_ID_TCB, | 141 | .pmc_mask = 1 << AT91CAP9_ID_TCB, |
| 142 | .type = CLK_TYPE_PERIPHERAL, | 142 | .type = CLK_TYPE_PERIPHERAL, |
| 143 | }; | 143 | }; |
| 144 | static struct clk pwmc_clk = { | 144 | static struct clk pwm_clk = { |
| 145 | .name = "pwmc_clk", | 145 | .name = "pwm_clk", |
| 146 | .pmc_mask = 1 << AT91CAP9_ID_PWMC, | 146 | .pmc_mask = 1 << AT91CAP9_ID_PWMC, |
| 147 | .type = CLK_TYPE_PERIPHERAL, | 147 | .type = CLK_TYPE_PERIPHERAL, |
| 148 | }; | 148 | }; |
| @@ -207,7 +207,7 @@ static struct clk *periph_clocks[] __initdata = { | |||
| 207 | &ssc1_clk, | 207 | &ssc1_clk, |
| 208 | &ac97_clk, | 208 | &ac97_clk, |
| 209 | &tcb_clk, | 209 | &tcb_clk, |
| 210 | &pwmc_clk, | 210 | &pwm_clk, |
| 211 | &macb_clk, | 211 | &macb_clk, |
| 212 | &aestdes_clk, | 212 | &aestdes_clk, |
| 213 | &adc_clk, | 213 | &adc_clk, |
diff --git a/arch/arm/mach-at91/at91cap9_devices.c b/arch/arm/mach-at91/at91cap9_devices.c index abb4aac8fa98..5ebd4273d353 100644 --- a/arch/arm/mach-at91/at91cap9_devices.c +++ b/arch/arm/mach-at91/at91cap9_devices.c | |||
| @@ -719,6 +719,60 @@ static void __init at91_add_device_watchdog(void) {} | |||
| 719 | 719 | ||
| 720 | 720 | ||
| 721 | /* -------------------------------------------------------------------- | 721 | /* -------------------------------------------------------------------- |
| 722 | * PWM | ||
| 723 | * --------------------------------------------------------------------*/ | ||
| 724 | |||
| 725 | #if defined(CONFIG_ATMEL_PWM) | ||
| 726 | static u32 pwm_mask; | ||
| 727 | |||
| 728 | static struct resource pwm_resources[] = { | ||
| 729 | [0] = { | ||
| 730 | .start = AT91CAP9_BASE_PWMC, | ||
| 731 | .end = AT91CAP9_BASE_PWMC + SZ_16K - 1, | ||
| 732 | .flags = IORESOURCE_MEM, | ||
| 733 | }, | ||
| 734 | [1] = { | ||
| 735 | .start = AT91CAP9_ID_PWMC, | ||
| 736 | .end = AT91CAP9_ID_PWMC, | ||
| 737 | .flags = IORESOURCE_IRQ, | ||
| 738 | }, | ||
| 739 | }; | ||
| 740 | |||
| 741 | static struct platform_device at91cap9_pwm0_device = { | ||
| 742 | .name = "atmel_pwm", | ||
| 743 | .id = -1, | ||
| 744 | .dev = { | ||
| 745 | .platform_data = &pwm_mask, | ||
| 746 | }, | ||
| 747 | .resource = pwm_resources, | ||
| 748 | .num_resources = ARRAY_SIZE(pwm_resources), | ||
| 749 | }; | ||
| 750 | |||
| 751 | void __init at91_add_device_pwm(u32 mask) | ||
| 752 | { | ||
| 753 | if (mask & (1 << AT91_PWM0)) | ||
| 754 | at91_set_A_periph(AT91_PIN_PB19, 1); /* enable PWM0 */ | ||
| 755 | |||
| 756 | if (mask & (1 << AT91_PWM1)) | ||
| 757 | at91_set_B_periph(AT91_PIN_PB8, 1); /* enable PWM1 */ | ||
| 758 | |||
| 759 | if (mask & (1 << AT91_PWM2)) | ||
| 760 | at91_set_B_periph(AT91_PIN_PC29, 1); /* enable PWM2 */ | ||
| 761 | |||
| 762 | if (mask & (1 << AT91_PWM3)) | ||
| 763 | at91_set_B_periph(AT91_PIN_PA11, 1); /* enable PWM3 */ | ||
| 764 | |||
| 765 | pwm_mask = mask; | ||
| 766 | |||
| 767 | platform_device_register(&at91cap9_pwm0_device); | ||
| 768 | } | ||
| 769 | #else | ||
| 770 | void __init at91_add_device_pwm(u32 mask) {} | ||
| 771 | #endif | ||
| 772 | |||
| 773 | |||
| 774 | |||
| 775 | /* -------------------------------------------------------------------- | ||
| 722 | * AC97 | 776 | * AC97 |
| 723 | * -------------------------------------------------------------------- */ | 777 | * -------------------------------------------------------------------- */ |
| 724 | 778 | ||
diff --git a/arch/arm/mach-at91/at91sam9263.c b/arch/arm/mach-at91/at91sam9263.c index 80bfab5680e2..ada4b6769107 100644 --- a/arch/arm/mach-at91/at91sam9263.c +++ b/arch/arm/mach-at91/at91sam9263.c | |||
| @@ -129,8 +129,8 @@ static struct clk tcb_clk = { | |||
| 129 | .pmc_mask = 1 << AT91SAM9263_ID_TCB, | 129 | .pmc_mask = 1 << AT91SAM9263_ID_TCB, |
| 130 | .type = CLK_TYPE_PERIPHERAL, | 130 | .type = CLK_TYPE_PERIPHERAL, |
| 131 | }; | 131 | }; |
| 132 | static struct clk pwmc_clk = { | 132 | static struct clk pwm_clk = { |
| 133 | .name = "pwmc_clk", | 133 | .name = "pwm_clk", |
| 134 | .pmc_mask = 1 << AT91SAM9263_ID_PWMC, | 134 | .pmc_mask = 1 << AT91SAM9263_ID_PWMC, |
| 135 | .type = CLK_TYPE_PERIPHERAL, | 135 | .type = CLK_TYPE_PERIPHERAL, |
| 136 | }; | 136 | }; |
| @@ -187,7 +187,7 @@ static struct clk *periph_clocks[] __initdata = { | |||
| 187 | &ssc1_clk, | 187 | &ssc1_clk, |
| 188 | &ac97_clk, | 188 | &ac97_clk, |
| 189 | &tcb_clk, | 189 | &tcb_clk, |
| 190 | &pwmc_clk, | 190 | &pwm_clk, |
| 191 | &macb_clk, | 191 | &macb_clk, |
| 192 | &twodge_clk, | 192 | &twodge_clk, |
| 193 | &udc_clk, | 193 | &udc_clk, |
diff --git a/arch/arm/mach-at91/at91sam9263_devices.c b/arch/arm/mach-at91/at91sam9263_devices.c index c93992f55dc9..8b884083f76d 100644 --- a/arch/arm/mach-at91/at91sam9263_devices.c +++ b/arch/arm/mach-at91/at91sam9263_devices.c | |||
| @@ -886,6 +886,59 @@ static void __init at91_add_device_watchdog(void) {} | |||
| 886 | 886 | ||
| 887 | 887 | ||
| 888 | /* -------------------------------------------------------------------- | 888 | /* -------------------------------------------------------------------- |
| 889 | * PWM | ||
| 890 | * --------------------------------------------------------------------*/ | ||
| 891 | |||
| 892 | #if defined(CONFIG_ATMEL_PWM) | ||
| 893 | static u32 pwm_mask; | ||
| 894 | |||
| 895 | static struct resource pwm_resources[] = { | ||
| 896 | [0] = { | ||
| 897 | .start = AT91SAM9263_BASE_PWMC, | ||
| 898 | .end = AT91SAM9263_BASE_PWMC + SZ_16K - 1, | ||
| 899 | .flags = IORESOURCE_MEM, | ||
| 900 | }, | ||
| 901 | [1] = { | ||
| 902 | .start = AT91SAM9263_ID_PWMC, | ||
| 903 | .end = AT91SAM9263_ID_PWMC, | ||
| 904 | .flags = IORESOURCE_IRQ, | ||
| 905 | }, | ||
| 906 | }; | ||
| 907 | |||
| 908 | static struct platform_device at91sam9263_pwm0_device = { | ||
| 909 | .name = "atmel_pwm", | ||
| 910 | .id = -1, | ||
| 911 | .dev = { | ||
| 912 | .platform_data = &pwm_mask, | ||
| 913 | }, | ||
| 914 | .resource = pwm_resources, | ||
| 915 | .num_resources = ARRAY_SIZE(pwm_resources), | ||
| 916 | }; | ||
| 917 | |||
| 918 | void __init at91_add_device_pwm(u32 mask) | ||
| 919 | { | ||
| 920 | if (mask & (1 << AT91_PWM0)) | ||
| 921 | at91_set_B_periph(AT91_PIN_PB7, 1); /* enable PWM0 */ | ||
| 922 | |||
| 923 | if (mask & (1 << AT91_PWM1)) | ||
| 924 | at91_set_B_periph(AT91_PIN_PB8, 1); /* enable PWM1 */ | ||
| 925 | |||
| 926 | if (mask & (1 << AT91_PWM2)) | ||
| 927 | at91_set_B_periph(AT91_PIN_PC29, 1); /* enable PWM2 */ | ||
| 928 | |||
| 929 | if (mask & (1 << AT91_PWM3)) | ||
| 930 | at91_set_B_periph(AT91_PIN_PB29, 1); /* enable PWM3 */ | ||
| 931 | |||
| 932 | pwm_mask = mask; | ||
| 933 | |||
| 934 | platform_device_register(&at91sam9263_pwm0_device); | ||
| 935 | } | ||
| 936 | #else | ||
| 937 | void __init at91_add_device_pwm(u32 mask) {} | ||
| 938 | #endif | ||
| 939 | |||
| 940 | |||
| 941 | /* -------------------------------------------------------------------- | ||
| 889 | * SSC -- Synchronous Serial Controller | 942 | * SSC -- Synchronous Serial Controller |
| 890 | * -------------------------------------------------------------------- */ | 943 | * -------------------------------------------------------------------- */ |
| 891 | 944 | ||
diff --git a/arch/arm/mach-at91/at91sam9rl.c b/arch/arm/mach-at91/at91sam9rl.c index 556bddf35b45..252e954b49fd 100644 --- a/arch/arm/mach-at91/at91sam9rl.c +++ b/arch/arm/mach-at91/at91sam9rl.c | |||
| @@ -131,8 +131,8 @@ static struct clk tc2_clk = { | |||
| 131 | .pmc_mask = 1 << AT91SAM9RL_ID_TC2, | 131 | .pmc_mask = 1 << AT91SAM9RL_ID_TC2, |
| 132 | .type = CLK_TYPE_PERIPHERAL, | 132 | .type = CLK_TYPE_PERIPHERAL, |
| 133 | }; | 133 | }; |
| 134 | static struct clk pwmc_clk = { | 134 | static struct clk pwm_clk = { |
| 135 | .name = "pwmc_clk", | 135 | .name = "pwm_clk", |
| 136 | .pmc_mask = 1 << AT91SAM9RL_ID_PWMC, | 136 | .pmc_mask = 1 << AT91SAM9RL_ID_PWMC, |
| 137 | .type = CLK_TYPE_PERIPHERAL, | 137 | .type = CLK_TYPE_PERIPHERAL, |
| 138 | }; | 138 | }; |
| @@ -180,7 +180,7 @@ static struct clk *periph_clocks[] __initdata = { | |||
| 180 | &tc0_clk, | 180 | &tc0_clk, |
| 181 | &tc1_clk, | 181 | &tc1_clk, |
| 182 | &tc2_clk, | 182 | &tc2_clk, |
| 183 | &pwmc_clk, | 183 | &pwm_clk, |
| 184 | &tsc_clk, | 184 | &tsc_clk, |
| 185 | &dma_clk, | 185 | &dma_clk, |
| 186 | &udphs_clk, | 186 | &udphs_clk, |
diff --git a/arch/arm/mach-at91/at91sam9rl_devices.c b/arch/arm/mach-at91/at91sam9rl_devices.c index 620886341fb5..3f9fed4902b8 100644 --- a/arch/arm/mach-at91/at91sam9rl_devices.c +++ b/arch/arm/mach-at91/at91sam9rl_devices.c | |||
| @@ -592,6 +592,59 @@ static void __init at91_add_device_watchdog(void) {} | |||
| 592 | 592 | ||
| 593 | 593 | ||
| 594 | /* -------------------------------------------------------------------- | 594 | /* -------------------------------------------------------------------- |
| 595 | * PWM | ||
| 596 | * --------------------------------------------------------------------*/ | ||
| 597 | |||
| 598 | #if defined(CONFIG_ATMEL_PWM) | ||
| 599 | static u32 pwm_mask; | ||
| 600 | |||
| 601 | static struct resource pwm_resources[] = { | ||
| 602 | [0] = { | ||
| 603 | .start = AT91SAM9RL_BASE_PWMC, | ||
| 604 | .end = AT91SAM9RL_BASE_PWMC + SZ_16K - 1, | ||
| 605 | .flags = IORESOURCE_MEM, | ||
| 606 | }, | ||
| 607 | [1] = { | ||
| 608 | .start = AT91SAM9RL_ID_PWMC, | ||
| 609 | .end = AT91SAM9RL_ID_PWMC, | ||
| 610 | .flags = IORESOURCE_IRQ, | ||
| 611 | }, | ||
| 612 | }; | ||
| 613 | |||
| 614 | static struct platform_device at91sam9rl_pwm0_device = { | ||
| 615 | .name = "atmel_pwm", | ||
| 616 | .id = -1, | ||
| 617 | .dev = { | ||
| 618 | .platform_data = &pwm_mask, | ||
| 619 | }, | ||
| 620 | .resource = pwm_resources, | ||
| 621 | .num_resources = ARRAY_SIZE(pwm_resources), | ||
| 622 | }; | ||
| 623 | |||
| 624 | void __init at91_add_device_pwm(u32 mask) | ||
| 625 | { | ||
| 626 | if (mask & (1 << AT91_PWM0)) | ||
| 627 | at91_set_B_periph(AT91_PIN_PB8, 1); /* enable PWM0 */ | ||
| 628 | |||
| 629 | if (mask & (1 << AT91_PWM1)) | ||
| 630 | at91_set_B_periph(AT91_PIN_PB9, 1); /* enable PWM1 */ | ||
| 631 | |||
| 632 | if (mask & (1 << AT91_PWM2)) | ||
| 633 | at91_set_B_periph(AT91_PIN_PD5, 1); /* enable PWM2 */ | ||
| 634 | |||
| 635 | if (mask & (1 << AT91_PWM3)) | ||
| 636 | at91_set_B_periph(AT91_PIN_PD8, 1); /* enable PWM3 */ | ||
| 637 | |||
| 638 | pwm_mask = mask; | ||
| 639 | |||
| 640 | platform_device_register(&at91sam9rl_pwm0_device); | ||
| 641 | } | ||
| 642 | #else | ||
| 643 | void __init at91_add_device_pwm(u32 mask) {} | ||
| 644 | #endif | ||
| 645 | |||
| 646 | |||
| 647 | /* -------------------------------------------------------------------- | ||
| 595 | * SSC -- Synchronous Serial Controller | 648 | * SSC -- Synchronous Serial Controller |
| 596 | * -------------------------------------------------------------------- */ | 649 | * -------------------------------------------------------------------- */ |
| 597 | 650 | ||
diff --git a/arch/arm/mach-at91/include/mach/board.h b/arch/arm/mach-at91/include/mach/board.h index acd60f2a0724..9df4608b5f6a 100644 --- a/arch/arm/mach-at91/include/mach/board.h +++ b/arch/arm/mach-at91/include/mach/board.h | |||
| @@ -133,6 +133,16 @@ struct atmel_uart_data { | |||
| 133 | extern void __init at91_add_device_serial(void); | 133 | extern void __init at91_add_device_serial(void); |
| 134 | 134 | ||
| 135 | /* | 135 | /* |
| 136 | * PWM | ||
| 137 | */ | ||
| 138 | #define AT91_PWM0 0 | ||
| 139 | #define AT91_PWM1 1 | ||
| 140 | #define AT91_PWM2 2 | ||
| 141 | #define AT91_PWM3 3 | ||
| 142 | |||
| 143 | extern void __init at91_add_device_pwm(u32 mask); | ||
| 144 | |||
| 145 | /* | ||
| 136 | * SSC -- accessed through ssc_request(id). Drivers don't bind to SSC | 146 | * SSC -- accessed through ssc_request(id). Drivers don't bind to SSC |
| 137 | * platform devices. Their SSC ID is part of their configuration data, | 147 | * platform devices. Their SSC ID is part of their configuration data, |
| 138 | * along with information about which SSC signals they should use. | 148 | * along with information about which SSC signals they should use. |
