From 0bee6a2ed81ffcedaecbb96a64b694d289cfe5f6 Mon Sep 17 00:00:00 2001 From: Koen Kooi Date: Mon, 26 Oct 2009 19:34:08 +0100 Subject: linux-omap-pm 2.6.29: sync touchbook patches with linux-omap kernel --- .../beagleboard/beagle-asoc.patch | 35 + .../aufs-squashfs-mount-to-avoid-initramfs.patch | 4 +- .../omap3-touchbook/board-omap3touchbook.c | 745 +++++++++++++++++++++ .../boot-trace-for-optimization.patch | 251 +++++++ .../dss2-fix-rotation-offsets.patch | 54 ++ .../omap3-touchbook/ehci.patch | 33 +- .../omap3-touchbook/keyboard-special-keys.patch | 244 +++++++ .../omap3-touchbook/touchbook-config.patch | 60 ++ recipes/linux/linux-omap-pm_2.6.29.bb | 26 +- 9 files changed, 1414 insertions(+), 38 deletions(-) create mode 100644 recipes/linux/linux-omap-pm-2.6.29/beagleboard/beagle-asoc.patch create mode 100644 recipes/linux/linux-omap-pm-2.6.29/omap3-touchbook/board-omap3touchbook.c create mode 100644 recipes/linux/linux-omap-pm-2.6.29/omap3-touchbook/boot-trace-for-optimization.patch create mode 100644 recipes/linux/linux-omap-pm-2.6.29/omap3-touchbook/dss2-fix-rotation-offsets.patch create mode 100644 recipes/linux/linux-omap-pm-2.6.29/omap3-touchbook/keyboard-special-keys.patch create mode 100644 recipes/linux/linux-omap-pm-2.6.29/omap3-touchbook/touchbook-config.patch (limited to 'recipes/linux') diff --git a/recipes/linux/linux-omap-pm-2.6.29/beagleboard/beagle-asoc.patch b/recipes/linux/linux-omap-pm-2.6.29/beagleboard/beagle-asoc.patch new file mode 100644 index 0000000000..b2b920037e --- /dev/null +++ b/recipes/linux/linux-omap-pm-2.6.29/beagleboard/beagle-asoc.patch @@ -0,0 +1,35 @@ +diff --git a/sound/soc/omap/Kconfig b/sound/soc/omap/Kconfig +index 4f7f040..ccd8973 100644 +--- a/sound/soc/omap/Kconfig ++++ b/sound/soc/omap/Kconfig +@@ -55,3 +55,13 @@ config SND_OMAP_SOC_OMAP3_PANDORA + select SND_SOC_TWL4030 + help + Say Y if you want to add support for SoC audio on the OMAP3 Pandora. ++ ++config SND_OMAP_SOC_OMAP3_BEAGLE ++ tristate "SoC Audio support for OMAP3 Beagle" ++ depends on TWL4030_CORE && SND_OMAP_SOC && MACH_OMAP3_BEAGLE ++ select SND_OMAP_SOC_MCBSP ++ select SND_SOC_TWL4030 ++ help ++ Say Y if you want to add support for SoC audio on the Beagleboard. ++ ++ +diff --git a/sound/soc/omap/Makefile b/sound/soc/omap/Makefile +index 76fedd9..0c9e4ac 100644 +--- a/sound/soc/omap/Makefile ++++ b/sound/soc/omap/Makefile +@@ -12,6 +12,7 @@ snd-soc-overo-objs := overo.o + snd-soc-omap2evm-objs := omap2evm.o + snd-soc-sdp3430-objs := sdp3430.o + snd-soc-omap3pandora-objs := omap3pandora.o ++snd-soc-omap3beagle-objs := omap3beagle.o + + obj-$(CONFIG_SND_OMAP_SOC_N810) += snd-soc-n810.o + obj-$(CONFIG_SND_OMAP_SOC_OSK5912) += snd-soc-osk5912.o +@@ -19,3 +20,4 @@ obj-$(CONFIG_SND_OMAP_SOC_OVERO) += snd-soc-overo.o + obj-$(CONFIG_MACH_OMAP2EVM) += snd-soc-omap2evm.o + obj-$(CONFIG_SND_OMAP_SOC_SDP3430) += snd-soc-sdp3430.o + obj-$(CONFIG_SND_OMAP_SOC_OMAP3_PANDORA) += snd-soc-omap3pandora.o ++obj-$(CONFIG_SND_OMAP_SOC_OMAP3_BEAGLE) += snd-soc-omap3beagle.o diff --git a/recipes/linux/linux-omap-pm-2.6.29/omap3-touchbook/aufs-squashfs-mount-to-avoid-initramfs.patch b/recipes/linux/linux-omap-pm-2.6.29/omap3-touchbook/aufs-squashfs-mount-to-avoid-initramfs.patch index 9a9b982fef..ed5cbfc1b9 100644 --- a/recipes/linux/linux-omap-pm-2.6.29/omap3-touchbook/aufs-squashfs-mount-to-avoid-initramfs.patch +++ b/recipes/linux/linux-omap-pm-2.6.29/omap3-touchbook/aufs-squashfs-mount-to-avoid-initramfs.patch @@ -7,7 +7,7 @@ + int do_special = 0; + if (strcmp(root_device_name, "special") == 0) + do_special = 1; -+ //do_special = 1; ++ do_special = 1; + + if (do_special) { + dev_t ROOT_DEV_RO; @@ -24,7 +24,7 @@ + } + + sys_mkdir("/root-rw", 0700); -+ ROOT_DEV_RW = name_to_dev_t("/dev/mmcblk0p3"); ++ ROOT_DEV_RW = name_to_dev_t("/dev/mmcblk0p4"); + create_dev("/dev/root-rw", ROOT_DEV_RW); + if (sys_mount("/dev/root-rw", "/root-rw", "ext3", MS_SILENT, NULL) != 0) + goto no_special; diff --git a/recipes/linux/linux-omap-pm-2.6.29/omap3-touchbook/board-omap3touchbook.c b/recipes/linux/linux-omap-pm-2.6.29/omap3-touchbook/board-omap3touchbook.c new file mode 100644 index 0000000000..99651114e6 --- /dev/null +++ b/recipes/linux/linux-omap-pm-2.6.29/omap3-touchbook/board-omap3touchbook.c @@ -0,0 +1,745 @@ +/* + * linux/arch/arm/mach-omap2/board-omap3touchbook.c + * + * Copyright (C) 2009 Always Innovating + * + * Modified from mach-omap2/board-omap3beagleboard.c + * + * Initial code: Grégoire Gentil, Tim Yamin + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include + +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +#include "twl4030-generic-scripts.h" +#include "mmc-twl4030.h" +#include "pm.h" +#include "omap3-opp.h" + + +#define GPMC_CS0_BASE 0x60 +#define GPMC_CS_SIZE 0x30 + +#define NAND_BLOCK_SIZE SZ_128K + +#define OMAP3_AC_GPIO 136 //Int1 DRDY +#define OMAP3_TS_GPIO 162 +#define TB_BL_PWM_TIMER 9 +#define TB_KILL_POWER_GPIO 168 + +static struct mtd_partition omap3touchbook_nand_partitions[] = { + /* All the partition sizes are listed in terms of NAND block size */ + { + .name = "X-Loader", + .offset = 0, + .size = 4 * NAND_BLOCK_SIZE, + .mask_flags = MTD_WRITEABLE, /* force read-only */ + }, + { + .name = "U-Boot", + .offset = MTDPART_OFS_APPEND, /* Offset = 0x80000 */ + .size = 15 * NAND_BLOCK_SIZE, + .mask_flags = MTD_WRITEABLE, /* force read-only */ + }, + { + .name = "U-Boot Env", + .offset = MTDPART_OFS_APPEND, /* Offset = 0x260000 */ + .size = 1 * NAND_BLOCK_SIZE, + }, + { + .name = "Kernel", + .offset = MTDPART_OFS_APPEND, /* Offset = 0x280000 */ + .size = 32 * NAND_BLOCK_SIZE, + }, + { + .name = "File System", + .offset = MTDPART_OFS_APPEND, /* Offset = 0x680000 */ + .size = MTDPART_SIZ_FULL, + }, +}; + +static struct omap_nand_platform_data omap3touchbook_nand_data = { + .options = NAND_BUSWIDTH_16, + .parts = omap3touchbook_nand_partitions, + .nr_parts = ARRAY_SIZE(omap3touchbook_nand_partitions), + .dma_channel = -1, /* disable DMA in OMAP NAND driver */ + .nand_setup = NULL, + .dev_ready = NULL, +}; + +static struct resource omap3touchbook_nand_resource = { + .flags = IORESOURCE_MEM, +}; + +static struct platform_device omap3touchbook_nand_device = { + .name = "omap2-nand", + .id = -1, + .dev = { + .platform_data = &omap3touchbook_nand_data, + }, + .num_resources = 1, + .resource = &omap3touchbook_nand_resource, +}; + +#include "sdram-micron-mt46h32m32lf-6.h" + +static struct omap_uart_config omap3_touchbook_uart_config __initdata = { + .enabled_uarts = ((1 << 0) | (1 << 1) | (1 << 2)), +}; + +static struct twl4030_usb_data touchbook_usb_data = { + .usb_mode = T2_USB_MODE_ULPI, +}; + +static struct twl4030_hsmmc_info mmc[] = { + { + .mmc = 1, + .wires = 8, + .gpio_wp = 29, + }, + {} /* Terminator */ +}; + +static struct regulator_consumer_supply touchbook_vmmc1_supply = { + .supply = "vmmc", +}; + +static struct regulator_consumer_supply touchbook_vsim_supply = { + .supply = "vmmc_aux", +}; + +static struct gpio_led gpio_leds[]; + +static int touchbook_twl_gpio_setup(struct device *dev, + unsigned gpio, unsigned ngpio) +{ + /* gpio + 0 is "mmc0_cd" (input/IRQ) */ + omap_cfg_reg(AH8_34XX_GPIO29); + mmc[0].gpio_cd = gpio + 0; + twl4030_mmc_init(mmc); + + /* link regulators to MMC adapters */ + touchbook_vmmc1_supply.dev = mmc[0].dev; + touchbook_vsim_supply.dev = mmc[0].dev; + + /* REVISIT: need ehci-omap hooks for external VBUS + * power switch and overcurrent detect + */ + +#if 0 /* TODO: This needs to be modified to not rely on u-boot */ + gpio_request(gpio + 1, "EHCI_nOC"); + gpio_direction_input(gpio + 1); + + /* TWL4030_GPIO_MAX + 0 == ledA, EHCI nEN_USB_PWR (out, active low) */ + gpio_request(gpio + TWL4030_GPIO_MAX, "nEN_USB_PWR"); + gpio_direction_output(gpio + TWL4030_GPIO_MAX, 1); + + /* TWL4030_GPIO_MAX + 1 == ledB, PMU_STAT (out, active low LED) */ + gpio_leds[2].gpio = gpio + TWL4030_GPIO_MAX + 1; +#endif + return 0; +} + +static struct twl4030_gpio_platform_data touchbook_gpio_data = { + .gpio_base = OMAP_MAX_GPIO_LINES, + .irq_base = TWL4030_GPIO_IRQ_BASE, + .irq_end = TWL4030_GPIO_IRQ_END, + .use_leds = true, + .pullups = BIT(1), + .pulldowns = BIT(2) | BIT(6) | BIT(7) | BIT(8) | BIT(13) + | BIT(15) | BIT(16) | BIT(17), + .setup = touchbook_twl_gpio_setup, +}; + +static struct platform_device omap3_touchbook_lcd_device = { + .name = "omap3touchbook_lcd", + .id = -1, +}; + +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 = { + .min_uV = 1850000, + .max_uV = 3150000, + .valid_modes_mask = REGULATOR_MODE_NORMAL + | REGULATOR_MODE_STANDBY, + .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE + | REGULATOR_CHANGE_MODE + | REGULATOR_CHANGE_STATUS, + }, + .num_consumer_supplies = 1, + .consumer_supplies = &touchbook_vmmc1_supply, +}; + +/* VSIM for MMC1 pins DAT4..DAT7 (2 mA, plus card == max 50 mA) */ +static struct regulator_init_data touchbook_vsim = { + .constraints = { + .min_uV = 1800000, + .max_uV = 3000000, + .valid_modes_mask = REGULATOR_MODE_NORMAL + | REGULATOR_MODE_STANDBY, + .valid_ops_mask = REGULATOR_CHANGE_VOLTAGE + | REGULATOR_CHANGE_MODE + | REGULATOR_CHANGE_STATUS, + }, + .num_consumer_supplies = 1, + .consumer_supplies = &touchbook_vsim_supply, +}; + +/* VDAC for DSS driving S-Video (8 mA unloaded, max 65 mA) */ +static struct regulator_init_data touchbook_vdac = { + .constraints = { + .min_uV = 1800000, + .max_uV = 1800000, + .valid_modes_mask = REGULATOR_MODE_NORMAL + | REGULATOR_MODE_STANDBY, + .valid_ops_mask = REGULATOR_CHANGE_MODE + | REGULATOR_CHANGE_STATUS, + }, + .num_consumer_supplies = 1, + .consumer_supplies = &touchbook_vdac_supply, +}; + +/* VPLL2 for digital video outputs */ +static struct regulator_init_data touchbook_vpll2 = { + .constraints = { + .name = "VDVI", + .min_uV = 1800000, + .max_uV = 1800000, + .valid_modes_mask = REGULATOR_MODE_NORMAL + | REGULATOR_MODE_STANDBY, + .valid_ops_mask = REGULATOR_CHANGE_MODE + | REGULATOR_CHANGE_STATUS, + }, + .num_consumer_supplies = 1, + .consumer_supplies = &touchbook_vdvi_supply, +}; + +static const struct twl4030_resconfig touchbook_resconfig[] = { + /* disable regulators that u-boot left enabled; the + * devices' drivers should be managing these. + */ + { .resource = RES_VAUX3, }, /* not even connected! */ + { .resource = RES_VMMC1, }, + { .resource = RES_VSIM, }, + { .resource = RES_VPLL2, }, + { .resource = RES_VDAC, }, + { .resource = RES_VUSB_1V5, }, + { .resource = RES_VUSB_1V8, }, + { .resource = RES_VUSB_3V1, }, + { 0, }, +}; + +static struct twl4030_power_data touchbook_power_data = { + .resource_config = touchbook_resconfig, + /* REVISIT can't use GENERIC3430_T2SCRIPTS_DATA; + * among other things, it makes reboot fail. + */ +}; + +static struct twl4030_bci_platform_data touchbook_bci_data = { + .tblsize = 0, + .no_backup_battery = 1, +}; + +static struct twl4030_platform_data touchbook_twldata = { + .irq_base = TWL4030_IRQ_BASE, + .irq_end = TWL4030_IRQ_END, + + /* platform_data for children goes here */ + .usb = &touchbook_usb_data, + .gpio = &touchbook_gpio_data, + .power = &touchbook_power_data, + .vmmc1 = &touchbook_vmmc1, + .vsim = &touchbook_vsim, + .vdac = &touchbook_vdac, + .vpll2 = &touchbook_vpll2, + + /* TouchBook BCI */ + .bci = &touchbook_bci_data, +}; + +static struct i2c_board_info __initdata touchbook_i2c_boardinfo[] = { + { + I2C_BOARD_INFO("twl4030", 0x48), + .flags = I2C_CLIENT_WAKE, + .irq = INT_34XX_SYS_NIRQ, + .platform_data = &touchbook_twldata, + }, +}; + +static struct i2c_board_info __initdata touchBook_i2c_boardinfo[] = { + { + I2C_BOARD_INFO("bq27200", 0x55), + }, +}; + +static int __init omap3_touchbook_i2c_init(void) +{ + /* Standard TouchBook bus */ + omap_register_i2c_bus(1, 2600, touchbook_i2c_boardinfo, + ARRAY_SIZE(touchbook_i2c_boardinfo)); + + /* Additional TouchBook bus */ + 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; + } + + 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 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, //(void *) 161, + .irq = OMAP_GPIO_IRQ(OMAP3_TS_GPIO), + .platform_data = &ads7846_config, + } +}; + +static void __init omap3_touchbook_init_irq(void) +{ + omap2_init_common_hw(mt46h32m32lf6_sdrc_params, omap3_mpu_rate_table, + omap3_dsp_rate_table, omap3_l3_rate_table); + omap_init_irq(); + omap_gpio_init(); +} + +static struct gpio_led gpio_leds[] = { + { + .name = "touchbook::usr0", + .default_trigger = "heartbeat", + .gpio = 150, + }, + { + .name = "touchbook::usr1", + .default_trigger = "mmc0", + .gpio = 149, + }, + { + .name = "touchbook::pmu_stat", + .gpio = -EINVAL, /* gets replaced */ + .active_low = true, + }, +}; + +static struct gpio_led_platform_data gpio_led_info = { + .leds = gpio_leds, + .num_leds = ARRAY_SIZE(gpio_leds), +}; + +static struct platform_device leds_gpio = { + .name = "leds-gpio", + .id = -1, + .dev = { + .platform_data = &gpio_led_info, + }, +}; + +static struct gpio_keys_button gpio_buttons[] = { + { + .code = BTN_EXTRA, + .gpio = 7, + .desc = "user", + .wakeup = 1, + }, + { + .code = KEY_POWER, + .gpio = 183, + .desc = "power", + .wakeup = 1, + }, +}; + +static struct gpio_keys_platform_data gpio_key_info = { + .buttons = gpio_buttons, + .nbuttons = ARRAY_SIZE(gpio_buttons), +}; + +static struct platform_device keys_gpio = { + .name = "gpio-keys", + .id = -1, + .dev = { + .platform_data = &gpio_key_info, + }, +}; + +/* DSS */ + +static int touchbook_enable_dvi(struct omap_display *display) +{ + if (display->hw_config.panel_reset_gpio != -1) + gpio_set_value(display->hw_config.panel_reset_gpio, 1); + + return 0; +} + +static void touchbook_disable_dvi(struct omap_display *display) +{ + if (display->hw_config.panel_reset_gpio != -1) + gpio_set_value(display->hw_config.panel_reset_gpio, 0); +} + +static struct omap_dss_display_config touchbook_display_data_dvi = { + .type = OMAP_DISPLAY_TYPE_DPI, + .name = "dvi", + .panel_name = "panel-generic", + .u.dpi.data_lines = 24, + .panel_reset_gpio = 176, + .panel_enable = touchbook_enable_dvi, + .panel_disable = touchbook_disable_dvi, +}; + + +static int touchbook_panel_enable_tv(struct omap_display *display) +{ +#define ENABLE_VDAC_DEDICATED 0x03 +#define ENABLE_VDAC_DEV_GRP 0x20 + + twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, + ENABLE_VDAC_DEDICATED, + TWL4030_VDAC_DEDICATED); + twl4030_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_display *display) +{ + twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0x00, + TWL4030_VDAC_DEDICATED); + twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, 0x00, + TWL4030_VDAC_DEV_GRP); +} + +static struct omap_dss_display_config touchbook_display_data_tv = { + .type = OMAP_DISPLAY_TYPE_VENC, + .name = "tv", + .u.venc.type = OMAP_DSS_VENC_TYPE_SVIDEO, + .panel_enable = touchbook_panel_enable_tv, + .panel_disable = touchbook_panel_disable_tv, +}; + +static struct omap_dss_board_info touchbook_dss_data = { + .num_displays = 2, + .displays = { + &touchbook_display_data_dvi, + &touchbook_display_data_tv, + } +}; + +static struct platform_device touchbook_dss_device = { + .name = "omapdss", + .id = -1, + .dev = { + .platform_data = &touchbook_dss_data, + }, +}; + +static void __init touchbook_display_init(void) +{ + int r; + + r = gpio_request(touchbook_display_data_dvi.panel_reset_gpio, "DVI reset"); + if (r < 0) { + printk(KERN_ERR "Unable to get DVI reset GPIO\n"); + return; + } + + gpio_direction_output(touchbook_display_data_dvi.panel_reset_gpio, 0); +} + +static struct omap_board_config_kernel omap3_touchbook_config[] __initdata = { + { OMAP_TAG_UART, &omap3_touchbook_uart_config }, +}; + +static struct platform_device *omap3_touchbook_devices[] __initdata = { + &touchbook_dss_device, + &leds_gpio, + &keys_gpio, +}; + +static void __init omap3touchbook_flash_init(void) +{ + u8 cs = 0; + u8 nandcs = GPMC_CS_NUM + 1; + + u32 gpmc_base_add = OMAP34XX_GPMC_VIRT; + + /* find out the chip-select on which NAND exists */ + while (cs < GPMC_CS_NUM) { + u32 ret = 0; + ret = gpmc_cs_read_reg(cs, GPMC_CS_CONFIG1); + + if ((ret & 0xC00) == 0x800) { + printk(KERN_INFO "Found NAND on CS%d\n", cs); + if (nandcs > GPMC_CS_NUM) + nandcs = cs; + } + cs++; + } + + if (nandcs > GPMC_CS_NUM) { + printk(KERN_INFO "NAND: Unable to find configuration " + "in GPMC\n "); + return; + } + + if (nandcs < GPMC_CS_NUM) { + omap3touchbook_nand_data.cs = nandcs; + omap3touchbook_nand_data.gpmc_cs_baseaddr = (void *) + (gpmc_base_add + GPMC_CS0_BASE + nandcs * GPMC_CS_SIZE); + omap3touchbook_nand_data.gpmc_baseaddr = (void *) (gpmc_base_add); + + printk(KERN_INFO "Registering NAND on CS%d\n", nandcs); + if (platform_device_register(&omap3touchbook_nand_device) < 0) + printk(KERN_ERR "Unable to register NAND device\n"); + } +} + +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 struct mma7455l_platform_data mma7455l_config = { + .calibration_x = -4, //26 for Beagleboard + .calibration_y = 28, //44 for Beagleboard + .calibration_z = -28, //26 for Beagleboard +}; + +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 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. + */ + + /* Convert from 0-100 range to 0-140 range */ + value = (value * 14) / 10 / 2; + + /* For maximum brightness, just stop the timer... */ + if(value != bd->props.max_brightness) + { + omap_dm_timer_set_load(touchbook_backlight_pwm, 1, -164); + omap_dm_timer_set_match(touchbook_backlight_pwm, 1, -24 - value); + omap_dm_timer_write_counter(touchbook_backlight_pwm, -1); + //omap_dm_timer_stop(touchbook_backlight_pwm); + 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_32_KHZ); + 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; + + r = gpio_request(TB_KILL_POWER_GPIO, "DVI reset"); + if (r < 0) { + printk(KERN_ERR "Unable to get kill power GPIO\n"); + return; + } + + gpio_direction_output(TB_KILL_POWER_GPIO, 0); +} + +static void __init omap3_touchbook_init(void) +{ + pm_power_off = omap3_touchbook_poweroff; + + omap3_touchbook_i2c_init(); + platform_add_devices(omap3_touchbook_devices, + ARRAY_SIZE(omap3_touchbook_devices)); + omap_board_config = omap3_touchbook_config; + omap_board_config_size = ARRAY_SIZE(omap3_touchbook_config); + omap_serial_init(); + + omap_cfg_reg(J25_34XX_GPIO170); + + omap3touchbook_flash_init(); + touchbook_display_init(); + omap3_touchbook_backlight_init(); + + /* Touch Book */ + 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(); + + usb_musb_init(); + usb_ehci_init(); +} + +static void __init omap3_touchbook_map_io(void) +{ + omap2_set_globals_343x(); + omap2_map_common_io(); +} + +MACHINE_START(OMAP3_TOUCHBOOK, "OMAP3 Touch Book") + /* Maintainer: Gregoire Gentil - http://www.alwaysinnovating.com */ + .phys_io = 0x48000000, + .io_pg_offst = ((0xd8000000) >> 18) & 0xfffc, + .boot_params = 0x80000100, + .map_io = omap3_touchbook_map_io, + .init_irq = omap3_touchbook_init_irq, + .init_machine = omap3_touchbook_init, + .timer = &omap_timer, +MACHINE_END diff --git a/recipes/linux/linux-omap-pm-2.6.29/omap3-touchbook/boot-trace-for-optimization.patch b/recipes/linux/linux-omap-pm-2.6.29/omap3-touchbook/boot-trace-for-optimization.patch new file mode 100644 index 0000000000..fcb7ae480e --- /dev/null +++ b/recipes/linux/linux-omap-pm-2.6.29/omap3-touchbook/boot-trace-for-optimization.patch @@ -0,0 +1,251 @@ +commit e9c4f51ad2b76ddbf90863c44085574197247ba3 +Author: Auke Kok +Date: Tue Jan 27 11:26:00 2009 -0800 + + trace: tracer for sys_open() - sreadahead + + This tracer monitors regular file open() syscalls. This is a fast + and low-overhead alternative to strace, and does not allow or + require to be attached to every process. + + Signed-off-by: Auke Kok + +diff --git a/fs/open.c b/fs/open.c +index a3a78ce..bd9eb9d 100644 +--- a/fs/open.c ++++ b/fs/open.c +@@ -30,6 +30,10 @@ + #include + #include + ++#include ++ ++DEFINE_TRACE(do_sys_open); ++ + int vfs_statfs(struct dentry *dentry, struct kstatfs *buf) + { + int retval = -ENODEV; +@@ -1039,6 +1043,7 @@ long do_sys_open(int dfd, const char __user *filename, int flags, int mode) + } else { + fsnotify_open(f->f_path.dentry); + fd_install(fd, f); ++ trace_do_sys_open(f, flags, mode, fd); + } + } + putname(tmp); +diff --git a/include/trace/fs.h b/include/trace/fs.h +new file mode 100644 +index 0000000..870eec2 +--- /dev/null ++++ b/include/trace/fs.h +@@ -0,0 +1,11 @@ ++#ifndef _TRACE_FS_H ++#define _TRACE_FS_H ++ ++#include ++#include ++ ++DECLARE_TRACE(do_sys_open, ++ TPPROTO(struct file *filp, int flags, int mode, long fd), ++ TPARGS(filp, flags, mode, fd)); ++ ++#endif +diff --git a/kernel/trace/Kconfig b/kernel/trace/Kconfig +index e2a4ff6..d2a1ec1 100644 +--- a/kernel/trace/Kconfig ++++ b/kernel/trace/Kconfig +@@ -149,6 +149,15 @@ config CONTEXT_SWITCH_TRACER + This tracer gets called from the context switch and records + all switching of tasks. + ++config OPEN_TRACER ++ bool "Trace open() calls" ++ depends on DEBUG_KERNEL ++ select TRACING ++ select MARKERS ++ help ++ This tracer records open() syscalls. These calls are made when ++ files are accessed on disk. ++ + config BOOT_TRACER + bool "Trace boot initcalls" + depends on DEBUG_KERNEL +diff --git a/kernel/trace/Makefile b/kernel/trace/Makefile +index 349d5a9..7f2a366 100644 +--- a/kernel/trace/Makefile ++++ b/kernel/trace/Makefile +@@ -20,6 +20,7 @@ obj-$(CONFIG_RING_BUFFER) += ring_buffer.o + + obj-$(CONFIG_TRACING) += trace.o + obj-$(CONFIG_CONTEXT_SWITCH_TRACER) += trace_sched_switch.o ++obj-$(CONFIG_OPEN_TRACER) += trace_open.o + obj-$(CONFIG_SYSPROF_TRACER) += trace_sysprof.o + obj-$(CONFIG_FUNCTION_TRACER) += trace_functions.o + obj-$(CONFIG_IRQSOFF_TRACER) += trace_irqsoff.o +diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h +index 4d3d381..24c17d2 100644 +--- a/kernel/trace/trace.h ++++ b/kernel/trace/trace.h +@@ -30,6 +30,7 @@ enum trace_type { + TRACE_USER_STACK, + TRACE_HW_BRANCHES, + TRACE_POWER, ++ TRACE_OPEN, + + __TRACE_LAST_TYPE + }; +diff --git a/kernel/trace/trace_open.c b/kernel/trace/trace_open.c +new file mode 100644 +index 0000000..7153dfc +--- /dev/null ++++ b/kernel/trace/trace_open.c +@@ -0,0 +1,149 @@ ++/* ++ * trace open calls ++ * Copyright (C) 2009 Intel Corporation ++ * ++ * Based extensively on trace_sched_switch.c ++ * Copyright (C) 2007 Steven Rostedt ++ * ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include "trace.h" ++ ++ ++static struct trace_array *ctx_trace; ++static int __read_mostly open_trace_enabled; ++static atomic_t open_ref; ++ ++static void probe_do_sys_open(struct file *filp, int flags, int mode, long fd) ++{ ++ char *buf; ++ char *fname; ++ ++ if (!atomic_read(&open_ref)) ++ return; ++ ++ if (!open_trace_enabled) ++ return; ++ ++ buf = kzalloc(PAGE_SIZE, GFP_KERNEL); ++ if (!buf) ++ return; ++ ++ fname = d_path(&filp->f_path, buf, PAGE_SIZE); ++ if (IS_ERR(fname)) ++ goto out; ++ ++ ftrace_printk("%s: open(\"%s\", %d, %d) = %ld\n", ++ current->comm, fname, flags, mode, fd); ++ ++out: ++ kfree(buf); ++} ++ ++static void open_trace_reset(struct trace_array *tr) ++{ ++ tr->time_start = ftrace_now(tr->cpu); ++ tracing_reset_online_cpus(tr); ++} ++ ++static int open_trace_register(void) ++{ ++ int ret; ++ ++ ret = register_trace_do_sys_open(probe_do_sys_open); ++ if (ret) { ++ pr_info("open trace: Could not activate tracepoint" ++ " probe to do_open\n"); ++ } ++ ++ return ret; ++} ++ ++static void open_trace_unregister(void) ++{ ++ unregister_trace_do_sys_open(probe_do_sys_open); ++} ++ ++static void open_trace_start(void) ++{ ++ long ref; ++ ++ ref = atomic_inc_return(&open_ref); ++ if (ref == 1) ++ open_trace_register(); ++} ++ ++static void open_trace_stop(void) ++{ ++ long ref; ++ ++ ref = atomic_dec_and_test(&open_ref); ++ if (ref) ++ open_trace_unregister(); ++} ++ ++void open_trace_start_cmdline_record(void) ++{ ++ open_trace_start(); ++} ++ ++void open_trace_stop_cmdline_record(void) ++{ ++ open_trace_stop(); ++} ++ ++static void open_start_trace(struct trace_array *tr) ++{ ++ open_trace_reset(tr); ++ open_trace_start_cmdline_record(); ++ open_trace_enabled = 1; ++} ++ ++static void open_stop_trace(struct trace_array *tr) ++{ ++ open_trace_enabled = 0; ++ open_trace_stop_cmdline_record(); ++} ++ ++static int open_trace_init(struct trace_array *tr) ++{ ++ ctx_trace = tr; ++ ++ open_start_trace(tr); ++ return 0; ++} ++ ++static void reset_open_trace(struct trace_array *tr) ++{ ++ open_stop_trace(tr); ++} ++ ++static struct tracer open_trace __read_mostly = ++{ ++ .name = "open", ++ .init = open_trace_init, ++ .reset = reset_open_trace, ++}; ++ ++__init static int init_open_trace(void) ++{ ++ int ret = 0; ++ ++ if (atomic_read(&open_ref)) ++ ret = open_trace_register(); ++ if (ret) { ++ pr_info("error registering open trace\n"); ++ return ret; ++ } ++ return register_tracer(&open_trace); ++} ++device_initcall(init_open_trace); ++ diff --git a/recipes/linux/linux-omap-pm-2.6.29/omap3-touchbook/dss2-fix-rotation-offsets.patch b/recipes/linux/linux-omap-pm-2.6.29/omap3-touchbook/dss2-fix-rotation-offsets.patch new file mode 100644 index 0000000000..959110bc1d --- /dev/null +++ b/recipes/linux/linux-omap-pm-2.6.29/omap3-touchbook/dss2-fix-rotation-offsets.patch @@ -0,0 +1,54 @@ +--- a/drivers/video/omap2/omapfb/omapfb-main.c ++++ b/drivers/video/omap2/omapfb/omapfb-main.c +@@ -661,13 +661,15 @@ + u32 data_start_p; + void __iomem *data_start_v; + struct omap_overlay_info info; +- int xres, yres; ++ int xres, yres, xoff, yoff; + int screen_width; + int mirror; + + DBG("setup_overlay %d, posx %d, posy %d, outw %d, outh %d\n", ofbi->id, + posx, posy, outw, outh); + ++ xoff = var->xoffset; ++ yoff = var->yoffset; + if (ofbi->rotation == FB_ROTATE_CW || ofbi->rotation == FB_ROTATE_CCW) { + xres = var->yres; + yres = var->xres; +@@ -676,8 +678,32 @@ + yres = var->yres; + } + +- offset = ((var->yoffset * var->xres_virtual + +- var->xoffset) * var->bits_per_pixel) >> 3; ++ if (ofbi->rotation == FB_ROTATE_CW || ofbi->rotation == FB_ROTATE_UD) { ++ if (var->yres < var->yres_virtual) { ++ if (var->yoffset) ++ yoff = 0; ++ else ++ yoff = var->yres_virtual - var->yres; ++ } ++ } ++ ++ if (ofbi->rotation == FB_ROTATE_CCW || ofbi->rotation == FB_ROTATE_UD) { ++ if (var->xres < var->xres_virtual) { ++ if (var->xoffset) ++ xoff = 0; ++ else ++ xoff = var->xres_virtual - var->xres; ++ } ++ } ++ ++ if (ofbi->rotation == FB_ROTATE_CW || ofbi->rotation == FB_ROTATE_CCW) { ++ offset = ((xoff * fix->line_length) >> 1) + ++ ((yoff * var->bits_per_pixel) >> 2); ++ } else ++ { ++ offset = yoff * fix->line_length + ++ ((xoff * var->bits_per_pixel) >> 3); ++ } + + if (ofbi->rotation_type == OMAP_DSS_ROT_VRFB) { + data_start_p = omapfb_get_region_rot_paddr(ofbi); diff --git a/recipes/linux/linux-omap-pm-2.6.29/omap3-touchbook/ehci.patch b/recipes/linux/linux-omap-pm-2.6.29/omap3-touchbook/ehci.patch index 5a8c84471b..89ab133fa2 100644 --- a/recipes/linux/linux-omap-pm-2.6.29/omap3-touchbook/ehci.patch +++ b/recipes/linux/linux-omap-pm-2.6.29/omap3-touchbook/ehci.patch @@ -1,26 +1,3 @@ -Index: git/arch/arm/mach-omap2/board-omap3beagle.c -=================================================================== ---- git.orig/arch/arm/mach-omap2/board-omap3beagle.c -+++ git/arch/arm/mach-omap2/board-omap3beagle.c -@@ -154,6 +154,7 @@ static int beagle_twl_gpio_setup(struct - * power switch and overcurrent detect - */ - -+#if 0 /* TODO: This needs to be modified to not rely on u-boot */ - gpio_request(gpio + 1, "EHCI_nOC"); - gpio_direction_input(gpio + 1); - -@@ -163,7 +164,7 @@ static int beagle_twl_gpio_setup(struct - - /* TWL4030_GPIO_MAX + 1 == ledB, PMU_STAT (out, active low LED) */ - gpio_leds[2].gpio = gpio + TWL4030_GPIO_MAX + 1; -- -+#endif - return 0; - } - -Index: git/arch/arm/mach-omap2/usb-ehci.c -=================================================================== --- git.orig/arch/arm/mach-omap2/usb-ehci.c +++ git/arch/arm/mach-omap2/usb-ehci.c @@ -147,9 +147,11 @@ static void setup_ehci_io_mux(void) @@ -43,7 +20,7 @@ Index: git/drivers/usb/host/ehci-omap.c * to get the PHY state machine in working state */ #define EXTERNAL_PHY_RESET -+#ifdef CONFIG_MACH_OMAP3_BEAGLE ++#ifdef CONFIG_MACH_OMAP3_TOUCHBOOK +#define EXT_PHY_RESET_GPIO_PORT2 (147) +#else #define EXT_PHY_RESET_GPIO_PORT1 (57) @@ -59,7 +36,7 @@ Index: git/drivers/usb/host/ehci-omap.c * Use the VBUS from Port1 to power VBUS of Port2 externally * So use Port2 as the working ULPI port */ -+#ifndef CONFIG_MACH_OMAP3_BEAGLE ++#ifndef CONFIG_MACH_OMAP3_TOUCHBOOK #define VBUS_INTERNAL_CHARGEPUMP_HACK +#endif @@ -69,7 +46,7 @@ Index: git/drivers/usb/host/ehci-omap.c #ifdef EXTERNAL_PHY_RESET /* Refer: ISSUE1 */ -+#ifndef CONFIG_MACH_OMAP3_BEAGLE ++#ifndef CONFIG_MACH_OMAP3_TOUCHBOOK gpio_request(EXT_PHY_RESET_GPIO_PORT1, "USB1 PHY reset"); gpio_direction_output(EXT_PHY_RESET_GPIO_PORT1, 0); +#endif @@ -113,7 +90,7 @@ Index: git/drivers/usb/host/ehci-omap.c * Hold the PHY in RESET for enough time till PHY is settled and ready */ udelay(EXT_PHY_RESET_DELAY); -+#ifndef CONFIG_MACH_OMAP3_BEAGLE ++#ifndef CONFIG_MACH_OMAP3_TOUCHBOOK gpio_set_value(EXT_PHY_RESET_GPIO_PORT1, 1); +#endif gpio_set_value(EXT_PHY_RESET_GPIO_PORT2, 1); @@ -123,7 +100,7 @@ Index: git/drivers/usb/host/ehci-omap.c #ifdef EXTERNAL_PHY_RESET -+#ifndef CONFIG_MACH_OMAP3_BEAGLE ++#ifndef CONFIG_MACH_OMAP3_TOUCHBOOK gpio_free(EXT_PHY_RESET_GPIO_PORT1); +#endif gpio_free(EXT_PHY_RESET_GPIO_PORT2); diff --git a/recipes/linux/linux-omap-pm-2.6.29/omap3-touchbook/keyboard-special-keys.patch b/recipes/linux/linux-omap-pm-2.6.29/omap3-touchbook/keyboard-special-keys.patch new file mode 100644 index 0000000000..030de12261 --- /dev/null +++ b/recipes/linux/linux-omap-pm-2.6.29/omap3-touchbook/keyboard-special-keys.patch @@ -0,0 +1,244 @@ +--- a/drivers/hid/Kconfig ++++ b/drivers/hid/Kconfig +@@ -89,6 +89,13 @@ config HID_A4TECH + ---help--- + Support for A4 tech X5 and WOP-35 / Trust 450L mice. + ++config HID_AI ++ tristate "Always Innovating" if EMBEDDED ++ depends on USB_HID ++ default !EMBEDDED ++ ---help--- ++ Support for Always Innovating Touch Book. ++ + config HID_APPLE + tristate "Apple" if EMBEDDED + depends on (USB_HID || BT_HIDP) +diff --git a/drivers/hid/Makefile b/drivers/hid/Makefile +index fbd021f..88c0ead 100644 +--- a/drivers/hid/Makefile ++++ b/drivers/hid/Makefile +@@ -21,6 +21,7 @@ ifdef CONFIG_LOGIRUMBLEPAD2_FF + endif + + obj-$(CONFIG_HID_A4TECH) += hid-a4tech.o ++obj-$(CONFIG_HID_AI) += hid-ai.o + obj-$(CONFIG_HID_APPLE) += hid-apple.o + obj-$(CONFIG_HID_BELKIN) += hid-belkin.o + obj-$(CONFIG_HID_CHERRY) += hid-cherry.o +diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c +index 1cc9674..84b580e 100644 +--- a/drivers/hid/hid-core.c ++++ b/drivers/hid/hid-core.c +@@ -1222,6 +1222,7 @@ EXPORT_SYMBOL_GPL(hid_connect); + static const struct hid_device_id hid_blacklist[] = { + { HID_USB_DEVICE(USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_WCP32PU) }, + { HID_USB_DEVICE(USB_VENDOR_ID_A4TECH, USB_DEVICE_ID_A4TECH_X5_005D) }, ++ { HID_USB_DEVICE(USB_VENDOR_ID_AI, USB_DEVICE_ID_AI_TOUCH_BOOK) }, + { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ATV_IRCONTROL) }, + { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IRCONTROL4) }, + { HID_USB_DEVICE(USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_MIGHTYMOUSE) }, +diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h +index 8851197..3d6fe8e 100644 +--- a/drivers/hid/hid-ids.h ++++ b/drivers/hid/hid-ids.h +@@ -54,6 +54,9 @@ + #define USB_VENDOR_ID_ALPS 0x0433 + #define USB_DEVICE_ID_IBM_GAMEPAD 0x1101 + ++#define USB_VENDOR_ID_AI 0xa110 ++#define USB_DEVICE_ID_AI_TOUCH_BOOK 0x0002 ++ + #define USB_VENDOR_ID_APPLE 0x05ac + #define USB_DEVICE_ID_APPLE_MIGHTYMOUSE 0x0304 + #define USB_DEVICE_ID_APPLE_FOUNTAIN_ANSI 0x020e +--- a/drivers/hid/hid-ai.c 2009-07-15 08:30:35.000000000 -0700 ++++ b/drivers/hid/hid-ai.c 2009-09-04 21:58:06.000000000 -0700 +@@ -0,0 +1,187 @@ ++/* ++ * USB HID quirks support for the Always Innovating Touch Book ++ * Code borrowed from hid-apple.c ++ * ++ * Copyright (c) 2009 Tim Yamin ++ */ ++ ++/* ++ * This program is free software; you can redistribute it and/or modify it ++ * under the terms of the GNU General Public License as published by the Free ++ * Software Foundation; either version 2 of the License, or (at your option) ++ * any later version. ++ */ ++ ++#include ++#include ++#include ++#include ++ ++#include "hid-ids.h" ++ ++struct ai_sc { ++ unsigned long quirks; ++ unsigned int fn_on; ++ DECLARE_BITMAP(pressed_fn, KEY_CNT); ++}; ++ ++struct ai_key_translation { ++ u16 from; ++ u16 to; ++ u8 flags; ++}; ++ ++static struct ai_key_translation ai_fn_keys[] = { ++ { KEY_F6, KEY_BRIGHTNESSDOWN }, ++ { KEY_F7, KEY_BRIGHTNESSUP }, ++ ++ { KEY_F8, KEY_MUTE }, ++ { KEY_F9, KEY_VOLUMEDOWN }, ++ { KEY_F10, KEY_VOLUMEUP }, ++ ++ { KEY_UP, KEY_PAGEUP }, ++ { KEY_DOWN, KEY_PAGEDOWN }, ++ { } ++}; ++ ++static struct ai_key_translation *ai_find_translation( ++ struct ai_key_translation *table, u16 from) ++{ ++ struct ai_key_translation *trans; ++ ++ /* Look for the translation */ ++ for (trans = table; trans->from; trans++) ++ if (trans->from == from) ++ return trans; ++ ++ return NULL; ++} ++ ++static int ai_event(struct hid_device *hid, struct hid_field *field, ++ struct hid_usage *usage, __s32 value) ++{ ++ int do_translate; ++ ++ struct input_dev *input = field->hidinput->input; ++ struct ai_sc *asc = hid_get_drvdata(hid); ++ struct ai_key_translation *trans; ++ ++ if (usage->code == KEY_POWER) { ++ asc->fn_on = !!value; ++ input_event(input, usage->type, usage->code, value); ++ return 1; ++ } ++ ++ trans = ai_find_translation(ai_fn_keys, usage->code); ++ if (trans) { ++ if (test_bit(usage->code, asc->pressed_fn)) ++ do_translate = 1; ++ else ++ do_translate = asc->fn_on; ++ ++ if (do_translate) { ++ if (value) ++ set_bit(usage->code, asc->pressed_fn); ++ else ++ clear_bit(usage->code, asc->pressed_fn); ++ ++ input_event(input, usage->type, trans->to, ++ value); ++ ++ return 1; ++ } ++ } ++ ++ return 0; ++} ++ ++static int ai_input_mapping(struct hid_device *hdev, struct hid_input *hi, ++ struct hid_field *field, struct hid_usage *usage, ++ unsigned long **bit, int *max) ++{ ++ struct ai_key_translation *trans; ++ ++ /* Enable all other keys */ ++ for (trans = ai_fn_keys; trans->from; trans++) ++ set_bit(trans->to, hi->input->keybit); ++ ++ return 0; ++} ++ ++static int ai_probe(struct hid_device *hdev, ++ const struct hid_device_id *id) ++{ ++ unsigned long quirks = id->driver_data; ++ struct ai_sc *asc; ++ unsigned int connect_mask = HID_CONNECT_DEFAULT; ++ int ret; ++ ++ asc = kzalloc(sizeof(*asc), GFP_KERNEL); ++ if (asc == NULL) { ++ dev_err(&hdev->dev, "can't alloc ai descriptor\n"); ++ return -ENOMEM; ++ } ++ ++ asc->quirks = quirks; ++ hid_set_drvdata(hdev, asc); ++ ++ ret = hid_parse(hdev); ++ if (ret) { ++ dev_err(&hdev->dev, "parse failed\n"); ++ goto err_free; ++ } ++ ++ ret = hid_hw_start(hdev, connect_mask); ++ if (ret) { ++ dev_err(&hdev->dev, "hw start failed\n"); ++ goto err_free; ++ } ++ ++ return 0; ++err_free: ++ kfree(asc); ++ return ret; ++} ++ ++static void ai_remove(struct hid_device *hdev) ++{ ++ hid_hw_stop(hdev); ++ kfree(hid_get_drvdata(hdev)); ++} ++ ++static const struct hid_device_id ai_devices[] = { ++ { HID_USB_DEVICE(USB_VENDOR_ID_AI, USB_DEVICE_ID_AI_TOUCH_BOOK) }, ++ { } ++}; ++ ++MODULE_DEVICE_TABLE(hid, ai_devices); ++ ++static struct hid_driver ai_driver = { ++ .name = "ai", ++ .id_table = ai_devices, ++ .probe = ai_probe, ++ .remove = ai_remove, ++ .event = ai_event, ++ .input_mapping = ai_input_mapping, ++}; ++ ++static int ai_init(void) ++{ ++ int ret; ++ ++ ret = hid_register_driver(&ai_driver); ++ if (ret) ++ printk(KERN_ERR "can't register ai driver\n"); ++ ++ return ret; ++} ++ ++static void ai_exit(void) ++{ ++ hid_unregister_driver(&ai_driver); ++} ++ ++module_init(ai_init); ++module_exit(ai_exit); ++MODULE_LICENSE("GPL"); ++HID_COMPAT_LOAD_DRIVER(ai); diff --git a/recipes/linux/linux-omap-pm-2.6.29/omap3-touchbook/touchbook-config.patch b/recipes/linux/linux-omap-pm-2.6.29/omap3-touchbook/touchbook-config.patch new file mode 100644 index 0000000000..1482bf666d --- /dev/null +++ b/recipes/linux/linux-omap-pm-2.6.29/omap3-touchbook/touchbook-config.patch @@ -0,0 +1,60 @@ +--- a/arch/arm/mach-omap2/Kconfig 2009-10-13 15:19:17.000000000 -0700 ++++ b/arch/arm/mach-omap2/Kconfig 2009-10-13 15:19:51.000000000 -0700 +@@ -137,3 +137,9 @@ + config MACH_OMAP3_PANDORA + bool "OMAP3 Pandora" + depends on ARCH_OMAP3 && ARCH_OMAP34XX ++ ++config MACH_OMAP3_TOUCHBOOK ++ bool "OMAP3 Touch Book" ++ depends on ARCH_OMAP3 && ARCH_OMAP34XX ++ select BACKLIGHT_CLASS_DEVICE ++ +--- a/arch/arm/mach-omap2/Makefile 2009-10-13 15:22:26.000000000 -0700 ++++ b/arch/arm/mach-omap2/Makefile 2009-10-13 15:21:10.000000000 -0700 +@@ -87,6 +87,9 @@ + twl4030-generic-scripts.o + obj-$(CONFIG_MACH_OMAP3_PANDORA) += board-omap3pandora.o \ + mmc-twl4030.o ++obj-$(CONFIG_MACH_OMAP3_TOUCHBOOK) += board-omap3touchbook.o \ ++ mmc-twl4030.o \ ++ twl4030-generic-scripts.o + + # Platform specific device init code + obj-$(CONFIG_USB_MUSB_SOC) += usb-musb.o +--- a/sound/soc/omap/Makefile 2009-10-15 21:07:27.000000000 +0200 ++++ b/sound/soc/omap/Makefile 2009-10-15 21:09:18.000000000 +0200 +@@ -13,6 +13,7 @@ + snd-soc-sdp3430-objs := sdp3430.o + snd-soc-omap3pandora-objs := omap3pandora.o + snd-soc-omap3beagle-objs := omap3beagle.o ++snd-soc-omap3touchbook-objs := omap3beagle.o + + obj-$(CONFIG_SND_OMAP_SOC_N810) += snd-soc-n810.o + obj-$(CONFIG_SND_OMAP_SOC_OSK5912) += snd-soc-osk5912.o +@@ -21,3 +22,4 @@ + obj-$(CONFIG_SND_OMAP_SOC_SDP3430) += snd-soc-sdp3430.o + obj-$(CONFIG_SND_OMAP_SOC_OMAP3_PANDORA) += snd-soc-omap3pandora.o + obj-$(CONFIG_SND_OMAP_SOC_OMAP3_BEAGLE) += snd-soc-omap3beagle.o ++obj-$(CONFIG_SND_OMAP_SOC_OMAP3_TOUCHBOOK) += snd-soc-omap3beagle.o +--- a/sound/soc/omap/Kconfig 2009-10-15 21:07:35.000000000 +0200 ++++ b/sound/soc/omap/Kconfig 2009-10-15 21:08:24.000000000 +0200 +@@ -64,4 +64,11 @@ + help + Say Y if you want to add support for SoC audio on the Beagleboard. + ++config SND_OMAP_SOC_OMAP3_TOUCHBOOK ++ tristate "SoC Audio support for OMAP3 Touch Book" ++ depends on TWL4030_CORE && SND_OMAP_SOC && MACH_OMAP3_TOUCHBOOK ++ select SND_OMAP_SOC_MCBSP ++ select SND_SOC_TWL4030 ++ help ++ Say Y if you want to add support for SoC audio on the Touch Book. + +--- a/arch/arm/tools/mach-types 2009-10-16 08:22:36.000000000 +0800 ++++ b/arch/arm/tools/mach-types 2009-10-16 08:23:13.000000000 +0800 +@@ -2124,3 +2124,4 @@ + fmzwebmodul MACH_FMZWEBMODUL FMZWEBMODUL 2134 + rd78x00_masa MACH_RD78X00_MASA RD78X00_MASA 2135 + smallogger MACH_SMALLOGGER SMALLOGGER 2136 ++omap3_touchbook MACH_OMAP3_TOUCHBOOK OMAP3_TOUCHBOOK 2393 diff --git a/recipes/linux/linux-omap-pm_2.6.29.bb b/recipes/linux/linux-omap-pm_2.6.29.bb index b635f2154f..1c7f778a66 100644 --- a/recipes/linux/linux-omap-pm_2.6.29.bb +++ b/recipes/linux/linux-omap-pm_2.6.29.bb @@ -165,8 +165,8 @@ SRC_URI_append_beagleboard = " file://logo_linux_clut224.ppm \ file://tincantools-zippy.diff;patch=1 \ " -SRC_URI_append_omap3-touchbook = " \ - file://beagle-asoc.patch;patch=1 \ +SRC_URI_append_omap3-touchbook = " file://logo_linux_clut224.ppm \ + file://../beagleboard/beagle-asoc.patch;patch=1 \ file://accelerometer-mma7455l.patch;patch=1 \ file://accelerometer-touchscreen-mux-spi.patch;patch=1 \ file://touchscreen-ads7846-export-settings.patch;patch=1 \ @@ -175,7 +175,6 @@ SRC_URI_append_omap3-touchbook = " \ file://battery2-bq27200-no-error-message.patch;patch=1 \ file://sound-headphone-detection.patch;patch=1 \ file://dss2-fix-XY-coordinates-when-rotating.patch;patch=1 \ - file://screen-backlight.patch;patch=1 \ file://battery1-tps65950-charging-management-1.patch;patch=1 \ file://dss2-fix-scaling-when-rotating.patch;patch=1 \ file://dss2-export-status.patch;patch=1 \ @@ -191,19 +190,30 @@ SRC_URI_append_omap3-touchbook = " \ file://boot-no-power-message.patch;patch=1 \ file://usb-lower-current-consumption-upon-insertion.patch;patch=1 \ file://battery2-bq27200-gpio-charged.patch;patch=1 \ - file://board-omap3beagle.c \ + file://keyboard-special-keys.patch;patch=1 \ + file://dss2-fix-rotation-offsets.patch;patch=1 \ + file://touchbook-config.patch;patch=1 \ + file://board-omap3touchbook.c \ +# file://boot-trace-for-optimization.patch;patch=1 \ " -do_configure_prepend_omap3-touchbook() { - cp ${WORKDIR}/board-omap3beagle.c ${S}/arch/arm/mach-omap2 -} - SRC_URI_append_omap3evm = " \ file://evm-mcspi-ts.diff;patch=1 \ " S = "${WORKDIR}/git" +do_configure_prepend_omap3-touchbook() { + cp ${WORKDIR}/board-omap3touchbook.c ${S}/arch/arm/mach-omap2 +} + +do_install_append() { + install -d ${D}/boot + install -m 0644 Documentation/arm/OMAP/DSS ${D}/boot || true +} + +PACKAGES =+ "omap-dss-doc" +FILES_omap-dss-doc = "/boot/DSS" module_autoload_ohci-hcd_omap5912osk = "ohci-hcd" -- cgit 1.2.3-korg