|
@@ -109,3 +109,143 @@ unsigned int sa11x0_getspeed(unsigned int cpu)
|
|
|
if (cpu)
|
|
|
return 0;
|
|
|
return cclk_frequency_100khz[PPCR & 0xf] * 100;
|
|
|
+}
|
|
|
+
|
|
|
+/*
|
|
|
+ * Default power-off for SA1100
|
|
|
+ */
|
|
|
+static void sa1100_power_off(void)
|
|
|
+{
|
|
|
+ mdelay(100);
|
|
|
+ local_irq_disable();
|
|
|
+ /* disable internal oscillator, float CS lines */
|
|
|
+ PCFR = (PCFR_OPDE | PCFR_FP | PCFR_FS);
|
|
|
+ /* enable wake-up on GPIO0 (Assabet...) */
|
|
|
+ PWER = GFER = GRER = 1;
|
|
|
+ /*
|
|
|
+ * set scratchpad to zero, just in case it is used as a
|
|
|
+ * restart address by the bootloader.
|
|
|
+ */
|
|
|
+ PSPR = 0;
|
|
|
+ /* enter sleep mode */
|
|
|
+ PMCR = PMCR_SF;
|
|
|
+}
|
|
|
+
|
|
|
+void sa11x0_restart(char mode, const char *cmd)
|
|
|
+{
|
|
|
+ if (mode == 's') {
|
|
|
+ /* Jump into ROM at address 0 */
|
|
|
+ soft_restart(0);
|
|
|
+ } else {
|
|
|
+ /* Use on-chip reset capability */
|
|
|
+ RSRR = RSRR_SWR;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+static void sa11x0_register_device(struct platform_device *dev, void *data)
|
|
|
+{
|
|
|
+ int err;
|
|
|
+ dev->dev.platform_data = data;
|
|
|
+ err = platform_device_register(dev);
|
|
|
+ if (err)
|
|
|
+ printk(KERN_ERR "Unable to register device %s: %d\n",
|
|
|
+ dev->name, err);
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+static struct resource sa11x0udc_resources[] = {
|
|
|
+ [0] = DEFINE_RES_MEM(__PREG(Ser0UDCCR), SZ_64K),
|
|
|
+ [1] = DEFINE_RES_IRQ(IRQ_Ser0UDC),
|
|
|
+};
|
|
|
+
|
|
|
+static u64 sa11x0udc_dma_mask = 0xffffffffUL;
|
|
|
+
|
|
|
+static struct platform_device sa11x0udc_device = {
|
|
|
+ .name = "sa11x0-udc",
|
|
|
+ .id = -1,
|
|
|
+ .dev = {
|
|
|
+ .dma_mask = &sa11x0udc_dma_mask,
|
|
|
+ .coherent_dma_mask = 0xffffffff,
|
|
|
+ },
|
|
|
+ .num_resources = ARRAY_SIZE(sa11x0udc_resources),
|
|
|
+ .resource = sa11x0udc_resources,
|
|
|
+};
|
|
|
+
|
|
|
+static struct resource sa11x0uart1_resources[] = {
|
|
|
+ [0] = DEFINE_RES_MEM(__PREG(Ser1UTCR0), SZ_64K),
|
|
|
+ [1] = DEFINE_RES_IRQ(IRQ_Ser1UART),
|
|
|
+};
|
|
|
+
|
|
|
+static struct platform_device sa11x0uart1_device = {
|
|
|
+ .name = "sa11x0-uart",
|
|
|
+ .id = 1,
|
|
|
+ .num_resources = ARRAY_SIZE(sa11x0uart1_resources),
|
|
|
+ .resource = sa11x0uart1_resources,
|
|
|
+};
|
|
|
+
|
|
|
+static struct resource sa11x0uart3_resources[] = {
|
|
|
+ [0] = DEFINE_RES_MEM(__PREG(Ser3UTCR0), SZ_64K),
|
|
|
+ [1] = DEFINE_RES_IRQ(IRQ_Ser3UART),
|
|
|
+};
|
|
|
+
|
|
|
+static struct platform_device sa11x0uart3_device = {
|
|
|
+ .name = "sa11x0-uart",
|
|
|
+ .id = 3,
|
|
|
+ .num_resources = ARRAY_SIZE(sa11x0uart3_resources),
|
|
|
+ .resource = sa11x0uart3_resources,
|
|
|
+};
|
|
|
+
|
|
|
+static struct resource sa11x0mcp_resources[] = {
|
|
|
+ [0] = DEFINE_RES_MEM(__PREG(Ser4MCCR0), SZ_64K),
|
|
|
+ [1] = DEFINE_RES_MEM(__PREG(Ser4MCCR1), 4),
|
|
|
+ [2] = DEFINE_RES_IRQ(IRQ_Ser4MCP),
|
|
|
+};
|
|
|
+
|
|
|
+static u64 sa11x0mcp_dma_mask = 0xffffffffUL;
|
|
|
+
|
|
|
+static struct platform_device sa11x0mcp_device = {
|
|
|
+ .name = "sa11x0-mcp",
|
|
|
+ .id = -1,
|
|
|
+ .dev = {
|
|
|
+ .dma_mask = &sa11x0mcp_dma_mask,
|
|
|
+ .coherent_dma_mask = 0xffffffff,
|
|
|
+ },
|
|
|
+ .num_resources = ARRAY_SIZE(sa11x0mcp_resources),
|
|
|
+ .resource = sa11x0mcp_resources,
|
|
|
+};
|
|
|
+
|
|
|
+void __init sa11x0_ppc_configure_mcp(void)
|
|
|
+{
|
|
|
+ /* Setup the PPC unit for the MCP */
|
|
|
+ PPDR &= ~PPC_RXD4;
|
|
|
+ PPDR |= PPC_TXD4 | PPC_SCLK | PPC_SFRM;
|
|
|
+ PSDR |= PPC_RXD4;
|
|
|
+ PSDR &= ~(PPC_TXD4 | PPC_SCLK | PPC_SFRM);
|
|
|
+ PPSR &= ~(PPC_TXD4 | PPC_SCLK | PPC_SFRM);
|
|
|
+}
|
|
|
+
|
|
|
+void sa11x0_register_mcp(struct mcp_plat_data *data)
|
|
|
+{
|
|
|
+ sa11x0_register_device(&sa11x0mcp_device, data);
|
|
|
+}
|
|
|
+
|
|
|
+static struct resource sa11x0ssp_resources[] = {
|
|
|
+ [0] = DEFINE_RES_MEM(0x80070000, SZ_64K),
|
|
|
+ [1] = DEFINE_RES_IRQ(IRQ_Ser4SSP),
|
|
|
+};
|
|
|
+
|
|
|
+static u64 sa11x0ssp_dma_mask = 0xffffffffUL;
|
|
|
+
|
|
|
+static struct platform_device sa11x0ssp_device = {
|
|
|
+ .name = "sa11x0-ssp",
|
|
|
+ .id = -1,
|
|
|
+ .dev = {
|
|
|
+ .dma_mask = &sa11x0ssp_dma_mask,
|
|
|
+ .coherent_dma_mask = 0xffffffff,
|
|
|
+ },
|
|
|
+ .num_resources = ARRAY_SIZE(sa11x0ssp_resources),
|
|
|
+ .resource = sa11x0ssp_resources,
|
|
|
+};
|
|
|
+
|
|
|
+static struct resource sa11x0fb_resources[] = {
|
|
|
+ [0] = DEFINE_RES_MEM(0xb0100000, SZ_64K),
|