|
@@ -124,3 +124,177 @@ static struct resource innovator_kp_resources[] = {
|
|
|
.start = INT_KEYBOARD,
|
|
|
.end = INT_KEYBOARD,
|
|
|
.flags = IORESOURCE_IRQ,
|
|
|
+ },
|
|
|
+};
|
|
|
+
|
|
|
+static const struct matrix_keymap_data innovator_keymap_data = {
|
|
|
+ .keymap = innovator_keymap,
|
|
|
+ .keymap_size = ARRAY_SIZE(innovator_keymap),
|
|
|
+};
|
|
|
+
|
|
|
+static struct omap_kp_platform_data innovator_kp_data = {
|
|
|
+ .rows = 8,
|
|
|
+ .cols = 8,
|
|
|
+ .keymap_data = &innovator_keymap_data,
|
|
|
+ .delay = 4,
|
|
|
+};
|
|
|
+
|
|
|
+static struct platform_device innovator_kp_device = {
|
|
|
+ .name = "omap-keypad",
|
|
|
+ .id = -1,
|
|
|
+ .dev = {
|
|
|
+ .platform_data = &innovator_kp_data,
|
|
|
+ },
|
|
|
+ .num_resources = ARRAY_SIZE(innovator_kp_resources),
|
|
|
+ .resource = innovator_kp_resources,
|
|
|
+};
|
|
|
+
|
|
|
+static struct smc91x_platdata innovator_smc91x_info = {
|
|
|
+ .flags = SMC91X_USE_16BIT | SMC91X_NOWAIT,
|
|
|
+ .leda = RPC_LED_100_10,
|
|
|
+ .ledb = RPC_LED_TX_RX,
|
|
|
+};
|
|
|
+
|
|
|
+#ifdef CONFIG_ARCH_OMAP15XX
|
|
|
+
|
|
|
+#include <linux/spi/spi.h>
|
|
|
+#include <linux/spi/ads7846.h>
|
|
|
+
|
|
|
+
|
|
|
+/* Only FPGA needs to be mapped here. All others are done with ioremap */
|
|
|
+static struct map_desc innovator1510_io_desc[] __initdata = {
|
|
|
+ {
|
|
|
+ .virtual = OMAP1510_FPGA_BASE,
|
|
|
+ .pfn = __phys_to_pfn(OMAP1510_FPGA_START),
|
|
|
+ .length = OMAP1510_FPGA_SIZE,
|
|
|
+ .type = MT_DEVICE
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+static struct resource innovator1510_smc91x_resources[] = {
|
|
|
+ [0] = {
|
|
|
+ .start = OMAP1510_FPGA_ETHR_START, /* Physical */
|
|
|
+ .end = OMAP1510_FPGA_ETHR_START + 0xf,
|
|
|
+ .flags = IORESOURCE_MEM,
|
|
|
+ },
|
|
|
+ [1] = {
|
|
|
+ .start = OMAP1510_INT_ETHER,
|
|
|
+ .end = OMAP1510_INT_ETHER,
|
|
|
+ .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE,
|
|
|
+ },
|
|
|
+};
|
|
|
+
|
|
|
+static struct platform_device innovator1510_smc91x_device = {
|
|
|
+ .name = "smc91x",
|
|
|
+ .id = 0,
|
|
|
+ .dev = {
|
|
|
+ .platform_data = &innovator_smc91x_info,
|
|
|
+ },
|
|
|
+ .num_resources = ARRAY_SIZE(innovator1510_smc91x_resources),
|
|
|
+ .resource = innovator1510_smc91x_resources,
|
|
|
+};
|
|
|
+
|
|
|
+static struct platform_device innovator1510_lcd_device = {
|
|
|
+ .name = "lcd_inn1510",
|
|
|
+ .id = -1,
|
|
|
+};
|
|
|
+
|
|
|
+static struct platform_device innovator1510_spi_device = {
|
|
|
+ .name = "spi_inn1510",
|
|
|
+ .id = -1,
|
|
|
+};
|
|
|
+
|
|
|
+static struct platform_device *innovator1510_devices[] __initdata = {
|
|
|
+ &innovator_flash_device,
|
|
|
+ &innovator1510_smc91x_device,
|
|
|
+ &innovator_kp_device,
|
|
|
+ &innovator1510_lcd_device,
|
|
|
+ &innovator1510_spi_device,
|
|
|
+};
|
|
|
+
|
|
|
+static int innovator_get_pendown_state(void)
|
|
|
+{
|
|
|
+ return !(__raw_readb(OMAP1510_FPGA_TOUCHSCREEN) & (1 << 5));
|
|
|
+}
|
|
|
+
|
|
|
+static const struct ads7846_platform_data innovator1510_ts_info = {
|
|
|
+ .model = 7846,
|
|
|
+ .vref_delay_usecs = 100, /* internal, no capacitor */
|
|
|
+ .x_plate_ohms = 419,
|
|
|
+ .y_plate_ohms = 486,
|
|
|
+ .get_pendown_state = innovator_get_pendown_state,
|
|
|
+};
|
|
|
+
|
|
|
+static struct spi_board_info __initdata innovator1510_boardinfo[] = { {
|
|
|
+ /* FPGA (bus "10") CS0 has an ads7846e */
|
|
|
+ .modalias = "ads7846",
|
|
|
+ .platform_data = &innovator1510_ts_info,
|
|
|
+ .irq = OMAP1510_INT_FPGA_TS,
|
|
|
+ .max_speed_hz = 120000 /* max sample rate at 3V */
|
|
|
+ * 26 /* command + data + overhead */,
|
|
|
+ .bus_num = 10,
|
|
|
+ .chip_select = 0,
|
|
|
+} };
|
|
|
+
|
|
|
+#endif /* CONFIG_ARCH_OMAP15XX */
|
|
|
+
|
|
|
+#ifdef CONFIG_ARCH_OMAP16XX
|
|
|
+
|
|
|
+static struct resource innovator1610_smc91x_resources[] = {
|
|
|
+ [0] = {
|
|
|
+ .start = INNOVATOR1610_ETHR_START, /* Physical */
|
|
|
+ .end = INNOVATOR1610_ETHR_START + 0xf,
|
|
|
+ .flags = IORESOURCE_MEM,
|
|
|
+ },
|
|
|
+ [1] = {
|
|
|
+ .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_LOWEDGE,
|
|
|
+ },
|
|
|
+};
|
|
|
+
|
|
|
+static struct platform_device innovator1610_smc91x_device = {
|
|
|
+ .name = "smc91x",
|
|
|
+ .id = 0,
|
|
|
+ .dev = {
|
|
|
+ .platform_data = &innovator_smc91x_info,
|
|
|
+ },
|
|
|
+ .num_resources = ARRAY_SIZE(innovator1610_smc91x_resources),
|
|
|
+ .resource = innovator1610_smc91x_resources,
|
|
|
+};
|
|
|
+
|
|
|
+static struct platform_device innovator1610_lcd_device = {
|
|
|
+ .name = "inn1610_lcd",
|
|
|
+ .id = -1,
|
|
|
+};
|
|
|
+
|
|
|
+static struct platform_device *innovator1610_devices[] __initdata = {
|
|
|
+ &innovator_flash_device,
|
|
|
+ &innovator1610_smc91x_device,
|
|
|
+ &innovator_kp_device,
|
|
|
+ &innovator1610_lcd_device,
|
|
|
+};
|
|
|
+
|
|
|
+#endif /* CONFIG_ARCH_OMAP16XX */
|
|
|
+
|
|
|
+static void __init innovator_init_smc91x(void)
|
|
|
+{
|
|
|
+ if (cpu_is_omap1510()) {
|
|
|
+ __raw_writeb(__raw_readb(OMAP1510_FPGA_RST) & ~1,
|
|
|
+ OMAP1510_FPGA_RST);
|
|
|
+ udelay(750);
|
|
|
+ } else {
|
|
|
+ if (gpio_request(0, "SMC91x irq") < 0) {
|
|
|
+ printk("Error requesting gpio 0 for smc91x irq\n");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+#ifdef CONFIG_ARCH_OMAP15XX
|
|
|
+static struct omap_usb_config innovator1510_usb_config __initdata = {
|
|
|
+ /* for bundled non-standard host and peripheral cables */
|
|
|
+ .hmc_mode = 4,
|
|
|
+
|
|
|
+ .register_host = 1,
|
|
|
+ .pins[1] = 6,
|
|
|
+ .pins[2] = 6, /* Conflicts with UART2 */
|
|
|
+
|