| #include <common.h> |
| #include <gpio.h> |
| #include <init.h> |
| #include <mach/io.h> |
| #include <mach/hardware.h> |
| #include <mach/at91_pmc.h> |
| #include <mach/cpu.h> |
| |
| #include "generic.h" |
| #include "clock.h" |
| |
| /* -------------------------------------------------------------------- |
| * Clocks |
| * -------------------------------------------------------------------- */ |
| |
| /* |
| * The peripheral clocks. |
| */ |
| static struct clk pioA_clk = { |
| .name = "pioA_clk", |
| .pmc_mask = 1 << AT91SAM9G45_ID_PIOA, |
| .type = CLK_TYPE_PERIPHERAL, |
| }; |
| static struct clk pioB_clk = { |
| .name = "pioB_clk", |
| .pmc_mask = 1 << AT91SAM9G45_ID_PIOB, |
| .type = CLK_TYPE_PERIPHERAL, |
| }; |
| static struct clk pioC_clk = { |
| .name = "pioC_clk", |
| .pmc_mask = 1 << AT91SAM9G45_ID_PIOC, |
| .type = CLK_TYPE_PERIPHERAL, |
| }; |
| static struct clk pioDE_clk = { |
| .name = "pioDE_clk", |
| .pmc_mask = 1 << AT91SAM9G45_ID_PIODE, |
| .type = CLK_TYPE_PERIPHERAL, |
| }; |
| static struct clk usart0_clk = { |
| .name = "usart0_clk", |
| .pmc_mask = 1 << AT91SAM9G45_ID_US0, |
| .type = CLK_TYPE_PERIPHERAL, |
| }; |
| static struct clk usart1_clk = { |
| .name = "usart1_clk", |
| .pmc_mask = 1 << AT91SAM9G45_ID_US1, |
| .type = CLK_TYPE_PERIPHERAL, |
| }; |
| static struct clk usart2_clk = { |
| .name = "usart2_clk", |
| .pmc_mask = 1 << AT91SAM9G45_ID_US2, |
| .type = CLK_TYPE_PERIPHERAL, |
| }; |
| static struct clk usart3_clk = { |
| .name = "usart3_clk", |
| .pmc_mask = 1 << AT91SAM9G45_ID_US3, |
| .type = CLK_TYPE_PERIPHERAL, |
| }; |
| static struct clk mmc0_clk = { |
| .name = "mci0_clk", |
| .pmc_mask = 1 << AT91SAM9G45_ID_MCI0, |
| .type = CLK_TYPE_PERIPHERAL, |
| }; |
| static struct clk twi0_clk = { |
| .name = "twi0_clk", |
| .pmc_mask = 1 << AT91SAM9G45_ID_TWI0, |
| .type = CLK_TYPE_PERIPHERAL, |
| }; |
| static struct clk twi1_clk = { |
| .name = "twi1_clk", |
| .pmc_mask = 1 << AT91SAM9G45_ID_TWI1, |
| .type = CLK_TYPE_PERIPHERAL, |
| }; |
| static struct clk spi0_clk = { |
| .name = "spi0_clk", |
| .pmc_mask = 1 << AT91SAM9G45_ID_SPI0, |
| .type = CLK_TYPE_PERIPHERAL, |
| }; |
| static struct clk spi1_clk = { |
| .name = "spi1_clk", |
| .pmc_mask = 1 << AT91SAM9G45_ID_SPI1, |
| .type = CLK_TYPE_PERIPHERAL, |
| }; |
| static struct clk ssc0_clk = { |
| .name = "ssc0_clk", |
| .pmc_mask = 1 << AT91SAM9G45_ID_SSC0, |
| .type = CLK_TYPE_PERIPHERAL, |
| }; |
| static struct clk ssc1_clk = { |
| .name = "ssc1_clk", |
| .pmc_mask = 1 << AT91SAM9G45_ID_SSC1, |
| .type = CLK_TYPE_PERIPHERAL, |
| }; |
| static struct clk tcb0_clk = { |
| .name = "tcb0_clk", |
| .pmc_mask = 1 << AT91SAM9G45_ID_TCB, |
| .type = CLK_TYPE_PERIPHERAL, |
| }; |
| static struct clk pwm_clk = { |
| .name = "pwm_clk", |
| .pmc_mask = 1 << AT91SAM9G45_ID_PWMC, |
| .type = CLK_TYPE_PERIPHERAL, |
| }; |
| static struct clk tsc_clk = { |
| .name = "tsc_clk", |
| .pmc_mask = 1 << AT91SAM9G45_ID_TSC, |
| .type = CLK_TYPE_PERIPHERAL, |
| }; |
| static struct clk dma_clk = { |
| .name = "dma_clk", |
| .pmc_mask = 1 << AT91SAM9G45_ID_DMA, |
| .type = CLK_TYPE_PERIPHERAL, |
| }; |
| static struct clk uhphs_clk = { |
| .name = "uhphs_clk", |
| .pmc_mask = 1 << AT91SAM9G45_ID_UHPHS, |
| .type = CLK_TYPE_PERIPHERAL, |
| }; |
| static struct clk lcdc_clk = { |
| .name = "lcdc_clk", |
| .pmc_mask = 1 << AT91SAM9G45_ID_LCDC, |
| .type = CLK_TYPE_PERIPHERAL, |
| }; |
| static struct clk ac97_clk = { |
| .name = "ac97_clk", |
| .pmc_mask = 1 << AT91SAM9G45_ID_AC97C, |
| .type = CLK_TYPE_PERIPHERAL, |
| }; |
| static struct clk macb_clk = { |
| .name = "macb_clk", |
| .pmc_mask = 1 << AT91SAM9G45_ID_EMAC, |
| .type = CLK_TYPE_PERIPHERAL, |
| }; |
| static struct clk isi_clk = { |
| .name = "isi_clk", |
| .pmc_mask = 1 << AT91SAM9G45_ID_ISI, |
| .type = CLK_TYPE_PERIPHERAL, |
| }; |
| static struct clk udphs_clk = { |
| .name = "udphs_clk", |
| .pmc_mask = 1 << AT91SAM9G45_ID_UDPHS, |
| .type = CLK_TYPE_PERIPHERAL, |
| }; |
| static struct clk mmc1_clk = { |
| .name = "mci1_clk", |
| .pmc_mask = 1 << AT91SAM9G45_ID_MCI1, |
| .type = CLK_TYPE_PERIPHERAL, |
| }; |
| |
| /* Video decoder clock - Only for sam9m10/sam9m11 */ |
| static struct clk vdec_clk = { |
| .name = "vdec_clk", |
| .pmc_mask = 1 << AT91SAM9G45_ID_VDEC, |
| .type = CLK_TYPE_PERIPHERAL, |
| }; |
| |
| /* One additional fake clock for ohci */ |
| static struct clk ohci_clk = { |
| .name = "ohci_clk", |
| .pmc_mask = 0, |
| .type = CLK_TYPE_PERIPHERAL, |
| .parent = &uhphs_clk, |
| }; |
| |
| /* One additional fake clock for second TC block */ |
| static struct clk tcb1_clk = { |
| .name = "tcb1_clk", |
| .pmc_mask = 0, |
| .type = CLK_TYPE_PERIPHERAL, |
| .parent = &tcb0_clk, |
| }; |
| |
| static struct clk *periph_clocks[] __initdata = { |
| &pioA_clk, |
| &pioB_clk, |
| &pioC_clk, |
| &pioDE_clk, |
| &usart0_clk, |
| &usart1_clk, |
| &usart2_clk, |
| &usart3_clk, |
| &mmc0_clk, |
| &twi0_clk, |
| &twi1_clk, |
| &spi0_clk, |
| &spi1_clk, |
| &ssc0_clk, |
| &ssc1_clk, |
| &tcb0_clk, |
| &pwm_clk, |
| &tsc_clk, |
| &dma_clk, |
| &uhphs_clk, |
| &lcdc_clk, |
| &ac97_clk, |
| &macb_clk, |
| &isi_clk, |
| &udphs_clk, |
| &mmc1_clk, |
| // irq0 |
| &ohci_clk, |
| &tcb1_clk, |
| }; |
| |
| /* |
| * The two programmable clocks. |
| * You must configure pin multiplexing to bring these signals out. |
| */ |
| static struct clk pck0 = { |
| .name = "pck0", |
| .pmc_mask = AT91_PMC_PCK0, |
| .type = CLK_TYPE_PROGRAMMABLE, |
| .id = 0, |
| }; |
| static struct clk pck1 = { |
| .name = "pck1", |
| .pmc_mask = AT91_PMC_PCK1, |
| .type = CLK_TYPE_PROGRAMMABLE, |
| .id = 1, |
| }; |
| |
| static void __init at91sam9g45_register_clocks(void) |
| { |
| int i; |
| |
| for (i = 0; i < ARRAY_SIZE(periph_clocks); i++) |
| clk_register(periph_clocks[i]); |
| |
| if (cpu_is_at91sam9m10() || cpu_is_at91sam9m11()) |
| clk_register(&vdec_clk); |
| |
| clk_register(&pck0); |
| clk_register(&pck1); |
| } |
| |
| /* -------------------------------------------------------------------- |
| * GPIO |
| * -------------------------------------------------------------------- */ |
| |
| static struct at91_gpio_bank at91sam9g45_gpio[] = { |
| { |
| .id = AT91SAM9G45_ID_PIOA, |
| .offset = AT91_PIOA, |
| .clock = &pioA_clk, |
| }, { |
| .id = AT91SAM9G45_ID_PIOB, |
| .offset = AT91_PIOB, |
| .clock = &pioB_clk, |
| }, { |
| .id = AT91SAM9G45_ID_PIOC, |
| .offset = AT91_PIOC, |
| .clock = &pioC_clk, |
| }, { |
| .id = AT91SAM9G45_ID_PIODE, |
| .offset = AT91_PIOD, |
| .clock = &pioDE_clk, |
| }, { |
| .id = AT91SAM9G45_ID_PIODE, |
| .offset = AT91_PIOE, |
| .clock = &pioDE_clk, |
| } |
| }; |
| |
| static int at91sam9g45_initialize(void) |
| { |
| /* Init clock subsystem */ |
| at91_clock_init(AT91_MAIN_CLOCK); |
| |
| /* Register the processor-specific clocks */ |
| at91sam9g45_register_clocks(); |
| |
| /* Register GPIO subsystem */ |
| at91_gpio_init(at91sam9g45_gpio, 5); |
| return 0; |
| } |
| |
| core_initcall(at91sam9g45_initialize); |