diff options
Diffstat (limited to 'arch')
22 files changed, 372 insertions, 202 deletions
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 7275009686e6..5fd0be92f70b 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig | |||
@@ -294,6 +294,7 @@ config ARCH_AT91 | |||
294 | bool "Atmel AT91" | 294 | bool "Atmel AT91" |
295 | select ARCH_REQUIRE_GPIOLIB | 295 | select ARCH_REQUIRE_GPIOLIB |
296 | select HAVE_CLK | 296 | select HAVE_CLK |
297 | select CLKDEV_LOOKUP | ||
297 | help | 298 | help |
298 | This enables support for systems based on the Atmel AT91RM9200, | 299 | This enables support for systems based on the Atmel AT91RM9200, |
299 | AT91SAM9 and AT91CAP9 processors. | 300 | AT91SAM9 and AT91CAP9 processors. |
diff --git a/arch/arm/mach-at91/at572d940hf.c b/arch/arm/mach-at91/at572d940hf.c index bacd3764b6c5..d06990777ffe 100644 --- a/arch/arm/mach-at91/at572d940hf.c +++ b/arch/arm/mach-at91/at572d940hf.c | |||
@@ -205,6 +205,21 @@ static struct clk *periph_clocks[] __initdata = { | |||
205 | /* irq0 .. irq2 */ | 205 | /* irq0 .. irq2 */ |
206 | }; | 206 | }; |
207 | 207 | ||
208 | static struct clk_lookup periph_clocks_lookups[] = { | ||
209 | CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi.0", &spi0_clk), | ||
210 | CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi.1", &spi1_clk), | ||
211 | CLKDEV_CON_DEV_ID("t0_clk", "atmel_tcb.0", &tc0_clk), | ||
212 | CLKDEV_CON_DEV_ID("t1_clk", "atmel_tcb.0", &tc1_clk), | ||
213 | CLKDEV_CON_DEV_ID("t2_clk", "atmel_tcb.0", &tc2_clk), | ||
214 | }; | ||
215 | |||
216 | static struct clk_lookup usart_clocks_lookups[] = { | ||
217 | CLKDEV_CON_DEV_ID("usart", "atmel_usart.0", &mck), | ||
218 | CLKDEV_CON_DEV_ID("usart", "atmel_usart.1", &usart0_clk), | ||
219 | CLKDEV_CON_DEV_ID("usart", "atmel_usart.2", &usart1_clk), | ||
220 | CLKDEV_CON_DEV_ID("usart", "atmel_usart.3", &usart2_clk), | ||
221 | }; | ||
222 | |||
208 | /* | 223 | /* |
209 | * The five programmable clocks. | 224 | * The five programmable clocks. |
210 | * You must configure pin multiplexing to bring these signals out. | 225 | * You must configure pin multiplexing to bring these signals out. |
@@ -262,6 +277,11 @@ static void __init at572d940hf_register_clocks(void) | |||
262 | for (i = 0; i < ARRAY_SIZE(periph_clocks); i++) | 277 | for (i = 0; i < ARRAY_SIZE(periph_clocks); i++) |
263 | clk_register(periph_clocks[i]); | 278 | clk_register(periph_clocks[i]); |
264 | 279 | ||
280 | clkdev_add_table(periph_clocks_lookups, | ||
281 | ARRAY_SIZE(periph_clocks_lookups)); | ||
282 | clkdev_add_table(usart_clocks_lookups, | ||
283 | ARRAY_SIZE(usart_clocks_lookups)); | ||
284 | |||
265 | clk_register(&pck0); | 285 | clk_register(&pck0); |
266 | clk_register(&pck1); | 286 | clk_register(&pck1); |
267 | clk_register(&pck2); | 287 | clk_register(&pck2); |
@@ -272,6 +292,18 @@ static void __init at572d940hf_register_clocks(void) | |||
272 | clk_register(&hck1); | 292 | clk_register(&hck1); |
273 | } | 293 | } |
274 | 294 | ||
295 | static struct clk_lookup console_clock_lookup; | ||
296 | |||
297 | void __init at572d940hf_set_console_clock(int id) | ||
298 | { | ||
299 | if (id >= ARRAY_SIZE(usart_clocks_lookups)) | ||
300 | return; | ||
301 | |||
302 | console_clock_lookup.con_id = "usart"; | ||
303 | console_clock_lookup.clk = usart_clocks_lookups[id].clk; | ||
304 | clkdev_add(&console_clock_lookup); | ||
305 | } | ||
306 | |||
275 | /* -------------------------------------------------------------------- | 307 | /* -------------------------------------------------------------------- |
276 | * GPIO | 308 | * GPIO |
277 | * -------------------------------------------------------------------- */ | 309 | * -------------------------------------------------------------------- */ |
diff --git a/arch/arm/mach-at91/at572d940hf_devices.c b/arch/arm/mach-at91/at572d940hf_devices.c index e52c8e078b0f..14863b8e7e6a 100644 --- a/arch/arm/mach-at91/at572d940hf_devices.c +++ b/arch/arm/mach-at91/at572d940hf_devices.c | |||
@@ -532,7 +532,6 @@ void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices) | |||
532 | at91_set_A_periph(AT91_PIN_PA1, 0); /* SPI0_MOSI */ | 532 | at91_set_A_periph(AT91_PIN_PA1, 0); /* SPI0_MOSI */ |
533 | at91_set_A_periph(AT91_PIN_PA2, 0); /* SPI0_SPCK */ | 533 | at91_set_A_periph(AT91_PIN_PA2, 0); /* SPI0_SPCK */ |
534 | 534 | ||
535 | at91_clock_associate("spi0_clk", &at572d940hf_spi0_device.dev, "spi_clk"); | ||
536 | platform_device_register(&at572d940hf_spi0_device); | 535 | platform_device_register(&at572d940hf_spi0_device); |
537 | } | 536 | } |
538 | if (enable_spi1) { | 537 | if (enable_spi1) { |
@@ -540,7 +539,6 @@ void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices) | |||
540 | at91_set_A_periph(AT91_PIN_PC1, 0); /* SPI1_MOSI */ | 539 | at91_set_A_periph(AT91_PIN_PC1, 0); /* SPI1_MOSI */ |
541 | at91_set_A_periph(AT91_PIN_PC2, 0); /* SPI1_SPCK */ | 540 | at91_set_A_periph(AT91_PIN_PC2, 0); /* SPI1_SPCK */ |
542 | 541 | ||
543 | at91_clock_associate("spi1_clk", &at572d940hf_spi1_device.dev, "spi_clk"); | ||
544 | platform_device_register(&at572d940hf_spi1_device); | 542 | platform_device_register(&at572d940hf_spi1_device); |
545 | } | 543 | } |
546 | } | 544 | } |
@@ -587,10 +585,6 @@ static struct platform_device at572d940hf_tcb_device = { | |||
587 | 585 | ||
588 | static void __init at91_add_device_tc(void) | 586 | static void __init at91_add_device_tc(void) |
589 | { | 587 | { |
590 | /* this chip has a separate clock and irq for each TC channel */ | ||
591 | at91_clock_associate("tc0_clk", &at572d940hf_tcb_device.dev, "t0_clk"); | ||
592 | at91_clock_associate("tc1_clk", &at572d940hf_tcb_device.dev, "t1_clk"); | ||
593 | at91_clock_associate("tc2_clk", &at572d940hf_tcb_device.dev, "t2_clk"); | ||
594 | platform_device_register(&at572d940hf_tcb_device); | 588 | platform_device_register(&at572d940hf_tcb_device); |
595 | } | 589 | } |
596 | #else | 590 | #else |
@@ -828,22 +822,18 @@ void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins) | |||
828 | case 0: /* DBGU */ | 822 | case 0: /* DBGU */ |
829 | pdev = &at572d940hf_dbgu_device; | 823 | pdev = &at572d940hf_dbgu_device; |
830 | configure_dbgu_pins(); | 824 | configure_dbgu_pins(); |
831 | at91_clock_associate("mck", &pdev->dev, "usart"); | ||
832 | break; | 825 | break; |
833 | case AT572D940HF_ID_US0: | 826 | case AT572D940HF_ID_US0: |
834 | pdev = &at572d940hf_uart0_device; | 827 | pdev = &at572d940hf_uart0_device; |
835 | configure_usart0_pins(pins); | 828 | configure_usart0_pins(pins); |
836 | at91_clock_associate("usart0_clk", &pdev->dev, "usart"); | ||
837 | break; | 829 | break; |
838 | case AT572D940HF_ID_US1: | 830 | case AT572D940HF_ID_US1: |
839 | pdev = &at572d940hf_uart1_device; | 831 | pdev = &at572d940hf_uart1_device; |
840 | configure_usart1_pins(pins); | 832 | configure_usart1_pins(pins); |
841 | at91_clock_associate("usart1_clk", &pdev->dev, "usart"); | ||
842 | break; | 833 | break; |
843 | case AT572D940HF_ID_US2: | 834 | case AT572D940HF_ID_US2: |
844 | pdev = &at572d940hf_uart2_device; | 835 | pdev = &at572d940hf_uart2_device; |
845 | configure_usart2_pins(pins); | 836 | configure_usart2_pins(pins); |
846 | at91_clock_associate("usart2_clk", &pdev->dev, "usart"); | ||
847 | break; | 837 | break; |
848 | default: | 838 | default: |
849 | return; | 839 | return; |
@@ -857,8 +847,10 @@ void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins) | |||
857 | 847 | ||
858 | void __init at91_set_serial_console(unsigned portnr) | 848 | void __init at91_set_serial_console(unsigned portnr) |
859 | { | 849 | { |
860 | if (portnr < ATMEL_MAX_UART) | 850 | if (portnr < ATMEL_MAX_UART) { |
861 | atmel_default_console_device = at91_uarts[portnr]; | 851 | atmel_default_console_device = at91_uarts[portnr]; |
852 | at572d940hf_set_console_clock(portnr); | ||
853 | } | ||
862 | } | 854 | } |
863 | 855 | ||
864 | void __init at91_add_device_serial(void) | 856 | void __init at91_add_device_serial(void) |
diff --git a/arch/arm/mach-at91/at91cap9.c b/arch/arm/mach-at91/at91cap9.c index 69df2bb4a703..17fae4a42ab5 100644 --- a/arch/arm/mach-at91/at91cap9.c +++ b/arch/arm/mach-at91/at91cap9.c | |||
@@ -222,6 +222,25 @@ static struct clk *periph_clocks[] __initdata = { | |||
222 | // irq0 .. irq1 | 222 | // irq0 .. irq1 |
223 | }; | 223 | }; |
224 | 224 | ||
225 | static struct clk_lookup periph_clocks_lookups[] = { | ||
226 | CLKDEV_CON_DEV_ID("hclk", "atmel_usba_udc.0", &utmi_clk), | ||
227 | CLKDEV_CON_DEV_ID("pclk", "atmel_usba_udc.0", &udphs_clk), | ||
228 | CLKDEV_CON_DEV_ID("mci_clk", "at91_mci.0", &mmc0_clk), | ||
229 | CLKDEV_CON_DEV_ID("mci_clk", "at91_mci.1", &mmc1_clk), | ||
230 | CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi.0", &spi0_clk), | ||
231 | CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi.1", &spi1_clk), | ||
232 | CLKDEV_CON_DEV_ID("t0_clk", "atmel_tcb.0", &tcb_clk), | ||
233 | CLKDEV_CON_DEV_ID("ssc", "ssc.0", &ssc0_clk), | ||
234 | CLKDEV_CON_DEV_ID("ssc", "ssc.1", &ssc1_clk), | ||
235 | }; | ||
236 | |||
237 | static struct clk_lookup usart_clocks_lookups[] = { | ||
238 | CLKDEV_CON_DEV_ID("usart", "atmel_usart.0", &mck), | ||
239 | CLKDEV_CON_DEV_ID("usart", "atmel_usart.1", &usart0_clk), | ||
240 | CLKDEV_CON_DEV_ID("usart", "atmel_usart.2", &usart1_clk), | ||
241 | CLKDEV_CON_DEV_ID("usart", "atmel_usart.3", &usart2_clk), | ||
242 | }; | ||
243 | |||
225 | /* | 244 | /* |
226 | * The four programmable clocks. | 245 | * The four programmable clocks. |
227 | * You must configure pin multiplexing to bring these signals out. | 246 | * You must configure pin multiplexing to bring these signals out. |
@@ -258,12 +277,29 @@ static void __init at91cap9_register_clocks(void) | |||
258 | for (i = 0; i < ARRAY_SIZE(periph_clocks); i++) | 277 | for (i = 0; i < ARRAY_SIZE(periph_clocks); i++) |
259 | clk_register(periph_clocks[i]); | 278 | clk_register(periph_clocks[i]); |
260 | 279 | ||
280 | clkdev_add_table(periph_clocks_lookups, | ||
281 | ARRAY_SIZE(periph_clocks_lookups)); | ||
282 | clkdev_add_table(usart_clocks_lookups, | ||
283 | ARRAY_SIZE(usart_clocks_lookups)); | ||
284 | |||
261 | clk_register(&pck0); | 285 | clk_register(&pck0); |
262 | clk_register(&pck1); | 286 | clk_register(&pck1); |
263 | clk_register(&pck2); | 287 | clk_register(&pck2); |
264 | clk_register(&pck3); | 288 | clk_register(&pck3); |
265 | } | 289 | } |
266 | 290 | ||
291 | static struct clk_lookup console_clock_lookup; | ||
292 | |||
293 | void __init at91cap9_set_console_clock(int id) | ||
294 | { | ||
295 | if (id >= ARRAY_SIZE(usart_clocks_lookups)) | ||
296 | return; | ||
297 | |||
298 | console_clock_lookup.con_id = "usart"; | ||
299 | console_clock_lookup.clk = usart_clocks_lookups[id].clk; | ||
300 | clkdev_add(&console_clock_lookup); | ||
301 | } | ||
302 | |||
267 | /* -------------------------------------------------------------------- | 303 | /* -------------------------------------------------------------------- |
268 | * GPIO | 304 | * GPIO |
269 | * -------------------------------------------------------------------- */ | 305 | * -------------------------------------------------------------------- */ |
diff --git a/arch/arm/mach-at91/at91cap9_devices.c b/arch/arm/mach-at91/at91cap9_devices.c index ffda9099f6fa..cd850ed6f335 100644 --- a/arch/arm/mach-at91/at91cap9_devices.c +++ b/arch/arm/mach-at91/at91cap9_devices.c | |||
@@ -181,10 +181,6 @@ void __init at91_add_device_usba(struct usba_platform_data *data) | |||
181 | 181 | ||
182 | /* Pullup pin is handled internally by USB device peripheral */ | 182 | /* Pullup pin is handled internally by USB device peripheral */ |
183 | 183 | ||
184 | /* Clocks */ | ||
185 | at91_clock_associate("utmi_clk", &at91_usba_udc_device.dev, "hclk"); | ||
186 | at91_clock_associate("udphs_clk", &at91_usba_udc_device.dev, "pclk"); | ||
187 | |||
188 | platform_device_register(&at91_usba_udc_device); | 184 | platform_device_register(&at91_usba_udc_device); |
189 | } | 185 | } |
190 | #else | 186 | #else |
@@ -355,7 +351,6 @@ void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data) | |||
355 | } | 351 | } |
356 | 352 | ||
357 | mmc0_data = *data; | 353 | mmc0_data = *data; |
358 | at91_clock_associate("mci0_clk", &at91cap9_mmc0_device.dev, "mci_clk"); | ||
359 | platform_device_register(&at91cap9_mmc0_device); | 354 | platform_device_register(&at91cap9_mmc0_device); |
360 | } else { /* MCI1 */ | 355 | } else { /* MCI1 */ |
361 | /* CLK */ | 356 | /* CLK */ |
@@ -373,7 +368,6 @@ void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data) | |||
373 | } | 368 | } |
374 | 369 | ||
375 | mmc1_data = *data; | 370 | mmc1_data = *data; |
376 | at91_clock_associate("mci1_clk", &at91cap9_mmc1_device.dev, "mci_clk"); | ||
377 | platform_device_register(&at91cap9_mmc1_device); | 371 | platform_device_register(&at91cap9_mmc1_device); |
378 | } | 372 | } |
379 | } | 373 | } |
@@ -614,7 +608,6 @@ void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices) | |||
614 | at91_set_B_periph(AT91_PIN_PA1, 0); /* SPI0_MOSI */ | 608 | at91_set_B_periph(AT91_PIN_PA1, 0); /* SPI0_MOSI */ |
615 | at91_set_B_periph(AT91_PIN_PA2, 0); /* SPI0_SPCK */ | 609 | at91_set_B_periph(AT91_PIN_PA2, 0); /* SPI0_SPCK */ |
616 | 610 | ||
617 | at91_clock_associate("spi0_clk", &at91cap9_spi0_device.dev, "spi_clk"); | ||
618 | platform_device_register(&at91cap9_spi0_device); | 611 | platform_device_register(&at91cap9_spi0_device); |
619 | } | 612 | } |
620 | if (enable_spi1) { | 613 | if (enable_spi1) { |
@@ -622,7 +615,6 @@ void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices) | |||
622 | at91_set_A_periph(AT91_PIN_PB13, 0); /* SPI1_MOSI */ | 615 | at91_set_A_periph(AT91_PIN_PB13, 0); /* SPI1_MOSI */ |
623 | at91_set_A_periph(AT91_PIN_PB14, 0); /* SPI1_SPCK */ | 616 | at91_set_A_periph(AT91_PIN_PB14, 0); /* SPI1_SPCK */ |
624 | 617 | ||
625 | at91_clock_associate("spi1_clk", &at91cap9_spi1_device.dev, "spi_clk"); | ||
626 | platform_device_register(&at91cap9_spi1_device); | 618 | platform_device_register(&at91cap9_spi1_device); |
627 | } | 619 | } |
628 | } | 620 | } |
@@ -659,8 +651,6 @@ static struct platform_device at91cap9_tcb_device = { | |||
659 | 651 | ||
660 | static void __init at91_add_device_tc(void) | 652 | static void __init at91_add_device_tc(void) |
661 | { | 653 | { |
662 | /* this chip has one clock and irq for all three TC channels */ | ||
663 | at91_clock_associate("tcb_clk", &at91cap9_tcb_device.dev, "t0_clk"); | ||
664 | platform_device_register(&at91cap9_tcb_device); | 654 | platform_device_register(&at91cap9_tcb_device); |
665 | } | 655 | } |
666 | #else | 656 | #else |
@@ -1001,12 +991,10 @@ void __init at91_add_device_ssc(unsigned id, unsigned pins) | |||
1001 | case AT91CAP9_ID_SSC0: | 991 | case AT91CAP9_ID_SSC0: |
1002 | pdev = &at91cap9_ssc0_device; | 992 | pdev = &at91cap9_ssc0_device; |
1003 | configure_ssc0_pins(pins); | 993 | configure_ssc0_pins(pins); |
1004 | at91_clock_associate("ssc0_clk", &pdev->dev, "ssc"); | ||
1005 | break; | 994 | break; |
1006 | case AT91CAP9_ID_SSC1: | 995 | case AT91CAP9_ID_SSC1: |
1007 | pdev = &at91cap9_ssc1_device; | 996 | pdev = &at91cap9_ssc1_device; |
1008 | configure_ssc1_pins(pins); | 997 | configure_ssc1_pins(pins); |
1009 | at91_clock_associate("ssc1_clk", &pdev->dev, "ssc"); | ||
1010 | break; | 998 | break; |
1011 | default: | 999 | default: |
1012 | return; | 1000 | return; |
@@ -1205,22 +1193,18 @@ void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins) | |||
1205 | case 0: /* DBGU */ | 1193 | case 0: /* DBGU */ |
1206 | pdev = &at91cap9_dbgu_device; | 1194 | pdev = &at91cap9_dbgu_device; |
1207 | configure_dbgu_pins(); | 1195 | configure_dbgu_pins(); |
1208 | at91_clock_associate("mck", &pdev->dev, "usart"); | ||
1209 | break; | 1196 | break; |
1210 | case AT91CAP9_ID_US0: | 1197 | case AT91CAP9_ID_US0: |
1211 | pdev = &at91cap9_uart0_device; | 1198 | pdev = &at91cap9_uart0_device; |
1212 | configure_usart0_pins(pins); | 1199 | configure_usart0_pins(pins); |
1213 | at91_clock_associate("usart0_clk", &pdev->dev, "usart"); | ||
1214 | break; | 1200 | break; |
1215 | case AT91CAP9_ID_US1: | 1201 | case AT91CAP9_ID_US1: |
1216 | pdev = &at91cap9_uart1_device; | 1202 | pdev = &at91cap9_uart1_device; |
1217 | configure_usart1_pins(pins); | 1203 | configure_usart1_pins(pins); |
1218 | at91_clock_associate("usart1_clk", &pdev->dev, "usart"); | ||
1219 | break; | 1204 | break; |
1220 | case AT91CAP9_ID_US2: | 1205 | case AT91CAP9_ID_US2: |
1221 | pdev = &at91cap9_uart2_device; | 1206 | pdev = &at91cap9_uart2_device; |
1222 | configure_usart2_pins(pins); | 1207 | configure_usart2_pins(pins); |
1223 | at91_clock_associate("usart2_clk", &pdev->dev, "usart"); | ||
1224 | break; | 1208 | break; |
1225 | default: | 1209 | default: |
1226 | return; | 1210 | return; |
@@ -1234,8 +1218,10 @@ void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins) | |||
1234 | 1218 | ||
1235 | void __init at91_set_serial_console(unsigned portnr) | 1219 | void __init at91_set_serial_console(unsigned portnr) |
1236 | { | 1220 | { |
1237 | if (portnr < ATMEL_MAX_UART) | 1221 | if (portnr < ATMEL_MAX_UART) { |
1238 | atmel_default_console_device = at91_uarts[portnr]; | 1222 | atmel_default_console_device = at91_uarts[portnr]; |
1223 | at91cap9_set_console_clock(portnr); | ||
1224 | } | ||
1239 | } | 1225 | } |
1240 | 1226 | ||
1241 | void __init at91_add_device_serial(void) | 1227 | void __init at91_add_device_serial(void) |
diff --git a/arch/arm/mach-at91/at91rm9200.c b/arch/arm/mach-at91/at91rm9200.c index 164a98ed8888..d3638bd994da 100644 --- a/arch/arm/mach-at91/at91rm9200.c +++ b/arch/arm/mach-at91/at91rm9200.c | |||
@@ -191,6 +191,26 @@ static struct clk *periph_clocks[] __initdata = { | |||
191 | // irq0 .. irq6 | 191 | // irq0 .. irq6 |
192 | }; | 192 | }; |
193 | 193 | ||
194 | static struct clk_lookup periph_clocks_lookups[] = { | ||
195 | CLKDEV_CON_DEV_ID("t0_clk", "atmel_tcb.0", &tc0_clk), | ||
196 | CLKDEV_CON_DEV_ID("t1_clk", "atmel_tcb.0", &tc1_clk), | ||
197 | CLKDEV_CON_DEV_ID("t2_clk", "atmel_tcb.0", &tc2_clk), | ||
198 | CLKDEV_CON_DEV_ID("t0_clk", "atmel_tcb.1", &tc3_clk), | ||
199 | CLKDEV_CON_DEV_ID("t1_clk", "atmel_tcb.1", &tc4_clk), | ||
200 | CLKDEV_CON_DEV_ID("t2_clk", "atmel_tcb.1", &tc5_clk), | ||
201 | CLKDEV_CON_DEV_ID("ssc", "ssc.0", &ssc0_clk), | ||
202 | CLKDEV_CON_DEV_ID("ssc", "ssc.1", &ssc1_clk), | ||
203 | CLKDEV_CON_DEV_ID("ssc", "ssc.2", &ssc2_clk), | ||
204 | }; | ||
205 | |||
206 | static struct clk_lookup usart_clocks_lookups[] = { | ||
207 | CLKDEV_CON_DEV_ID("usart", "atmel_usart.0", &mck), | ||
208 | CLKDEV_CON_DEV_ID("usart", "atmel_usart.1", &usart0_clk), | ||
209 | CLKDEV_CON_DEV_ID("usart", "atmel_usart.2", &usart1_clk), | ||
210 | CLKDEV_CON_DEV_ID("usart", "atmel_usart.3", &usart2_clk), | ||
211 | CLKDEV_CON_DEV_ID("usart", "atmel_usart.4", &usart3_clk), | ||
212 | }; | ||
213 | |||
194 | /* | 214 | /* |
195 | * The four programmable clocks. | 215 | * The four programmable clocks. |
196 | * You must configure pin multiplexing to bring these signals out. | 216 | * You must configure pin multiplexing to bring these signals out. |
@@ -227,12 +247,29 @@ static void __init at91rm9200_register_clocks(void) | |||
227 | for (i = 0; i < ARRAY_SIZE(periph_clocks); i++) | 247 | for (i = 0; i < ARRAY_SIZE(periph_clocks); i++) |
228 | clk_register(periph_clocks[i]); | 248 | clk_register(periph_clocks[i]); |
229 | 249 | ||
250 | clkdev_add_table(periph_clocks_lookups, | ||
251 | ARRAY_SIZE(periph_clocks_lookups)); | ||
252 | clkdev_add_table(usart_clocks_lookups, | ||
253 | ARRAY_SIZE(usart_clocks_lookups)); | ||
254 | |||
230 | clk_register(&pck0); | 255 | clk_register(&pck0); |
231 | clk_register(&pck1); | 256 | clk_register(&pck1); |
232 | clk_register(&pck2); | 257 | clk_register(&pck2); |
233 | clk_register(&pck3); | 258 | clk_register(&pck3); |
234 | } | 259 | } |
235 | 260 | ||
261 | static struct clk_lookup console_clock_lookup; | ||
262 | |||
263 | void __init at91rm9200_set_console_clock(int id) | ||
264 | { | ||
265 | if (id >= ARRAY_SIZE(usart_clocks_lookups)) | ||
266 | return; | ||
267 | |||
268 | console_clock_lookup.con_id = "usart"; | ||
269 | console_clock_lookup.clk = usart_clocks_lookups[id].clk; | ||
270 | clkdev_add(&console_clock_lookup); | ||
271 | } | ||
272 | |||
236 | /* -------------------------------------------------------------------- | 273 | /* -------------------------------------------------------------------- |
237 | * GPIO | 274 | * GPIO |
238 | * -------------------------------------------------------------------- */ | 275 | * -------------------------------------------------------------------- */ |
diff --git a/arch/arm/mach-at91/at91rm9200_devices.c b/arch/arm/mach-at91/at91rm9200_devices.c index 761559e589a3..a0ba475be04c 100644 --- a/arch/arm/mach-at91/at91rm9200_devices.c +++ b/arch/arm/mach-at91/at91rm9200_devices.c | |||
@@ -644,15 +644,7 @@ static struct platform_device at91rm9200_tcb1_device = { | |||
644 | 644 | ||
645 | static void __init at91_add_device_tc(void) | 645 | static void __init at91_add_device_tc(void) |
646 | { | 646 | { |
647 | /* this chip has a separate clock and irq for each TC channel */ | ||
648 | at91_clock_associate("tc0_clk", &at91rm9200_tcb0_device.dev, "t0_clk"); | ||
649 | at91_clock_associate("tc1_clk", &at91rm9200_tcb0_device.dev, "t1_clk"); | ||
650 | at91_clock_associate("tc2_clk", &at91rm9200_tcb0_device.dev, "t2_clk"); | ||
651 | platform_device_register(&at91rm9200_tcb0_device); | 647 | platform_device_register(&at91rm9200_tcb0_device); |
652 | |||
653 | at91_clock_associate("tc3_clk", &at91rm9200_tcb1_device.dev, "t0_clk"); | ||
654 | at91_clock_associate("tc4_clk", &at91rm9200_tcb1_device.dev, "t1_clk"); | ||
655 | at91_clock_associate("tc5_clk", &at91rm9200_tcb1_device.dev, "t2_clk"); | ||
656 | platform_device_register(&at91rm9200_tcb1_device); | 648 | platform_device_register(&at91rm9200_tcb1_device); |
657 | } | 649 | } |
658 | #else | 650 | #else |
@@ -849,17 +841,14 @@ void __init at91_add_device_ssc(unsigned id, unsigned pins) | |||
849 | case AT91RM9200_ID_SSC0: | 841 | case AT91RM9200_ID_SSC0: |
850 | pdev = &at91rm9200_ssc0_device; | 842 | pdev = &at91rm9200_ssc0_device; |
851 | configure_ssc0_pins(pins); | 843 | configure_ssc0_pins(pins); |
852 | at91_clock_associate("ssc0_clk", &pdev->dev, "ssc"); | ||
853 | break; | 844 | break; |
854 | case AT91RM9200_ID_SSC1: | 845 | case AT91RM9200_ID_SSC1: |
855 | pdev = &at91rm9200_ssc1_device; | 846 | pdev = &at91rm9200_ssc1_device; |
856 | configure_ssc1_pins(pins); | 847 | configure_ssc1_pins(pins); |
857 | at91_clock_associate("ssc1_clk", &pdev->dev, "ssc"); | ||
858 | break; | 848 | break; |
859 | case AT91RM9200_ID_SSC2: | 849 | case AT91RM9200_ID_SSC2: |
860 | pdev = &at91rm9200_ssc2_device; | 850 | pdev = &at91rm9200_ssc2_device; |
861 | configure_ssc2_pins(pins); | 851 | configure_ssc2_pins(pins); |
862 | at91_clock_associate("ssc2_clk", &pdev->dev, "ssc"); | ||
863 | break; | 852 | break; |
864 | default: | 853 | default: |
865 | return; | 854 | return; |
@@ -1115,27 +1104,22 @@ void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins) | |||
1115 | case 0: /* DBGU */ | 1104 | case 0: /* DBGU */ |
1116 | pdev = &at91rm9200_dbgu_device; | 1105 | pdev = &at91rm9200_dbgu_device; |
1117 | configure_dbgu_pins(); | 1106 | configure_dbgu_pins(); |
1118 | at91_clock_associate("mck", &pdev->dev, "usart"); | ||
1119 | break; | 1107 | break; |
1120 | case AT91RM9200_ID_US0: | 1108 | case AT91RM9200_ID_US0: |
1121 | pdev = &at91rm9200_uart0_device; | 1109 | pdev = &at91rm9200_uart0_device; |
1122 | configure_usart0_pins(pins); | 1110 | configure_usart0_pins(pins); |
1123 | at91_clock_associate("usart0_clk", &pdev->dev, "usart"); | ||
1124 | break; | 1111 | break; |
1125 | case AT91RM9200_ID_US1: | 1112 | case AT91RM9200_ID_US1: |
1126 | pdev = &at91rm9200_uart1_device; | 1113 | pdev = &at91rm9200_uart1_device; |
1127 | configure_usart1_pins(pins); | 1114 | configure_usart1_pins(pins); |
1128 | at91_clock_associate("usart1_clk", &pdev->dev, "usart"); | ||
1129 | break; | 1115 | break; |
1130 | case AT91RM9200_ID_US2: | 1116 | case AT91RM9200_ID_US2: |
1131 | pdev = &at91rm9200_uart2_device; | 1117 | pdev = &at91rm9200_uart2_device; |
1132 | configure_usart2_pins(pins); | 1118 | configure_usart2_pins(pins); |
1133 | at91_clock_associate("usart2_clk", &pdev->dev, "usart"); | ||
1134 | break; | 1119 | break; |
1135 | case AT91RM9200_ID_US3: | 1120 | case AT91RM9200_ID_US3: |
1136 | pdev = &at91rm9200_uart3_device; | 1121 | pdev = &at91rm9200_uart3_device; |
1137 | configure_usart3_pins(pins); | 1122 | configure_usart3_pins(pins); |
1138 | at91_clock_associate("usart3_clk", &pdev->dev, "usart"); | ||
1139 | break; | 1123 | break; |
1140 | default: | 1124 | default: |
1141 | return; | 1125 | return; |
@@ -1149,8 +1133,10 @@ void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins) | |||
1149 | 1133 | ||
1150 | void __init at91_set_serial_console(unsigned portnr) | 1134 | void __init at91_set_serial_console(unsigned portnr) |
1151 | { | 1135 | { |
1152 | if (portnr < ATMEL_MAX_UART) | 1136 | if (portnr < ATMEL_MAX_UART) { |
1153 | atmel_default_console_device = at91_uarts[portnr]; | 1137 | atmel_default_console_device = at91_uarts[portnr]; |
1138 | at91rm9200_set_console_clock(portnr); | ||
1139 | } | ||
1154 | } | 1140 | } |
1155 | 1141 | ||
1156 | void __init at91_add_device_serial(void) | 1142 | void __init at91_add_device_serial(void) |
diff --git a/arch/arm/mach-at91/at91sam9260.c b/arch/arm/mach-at91/at91sam9260.c index 5430669d7462..7d606b04d313 100644 --- a/arch/arm/mach-at91/at91sam9260.c +++ b/arch/arm/mach-at91/at91sam9260.c | |||
@@ -231,6 +231,28 @@ static struct clk *periph_clocks[] __initdata = { | |||
231 | // irq0 .. irq2 | 231 | // irq0 .. irq2 |
232 | }; | 232 | }; |
233 | 233 | ||
234 | static struct clk_lookup periph_clocks_lookups[] = { | ||
235 | CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi.0", &spi0_clk), | ||
236 | CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi.1", &spi1_clk), | ||
237 | CLKDEV_CON_DEV_ID("t0_clk", "atmel_tcb.0", &tc0_clk), | ||
238 | CLKDEV_CON_DEV_ID("t1_clk", "atmel_tcb.0", &tc1_clk), | ||
239 | CLKDEV_CON_DEV_ID("t2_clk", "atmel_tcb.0", &tc2_clk), | ||
240 | CLKDEV_CON_DEV_ID("t3_clk", "atmel_tcb.1", &tc3_clk), | ||
241 | CLKDEV_CON_DEV_ID("t4_clk", "atmel_tcb.1", &tc4_clk), | ||
242 | CLKDEV_CON_DEV_ID("t5_clk", "atmel_tcb.1", &tc5_clk), | ||
243 | CLKDEV_CON_DEV_ID("pclk", "ssc.0", &ssc_clk), | ||
244 | }; | ||
245 | |||
246 | static struct clk_lookup usart_clocks_lookups[] = { | ||
247 | CLKDEV_CON_DEV_ID("usart", "atmel_usart.0", &mck), | ||
248 | CLKDEV_CON_DEV_ID("usart", "atmel_usart.1", &usart0_clk), | ||
249 | CLKDEV_CON_DEV_ID("usart", "atmel_usart.2", &usart1_clk), | ||
250 | CLKDEV_CON_DEV_ID("usart", "atmel_usart.3", &usart2_clk), | ||
251 | CLKDEV_CON_DEV_ID("usart", "atmel_usart.4", &usart3_clk), | ||
252 | CLKDEV_CON_DEV_ID("usart", "atmel_usart.5", &usart4_clk), | ||
253 | CLKDEV_CON_DEV_ID("usart", "atmel_usart.6", &usart5_clk), | ||
254 | }; | ||
255 | |||
234 | /* | 256 | /* |
235 | * The two programmable clocks. | 257 | * The two programmable clocks. |
236 | * You must configure pin multiplexing to bring these signals out. | 258 | * You must configure pin multiplexing to bring these signals out. |
@@ -255,10 +277,27 @@ static void __init at91sam9260_register_clocks(void) | |||
255 | for (i = 0; i < ARRAY_SIZE(periph_clocks); i++) | 277 | for (i = 0; i < ARRAY_SIZE(periph_clocks); i++) |
256 | clk_register(periph_clocks[i]); | 278 | clk_register(periph_clocks[i]); |
257 | 279 | ||
280 | clkdev_add_table(periph_clocks_lookups, | ||
281 | ARRAY_SIZE(periph_clocks_lookups)); | ||
282 | clkdev_add_table(usart_clocks_lookups, | ||
283 | ARRAY_SIZE(usart_clocks_lookups)); | ||
284 | |||
258 | clk_register(&pck0); | 285 | clk_register(&pck0); |
259 | clk_register(&pck1); | 286 | clk_register(&pck1); |
260 | } | 287 | } |
261 | 288 | ||
289 | static struct clk_lookup console_clock_lookup; | ||
290 | |||
291 | void __init at91sam9260_set_console_clock(int id) | ||
292 | { | ||
293 | if (id >= ARRAY_SIZE(usart_clocks_lookups)) | ||
294 | return; | ||
295 | |||
296 | console_clock_lookup.con_id = "usart"; | ||
297 | console_clock_lookup.clk = usart_clocks_lookups[id].clk; | ||
298 | clkdev_add(&console_clock_lookup); | ||
299 | } | ||
300 | |||
262 | /* -------------------------------------------------------------------- | 301 | /* -------------------------------------------------------------------- |
263 | * GPIO | 302 | * GPIO |
264 | * -------------------------------------------------------------------- */ | 303 | * -------------------------------------------------------------------- */ |
diff --git a/arch/arm/mach-at91/at91sam9260_devices.c b/arch/arm/mach-at91/at91sam9260_devices.c index 6f8ec8d16d5a..1fdeb9058a76 100644 --- a/arch/arm/mach-at91/at91sam9260_devices.c +++ b/arch/arm/mach-at91/at91sam9260_devices.c | |||
@@ -609,7 +609,6 @@ void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices) | |||
609 | at91_set_A_periph(AT91_PIN_PA1, 0); /* SPI0_MOSI */ | 609 | at91_set_A_periph(AT91_PIN_PA1, 0); /* SPI0_MOSI */ |
610 | at91_set_A_periph(AT91_PIN_PA2, 0); /* SPI1_SPCK */ | 610 | at91_set_A_periph(AT91_PIN_PA2, 0); /* SPI1_SPCK */ |
611 | 611 | ||
612 | at91_clock_associate("spi0_clk", &at91sam9260_spi0_device.dev, "spi_clk"); | ||
613 | platform_device_register(&at91sam9260_spi0_device); | 612 | platform_device_register(&at91sam9260_spi0_device); |
614 | } | 613 | } |
615 | if (enable_spi1) { | 614 | if (enable_spi1) { |
@@ -617,7 +616,6 @@ void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices) | |||
617 | at91_set_A_periph(AT91_PIN_PB1, 0); /* SPI1_MOSI */ | 616 | at91_set_A_periph(AT91_PIN_PB1, 0); /* SPI1_MOSI */ |
618 | at91_set_A_periph(AT91_PIN_PB2, 0); /* SPI1_SPCK */ | 617 | at91_set_A_periph(AT91_PIN_PB2, 0); /* SPI1_SPCK */ |
619 | 618 | ||
620 | at91_clock_associate("spi1_clk", &at91sam9260_spi1_device.dev, "spi_clk"); | ||
621 | platform_device_register(&at91sam9260_spi1_device); | 619 | platform_device_register(&at91sam9260_spi1_device); |
622 | } | 620 | } |
623 | } | 621 | } |
@@ -694,15 +692,7 @@ static struct platform_device at91sam9260_tcb1_device = { | |||
694 | 692 | ||
695 | static void __init at91_add_device_tc(void) | 693 | static void __init at91_add_device_tc(void) |
696 | { | 694 | { |
697 | /* this chip has a separate clock and irq for each TC channel */ | ||
698 | at91_clock_associate("tc0_clk", &at91sam9260_tcb0_device.dev, "t0_clk"); | ||
699 | at91_clock_associate("tc1_clk", &at91sam9260_tcb0_device.dev, "t1_clk"); | ||
700 | at91_clock_associate("tc2_clk", &at91sam9260_tcb0_device.dev, "t2_clk"); | ||
701 | platform_device_register(&at91sam9260_tcb0_device); | 695 | platform_device_register(&at91sam9260_tcb0_device); |
702 | |||
703 | at91_clock_associate("tc3_clk", &at91sam9260_tcb1_device.dev, "t0_clk"); | ||
704 | at91_clock_associate("tc4_clk", &at91sam9260_tcb1_device.dev, "t1_clk"); | ||
705 | at91_clock_associate("tc5_clk", &at91sam9260_tcb1_device.dev, "t2_clk"); | ||
706 | platform_device_register(&at91sam9260_tcb1_device); | 696 | platform_device_register(&at91sam9260_tcb1_device); |
707 | } | 697 | } |
708 | #else | 698 | #else |
@@ -820,7 +810,6 @@ void __init at91_add_device_ssc(unsigned id, unsigned pins) | |||
820 | case AT91SAM9260_ID_SSC: | 810 | case AT91SAM9260_ID_SSC: |
821 | pdev = &at91sam9260_ssc_device; | 811 | pdev = &at91sam9260_ssc_device; |
822 | configure_ssc_pins(pins); | 812 | configure_ssc_pins(pins); |
823 | at91_clock_associate("ssc_clk", &pdev->dev, "pclk"); | ||
824 | break; | 813 | break; |
825 | default: | 814 | default: |
826 | return; | 815 | return; |
@@ -1145,37 +1134,30 @@ void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins) | |||
1145 | case 0: /* DBGU */ | 1134 | case 0: /* DBGU */ |
1146 | pdev = &at91sam9260_dbgu_device; | 1135 | pdev = &at91sam9260_dbgu_device; |
1147 | configure_dbgu_pins(); | 1136 | configure_dbgu_pins(); |
1148 | at91_clock_associate("mck", &pdev->dev, "usart"); | ||
1149 | break; | 1137 | break; |
1150 | case AT91SAM9260_ID_US0: | 1138 | case AT91SAM9260_ID_US0: |
1151 | pdev = &at91sam9260_uart0_device; | 1139 | pdev = &at91sam9260_uart0_device; |
1152 | configure_usart0_pins(pins); | 1140 | configure_usart0_pins(pins); |
1153 | at91_clock_associate("usart0_clk", &pdev->dev, "usart"); | ||
1154 | break; | 1141 | break; |
1155 | case AT91SAM9260_ID_US1: | 1142 | case AT91SAM9260_ID_US1: |
1156 | pdev = &at91sam9260_uart1_device; | 1143 | pdev = &at91sam9260_uart1_device; |
1157 | configure_usart1_pins(pins); | 1144 | configure_usart1_pins(pins); |
1158 | at91_clock_associate("usart1_clk", &pdev->dev, "usart"); | ||
1159 | break; | 1145 | break; |
1160 | case AT91SAM9260_ID_US2: | 1146 | case AT91SAM9260_ID_US2: |
1161 | pdev = &at91sam9260_uart2_device; | 1147 | pdev = &at91sam9260_uart2_device; |
1162 | configure_usart2_pins(pins); | 1148 | configure_usart2_pins(pins); |
1163 | at91_clock_associate("usart2_clk", &pdev->dev, "usart"); | ||
1164 | break; | 1149 | break; |
1165 | case AT91SAM9260_ID_US3: | 1150 | case AT91SAM9260_ID_US3: |
1166 | pdev = &at91sam9260_uart3_device; | 1151 | pdev = &at91sam9260_uart3_device; |
1167 | configure_usart3_pins(pins); | 1152 | configure_usart3_pins(pins); |
1168 | at91_clock_associate("usart3_clk", &pdev->dev, "usart"); | ||
1169 | break; | 1153 | break; |
1170 | case AT91SAM9260_ID_US4: | 1154 | case AT91SAM9260_ID_US4: |
1171 | pdev = &at91sam9260_uart4_device; | 1155 | pdev = &at91sam9260_uart4_device; |
1172 | configure_usart4_pins(); | 1156 | configure_usart4_pins(); |
1173 | at91_clock_associate("usart4_clk", &pdev->dev, "usart"); | ||
1174 | break; | 1157 | break; |
1175 | case AT91SAM9260_ID_US5: | 1158 | case AT91SAM9260_ID_US5: |
1176 | pdev = &at91sam9260_uart5_device; | 1159 | pdev = &at91sam9260_uart5_device; |
1177 | configure_usart5_pins(); | 1160 | configure_usart5_pins(); |
1178 | at91_clock_associate("usart5_clk", &pdev->dev, "usart"); | ||
1179 | break; | 1161 | break; |
1180 | default: | 1162 | default: |
1181 | return; | 1163 | return; |
@@ -1189,8 +1171,10 @@ void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins) | |||
1189 | 1171 | ||
1190 | void __init at91_set_serial_console(unsigned portnr) | 1172 | void __init at91_set_serial_console(unsigned portnr) |
1191 | { | 1173 | { |
1192 | if (portnr < ATMEL_MAX_UART) | 1174 | if (portnr < ATMEL_MAX_UART) { |
1193 | atmel_default_console_device = at91_uarts[portnr]; | 1175 | atmel_default_console_device = at91_uarts[portnr]; |
1176 | at91sam9260_set_console_clock(portnr); | ||
1177 | } | ||
1194 | } | 1178 | } |
1195 | 1179 | ||
1196 | void __init at91_add_device_serial(void) | 1180 | void __init at91_add_device_serial(void) |
diff --git a/arch/arm/mach-at91/at91sam9261.c b/arch/arm/mach-at91/at91sam9261.c index e3bafaebe010..c1483168c97a 100644 --- a/arch/arm/mach-at91/at91sam9261.c +++ b/arch/arm/mach-at91/at91sam9261.c | |||
@@ -178,6 +178,24 @@ static struct clk *periph_clocks[] __initdata = { | |||
178 | // irq0 .. irq2 | 178 | // irq0 .. irq2 |
179 | }; | 179 | }; |
180 | 180 | ||
181 | static struct clk_lookup periph_clocks_lookups[] = { | ||
182 | CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi.0", &spi0_clk), | ||
183 | CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi.1", &spi1_clk), | ||
184 | CLKDEV_CON_DEV_ID("t0_clk", "atmel_tcb.0", &tc0_clk), | ||
185 | CLKDEV_CON_DEV_ID("t1_clk", "atmel_tcb.0", &tc1_clk), | ||
186 | CLKDEV_CON_DEV_ID("t2_clk", "atmel_tcb.0", &tc1_clk), | ||
187 | CLKDEV_CON_DEV_ID("pclk", "ssc.0", &ssc0_clk), | ||
188 | CLKDEV_CON_DEV_ID("pclk", "ssc.1", &ssc1_clk), | ||
189 | CLKDEV_CON_DEV_ID("pclk", "ssc.2", &ssc2_clk), | ||
190 | }; | ||
191 | |||
192 | static struct clk_lookup usart_clocks_lookups[] = { | ||
193 | CLKDEV_CON_DEV_ID("usart", "atmel_usart.0", &mck), | ||
194 | CLKDEV_CON_DEV_ID("usart", "atmel_usart.1", &usart0_clk), | ||
195 | CLKDEV_CON_DEV_ID("usart", "atmel_usart.2", &usart1_clk), | ||
196 | CLKDEV_CON_DEV_ID("usart", "atmel_usart.3", &usart2_clk), | ||
197 | }; | ||
198 | |||
181 | /* | 199 | /* |
182 | * The four programmable clocks. | 200 | * The four programmable clocks. |
183 | * You must configure pin multiplexing to bring these signals out. | 201 | * You must configure pin multiplexing to bring these signals out. |
@@ -228,6 +246,11 @@ static void __init at91sam9261_register_clocks(void) | |||
228 | for (i = 0; i < ARRAY_SIZE(periph_clocks); i++) | 246 | for (i = 0; i < ARRAY_SIZE(periph_clocks); i++) |
229 | clk_register(periph_clocks[i]); | 247 | clk_register(periph_clocks[i]); |
230 | 248 | ||
249 | clkdev_add_table(periph_clocks_lookups, | ||
250 | ARRAY_SIZE(periph_clocks_lookups)); | ||
251 | clkdev_add_table(usart_clocks_lookups, | ||
252 | ARRAY_SIZE(usart_clocks_lookups)); | ||
253 | |||
231 | clk_register(&pck0); | 254 | clk_register(&pck0); |
232 | clk_register(&pck1); | 255 | clk_register(&pck1); |
233 | clk_register(&pck2); | 256 | clk_register(&pck2); |
@@ -237,6 +260,18 @@ static void __init at91sam9261_register_clocks(void) | |||
237 | clk_register(&hck1); | 260 | clk_register(&hck1); |
238 | } | 261 | } |
239 | 262 | ||
263 | static struct clk_lookup console_clock_lookup; | ||
264 | |||
265 | void __init at91sam9261_set_console_clock(int id) | ||
266 | { | ||
267 | if (id >= ARRAY_SIZE(usart_clocks_lookups)) | ||
268 | return; | ||
269 | |||
270 | console_clock_lookup.con_id = "usart"; | ||
271 | console_clock_lookup.clk = usart_clocks_lookups[id].clk; | ||
272 | clkdev_add(&console_clock_lookup); | ||
273 | } | ||
274 | |||
240 | /* -------------------------------------------------------------------- | 275 | /* -------------------------------------------------------------------- |
241 | * GPIO | 276 | * GPIO |
242 | * -------------------------------------------------------------------- */ | 277 | * -------------------------------------------------------------------- */ |
diff --git a/arch/arm/mach-at91/at91sam9261_devices.c b/arch/arm/mach-at91/at91sam9261_devices.c index 8792f9bfb6b0..3eb4538fceeb 100644 --- a/arch/arm/mach-at91/at91sam9261_devices.c +++ b/arch/arm/mach-at91/at91sam9261_devices.c | |||
@@ -426,7 +426,6 @@ void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices) | |||
426 | at91_set_A_periph(AT91_PIN_PA1, 0); /* SPI0_MOSI */ | 426 | at91_set_A_periph(AT91_PIN_PA1, 0); /* SPI0_MOSI */ |
427 | at91_set_A_periph(AT91_PIN_PA2, 0); /* SPI0_SPCK */ | 427 | at91_set_A_periph(AT91_PIN_PA2, 0); /* SPI0_SPCK */ |
428 | 428 | ||
429 | at91_clock_associate("spi0_clk", &at91sam9261_spi0_device.dev, "spi_clk"); | ||
430 | platform_device_register(&at91sam9261_spi0_device); | 429 | platform_device_register(&at91sam9261_spi0_device); |
431 | } | 430 | } |
432 | if (enable_spi1) { | 431 | if (enable_spi1) { |
@@ -434,7 +433,6 @@ void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices) | |||
434 | at91_set_A_periph(AT91_PIN_PB31, 0); /* SPI1_MOSI */ | 433 | at91_set_A_periph(AT91_PIN_PB31, 0); /* SPI1_MOSI */ |
435 | at91_set_A_periph(AT91_PIN_PB29, 0); /* SPI1_SPCK */ | 434 | at91_set_A_periph(AT91_PIN_PB29, 0); /* SPI1_SPCK */ |
436 | 435 | ||
437 | at91_clock_associate("spi1_clk", &at91sam9261_spi1_device.dev, "spi_clk"); | ||
438 | platform_device_register(&at91sam9261_spi1_device); | 436 | platform_device_register(&at91sam9261_spi1_device); |
439 | } | 437 | } |
440 | } | 438 | } |
@@ -581,10 +579,6 @@ static struct platform_device at91sam9261_tcb_device = { | |||
581 | 579 | ||
582 | static void __init at91_add_device_tc(void) | 580 | static void __init at91_add_device_tc(void) |
583 | { | 581 | { |
584 | /* this chip has a separate clock and irq for each TC channel */ | ||
585 | at91_clock_associate("tc0_clk", &at91sam9261_tcb_device.dev, "t0_clk"); | ||
586 | at91_clock_associate("tc1_clk", &at91sam9261_tcb_device.dev, "t1_clk"); | ||
587 | at91_clock_associate("tc2_clk", &at91sam9261_tcb_device.dev, "t2_clk"); | ||
588 | platform_device_register(&at91sam9261_tcb_device); | 582 | platform_device_register(&at91sam9261_tcb_device); |
589 | } | 583 | } |
590 | #else | 584 | #else |
@@ -786,17 +780,14 @@ void __init at91_add_device_ssc(unsigned id, unsigned pins) | |||
786 | case AT91SAM9261_ID_SSC0: | 780 | case AT91SAM9261_ID_SSC0: |
787 | pdev = &at91sam9261_ssc0_device; | 781 | pdev = &at91sam9261_ssc0_device; |
788 | configure_ssc0_pins(pins); | 782 | configure_ssc0_pins(pins); |
789 | at91_clock_associate("ssc0_clk", &pdev->dev, "pclk"); | ||
790 | break; | 783 | break; |
791 | case AT91SAM9261_ID_SSC1: | 784 | case AT91SAM9261_ID_SSC1: |
792 | pdev = &at91sam9261_ssc1_device; | 785 | pdev = &at91sam9261_ssc1_device; |
793 | configure_ssc1_pins(pins); | 786 | configure_ssc1_pins(pins); |
794 | at91_clock_associate("ssc1_clk", &pdev->dev, "pclk"); | ||
795 | break; | 787 | break; |
796 | case AT91SAM9261_ID_SSC2: | 788 | case AT91SAM9261_ID_SSC2: |
797 | pdev = &at91sam9261_ssc2_device; | 789 | pdev = &at91sam9261_ssc2_device; |
798 | configure_ssc2_pins(pins); | 790 | configure_ssc2_pins(pins); |
799 | at91_clock_associate("ssc2_clk", &pdev->dev, "pclk"); | ||
800 | break; | 791 | break; |
801 | default: | 792 | default: |
802 | return; | 793 | return; |
@@ -995,22 +986,18 @@ void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins) | |||
995 | case 0: /* DBGU */ | 986 | case 0: /* DBGU */ |
996 | pdev = &at91sam9261_dbgu_device; | 987 | pdev = &at91sam9261_dbgu_device; |
997 | configure_dbgu_pins(); | 988 | configure_dbgu_pins(); |
998 | at91_clock_associate("mck", &pdev->dev, "usart"); | ||
999 | break; | 989 | break; |
1000 | case AT91SAM9261_ID_US0: | 990 | case AT91SAM9261_ID_US0: |
1001 | pdev = &at91sam9261_uart0_device; | 991 | pdev = &at91sam9261_uart0_device; |
1002 | configure_usart0_pins(pins); | 992 | configure_usart0_pins(pins); |
1003 | at91_clock_associate("usart0_clk", &pdev->dev, "usart"); | ||
1004 | break; | 993 | break; |
1005 | case AT91SAM9261_ID_US1: | 994 | case AT91SAM9261_ID_US1: |
1006 | pdev = &at91sam9261_uart1_device; | 995 | pdev = &at91sam9261_uart1_device; |
1007 | configure_usart1_pins(pins); | 996 | configure_usart1_pins(pins); |
1008 | at91_clock_associate("usart1_clk", &pdev->dev, "usart"); | ||
1009 | break; | 997 | break; |
1010 | case AT91SAM9261_ID_US2: | 998 | case AT91SAM9261_ID_US2: |
1011 | pdev = &at91sam9261_uart2_device; | 999 | pdev = &at91sam9261_uart2_device; |
1012 | configure_usart2_pins(pins); | 1000 | configure_usart2_pins(pins); |
1013 | at91_clock_associate("usart2_clk", &pdev->dev, "usart"); | ||
1014 | break; | 1001 | break; |
1015 | default: | 1002 | default: |
1016 | return; | 1003 | return; |
@@ -1024,8 +1011,10 @@ void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins) | |||
1024 | 1011 | ||
1025 | void __init at91_set_serial_console(unsigned portnr) | 1012 | void __init at91_set_serial_console(unsigned portnr) |
1026 | { | 1013 | { |
1027 | if (portnr < ATMEL_MAX_UART) | 1014 | if (portnr < ATMEL_MAX_UART) { |
1028 | atmel_default_console_device = at91_uarts[portnr]; | 1015 | atmel_default_console_device = at91_uarts[portnr]; |
1016 | at91sam9261_set_console_clock(portnr); | ||
1017 | } | ||
1029 | } | 1018 | } |
1030 | 1019 | ||
1031 | void __init at91_add_device_serial(void) | 1020 | void __init at91_add_device_serial(void) |
diff --git a/arch/arm/mach-at91/at91sam9263.c b/arch/arm/mach-at91/at91sam9263.c index 6a085fedf6a3..dc28477d14ff 100644 --- a/arch/arm/mach-at91/at91sam9263.c +++ b/arch/arm/mach-at91/at91sam9263.c | |||
@@ -199,6 +199,23 @@ static struct clk *periph_clocks[] __initdata = { | |||
199 | // irq0 .. irq1 | 199 | // irq0 .. irq1 |
200 | }; | 200 | }; |
201 | 201 | ||
202 | static struct clk_lookup periph_clocks_lookups[] = { | ||
203 | CLKDEV_CON_DEV_ID("pclk", "ssc.0", &ssc0_clk), | ||
204 | CLKDEV_CON_DEV_ID("pclk", "ssc.1", &ssc1_clk), | ||
205 | CLKDEV_CON_DEV_ID("mci_clk", "at91_mci.0", &mmc0_clk), | ||
206 | CLKDEV_CON_DEV_ID("mci_clk", "at91_mci.1", &mmc1_clk), | ||
207 | CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi.0", &spi0_clk), | ||
208 | CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi.1", &spi1_clk), | ||
209 | CLKDEV_CON_DEV_ID("t0_clk", "atmel_tcb.0", &tcb_clk), | ||
210 | }; | ||
211 | |||
212 | static struct clk_lookup usart_clocks_lookups[] = { | ||
213 | CLKDEV_CON_DEV_ID("usart", "atmel_usart.0", &mck), | ||
214 | CLKDEV_CON_DEV_ID("usart", "atmel_usart.1", &usart0_clk), | ||
215 | CLKDEV_CON_DEV_ID("usart", "atmel_usart.2", &usart1_clk), | ||
216 | CLKDEV_CON_DEV_ID("usart", "atmel_usart.3", &usart2_clk), | ||
217 | }; | ||
218 | |||
202 | /* | 219 | /* |
203 | * The four programmable clocks. | 220 | * The four programmable clocks. |
204 | * You must configure pin multiplexing to bring these signals out. | 221 | * You must configure pin multiplexing to bring these signals out. |
@@ -235,12 +252,29 @@ static void __init at91sam9263_register_clocks(void) | |||
235 | for (i = 0; i < ARRAY_SIZE(periph_clocks); i++) | 252 | for (i = 0; i < ARRAY_SIZE(periph_clocks); i++) |
236 | clk_register(periph_clocks[i]); | 253 | clk_register(periph_clocks[i]); |
237 | 254 | ||
255 | clkdev_add_table(periph_clocks_lookups, | ||
256 | ARRAY_SIZE(periph_clocks_lookups)); | ||
257 | clkdev_add_table(usart_clocks_lookups, | ||
258 | ARRAY_SIZE(usart_clocks_lookups)); | ||
259 | |||
238 | clk_register(&pck0); | 260 | clk_register(&pck0); |
239 | clk_register(&pck1); | 261 | clk_register(&pck1); |
240 | clk_register(&pck2); | 262 | clk_register(&pck2); |
241 | clk_register(&pck3); | 263 | clk_register(&pck3); |
242 | } | 264 | } |
243 | 265 | ||
266 | static struct clk_lookup console_clock_lookup; | ||
267 | |||
268 | void __init at91sam9263_set_console_clock(int id) | ||
269 | { | ||
270 | if (id >= ARRAY_SIZE(usart_clocks_lookups)) | ||
271 | return; | ||
272 | |||
273 | console_clock_lookup.con_id = "usart"; | ||
274 | console_clock_lookup.clk = usart_clocks_lookups[id].clk; | ||
275 | clkdev_add(&console_clock_lookup); | ||
276 | } | ||
277 | |||
244 | /* -------------------------------------------------------------------- | 278 | /* -------------------------------------------------------------------- |
245 | * GPIO | 279 | * GPIO |
246 | * -------------------------------------------------------------------- */ | 280 | * -------------------------------------------------------------------- */ |
diff --git a/arch/arm/mach-at91/at91sam9263_devices.c b/arch/arm/mach-at91/at91sam9263_devices.c index 47a9f965bbb5..ffe081b77ed0 100644 --- a/arch/arm/mach-at91/at91sam9263_devices.c +++ b/arch/arm/mach-at91/at91sam9263_devices.c | |||
@@ -308,7 +308,6 @@ void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data) | |||
308 | } | 308 | } |
309 | 309 | ||
310 | mmc0_data = *data; | 310 | mmc0_data = *data; |
311 | at91_clock_associate("mci0_clk", &at91sam9263_mmc0_device.dev, "mci_clk"); | ||
312 | platform_device_register(&at91sam9263_mmc0_device); | 311 | platform_device_register(&at91sam9263_mmc0_device); |
313 | } else { /* MCI1 */ | 312 | } else { /* MCI1 */ |
314 | /* CLK */ | 313 | /* CLK */ |
@@ -339,7 +338,6 @@ void __init at91_add_device_mmc(short mmc_id, struct at91_mmc_data *data) | |||
339 | } | 338 | } |
340 | 339 | ||
341 | mmc1_data = *data; | 340 | mmc1_data = *data; |
342 | at91_clock_associate("mci1_clk", &at91sam9263_mmc1_device.dev, "mci_clk"); | ||
343 | platform_device_register(&at91sam9263_mmc1_device); | 341 | platform_device_register(&at91sam9263_mmc1_device); |
344 | } | 342 | } |
345 | } | 343 | } |
@@ -686,7 +684,6 @@ void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices) | |||
686 | at91_set_B_periph(AT91_PIN_PA1, 0); /* SPI0_MOSI */ | 684 | at91_set_B_periph(AT91_PIN_PA1, 0); /* SPI0_MOSI */ |
687 | at91_set_B_periph(AT91_PIN_PA2, 0); /* SPI0_SPCK */ | 685 | at91_set_B_periph(AT91_PIN_PA2, 0); /* SPI0_SPCK */ |
688 | 686 | ||
689 | at91_clock_associate("spi0_clk", &at91sam9263_spi0_device.dev, "spi_clk"); | ||
690 | platform_device_register(&at91sam9263_spi0_device); | 687 | platform_device_register(&at91sam9263_spi0_device); |
691 | } | 688 | } |
692 | if (enable_spi1) { | 689 | if (enable_spi1) { |
@@ -694,7 +691,6 @@ void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices) | |||
694 | at91_set_A_periph(AT91_PIN_PB13, 0); /* SPI1_MOSI */ | 691 | at91_set_A_periph(AT91_PIN_PB13, 0); /* SPI1_MOSI */ |
695 | at91_set_A_periph(AT91_PIN_PB14, 0); /* SPI1_SPCK */ | 692 | at91_set_A_periph(AT91_PIN_PB14, 0); /* SPI1_SPCK */ |
696 | 693 | ||
697 | at91_clock_associate("spi1_clk", &at91sam9263_spi1_device.dev, "spi_clk"); | ||
698 | platform_device_register(&at91sam9263_spi1_device); | 694 | platform_device_register(&at91sam9263_spi1_device); |
699 | } | 695 | } |
700 | } | 696 | } |
@@ -941,8 +937,6 @@ static struct platform_device at91sam9263_tcb_device = { | |||
941 | 937 | ||
942 | static void __init at91_add_device_tc(void) | 938 | static void __init at91_add_device_tc(void) |
943 | { | 939 | { |
944 | /* this chip has one clock and irq for all three TC channels */ | ||
945 | at91_clock_associate("tcb_clk", &at91sam9263_tcb_device.dev, "t0_clk"); | ||
946 | platform_device_register(&at91sam9263_tcb_device); | 940 | platform_device_register(&at91sam9263_tcb_device); |
947 | } | 941 | } |
948 | #else | 942 | #else |
@@ -1171,12 +1165,10 @@ void __init at91_add_device_ssc(unsigned id, unsigned pins) | |||
1171 | case AT91SAM9263_ID_SSC0: | 1165 | case AT91SAM9263_ID_SSC0: |
1172 | pdev = &at91sam9263_ssc0_device; | 1166 | pdev = &at91sam9263_ssc0_device; |
1173 | configure_ssc0_pins(pins); | 1167 | configure_ssc0_pins(pins); |
1174 | at91_clock_associate("ssc0_clk", &pdev->dev, "pclk"); | ||
1175 | break; | 1168 | break; |
1176 | case AT91SAM9263_ID_SSC1: | 1169 | case AT91SAM9263_ID_SSC1: |
1177 | pdev = &at91sam9263_ssc1_device; | 1170 | pdev = &at91sam9263_ssc1_device; |
1178 | configure_ssc1_pins(pins); | 1171 | configure_ssc1_pins(pins); |
1179 | at91_clock_associate("ssc1_clk", &pdev->dev, "pclk"); | ||
1180 | break; | 1172 | break; |
1181 | default: | 1173 | default: |
1182 | return; | 1174 | return; |
@@ -1376,22 +1368,18 @@ void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins) | |||
1376 | case 0: /* DBGU */ | 1368 | case 0: /* DBGU */ |
1377 | pdev = &at91sam9263_dbgu_device; | 1369 | pdev = &at91sam9263_dbgu_device; |
1378 | configure_dbgu_pins(); | 1370 | configure_dbgu_pins(); |
1379 | at91_clock_associate("mck", &pdev->dev, "usart"); | ||
1380 | break; | 1371 | break; |
1381 | case AT91SAM9263_ID_US0: | 1372 | case AT91SAM9263_ID_US0: |
1382 | pdev = &at91sam9263_uart0_device; | 1373 | pdev = &at91sam9263_uart0_device; |
1383 | configure_usart0_pins(pins); | 1374 | configure_usart0_pins(pins); |
1384 | at91_clock_associate("usart0_clk", &pdev->dev, "usart"); | ||
1385 | break; | 1375 | break; |
1386 | case AT91SAM9263_ID_US1: | 1376 | case AT91SAM9263_ID_US1: |
1387 | pdev = &at91sam9263_uart1_device; | 1377 | pdev = &at91sam9263_uart1_device; |
1388 | configure_usart1_pins(pins); | 1378 | configure_usart1_pins(pins); |
1389 | at91_clock_associate("usart1_clk", &pdev->dev, "usart"); | ||
1390 | break; | 1379 | break; |
1391 | case AT91SAM9263_ID_US2: | 1380 | case AT91SAM9263_ID_US2: |
1392 | pdev = &at91sam9263_uart2_device; | 1381 | pdev = &at91sam9263_uart2_device; |
1393 | configure_usart2_pins(pins); | 1382 | configure_usart2_pins(pins); |
1394 | at91_clock_associate("usart2_clk", &pdev->dev, "usart"); | ||
1395 | break; | 1383 | break; |
1396 | default: | 1384 | default: |
1397 | return; | 1385 | return; |
@@ -1405,8 +1393,10 @@ void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins) | |||
1405 | 1393 | ||
1406 | void __init at91_set_serial_console(unsigned portnr) | 1394 | void __init at91_set_serial_console(unsigned portnr) |
1407 | { | 1395 | { |
1408 | if (portnr < ATMEL_MAX_UART) | 1396 | if (portnr < ATMEL_MAX_UART) { |
1409 | atmel_default_console_device = at91_uarts[portnr]; | 1397 | atmel_default_console_device = at91_uarts[portnr]; |
1398 | at91sam9263_set_console_clock(portnr); | ||
1399 | } | ||
1410 | } | 1400 | } |
1411 | 1401 | ||
1412 | void __init at91_add_device_serial(void) | 1402 | void __init at91_add_device_serial(void) |
diff --git a/arch/arm/mach-at91/at91sam9g45.c b/arch/arm/mach-at91/at91sam9g45.c index 024e456b943f..2bb6ff9af1c7 100644 --- a/arch/arm/mach-at91/at91sam9g45.c +++ b/arch/arm/mach-at91/at91sam9g45.c | |||
@@ -184,22 +184,6 @@ static struct clk vdec_clk = { | |||
184 | .type = CLK_TYPE_PERIPHERAL, | 184 | .type = CLK_TYPE_PERIPHERAL, |
185 | }; | 185 | }; |
186 | 186 | ||
187 | /* One additional fake clock for ohci */ | ||
188 | static struct clk ohci_clk = { | ||
189 | .name = "ohci_clk", | ||
190 | .pmc_mask = 0, | ||
191 | .type = CLK_TYPE_PERIPHERAL, | ||
192 | .parent = &uhphs_clk, | ||
193 | }; | ||
194 | |||
195 | /* One additional fake clock for second TC block */ | ||
196 | static struct clk tcb1_clk = { | ||
197 | .name = "tcb1_clk", | ||
198 | .pmc_mask = 0, | ||
199 | .type = CLK_TYPE_PERIPHERAL, | ||
200 | .parent = &tcb0_clk, | ||
201 | }; | ||
202 | |||
203 | static struct clk *periph_clocks[] __initdata = { | 187 | static struct clk *periph_clocks[] __initdata = { |
204 | &pioA_clk, | 188 | &pioA_clk, |
205 | &pioB_clk, | 189 | &pioB_clk, |
@@ -228,8 +212,30 @@ static struct clk *periph_clocks[] __initdata = { | |||
228 | &udphs_clk, | 212 | &udphs_clk, |
229 | &mmc1_clk, | 213 | &mmc1_clk, |
230 | // irq0 | 214 | // irq0 |
231 | &ohci_clk, | 215 | }; |
232 | &tcb1_clk, | 216 | |
217 | static struct clk_lookup periph_clocks_lookups[] = { | ||
218 | /* One additional fake clock for ohci */ | ||
219 | CLKDEV_CON_ID("ohci_clk", &uhphs_clk), | ||
220 | CLKDEV_CON_DEV_ID("ehci_clk", "atmel-ehci.0", &uhphs_clk), | ||
221 | CLKDEV_CON_DEV_ID("hclk", "atmel_usba_udc.0", &utmi_clk), | ||
222 | CLKDEV_CON_DEV_ID("pclk", "atmel_usba_udc.0", &udphs_clk), | ||
223 | CLKDEV_CON_DEV_ID("mci_clk", "at91_mci.0", &mmc0_clk), | ||
224 | CLKDEV_CON_DEV_ID("mci_clk", "at91_mci.1", &mmc1_clk), | ||
225 | CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi.0", &spi0_clk), | ||
226 | CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi.1", &spi1_clk), | ||
227 | CLKDEV_CON_DEV_ID("t0_clk", "atmel_tcb.0", &tcb0_clk), | ||
228 | CLKDEV_CON_DEV_ID("t0_clk", "atmel_tcb.1", &tcb0_clk), | ||
229 | CLKDEV_CON_DEV_ID("pclk", "ssc.0", &ssc0_clk), | ||
230 | CLKDEV_CON_DEV_ID("pclk", "ssc.1", &ssc1_clk), | ||
231 | }; | ||
232 | |||
233 | static struct clk_lookup usart_clocks_lookups[] = { | ||
234 | CLKDEV_CON_DEV_ID("usart", "atmel_usart.0", &mck), | ||
235 | CLKDEV_CON_DEV_ID("usart", "atmel_usart.1", &usart0_clk), | ||
236 | CLKDEV_CON_DEV_ID("usart", "atmel_usart.2", &usart1_clk), | ||
237 | CLKDEV_CON_DEV_ID("usart", "atmel_usart.3", &usart2_clk), | ||
238 | CLKDEV_CON_DEV_ID("usart", "atmel_usart.4", &usart3_clk), | ||
233 | }; | 239 | }; |
234 | 240 | ||
235 | /* | 241 | /* |
@@ -256,6 +262,11 @@ static void __init at91sam9g45_register_clocks(void) | |||
256 | for (i = 0; i < ARRAY_SIZE(periph_clocks); i++) | 262 | for (i = 0; i < ARRAY_SIZE(periph_clocks); i++) |
257 | clk_register(periph_clocks[i]); | 263 | clk_register(periph_clocks[i]); |
258 | 264 | ||
265 | clkdev_add_table(periph_clocks_lookups, | ||
266 | ARRAY_SIZE(periph_clocks_lookups)); | ||
267 | clkdev_add_table(usart_clocks_lookups, | ||
268 | ARRAY_SIZE(usart_clocks_lookups)); | ||
269 | |||
259 | if (cpu_is_at91sam9m10() || cpu_is_at91sam9m11()) | 270 | if (cpu_is_at91sam9m10() || cpu_is_at91sam9m11()) |
260 | clk_register(&vdec_clk); | 271 | clk_register(&vdec_clk); |
261 | 272 | ||
@@ -263,6 +274,18 @@ static void __init at91sam9g45_register_clocks(void) | |||
263 | clk_register(&pck1); | 274 | clk_register(&pck1); |
264 | } | 275 | } |
265 | 276 | ||
277 | static struct clk_lookup console_clock_lookup; | ||
278 | |||
279 | void __init at91sam9g45_set_console_clock(int id) | ||
280 | { | ||
281 | if (id >= ARRAY_SIZE(usart_clocks_lookups)) | ||
282 | return; | ||
283 | |||
284 | console_clock_lookup.con_id = "usart"; | ||
285 | console_clock_lookup.clk = usart_clocks_lookups[id].clk; | ||
286 | clkdev_add(&console_clock_lookup); | ||
287 | } | ||
288 | |||
266 | /* -------------------------------------------------------------------- | 289 | /* -------------------------------------------------------------------- |
267 | * GPIO | 290 | * GPIO |
268 | * -------------------------------------------------------------------- */ | 291 | * -------------------------------------------------------------------- */ |
diff --git a/arch/arm/mach-at91/at91sam9g45_devices.c b/arch/arm/mach-at91/at91sam9g45_devices.c index eee27eed9133..05674865bc21 100644 --- a/arch/arm/mach-at91/at91sam9g45_devices.c +++ b/arch/arm/mach-at91/at91sam9g45_devices.c | |||
@@ -180,7 +180,6 @@ void __init at91_add_device_usbh_ehci(struct at91_usbh_data *data) | |||
180 | } | 180 | } |
181 | 181 | ||
182 | usbh_ehci_data = *data; | 182 | usbh_ehci_data = *data; |
183 | at91_clock_associate("uhphs_clk", &at91_usbh_ehci_device.dev, "ehci_clk"); | ||
184 | platform_device_register(&at91_usbh_ehci_device); | 183 | platform_device_register(&at91_usbh_ehci_device); |
185 | } | 184 | } |
186 | #else | 185 | #else |
@@ -266,10 +265,6 @@ void __init at91_add_device_usba(struct usba_platform_data *data) | |||
266 | 265 | ||
267 | /* Pullup pin is handled internally by USB device peripheral */ | 266 | /* Pullup pin is handled internally by USB device peripheral */ |
268 | 267 | ||
269 | /* Clocks */ | ||
270 | at91_clock_associate("utmi_clk", &at91_usba_udc_device.dev, "hclk"); | ||
271 | at91_clock_associate("udphs_clk", &at91_usba_udc_device.dev, "pclk"); | ||
272 | |||
273 | platform_device_register(&at91_usba_udc_device); | 268 | platform_device_register(&at91_usba_udc_device); |
274 | } | 269 | } |
275 | #else | 270 | #else |
@@ -478,7 +473,6 @@ void __init at91_add_device_mci(short mmc_id, struct mci_platform_data *data) | |||
478 | } | 473 | } |
479 | 474 | ||
480 | mmc0_data = *data; | 475 | mmc0_data = *data; |
481 | at91_clock_associate("mci0_clk", &at91sam9g45_mmc0_device.dev, "mci_clk"); | ||
482 | platform_device_register(&at91sam9g45_mmc0_device); | 476 | platform_device_register(&at91sam9g45_mmc0_device); |
483 | 477 | ||
484 | } else { /* MCI1 */ | 478 | } else { /* MCI1 */ |
@@ -504,7 +498,6 @@ void __init at91_add_device_mci(short mmc_id, struct mci_platform_data *data) | |||
504 | } | 498 | } |
505 | 499 | ||
506 | mmc1_data = *data; | 500 | mmc1_data = *data; |
507 | at91_clock_associate("mci1_clk", &at91sam9g45_mmc1_device.dev, "mci_clk"); | ||
508 | platform_device_register(&at91sam9g45_mmc1_device); | 501 | platform_device_register(&at91sam9g45_mmc1_device); |
509 | 502 | ||
510 | } | 503 | } |
@@ -801,7 +794,6 @@ void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices) | |||
801 | at91_set_A_periph(AT91_PIN_PB1, 0); /* SPI0_MOSI */ | 794 | at91_set_A_periph(AT91_PIN_PB1, 0); /* SPI0_MOSI */ |
802 | at91_set_A_periph(AT91_PIN_PB2, 0); /* SPI0_SPCK */ | 795 | at91_set_A_periph(AT91_PIN_PB2, 0); /* SPI0_SPCK */ |
803 | 796 | ||
804 | at91_clock_associate("spi0_clk", &at91sam9g45_spi0_device.dev, "spi_clk"); | ||
805 | platform_device_register(&at91sam9g45_spi0_device); | 797 | platform_device_register(&at91sam9g45_spi0_device); |
806 | } | 798 | } |
807 | if (enable_spi1) { | 799 | if (enable_spi1) { |
@@ -809,7 +801,6 @@ void __init at91_add_device_spi(struct spi_board_info *devices, int nr_devices) | |||
809 | at91_set_A_periph(AT91_PIN_PB15, 0); /* SPI1_MOSI */ | 801 | at91_set_A_periph(AT91_PIN_PB15, 0); /* SPI1_MOSI */ |
810 | at91_set_A_periph(AT91_PIN_PB16, 0); /* SPI1_SPCK */ | 802 | at91_set_A_periph(AT91_PIN_PB16, 0); /* SPI1_SPCK */ |
811 | 803 | ||
812 | at91_clock_associate("spi1_clk", &at91sam9g45_spi1_device.dev, "spi_clk"); | ||
813 | platform_device_register(&at91sam9g45_spi1_device); | 804 | platform_device_register(&at91sam9g45_spi1_device); |
814 | } | 805 | } |
815 | } | 806 | } |
@@ -999,10 +990,7 @@ static struct platform_device at91sam9g45_tcb1_device = { | |||
999 | 990 | ||
1000 | static void __init at91_add_device_tc(void) | 991 | static void __init at91_add_device_tc(void) |
1001 | { | 992 | { |
1002 | /* this chip has one clock and irq for all six TC channels */ | ||
1003 | at91_clock_associate("tcb0_clk", &at91sam9g45_tcb0_device.dev, "t0_clk"); | ||
1004 | platform_device_register(&at91sam9g45_tcb0_device); | 993 | platform_device_register(&at91sam9g45_tcb0_device); |
1005 | at91_clock_associate("tcb1_clk", &at91sam9g45_tcb1_device.dev, "t0_clk"); | ||
1006 | platform_device_register(&at91sam9g45_tcb1_device); | 994 | platform_device_register(&at91sam9g45_tcb1_device); |
1007 | } | 995 | } |
1008 | #else | 996 | #else |
@@ -1286,12 +1274,10 @@ void __init at91_add_device_ssc(unsigned id, unsigned pins) | |||
1286 | case AT91SAM9G45_ID_SSC0: | 1274 | case AT91SAM9G45_ID_SSC0: |
1287 | pdev = &at91sam9g45_ssc0_device; | 1275 | pdev = &at91sam9g45_ssc0_device; |
1288 | configure_ssc0_pins(pins); | 1276 | configure_ssc0_pins(pins); |
1289 | at91_clock_associate("ssc0_clk", &pdev->dev, "pclk"); | ||
1290 | break; | 1277 | break; |
1291 | case AT91SAM9G45_ID_SSC1: | 1278 | case AT91SAM9G45_ID_SSC1: |
1292 | pdev = &at91sam9g45_ssc1_device; | 1279 | pdev = &at91sam9g45_ssc1_device; |
1293 | configure_ssc1_pins(pins); | 1280 | configure_ssc1_pins(pins); |
1294 | at91_clock_associate("ssc1_clk", &pdev->dev, "pclk"); | ||
1295 | break; | 1281 | break; |
1296 | default: | 1282 | default: |
1297 | return; | 1283 | return; |
@@ -1533,27 +1519,22 @@ void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins) | |||
1533 | case 0: /* DBGU */ | 1519 | case 0: /* DBGU */ |
1534 | pdev = &at91sam9g45_dbgu_device; | 1520 | pdev = &at91sam9g45_dbgu_device; |
1535 | configure_dbgu_pins(); | 1521 | configure_dbgu_pins(); |
1536 | at91_clock_associate("mck", &pdev->dev, "usart"); | ||
1537 | break; | 1522 | break; |
1538 | case AT91SAM9G45_ID_US0: | 1523 | case AT91SAM9G45_ID_US0: |
1539 | pdev = &at91sam9g45_uart0_device; | 1524 | pdev = &at91sam9g45_uart0_device; |
1540 | configure_usart0_pins(pins); | 1525 | configure_usart0_pins(pins); |
1541 | at91_clock_associate("usart0_clk", &pdev->dev, "usart"); | ||
1542 | break; | 1526 | break; |
1543 | case AT91SAM9G45_ID_US1: | 1527 | case AT91SAM9G45_ID_US1: |
1544 | pdev = &at91sam9g45_uart1_device; | 1528 | pdev = &at91sam9g45_uart1_device; |
1545 | configure_usart1_pins(pins); | 1529 | configure_usart1_pins(pins); |
1546 | at91_clock_associate("usart1_clk", &pdev->dev, "usart"); | ||
1547 | break; | 1530 | break; |
1548 | case AT91SAM9G45_ID_US2: | 1531 | case AT91SAM9G45_ID_US2: |
1549 | pdev = &at91sam9g45_uart2_device; | 1532 | pdev = &at91sam9g45_uart2_device; |
1550 | configure_usart2_pins(pins); | 1533 | configure_usart2_pins(pins); |
1551 | at91_clock_associate("usart2_clk", &pdev->dev, "usart"); | ||
1552 | break; | 1534 | break; |
1553 | case AT91SAM9G45_ID_US3: | 1535 | case AT91SAM9G45_ID_US3: |
1554 | pdev = &at91sam9g45_uart3_device; | 1536 | pdev = &at91sam9g45_uart3_device; |
1555 | configure_usart3_pins(pins); | 1537 | configure_usart3_pins(pins); |
1556 | at91_clock_associate("usart3_clk", &pdev->dev, "usart"); | ||
1557 | break; | 1538 | break; |
1558 | default: | 1539 | default: |
1559 | return; | 1540 | return; |
@@ -1567,8 +1548,10 @@ void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins) | |||
1567 | 1548 | ||
1568 | void __init at91_set_serial_console(unsigned portnr) | 1549 | void __init at91_set_serial_console(unsigned portnr) |
1569 | { | 1550 | { |
1570 | if (portnr < ATMEL_MAX_UART) | 1551 | if (portnr < ATMEL_MAX_UART) { |
1571 | atmel_default_console_device = at91_uarts[portnr]; | 1552 | atmel_default_console_device = at91_uarts[portnr]; |
1553 | at91sam9g45_set_console_clock(portnr); | ||
1554 | } | ||
1572 | } | 1555 | } |
1573 | 1556 | ||
1574 | void __init at91_add_device_serial(void) | 1557 | void __init at91_add_device_serial(void) |
diff --git a/arch/arm/mach-at91/at91sam9rl.c b/arch/arm/mach-at91/at91sam9rl.c index 67c869783c7e..1a40f16b66c8 100644 --- a/arch/arm/mach-at91/at91sam9rl.c +++ b/arch/arm/mach-at91/at91sam9rl.c | |||
@@ -190,6 +190,24 @@ static struct clk *periph_clocks[] __initdata = { | |||
190 | // irq0 | 190 | // irq0 |
191 | }; | 191 | }; |
192 | 192 | ||
193 | static struct clk_lookup periph_clocks_lookups[] = { | ||
194 | CLKDEV_CON_DEV_ID("hclk", "atmel_usba_udc.0", &utmi_clk), | ||
195 | CLKDEV_CON_DEV_ID("pclk", "atmel_usba_udc.0", &udphs_clk), | ||
196 | CLKDEV_CON_DEV_ID("t0_clk", "atmel_tcb.0", &tc0_clk), | ||
197 | CLKDEV_CON_DEV_ID("t1_clk", "atmel_tcb.0", &tc1_clk), | ||
198 | CLKDEV_CON_DEV_ID("t2_clk", "atmel_tcb.0", &tc2_clk), | ||
199 | CLKDEV_CON_DEV_ID("pclk", "ssc.0", &ssc0_clk), | ||
200 | CLKDEV_CON_DEV_ID("pclk", "ssc.1", &ssc1_clk), | ||
201 | }; | ||
202 | |||
203 | static struct clk_lookup usart_clocks_lookups[] = { | ||
204 | CLKDEV_CON_DEV_ID("usart", "atmel_usart.0", &mck), | ||
205 | CLKDEV_CON_DEV_ID("usart", "atmel_usart.1", &usart0_clk), | ||
206 | CLKDEV_CON_DEV_ID("usart", "atmel_usart.2", &usart1_clk), | ||
207 | CLKDEV_CON_DEV_ID("usart", "atmel_usart.3", &usart2_clk), | ||
208 | CLKDEV_CON_DEV_ID("usart", "atmel_usart.4", &usart3_clk), | ||
209 | }; | ||
210 | |||
193 | /* | 211 | /* |
194 | * The two programmable clocks. | 212 | * The two programmable clocks. |
195 | * You must configure pin multiplexing to bring these signals out. | 213 | * You must configure pin multiplexing to bring these signals out. |
@@ -214,10 +232,27 @@ static void __init at91sam9rl_register_clocks(void) | |||
214 | for (i = 0; i < ARRAY_SIZE(periph_clocks); i++) | 232 | for (i = 0; i < ARRAY_SIZE(periph_clocks); i++) |
215 | clk_register(periph_clocks[i]); | 233 | clk_register(periph_clocks[i]); |
216 | 234 | ||
235 | clkdev_add_table(periph_clocks_lookups, | ||
236 | ARRAY_SIZE(periph_clocks_lookups)); | ||
237 | clkdev_add_table(usart_clocks_lookups, | ||
238 | ARRAY_SIZE(usart_clocks_lookups)); | ||
239 | |||
217 | clk_register(&pck0); | 240 | clk_register(&pck0); |
218 | clk_register(&pck1); | 241 | clk_register(&pck1); |
219 | } | 242 | } |
220 | 243 | ||
244 | static struct clk_lookup console_clock_lookup; | ||
245 | |||
246 | void __init at91sam9rl_set_console_clock(int id) | ||
247 | { | ||
248 | if (id >= ARRAY_SIZE(usart_clocks_lookups)) | ||
249 | return; | ||
250 | |||
251 | console_clock_lookup.con_id = "usart"; | ||
252 | console_clock_lookup.clk = usart_clocks_lookups[id].clk; | ||
253 | clkdev_add(&console_clock_lookup); | ||
254 | } | ||
255 | |||
221 | /* -------------------------------------------------------------------- | 256 | /* -------------------------------------------------------------------- |
222 | * GPIO | 257 | * GPIO |
223 | * -------------------------------------------------------------------- */ | 258 | * -------------------------------------------------------------------- */ |
diff --git a/arch/arm/mach-at91/at91sam9rl_devices.c b/arch/arm/mach-at91/at91sam9rl_devices.c index d194b085848e..c296045f2b6a 100644 --- a/arch/arm/mach-at91/at91sam9rl_devices.c +++ b/arch/arm/mach-at91/at91sam9rl_devices.c | |||
@@ -155,10 +155,6 @@ void __init at91_add_device_usba(struct usba_platform_data *data) | |||
155 | 155 | ||
156 | /* Pullup pin is handled internally by USB device peripheral */ | 156 | /* Pullup pin is handled internally by USB device peripheral */ |
157 | 157 | ||
158 | /* Clocks */ | ||
159 | at91_clock_associate("utmi_clk", &at91_usba_udc_device.dev, "hclk"); | ||
160 | at91_clock_associate("udphs_clk", &at91_usba_udc_device.dev, "pclk"); | ||
161 | |||
162 | platform_device_register(&at91_usba_udc_device); | 158 | platform_device_register(&at91_usba_udc_device); |
163 | } | 159 | } |
164 | #else | 160 | #else |
@@ -605,10 +601,6 @@ static struct platform_device at91sam9rl_tcb_device = { | |||
605 | 601 | ||
606 | static void __init at91_add_device_tc(void) | 602 | static void __init at91_add_device_tc(void) |
607 | { | 603 | { |
608 | /* this chip has a separate clock and irq for each TC channel */ | ||
609 | at91_clock_associate("tc0_clk", &at91sam9rl_tcb_device.dev, "t0_clk"); | ||
610 | at91_clock_associate("tc1_clk", &at91sam9rl_tcb_device.dev, "t1_clk"); | ||
611 | at91_clock_associate("tc2_clk", &at91sam9rl_tcb_device.dev, "t2_clk"); | ||
612 | platform_device_register(&at91sam9rl_tcb_device); | 604 | platform_device_register(&at91sam9rl_tcb_device); |
613 | } | 605 | } |
614 | #else | 606 | #else |
@@ -892,12 +884,10 @@ void __init at91_add_device_ssc(unsigned id, unsigned pins) | |||
892 | case AT91SAM9RL_ID_SSC0: | 884 | case AT91SAM9RL_ID_SSC0: |
893 | pdev = &at91sam9rl_ssc0_device; | 885 | pdev = &at91sam9rl_ssc0_device; |
894 | configure_ssc0_pins(pins); | 886 | configure_ssc0_pins(pins); |
895 | at91_clock_associate("ssc0_clk", &pdev->dev, "pclk"); | ||
896 | break; | 887 | break; |
897 | case AT91SAM9RL_ID_SSC1: | 888 | case AT91SAM9RL_ID_SSC1: |
898 | pdev = &at91sam9rl_ssc1_device; | 889 | pdev = &at91sam9rl_ssc1_device; |
899 | configure_ssc1_pins(pins); | 890 | configure_ssc1_pins(pins); |
900 | at91_clock_associate("ssc1_clk", &pdev->dev, "pclk"); | ||
901 | break; | 891 | break; |
902 | default: | 892 | default: |
903 | return; | 893 | return; |
@@ -1147,27 +1137,22 @@ void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins) | |||
1147 | case 0: /* DBGU */ | 1137 | case 0: /* DBGU */ |
1148 | pdev = &at91sam9rl_dbgu_device; | 1138 | pdev = &at91sam9rl_dbgu_device; |
1149 | configure_dbgu_pins(); | 1139 | configure_dbgu_pins(); |
1150 | at91_clock_associate("mck", &pdev->dev, "usart"); | ||
1151 | break; | 1140 | break; |
1152 | case AT91SAM9RL_ID_US0: | 1141 | case AT91SAM9RL_ID_US0: |
1153 | pdev = &at91sam9rl_uart0_device; | 1142 | pdev = &at91sam9rl_uart0_device; |
1154 | configure_usart0_pins(pins); | 1143 | configure_usart0_pins(pins); |
1155 | at91_clock_associate("usart0_clk", &pdev->dev, "usart"); | ||
1156 | break; | 1144 | break; |
1157 | case AT91SAM9RL_ID_US1: | 1145 | case AT91SAM9RL_ID_US1: |
1158 | pdev = &at91sam9rl_uart1_device; | 1146 | pdev = &at91sam9rl_uart1_device; |
1159 | configure_usart1_pins(pins); | 1147 | configure_usart1_pins(pins); |
1160 | at91_clock_associate("usart1_clk", &pdev->dev, "usart"); | ||
1161 | break; | 1148 | break; |
1162 | case AT91SAM9RL_ID_US2: | 1149 | case AT91SAM9RL_ID_US2: |
1163 | pdev = &at91sam9rl_uart2_device; | 1150 | pdev = &at91sam9rl_uart2_device; |
1164 | configure_usart2_pins(pins); | 1151 | configure_usart2_pins(pins); |
1165 | at91_clock_associate("usart2_clk", &pdev->dev, "usart"); | ||
1166 | break; | 1152 | break; |
1167 | case AT91SAM9RL_ID_US3: | 1153 | case AT91SAM9RL_ID_US3: |
1168 | pdev = &at91sam9rl_uart3_device; | 1154 | pdev = &at91sam9rl_uart3_device; |
1169 | configure_usart3_pins(pins); | 1155 | configure_usart3_pins(pins); |
1170 | at91_clock_associate("usart3_clk", &pdev->dev, "usart"); | ||
1171 | break; | 1156 | break; |
1172 | default: | 1157 | default: |
1173 | return; | 1158 | return; |
@@ -1181,8 +1166,10 @@ void __init at91_register_uart(unsigned id, unsigned portnr, unsigned pins) | |||
1181 | 1166 | ||
1182 | void __init at91_set_serial_console(unsigned portnr) | 1167 | void __init at91_set_serial_console(unsigned portnr) |
1183 | { | 1168 | { |
1184 | if (portnr < ATMEL_MAX_UART) | 1169 | if (portnr < ATMEL_MAX_UART) { |
1185 | atmel_default_console_device = at91_uarts[portnr]; | 1170 | atmel_default_console_device = at91_uarts[portnr]; |
1171 | at91sam9rl_set_console_clock(portnr); | ||
1172 | } | ||
1186 | } | 1173 | } |
1187 | 1174 | ||
1188 | void __init at91_add_device_serial(void) | 1175 | void __init at91_add_device_serial(void) |
diff --git a/arch/arm/mach-at91/at91x40.c b/arch/arm/mach-at91/at91x40.c index ad3ec85b2790..56ba3bd035ae 100644 --- a/arch/arm/mach-at91/at91x40.c +++ b/arch/arm/mach-at91/at91x40.c | |||
@@ -37,11 +37,6 @@ unsigned long clk_get_rate(struct clk *clk) | |||
37 | return AT91X40_MASTER_CLOCK; | 37 | return AT91X40_MASTER_CLOCK; |
38 | } | 38 | } |
39 | 39 | ||
40 | struct clk *clk_get(struct device *dev, const char *id) | ||
41 | { | ||
42 | return NULL; | ||
43 | } | ||
44 | |||
45 | void __init at91x40_initialize(unsigned long main_clock) | 40 | void __init at91x40_initialize(unsigned long main_clock) |
46 | { | 41 | { |
47 | at91_extern_irq = (1 << AT91X40_ID_IRQ0) | (1 << AT91X40_ID_IRQ1) | 42 | at91_extern_irq = (1 << AT91X40_ID_IRQ0) | (1 << AT91X40_ID_IRQ1) |
diff --git a/arch/arm/mach-at91/clock.c b/arch/arm/mach-at91/clock.c index 9113da6845f1..ac103cbdbf35 100644 --- a/arch/arm/mach-at91/clock.c +++ b/arch/arm/mach-at91/clock.c | |||
@@ -163,7 +163,7 @@ static struct clk udpck = { | |||
163 | .parent = &pllb, | 163 | .parent = &pllb, |
164 | .mode = pmc_sys_mode, | 164 | .mode = pmc_sys_mode, |
165 | }; | 165 | }; |
166 | static struct clk utmi_clk = { | 166 | struct clk utmi_clk = { |
167 | .name = "utmi_clk", | 167 | .name = "utmi_clk", |
168 | .parent = &main_clk, | 168 | .parent = &main_clk, |
169 | .pmc_mask = AT91_PMC_UPLLEN, /* in CKGR_UCKR */ | 169 | .pmc_mask = AT91_PMC_UPLLEN, /* in CKGR_UCKR */ |
@@ -182,7 +182,7 @@ static struct clk uhpck = { | |||
182 | * memory, interfaces to on-chip peripherals, the AIC, and sometimes more | 182 | * memory, interfaces to on-chip peripherals, the AIC, and sometimes more |
183 | * (e.g baud rate generation). It's sourced from one of the primary clocks. | 183 | * (e.g baud rate generation). It's sourced from one of the primary clocks. |
184 | */ | 184 | */ |
185 | static struct clk mck = { | 185 | struct clk mck = { |
186 | .name = "mck", | 186 | .name = "mck", |
187 | .pmc_mask = AT91_PMC_MCKRDY, /* in PMC_SR */ | 187 | .pmc_mask = AT91_PMC_MCKRDY, /* in PMC_SR */ |
188 | }; | 188 | }; |
@@ -215,43 +215,6 @@ static struct clk __init *at91_css_to_clk(unsigned long css) | |||
215 | return NULL; | 215 | return NULL; |
216 | } | 216 | } |
217 | 217 | ||
218 | /* | ||
219 | * Associate a particular clock with a function (eg, "uart") and device. | ||
220 | * The drivers can then request the same 'function' with several different | ||
221 | * devices and not care about which clock name to use. | ||
222 | */ | ||
223 | void __init at91_clock_associate(const char *id, struct device *dev, const char *func) | ||
224 | { | ||
225 | struct clk *clk = clk_get(NULL, id); | ||
226 | |||
227 | if (!dev || !clk || !IS_ERR(clk_get(dev, func))) | ||
228 | return; | ||
229 | |||
230 | clk->function = func; | ||
231 | clk->dev = dev; | ||
232 | } | ||
233 | |||
234 | /* clocks cannot be de-registered no refcounting necessary */ | ||
235 | struct clk *clk_get(struct device *dev, const char *id) | ||
236 | { | ||
237 | struct clk *clk; | ||
238 | |||
239 | list_for_each_entry(clk, &clocks, node) { | ||
240 | if (strcmp(id, clk->name) == 0) | ||
241 | return clk; | ||
242 | if (clk->function && (dev == clk->dev) && strcmp(id, clk->function) == 0) | ||
243 | return clk; | ||
244 | } | ||
245 | |||
246 | return ERR_PTR(-ENOENT); | ||
247 | } | ||
248 | EXPORT_SYMBOL(clk_get); | ||
249 | |||
250 | void clk_put(struct clk *clk) | ||
251 | { | ||
252 | } | ||
253 | EXPORT_SYMBOL(clk_put); | ||
254 | |||
255 | static void __clk_enable(struct clk *clk) | 218 | static void __clk_enable(struct clk *clk) |
256 | { | 219 | { |
257 | if (clk->parent) | 220 | if (clk->parent) |
@@ -498,32 +461,38 @@ postcore_initcall(at91_clk_debugfs_init); | |||
498 | /*------------------------------------------------------------------------*/ | 461 | /*------------------------------------------------------------------------*/ |
499 | 462 | ||
500 | /* Register a new clock */ | 463 | /* Register a new clock */ |
464 | static void __init at91_clk_add(struct clk *clk) | ||
465 | { | ||
466 | list_add_tail(&clk->node, &clocks); | ||
467 | |||
468 | clk->cl.con_id = clk->name; | ||
469 | clk->cl.clk = clk; | ||
470 | clkdev_add(&clk->cl); | ||
471 | } | ||
472 | |||
501 | int __init clk_register(struct clk *clk) | 473 | int __init clk_register(struct clk *clk) |
502 | { | 474 | { |
503 | if (clk_is_peripheral(clk)) { | 475 | if (clk_is_peripheral(clk)) { |
504 | if (!clk->parent) | 476 | if (!clk->parent) |
505 | clk->parent = &mck; | 477 | clk->parent = &mck; |
506 | clk->mode = pmc_periph_mode; | 478 | clk->mode = pmc_periph_mode; |
507 | list_add_tail(&clk->node, &clocks); | ||
508 | } | 479 | } |
509 | else if (clk_is_sys(clk)) { | 480 | else if (clk_is_sys(clk)) { |
510 | clk->parent = &mck; | 481 | clk->parent = &mck; |
511 | clk->mode = pmc_sys_mode; | 482 | clk->mode = pmc_sys_mode; |
512 | |||
513 | list_add_tail(&clk->node, &clocks); | ||
514 | } | 483 | } |
515 | #ifdef CONFIG_AT91_PROGRAMMABLE_CLOCKS | 484 | #ifdef CONFIG_AT91_PROGRAMMABLE_CLOCKS |
516 | else if (clk_is_programmable(clk)) { | 485 | else if (clk_is_programmable(clk)) { |
517 | clk->mode = pmc_sys_mode; | 486 | clk->mode = pmc_sys_mode; |
518 | init_programmable_clock(clk); | 487 | init_programmable_clock(clk); |
519 | list_add_tail(&clk->node, &clocks); | ||
520 | } | 488 | } |
521 | #endif | 489 | #endif |
522 | 490 | ||
491 | at91_clk_add(clk); | ||
492 | |||
523 | return 0; | 493 | return 0; |
524 | } | 494 | } |
525 | 495 | ||
526 | |||
527 | /*------------------------------------------------------------------------*/ | 496 | /*------------------------------------------------------------------------*/ |
528 | 497 | ||
529 | static u32 __init at91_pll_rate(struct clk *pll, u32 freq, u32 reg) | 498 | static u32 __init at91_pll_rate(struct clk *pll, u32 freq, u32 reg) |
@@ -754,19 +723,19 @@ int __init at91_clock_init(unsigned long main_clock) | |||
754 | 723 | ||
755 | /* Register the PMC's standard clocks */ | 724 | /* Register the PMC's standard clocks */ |
756 | for (i = 0; i < ARRAY_SIZE(standard_pmc_clocks); i++) | 725 | for (i = 0; i < ARRAY_SIZE(standard_pmc_clocks); i++) |
757 | list_add_tail(&standard_pmc_clocks[i]->node, &clocks); | 726 | at91_clk_add(standard_pmc_clocks[i]); |
758 | 727 | ||
759 | if (cpu_has_pllb()) | 728 | if (cpu_has_pllb()) |
760 | list_add_tail(&pllb.node, &clocks); | 729 | at91_clk_add(&pllb); |
761 | 730 | ||
762 | if (cpu_has_uhp()) | 731 | if (cpu_has_uhp()) |
763 | list_add_tail(&uhpck.node, &clocks); | 732 | at91_clk_add(&uhpck); |
764 | 733 | ||
765 | if (cpu_has_udpfs()) | 734 | if (cpu_has_udpfs()) |
766 | list_add_tail(&udpck.node, &clocks); | 735 | at91_clk_add(&udpck); |
767 | 736 | ||
768 | if (cpu_has_utmi()) | 737 | if (cpu_has_utmi()) |
769 | list_add_tail(&utmi_clk.node, &clocks); | 738 | at91_clk_add(&utmi_clk); |
770 | 739 | ||
771 | /* MCK and CPU clock are "always on" */ | 740 | /* MCK and CPU clock are "always on" */ |
772 | clk_enable(&mck); | 741 | clk_enable(&mck); |
diff --git a/arch/arm/mach-at91/clock.h b/arch/arm/mach-at91/clock.h index 6cf4b78e175d..c2e63e47dcbe 100644 --- a/arch/arm/mach-at91/clock.h +++ b/arch/arm/mach-at91/clock.h | |||
@@ -6,6 +6,8 @@ | |||
6 | * published by the Free Software Foundation. | 6 | * published by the Free Software Foundation. |
7 | */ | 7 | */ |
8 | 8 | ||
9 | #include <linux/clkdev.h> | ||
10 | |||
9 | #define CLK_TYPE_PRIMARY 0x1 | 11 | #define CLK_TYPE_PRIMARY 0x1 |
10 | #define CLK_TYPE_PLL 0x2 | 12 | #define CLK_TYPE_PLL 0x2 |
11 | #define CLK_TYPE_PROGRAMMABLE 0x4 | 13 | #define CLK_TYPE_PROGRAMMABLE 0x4 |
@@ -16,8 +18,7 @@ | |||
16 | struct clk { | 18 | struct clk { |
17 | struct list_head node; | 19 | struct list_head node; |
18 | const char *name; /* unique clock name */ | 20 | const char *name; /* unique clock name */ |
19 | const char *function; /* function of the clock */ | 21 | struct clk_lookup cl; |
20 | struct device *dev; /* device associated with function */ | ||
21 | unsigned long rate_hz; | 22 | unsigned long rate_hz; |
22 | struct clk *parent; | 23 | struct clk *parent; |
23 | u32 pmc_mask; | 24 | u32 pmc_mask; |
@@ -29,3 +30,18 @@ struct clk { | |||
29 | 30 | ||
30 | 31 | ||
31 | extern int __init clk_register(struct clk *clk); | 32 | extern int __init clk_register(struct clk *clk); |
33 | extern struct clk mck; | ||
34 | extern struct clk utmi_clk; | ||
35 | |||
36 | #define CLKDEV_CON_ID(_id, _clk) \ | ||
37 | { \ | ||
38 | .con_id = _id, \ | ||
39 | .clk = _clk, \ | ||
40 | } | ||
41 | |||
42 | #define CLKDEV_CON_DEV_ID(_con_id, _dev_id, _clk) \ | ||
43 | { \ | ||
44 | .con_id = _con_id, \ | ||
45 | .dev_id = _dev_id, \ | ||
46 | .clk = _clk, \ | ||
47 | } | ||
diff --git a/arch/arm/mach-at91/generic.h b/arch/arm/mach-at91/generic.h index 50d46fa9ddb6..ecba94ee520b 100644 --- a/arch/arm/mach-at91/generic.h +++ b/arch/arm/mach-at91/generic.h | |||
@@ -8,6 +8,8 @@ | |||
8 | * published by the Free Software Foundation. | 8 | * published by the Free Software Foundation. |
9 | */ | 9 | */ |
10 | 10 | ||
11 | #include <linux/clkdev.h> | ||
12 | |||
11 | /* Map io */ | 13 | /* Map io */ |
12 | extern void __init at91rm9200_map_io(void); | 14 | extern void __init at91rm9200_map_io(void); |
13 | extern void __init at91sam9260_map_io(void); | 15 | extern void __init at91sam9260_map_io(void); |
@@ -50,8 +52,20 @@ extern struct sys_timer at91x40_timer; | |||
50 | 52 | ||
51 | /* Clocks */ | 53 | /* Clocks */ |
52 | extern int __init at91_clock_init(unsigned long main_clock); | 54 | extern int __init at91_clock_init(unsigned long main_clock); |
55 | /* | ||
56 | * function to specify the clock of the default console. As we do not | ||
57 | * use the device/driver bus, the dev_name is not intialize. So we need | ||
58 | * to link the clock to a specific con_id only "usart" | ||
59 | */ | ||
60 | extern void __init at91rm9200_set_console_clock(int id); | ||
61 | extern void __init at91sam9260_set_console_clock(int id); | ||
62 | extern void __init at91sam9261_set_console_clock(int id); | ||
63 | extern void __init at91sam9263_set_console_clock(int id); | ||
64 | extern void __init at91sam9rl_set_console_clock(int id); | ||
65 | extern void __init at91sam9g45_set_console_clock(int id); | ||
66 | extern void __init at91cap9_set_console_clock(int id); | ||
67 | extern void __init at572d940hf_set_console_clock(int id); | ||
53 | struct device; | 68 | struct device; |
54 | extern void __init at91_clock_associate(const char *id, struct device *dev, const char *func); | ||
55 | 69 | ||
56 | /* Power Management */ | 70 | /* Power Management */ |
57 | extern void at91_irq_suspend(void); | 71 | extern void at91_irq_suspend(void); |
diff --git a/arch/arm/mach-at91/include/mach/clkdev.h b/arch/arm/mach-at91/include/mach/clkdev.h new file mode 100644 index 000000000000..04b37a89801c --- /dev/null +++ b/arch/arm/mach-at91/include/mach/clkdev.h | |||
@@ -0,0 +1,7 @@ | |||
1 | #ifndef __ASM_MACH_CLKDEV_H | ||
2 | #define __ASM_MACH_CLKDEV_H | ||
3 | |||
4 | #define __clk_get(clk) ({ 1; }) | ||
5 | #define __clk_put(clk) do { } while (0) | ||
6 | |||
7 | #endif | ||