diff options
Diffstat (limited to 'recipes/linux/linux-omap-psp-2.6.32/omap3-touchbook/0006-ARM-OMAP-omap3-touchbook-update-boardfile.patch')
-rw-r--r-- | recipes/linux/linux-omap-psp-2.6.32/omap3-touchbook/0006-ARM-OMAP-omap3-touchbook-update-boardfile.patch | 571 |
1 files changed, 571 insertions, 0 deletions
diff --git a/recipes/linux/linux-omap-psp-2.6.32/omap3-touchbook/0006-ARM-OMAP-omap3-touchbook-update-boardfile.patch b/recipes/linux/linux-omap-psp-2.6.32/omap3-touchbook/0006-ARM-OMAP-omap3-touchbook-update-boardfile.patch new file mode 100644 index 0000000000..46669fda33 --- /dev/null +++ b/recipes/linux/linux-omap-psp-2.6.32/omap3-touchbook/0006-ARM-OMAP-omap3-touchbook-update-boardfile.patch @@ -0,0 +1,571 @@ +From d732dfd967b870ea5effa599d501996b620a1f60 Mon Sep 17 00:00:00 2001 +From: Gregoire Gentil <gregoire@gentil.com> +Date: Fri, 12 Mar 2010 11:49:16 +0100 +Subject: [PATCH 06/14] ARM: OMAP: omap3-touchbook: update boardfile + +--- + arch/arm/mach-omap2/board-omap3touchbook.c | 390 +++++++++++++++++++++------- + 1 files changed, 301 insertions(+), 89 deletions(-) + +diff --git a/arch/arm/mach-omap2/board-omap3touchbook.c b/arch/arm/mach-omap2/board-omap3touchbook.c +index fc3e03c..4f89cf3 100644 +--- a/arch/arm/mach-omap2/board-omap3touchbook.c ++++ b/arch/arm/mach-omap2/board-omap3touchbook.c +@@ -33,6 +33,7 @@ + #include <linux/spi/spi.h> + + #include <linux/spi/ads7846.h> ++#include <linux/mma7455l.h> + + #include <linux/regulator/machine.h> + #include <linux/i2c/twl.h> +@@ -45,6 +46,7 @@ + + #include <plat/board.h> + #include <plat/common.h> ++#include <plat/display.h> + #include <plat/gpmc.h> + #include <plat/nand.h> + #include <plat/usb.h> +@@ -60,6 +62,8 @@ + + #include <asm/setup.h> + ++#include <plat/dmtimer.h> ++#include <linux/backlight.h> + + #define GPMC_CS0_BASE 0x60 + #define GPMC_CS_SIZE 0x30 +@@ -68,10 +72,11 @@ + + #define OMAP3_AC_GPIO 136 + #define OMAP3_TS_GPIO 162 ++#define OMAP3_CHACHA_GPIO 154 + #define TB_BL_PWM_TIMER 9 + #define TB_KILL_POWER_GPIO 168 + +-unsigned long touchbook_revision; ++unsigned long ai_revision = 2; + + static struct mtd_partition omap3touchbook_nand_partitions[] = { + /* All the partition sizes are listed in terms of NAND block size */ +@@ -126,6 +131,103 @@ static struct platform_device omap3touchbook_nand_device = { + .resource = &omap3touchbook_nand_resource, + }; + ++static int touchbook_enable_dvi(struct omap_dss_device *dssdev) ++{ ++ if (dssdev->reset_gpio != -1) ++ gpio_set_value(dssdev->reset_gpio, 1); ++ ++ return 0; ++} ++ ++static void touchbook_disable_dvi(struct omap_dss_device *dssdev) ++{ ++ if (dssdev->reset_gpio != -1) ++ gpio_set_value(dssdev->reset_gpio, 0); ++} ++ ++static struct omap_dss_device touchbook_dvi_device = { ++ .type = OMAP_DISPLAY_TYPE_DPI, ++ .name = "dvi", ++ .driver_name = "generic_panel", ++ .phy.dpi.data_lines = 24, ++ .reset_gpio = 176, ++ .platform_enable = touchbook_enable_dvi, ++ .platform_disable = touchbook_disable_dvi, ++}; ++ ++static int touchbook_panel_enable_tv(struct omap_dss_device *dssdev) ++{ ++#define ENABLE_VDAC_DEDICATED 0x03 ++#define ENABLE_VDAC_DEV_GRP 0x20 ++ ++ twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, ++ ENABLE_VDAC_DEDICATED, ++ TWL4030_VDAC_DEDICATED); ++ twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, ++ ENABLE_VDAC_DEV_GRP, TWL4030_VDAC_DEV_GRP); ++ ++ return 0; ++} ++ ++static void touchbook_panel_disable_tv(struct omap_dss_device *dssdev) ++{ ++ twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0x00, ++ TWL4030_VDAC_DEDICATED); ++ twl_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0x00, ++ TWL4030_VDAC_DEV_GRP); ++} ++ ++static struct omap_dss_device touchbook_tv_device = { ++ .name = "tv", ++ .driver_name = "venc", ++ .type = OMAP_DISPLAY_TYPE_VENC, ++ .phy.venc.type = OMAP_DSS_VENC_TYPE_SVIDEO, ++ .platform_enable = touchbook_panel_enable_tv, ++ .platform_disable = touchbook_panel_disable_tv, ++}; ++ ++static struct omap_dss_device *touchbook_dss_devices[] = { ++ &touchbook_dvi_device, ++ &touchbook_tv_device, ++}; ++ ++static struct omap_dss_board_info touchbook_dss_data = { ++ .num_devices = ARRAY_SIZE(touchbook_dss_devices), ++ .devices = touchbook_dss_devices, ++ .default_device = &touchbook_dvi_device, ++}; ++ ++static struct platform_device touchbook_dss_device = { ++ .name = "omapdss", ++ .id = -1, ++ .dev = { ++ .platform_data = &touchbook_dss_data, ++ }, ++}; ++ ++static struct regulator_consumer_supply touchbook_vdac_supply = { ++ .supply = "vdda_dac", ++ .dev = &touchbook_dss_device.dev, ++}; ++ ++static struct regulator_consumer_supply touchbook_vdvi_supply = { ++ .supply = "vdds_dsi", ++ .dev = &touchbook_dss_device.dev, ++}; ++ ++static void __init touchbook_display_init(void) ++{ ++ int r; ++ ++ r = gpio_request(touchbook_dvi_device.reset_gpio, "DVI reset"); ++ if (r < 0) { ++ printk(KERN_ERR "Unable to get DVI reset GPIO\n"); ++ return; ++ } ++ ++ gpio_direction_output(touchbook_dvi_device.reset_gpio, 0); ++} ++ + #include "sdram-micron-mt46h32m32lf-6.h" + + static struct twl4030_hsmmc_info mmc[] = { +@@ -137,15 +239,6 @@ static struct twl4030_hsmmc_info mmc[] = { + {} /* Terminator */ + }; + +-static struct platform_device omap3_touchbook_lcd_device = { +- .name = "omap3touchbook_lcd", +- .id = -1, +-}; +- +-static struct omap_lcd_config omap3_touchbook_lcd_config __initdata = { +- .ctrl_name = "internal", +-}; +- + static struct regulator_consumer_supply touchbook_vmmc1_supply = { + .supply = "vmmc", + }; +@@ -177,6 +270,7 @@ static int touchbook_twl_gpio_setup(struct device *dev, + * power switch and overcurrent detect + */ + ++#if 0 + gpio_request(gpio + 1, "EHCI_nOC"); + gpio_direction_input(gpio + 1); + +@@ -187,6 +281,7 @@ static int touchbook_twl_gpio_setup(struct device *dev, + /* TWL4030_GPIO_MAX + 1 == ledB, PMU_STAT (out, active low LED) */ + gpio_leds[2].gpio = gpio + TWL4030_GPIO_MAX + 1; + ++#endif + return 0; + } + +@@ -201,16 +296,6 @@ static struct twl4030_gpio_platform_data touchbook_gpio_data = { + .setup = touchbook_twl_gpio_setup, + }; + +-static struct regulator_consumer_supply touchbook_vdac_supply = { +- .supply = "vdac", +- .dev = &omap3_touchbook_lcd_device.dev, +-}; +- +-static struct regulator_consumer_supply touchbook_vdvi_supply = { +- .supply = "vdvi", +- .dev = &omap3_touchbook_lcd_device.dev, +-}; +- + /* VMMC1 for MMC1 pins CMD, CLK, DAT0..DAT3 (20 mA, plus card == max 220 mA) */ + static struct regulator_init_data touchbook_vmmc1 = { + .constraints = { +@@ -283,6 +368,10 @@ static struct twl4030_codec_data touchbook_codec_data = { + .audio = &touchbook_audio_data, + }; + ++static struct twl4030_madc_platform_data touchbook_madc_data = { ++ .irq_line = 1, ++}; ++ + static struct twl4030_platform_data touchbook_twldata = { + .irq_base = TWL4030_IRQ_BASE, + .irq_end = TWL4030_IRQ_END, +@@ -291,6 +380,7 @@ static struct twl4030_platform_data touchbook_twldata = { + .usb = &touchbook_usb_data, + .gpio = &touchbook_gpio_data, + .codec = &touchbook_codec_data, ++ .madc = &touchbook_madc_data, + .vmmc1 = &touchbook_vmmc1, + .vsim = &touchbook_vsim, + .vdac = &touchbook_vdac, +@@ -310,10 +400,18 @@ static struct i2c_board_info __initdata touchBook_i2c_boardinfo[] = { + { + I2C_BOARD_INFO("bq27200", 0x55), + }, ++ { ++ I2C_BOARD_INFO("chacha", 0x40), ++ .irq = OMAP_GPIO_IRQ(OMAP3_CHACHA_GPIO), ++ }, ++ { ++ I2C_BOARD_INFO("ds1307", 0x68), ++ }, + }; + + static int __init omap3_touchbook_i2c_init(void) + { ++ int ret; + /* Standard TouchBook bus */ + omap_register_i2c_bus(1, 2600, touchbook_i2c_boardinfo, + ARRAY_SIZE(touchbook_i2c_boardinfo)); +@@ -322,53 +420,16 @@ static int __init omap3_touchbook_i2c_init(void) + omap_register_i2c_bus(3, 100, touchBook_i2c_boardinfo, + ARRAY_SIZE(touchBook_i2c_boardinfo)); + +- return 0; +-} +- +-static void __init omap3_ads7846_init(void) +-{ +- if (gpio_request(OMAP3_TS_GPIO, "ads7846_pen_down")) { +- printk(KERN_ERR "Failed to request GPIO %d for " +- "ads7846 pen down IRQ\n", OMAP3_TS_GPIO); +- return; ++ ret = gpio_request(OMAP3_CHACHA_GPIO, "chacha"); ++ if (ret < 0) { ++ printk(KERN_ERR "Failed to request GPIO %d for chacha IRQ\n", OMAP3_CHACHA_GPIO); ++ return 0; + } ++ gpio_direction_input(OMAP3_CHACHA_GPIO); + +- gpio_direction_input(OMAP3_TS_GPIO); +- omap_set_gpio_debounce(OMAP3_TS_GPIO, 1); +- omap_set_gpio_debounce_time(OMAP3_TS_GPIO, 0xa); ++ return 0; + } + +-static struct ads7846_platform_data ads7846_config = { +- .x_min = 100, +- .y_min = 265, +- .x_max = 3950, +- .y_max = 3750, +- .x_plate_ohms = 40, +- .pressure_max = 255, +- .debounce_max = 10, +- .debounce_tol = 5, +- .debounce_rep = 1, +- .gpio_pendown = OMAP3_TS_GPIO, +- .keep_vref_on = 1, +-}; +- +-static struct omap2_mcspi_device_config ads7846_mcspi_config = { +- .turbo_mode = 0, +- .single_channel = 1, /* 0: slave, 1: master */ +-}; +- +-static struct spi_board_info omap3_ads7846_spi_board_info[] __initdata = { +- { +- .modalias = "ads7846", +- .bus_num = 4, +- .chip_select = 0, +- .max_speed_hz = 1500000, +- .controller_data = &ads7846_mcspi_config, +- .irq = OMAP_GPIO_IRQ(OMAP3_TS_GPIO), +- .platform_data = &ads7846_config, +- } +-}; +- + static struct gpio_led gpio_leds[] = { + { + .name = "touchbook::usr0", +@@ -412,6 +473,7 @@ static struct gpio_keys_button gpio_buttons[] = { + .gpio = 183, + .desc = "power", + .wakeup = 1, ++ .active_low = 1, + }, + }; + +@@ -428,23 +490,8 @@ static struct platform_device keys_gpio = { + }, + }; + +-static struct omap_board_config_kernel omap3_touchbook_config[] __initdata = { +- { OMAP_TAG_LCD, &omap3_touchbook_lcd_config }, +-}; +- +-#ifdef CONFIG_OMAP_MUX +-static struct omap_board_mux board_mux[] __initdata = { +- { .reg_offset = OMAP_MUX_TERMINATOR }, +-}; +-#else +-#define board_mux NULL +-#endif +- + static void __init omap3_touchbook_init_irq(void) + { +- omap3_mux_init(board_mux, OMAP_PACKAGE_CBB); +- omap_board_config = omap3_touchbook_config; +- omap_board_config_size = ARRAY_SIZE(omap3_touchbook_config); + omap2_init_common_hw(mt46h32m32lf6_sdrc_params, + mt46h32m32lf6_sdrc_params, omap35x_mpu_rate_table, + omap35x_dsp_rate_table, omap35x_l3_rate_table); +@@ -456,9 +503,9 @@ static void __init omap3_touchbook_init_irq(void) + } + + static struct platform_device *omap3_touchbook_devices[] __initdata = { +- &omap3_touchbook_lcd_device, + &leds_gpio, + &keys_gpio, ++ &touchbook_dss_device, + }; + + static void __init omap3touchbook_flash_init(void) +@@ -512,6 +559,166 @@ static struct ehci_hcd_omap_platform_data ehci_pdata __initconst = { + .reset_gpio_port[2] = -EINVAL + }; + ++#ifdef CONFIG_OMAP_MUX ++static struct omap_board_mux board_mux[] __initdata = { ++ { .reg_offset = OMAP_MUX_TERMINATOR }, ++}; ++#else ++#define board_mux NULL ++#endif ++ ++static struct ads7846_platform_data ads7846_config = { ++ .x_min = 100, ++ .y_min = 265, ++ .x_max = 3950, ++ .y_max = 3750, ++ .x_plate_ohms = 40, ++ .pressure_max = 255, ++ .debounce_max = 10, ++ .debounce_tol = 5, ++ .debounce_rep = 1, ++ .gpio_pendown = OMAP3_TS_GPIO, ++ .keep_vref_on = 1, ++}; ++ ++static struct omap2_mcspi_device_config ads7846_mcspi_config = { ++ .turbo_mode = 0, ++ .single_channel = 1, /* 0: slave, 1: master */ ++}; ++ ++static struct spi_board_info omap3_ads7846_spi_board_info[] __initdata = { ++ { ++ .modalias = "ads7846", ++ .bus_num = 4, ++ .chip_select = 0, ++ .max_speed_hz = 1500000, ++ .controller_data = &ads7846_mcspi_config, ++ .irq = OMAP_GPIO_IRQ(OMAP3_TS_GPIO), ++ .platform_data = &ads7846_config, ++ } ++}; ++ ++static void __init omap3_ads7846_init(void) ++{ ++ if (gpio_request(OMAP3_TS_GPIO, "ads7846_pen_down")) { ++ printk(KERN_ERR "Failed to request GPIO %d for " ++ "ads7846 pen down IRQ\n", OMAP3_TS_GPIO); ++ return; ++ } ++ ++ gpio_direction_input(OMAP3_TS_GPIO); ++ omap_set_gpio_debounce(OMAP3_TS_GPIO, 1); ++ omap_set_gpio_debounce_time(OMAP3_TS_GPIO, 0xa); ++} ++ ++static struct mma7455l_platform_data mma7455l_config = { ++ .calibration_x = -4, ++ .calibration_y = 28, ++ .calibration_z = -28, ++}; ++ ++static struct omap2_mcspi_device_config mma7455l_mcspi_config = { ++ .turbo_mode = 0, ++ .single_channel = 1, /* 0: slave, 1: master */ ++}; ++ ++static struct spi_board_info omap3_mma7455l_spi_board_info[] __initdata = { ++ { ++ .modalias = "mma7455l", ++ .bus_num = 3, ++ .chip_select = 0, ++ .max_speed_hz = 200000, ++ .irq = OMAP_GPIO_IRQ(OMAP3_AC_GPIO), ++ .controller_data = &mma7455l_mcspi_config, //(void *) 135, ++ .platform_data = &mma7455l_config, ++ } ++}; ++ ++static void __init omap3_mma7455l_init(void) ++{ ++ int ret; ++ ++ ret = gpio_request(OMAP3_AC_GPIO, "mma7455l"); ++ if (ret < 0) { ++ printk(KERN_ERR "Failed to request GPIO %d for mma7455l IRQ\n", OMAP3_AC_GPIO); ++ return; ++ } ++ ++ gpio_direction_input(OMAP3_AC_GPIO); ++} ++ ++static int touchbook_backlight_brightness = 50; ++static struct omap_dm_timer *touchbook_backlight_pwm; ++ ++static int touchbook_backlight_read(struct backlight_device *bd) ++{ ++ return touchbook_backlight_brightness; ++} ++ ++static int touchbook_backlight_update(struct backlight_device *bd) ++{ ++ int value = bd->props.brightness; ++ touchbook_backlight_brightness = value; ++ ++ /* Frequency calculation: ++ - For 200Hz PWM, you want to load -164 (=> -32768Hz / 200Hz). ++ - Minimum duty cycle for the backlight is 15%. ++ - You have (164*0.85) => ~140 levels of brightness. ++ */ ++ ++ /* Halve input brightness */ ++ value /= 2; ++ ++ /* For maximum brightness, just stop the timer... */ ++ if(value != bd->props.max_brightness) ++ { ++ /* Load the appropriate value for 200Hz PWM */ ++ u32 period = clk_get_rate(omap_dm_timer_get_fclk(touchbook_backlight_pwm)) / 200; ++ ++ /* Minimum duty cycle is 15% */ ++ u32 minimum = (period * 3) / 20; ++ u32 maximum = (period * 17) / 20; ++ ++ /* Work out match value */ ++ u32 match = (maximum * value) / 100; ++ ++ /* Start... */ ++ omap_dm_timer_set_load(touchbook_backlight_pwm, 1, 0xFFFFFFFF - period - 1); ++ omap_dm_timer_set_match(touchbook_backlight_pwm, 1, 0xFFFFFFFF - minimum - match); ++ omap_dm_timer_write_counter(touchbook_backlight_pwm, -1); ++ omap_dm_timer_start(touchbook_backlight_pwm); ++ } ++ else ++ omap_dm_timer_stop(touchbook_backlight_pwm); ++ ++ ++ return 0; ++} ++ ++static struct backlight_ops touchbook_backlight_properties = { ++ .get_brightness = touchbook_backlight_read, ++ .update_status = touchbook_backlight_update, ++}; ++ ++static void __init omap3_touchbook_backlight_init(void) ++{ ++ static struct backlight_device *bd; ++ bd = backlight_device_register("touchbook", NULL, NULL, &touchbook_backlight_properties); ++ ++ if(bd) ++ { ++ touchbook_backlight_pwm = omap_dm_timer_request_specific(TB_BL_PWM_TIMER); ++ omap_dm_timer_enable(touchbook_backlight_pwm); ++ omap_dm_timer_set_source(touchbook_backlight_pwm, OMAP_TIMER_SRC_SYS_CLK); ++ omap_dm_timer_set_pwm(touchbook_backlight_pwm, 1, 1, OMAP_TIMER_TRIGGER_OVERFLOW_AND_COMPARE); ++ ++ bd->props.max_brightness = 100; ++ bd->props.brightness = touchbook_backlight_brightness; ++ } ++ ++ touchbook_backlight_update(bd); ++} ++ + static void omap3_touchbook_poweroff(void) + { + int r; +@@ -525,33 +732,27 @@ static void omap3_touchbook_poweroff(void) + gpio_direction_output(TB_KILL_POWER_GPIO, 0); + } + +-static void __init early_touchbook_revision(char **p) ++static void __init early_ai_revision(char **p) + { + if (!*p) + return; + +- strict_strtoul(*p, 10, &touchbook_revision); ++ strict_strtoul(*p, 10, &ai_revision); + } +-__early_param("tbr=", early_touchbook_revision); ++__early_param("air=", early_ai_revision); + + static void __init omap3_touchbook_init(void) + { + pm_power_off = omap3_touchbook_poweroff; + ++ omap3_mux_init(board_mux, OMAP_PACKAGE_CBB); + omap3_touchbook_i2c_init(); + platform_add_devices(omap3_touchbook_devices, + ARRAY_SIZE(omap3_touchbook_devices)); + omap_serial_init(); + +- omap_mux_init_gpio(170, OMAP_PIN_INPUT); + gpio_request(176, "DVI_nPD"); +- /* REVISIT leave DVI powered down until it's needed ... */ +- gpio_direction_output(176, true); + +- /* Touchscreen and accelerometer */ +- spi_register_board_info(omap3_ads7846_spi_board_info, +- ARRAY_SIZE(omap3_ads7846_spi_board_info)); +- omap3_ads7846_init(); + usb_musb_init(); + usb_ehci_init(&ehci_pdata); + omap3touchbook_flash_init(); +@@ -559,6 +760,17 @@ static void __init omap3_touchbook_init(void) + /* Ensure SDRC pins are mux'd for self-refresh */ + omap_mux_init_signal("sdrc_cke0", OMAP_PIN_OUTPUT); + omap_mux_init_signal("sdrc_cke1", OMAP_PIN_OUTPUT); ++ ++ touchbook_display_init(); ++ omap3_touchbook_backlight_init(); ++ ++ /* Touchscreen and accelerometer */ ++ spi_register_board_info(omap3_ads7846_spi_board_info, ++ ARRAY_SIZE(omap3_ads7846_spi_board_info)); ++ spi_register_board_info(omap3_mma7455l_spi_board_info, ++ ARRAY_SIZE(omap3_mma7455l_spi_board_info)); ++ omap3_ads7846_init(); ++ omap3_mma7455l_init(); + } + + static void __init omap3_touchbook_map_io(void) +-- +1.6.6.1 + |