X-Git-Url: http://pilppa.org/gitweb/gitweb.cgi?a=blobdiff_plain;f=arch%2Farm%2Fmach-omap1%2Fboard-h2.c;h=aa1f8af57c5346e463a33751ed4a2818f8041373;hb=e015fc7dba8f5002daa0982eb81d33cc72e68e95;hp=5079877200154364cf5d5d5921898909f53b2c2a;hpb=69d1d523cc961b6f3c2fe313694263fc81ada231;p=linux-2.6-omap-h63xx.git diff --git a/arch/arm/mach-omap1/board-h2.c b/arch/arm/mach-omap1/board-h2.c index 50798772001..aa1f8af57c5 100644 --- a/arch/arm/mach-omap1/board-h2.c +++ b/arch/arm/mach-omap1/board-h2.c @@ -20,6 +20,7 @@ */ #include +#include #include #include #include @@ -28,6 +29,10 @@ #include #include #include +#include +#include +#include +#include #include #include @@ -37,6 +42,7 @@ #include #include +#include #include #include #include @@ -295,6 +301,91 @@ static struct platform_device h2_lcd_device = { .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, @@ -336,7 +427,6 @@ static struct platform_device *h2_devices[] __initdata = { &h2_smc91x_device, &h2_irda_device, &h2_kp_device, - &h2_lcd_device, &h2_mcbsp1_device, }; @@ -407,6 +497,18 @@ static struct omap_board_config_kernel h2_config[] __initdata = { { 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) @@ -450,12 +552,16 @@ static void __init h2_init(void) #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(); 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)