|
@@ -88,3 +88,192 @@ static struct clk udc_clk = {
|
|
|
.pmc_mask = 1 << AT91SAM9260_ID_UDP,
|
|
|
.type = CLK_TYPE_PERIPHERAL,
|
|
|
};
|
|
|
+static struct clk twi_clk = {
|
|
|
+ .name = "twi_clk",
|
|
|
+ .pmc_mask = 1 << AT91SAM9260_ID_TWI,
|
|
|
+ .type = CLK_TYPE_PERIPHERAL,
|
|
|
+};
|
|
|
+static struct clk spi0_clk = {
|
|
|
+ .name = "spi0_clk",
|
|
|
+ .pmc_mask = 1 << AT91SAM9260_ID_SPI0,
|
|
|
+ .type = CLK_TYPE_PERIPHERAL,
|
|
|
+};
|
|
|
+static struct clk spi1_clk = {
|
|
|
+ .name = "spi1_clk",
|
|
|
+ .pmc_mask = 1 << AT91SAM9260_ID_SPI1,
|
|
|
+ .type = CLK_TYPE_PERIPHERAL,
|
|
|
+};
|
|
|
+static struct clk ssc_clk = {
|
|
|
+ .name = "ssc_clk",
|
|
|
+ .pmc_mask = 1 << AT91SAM9260_ID_SSC,
|
|
|
+ .type = CLK_TYPE_PERIPHERAL,
|
|
|
+};
|
|
|
+static struct clk tc0_clk = {
|
|
|
+ .name = "tc0_clk",
|
|
|
+ .pmc_mask = 1 << AT91SAM9260_ID_TC0,
|
|
|
+ .type = CLK_TYPE_PERIPHERAL,
|
|
|
+};
|
|
|
+static struct clk tc1_clk = {
|
|
|
+ .name = "tc1_clk",
|
|
|
+ .pmc_mask = 1 << AT91SAM9260_ID_TC1,
|
|
|
+ .type = CLK_TYPE_PERIPHERAL,
|
|
|
+};
|
|
|
+static struct clk tc2_clk = {
|
|
|
+ .name = "tc2_clk",
|
|
|
+ .pmc_mask = 1 << AT91SAM9260_ID_TC2,
|
|
|
+ .type = CLK_TYPE_PERIPHERAL,
|
|
|
+};
|
|
|
+static struct clk ohci_clk = {
|
|
|
+ .name = "ohci_clk",
|
|
|
+ .pmc_mask = 1 << AT91SAM9260_ID_UHP,
|
|
|
+ .type = CLK_TYPE_PERIPHERAL,
|
|
|
+};
|
|
|
+static struct clk macb_clk = {
|
|
|
+ .name = "pclk",
|
|
|
+ .pmc_mask = 1 << AT91SAM9260_ID_EMAC,
|
|
|
+ .type = CLK_TYPE_PERIPHERAL,
|
|
|
+};
|
|
|
+static struct clk isi_clk = {
|
|
|
+ .name = "isi_clk",
|
|
|
+ .pmc_mask = 1 << AT91SAM9260_ID_ISI,
|
|
|
+ .type = CLK_TYPE_PERIPHERAL,
|
|
|
+};
|
|
|
+static struct clk usart3_clk = {
|
|
|
+ .name = "usart3_clk",
|
|
|
+ .pmc_mask = 1 << AT91SAM9260_ID_US3,
|
|
|
+ .type = CLK_TYPE_PERIPHERAL,
|
|
|
+};
|
|
|
+static struct clk usart4_clk = {
|
|
|
+ .name = "usart4_clk",
|
|
|
+ .pmc_mask = 1 << AT91SAM9260_ID_US4,
|
|
|
+ .type = CLK_TYPE_PERIPHERAL,
|
|
|
+};
|
|
|
+static struct clk usart5_clk = {
|
|
|
+ .name = "usart5_clk",
|
|
|
+ .pmc_mask = 1 << AT91SAM9260_ID_US5,
|
|
|
+ .type = CLK_TYPE_PERIPHERAL,
|
|
|
+};
|
|
|
+static struct clk tc3_clk = {
|
|
|
+ .name = "tc3_clk",
|
|
|
+ .pmc_mask = 1 << AT91SAM9260_ID_TC3,
|
|
|
+ .type = CLK_TYPE_PERIPHERAL,
|
|
|
+};
|
|
|
+static struct clk tc4_clk = {
|
|
|
+ .name = "tc4_clk",
|
|
|
+ .pmc_mask = 1 << AT91SAM9260_ID_TC4,
|
|
|
+ .type = CLK_TYPE_PERIPHERAL,
|
|
|
+};
|
|
|
+static struct clk tc5_clk = {
|
|
|
+ .name = "tc5_clk",
|
|
|
+ .pmc_mask = 1 << AT91SAM9260_ID_TC5,
|
|
|
+ .type = CLK_TYPE_PERIPHERAL,
|
|
|
+};
|
|
|
+
|
|
|
+static struct clk *periph_clocks[] __initdata = {
|
|
|
+ &pioA_clk,
|
|
|
+ &pioB_clk,
|
|
|
+ &pioC_clk,
|
|
|
+ &adc_clk,
|
|
|
+ &adc_op_clk,
|
|
|
+ &usart0_clk,
|
|
|
+ &usart1_clk,
|
|
|
+ &usart2_clk,
|
|
|
+ &mmc_clk,
|
|
|
+ &udc_clk,
|
|
|
+ &twi_clk,
|
|
|
+ &spi0_clk,
|
|
|
+ &spi1_clk,
|
|
|
+ &ssc_clk,
|
|
|
+ &tc0_clk,
|
|
|
+ &tc1_clk,
|
|
|
+ &tc2_clk,
|
|
|
+ &ohci_clk,
|
|
|
+ &macb_clk,
|
|
|
+ &isi_clk,
|
|
|
+ &usart3_clk,
|
|
|
+ &usart4_clk,
|
|
|
+ &usart5_clk,
|
|
|
+ &tc3_clk,
|
|
|
+ &tc4_clk,
|
|
|
+ &tc5_clk,
|
|
|
+ // irq0 .. irq2
|
|
|
+};
|
|
|
+
|
|
|
+static struct clk_lookup periph_clocks_lookups[] = {
|
|
|
+ /* One additional fake clock for macb_hclk */
|
|
|
+ CLKDEV_CON_ID("hclk", &macb_clk),
|
|
|
+ CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi.0", &spi0_clk),
|
|
|
+ CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi.1", &spi1_clk),
|
|
|
+ CLKDEV_CON_DEV_ID("t0_clk", "atmel_tcb.0", &tc0_clk),
|
|
|
+ CLKDEV_CON_DEV_ID("t1_clk", "atmel_tcb.0", &tc1_clk),
|
|
|
+ CLKDEV_CON_DEV_ID("t2_clk", "atmel_tcb.0", &tc2_clk),
|
|
|
+ CLKDEV_CON_DEV_ID("t0_clk", "atmel_tcb.1", &tc3_clk),
|
|
|
+ CLKDEV_CON_DEV_ID("t1_clk", "atmel_tcb.1", &tc4_clk),
|
|
|
+ CLKDEV_CON_DEV_ID("t2_clk", "atmel_tcb.1", &tc5_clk),
|
|
|
+ CLKDEV_CON_DEV_ID("pclk", "at91rm9200_ssc.0", &ssc_clk),
|
|
|
+ CLKDEV_CON_DEV_ID("pclk", "fffbc000.ssc", &ssc_clk),
|
|
|
+ CLKDEV_CON_DEV_ID(NULL, "i2c-at91sam9260.0", &twi_clk),
|
|
|
+ CLKDEV_CON_DEV_ID(NULL, "i2c-at91sam9g20.0", &twi_clk),
|
|
|
+ /* more usart lookup table for DT entries */
|
|
|
+ CLKDEV_CON_DEV_ID("usart", "fffff200.serial", &mck),
|
|
|
+ CLKDEV_CON_DEV_ID("usart", "fffb0000.serial", &usart0_clk),
|
|
|
+ CLKDEV_CON_DEV_ID("usart", "fffb4000.serial", &usart1_clk),
|
|
|
+ CLKDEV_CON_DEV_ID("usart", "fffb8000.serial", &usart2_clk),
|
|
|
+ CLKDEV_CON_DEV_ID("usart", "fffd0000.serial", &usart3_clk),
|
|
|
+ CLKDEV_CON_DEV_ID("usart", "fffd4000.serial", &usart4_clk),
|
|
|
+ CLKDEV_CON_DEV_ID("usart", "fffd8000.serial", &usart5_clk),
|
|
|
+ CLKDEV_CON_DEV_ID(NULL, "fffac000.i2c", &twi_clk),
|
|
|
+ /* more tc lookup table for DT entries */
|
|
|
+ CLKDEV_CON_DEV_ID("t0_clk", "fffa0000.timer", &tc0_clk),
|
|
|
+ CLKDEV_CON_DEV_ID("t1_clk", "fffa0000.timer", &tc1_clk),
|
|
|
+ CLKDEV_CON_DEV_ID("t2_clk", "fffa0000.timer", &tc2_clk),
|
|
|
+ CLKDEV_CON_DEV_ID("t0_clk", "fffdc000.timer", &tc3_clk),
|
|
|
+ CLKDEV_CON_DEV_ID("t1_clk", "fffdc000.timer", &tc4_clk),
|
|
|
+ CLKDEV_CON_DEV_ID("t2_clk", "fffdc000.timer", &tc5_clk),
|
|
|
+ CLKDEV_CON_DEV_ID("hclk", "500000.ohci", &ohci_clk),
|
|
|
+ CLKDEV_CON_DEV_ID("mci_clk", "fffa8000.mmc", &mmc_clk),
|
|
|
+ /* fake hclk clock */
|
|
|
+ CLKDEV_CON_DEV_ID("hclk", "at91_ohci", &ohci_clk),
|
|
|
+ CLKDEV_CON_ID("pioA", &pioA_clk),
|
|
|
+ CLKDEV_CON_ID("pioB", &pioB_clk),
|
|
|
+ CLKDEV_CON_ID("pioC", &pioC_clk),
|
|
|
+ CLKDEV_CON_DEV_ID(NULL, "fffff400.gpio", &pioA_clk),
|
|
|
+ CLKDEV_CON_DEV_ID(NULL, "fffff600.gpio", &pioB_clk),
|
|
|
+ CLKDEV_CON_DEV_ID(NULL, "fffff800.gpio", &pioC_clk),
|
|
|
+};
|
|
|
+
|
|
|
+static struct clk_lookup usart_clocks_lookups[] = {
|
|
|
+ CLKDEV_CON_DEV_ID("usart", "atmel_usart.0", &mck),
|
|
|
+ CLKDEV_CON_DEV_ID("usart", "atmel_usart.1", &usart0_clk),
|
|
|
+ CLKDEV_CON_DEV_ID("usart", "atmel_usart.2", &usart1_clk),
|
|
|
+ CLKDEV_CON_DEV_ID("usart", "atmel_usart.3", &usart2_clk),
|
|
|
+ CLKDEV_CON_DEV_ID("usart", "atmel_usart.4", &usart3_clk),
|
|
|
+ CLKDEV_CON_DEV_ID("usart", "atmel_usart.5", &usart4_clk),
|
|
|
+ CLKDEV_CON_DEV_ID("usart", "atmel_usart.6", &usart5_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 at91sam9260_register_clocks(void)
|
|
|
+{
|
|
|
+ int i;
|
|
|
+
|
|
|
+ for (i = 0; i < ARRAY_SIZE(periph_clocks); i++)
|
|
|
+ clk_register(periph_clocks[i]);
|
|
|
+
|
|
|
+ clkdev_add_table(periph_clocks_lookups,
|