|
@@ -372,3 +372,128 @@ static void __init map_sa1100_gpio_regs( void )
|
|
|
*pmd = __pmd(phys | prot);
|
|
|
flush_pmd_entry(pmd);
|
|
|
}
|
|
|
+
|
|
|
+/*
|
|
|
+ * Read System Configuration "Register"
|
|
|
+ * (taken from "Intel StrongARM SA-1110 Microprocessor Development Board
|
|
|
+ * User's Guide", section 4.4.1)
|
|
|
+ *
|
|
|
+ * This same scan is performed in arch/arm/boot/compressed/head-sa1100.S
|
|
|
+ * to set up the serial port for decompression status messages. We
|
|
|
+ * repeat it here because the kernel may not be loaded as a zImage, and
|
|
|
+ * also because it's a hassle to communicate the SCR value to the kernel
|
|
|
+ * from the decompressor.
|
|
|
+ *
|
|
|
+ * Note that IRQs are guaranteed to be disabled.
|
|
|
+ */
|
|
|
+static void __init get_assabet_scr(void)
|
|
|
+{
|
|
|
+ unsigned long uninitialized_var(scr), i;
|
|
|
+
|
|
|
+ GPDR |= 0x3fc; /* Configure GPIO 9:2 as outputs */
|
|
|
+ GPSR = 0x3fc; /* Write 0xFF to GPIO 9:2 */
|
|
|
+ GPDR &= ~(0x3fc); /* Configure GPIO 9:2 as inputs */
|
|
|
+ for(i = 100; i--; ) /* Read GPIO 9:2 */
|
|
|
+ scr = GPLR;
|
|
|
+ GPDR |= 0x3fc; /* restore correct pin direction */
|
|
|
+ scr &= 0x3fc; /* save as system configuration byte. */
|
|
|
+ SCR_value = scr;
|
|
|
+}
|
|
|
+
|
|
|
+static void __init
|
|
|
+fixup_assabet(struct tag *tags, char **cmdline, struct meminfo *mi)
|
|
|
+{
|
|
|
+ /* This must be done before any call to machine_has_neponset() */
|
|
|
+ map_sa1100_gpio_regs();
|
|
|
+ get_assabet_scr();
|
|
|
+
|
|
|
+ if (machine_has_neponset())
|
|
|
+ printk("Neponset expansion board detected\n");
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+static void assabet_uart_pm(struct uart_port *port, u_int state, u_int oldstate)
|
|
|
+{
|
|
|
+ if (port->mapbase == _Ser1UTCR0) {
|
|
|
+ if (state)
|
|
|
+ ASSABET_BCR_clear(ASSABET_BCR_RS232EN |
|
|
|
+ ASSABET_BCR_COM_RTS |
|
|
|
+ ASSABET_BCR_COM_DTR);
|
|
|
+ else
|
|
|
+ ASSABET_BCR_set(ASSABET_BCR_RS232EN |
|
|
|
+ ASSABET_BCR_COM_RTS |
|
|
|
+ ASSABET_BCR_COM_DTR);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/*
|
|
|
+ * Assabet uses COM_RTS and COM_DTR for both UART1 (com port)
|
|
|
+ * and UART3 (radio module). We only handle them for UART1 here.
|
|
|
+ */
|
|
|
+static void assabet_set_mctrl(struct uart_port *port, u_int mctrl)
|
|
|
+{
|
|
|
+ if (port->mapbase == _Ser1UTCR0) {
|
|
|
+ u_int set = 0, clear = 0;
|
|
|
+
|
|
|
+ if (mctrl & TIOCM_RTS)
|
|
|
+ clear |= ASSABET_BCR_COM_RTS;
|
|
|
+ else
|
|
|
+ set |= ASSABET_BCR_COM_RTS;
|
|
|
+
|
|
|
+ if (mctrl & TIOCM_DTR)
|
|
|
+ clear |= ASSABET_BCR_COM_DTR;
|
|
|
+ else
|
|
|
+ set |= ASSABET_BCR_COM_DTR;
|
|
|
+
|
|
|
+ ASSABET_BCR_clear(clear);
|
|
|
+ ASSABET_BCR_set(set);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+static u_int assabet_get_mctrl(struct uart_port *port)
|
|
|
+{
|
|
|
+ u_int ret = 0;
|
|
|
+ u_int bsr = ASSABET_BSR;
|
|
|
+
|
|
|
+ /* need 2 reads to read current value */
|
|
|
+ bsr = ASSABET_BSR;
|
|
|
+
|
|
|
+ if (port->mapbase == _Ser1UTCR0) {
|
|
|
+ if (bsr & ASSABET_BSR_COM_DCD)
|
|
|
+ ret |= TIOCM_CD;
|
|
|
+ if (bsr & ASSABET_BSR_COM_CTS)
|
|
|
+ ret |= TIOCM_CTS;
|
|
|
+ if (bsr & ASSABET_BSR_COM_DSR)
|
|
|
+ ret |= TIOCM_DSR;
|
|
|
+ } else if (port->mapbase == _Ser3UTCR0) {
|
|
|
+ if (bsr & ASSABET_BSR_RAD_DCD)
|
|
|
+ ret |= TIOCM_CD;
|
|
|
+ if (bsr & ASSABET_BSR_RAD_CTS)
|
|
|
+ ret |= TIOCM_CTS;
|
|
|
+ if (bsr & ASSABET_BSR_RAD_DSR)
|
|
|
+ ret |= TIOCM_DSR;
|
|
|
+ if (bsr & ASSABET_BSR_RAD_RI)
|
|
|
+ ret |= TIOCM_RI;
|
|
|
+ } else {
|
|
|
+ ret = TIOCM_CD | TIOCM_CTS | TIOCM_DSR;
|
|
|
+ }
|
|
|
+
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
+static struct sa1100_port_fns assabet_port_fns __initdata = {
|
|
|
+ .set_mctrl = assabet_set_mctrl,
|
|
|
+ .get_mctrl = assabet_get_mctrl,
|
|
|
+ .pm = assabet_uart_pm,
|
|
|
+};
|
|
|
+
|
|
|
+static struct map_desc assabet_io_desc[] __initdata = {
|
|
|
+ { /* Board Control Register */
|
|
|
+ .virtual = 0xf1000000,
|
|
|
+ .pfn = __phys_to_pfn(0x12000000),
|
|
|
+ .length = 0x00100000,
|
|
|
+ .type = MT_DEVICE
|
|
|
+ }, { /* MQ200 */
|
|
|
+ .virtual = 0xf2800000,
|
|
|
+ .pfn = __phys_to_pfn(0x4b800000),
|
|
|
+ .length = 0x00800000,
|