|
@@ -540,3 +540,186 @@ static struct pxafb_mode_info vpac270_lcd_modes[] = {
|
|
|
.vsync_len = 1,
|
|
|
|
|
|
.sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
|
|
|
+}
|
|
|
+};
|
|
|
+
|
|
|
+static struct pxafb_mach_info vpac270_lcd_screen = {
|
|
|
+ .modes = vpac270_lcd_modes,
|
|
|
+ .num_modes = ARRAY_SIZE(vpac270_lcd_modes),
|
|
|
+ .lcd_conn = LCD_COLOR_TFT_18BPP,
|
|
|
+};
|
|
|
+
|
|
|
+static void vpac270_lcd_power(int on, struct fb_var_screeninfo *info)
|
|
|
+{
|
|
|
+ gpio_set_value(GPIO81_VPAC270_BKL_ON, on);
|
|
|
+}
|
|
|
+
|
|
|
+static void __init vpac270_lcd_init(void)
|
|
|
+{
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ ret = gpio_request(GPIO81_VPAC270_BKL_ON, "BKL-ON");
|
|
|
+ if (ret) {
|
|
|
+ pr_err("Requesting BKL-ON GPIO failed!\n");
|
|
|
+ goto err;
|
|
|
+ }
|
|
|
+
|
|
|
+ ret = gpio_direction_output(GPIO81_VPAC270_BKL_ON, 1);
|
|
|
+ if (ret) {
|
|
|
+ pr_err("Setting BKL-ON GPIO direction failed!\n");
|
|
|
+ goto err2;
|
|
|
+ }
|
|
|
+
|
|
|
+ vpac270_lcd_screen.pxafb_lcd_power = vpac270_lcd_power;
|
|
|
+ pxa_set_fb_info(NULL, &vpac270_lcd_screen);
|
|
|
+ return;
|
|
|
+
|
|
|
+err2:
|
|
|
+ gpio_free(GPIO81_VPAC270_BKL_ON);
|
|
|
+err:
|
|
|
+ return;
|
|
|
+}
|
|
|
+#else
|
|
|
+static inline void vpac270_lcd_init(void) {}
|
|
|
+#endif
|
|
|
+
|
|
|
+/******************************************************************************
|
|
|
+ * PATA IDE
|
|
|
+ ******************************************************************************/
|
|
|
+#if defined(CONFIG_PATA_PXA) || defined(CONFIG_PATA_PXA_MODULE)
|
|
|
+static struct pata_pxa_pdata vpac270_pata_pdata = {
|
|
|
+ .reg_shift = 1,
|
|
|
+ .dma_dreq = 1,
|
|
|
+ .irq_flags = IRQF_TRIGGER_RISING,
|
|
|
+};
|
|
|
+
|
|
|
+static struct resource vpac270_ide_resources[] = {
|
|
|
+ [0] = { /* I/O Base address */
|
|
|
+ .start = PXA_CS3_PHYS + 0x120,
|
|
|
+ .end = PXA_CS3_PHYS + 0x13f,
|
|
|
+ .flags = IORESOURCE_MEM
|
|
|
+ },
|
|
|
+ [1] = { /* CTL Base address */
|
|
|
+ .start = PXA_CS3_PHYS + 0x15c,
|
|
|
+ .end = PXA_CS3_PHYS + 0x15f,
|
|
|
+ .flags = IORESOURCE_MEM
|
|
|
+ },
|
|
|
+ [2] = { /* DMA Base address */
|
|
|
+ .start = PXA_CS3_PHYS + 0x20,
|
|
|
+ .end = PXA_CS3_PHYS + 0x2f,
|
|
|
+ .flags = IORESOURCE_DMA
|
|
|
+ },
|
|
|
+ [3] = { /* IDE IRQ pin */
|
|
|
+ .start = PXA_GPIO_TO_IRQ(GPIO36_VPAC270_IDE_IRQ),
|
|
|
+ .end = PXA_GPIO_TO_IRQ(GPIO36_VPAC270_IDE_IRQ),
|
|
|
+ .flags = IORESOURCE_IRQ
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+static struct platform_device vpac270_ide_device = {
|
|
|
+ .name = "pata_pxa",
|
|
|
+ .num_resources = ARRAY_SIZE(vpac270_ide_resources),
|
|
|
+ .resource = vpac270_ide_resources,
|
|
|
+ .dev = {
|
|
|
+ .platform_data = &vpac270_pata_pdata,
|
|
|
+ .coherent_dma_mask = 0xffffffff,
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+static void __init vpac270_ide_init(void)
|
|
|
+{
|
|
|
+ platform_device_register(&vpac270_ide_device);
|
|
|
+}
|
|
|
+#else
|
|
|
+static inline void vpac270_ide_init(void) {}
|
|
|
+#endif
|
|
|
+
|
|
|
+/******************************************************************************
|
|
|
+ * Core power regulator
|
|
|
+ ******************************************************************************/
|
|
|
+#if defined(CONFIG_REGULATOR_MAX1586) || \
|
|
|
+ defined(CONFIG_REGULATOR_MAX1586_MODULE)
|
|
|
+static struct regulator_consumer_supply vpac270_max1587a_consumers[] = {
|
|
|
+ REGULATOR_SUPPLY("vcc_core", NULL),
|
|
|
+};
|
|
|
+
|
|
|
+static struct regulator_init_data vpac270_max1587a_v3_info = {
|
|
|
+ .constraints = {
|
|
|
+ .name = "vcc_core range",
|
|
|
+ .min_uV = 900000,
|
|
|
+ .max_uV = 1705000,
|
|
|
+ .always_on = 1,
|
|
|
+ .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE,
|
|
|
+ },
|
|
|
+ .consumer_supplies = vpac270_max1587a_consumers,
|
|
|
+ .num_consumer_supplies = ARRAY_SIZE(vpac270_max1587a_consumers),
|
|
|
+};
|
|
|
+
|
|
|
+static struct max1586_subdev_data vpac270_max1587a_subdevs[] = {
|
|
|
+ {
|
|
|
+ .name = "vcc_core",
|
|
|
+ .id = MAX1586_V3,
|
|
|
+ .platform_data = &vpac270_max1587a_v3_info,
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+static struct max1586_platform_data vpac270_max1587a_info = {
|
|
|
+ .subdevs = vpac270_max1587a_subdevs,
|
|
|
+ .num_subdevs = ARRAY_SIZE(vpac270_max1587a_subdevs),
|
|
|
+ .v3_gain = MAX1586_GAIN_R24_3k32, /* 730..1550 mV */
|
|
|
+};
|
|
|
+
|
|
|
+static struct i2c_board_info __initdata vpac270_pi2c_board_info[] = {
|
|
|
+ {
|
|
|
+ I2C_BOARD_INFO("max1586", 0x14),
|
|
|
+ .platform_data = &vpac270_max1587a_info,
|
|
|
+ },
|
|
|
+};
|
|
|
+
|
|
|
+static void __init vpac270_pmic_init(void)
|
|
|
+{
|
|
|
+ i2c_register_board_info(1, ARRAY_AND_SIZE(vpac270_pi2c_board_info));
|
|
|
+}
|
|
|
+#else
|
|
|
+static inline void vpac270_pmic_init(void) {}
|
|
|
+#endif
|
|
|
+
|
|
|
+
|
|
|
+/******************************************************************************
|
|
|
+ * Machine init
|
|
|
+ ******************************************************************************/
|
|
|
+static void __init vpac270_init(void)
|
|
|
+{
|
|
|
+ pxa2xx_mfp_config(ARRAY_AND_SIZE(vpac270_pin_config));
|
|
|
+
|
|
|
+ pxa_set_ffuart_info(NULL);
|
|
|
+ pxa_set_btuart_info(NULL);
|
|
|
+ pxa_set_stuart_info(NULL);
|
|
|
+ pxa_set_i2c_info(NULL);
|
|
|
+ pxa27x_set_i2c_power_info(NULL);
|
|
|
+
|
|
|
+ vpac270_pmic_init();
|
|
|
+ vpac270_lcd_init();
|
|
|
+ vpac270_mmc_init();
|
|
|
+ vpac270_nor_init();
|
|
|
+ vpac270_onenand_init();
|
|
|
+ vpac270_leds_init();
|
|
|
+ vpac270_keys_init();
|
|
|
+ vpac270_uhc_init();
|
|
|
+ vpac270_udc_init();
|
|
|
+ vpac270_eth_init();
|
|
|
+ vpac270_ts_init();
|
|
|
+ vpac270_rtc_init();
|
|
|
+ vpac270_ide_init();
|
|
|
+}
|
|
|
+
|
|
|
+MACHINE_START(VPAC270, "Voipac PXA270")
|
|
|
+ .atag_offset = 0x100,
|
|
|
+ .map_io = pxa27x_map_io,
|
|
|
+ .nr_irqs = PXA_NR_IRQS,
|
|
|
+ .init_irq = pxa27x_init_irq,
|
|
|
+ .handle_irq = pxa27x_handle_irq,
|
|
|
+ .timer = &pxa_timer,
|
|
|
+ .init_machine = vpac270_init,
|
|
|
+ .restart = pxa_restart,
|
|
|
+MACHINE_END
|