Skip to contentSkip to conversation

Add support for OMAP3Stalker boards

PATCH Superseded Jason 2 participants 5 messages Mar 3, 2010 – May 17, 2010

Subsystems (3)
lore
Share & tools
lore

Jason

author
#0 lore raw

PATCH 1/1 Add support for OMAP3Stalker boards

This patche add omap3 board support for the EMA-Tech StalkerBoards. Base on TI's EVM.

Quoted 1 line

From ca9879de445ffa8063e79f43a715712eca9b335f Mon Sep 17 00:00:00 2001

From: Jason Lam <[email protected]>
Date: Wed, 3 Mar 2010 10:04:36 +0800
Subject: [PATCH] Add support for OMAP3Stalker boards

---
 arch/arm/mach-omap2/Kconfig              |   20 +
 arch/arm/mach-omap2/Makefile             |    2 +
 arch/arm/mach-omap2/board-omap3stalker.c |  922
++++++++++++++++++++++++++++++
 3 files changed, 944 insertions(+), 0 deletions(-)
 create mode 100644 arch/arm/mach-omap2/board-omap3stalker.c
arch/arm/mach-omap2/Kconfig +20 -0
index a8a3d1e..50386c8 100644
@@ -82,6 +82,26 @@ config MACH_OMAP3517EVM
 	depends on ARCH_OMAP3
 	select OMAP_PACKAGE_CBB
 
+config MACH_SBC3530
+	bool "OMAP3 SBC STALKER board"
+	depends on ARCH_OMAP3
+
+choice
+	prompt STALKER_BOARD_TYPE
+	depends on MACH_SBC3530
+	default STALKER_EVM
+
+config STALKER_BOARD_TYPE_EVM
+	bool "Stalker EVM board"
+	help
+	  Select this option if you have a Stalker EVM board
+
+config STALKER_BOARD_TYPE_LK_S
+	bool "Stalker LK-S board"
+	help
+	  Select this option if you have a Stalker LK-S board
+endchoice
+
 config MACH_OMAP3_PANDORA
 	bool "OMAP3 Pandora"
 	depends on ARCH_OMAP3
arch/arm/mach-omap2/Makefile +2 -0
index 2069fb3..51cfe4b 100644
@@ -110,6 +110,8 @@ obj-$(CONFIG_MACH_OVERO)		+= board-overo.o \
 					   hsmmc.o
 obj-$(CONFIG_MACH_OMAP3EVM)		+= board-omap3evm.o \
 					   hsmmc.o
+obj-$(CONFIG_MACH_SBC3530)		+= board-omap3stalker.o \
+					   hsmmc.o
 obj-$(CONFIG_MACH_OMAP3_PANDORA)	+= board-omap3pandora.o \
 					   hsmmc.o
 obj-$(CONFIG_MACH_OMAP_3430SDP)		+= board-3430sdp.o \
(quoted diff) +0 -0

b/arch/arm/mach-omap2/board-omap3stalker.c
new file mode 100644
index 0000000..bb70b46

arch/arm/mach-omap2/board-omap3stalker.c new file +461 -0

461 lines not on this page · raw message

mA) */
+static struct regulator_init_data omap3stalker_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 = &omap3stalker_vmmc1_supply,
+};
+
+/* VSIM for MMC1 pins DAT4..DAT7 (2 mA, plus card == max 50 mA) */ +static struct regulator_init_data omap3stalker_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 = &omap3stalker_vsim_supply,
+};
+
+static struct omap2_hsmmc_info mmc[] = {
+ {
+ .mmc = 1,
+ .wires = 4,
+ .gpio_cd = -EINVAL,
+ .gpio_wp = 23,
+ },
+ {} /* Terminator */
+};
+
+#if defined(CONFIG_STALKER_BOARD_TYPE_LK_S)
+static struct gpio_keys_button gpio_buttons[] = {
+ {
+ .code = BTN_EXTRA,
+ .gpio = 18,
+ .desc = "user",
+ .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,
+ },
+};
+#endif
+
+static struct gpio_led gpio_leds[] = {
+#if defined(CONFIG_STALKER_BOARD_TYPE_EVM)
+
+#elif defined(CONFIG_STALKER_BOARD_TYPE_LK_S)
+ {
+ .name = "stalker:D8:usr0",
+ .default_trigger = "default-on",
+ .gpio = 126,
+ },
+ {
+ .name = "stalker:D9:usr1",
+ .default_trigger = "default-on",
+ .gpio = 127,
+ },
+ {
+ .name = "stalker:D3:mmc0",
+ .gpio = -EINVAL, /* gets replaced */
+ .active_low = true,
+ .default_trigger = "mmc0",
+ },
+ {
+ .name = "stalker:D4:heartbeat",
+ .gpio = -EINVAL, /* gets replaced */
+ .active_low = true,
+ .default_trigger = "heartbeat",
+ },
+#endif
+};
+
+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 int
+omap3stalker_twl_gpio_setup(struct device *dev,
+ unsigned gpio, unsigned ngpio)
+{
+ /* gpio + 0 is "mmc0_cd" (input/IRQ) */
+ omap_mux_init_gpio(23, OMAP_PIN_INPUT);
+ mmc[0].gpio_cd = gpio + 0;
+ omap2_hsmmc_init(mmc);
+
+ /* link regulators to MMC adapters */
+ omap3stalker_vmmc1_supply.dev = mmc[0].dev;
+ omap3stalker_vsim_supply.dev = mmc[0].dev;
+
+ /*
+ * Most GPIOs are for USB OTG. Some are mostly sent to
+ * the P2 connector; notably LEDA for the LCD backlight.
+ */
+
+ /* TWL4030_GPIO_MAX + 0 == ledA, LCD Backlight control */
+ gpio_request(gpio + TWL4030_GPIO_MAX, "EN_LCD_BKL");
+ gpio_direction_output(gpio + TWL4030_GPIO_MAX, 0);
+
+ /* gpio + 7 == DVI Enable */
+ gpio_request(gpio + 7, "EN_DVI");
+ gpio_direction_output(gpio + 7, 0);
+
+#if defined(CONFIG_STALKER_BOARD_TYPE_EVM)
+#elif defined(CONFIG_STALKER_BOARD_TYPE_LK_S)
+ /* TWL4030_GPIO_MAX + 1 == ledB (out, mmc0) */
+ gpio_leds[2].gpio = gpio + TWL4030_GPIO_MAX + 1;
+ /* GPIO + 13 == ledsync (out, heartbeat) */
+ gpio_leds[3].gpio = gpio + 13;
+#endif
+ platform_device_register(&leds_gpio);
+
+ return 0;
+}
+
+static struct twl4030_gpio_platform_data omap3stalker_gpio_data = {
+ .gpio_base = OMAP_MAX_GPIO_LINES,
+ .irq_base = TWL4030_GPIO_IRQ_BASE,
+ .irq_end = TWL4030_GPIO_IRQ_END,
+ .use_leds = true,
+ .setup = omap3stalker_twl_gpio_setup,
+};
+
+static struct twl4030_usb_data omap3stalker_usb_data = {
+ .usb_mode = T2_USB_MODE_ULPI,
+};
+
+static int board_keymap[] = {
+ KEY(0, 0, KEY_LEFT),
+ KEY(0, 1, KEY_DOWN),
+ KEY(0, 2, KEY_ENTER),
+ KEY(0, 3, KEY_M),
+
+ KEY(1, 0, KEY_RIGHT),
+ KEY(1, 1, KEY_UP),
+ KEY(1, 2, KEY_I),
+ KEY(1, 3, KEY_N),
+
+ KEY(2, 0, KEY_A),
+ KEY(2, 1, KEY_E),
+ KEY(2, 2, KEY_J),
+ KEY(2, 3, KEY_O),
+
+ KEY(3, 0, KEY_B),
+ KEY(3, 1, KEY_F),
+ KEY(3, 2, KEY_K),
+ KEY(3, 3, KEY_P)
+};
+
+static struct matrix_keymap_data board_map_data = {
+ .keymap = board_keymap,
+ .keymap_size = ARRAY_SIZE(board_keymap),
+};
+
+static struct twl4030_keypad_data omap3stalker_kp_data = {
+ .keymap_data = &board_map_data,
+ .rows = 4,
+ .cols = 4,
+ .rep = 1,
+};
+
+static struct twl4030_madc_platform_data omap3stalker_madc_data = {
+ .irq_line = 1,
+};
+
+static struct twl4030_codec_audio_data omap3stalker_audio_data = {
+ .audio_mclk = 26000000,
+};
+
+static struct twl4030_codec_data omap3stalker_codec_data = {
+ .audio_mclk = 26000000,
+ .audio = &omap3stalker_audio_data,
+};
+
+static struct regulator_consumer_supply omap3_stalker_vdda_dac_supply = {
+ .supply = "vdda_dac",
+ .dev = &omap3_stalker_dss_device.dev,
+};
+
+/* VDAC for DSS driving S-Video */
+static struct regulator_init_data omap3_stalker_vdac = {
+ .constraints = {
+ .min_uV = 1800000,
+ .max_uV = 1800000,
+ .apply_uV = true,
+ .valid_modes_mask = REGULATOR_MODE_NORMAL
+ | REGULATOR_MODE_STANDBY,
+ .valid_ops_mask = REGULATOR_CHANGE_MODE
+ | REGULATOR_CHANGE_STATUS,
+ },
+ .num_consumer_supplies = 1,
+ .consumer_supplies = &omap3_stalker_vdda_dac_supply,
+};
+
+/* VPLL2 for digital video outputs */
+static struct regulator_consumer_supply omap3_stalker_vpll2_supply = {
+ .supply = "vdvi",
+ .dev = &omap3_stalker_lcd_device.dev,
+};
+
+static struct regulator_init_data omap3_stalker_vpll2 = {
+ .constraints = {
+ .name = "VDVI",
+ .min_uV = 1800000,
+ .max_uV = 1800000,
+ .apply_uV = true,
+ .valid_modes_mask = REGULATOR_MODE_NORMAL
+ | REGULATOR_MODE_STANDBY,
+ .valid_ops_mask = REGULATOR_CHANGE_MODE
+ | REGULATOR_CHANGE_STATUS,
+ },
+ .num_consumer_supplies = 1,
+ .consumer_supplies = &omap3_stalker_vpll2_supply,
+};
+
+static struct twl4030_platform_data omap3stalker_twldata = {
+ .irq_base = TWL4030_IRQ_BASE,
+ .irq_end = TWL4030_IRQ_END,
+
+ /* platform_data for children goes here */
+ .keypad = &omap3stalker_kp_data,
+ .madc = &omap3stalker_madc_data,
+ .usb = &omap3stalker_usb_data,
+ .gpio = &omap3stalker_gpio_data,
+ .codec = &omap3stalker_codec_data,
+ .vdac = &omap3_stalker_vdac,
+ .vpll2 = &omap3_stalker_vpll2,
+};
+
+static struct i2c_board_info __initdata omap3stalker_i2c_boardinfo[] = {
+ {
+ I2C_BOARD_INFO("twl4030", 0x48),
+ .flags = I2C_CLIENT_WAKE,
+ .irq = INT_34XX_SYS_NIRQ,
+ .platform_data = &omap3stalker_twldata,
+ },
+};
+
+#ifdef CONFIG_STALKER_BOARD_TYPE_LK_S
+static struct at24_platform_data fram_info = {
+ .byte_len = (64 * 1024) / 8,
+ .page_size = 8192,
+ .flags = AT24_FLAG_ADDR16 | AT24_FLAG_IRUGO,
+};
+
+static struct i2c_board_info __initdata omap3stalker_i2c_boardinfo3[] = {
+ {
+ I2C_BOARD_INFO("24c64", 0x50),
+ .flags = I2C_CLIENT_WAKE,
+ .platform_data = &fram_info,
+ },
+};
+#endif
+
+static int __init omap3_stalker_i2c_init(void)
+{
+ /*
+ * REVISIT: These entries can be set in omap3evm_twl_data
+ * after a merge with MFD tree
+ */
+ omap3stalker_twldata.vmmc1 = &omap3stalker_vmmc1;
+ omap3stalker_twldata.vsim = &omap3stalker_vsim;
+
+ omap_register_i2c_bus(1, 2600, omap3stalker_i2c_boardinfo,
+ ARRAY_SIZE(omap3stalker_i2c_boardinfo));
+ omap_register_i2c_bus(2, 400, NULL, 0);
+#if defined(CONFIG_STALKER_BOARD_TYPE_EVM)
+ omap_register_i2c_bus(3, 400, NULL, 0);
+#elif defined(CONFIG_STALKER_BOARD_TYPE_LK_S)
+ omap_register_i2c_bus(3, 400, omap3stalker_i2c_boardinfo3,
+ ARRAY_SIZE(omap3stalker_i2c_boardinfo3));
+#endif
+ return 0;
+}
+
+#define OMAP3_STALKER_TS_GPIO 175
+static void ads7846_dev_init(void)
+{
+ if (gpio_request(OMAP3_STALKER_TS_GPIO, "ADS7846 pendown") < 0)
+ printk(KERN_ERR "can't get ads7846 pen down GPIO\n");
+
+ gpio_direction_input(OMAP3_STALKER_TS_GPIO);
+
+ omap_set_gpio_debounce(OMAP3_STALKER_TS_GPIO, 1);
+ omap_set_gpio_debounce_time(OMAP3_STALKER_TS_GPIO, 0xa);
+}
+
+static int ads7846_get_pendown_state(void)
+{
+ return !gpio_get_value(OMAP3_STALKER_TS_GPIO);
+}
+
+struct ads7846_platform_data ads7846_config = {
+ .x_max = 0x0fff,
+ .y_max = 0x0fff,
+ .x_plate_ohms = 180,
+ .pressure_max = 255,
+ .debounce_max = 10,
+ .debounce_tol = 3,
+ .debounce_rep = 1,
+ .get_pendown_state = ads7846_get_pendown_state,
+ .keep_vref_on = 1,
+ .settle_delay_usecs = 150,
+};
+
+static struct omap2_mcspi_device_config ads7846_mcspi_config = {
+ .turbo_mode = 0,
+ .single_channel = 1, /* 0: slave, 1: master */
+};
+
+struct spi_board_info omap3stalker_spi_board_info[] = {
+ [0] = {

+	       .modalias = "ads7846",
+	       .bus_num = 1,
+	       .chip_select = 0,
+	       .max_speed_hz = 1500000,
+	       .controller_data = &ads7846_mcspi_config,
+	       .irq = OMAP_GPIO_IRQ(OMAP3_STALKER_TS_GPIO),
+	       .platform_data = &ads7846_config,
+	       },

+};
+
+static struct omap_board_config_kernel omap3_stalker_config[] __initdata = {
+};
+
+static void __init omap3_stalker_init_irq(void)
+{
+ omap_board_config = omap3_stalker_config;
+ omap_board_config_size = ARRAY_SIZE(omap3_stalker_config);
+ omap2_init_common_hw(mt46h32m32lf6_sdrc_params, NULL);
+ omap_init_irq();
+#ifdef CONFIG_OMAP_32K_TIMER
+ omap2_gp_clockevent_set_gptimer(12);
+#endif
+ omap_gpio_init();
+}
+
+static struct platform_device *omap3_stalker_devices[] __initdata = {
+ &omap3_stalker_dss_device,
+#if defined(CONFIG_STALKER_BOARD_TYPE_LK_S)
+ &keys_gpio,
+#endif
+};
+
+static struct ehci_hcd_omap_platform_data ehci_pdata __initconst = { +#if defined(CONFIG_STALKER_BOARD_TYPE_EVM)
+ .port_mode[0] = EHCI_HCD_OMAP_MODE_UNKNOWN,
+ .port_mode[1] = EHCI_HCD_OMAP_MODE_UNKNOWN,
+ .port_mode[2] = EHCI_HCD_OMAP_MODE_UNKNOWN,
+
+ .phy_reset = true,
+ .reset_gpio_port[0] = -EINVAL,
+ .reset_gpio_port[1] = -EINVAL,
+ .reset_gpio_port[2] = -EINVAL,
+#elif defined(CONFIG_STALKER_BOARD_TYPE_LK_S)
+ .port_mode[0] = EHCI_HCD_OMAP_MODE_UNKNOWN,
+ .port_mode[1] = EHCI_HCD_OMAP_MODE_PHY,
+ .port_mode[2] = EHCI_HCD_OMAP_MODE_UNKNOWN,
+
+ .phy_reset = true,
+ .reset_gpio_port[0] = -EINVAL,
+ .reset_gpio_port[1] = 21,
+ .reset_gpio_port[2] = -EINVAL,
+#endif
+};
+
+#ifdef CONFIG_OMAP_MUX
+static struct omap_board_mux board_mux[] __initdata = {
+ OMAP3_MUX(SYS_NIRQ, OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLUP |
+ OMAP_PIN_OFF_INPUT_PULLUP | OMAP_PIN_OFF_WAKEUPENABLE),
+ OMAP3_MUX(MCSPI1_CS1, OMAP_MUX_MODE4 | OMAP_PIN_INPUT_PULLUP |
+ OMAP_PIN_OFF_INPUT_PULLUP | OMAP_PIN_OFF_WAKEUPENABLE),
+ {.reg_offset = OMAP_MUX_TERMINATOR},
+};
+#else
+#define board_mux NULL
+#endif
+
+static struct omap_musb_board_data musb_board_data = {
+ .interface_type = MUSB_INTERFACE_ULPI,
+ .mode = MUSB_OTG,
+ .power = 100,
+};
+
+static void __init omap3_stalker_init(void)
+{
+ omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);
+
+ omap3_stalker_i2c_init();
+
+ platform_add_devices(omap3_stalker_devices,
+ ARRAY_SIZE(omap3_stalker_devices));
+
+ spi_register_board_info(omap3stalker_spi_board_info,
+ ARRAY_SIZE(omap3stalker_spi_board_info));
+
+ omap_serial_init();
+ usb_musb_init(&musb_board_data);
+ usb_ehci_init(&ehci_pdata);
+ omap3stalker_flash_init();
+ ads7846_dev_init();
+#if defined(CONFIG_STALKER_BOARD_TYPE_EVM)
+#if defined(CONFIG_DM9000) || defined(CONFIG_DM9000_MODULE)
+ omap3_init_dm9k();
+#endif
+#elif defined(CONFIG_STALKER_BOARD_TYPE_LK_S)
+ omap_mux_init_gpio(21, OMAP_PIN_OUTPUT);
+ omap_mux_init_gpio(18, OMAP_PIN_INPUT_PULLUP);
+#if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE)
+ omap3stalker_init_smsc911x();
+#endif
+#endif
+ omap3_stalker_display_init();
+/* Ensure SDRC pins are mux'd for self-refresh */
+ omap_mux_init_signal("sdr_cke0", OMAP_PIN_OUTPUT);
+ omap_mux_init_signal("sdr_cke1", OMAP_PIN_OUTPUT);
+}
+
+static void __init omap3_stalker_map_io(void)
+{
+ omap2_set_globals_343x();
+ omap34xx_map_common_io();
+}
+
+MACHINE_START(SBC3530, "OMAP3 STALKER")
+ /* Maintainer: Jason Lam [email protected] */
+ .phys_io = 0x48000000,
+ .io_pg_offst = ((0xfa000000) >> 18) & 0xfffc,
+ .boot_params = 0x80000100,
+ .map_io = omap3_stalker_map_io,
+ .init_irq = omap3_stalker_init_irq,
+ .init_machine = omap3_stalker_init,
+ .timer = &omap_timer,
+MACHINE_END
+
--
1.5.4.3

maintainer
#1 lore raw

Hi,

Sorry for the delay in replying. Few comments, see below.

Quoted 2 lines · Jason

This patche add omap3 board support for the EMA-Tech StalkerBoards. Base on TI's EVM.

<snip>

Quoted 19 lines
arch/arm/mach-omap2/Kconfig +13 -0
@@ -82,6 +82,26 @@ config MACH_OMAP3517EVM
 	depends on ARCH_OMAP3
 	select OMAP_PACKAGE_CBB
 
+config MACH_SBC3530
+	bool "OMAP3 SBC STALKER board"
+	depends on ARCH_OMAP3
+
+choice
+	prompt STALKER_BOARD_TYPE
+	depends on MACH_SBC3530
+	default STALKER_EVM
+
+config STALKER_BOARD_TYPE_EVM
+	bool "Stalker EVM board"
+	help
+	  Select this option if you have a Stalker EVM board

arch/arm/mach-omap2/Kconfig config MACH_OMAP3517EVM · line 107

Quoted 10 lines
arch/arm/mach-omap2/Kconfig +7 -0
+
+config STALKER_BOARD_TYPE_LK_S
+	bool "Stalker LK-S board"
+	help
+	  Select this option if you have a Stalker LK-S board
+endchoice
+
 config MACH_OMAP3_PANDORA
 	bool "OMAP3 Pandora"
 	depends on ARCH_OMAP3

Things like this are best done by looking at the ATAG_REVISION passed by the bootloader. Then you can dynamically initialize the platform data based on the revision.

Quoted 26 lines
arch/arm/mach-omap2/board-omap3stalker.c new file +23 -0
@@ -0,0 +1,922 @@
+/*
+ * linux/arch/arm/mach-omap2/board-omap3evm.c
+ *
+ * Copyright (C) 2008 Guangzhou EMA-Tech
+ *
+ * Modified from mach-omap2/board-omap3evm.c
+ *
+ * Initial code: Syed Mohammed Khasim
+ *
+ * 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/gpio.h>
+#include <linux/input.h>
+#include <linux/input/matrix_keypad.h>

arch/arm/mach-omap2/board-omap3stalker.c line 33

Quoted 10 lines
arch/arm/mach-omap2/board-omap3stalker.c new file +10 -0
+#include <linux/leds.h>
+#include <linux/interrupt.h>
+
+#include <linux/spi/spi.h>
+#include <linux/spi/ads7846.h>
+#include <linux/i2c/twl.h>
+#include <linux/usb/otg.h>
+#if defined(CONFIG_STALKER_BOARD_TYPE_EVM)
+#include <linux/dm9000.h>
+#elif defined(CONFIG_STALKER_BOARD_TYPE_LK_S)

We should not ifdef includes, it should be OK to include them automatically.

Quoted 24 lines
arch/arm/mach-omap2/board-omap3stalker.c new file +24 -0
+#include <linux/smsc911x.h>
+#include <linux/gpio_keys.h>
+#include <linux/i2c/at24.h>
+#endif
+
+#include <linux/regulator/machine.h>
+
+#include <linux/mtd/mtd.h>
+#include <linux/mtd/partitions.h>
+#include <linux/mtd/nand.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 <plat/board.h>
+#include <plat/mux.h>
+#include <plat/gpmc.h>
+#include <plat/nand.h>
+#include <plat/usb.h>
+#include <plat/common.h>
+#include <plat/control.h>

arch/arm/mach-omap2/board-omap3stalker.c line 67

Quoted 10 lines
arch/arm/mach-omap2/board-omap3stalker.c new file +10 -0
+#include <plat/mcspi.h>
+#include <plat/clock.h>
+#include <plat/omap-pm.h>
+#include <plat/display.h>
+#include <plat/timer-gp.h>
+
+#include "mux.h"
+#include "sdram-micron-mt46h32m32lf-6.h"
+#include "hsmmc.h"
+#include "pm.h"

That's a lot of include files, are they all needed?

Quoted 18 lines
arch/arm/mach-omap2/board-omap3stalker.c new file +18 -0
+static struct mtd_partition omap3stalker_nand_partitions[] = {
+	/* All the partition sizes are listed in terms of NAND block size */
+	{
+	 .name = "X-Loader",
+	 .offset = 0,
+	 .size = 4 * (SZ_128K),
+	 .mask_flags = MTD_WRITEABLE,
+	 },
+	{
+	 .name = "U-Boot",
+	 .offset = MTDPART_OFS_APPEND,
+	 .size = 15 * (SZ_128K),
+	 .mask_flags = MTD_WRITEABLE,
+	 },
+	{
+	 .name = "U-Boot Env",
+	 .offset = MTDPART_OFS_APPEND,
+	 .size = 1 * (SZ_128K)},

arch/arm/mach-omap2/board-omap3stalker.c line 96

Quoted 10 lines
arch/arm/mach-omap2/board-omap3stalker.c new file +10 -0
+	{
+	 .name = "Kernel",
+	 .offset = MTDPART_OFS_APPEND,
+	 .size = 32 * (SZ_128K)},
+	{
+	 .name = "File System",
+	 .size = MTDPART_SIZ_FULL,
+	 .offset = MTDPART_OFS_APPEND,
+	 },
+};

Please use tabs instead of spaces.

arch/arm/mach-omap2/board-omap3stalker.c line 124

Quoted 5 lines
arch/arm/mach-omap2/board-omap3stalker.c new file +5 -0
+void __init omap3stalker_flash_init(void)
+{
+	u8 cs = 0;
+	u8 nandcs = GPMC_CS_NUM + 1;
+	u32 gpmc_base_add = OMAP34XX_GPMC_VIRT;

Please leave out the NAND stuff for now, we need to first fix the NAND driver before adding more of the OMAP34XX_GPMC_VIRT..

arch/arm/mach-omap2/board-omap3stalker.c line 274

Quoted 13 lines
arch/arm/mach-omap2/board-omap3stalker.c new file +13 -0
+static struct resource omap3stalker_smsc911x_resources[] = {
+	[0] = {
+	       .start = OMAP3STALKER_ETHR_START,
+	       .end =
+	       (OMAP3STALKER_ETHR_START + OMAP3STALKER_ETHR_SIZE - 1),
+	       .flags = IORESOURCE_MEM,
+	       },
+	[1] = {
+	       .start = OMAP_GPIO_IRQ(OMAP3STALKER_ETHR_GPIO_IRQ),
+	       .end = OMAP_GPIO_IRQ(OMAP3STALKER_ETHR_GPIO_IRQ),
+	       .flags = (IORESOURCE_IRQ | IRQF_TRIGGER_LOW),
+	       },
+};

Please use tabs here too instead of spaces.

Quoted 9 lines
arch/arm/mach-omap2/board-omap3stalker.c new file +9 -0
+static struct omap2_hsmmc_info mmc[] = {
+	{
+	 .mmc = 1,
+	 .wires = 4,
+	 .gpio_cd = -EINVAL,
+	 .gpio_wp = 23,
+	 },
+	{}			/* Terminator */
+};

arch/arm/mach-omap2/board-omap3stalker.c line 132

Quoted 10 lines
arch/arm/mach-omap2/board-omap3stalker.c new file +10 -0
+
+#if defined(CONFIG_STALKER_BOARD_TYPE_LK_S)
+static struct gpio_keys_button gpio_buttons[] = {
+	{
+	 .code = BTN_EXTRA,
+	 .gpio = 18,
+	 .desc = "user",
+	 .wakeup = 1,
+	 },
+};

Here too.

arch/arm/mach-omap2/board-omap3stalker.c line 144

Quoted 12 lines
arch/arm/mach-omap2/board-omap3stalker.c new file +12 -0
+	.irq_base = TWL4030_IRQ_BASE,
+	.irq_end = TWL4030_IRQ_END,
+
+	/* platform_data for children goes here */
+	.keypad = &omap3stalker_kp_data,
+	.madc = &omap3stalker_madc_data,
+	.usb = &omap3stalker_usb_data,
+	.gpio = &omap3stalker_gpio_data,
+	.codec = &omap3stalker_codec_data,
+	.vdac = &omap3_stalker_vdac,
+	.vpll2 = &omap3_stalker_vpll2,
+};

Please align with tabs:

	.keypad		= &omap3stalker_kp_data,
	.madc		= &omap3stalker_madc_data,

arch/arm/mach-omap2/board-omap3stalker.c line 152

Quoted 8 lines
arch/arm/mach-omap2/board-omap3stalker.c new file +8 -0
+static struct i2c_board_info __initdata omap3stalker_i2c_boardinfo[] = {
+	{
+	 I2C_BOARD_INFO("twl4030", 0x48),
+	 .flags = I2C_CLIENT_WAKE,
+	 .irq = INT_34XX_SYS_NIRQ,
+	 .platform_data = &omap3stalker_twldata,
+	 },
+};

Tabify

Quoted 5 lines
arch/arm/mach-omap2/board-omap3stalker.c new file +5 -0
+#ifdef CONFIG_STALKER_BOARD_TYPE_LK_S
+static struct at24_platform_data fram_info = {
+	.byte_len = (64 * 1024) / 8,
+	.page_size = 8192,
+	.flags = AT24_FLAG_ADDR16 | AT24_FLAG_IRUGO,

arch/arm/mach-omap2/board-omap3stalker.c line 167

Quoted 10 lines
arch/arm/mach-omap2/board-omap3stalker.c new file +10 -0
+};
+
+static struct i2c_board_info __initdata omap3stalker_i2c_boardinfo3[] = {
+	{
+	 I2C_BOARD_INFO("24c64", 0x50),
+	 .flags = I2C_CLIENT_WAKE,
+	 .platform_data = &fram_info,
+	 },
+};
+#endif

Tabify

Anyways, mostly minor stuff except for the preference for dynamic detection of the board.

Regards,

Tony

author
#2 lore raw

Thanks for replaying, I did have a long wait.

A question about board version. Is it good to do a hardware check to find out hardware version?
Like function static void __init omap3_evm_get_revision(void) in
board-omap3evm.c

Best regards,
Jason

Quoted 82 lines

-----Original Message-----
From: Tony Lindgren [mailto:[email protected]]
Sent: 2010年5月5日 7:00
To: Jason
Cc: [email protected]
Subject: Re: [PATCH] Add support for OMAP3Stalker boards

Hi,

Sorry for the delay in replying. Few comments, see below.

Quoted 1 line · Jason

This patche add omap3 board support for the EMA-Tech StalkerBoards. Base

on

Quoted 1 line

TI's EVM.

<snip>

Quoted 19 lines
arch/arm/mach-omap2/Kconfig +13 -0
@@ -82,6 +82,26 @@ config MACH_OMAP3517EVM
 	depends on ARCH_OMAP3
 	select OMAP_PACKAGE_CBB
 
+config MACH_SBC3530
+	bool "OMAP3 SBC STALKER board"
+	depends on ARCH_OMAP3
+
+choice
+	prompt STALKER_BOARD_TYPE
+	depends on MACH_SBC3530
+	default STALKER_EVM
+
+config STALKER_BOARD_TYPE_EVM
+	bool "Stalker EVM board"
+	help
+	  Select this option if you have a Stalker EVM board

arch/arm/mach-omap2/Kconfig config MACH_OMAP3517EVM · line 107

Quoted 10 lines
arch/arm/mach-omap2/Kconfig +7 -0
+
+config STALKER_BOARD_TYPE_LK_S
+	bool "Stalker LK-S board"
+	help
+	  Select this option if you have a Stalker LK-S board
+endchoice
+
 config MACH_OMAP3_PANDORA
 	bool "OMAP3 Pandora"
 	depends on ARCH_OMAP3

Things like this are best done by looking at the ATAG_REVISION passed by the bootloader. Then you can dynamically initialize the platform data based on the revision.

Quoted 30 lines
arch/arm/mach-omap2/board-omap3stalker.c new file +27 -0
@@ -0,0 +1,922 @@
+/*
+ * linux/arch/arm/mach-omap2/board-omap3evm.c
+ *
+ * Copyright (C) 2008 Guangzhou EMA-Tech
+ *
+ * Modified from mach-omap2/board-omap3evm.c
+ *
+ * Initial code: Syed Mohammed Khasim
+ *
+ * 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/gpio.h>
+#include <linux/input.h>
+#include <linux/input/matrix_keypad.h>
+#include <linux/leds.h>
+#include <linux/interrupt.h>
+
+#include <linux/spi/spi.h>
Quoted 8 lines

arch/arm/mach-omap2/board-omap3stalker.c line 33

Quoted 6 lines
arch/arm/mach-omap2/board-omap3stalker.c new file +6 -0
+#include <linux/spi/ads7846.h>
+#include <linux/i2c/twl.h>
+#include <linux/usb/otg.h>
+#if defined(CONFIG_STALKER_BOARD_TYPE_EVM)
+#include <linux/dm9000.h>
+#elif defined(CONFIG_STALKER_BOARD_TYPE_LK_S)

We should not ifdef includes, it should be OK to include them

automatically.

Quoted 132 lines
Quoted 25 lines
arch/arm/mach-omap2/board-omap3stalker.c new file +24 -0
+#include <linux/smsc911x.h>
+#include <linux/gpio_keys.h>
+#include <linux/i2c/at24.h>
+#endif
+
+#include <linux/regulator/machine.h>
+
+#include <linux/mtd/mtd.h>
+#include <linux/mtd/partitions.h>
+#include <linux/mtd/nand.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 <plat/board.h>
+#include <plat/mux.h>
+#include <plat/gpmc.h>
+#include <plat/nand.h>
+#include <plat/usb.h>
+#include <plat/common.h>
+#include <plat/control.h>

arch/arm/mach-omap2/board-omap3stalker.c line 67

Quoted 10 lines
arch/arm/mach-omap2/board-omap3stalker.c new file +10 -0
+#include <plat/mcspi.h>
+#include <plat/clock.h>
+#include <plat/omap-pm.h>
+#include <plat/display.h>
+#include <plat/timer-gp.h>
+
+#include "mux.h"
+#include "sdram-micron-mt46h32m32lf-6.h"
+#include "hsmmc.h"
+#include "pm.h"

That's a lot of include files, are they all needed?

Quoted 18 lines
arch/arm/mach-omap2/board-omap3stalker.c new file +18 -0
+static struct mtd_partition omap3stalker_nand_partitions[] = {
+	/* All the partition sizes are listed in terms of NAND block size */
+	{
+	 .name = "X-Loader",
+	 .offset = 0,
+	 .size = 4 * (SZ_128K),
+	 .mask_flags = MTD_WRITEABLE,
+	 },
+	{
+	 .name = "U-Boot",
+	 .offset = MTDPART_OFS_APPEND,
+	 .size = 15 * (SZ_128K),
+	 .mask_flags = MTD_WRITEABLE,
+	 },
+	{
+	 .name = "U-Boot Env",
+	 .offset = MTDPART_OFS_APPEND,
+	 .size = 1 * (SZ_128K)},

arch/arm/mach-omap2/board-omap3stalker.c line 96

Quoted 10 lines
arch/arm/mach-omap2/board-omap3stalker.c new file +10 -0
+	{
+	 .name = "Kernel",
+	 .offset = MTDPART_OFS_APPEND,
+	 .size = 32 * (SZ_128K)},
+	{
+	 .name = "File System",
+	 .size = MTDPART_SIZ_FULL,
+	 .offset = MTDPART_OFS_APPEND,
+	 },
+};

Please use tabs instead of spaces.

arch/arm/mach-omap2/board-omap3stalker.c line 124

Quoted 5 lines
arch/arm/mach-omap2/board-omap3stalker.c new file +5 -0
+void __init omap3stalker_flash_init(void)
+{
+	u8 cs = 0;
+	u8 nandcs = GPMC_CS_NUM + 1;
+	u32 gpmc_base_add = OMAP34XX_GPMC_VIRT;

Please leave out the NAND stuff for now, we need to first fix the NAND driver before adding more of the OMAP34XX_GPMC_VIRT..

arch/arm/mach-omap2/board-omap3stalker.c

Quoted 5 lines
arch/arm/mach-omap2/board-omap3stalker.c new file +5 -0
+static struct resource omap3stalker_smsc911x_resources[] = {
+	[0] = {
+	       .start = OMAP3STALKER_ETHR_START,
+	       .end =
+	       (OMAP3STALKER_ETHR_START + OMAP3STALKER_ETHR_SIZE -

1),

arch/arm/mach-omap2/board-omap3stalker.c line 274

Quoted 8 lines
arch/arm/mach-omap2/board-omap3stalker.c new file +8 -0
+	       .flags = IORESOURCE_MEM,
+	       },
+	[1] = {
+	       .start = OMAP_GPIO_IRQ(OMAP3STALKER_ETHR_GPIO_IRQ),
+	       .end = OMAP_GPIO_IRQ(OMAP3STALKER_ETHR_GPIO_IRQ),
+	       .flags = (IORESOURCE_IRQ | IRQF_TRIGGER_LOW),
+	       },
+};

Please use tabs here too instead of spaces.

Quoted 9 lines
arch/arm/mach-omap2/board-omap3stalker.c new file +9 -0
+static struct omap2_hsmmc_info mmc[] = {
+	{
+	 .mmc = 1,
+	 .wires = 4,
+	 .gpio_cd = -EINVAL,
+	 .gpio_wp = 23,
+	 },
+	{}			/* Terminator */
+};

arch/arm/mach-omap2/board-omap3stalker.c line 132

Quoted 10 lines
arch/arm/mach-omap2/board-omap3stalker.c new file +10 -0
+
+#if defined(CONFIG_STALKER_BOARD_TYPE_LK_S)
+static struct gpio_keys_button gpio_buttons[] = {
+	{
+	 .code = BTN_EXTRA,
+	 .gpio = 18,
+	 .desc = "user",
+	 .wakeup = 1,
+	 },
+};

Here too.

arch/arm/mach-omap2/board-omap3stalker.c line 144

Quoted 12 lines
arch/arm/mach-omap2/board-omap3stalker.c new file +12 -0
+	.irq_base = TWL4030_IRQ_BASE,
+	.irq_end = TWL4030_IRQ_END,
+
+	/* platform_data for children goes here */
+	.keypad = &omap3stalker_kp_data,
+	.madc = &omap3stalker_madc_data,
+	.usb = &omap3stalker_usb_data,
+	.gpio = &omap3stalker_gpio_data,
+	.codec = &omap3stalker_codec_data,
+	.vdac = &omap3_stalker_vdac,
+	.vpll2 = &omap3_stalker_vpll2,
+};

Please align with tabs:

Quoted 4 lines
	.keypad		= &omap3stalker_kp_data,
	.madc		= &omap3stalker_madc_data,
Quoted 1 line
arch/arm/mach-omap2/board-omap3stalker.c new file +1 -0
+static struct i2c_board_info __initdata omap3stalker_i2c_boardinfo[] =

{

Quoted 10 lines

arch/arm/mach-omap2/board-omap3stalker.c line 152

Quoted 7 lines
arch/arm/mach-omap2/board-omap3stalker.c new file +7 -0
+	{
+	 I2C_BOARD_INFO("twl4030", 0x48),
+	 .flags = I2C_CLIENT_WAKE,
+	 .irq = INT_34XX_SYS_NIRQ,
+	 .platform_data = &omap3stalker_twldata,
+	 },
+};

Tabify

Quoted 8 lines

arch/arm/mach-omap2/board-omap3stalker.c line 160

Quoted 8 lines
arch/arm/mach-omap2/board-omap3stalker.c new file +8 -0
+#ifdef CONFIG_STALKER_BOARD_TYPE_LK_S
+static struct at24_platform_data fram_info = {
+	.byte_len = (64 * 1024) / 8,
+	.page_size = 8192,
+	.flags = AT24_FLAG_ADDR16 | AT24_FLAG_IRUGO,
+};
+
+static struct i2c_board_info __initdata omap3stalker_i2c_boardinfo3[] =

{

Quoted 11 lines

arch/arm/mach-omap2/board-omap3stalker.c line 251

Quoted 7 lines
arch/arm/mach-omap2/board-omap3stalker.c new file +7 -0
+	{
+	 I2C_BOARD_INFO("24c64", 0x50),
+	 .flags = I2C_CLIENT_WAKE,
+	 .platform_data = &fram_info,
+	 },
+};
+#endif

Tabify

Anyways, mostly minor stuff except for the preference for dynamic

detection

Quoted 5 lines

of the board.

Regards,

Tony

--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html

maintainer
#3 lore raw
Quoted 5 lines · Jason

A question about board version. Is it good to do a hardware check to find out hardware version?
Like function static void __init omap3_evm_get_revision(void) in
board-omap3evm.c

Sure, that's the best option.

Some boards are also using the system_rev, which contains the ATAG_REVISION passed from the bootloader. But then you depend on the bootloader to pass it.. So hardare detection early on is the most flexible way of doing this.

Regards,

Tony

author
#4 lore raw

PATCH v2 1/1 Add support for OMAP3Stalker boards

In reply to Tony Lindgren

Tony,
Remove nand flash support
Remove legacy board support
Fix indent problem

Nand support would be added after omap3 nand problem was fixed.

Quoted 1 line

From ad9cad8d67ea94b0db4b15da369741687f7280e5 Mon Sep 17 00:00:00 2001

From: Jason Lam <[email protected]>
Date: Sun, 16 May 2010 23:37:05 -0700
Subject: [PATCH] Add support for OMAP3Stalker boards

---
 arch/arm/mach-omap2/Kconfig              |    6 +
 arch/arm/mach-omap2/Makefile             |    2 +
 arch/arm/mach-omap2/board-omap3stalker.c |  672
++++++++++++++++++++++++++++++
 3 files changed, 680 insertions(+), 0 deletions(-)
 create mode 100755 arch/arm/mach-omap2/board-omap3stalker.c
arch/arm/mach-omap2/Kconfig +6 -0
index 99abac2..b31b6f1 100644
@@ -142,6 +142,12 @@ config MACH_IGEP0020
 	depends on ARCH_OMAP3
 	select OMAP_PACKAGE_CBB
 
+config MACH_SBC3530
+	bool "OMAP3 SBC STALKER board"
+	depends on ARCH_OMAP3
+	select OMAP_PACKAGE_CUS
+	select OMAP_MUX
+
 config MACH_OMAP_3630SDP
 	bool "OMAP3630 SDP board"
 	depends on ARCH_OMAP3
arch/arm/mach-omap2/Makefile +0 -0
index ffe600a..e16be5f 100644
@@ -144,6 +144,8 @@ obj-$(CONFIG_MACH_OMAP_4430SDP)		+=

board-4430sdp.o

obj-$(CONFIG_MACH_OMAP3517EVM) += board-am3517evm.o

+obj-$(CONFIG_MACH_SBC3530) += board-omap3stalker.o \
+ hsmmc.o
# Platform specific device init code
obj-y += usb-musb.o
obj-$(CONFIG_MACH_OMAP2_TUSB6010) += usb-tusb6010.o

(quoted diff) +0 -0

b/arch/arm/mach-omap2/board-omap3stalker.c
new file mode 100755
index 0000000..c56f133

arch/arm/mach-omap2/board-omap3stalker.c new file +120 -0

120 lines not on this page · raw message

*/
+static inline void __init omap3stalker_init_eth(void)
+{
+ return;
+}
+#endif
+
+/*
+ * OMAP3 DSS control signals
+ */
+
+#define DSS_ENABLE_GPIO 199
+#define LCD_PANEL_BKLIGHT_GPIO 210
+#define ENABLE_VPLL2_DEV_GRP 0xE0
+
+static int lcd_enabled;
+static int dvi_enabled;
+
+static void __init omap3_stalker_display_init(void)
+{
+ return;
+}
+
+static int omap3_stalker_enable_lcd(struct omap_dss_device *dssdev) +{
+ if (dvi_enabled) {
+ printk(KERN_ERR "cannot enable LCD, DVI is enabled\n");
+ return -EINVAL;
+ }
+ gpio_set_value(DSS_ENABLE_GPIO, 1);
+ gpio_set_value(LCD_PANEL_BKLIGHT_GPIO, 1);
+ lcd_enabled = 1;
+ return 0;
+}
+
+static void omap3_stalker_disable_lcd(struct omap_dss_device *dssdev) +{
+ gpio_set_value(DSS_ENABLE_GPIO, 0);
+ gpio_set_value(LCD_PANEL_BKLIGHT_GPIO, 0);
+ lcd_enabled = 0;
+}
+
+static struct omap_dss_device omap3_stalker_lcd_device = {
+ .name = "lcd",
+ .driver_name = "generic_panel",
+ .phy.dpi.data_lines = 24,
+ .type = OMAP_DISPLAY_TYPE_DPI,
+ .platform_enable = omap3_stalker_enable_lcd,
+ .platform_disable = omap3_stalker_disable_lcd,
+};
+
+static int omap3_stalker_enable_tv(struct omap_dss_device *dssdev) +{
+ return 0;
+}
+
+static void omap3_stalker_disable_tv(struct omap_dss_device *dssdev) +{
+}
+
+static struct omap_dss_device omap3_stalker_tv_device = {
+ .name = "tv",
+ .driver_name = "venc",
+ .type = OMAP_DISPLAY_TYPE_VENC,
+#if defined(CONFIG_OMAP2_VENC_OUT_TYPE_SVIDEO)
+ .phy.venc.type = OMAP_DSS_VENC_TYPE_SVIDEO,
+#elif defined(CONFIG_OMAP2_VENC_OUT_TYPE_COMPOSITE)
+ .u.venc.type = OMAP_DSS_VENC_TYPE_COMPOSITE,
+#endif
+ .platform_enable = omap3_stalker_enable_tv,
+ .platform_disable = omap3_stalker_disable_tv,
+};
+
+static int omap3_stalker_enable_dvi(struct omap_dss_device *dssdev) +{
+ if (lcd_enabled) {
+ printk(KERN_ERR "cannot enable DVI, LCD is enabled\n");
+ return -EINVAL;
+ }
+ gpio_set_value(DSS_ENABLE_GPIO, 1);
+ dvi_enabled = 1;
+ return 0;
+}
+
+static void omap3_stalker_disable_dvi(struct omap_dss_device *dssdev) +{
+ gpio_set_value(DSS_ENABLE_GPIO, 0);
+ dvi_enabled = 0;
+}
+
+static struct omap_dss_device omap3_stalker_dvi_device = {
+ .name = "dvi",
+ .driver_name = "generic_panel",
+ .type = OMAP_DISPLAY_TYPE_DPI,
+ .phy.dpi.data_lines = 24,
+ .platform_enable = omap3_stalker_enable_dvi,
+ .platform_disable = omap3_stalker_disable_dvi,
+};
+
+static struct omap_dss_device *omap3_stalker_dss_devices[] = {
+ &omap3_stalker_lcd_device,
+ &omap3_stalker_tv_device,
+ &omap3_stalker_dvi_device,
+};
+
+static struct omap_dss_board_info omap3_stalker_dss_data = {
+ .num_devices = ARRAY_SIZE(omap3_stalker_dss_devices),
+ .devices = omap3_stalker_dss_devices,
+ .default_device = &omap3_stalker_dvi_device,
+};
+
+static struct platform_device omap3_stalker_dss_device = {
+ .name = "omapdss",
+ .id = -1,
+ .dev = {
+ .platform_data = &omap3_stalker_dss_data,
+ },
+};
+
+static struct regulator_consumer_supply omap3stalker_vmmc1_supply = {
+ .supply = "vmmc",
+};
+
+static struct regulator_consumer_supply omap3stalker_vsim_supply = {
+ .supply = "vmmc_aux",
+};
+
+/* VMMC1 for MMC1 pins CMD, CLK, DAT0..DAT3 (20 mA, plus card == max 220 mA) */
+static struct regulator_init_data omap3stalker_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 = &omap3stalker_vmmc1_supply,
+};
+
+/* VSIM for MMC1 pins DAT4..DAT7 (2 mA, plus card == max 50 mA) */ +static struct regulator_init_data omap3stalker_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 = &omap3stalker_vsim_supply,
+};
+
+static struct omap2_hsmmc_info mmc[] = {
+ {
+ .mmc = 1,
+ .wires = 4,
+ .gpio_cd = -EINVAL,
+ .gpio_wp = 23,
+ },
+ {} /* Terminator */
+};
+
+static struct gpio_keys_button gpio_buttons[] = {
+ {
+ .code = BTN_EXTRA,
+ .gpio = 18,
+ .desc = "user",
+ .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,
+ },
+};
+
+static struct gpio_led gpio_leds[] = {
+ {
+ .name = "stalker:D8:usr0",
+ .default_trigger = "default-on",
+ .gpio = 126,
+ },
+ {
+ .name = "stalker:D9:usr1",
+ .default_trigger = "default-on",
+ .gpio = 127,
+ },
+ {
+ .name = "stalker:D3:mmc0",
+ .gpio = -EINVAL, /* gets replaced */
+ .active_low = true,
+ .default_trigger = "mmc0",
+ },
+ {
+ .name = "stalker:D4:heartbeat",
+ .gpio = -EINVAL, /* gets replaced */
+ .active_low = true,
+ .default_trigger = "heartbeat",
+ },
+};
+
+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 int
+omap3stalker_twl_gpio_setup(struct device *dev,
+ unsigned gpio, unsigned ngpio)
+{
+ /* gpio + 0 is "mmc0_cd" (input/IRQ) */
+ omap_mux_init_gpio(23, OMAP_PIN_INPUT);
+ mmc[0].gpio_cd = gpio + 0;
+ omap2_hsmmc_init(mmc);
+
+ /* link regulators to MMC adapters */
+ omap3stalker_vmmc1_supply.dev = mmc[0].dev;
+ omap3stalker_vsim_supply.dev = mmc[0].dev;
+
+ /*
+ * Most GPIOs are for USB OTG. Some are mostly sent to
+ * the P2 connector; notably LEDA for the LCD backlight.
+ */
+
+ /* TWL4030_GPIO_MAX + 0 == ledA, LCD Backlight control */
+ gpio_request(gpio + TWL4030_GPIO_MAX, "EN_LCD_BKL");
+ gpio_direction_output(gpio + TWL4030_GPIO_MAX, 0);
+
+ /* gpio + 7 == DVI Enable */
+ gpio_request(gpio + 7, "EN_DVI");
+ gpio_direction_output(gpio + 7, 0);
+
+ /* TWL4030_GPIO_MAX + 1 == ledB (out, mmc0) */
+ gpio_leds[2].gpio = gpio + TWL4030_GPIO_MAX + 1;
+ /* GPIO + 13 == ledsync (out, heartbeat) */
+ gpio_leds[3].gpio = gpio + 13;
+
+ platform_device_register(&leds_gpio);
+ return 0;
+}
+
+static struct twl4030_gpio_platform_data omap3stalker_gpio_data = {
+ .gpio_base = OMAP_MAX_GPIO_LINES,
+ .irq_base = TWL4030_GPIO_IRQ_BASE,
+ .irq_end = TWL4030_GPIO_IRQ_END,
+ .use_leds = true,
+ .setup = omap3stalker_twl_gpio_setup,
+};
+
+static struct twl4030_usb_data omap3stalker_usb_data = {
+ .usb_mode = T2_USB_MODE_ULPI,
+};
+
+static int board_keymap[] = {
+ KEY(0, 0, KEY_LEFT),
+ KEY(0, 1, KEY_DOWN),
+ KEY(0, 2, KEY_ENTER),
+ KEY(0, 3, KEY_M),
+
+ KEY(1, 0, KEY_RIGHT),
+ KEY(1, 1, KEY_UP),
+ KEY(1, 2, KEY_I),
+ KEY(1, 3, KEY_N),
+
+ KEY(2, 0, KEY_A),
+ KEY(2, 1, KEY_E),
+ KEY(2, 2, KEY_J),
+ KEY(2, 3, KEY_O),
+
+ KEY(3, 0, KEY_B),
+ KEY(3, 1, KEY_F),
+ KEY(3, 2, KEY_K),
+ KEY(3, 3, KEY_P)
+};
+
+static struct matrix_keymap_data board_map_data = {
+ .keymap = board_keymap,
+ .keymap_size = ARRAY_SIZE(board_keymap),
+};
+
+static struct twl4030_keypad_data omap3stalker_kp_data = {
+ .keymap_data = &board_map_data,
+ .rows = 4,
+ .cols = 4,
+ .rep = 1,
+};
+
+static struct twl4030_madc_platform_data omap3stalker_madc_data = {
+ .irq_line = 1,
+};
+
+static struct twl4030_codec_audio_data omap3stalker_audio_data = {
+ .audio_mclk = 26000000,
+};
+
+static struct twl4030_codec_data omap3stalker_codec_data = {
+ .audio_mclk = 26000000,
+ .audio = &omap3stalker_audio_data,
+};
+
+static struct regulator_consumer_supply omap3_stalker_vdda_dac_supply = {
+ .supply = "vdda_dac",
+ .dev = &omap3_stalker_dss_device.dev,
+};
+
+/* VDAC for DSS driving S-Video */
+static struct regulator_init_data omap3_stalker_vdac = {
+ .constraints = {
+ .min_uV = 1800000,
+ .max_uV = 1800000,
+ .apply_uV = true,
+ .valid_modes_mask = REGULATOR_MODE_NORMAL
+ | REGULATOR_MODE_STANDBY,
+ .valid_ops_mask = REGULATOR_CHANGE_MODE
+ | REGULATOR_CHANGE_STATUS,
+ },
+ .num_consumer_supplies = 1,
+ .consumer_supplies = &omap3_stalker_vdda_dac_supply,
+};
+
+/* VPLL2 for digital video outputs */
+static struct regulator_consumer_supply omap3_stalker_vpll2_supply = {
+ .supply = "vdds_dsi",
+ .dev = &omap3_stalker_lcd_device.dev,
+};
+
+static struct regulator_init_data omap3_stalker_vpll2 = {
+ .constraints = {
+ .name = "VDVI",
+ .min_uV = 1800000,
+ .max_uV = 1800000,
+ .apply_uV = true,
+ .valid_modes_mask = REGULATOR_MODE_NORMAL
+ | REGULATOR_MODE_STANDBY,
+ .valid_ops_mask = REGULATOR_CHANGE_MODE
+ | REGULATOR_CHANGE_STATUS,
+ },
+ .num_consumer_supplies = 1,
+ .consumer_supplies = &omap3_stalker_vpll2_supply,
+};
+
+static struct twl4030_platform_data omap3stalker_twldata = {
+ .irq_base = TWL4030_IRQ_BASE,
+ .irq_end = TWL4030_IRQ_END,
+
+ /* platform_data for children goes here */
+ .keypad = &omap3stalker_kp_data,
+ .madc = &omap3stalker_madc_data,
+ .usb = &omap3stalker_usb_data,
+ .gpio = &omap3stalker_gpio_data,
+ .codec = &omap3stalker_codec_data,
+ .vdac = &omap3_stalker_vdac,
+ .vpll2 = &omap3_stalker_vpll2,
+};
+
+static struct i2c_board_info __initdata omap3stalker_i2c_boardinfo[] = {
+ {
+ I2C_BOARD_INFO("twl4030", 0x48),
+ .flags = I2C_CLIENT_WAKE,
+ .irq = INT_34XX_SYS_NIRQ,
+ .platform_data = &omap3stalker_twldata,
+ },
+};
+
+static struct at24_platform_data fram_info = {
+ .byte_len = (64 * 1024) / 8,
+ .page_size = 8192,
+ .flags = AT24_FLAG_ADDR16 | AT24_FLAG_IRUGO,
+};
+
+static struct i2c_board_info __initdata omap3stalker_i2c_boardinfo3[] = {
+ {
+ I2C_BOARD_INFO("24c64", 0x50),
+ .flags = I2C_CLIENT_WAKE,
+ .platform_data = &fram_info,
+ },
+};
+
+static int __init omap3_stalker_i2c_init(void)
+{
+ /*
+ * REVISIT: These entries can be set in omap3evm_twl_data
+ * after a merge with MFD tree
+ */
+ omap3stalker_twldata.vmmc1 = &omap3stalker_vmmc1;
+ omap3stalker_twldata.vsim = &omap3stalker_vsim;
+
+ omap_register_i2c_bus(1, 2600, omap3stalker_i2c_boardinfo,
+ ARRAY_SIZE(omap3stalker_i2c_boardinfo));
+ omap_register_i2c_bus(2, 400, NULL, 0);
+ omap_register_i2c_bus(3, 400, omap3stalker_i2c_boardinfo3,
+ ARRAY_SIZE(omap3stalker_i2c_boardinfo3));
+ return 0;
+}
+
+#define OMAP3_STALKER_TS_GPIO 175
+static void ads7846_dev_init(void)
+{
+ if (gpio_request(OMAP3_STALKER_TS_GPIO, "ADS7846 pendown") < 0)
+ printk(KERN_ERR "can't get ads7846 pen down GPIO\n");
+
+ gpio_direction_input(OMAP3_STALKER_TS_GPIO);
+
+ omap_set_gpio_debounce(OMAP3_STALKER_TS_GPIO, 1);
+ omap_set_gpio_debounce_time(OMAP3_STALKER_TS_GPIO, 0xa);
+}
+
+static int ads7846_get_pendown_state(void)
+{
+ return !gpio_get_value(OMAP3_STALKER_TS_GPIO);
+}
+
+struct ads7846_platform_data ads7846_config = {
+ .x_max = 0x0fff,
+ .y_max = 0x0fff,
+ .x_plate_ohms = 180,
+ .pressure_max = 255,
+ .debounce_max = 10,
+ .debounce_tol = 3,
+ .debounce_rep = 1,
+ .get_pendown_state = ads7846_get_pendown_state,
+ .keep_vref_on = 1,
+ .settle_delay_usecs = 150,
+};
+
+static struct omap2_mcspi_device_config ads7846_mcspi_config = {
+ .turbo_mode = 0,
+ .single_channel = 1, /* 0: slave, 1: master */
+};
+
+struct spi_board_info omap3stalker_spi_board_info[] = {
+ [0] = {

+	       .modalias	= "ads7846",
+	       .bus_num		= 1,
+	       .chip_select	= 0,
+	       .max_speed_hz	= 1500000,
+	       .controller_data	= &ads7846_mcspi_config,
+	       .irq		= OMAP_GPIO_IRQ(OMAP3_STALKER_TS_GPIO),
+	       .platform_data	= &ads7846_config,

+ },
+};
+
+static struct omap_board_config_kernel omap3_stalker_config[] __initdata = {
+};
+
+static void __init omap3_stalker_init_irq(void)
+{
+ omap_board_config = omap3_stalker_config;
+ omap_board_config_size = ARRAY_SIZE(omap3_stalker_config);
+ omap2_init_common_hw(mt46h32m32lf6_sdrc_params, NULL);
+ omap_init_irq();
+#ifdef CONFIG_OMAP_32K_TIMER
+ omap2_gp_clockevent_set_gptimer(12);
+#endif
+ omap_gpio_init();
+}
+
+static struct platform_device *omap3_stalker_devices[] __initdata = {
+ &omap3_stalker_dss_device,
+ &keys_gpio,
+};
+
+static struct ehci_hcd_omap_platform_data ehci_pdata __initconst = {
+ .port_mode[0] = EHCI_HCD_OMAP_MODE_UNKNOWN,
+ .port_mode[1] = EHCI_HCD_OMAP_MODE_PHY,
+ .port_mode[2] = EHCI_HCD_OMAP_MODE_UNKNOWN,
+
+ .phy_reset = true,
+ .reset_gpio_port[0] = -EINVAL,
+ .reset_gpio_port[1] = 21,
+ .reset_gpio_port[2] = -EINVAL,
+};
+
+#ifdef CONFIG_OMAP_MUX
+static struct omap_board_mux board_mux[] __initdata = {
+ OMAP3_MUX(SYS_NIRQ, OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLUP |
+ OMAP_PIN_OFF_INPUT_PULLUP | OMAP_PIN_OFF_WAKEUPENABLE),
+ OMAP3_MUX(MCSPI1_CS1, OMAP_MUX_MODE4 | OMAP_PIN_INPUT_PULLUP |
+ OMAP_PIN_OFF_INPUT_PULLUP | OMAP_PIN_OFF_WAKEUPENABLE),
+ {.reg_offset = OMAP_MUX_TERMINATOR},
+};
+#else
+#define board_mux NULL
+#endif
+
+static struct omap_musb_board_data musb_board_data = {
+ .interface_type = MUSB_INTERFACE_ULPI,
+ .mode = MUSB_OTG,
+ .power = 100,
+};
+
+static void __init omap3_stalker_init(void)
+{
+ omap3_mux_init(board_mux, OMAP_PACKAGE_CUS);
+
+ omap3_stalker_i2c_init();
+
+ platform_add_devices(omap3_stalker_devices,
+ ARRAY_SIZE(omap3_stalker_devices));
+
+ spi_register_board_info(omap3stalker_spi_board_info,
+ ARRAY_SIZE(omap3stalker_spi_board_info));
+
+ omap_serial_init();
+ usb_musb_init(&musb_board_data);
+ usb_ehci_init(&ehci_pdata);
+ ads7846_dev_init();
+
+ omap_mux_init_gpio(21, OMAP_PIN_OUTPUT);
+ omap_mux_init_gpio(18, OMAP_PIN_INPUT_PULLUP);
+
+ omap3stalker_init_eth();
+ omap3_stalker_display_init();
+/* Ensure SDRC pins are mux'd for self-refresh */
+ omap_mux_init_signal("sdr_cke0", OMAP_PIN_OUTPUT);
+ omap_mux_init_signal("sdr_cke1", OMAP_PIN_OUTPUT);
+}
+
+static void __init omap3_stalker_map_io(void)
+{
+ omap2_set_globals_343x();
+ omap34xx_map_common_io();
+}
+
+MACHINE_START(SBC3530, "OMAP3 STALKER")
+ /* Maintainer: Jason Lam [email protected] */
+ .phys_io = 0x48000000,
+ .io_pg_offst = ((0xfa000000) >> 18) & 0xfffc,
+ .boot_params = 0x80000100,
+ .map_io = omap3_stalker_map_io,
+ .init_irq = omap3_stalker_init_irq,
+ .init_machine = omap3_stalker_init,
+ .timer = &omap_timer,
+MACHINE_END
--
1.5.4.3