|
@@ -259,3 +259,133 @@ static void __init at91rm9200_register_clocks(void)
|
|
int i;
|
|
int i;
|
|
|
|
|
|
for (i = 0; i < ARRAY_SIZE(periph_clocks); i++)
|
|
for (i = 0; i < ARRAY_SIZE(periph_clocks); i++)
|
|
|
|
+ clk_register(periph_clocks[i]);
|
|
|
|
+
|
|
|
|
+ clkdev_add_table(periph_clocks_lookups,
|
|
|
|
+ ARRAY_SIZE(periph_clocks_lookups));
|
|
|
|
+ clkdev_add_table(usart_clocks_lookups,
|
|
|
|
+ ARRAY_SIZE(usart_clocks_lookups));
|
|
|
|
+
|
|
|
|
+ clk_register(&pck0);
|
|
|
|
+ clk_register(&pck1);
|
|
|
|
+ clk_register(&pck2);
|
|
|
|
+ clk_register(&pck3);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/* --------------------------------------------------------------------
|
|
|
|
+ * GPIO
|
|
|
|
+ * -------------------------------------------------------------------- */
|
|
|
|
+
|
|
|
|
+static struct at91_gpio_bank at91rm9200_gpio[] __initdata = {
|
|
|
|
+ {
|
|
|
|
+ .id = AT91RM9200_ID_PIOA,
|
|
|
|
+ .regbase = AT91RM9200_BASE_PIOA,
|
|
|
|
+ }, {
|
|
|
|
+ .id = AT91RM9200_ID_PIOB,
|
|
|
|
+ .regbase = AT91RM9200_BASE_PIOB,
|
|
|
|
+ }, {
|
|
|
|
+ .id = AT91RM9200_ID_PIOC,
|
|
|
|
+ .regbase = AT91RM9200_BASE_PIOC,
|
|
|
|
+ }, {
|
|
|
|
+ .id = AT91RM9200_ID_PIOD,
|
|
|
|
+ .regbase = AT91RM9200_BASE_PIOD,
|
|
|
|
+ }
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+static void at91rm9200_idle(void)
|
|
|
|
+{
|
|
|
|
+ /*
|
|
|
|
+ * Disable the processor clock. The processor will be automatically
|
|
|
|
+ * re-enabled by an interrupt or by a reset.
|
|
|
|
+ */
|
|
|
|
+ at91_pmc_write(AT91_PMC_SCDR, AT91_PMC_PCK);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static void at91rm9200_restart(char mode, const char *cmd)
|
|
|
|
+{
|
|
|
|
+ /*
|
|
|
|
+ * Perform a hardware reset with the use of the Watchdog timer.
|
|
|
|
+ */
|
|
|
|
+ at91_st_write(AT91_ST_WDMR, AT91_ST_RSTEN | AT91_ST_EXTEN | 1);
|
|
|
|
+ at91_st_write(AT91_ST_CR, AT91_ST_WDRST);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/* --------------------------------------------------------------------
|
|
|
|
+ * AT91RM9200 processor initialization
|
|
|
|
+ * -------------------------------------------------------------------- */
|
|
|
|
+static void __init at91rm9200_map_io(void)
|
|
|
|
+{
|
|
|
|
+ /* Map peripherals */
|
|
|
|
+ at91_init_sram(0, AT91RM9200_SRAM_BASE, AT91RM9200_SRAM_SIZE);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static void __init at91rm9200_ioremap_registers(void)
|
|
|
|
+{
|
|
|
|
+ at91rm9200_ioremap_st(AT91RM9200_BASE_ST);
|
|
|
|
+ at91_ioremap_ramc(0, AT91RM9200_BASE_MC, 256);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static void __init at91rm9200_initialize(void)
|
|
|
|
+{
|
|
|
|
+ arm_pm_idle = at91rm9200_idle;
|
|
|
|
+ arm_pm_restart = at91rm9200_restart;
|
|
|
|
+ at91_extern_irq = (1 << AT91RM9200_ID_IRQ0) | (1 << AT91RM9200_ID_IRQ1)
|
|
|
|
+ | (1 << AT91RM9200_ID_IRQ2) | (1 << AT91RM9200_ID_IRQ3)
|
|
|
|
+ | (1 << AT91RM9200_ID_IRQ4) | (1 << AT91RM9200_ID_IRQ5)
|
|
|
|
+ | (1 << AT91RM9200_ID_IRQ6);
|
|
|
|
+
|
|
|
|
+ /* Initialize GPIO subsystem */
|
|
|
|
+ at91_gpio_init(at91rm9200_gpio,
|
|
|
|
+ cpu_is_at91rm9200_bga() ? AT91RM9200_BGA : AT91RM9200_PQFP);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+/* --------------------------------------------------------------------
|
|
|
|
+ * Interrupt initialization
|
|
|
|
+ * -------------------------------------------------------------------- */
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * The default interrupt priority levels (0 = lowest, 7 = highest).
|
|
|
|
+ */
|
|
|
|
+static unsigned int at91rm9200_default_irq_priority[NR_AIC_IRQS] __initdata = {
|
|
|
|
+ 7, /* Advanced Interrupt Controller (FIQ) */
|
|
|
|
+ 7, /* System Peripherals */
|
|
|
|
+ 1, /* Parallel IO Controller A */
|
|
|
|
+ 1, /* Parallel IO Controller B */
|
|
|
|
+ 1, /* Parallel IO Controller C */
|
|
|
|
+ 1, /* Parallel IO Controller D */
|
|
|
|
+ 5, /* USART 0 */
|
|
|
|
+ 5, /* USART 1 */
|
|
|
|
+ 5, /* USART 2 */
|
|
|
|
+ 5, /* USART 3 */
|
|
|
|
+ 0, /* Multimedia Card Interface */
|
|
|
|
+ 2, /* USB Device Port */
|
|
|
|
+ 6, /* Two-Wire Interface */
|
|
|
|
+ 5, /* Serial Peripheral Interface */
|
|
|
|
+ 4, /* Serial Synchronous Controller 0 */
|
|
|
|
+ 4, /* Serial Synchronous Controller 1 */
|
|
|
|
+ 4, /* Serial Synchronous Controller 2 */
|
|
|
|
+ 0, /* Timer Counter 0 */
|
|
|
|
+ 0, /* Timer Counter 1 */
|
|
|
|
+ 0, /* Timer Counter 2 */
|
|
|
|
+ 0, /* Timer Counter 3 */
|
|
|
|
+ 0, /* Timer Counter 4 */
|
|
|
|
+ 0, /* Timer Counter 5 */
|
|
|
|
+ 2, /* USB Host port */
|
|
|
|
+ 3, /* Ethernet MAC */
|
|
|
|
+ 0, /* Advanced Interrupt Controller (IRQ0) */
|
|
|
|
+ 0, /* Advanced Interrupt Controller (IRQ1) */
|
|
|
|
+ 0, /* Advanced Interrupt Controller (IRQ2) */
|
|
|
|
+ 0, /* Advanced Interrupt Controller (IRQ3) */
|
|
|
|
+ 0, /* Advanced Interrupt Controller (IRQ4) */
|
|
|
|
+ 0, /* Advanced Interrupt Controller (IRQ5) */
|
|
|
|
+ 0 /* Advanced Interrupt Controller (IRQ6) */
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+AT91_SOC_START(rm9200)
|
|
|
|
+ .map_io = at91rm9200_map_io,
|
|
|
|
+ .default_irq_priority = at91rm9200_default_irq_priority,
|
|
|
|
+ .ioremap_registers = at91rm9200_ioremap_registers,
|
|
|
|
+ .register_clocks = at91rm9200_register_clocks,
|
|
|
|
+ .init = at91rm9200_initialize,
|
|
|
|
+AT91_SOC_END
|