Message ID | 1304891407-29364-2-git-send-email-green@linuxhacker.ru (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Hi Oleg, On 05/09/11 00:50, green@linuxhacker.ru wrote: > From: Oleg Drokin <green@linuxhacker.ru> > > Bare-bones board file, comes with serial console, gpio keys, > MMC/SDCard and USB support. > > Signed-off-by: Oleg Drokin <green@linuxhacker.ru> > --- In general, here you should write the version history of your patch... > arch/arm/mach-omap2/Kconfig | 5 + > arch/arm/mach-omap2/Makefile | 2 + > arch/arm/mach-omap2/board-omap3encore.c | 363 ++++++++++++++++++++++++++ > arch/arm/plat-omap/include/plat/uncompress.h | 1 + > arch/arm/tools/mach-types | 2 +- > 5 files changed, 372 insertions(+), 1 deletions(-) > create mode 100644 arch/arm/mach-omap2/board-omap3encore.c > > diff --git a/arch/arm/mach-omap2/Kconfig b/arch/arm/mach-omap2/Kconfig > index b997a35..5370561 100644 > --- a/arch/arm/mach-omap2/Kconfig > +++ b/arch/arm/mach-omap2/Kconfig > @@ -173,6 +173,11 @@ config MACH_OMAP3_TORPEDO > for full description please see the products webpage at > http://www.logicpd.com/products/development-kits/zoom-omap35x-torpedo-development-kit > > +config MACH_ENCORE > + bool "Barnes & Noble Encore (Nook Color)" > + depends on ARCH_OMAP3 > + select OMAP_PACKAGE_CBP > + > config MACH_OVERO > bool "Gumstix Overo board" > depends on ARCH_OMAP3 > diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile > index a0c2cae..619e5ca 100644 > --- a/arch/arm/mach-omap2/Makefile > +++ b/arch/arm/mach-omap2/Makefile > @@ -189,6 +189,8 @@ obj-$(CONFIG_MACH_OMAP3530_LV_SOM) += board-omap3logic.o \ > hsmmc.o > obj-$(CONFIG_MACH_OMAP3_TORPEDO) += board-omap3logic.o \ > hsmmc.o > +obj-$(CONFIG_MACH_ENCORE) += board-omap3encore.o \ > + hsmmc.o > obj-$(CONFIG_MACH_OVERO) += board-overo.o \ > hsmmc.o > obj-$(CONFIG_MACH_OMAP3EVM) += board-omap3evm.o \ > diff --git a/arch/arm/mach-omap2/board-omap3encore.c b/arch/arm/mach-omap2/board-omap3encore.c > new file mode 100644 > index 0000000..6c044c0 > --- /dev/null > +++ b/arch/arm/mach-omap2/board-omap3encore.c > @@ -0,0 +1,363 @@ > +/* > + * Support for Barns&Noble Nook Color > + * > + * Loosely based on mach-omap2/board-zoom.c > + * Copyright (C) 2008-2010 Texas Instruments Inc. > + * > + * 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. > + * > + * May 2011 Oleg Drokin <green@linuxhacker.ru> - Port to 2.6.39 > + * > + */ > + > +#include <linux/kernel.h> > +#include <linux/platform_device.h> > +#include <linux/gpio_keys.h> > +#include <linux/err.h> > + > +#include <linux/spi/spi.h> > +#include <linux/i2c/twl.h> > +#include <linux/regulator/machine.h> > +#include <linux/regulator/fixed.h> > +#include <mach/hardware.h> > +#include <asm/mach-types.h> > +#include <asm/mach/arch.h> > + > +#include <linux/gpio.h> > +#include <plat/board.h> > +#include <plat/common.h> > +#include <plat/usb.h> > +#include <plat/mux.h> > +#include <plat/sram.h> > +#include <plat/mmc.h> > +#include <plat/omap-serial.h> > +#include <plat/system.h> > + > +#include "mux.h" > +#include "hsmmc.h" > +#include "sdram-hynix-h8mbx00u0mer-0em.h" Are all the above includes needed? (spi? maybe some others) > + > +/* Encore-specific device-info and i2c addresses. */ > +/* Battery, bus 1 */ > +#define MAX17042_I2C_SLAVE_ADDRESS 0x36 > +#define MAX17042_GPIO_FOR_IRQ 100 > + > +/*addition of MAXIM8903/TI GPIO mapping WRT schematics */ > +#define MAX8903_UOK_GPIO_FOR_IRQ 115 > +#define MAX8903_DOK_GPIO_FOR_IRQ 114 > +#define MAX8903_GPIO_CHG_EN 110 > +#define MAX8903_GPIO_CHG_STATUS 111 > +#define MAX8903_GPIO_CHG_FLT 101 > +#define MAX8903_GPIO_CHG_IUSB 102 > +#define MAX8903_GPIO_CHG_USUS 104 > +#define MAX8903_GPIO_CHG_ILM 61 > + > +/* TI WLAN */ > +#define ENCORE_WIFI_PMENA_GPIO 22 > +#define ENCORE_WIFI_IRQ_GPIO 15 > +#define ENCORE_WIFI_EN_POW 16 > + > +/* Accelerometer i2c bus 1*/ > +#define KXTF9_I2C_SLAVE_ADDRESS 0x0F > +#define KXTF9_GPIO_FOR_PWR 34 > +#define KXTF9_GPIO_FOR_IRQ 113 > + > +/* Touch screen i2c bus 2*/ > +#define CYTTSP_I2C_SLAVEADDRESS 34 > +#define ENCORE_CYTTSP_GPIO 99 > +#define ENCORE_CYTTSP_RESET_GPIO 46 > + > +/* Audio codec, i2c bus 2 */ > +#define AUDIO_CODEC_POWER_ENABLE_GPIO 103 > +#define AUDIO_CODEC_RESET_GPIO 37 > +#define AUDIO_CODEC_IRQ_GPIO 59 > +#define AIC3100_I2CSLAVEADDRESS 0x18 > + > + > +/* Different HW revisions */ > +#define BOARD_ENCORE_REV_EVT1A 0x1 > +#define BOARD_ENCORE_REV_EVT1B 0x2 > +#define BOARD_ENCORE_REV_EVT2 0x3 > +#define BOARD_ENCORE_REV_DVT 0x4 > +#define BOARD_ENCORE_REV_PVT 0x5 > +#define BOARD_ENCORE_REV_UNKNOWN 0x6 > + > +static inline int is_encore_board_evt2(void) > +{ > + return (system_rev >= BOARD_ENCORE_REV_EVT2); No need for parentheses > +} > + > +static inline int is_encore_board_evt1b(void) > +{ > + return (system_rev == BOARD_ENCORE_REV_EVT1B); ditto > +} > + > +static int encore_twl4030_keymap[] = { > + KEY(1, 0, KEY_VOLUMEUP), > + KEY(2, 0, KEY_VOLUMEDOWN), > +}; > + > +static struct matrix_keymap_data encore_twl4030_keymap_data = { > + .keymap = encore_twl4030_keymap, > + .keymap_size = ARRAY_SIZE(encore_twl4030_keymap), > +}; > + > +static struct twl4030_keypad_data encore_kp_twl4030_data = { > + .rows = 8, > + .cols = 8, > + .keymap_data = &encore_twl4030_keymap_data, > + .rep = 1, > +}; > + > +/* HOME key code for HW > EVT2A */ > +static struct gpio_keys_button encore_gpio_buttons[] = { > + { > + .code = KEY_POWER, > + .gpio = 14, > + .desc = "POWER", > + .active_low = 0, > + .wakeup = 1, > + }, > + { > + .code = KEY_HOME, > + .gpio = 48, > + .desc = "HOME", > + .active_low = 1, > + .wakeup = 1, > + }, > +}; > + > +static struct gpio_keys_platform_data encore_gpio_key_info = { > + .buttons = encore_gpio_buttons, > + .nbuttons = ARRAY_SIZE(encore_gpio_buttons), > +}; > + > +static struct platform_device encore_keys_gpio = { > + .name = "gpio-keys", > + .id = -1, > + .dev = { > + .platform_data = &encore_gpio_key_info, > + }, > +}; > + > +static struct platform_device *encore_devices[] __initdata = { > + &encore_keys_gpio, > +}; > + > +static void __init omap_encore_init_early(void) > +{ > + omap2_init_common_infrastructure(); > + omap2_init_common_devices(h8mbx00u0mer0em_sdrc_params, > + h8mbx00u0mer0em_sdrc_params); > +} > + > +static struct twl4030_usb_data encore_usb_data = { > + .usb_mode = T2_USB_MODE_ULPI, > +}; > + > +static struct regulator_consumer_supply encore_vmmc1_supply = { > + .supply = "vmmc", > +}; > + > +static struct regulator_consumer_supply encore_vdda_dac_supply = > + REGULATOR_SUPPLY("vdda_dac", "omapdss_venc"); > + > +/* VMMC1 for OMAP VDD_MMC1 (i/o) and MMC1 card */ > +static struct regulator_init_data encore_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 = &encore_vmmc1_supply, > +}; > + > +static struct regulator_init_data encore_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 = &encore_vdda_dac_supply, > +}; > + > +/* The order is reverted in this table so that internal eMMC is presented > + * as first mmc card for compatibility with existing installations and > + * for common sense reasons */ /* * */ > +static struct omap2_hsmmc_info mmc[] __initdata = { > + { > + .name = "internal", > + .mmc = 2, > + .caps = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA, > + .gpio_cd = -EINVAL, > + .gpio_wp = -EINVAL, > + .nonremovable = true, > + .power_saving = true, > + .ocr_mask = MMC_VDD_165_195, /* 1.85V */ > + }, > + { > + .name = "external", > + .mmc = 1, > + .caps = MMC_CAP_4_BIT_DATA, > + .gpio_cd = -EINVAL, > + .gpio_wp = -EINVAL, > + .power_saving = true, > + }, > + { > + .name = "internal", > + .mmc = 3, > + .caps = MMC_CAP_4_BIT_DATA, > + .gpio_cd = -EINVAL, > + .gpio_wp = -EINVAL, > + .nonremovable = true, > + .power_saving = true, > + }, > + {} /* Terminator */ > +}; > + > +static int encore_hsmmc_card_detect(struct device *dev, int slot) > +{ > + struct omap_mmc_platform_data *mmc = dev->platform_data; > + > + /* Encore board EVT2 and later has pin high when card is present) */ parentheses? > + return gpio_get_value_cansleep(mmc->slots[0].switch_pin); > +} > + > +static int encore_twl4030_hsmmc_late_init(struct device *dev) > +{ > + int ret = 0; > + struct platform_device *pdev = container_of(dev, > + struct platform_device, dev); > + struct omap_mmc_platform_data *pdata = dev->platform_data; > + > + if (is_encore_board_evt2()) { > + /* Setting MMC1 (external) Card detect */ > + if (pdev->id == 0) > + pdata->slots[0].card_detect = encore_hsmmc_card_detect; > + } empty line here would be nice > + return ret; > +} > + > +static __init void encore_hsmmc_set_late_init(struct device *dev) > +{ > + struct omap_mmc_platform_data *pdata; > + > + /* dev can be null if CONFIG_MMC_OMAP_HS is not set */ > + if (!dev) > + return; > + > + pdata = dev->platform_data; > + pdata->init = encore_twl4030_hsmmc_late_init; > +} > + > +static int __ref encore_twl_gpio_setup(struct device *dev, > + unsigned gpio, unsigned ngpio) > +{ > + struct omap2_hsmmc_info *c; > + /* > + * gpio + 0 is "mmc0_cd" (input/IRQ), > + * gpio + 1 is "mmc1_cd" (input/IRQ) > + */ > + mmc[1].gpio_cd = gpio + 0; > + mmc[0].gpio_cd = gpio + 1; > + omap2_hsmmc_init(mmc); > + for (c = mmc; c->mmc; c++) > + encore_hsmmc_set_late_init(c->dev); > + > + /* > + * link regulators to MMC adapters ... we "know" the > + * regulators will be set up only *after* we return. > + */ > + encore_vmmc1_supply.dev = mmc[1].dev; > + > + return 0; > +} > + > +static struct twl4030_gpio_platform_data encore_gpio_data = { > + .gpio_base = OMAP_MAX_GPIO_LINES, > + .irq_base = TWL4030_GPIO_IRQ_BASE, > + .irq_end = TWL4030_GPIO_IRQ_END, > + .setup = encore_twl_gpio_setup, > +}; > + > +static struct twl4030_madc_platform_data encore_madc_data = { > + .irq_line = 1, > +}; > + > +static struct twl4030_platform_data __refdata encore_twldata = { > + .irq_base = TWL4030_IRQ_BASE, > + .irq_end = TWL4030_IRQ_END, > + > + .madc = &encore_madc_data, > + .usb = &encore_usb_data, > + .gpio = &encore_gpio_data, > + .keypad = &encore_kp_twl4030_data, > + .vmmc1 = &encore_vmmc1, > + .vdac = &encore_vdac, > +}; > + > +static struct i2c_board_info __initdata encore_i2c_bus1_info[] = { > + { > + I2C_BOARD_INFO("tps65921", 0x48), > + .flags = I2C_CLIENT_WAKE, > + .irq = INT_34XX_SYS_NIRQ, > + .platform_data = &encore_twldata, > + }, > +}; > + > +static struct i2c_board_info __initdata encore_i2c_bus2_info[] = { > +}; > + > +#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 omap_board_config_kernel encore_config[] __initdata = { > +}; > + > +static int __init omap_i2c_init(void) You always return 0 here and you don't check the return value, why not make it void and remove the return statement? > +{ > + omap_register_i2c_bus(1, 100, encore_i2c_bus1_info, > + ARRAY_SIZE(encore_i2c_bus1_info)); > + omap_register_i2c_bus(2, 400, encore_i2c_bus2_info, > + ARRAY_SIZE(encore_i2c_bus2_info)); > + return 0; > +} > + > +static void __init omap_encore_init(void) > +{ > + omap3_mux_init(board_mux, OMAP_PACKAGE_CBB); You select CBP package in Kconfig, but pass CBB here? > + omap_i2c_init(); > + omap_serial_init(); > + usb_musb_init(NULL); > + > + omap_board_config = encore_config; > + omap_board_config_size = ARRAY_SIZE(encore_config); > + > + platform_add_devices(encore_devices, ARRAY_SIZE(encore_devices)); > +} > + > +MACHINE_START(ENCORE, "encore") > + .boot_params = 0x80000100, > + .reserve = omap_reserve, > + .map_io = omap3_map_io, > + .init_early = omap_encore_init_early, > + .init_irq = omap_init_irq, > + .init_machine = omap_encore_init, > + .timer = &omap_timer, > +MACHINE_END > diff --git a/arch/arm/plat-omap/include/plat/uncompress.h b/arch/arm/plat-omap/include/plat/uncompress.h > index 30b891c..f2de4ff 100644 > --- a/arch/arm/plat-omap/include/plat/uncompress.h > +++ b/arch/arm/plat-omap/include/plat/uncompress.h > @@ -161,6 +161,7 @@ static inline void __arch_decomp_setup(unsigned long arch_id) > DEBUG_LL_OMAP3(3, omap_ldp); > DEBUG_LL_OMAP3(3, overo); > DEBUG_LL_OMAP3(3, touchbook); > + DEBUG_LL_OMAP3(3, encore); Please, keep it sorted by mach name > > /* omap4 based boards using UART3 */ > DEBUG_LL_OMAP4(3, omap_4430sdp); > diff --git a/arch/arm/tools/mach-types b/arch/arm/tools/mach-types > index 7ca41f0..2f0db3e 100644 > --- a/arch/arm/tools/mach-types > +++ b/arch/arm/tools/mach-types > @@ -962,7 +962,7 @@ omapl138_case_a3 MACH_OMAPL138_CASE_A3 OMAPL138_CASE_A3 3280 > uemd MACH_UEMD UEMD 3281 > ccwmx51mut MACH_CCWMX51MUT CCWMX51MUT 3282 > rockhopper MACH_ROCKHOPPER ROCKHOPPER 3283 > -nookcolor MACH_NOOKCOLOR NOOKCOLOR 3284 > +encore MACH_ENCORE ENCORE 3284 > hkdkc100 MACH_HKDKC100 HKDKC100 3285 > ts42xx MACH_TS42XX TS42XX 3286 > aebl MACH_AEBL AEBL 3287 You should contact Russell for this kind of stuff. I don't think you should be patching it directly... If you want to tell us that your patch should be applied with this change to mach-types, then it would be better to make a separate patch for it and describe it in your cover letter.
On Sun, May 08, 2011 at 05:50:06PM -0400, green@linuxhacker.ru wrote: > + /* > + * link regulators to MMC adapters ... we "know" the > + * regulators will be set up only *after* we return. > + */ > + encore_vmmc1_supply.dev = mmc[1].dev; Just specify dev_name in the supply rather than doing this. -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Hello! On May 9, 2011, at 3:03 AM, Igor Grinberg wrote: >> Bare-bones board file, comes with serial console, gpio keys, >> MMC/SDCard and USB support. >> >> Signed-off-by: Oleg Drokin <green@linuxhacker.ru> >> --- > > In general, here you should write the version history of your patch... umm, ok. Do you think the history of the changes is important in this case, though? I mean it's mostly the case of "kill unneeded includes, fix style, fix incorrect mux package type" and so on. Nothing of real interest to anybody. >> +static void __init omap_encore_init(void) >> +{ >> + omap3_mux_init(board_mux, OMAP_PACKAGE_CBB); > > You select CBP package in Kconfig, but pass CBB here? Ah, indeed, thanks for catching this. >> -nookcolor MACH_NOOKCOLOR NOOKCOLOR 3284 >> +encore MACH_ENCORE ENCORE 3284 >> hkdkc100 MACH_HKDKC100 HKDKC100 3285 >> ts42xx MACH_TS42XX TS42XX 3286 >> aebl MACH_AEBL AEBL 3287 > > You should contact Russell for this kind of stuff. Yes, I already did. I am carrying it as part of the patch so that it's actually buildable while awaiting for the decision. > I don't think you should be patching it directly... > If you want to tell us that your patch should be applied with this > change to mach-types, then it would be better to make a separate > patch for it and describe it in your cover letter. Hm, ok. Thanks for the feedback. Bye, Oleg-- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On 05/13/11 06:52, Oleg Drokin wrote: > Hello! > > On May 9, 2011, at 3:03 AM, Igor Grinberg wrote: > >>> Bare-bones board file, comes with serial console, gpio keys, >>> MMC/SDCard and USB support. >>> >>> Signed-off-by: Oleg Drokin <green@linuxhacker.ru> >>> --- >> In general, here you should write the version history of your patch... > umm, ok. > Do you think the history of the changes is important in this case, though? > I mean it's mostly the case of "kill unneeded includes, fix style, fix incorrect mux package type" and so on. > Nothing of real interest to anybody. It can help everybody (also yourself), for example, the fact that you already contacted Russell regarding mach-types (though the better place for it is cover letter) could help me to not wonder why do you have this stuff here.
diff --git a/arch/arm/mach-omap2/Kconfig b/arch/arm/mach-omap2/Kconfig index b997a35..5370561 100644 --- a/arch/arm/mach-omap2/Kconfig +++ b/arch/arm/mach-omap2/Kconfig @@ -173,6 +173,11 @@ config MACH_OMAP3_TORPEDO for full description please see the products webpage at http://www.logicpd.com/products/development-kits/zoom-omap35x-torpedo-development-kit +config MACH_ENCORE + bool "Barnes & Noble Encore (Nook Color)" + depends on ARCH_OMAP3 + select OMAP_PACKAGE_CBP + config MACH_OVERO bool "Gumstix Overo board" depends on ARCH_OMAP3 diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile index a0c2cae..619e5ca 100644 --- a/arch/arm/mach-omap2/Makefile +++ b/arch/arm/mach-omap2/Makefile @@ -189,6 +189,8 @@ obj-$(CONFIG_MACH_OMAP3530_LV_SOM) += board-omap3logic.o \ hsmmc.o obj-$(CONFIG_MACH_OMAP3_TORPEDO) += board-omap3logic.o \ hsmmc.o +obj-$(CONFIG_MACH_ENCORE) += board-omap3encore.o \ + hsmmc.o obj-$(CONFIG_MACH_OVERO) += board-overo.o \ hsmmc.o obj-$(CONFIG_MACH_OMAP3EVM) += board-omap3evm.o \ diff --git a/arch/arm/mach-omap2/board-omap3encore.c b/arch/arm/mach-omap2/board-omap3encore.c new file mode 100644 index 0000000..6c044c0 --- /dev/null +++ b/arch/arm/mach-omap2/board-omap3encore.c @@ -0,0 +1,363 @@ +/* + * Support for Barns&Noble Nook Color + * + * Loosely based on mach-omap2/board-zoom.c + * Copyright (C) 2008-2010 Texas Instruments Inc. + * + * 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. + * + * May 2011 Oleg Drokin <green@linuxhacker.ru> - Port to 2.6.39 + * + */ + +#include <linux/kernel.h> +#include <linux/platform_device.h> +#include <linux/gpio_keys.h> +#include <linux/err.h> + +#include <linux/spi/spi.h> +#include <linux/i2c/twl.h> +#include <linux/regulator/machine.h> +#include <linux/regulator/fixed.h> +#include <mach/hardware.h> +#include <asm/mach-types.h> +#include <asm/mach/arch.h> + +#include <linux/gpio.h> +#include <plat/board.h> +#include <plat/common.h> +#include <plat/usb.h> +#include <plat/mux.h> +#include <plat/sram.h> +#include <plat/mmc.h> +#include <plat/omap-serial.h> +#include <plat/system.h> + +#include "mux.h" +#include "hsmmc.h" +#include "sdram-hynix-h8mbx00u0mer-0em.h" + +/* Encore-specific device-info and i2c addresses. */ +/* Battery, bus 1 */ +#define MAX17042_I2C_SLAVE_ADDRESS 0x36 +#define MAX17042_GPIO_FOR_IRQ 100 + +/*addition of MAXIM8903/TI GPIO mapping WRT schematics */ +#define MAX8903_UOK_GPIO_FOR_IRQ 115 +#define MAX8903_DOK_GPIO_FOR_IRQ 114 +#define MAX8903_GPIO_CHG_EN 110 +#define MAX8903_GPIO_CHG_STATUS 111 +#define MAX8903_GPIO_CHG_FLT 101 +#define MAX8903_GPIO_CHG_IUSB 102 +#define MAX8903_GPIO_CHG_USUS 104 +#define MAX8903_GPIO_CHG_ILM 61 + +/* TI WLAN */ +#define ENCORE_WIFI_PMENA_GPIO 22 +#define ENCORE_WIFI_IRQ_GPIO 15 +#define ENCORE_WIFI_EN_POW 16 + +/* Accelerometer i2c bus 1*/ +#define KXTF9_I2C_SLAVE_ADDRESS 0x0F +#define KXTF9_GPIO_FOR_PWR 34 +#define KXTF9_GPIO_FOR_IRQ 113 + +/* Touch screen i2c bus 2*/ +#define CYTTSP_I2C_SLAVEADDRESS 34 +#define ENCORE_CYTTSP_GPIO 99 +#define ENCORE_CYTTSP_RESET_GPIO 46 + +/* Audio codec, i2c bus 2 */ +#define AUDIO_CODEC_POWER_ENABLE_GPIO 103 +#define AUDIO_CODEC_RESET_GPIO 37 +#define AUDIO_CODEC_IRQ_GPIO 59 +#define AIC3100_I2CSLAVEADDRESS 0x18 + + +/* Different HW revisions */ +#define BOARD_ENCORE_REV_EVT1A 0x1 +#define BOARD_ENCORE_REV_EVT1B 0x2 +#define BOARD_ENCORE_REV_EVT2 0x3 +#define BOARD_ENCORE_REV_DVT 0x4 +#define BOARD_ENCORE_REV_PVT 0x5 +#define BOARD_ENCORE_REV_UNKNOWN 0x6 + +static inline int is_encore_board_evt2(void) +{ + return (system_rev >= BOARD_ENCORE_REV_EVT2); +} + +static inline int is_encore_board_evt1b(void) +{ + return (system_rev == BOARD_ENCORE_REV_EVT1B); +} + +static int encore_twl4030_keymap[] = { + KEY(1, 0, KEY_VOLUMEUP), + KEY(2, 0, KEY_VOLUMEDOWN), +}; + +static struct matrix_keymap_data encore_twl4030_keymap_data = { + .keymap = encore_twl4030_keymap, + .keymap_size = ARRAY_SIZE(encore_twl4030_keymap), +}; + +static struct twl4030_keypad_data encore_kp_twl4030_data = { + .rows = 8, + .cols = 8, + .keymap_data = &encore_twl4030_keymap_data, + .rep = 1, +}; + +/* HOME key code for HW > EVT2A */ +static struct gpio_keys_button encore_gpio_buttons[] = { + { + .code = KEY_POWER, + .gpio = 14, + .desc = "POWER", + .active_low = 0, + .wakeup = 1, + }, + { + .code = KEY_HOME, + .gpio = 48, + .desc = "HOME", + .active_low = 1, + .wakeup = 1, + }, +}; + +static struct gpio_keys_platform_data encore_gpio_key_info = { + .buttons = encore_gpio_buttons, + .nbuttons = ARRAY_SIZE(encore_gpio_buttons), +}; + +static struct platform_device encore_keys_gpio = { + .name = "gpio-keys", + .id = -1, + .dev = { + .platform_data = &encore_gpio_key_info, + }, +}; + +static struct platform_device *encore_devices[] __initdata = { + &encore_keys_gpio, +}; + +static void __init omap_encore_init_early(void) +{ + omap2_init_common_infrastructure(); + omap2_init_common_devices(h8mbx00u0mer0em_sdrc_params, + h8mbx00u0mer0em_sdrc_params); +} + +static struct twl4030_usb_data encore_usb_data = { + .usb_mode = T2_USB_MODE_ULPI, +}; + +static struct regulator_consumer_supply encore_vmmc1_supply = { + .supply = "vmmc", +}; + +static struct regulator_consumer_supply encore_vdda_dac_supply = + REGULATOR_SUPPLY("vdda_dac", "omapdss_venc"); + +/* VMMC1 for OMAP VDD_MMC1 (i/o) and MMC1 card */ +static struct regulator_init_data encore_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 = &encore_vmmc1_supply, +}; + +static struct regulator_init_data encore_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 = &encore_vdda_dac_supply, +}; + +/* The order is reverted in this table so that internal eMMC is presented + * as first mmc card for compatibility with existing installations and + * for common sense reasons */ +static struct omap2_hsmmc_info mmc[] __initdata = { + { + .name = "internal", + .mmc = 2, + .caps = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA, + .gpio_cd = -EINVAL, + .gpio_wp = -EINVAL, + .nonremovable = true, + .power_saving = true, + .ocr_mask = MMC_VDD_165_195, /* 1.85V */ + }, + { + .name = "external", + .mmc = 1, + .caps = MMC_CAP_4_BIT_DATA, + .gpio_cd = -EINVAL, + .gpio_wp = -EINVAL, + .power_saving = true, + }, + { + .name = "internal", + .mmc = 3, + .caps = MMC_CAP_4_BIT_DATA, + .gpio_cd = -EINVAL, + .gpio_wp = -EINVAL, + .nonremovable = true, + .power_saving = true, + }, + {} /* Terminator */ +}; + +static int encore_hsmmc_card_detect(struct device *dev, int slot) +{ + struct omap_mmc_platform_data *mmc = dev->platform_data; + + /* Encore board EVT2 and later has pin high when card is present) */ + return gpio_get_value_cansleep(mmc->slots[0].switch_pin); +} + +static int encore_twl4030_hsmmc_late_init(struct device *dev) +{ + int ret = 0; + struct platform_device *pdev = container_of(dev, + struct platform_device, dev); + struct omap_mmc_platform_data *pdata = dev->platform_data; + + if (is_encore_board_evt2()) { + /* Setting MMC1 (external) Card detect */ + if (pdev->id == 0) + pdata->slots[0].card_detect = encore_hsmmc_card_detect; + } + return ret; +} + +static __init void encore_hsmmc_set_late_init(struct device *dev) +{ + struct omap_mmc_platform_data *pdata; + + /* dev can be null if CONFIG_MMC_OMAP_HS is not set */ + if (!dev) + return; + + pdata = dev->platform_data; + pdata->init = encore_twl4030_hsmmc_late_init; +} + +static int __ref encore_twl_gpio_setup(struct device *dev, + unsigned gpio, unsigned ngpio) +{ + struct omap2_hsmmc_info *c; + /* + * gpio + 0 is "mmc0_cd" (input/IRQ), + * gpio + 1 is "mmc1_cd" (input/IRQ) + */ + mmc[1].gpio_cd = gpio + 0; + mmc[0].gpio_cd = gpio + 1; + omap2_hsmmc_init(mmc); + for (c = mmc; c->mmc; c++) + encore_hsmmc_set_late_init(c->dev); + + /* + * link regulators to MMC adapters ... we "know" the + * regulators will be set up only *after* we return. + */ + encore_vmmc1_supply.dev = mmc[1].dev; + + return 0; +} + +static struct twl4030_gpio_platform_data encore_gpio_data = { + .gpio_base = OMAP_MAX_GPIO_LINES, + .irq_base = TWL4030_GPIO_IRQ_BASE, + .irq_end = TWL4030_GPIO_IRQ_END, + .setup = encore_twl_gpio_setup, +}; + +static struct twl4030_madc_platform_data encore_madc_data = { + .irq_line = 1, +}; + +static struct twl4030_platform_data __refdata encore_twldata = { + .irq_base = TWL4030_IRQ_BASE, + .irq_end = TWL4030_IRQ_END, + + .madc = &encore_madc_data, + .usb = &encore_usb_data, + .gpio = &encore_gpio_data, + .keypad = &encore_kp_twl4030_data, + .vmmc1 = &encore_vmmc1, + .vdac = &encore_vdac, +}; + +static struct i2c_board_info __initdata encore_i2c_bus1_info[] = { + { + I2C_BOARD_INFO("tps65921", 0x48), + .flags = I2C_CLIENT_WAKE, + .irq = INT_34XX_SYS_NIRQ, + .platform_data = &encore_twldata, + }, +}; + +static struct i2c_board_info __initdata encore_i2c_bus2_info[] = { +}; + +#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 omap_board_config_kernel encore_config[] __initdata = { +}; + +static int __init omap_i2c_init(void) +{ + omap_register_i2c_bus(1, 100, encore_i2c_bus1_info, + ARRAY_SIZE(encore_i2c_bus1_info)); + omap_register_i2c_bus(2, 400, encore_i2c_bus2_info, + ARRAY_SIZE(encore_i2c_bus2_info)); + return 0; +} + +static void __init omap_encore_init(void) +{ + omap3_mux_init(board_mux, OMAP_PACKAGE_CBB); + omap_i2c_init(); + omap_serial_init(); + usb_musb_init(NULL); + + omap_board_config = encore_config; + omap_board_config_size = ARRAY_SIZE(encore_config); + + platform_add_devices(encore_devices, ARRAY_SIZE(encore_devices)); +} + +MACHINE_START(ENCORE, "encore") + .boot_params = 0x80000100, + .reserve = omap_reserve, + .map_io = omap3_map_io, + .init_early = omap_encore_init_early, + .init_irq = omap_init_irq, + .init_machine = omap_encore_init, + .timer = &omap_timer, +MACHINE_END diff --git a/arch/arm/plat-omap/include/plat/uncompress.h b/arch/arm/plat-omap/include/plat/uncompress.h index 30b891c..f2de4ff 100644 --- a/arch/arm/plat-omap/include/plat/uncompress.h +++ b/arch/arm/plat-omap/include/plat/uncompress.h @@ -161,6 +161,7 @@ static inline void __arch_decomp_setup(unsigned long arch_id) DEBUG_LL_OMAP3(3, omap_ldp); DEBUG_LL_OMAP3(3, overo); DEBUG_LL_OMAP3(3, touchbook); + DEBUG_LL_OMAP3(3, encore); /* omap4 based boards using UART3 */ DEBUG_LL_OMAP4(3, omap_4430sdp); diff --git a/arch/arm/tools/mach-types b/arch/arm/tools/mach-types index 7ca41f0..2f0db3e 100644 --- a/arch/arm/tools/mach-types +++ b/arch/arm/tools/mach-types @@ -962,7 +962,7 @@ omapl138_case_a3 MACH_OMAPL138_CASE_A3 OMAPL138_CASE_A3 3280 uemd MACH_UEMD UEMD 3281 ccwmx51mut MACH_CCWMX51MUT CCWMX51MUT 3282 rockhopper MACH_ROCKHOPPER ROCKHOPPER 3283 -nookcolor MACH_NOOKCOLOR NOOKCOLOR 3284 +encore MACH_ENCORE ENCORE 3284 hkdkc100 MACH_HKDKC100 HKDKC100 3285 ts42xx MACH_TS42XX TS42XX 3286 aebl MACH_AEBL AEBL 3287