*/
#include <linux/kernel.h>
+#include <linux/init.h>
#include <linux/platform_device.h>
#include <linux/delay.h>
#include <linux/i2c.h>
#include <linux/mtd/partitions.h>
#include <linux/input.h>
#include <linux/i2c/tps65010.h>
+#include <linux/workqueue.h>
+#include <linux/spi/spi.h>
+#include <linux/spi/tsc2101.h>
+#include <linux/clk.h>
#include <asm/hardware.h>
#include <asm/gpio.h>
#include <asm/mach/flash.h>
#include <asm/mach/map.h>
+#include <asm/arch/gpio.h>
+#include <asm/arch/gpio-switch.h>
#include <asm/arch/mux.h>
#include <asm/arch/tc.h>
#include <asm/arch/nand.h>
#include <asm/arch/mcbsp.h>
#include <asm/arch/omap-alsa.h>
-extern int omap_gpio_init(void);
-
static int h2_keymap[] = {
KEY(0, 0, KEY_LEFT),
KEY(0, 1, KEY_RIGHT),
.id = -1,
};
+struct {
+ struct clk *mclk;
+ int initialized;
+} h2_tsc2101;
+
+#define TSC2101_MUX_MCLK_ON R10_1610_MCLK_ON
+#define TSC2101_MUX_MCLK_OFF R10_1610_MCLK_OFF
+
+static void h2_lcd_dev_init(struct spi_device *tsc2101)
+{
+ /* The LCD is connected to the GPIO pins of the TSC2101, so
+ * we have to tie them here. We can also register the LCD driver
+ * first only here, where we know that the TSC driver is ready.
+ */
+
+ h2_lcd_device.dev.platform_data = tsc2101;
+ platform_device_register(&h2_lcd_device);
+}
+
+static int h2_tsc2101_init(struct spi_device *spi)
+{
+ int r;
+
+ if (h2_tsc2101.initialized) {
+ printk(KERN_ERR "tsc2101: already initialized\n");
+ return -ENODEV;
+ }
+
+ /* Get the MCLK */
+ h2_tsc2101.mclk = clk_get(&spi->dev, "mclk");
+ if (IS_ERR(h2_tsc2101.mclk)) {
+ dev_err(&spi->dev, "unable to get the clock MCLK\n");
+ return PTR_ERR(h2_tsc2101.mclk);
+ }
+ if ((r = clk_set_rate(h2_tsc2101.mclk, 12000000)) < 0) {
+ dev_err(&spi->dev, "unable to set rate to the MCLK\n");
+ goto err;
+ }
+
+ omap_cfg_reg(TSC2101_MUX_MCLK_OFF);
+ omap_cfg_reg(N15_1610_UWIRE_CS1);
+
+ h2_lcd_dev_init(spi);
+
+ return 0;
+err:
+ clk_put(h2_tsc2101.mclk);
+ return r;
+}
+
+static void h2_tsc2101_cleanup(struct spi_device *spi)
+{
+ clk_put(h2_tsc2101.mclk);
+ omap_cfg_reg(TSC2101_MUX_MCLK_OFF);
+}
+
+static void h2_tsc2101_enable_mclk(struct spi_device *spi)
+{
+ omap_cfg_reg(TSC2101_MUX_MCLK_ON);
+ clk_enable(h2_tsc2101.mclk);
+}
+
+static void h2_tsc2101_disable_mclk(struct spi_device *spi)
+{
+ clk_disable(h2_tsc2101.mclk);
+ omap_cfg_reg(R10_1610_MCLK_OFF);
+}
+
+static struct tsc2101_platform_data h2_tsc2101_platform_data = {
+ .init = h2_tsc2101_init,
+ .cleanup = h2_tsc2101_cleanup,
+ .enable_mclk = h2_tsc2101_enable_mclk,
+ .disable_mclk = h2_tsc2101_disable_mclk,
+};
+
+static struct spi_board_info h2_spi_board_info[] __initdata = {
+ [0] = {
+ .modalias = "tsc2101",
+ .bus_num = 2,
+ .chip_select = 1,
+ .max_speed_hz = 16000000,
+ .platform_data = &h2_tsc2101_platform_data,
+ },
+};
+
static struct omap_mcbsp_reg_cfg mcbsp_regs = {
.spcr2 = FREE | FRST | GRST | XRST | XINTM(3),
.spcr1 = RINTM(3) | RRST,
&h2_smc91x_device,
&h2_irda_device,
&h2_kp_device,
- &h2_lcd_device,
&h2_mcbsp1_device,
};
-#ifdef CONFIG_I2C_BOARDINFO
-static struct i2c_board_info __initdata h2_i2c_board_info[] = {
- {
- I2C_BOARD_INFO("tps65010", 0x48),
- .type = "tps65010",
- .irq = OMAP_GPIO_IRQ(58),
- },
- /* TODO when driver support is ready:
- * - isp1301 OTG transceiver
- * - optional ov9640 camera sensor at 0x30
- * - pcf9754 for aGPS control
- * - ... etc
- */
-};
-#endif
-
static void __init h2_init_smc91x(void)
{
if ((omap_request_gpio(0)) < 0) {
}
}
+static struct i2c_board_info __initdata h2_i2c_board_info[] = {
+ {
+ I2C_BOARD_INFO("tps65010", 0x48),
+ .type = "tps65010",
+ .irq = OMAP_GPIO_IRQ(58),
+ }, {
+ I2C_BOARD_INFO("isp1301_omap", 0x2d),
+ .type = "isp1301_omap",
+ .irq = OMAP_GPIO_IRQ(2),
+ },
+};
+
static void __init h2_init_irq(void)
{
omap1_init_common_hw();
};
static struct omap_mmc_config h2_mmc_config __initdata = {
- .mmc [0] = {
- .enabled = 1,
+ .mmc[0] = {
+ .enabled = 1,
.wire4 = 1,
- .wp_pin = OMAP_MPUIO(3),
- .power_pin = -1, /* tps65010 gpio3 */
- .switch_pin = OMAP_MPUIO(1),
},
};
+extern struct omap_mmc_platform_data h2_mmc_data;
+
static struct omap_uart_config h2_uart_config __initdata = {
.enabled_uarts = ((1 << 0) | (1 << 1) | (1 << 2)),
};
{ OMAP_TAG_LCD, &h2_lcd_config },
};
+static struct omap_gpio_switch h2_gpio_switches[] __initdata = {
+ {
+ .name = "mmc_slot",
+ .gpio = OMAP_MPUIO(1),
+ .type = OMAP_GPIO_SWITCH_TYPE_COVER,
+ .debounce_rising = 100,
+ .debounce_falling = 0,
+ .notify = h2_mmc_slot_cover_handler,
+ .notify_data = NULL,
+ },
+};
+
#define H2_NAND_RB_GPIO_PIN 62
static int h2_nand_dev_ready(struct omap_nand_platform_data *data)
#endif
platform_add_devices(h2_devices, ARRAY_SIZE(h2_devices));
+ spi_register_board_info(h2_spi_board_info,
+ ARRAY_SIZE(h2_spi_board_info));
omap_board_config = h2_config;
omap_board_config_size = ARRAY_SIZE(h2_config);
omap_serial_init();
-
- /* irq for tps65010 chip */
- omap_cfg_reg(W4_GPIO58);
- if (gpio_request(58, "tps65010") == 0)
- gpio_direction_input(58);
-
-#ifdef CONFIG_I2C_BOARDINFO
- i2c_register_board_info(1, h2_i2c_board_info,
- ARRAY_SIZE(h2_i2c_board_info));
-#endif
+ omap_register_i2c_bus(1, 100, h2_i2c_board_info,
+ ARRAY_SIZE(h2_i2c_board_info));
+ h2_mmc_init();
+ omap_register_gpio_switches(h2_gpio_switches,
+ ARRAY_SIZE(h2_gpio_switches));
}
static void __init h2_map_io(void)
omap1_map_common_io();
}
-#ifdef CONFIG_TPS65010
-static int __init h2_tps_init(void)
-{
- if (!machine_is_omap_h2())
- return 0;
-
- /* gpio3 for SD, gpio4 for VDD_DSP */
- /* FIXME send power to DSP iff it's configured */
-
- /* Enable LOW_PWR */
- tps65010_set_low_pwr(ON);
- return 0;
-}
-fs_initcall(h2_tps_init);
-#endif
-
MACHINE_START(OMAP_H2, "TI-H2")
/* Maintainer: Imre Deak <imre.deak@nokia.com> */
.phys_io = 0xfff00000,