Hello! Is there any special support needed for 3621, though? My understanding is that's just 3630 without a "phone" part? The .29 kernel they had only added is_omap3621 stuff that's not called anywhere, but smartreflex code (I guess that's might be useful to add too of course). I know about the new code drop is coming, but I don't expect there to be any basic stuff changes (and this board file is coming pretty barebones right now), besides I am not so optimistic to actually expect this patch to be merged right away, but I am already gathering valuable feedback. ;) BTW I saw in the archives that you are also working a port, do you have your tree hosted anywhere? Bye, Oleg On Apr 28, 2011, at 7:34 PM, Abimanyu Gottumukkala wrote: > Hi, > > Nook color has Ti OMAP 3621. 3621 CPU Support is not available in > current kernel, adding CPU support will be nice before board. > BN is set to release new source code in few days, taking new code as > porting base is also recommended. > > Regards, > Abimanyu G > > On Thu, Apr 28, 2011 at 9:27 PM, <green@xxxxxxxxxxxxxx> wrote: >> From: Oleg Drokin <green@xxxxxxxxxxxxxx> >> >> Bare-bones board file, comes with serial console, gpio keys, >> MMC/SDCard and USB support. >> --- >> arch/arm/mach-omap2/Kconfig | 5 + >> arch/arm/mach-omap2/Makefile | 2 + >> arch/arm/mach-omap2/board-omap3encore.c | 380 ++++++++++++++++++++++++++ >> arch/arm/plat-omap/include/plat/uncompress.h | 1 + >> arch/arm/tools/mach-types | 2 +- >> 5 files changed, 389 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 512b152..b894777 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..c7bf8de >> --- /dev/null >> +++ b/arch/arm/mach-omap2/board-omap3encore.c >> @@ -0,0 +1,380 @@ >> +/* >> + * >> + * Copyright (C) 2008 Texas Instruments Inc. >> + * Vikram Pandita <vikram.pandita@xxxxxx> >> + * >> + * Modified from mach-omap2/board-ldp.c >> + * >> + * 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. >> + * >> + * April 2011 Oleg Drokin <green@xxxxxxxxxxxxxx> - 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 <mach/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(0, 0, KEY_HOME), >> + KEY(0, 1, KEY_VOLUMEUP), >> + KEY(0, 2, KEY_VOLUMEDOWN), >> + 0 >> +}; >> + >> +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[] = { >> +}; >> + >> + >> +static struct omap_musb_board_data musb_board_data = { >> + .interface_type = MUSB_INTERFACE_ULPI, >> +#ifdef CONFIG_USB_MUSB_OTG >> + .mode = MUSB_OTG, >> +#elif defined(CONFIG_USB_MUSB_HDRC_HCD) >> + .mode = MUSB_HOST, >> +#elif defined(CONFIG_USB_GADGET_MUSB_HDRC) >> + .mode = MUSB_PERIPHERAL, >> +#endif >> + .power = 100, >> +}; >> + >> +#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(&musb_board_data); >> + >> + 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 >> -- >> 1.7.4.4 >> >> -- >> To unsubscribe from this list: send the line "unsubscribe linux-omap" in >> the body of a message to majordomo@xxxxxxxxxxxxxxx >> More majordomo info at http://vger.kernel.org/majordomo-info.html >> -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html