|
@@ -493,3 +493,181 @@ static struct twl4030_platform_data igep_twldata = {
|
|
|
.vio = &igep_vio,
|
|
|
};
|
|
|
|
|
|
+static struct i2c_board_info __initdata igep2_i2c3_boardinfo[] = {
|
|
|
+ {
|
|
|
+ I2C_BOARD_INFO("eeprom", 0x50),
|
|
|
+ },
|
|
|
+};
|
|
|
+
|
|
|
+static void __init igep_i2c_init(void)
|
|
|
+{
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ omap3_pmic_get_config(&igep_twldata, TWL_COMMON_PDATA_USB,
|
|
|
+ TWL_COMMON_REGULATOR_VPLL2);
|
|
|
+ igep_twldata.vpll2->constraints.apply_uV = true;
|
|
|
+ igep_twldata.vpll2->constraints.name = "VDVI";
|
|
|
+
|
|
|
+ if (machine_is_igep0020()) {
|
|
|
+ /*
|
|
|
+ * Bus 3 is attached to the DVI port where devices like the
|
|
|
+ * pico DLP projector don't work reliably with 400kHz
|
|
|
+ */
|
|
|
+ ret = omap_register_i2c_bus(3, 100, igep2_i2c3_boardinfo,
|
|
|
+ ARRAY_SIZE(igep2_i2c3_boardinfo));
|
|
|
+ if (ret)
|
|
|
+ pr_warning("IGEP2: Could not register I2C3 bus (%d)\n", ret);
|
|
|
+
|
|
|
+ igep_twldata.keypad = &igep2_keypad_pdata;
|
|
|
+ /* Get common pmic data */
|
|
|
+ omap3_pmic_get_config(&igep_twldata, TWL_COMMON_PDATA_AUDIO, 0);
|
|
|
+ }
|
|
|
+
|
|
|
+ omap3_pmic_init("twl4030", &igep_twldata);
|
|
|
+}
|
|
|
+
|
|
|
+static const struct usbhs_omap_board_data igep2_usbhs_bdata __initconst = {
|
|
|
+ .port_mode[0] = OMAP_EHCI_PORT_MODE_PHY,
|
|
|
+ .port_mode[1] = OMAP_USBHS_PORT_MODE_UNUSED,
|
|
|
+ .port_mode[2] = OMAP_USBHS_PORT_MODE_UNUSED,
|
|
|
+
|
|
|
+ .phy_reset = true,
|
|
|
+ .reset_gpio_port[0] = IGEP2_GPIO_USBH_NRESET,
|
|
|
+ .reset_gpio_port[1] = -EINVAL,
|
|
|
+ .reset_gpio_port[2] = -EINVAL,
|
|
|
+};
|
|
|
+
|
|
|
+static const struct usbhs_omap_board_data igep3_usbhs_bdata __initconst = {
|
|
|
+ .port_mode[0] = OMAP_USBHS_PORT_MODE_UNUSED,
|
|
|
+ .port_mode[1] = OMAP_EHCI_PORT_MODE_PHY,
|
|
|
+ .port_mode[2] = OMAP_USBHS_PORT_MODE_UNUSED,
|
|
|
+
|
|
|
+ .phy_reset = true,
|
|
|
+ .reset_gpio_port[0] = -EINVAL,
|
|
|
+ .reset_gpio_port[1] = IGEP3_GPIO_USBH_NRESET,
|
|
|
+ .reset_gpio_port[2] = -EINVAL,
|
|
|
+};
|
|
|
+
|
|
|
+#ifdef CONFIG_OMAP_MUX
|
|
|
+static struct omap_board_mux board_mux[] __initdata = {
|
|
|
+ /* SMSC9221 LAN Controller ETH IRQ (GPIO_176) */
|
|
|
+ OMAP3_MUX(MCSPI1_CS2, OMAP_MUX_MODE4 | OMAP_PIN_INPUT),
|
|
|
+ { .reg_offset = OMAP_MUX_TERMINATOR },
|
|
|
+};
|
|
|
+#endif
|
|
|
+
|
|
|
+#if defined(CONFIG_LIBERTAS_SDIO) || defined(CONFIG_LIBERTAS_SDIO_MODULE)
|
|
|
+static struct gpio igep_wlan_bt_gpios[] __initdata = {
|
|
|
+ { -EINVAL, GPIOF_OUT_INIT_HIGH, "GPIO_WIFI_NPD" },
|
|
|
+ { -EINVAL, GPIOF_OUT_INIT_HIGH, "GPIO_WIFI_NRESET" },
|
|
|
+ { -EINVAL, GPIOF_OUT_INIT_HIGH, "GPIO_BT_NRESET" },
|
|
|
+};
|
|
|
+
|
|
|
+static void __init igep_wlan_bt_init(void)
|
|
|
+{
|
|
|
+ int err;
|
|
|
+
|
|
|
+ /* GPIO's for WLAN-BT combo depends on hardware revision */
|
|
|
+ if (hwrev == IGEP2_BOARD_HWREV_B) {
|
|
|
+ igep_wlan_bt_gpios[0].gpio = IGEP2_RB_GPIO_WIFI_NPD;
|
|
|
+ igep_wlan_bt_gpios[1].gpio = IGEP2_RB_GPIO_WIFI_NRESET;
|
|
|
+ igep_wlan_bt_gpios[2].gpio = IGEP2_RB_GPIO_BT_NRESET;
|
|
|
+ } else if (hwrev == IGEP2_BOARD_HWREV_C || machine_is_igep0030()) {
|
|
|
+ igep_wlan_bt_gpios[0].gpio = IGEP2_RC_GPIO_WIFI_NPD;
|
|
|
+ igep_wlan_bt_gpios[1].gpio = IGEP2_RC_GPIO_WIFI_NRESET;
|
|
|
+ igep_wlan_bt_gpios[2].gpio = IGEP2_RC_GPIO_BT_NRESET;
|
|
|
+ } else
|
|
|
+ return;
|
|
|
+
|
|
|
+ /* Make sure that the GPIO pins are muxed correctly */
|
|
|
+ omap_mux_init_gpio(igep_wlan_bt_gpios[0].gpio, OMAP_PIN_OUTPUT);
|
|
|
+ omap_mux_init_gpio(igep_wlan_bt_gpios[1].gpio, OMAP_PIN_OUTPUT);
|
|
|
+ omap_mux_init_gpio(igep_wlan_bt_gpios[2].gpio, OMAP_PIN_OUTPUT);
|
|
|
+
|
|
|
+ err = gpio_request_array(igep_wlan_bt_gpios,
|
|
|
+ ARRAY_SIZE(igep_wlan_bt_gpios));
|
|
|
+ if (err) {
|
|
|
+ pr_warning("IGEP2: Could not obtain WIFI/BT gpios\n");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ gpio_export(igep_wlan_bt_gpios[0].gpio, 0);
|
|
|
+ gpio_export(igep_wlan_bt_gpios[1].gpio, 0);
|
|
|
+ gpio_export(igep_wlan_bt_gpios[2].gpio, 0);
|
|
|
+
|
|
|
+ gpio_set_value(igep_wlan_bt_gpios[1].gpio, 0);
|
|
|
+ udelay(10);
|
|
|
+ gpio_set_value(igep_wlan_bt_gpios[1].gpio, 1);
|
|
|
+
|
|
|
+}
|
|
|
+#else
|
|
|
+static inline void __init igep_wlan_bt_init(void) { }
|
|
|
+#endif
|
|
|
+
|
|
|
+static struct regulator_consumer_supply dummy_supplies[] = {
|
|
|
+ REGULATOR_SUPPLY("vddvario", "smsc911x.0"),
|
|
|
+ REGULATOR_SUPPLY("vdd33a", "smsc911x.0"),
|
|
|
+};
|
|
|
+
|
|
|
+static void __init igep_init(void)
|
|
|
+{
|
|
|
+ regulator_register_fixed(1, dummy_supplies, ARRAY_SIZE(dummy_supplies));
|
|
|
+ omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);
|
|
|
+
|
|
|
+ /* Get IGEP2 hardware revision */
|
|
|
+ igep2_get_revision();
|
|
|
+
|
|
|
+ omap_hsmmc_init(mmc);
|
|
|
+
|
|
|
+ /* Register I2C busses and drivers */
|
|
|
+ igep_i2c_init();
|
|
|
+ platform_add_devices(igep_devices, ARRAY_SIZE(igep_devices));
|
|
|
+ omap_serial_init();
|
|
|
+ omap_sdrc_init(m65kxxxxam_sdrc_params,
|
|
|
+ m65kxxxxam_sdrc_params);
|
|
|
+ usb_musb_init(NULL);
|
|
|
+
|
|
|
+ igep_flash_init();
|
|
|
+ igep_leds_init();
|
|
|
+ omap_twl4030_audio_init("igep2");
|
|
|
+
|
|
|
+ /*
|
|
|
+ * WLAN-BT combo module from MuRata which has a Marvell WLAN
|
|
|
+ * (88W8686) + CSR Bluetooth chipset. Uses SDIO interface.
|
|
|
+ */
|
|
|
+ igep_wlan_bt_init();
|
|
|
+
|
|
|
+ if (machine_is_igep0020()) {
|
|
|
+ omap_display_init(&igep2_dss_data);
|
|
|
+ igep2_init_smsc911x();
|
|
|
+ usbhs_init(&igep2_usbhs_bdata);
|
|
|
+ } else {
|
|
|
+ usbhs_init(&igep3_usbhs_bdata);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+MACHINE_START(IGEP0020, "IGEP v2 board")
|
|
|
+ .atag_offset = 0x100,
|
|
|
+ .reserve = omap_reserve,
|
|
|
+ .map_io = omap3_map_io,
|
|
|
+ .init_early = omap35xx_init_early,
|
|
|
+ .init_irq = omap3_init_irq,
|
|
|
+ .handle_irq = omap3_intc_handle_irq,
|
|
|
+ .init_machine = igep_init,
|
|
|
+ .init_late = omap35xx_init_late,
|
|
|
+ .timer = &omap3_timer,
|
|
|
+ .restart = omap3xxx_restart,
|
|
|
+MACHINE_END
|
|
|
+
|
|
|
+MACHINE_START(IGEP0030, "IGEP OMAP3 module")
|
|
|
+ .atag_offset = 0x100,
|
|
|
+ .reserve = omap_reserve,
|
|
|
+ .map_io = omap3_map_io,
|
|
|
+ .init_early = omap35xx_init_early,
|
|
|
+ .init_irq = omap3_init_irq,
|
|
|
+ .handle_irq = omap3_intc_handle_irq,
|
|
|
+ .init_machine = igep_init,
|
|
|
+ .init_late = omap35xx_init_late,
|
|
|
+ .timer = &omap3_timer,
|
|
|
+ .restart = omap3xxx_restart,
|
|
|
+MACHINE_END
|