diff options
9 files changed, 1414 insertions, 38 deletions
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 <linux/kernel.h> +#include <linux/init.h> +#include <linux/platform_device.h> +#include <linux/delay.h> +#include <linux/err.h> +#include <linux/clk.h> +#include <linux/io.h> +#include <linux/leds.h> +#include <linux/gpio.h> +#include <linux/input.h> +#include <linux/gpio_keys.h> + +#include <linux/mtd/mtd.h> +#include <linux/mtd/partitions.h> +#include <linux/mtd/nand.h> + +#include <mach/mcspi.h> +#include <linux/spi/spi.h> +#include <linux/spi/ads7846.h> +#include <linux/mma7455l.h> + +#include <mach/dmtimer.h> +#include <linux/backlight.h> + +#include <linux/regulator/machine.h> +#include <linux/i2c/twl4030.h> +#include <linux/omapfb.h> + +#include <mach/hardware.h> +#include <asm/mach-types.h> +#include <asm/mach/arch.h> +#include <asm/mach/map.h> +#include <asm/mach/flash.h> + +#include <mach/board.h> +#include <mach/usb.h> +#include <mach/common.h> +#include <mach/gpmc.h> +#include <mach/nand.h> +#include <mach/mux.h> +#include <mach/omap-pm.h> +#include <mach/clock.h> +#include <mach/display.h> + + +#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 <auke-jan.h.kok@intel.com> +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 <auke-jan.h.kok@intel.com> + +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 <linux/audit.h> + #include <linux/falloc.h> + ++#include <trace/fs.h> ++ ++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 <linux/fs.h> ++#include <linux/tracepoint.h> ++ ++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 <srostedt@redhat.com> ++ * ++ */ ++ ++#include <linux/module.h> ++#include <linux/fs.h> ++#include <linux/debugfs.h> ++#include <linux/kallsyms.h> ++#include <linux/uaccess.h> ++#include <linux/ftrace.h> ++#include <trace/fs.h> ++ ++#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 ( |
