Commit 829ae273 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'omap-for-linus' of...

Merge branch 'omap-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap-2.6

* 'omap-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap-2.6: (33 commits)
  OMAP3: PM: Boot message is not an error, and not helpful, remove it
  OMAP3: cpuidle: change the power domains modes determination logic
  OMAP3: cpuidle: code rework for improved readability
  OMAP3: cpuidle: re-organize the C-states data
  OMAP3: clean-up mach specific cpuidle data structures
  OMAP3 cpuidle: remove useless SDP specific timings
  usb: otg: OMAP4430: Powerdown the internal PHY when USB is disabled
  usb: otg: OMAP4430: Fixing the omap4430_phy_init function
  usb: musb: am35x: fix compile error when building am35x
  usb: musb: OMAP4430: Power down the PHY during board init
  omap: drop board-igep0030.c
  omap: igep0020: add support for IGEP3
  omap: igep0020: minor refactoring
  omap: igep0020: name refactoring for future merge with IGEP3
  omap: Remove support for omap2evm
  arm: omap2plus: GPIO cleanup
  omap: musb: introduce default board config
  omap: move detection of NAND CS to common-board-devices
  omap: use common initialization for PMIC i2c bus
  omap: consolidate touch screen initialization among different boards
  ...
parents 6ddb4518 9b28b11e
...@@ -21,58 +21,22 @@ CONFIG_MODVERSIONS=y ...@@ -21,58 +21,22 @@ CONFIG_MODVERSIONS=y
CONFIG_MODULE_SRCVERSION_ALL=y CONFIG_MODULE_SRCVERSION_ALL=y
# CONFIG_BLK_DEV_BSG is not set # CONFIG_BLK_DEV_BSG is not set
CONFIG_ARCH_OMAP=y CONFIG_ARCH_OMAP=y
CONFIG_ARCH_OMAP2=y
CONFIG_ARCH_OMAP3=y
CONFIG_ARCH_OMAP4=y
CONFIG_OMAP_RESET_CLOCKS=y CONFIG_OMAP_RESET_CLOCKS=y
CONFIG_OMAP_MUX_DEBUG=y CONFIG_OMAP_MUX_DEBUG=y
CONFIG_OMAP_32K_TIMER=y
CONFIG_MACH_OMAP_GENERIC=y
CONFIG_ARCH_OMAP2420=y
CONFIG_ARCH_OMAP2430=y
CONFIG_ARCH_OMAP3430=y
CONFIG_MACH_OMAP_H4=y
CONFIG_MACH_OMAP_APOLLON=y
CONFIG_MACH_OMAP_2430SDP=y
CONFIG_MACH_OMAP3_BEAGLE=y
CONFIG_MACH_DEVKIT8000=y
CONFIG_MACH_OMAP_LDP=y
CONFIG_MACH_OVERO=y
CONFIG_MACH_OMAP3EVM=y
CONFIG_MACH_OMAP3517EVM=y
CONFIG_MACH_OMAP3_PANDORA=y
CONFIG_MACH_OMAP3_TOUCHBOOK=y
CONFIG_MACH_OMAP_3430SDP=y
CONFIG_MACH_NOKIA_N8X0=y
CONFIG_MACH_NOKIA_RX51=y
CONFIG_MACH_OMAP_ZOOM2=y
CONFIG_MACH_OMAP_ZOOM3=y
CONFIG_MACH_CM_T35=y
CONFIG_MACH_IGEP0020=y
CONFIG_MACH_SBC3530=y
CONFIG_MACH_OMAP_3630SDP=y
CONFIG_MACH_OMAP_4430SDP=y
CONFIG_ARM_THUMBEE=y CONFIG_ARM_THUMBEE=y
CONFIG_ARM_L1_CACHE_SHIFT=5
CONFIG_ARM_ERRATA_411920=y CONFIG_ARM_ERRATA_411920=y
CONFIG_NO_HZ=y CONFIG_NO_HZ=y
CONFIG_HIGH_RES_TIMERS=y CONFIG_HIGH_RES_TIMERS=y
CONFIG_SMP=y CONFIG_SMP=y
CONFIG_NR_CPUS=2 CONFIG_NR_CPUS=2
# CONFIG_LOCAL_TIMERS is not set
CONFIG_AEABI=y
CONFIG_LEDS=y CONFIG_LEDS=y
CONFIG_ZBOOT_ROM_TEXT=0x0 CONFIG_ZBOOT_ROM_TEXT=0x0
CONFIG_ZBOOT_ROM_BSS=0x0 CONFIG_ZBOOT_ROM_BSS=0x0
CONFIG_CMDLINE="root=/dev/mmcblk0p2 rootwait console=ttyO2,115200" CONFIG_CMDLINE="root=/dev/mmcblk0p2 rootwait console=ttyO2,115200"
CONFIG_KEXEC=y CONFIG_KEXEC=y
CONFIG_FPE_NWFPE=y CONFIG_FPE_NWFPE=y
CONFIG_VFP=y
CONFIG_NEON=y
CONFIG_BINFMT_MISC=y CONFIG_BINFMT_MISC=y
CONFIG_PM=y
CONFIG_PM_DEBUG=y CONFIG_PM_DEBUG=y
CONFIG_PM_RUNTIME=y
CONFIG_NET=y CONFIG_NET=y
CONFIG_PACKET=y CONFIG_PACKET=y
CONFIG_UNIX=y CONFIG_UNIX=y
...@@ -89,14 +53,6 @@ CONFIG_IP_PNP_RARP=y ...@@ -89,14 +53,6 @@ CONFIG_IP_PNP_RARP=y
# CONFIG_IPV6 is not set # CONFIG_IPV6 is not set
CONFIG_NETFILTER=y CONFIG_NETFILTER=y
CONFIG_BT=m CONFIG_BT=m
CONFIG_BT_L2CAP=m
CONFIG_BT_SCO=m
CONFIG_BT_RFCOMM=y
CONFIG_BT_RFCOMM_TTY=y
CONFIG_BT_BNEP=m
CONFIG_BT_BNEP_MC_FILTER=y
CONFIG_BT_BNEP_PROTO_FILTER=y
CONFIG_BT_HIDP=m
CONFIG_BT_HCIUART=m CONFIG_BT_HCIUART=m
CONFIG_BT_HCIUART_H4=y CONFIG_BT_HCIUART_H4=y
CONFIG_BT_HCIUART_BCSP=y CONFIG_BT_HCIUART_BCSP=y
...@@ -107,11 +63,9 @@ CONFIG_CFG80211=m ...@@ -107,11 +63,9 @@ CONFIG_CFG80211=m
CONFIG_MAC80211=m CONFIG_MAC80211=m
CONFIG_MAC80211_RC_PID=y CONFIG_MAC80211_RC_PID=y
CONFIG_MAC80211_RC_DEFAULT_PID=y CONFIG_MAC80211_RC_DEFAULT_PID=y
CONFIG_MAC80211_LEDS=y
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
CONFIG_CONNECTOR=y CONFIG_CONNECTOR=y
CONFIG_MTD=y CONFIG_MTD=y
CONFIG_MTD_CONCAT=y
CONFIG_MTD_CMDLINE_PARTS=y CONFIG_MTD_CMDLINE_PARTS=y
CONFIG_MTD_CHAR=y CONFIG_MTD_CHAR=y
CONFIG_MTD_BLOCK=y CONFIG_MTD_BLOCK=y
...@@ -127,7 +81,6 @@ CONFIG_MTD_UBI=y ...@@ -127,7 +81,6 @@ CONFIG_MTD_UBI=y
CONFIG_BLK_DEV_LOOP=y CONFIG_BLK_DEV_LOOP=y
CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_RAM=y
CONFIG_BLK_DEV_RAM_SIZE=16384 CONFIG_BLK_DEV_RAM_SIZE=16384
CONFIG_EEPROM_LEGACY=y
CONFIG_SCSI=y CONFIG_SCSI=y
CONFIG_BLK_DEV_SD=y CONFIG_BLK_DEV_SD=y
CONFIG_SCSI_MULTI_LUN=y CONFIG_SCSI_MULTI_LUN=y
...@@ -158,19 +111,15 @@ CONFIG_TOUCHSCREEN_ADS7846=y ...@@ -158,19 +111,15 @@ CONFIG_TOUCHSCREEN_ADS7846=y
CONFIG_INPUT_MISC=y CONFIG_INPUT_MISC=y
CONFIG_INPUT_TWL4030_PWRBUTTON=y CONFIG_INPUT_TWL4030_PWRBUTTON=y
CONFIG_VT_HW_CONSOLE_BINDING=y CONFIG_VT_HW_CONSOLE_BINDING=y
CONFIG_SERIAL_8250=y # CONFIG_LEGACY_PTYS is not set
CONFIG_SERIAL_8250_CONSOLE=y
CONFIG_SERIAL_8250_NR_UARTS=32 CONFIG_SERIAL_8250_NR_UARTS=32
CONFIG_SERIAL_8250_EXTENDED=y CONFIG_SERIAL_8250_EXTENDED=y
CONFIG_SERIAL_8250_MANY_PORTS=y CONFIG_SERIAL_8250_MANY_PORTS=y
CONFIG_SERIAL_8250_SHARE_IRQ=y CONFIG_SERIAL_8250_SHARE_IRQ=y
CONFIG_SERIAL_8250_DETECT_IRQ=y CONFIG_SERIAL_8250_DETECT_IRQ=y
CONFIG_SERIAL_8250_RSA=y CONFIG_SERIAL_8250_RSA=y
# CONFIG_LEGACY_PTYS is not set
CONFIG_HW_RANDOM=y CONFIG_HW_RANDOM=y
CONFIG_I2C=y
CONFIG_I2C_CHARDEV=y CONFIG_I2C_CHARDEV=y
CONFIG_I2C_OMAP=y
CONFIG_SPI=y CONFIG_SPI=y
CONFIG_SPI_OMAP24XX=y CONFIG_SPI_OMAP24XX=y
CONFIG_DEBUG_GPIO=y CONFIG_DEBUG_GPIO=y
...@@ -181,10 +130,6 @@ CONFIG_POWER_SUPPLY=y ...@@ -181,10 +130,6 @@ CONFIG_POWER_SUPPLY=y
CONFIG_WATCHDOG=y CONFIG_WATCHDOG=y
CONFIG_OMAP_WATCHDOG=y CONFIG_OMAP_WATCHDOG=y
CONFIG_TWL4030_WATCHDOG=y CONFIG_TWL4030_WATCHDOG=y
CONFIG_MENELAUS=y
CONFIG_TWL4030_CORE=y
CONFIG_TWL4030_POWER=y
CONFIG_REGULATOR=y
CONFIG_REGULATOR_TWL4030=y CONFIG_REGULATOR_TWL4030=y
CONFIG_REGULATOR_TPS65023=y CONFIG_REGULATOR_TPS65023=y
CONFIG_REGULATOR_TPS6507X=y CONFIG_REGULATOR_TPS6507X=y
...@@ -208,7 +153,6 @@ CONFIG_BACKLIGHT_LCD_SUPPORT=y ...@@ -208,7 +153,6 @@ CONFIG_BACKLIGHT_LCD_SUPPORT=y
CONFIG_LCD_CLASS_DEVICE=y CONFIG_LCD_CLASS_DEVICE=y
CONFIG_LCD_PLATFORM=y CONFIG_LCD_PLATFORM=y
CONFIG_DISPLAY_SUPPORT=y CONFIG_DISPLAY_SUPPORT=y
# CONFIG_VGA_CONSOLE is not set
CONFIG_FRAMEBUFFER_CONSOLE=y CONFIG_FRAMEBUFFER_CONSOLE=y
CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
CONFIG_FONTS=y CONFIG_FONTS=y
...@@ -217,25 +161,20 @@ CONFIG_FONT_8x16=y ...@@ -217,25 +161,20 @@ CONFIG_FONT_8x16=y
CONFIG_LOGO=y CONFIG_LOGO=y
CONFIG_SOUND=m CONFIG_SOUND=m
CONFIG_SND=m CONFIG_SND=m
CONFIG_SND_MIXER_OSS=y CONFIG_SND_MIXER_OSS=m
CONFIG_SND_PCM_OSS=y CONFIG_SND_PCM_OSS=m
CONFIG_SND_VERBOSE_PRINTK=y CONFIG_SND_VERBOSE_PRINTK=y
CONFIG_SND_DEBUG=y CONFIG_SND_DEBUG=y
CONFIG_SND_USB_AUDIO=y CONFIG_SND_USB_AUDIO=m
CONFIG_SND_SOC=y CONFIG_SND_SOC=m
CONFIG_SND_OMAP_SOC=y CONFIG_SND_OMAP_SOC=m
CONFIG_SND_OMAP_SOC_OMAP3_PANDORA=y CONFIG_SND_OMAP_SOC_OMAP3_PANDORA=m
CONFIG_USB=y CONFIG_USB=y
CONFIG_USB_DEBUG=y CONFIG_USB_DEBUG=y
CONFIG_USB_ANNOUNCE_NEW_DEVICES=y CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
CONFIG_USB_DEVICEFS=y CONFIG_USB_DEVICEFS=y
CONFIG_USB_SUSPEND=y CONFIG_USB_SUSPEND=y
# CONFIG_USB_OTG_WHITELIST is not set
CONFIG_USB_MON=y CONFIG_USB_MON=y
# CONFIG_USB_MUSB_HDRC is not set
# CONFIG_USB_MUSB_OTG is not set
# CONFIG_USB_GADGET_MUSB_HDRC is not set
CONFIG_USB_MUSB_DEBUG=y
CONFIG_USB_WDM=y CONFIG_USB_WDM=y
CONFIG_USB_STORAGE=y CONFIG_USB_STORAGE=y
CONFIG_USB_LIBUSUAL=y CONFIG_USB_LIBUSUAL=y
...@@ -250,18 +189,12 @@ CONFIG_MMC_UNSAFE_RESUME=y ...@@ -250,18 +189,12 @@ CONFIG_MMC_UNSAFE_RESUME=y
CONFIG_SDIO_UART=y CONFIG_SDIO_UART=y
CONFIG_MMC_OMAP=y CONFIG_MMC_OMAP=y
CONFIG_MMC_OMAP_HS=y CONFIG_MMC_OMAP_HS=y
CONFIG_LEDS_CLASS=y
CONFIG_LEDS_GPIO=y
CONFIG_LEDS_TRIGGER_TIMER=y
CONFIG_LEDS_TRIGGER_HEARTBEAT=y
CONFIG_LEDS_TRIGGER_DEFAULT_ON=y
CONFIG_RTC_CLASS=y CONFIG_RTC_CLASS=y
CONFIG_RTC_DRV_TWL92330=y CONFIG_RTC_DRV_TWL92330=y
CONFIG_RTC_DRV_TWL4030=y CONFIG_RTC_DRV_TWL4030=y
CONFIG_EXT2_FS=y CONFIG_EXT2_FS=y
CONFIG_EXT3_FS=y CONFIG_EXT3_FS=y
# CONFIG_EXT3_FS_XATTR is not set # CONFIG_EXT3_FS_XATTR is not set
CONFIG_INOTIFY=y
CONFIG_QUOTA=y CONFIG_QUOTA=y
CONFIG_QFMT_V2=y CONFIG_QFMT_V2=y
CONFIG_MSDOS_FS=y CONFIG_MSDOS_FS=y
...@@ -285,12 +218,10 @@ CONFIG_NLS_CODEPAGE_437=y ...@@ -285,12 +218,10 @@ CONFIG_NLS_CODEPAGE_437=y
CONFIG_NLS_ISO8859_1=y CONFIG_NLS_ISO8859_1=y
CONFIG_PRINTK_TIME=y CONFIG_PRINTK_TIME=y
CONFIG_MAGIC_SYSRQ=y CONFIG_MAGIC_SYSRQ=y
CONFIG_DEBUG_FS=y
CONFIG_DEBUG_KERNEL=y CONFIG_DEBUG_KERNEL=y
CONFIG_SCHEDSTATS=y CONFIG_SCHEDSTATS=y
CONFIG_TIMER_STATS=y CONFIG_TIMER_STATS=y
CONFIG_PROVE_LOCKING=y CONFIG_PROVE_LOCKING=y
# CONFIG_LOCK_STAT is not set
CONFIG_DEBUG_SPINLOCK_SLEEP=y CONFIG_DEBUG_SPINLOCK_SLEEP=y
# CONFIG_DEBUG_BUGVERBOSE is not set # CONFIG_DEBUG_BUGVERBOSE is not set
CONFIG_DEBUG_INFO=y CONFIG_DEBUG_INFO=y
......
...@@ -288,6 +288,7 @@ config MACH_IGEP0030 ...@@ -288,6 +288,7 @@ config MACH_IGEP0030
depends on ARCH_OMAP3 depends on ARCH_OMAP3
default y default y
select OMAP_PACKAGE_CBB select OMAP_PACKAGE_CBB
select MACH_IGEP0020
config MACH_SBC3530 config MACH_SBC3530
bool "OMAP3 SBC STALKER board" bool "OMAP3 SBC STALKER board"
......
...@@ -229,8 +229,6 @@ obj-$(CONFIG_MACH_CM_T35) += board-cm-t35.o \ ...@@ -229,8 +229,6 @@ obj-$(CONFIG_MACH_CM_T35) += board-cm-t35.o \
obj-$(CONFIG_MACH_CM_T3517) += board-cm-t3517.o obj-$(CONFIG_MACH_CM_T3517) += board-cm-t3517.o
obj-$(CONFIG_MACH_IGEP0020) += board-igep0020.o \ obj-$(CONFIG_MACH_IGEP0020) += board-igep0020.o \
hsmmc.o hsmmc.o
obj-$(CONFIG_MACH_IGEP0030) += board-igep0030.o \
hsmmc.o
obj-$(CONFIG_MACH_OMAP3_TOUCHBOOK) += board-omap3touchbook.o \ obj-$(CONFIG_MACH_OMAP3_TOUCHBOOK) += board-omap3touchbook.o \
hsmmc.o hsmmc.o
obj-$(CONFIG_MACH_OMAP_4430SDP) += board-4430sdp.o \ obj-$(CONFIG_MACH_OMAP_4430SDP) += board-4430sdp.o \
...@@ -270,3 +268,5 @@ obj-$(CONFIG_ARCH_OMAP4) += hwspinlock.o ...@@ -270,3 +268,5 @@ obj-$(CONFIG_ARCH_OMAP4) += hwspinlock.o
disp-$(CONFIG_OMAP2_DSS) := display.o disp-$(CONFIG_OMAP2_DSS) := display.o
obj-y += $(disp-m) $(disp-y) obj-y += $(disp-m) $(disp-y)
obj-y += common-board-devices.o
...@@ -41,6 +41,7 @@ ...@@ -41,6 +41,7 @@
#include "mux.h" #include "mux.h"
#include "hsmmc.h" #include "hsmmc.h"
#include "common-board-devices.h"
#define SDP2430_CS0_BASE 0x04000000 #define SDP2430_CS0_BASE 0x04000000
#define SECONDARY_LCD_GPIO 147 #define SECONDARY_LCD_GPIO 147
...@@ -180,15 +181,6 @@ static struct twl4030_platform_data sdp2430_twldata = { ...@@ -180,15 +181,6 @@ static struct twl4030_platform_data sdp2430_twldata = {
.vmmc1 = &sdp2430_vmmc1, .vmmc1 = &sdp2430_vmmc1,
}; };
static struct i2c_board_info __initdata sdp2430_i2c_boardinfo[] = {
{
I2C_BOARD_INFO("twl4030", 0x48),
.flags = I2C_CLIENT_WAKE,
.irq = INT_24XX_SYS_NIRQ,
.platform_data = &sdp2430_twldata,
},
};
static struct i2c_board_info __initdata sdp2430_i2c1_boardinfo[] = { static struct i2c_board_info __initdata sdp2430_i2c1_boardinfo[] = {
{ {
I2C_BOARD_INFO("isp1301_omap", 0x2D), I2C_BOARD_INFO("isp1301_omap", 0x2D),
...@@ -201,8 +193,7 @@ static int __init omap2430_i2c_init(void) ...@@ -201,8 +193,7 @@ static int __init omap2430_i2c_init(void)
{ {
omap_register_i2c_bus(1, 100, sdp2430_i2c1_boardinfo, omap_register_i2c_bus(1, 100, sdp2430_i2c1_boardinfo,
ARRAY_SIZE(sdp2430_i2c1_boardinfo)); ARRAY_SIZE(sdp2430_i2c1_boardinfo));
omap_register_i2c_bus(2, 2600, sdp2430_i2c_boardinfo, omap2_pmic_init("twl4030", &sdp2430_twldata);
ARRAY_SIZE(sdp2430_i2c_boardinfo));
return 0; return 0;
} }
...@@ -217,11 +208,6 @@ static struct omap2_hsmmc_info mmc[] __initdata = { ...@@ -217,11 +208,6 @@ static struct omap2_hsmmc_info mmc[] __initdata = {
{} /* Terminator */ {} /* Terminator */
}; };
static struct omap_musb_board_data musb_board_data = {
.interface_type = MUSB_INTERFACE_ULPI,
.mode = MUSB_OTG,
.power = 100,
};
static struct omap_usb_config sdp2430_usb_config __initdata = { static struct omap_usb_config sdp2430_usb_config __initdata = {
.otg = 1, .otg = 1,
#ifdef CONFIG_USB_GADGET_OMAP #ifdef CONFIG_USB_GADGET_OMAP
...@@ -240,8 +226,6 @@ static struct omap_board_mux board_mux[] __initdata = { ...@@ -240,8 +226,6 @@ static struct omap_board_mux board_mux[] __initdata = {
static void __init omap_2430sdp_init(void) static void __init omap_2430sdp_init(void)
{ {
int ret;
omap2430_mux_init(board_mux, OMAP_PACKAGE_ZAC); omap2430_mux_init(board_mux, OMAP_PACKAGE_ZAC);
omap_board_config = sdp2430_config; omap_board_config = sdp2430_config;
...@@ -255,14 +239,13 @@ static void __init omap_2430sdp_init(void) ...@@ -255,14 +239,13 @@ static void __init omap_2430sdp_init(void)
omap2_usbfs_init(&sdp2430_usb_config); omap2_usbfs_init(&sdp2430_usb_config);
omap_mux_init_signal("usb0hs_stp", OMAP_PULL_ENA | OMAP_PULL_UP); omap_mux_init_signal("usb0hs_stp", OMAP_PULL_ENA | OMAP_PULL_UP);
usb_musb_init(&musb_board_data); usb_musb_init(NULL);
board_smc91x_init(); board_smc91x_init();
/* Turn off secondary LCD backlight */ /* Turn off secondary LCD backlight */
ret = gpio_request(SECONDARY_LCD_GPIO, "Secondary LCD backlight"); gpio_request_one(SECONDARY_LCD_GPIO, GPIOF_OUT_INIT_LOW,
if (ret == 0) "Secondary LCD backlight");
gpio_direction_output(SECONDARY_LCD_GPIO, 0);
} }
static void __init omap_2430sdp_map_io(void) static void __init omap_2430sdp_map_io(void)
......
...@@ -19,7 +19,6 @@ ...@@ -19,7 +19,6 @@
#include <linux/input.h> #include <linux/input.h>
#include <linux/input/matrix_keypad.h> #include <linux/input/matrix_keypad.h>
#include <linux/spi/spi.h> #include <linux/spi/spi.h>
#include <linux/spi/ads7846.h>
#include <linux/i2c/twl.h> #include <linux/i2c/twl.h>
#include <linux/regulator/machine.h> #include <linux/regulator/machine.h>
#include <linux/io.h> #include <linux/io.h>
...@@ -48,6 +47,7 @@ ...@@ -48,6 +47,7 @@
#include "hsmmc.h" #include "hsmmc.h"
#include "pm.h" #include "pm.h"
#include "control.h" #include "control.h"
#include "common-board-devices.h"
#define CONFIG_DISABLE_HFCLK 1 #define CONFIG_DISABLE_HFCLK 1
...@@ -59,24 +59,6 @@ ...@@ -59,24 +59,6 @@
#define TWL4030_MSECURE_GPIO 22 #define TWL4030_MSECURE_GPIO 22
/* FIXME: These values need to be updated based on more profiling on 3430sdp*/
static struct cpuidle_params omap3_cpuidle_params_table[] = {
/* C1 */
{1, 2, 2, 5},
/* C2 */
{1, 10, 10, 30},
/* C3 */
{1, 50, 50, 300},
/* C4 */
{1, 1500, 1800, 4000},
/* C5 */
{1, 2500, 7500, 12000},
/* C6 */
{1, 3000, 8500, 15000},
/* C7 */
{1, 10000, 30000, 300000},
};
static uint32_t board_keymap[] = { static uint32_t board_keymap[] = {
KEY(0, 0, KEY_LEFT), KEY(0, 0, KEY_LEFT),
KEY(0, 1, KEY_RIGHT), KEY(0, 1, KEY_RIGHT),
...@@ -123,63 +105,14 @@ static struct twl4030_keypad_data sdp3430_kp_data = { ...@@ -123,63 +105,14 @@ static struct twl4030_keypad_data sdp3430_kp_data = {
.rep = 1, .rep = 1,
}; };
static int ts_gpio; /* Needed for ads7846_get_pendown_state */
/**
* @brief ads7846_dev_init : Requests & sets GPIO line for pen-irq
*
* @return - void. If request gpio fails then Flag KERN_ERR.
*/
static void ads7846_dev_init(void)
{
if (gpio_request(ts_gpio, "ADS7846 pendown") < 0) {
printk(KERN_ERR "can't get ads746 pen down GPIO\n");
return;
}
gpio_direction_input(ts_gpio);
gpio_set_debounce(ts_gpio, 310);
}
static int ads7846_get_pendown_state(void)
{
return !gpio_get_value(ts_gpio);
}
static struct ads7846_platform_data tsc2046_config __initdata = {
.get_pendown_state = ads7846_get_pendown_state,
.keep_vref_on = 1,
.wakeup = true,
};
static struct omap2_mcspi_device_config tsc2046_mcspi_config = {
.turbo_mode = 0,
.single_channel = 1, /* 0: slave, 1: master */
};
static struct spi_board_info sdp3430_spi_board_info[] __initdata = {
[0] = {
/*
* TSC2046 operates at a max freqency of 2MHz, so
* operate slightly below at 1.5MHz
*/
.modalias = "ads7846",
.bus_num = 1,
.chip_select = 0,
.max_speed_hz = 1500000,
.controller_data = &tsc2046_mcspi_config,
.irq = 0,
.platform_data = &tsc2046_config,
},
};
#define SDP3430_LCD_PANEL_BACKLIGHT_GPIO 8 #define SDP3430_LCD_PANEL_BACKLIGHT_GPIO 8
#define SDP3430_LCD_PANEL_ENABLE_GPIO 5 #define SDP3430_LCD_PANEL_ENABLE_GPIO 5
static unsigned backlight_gpio; static struct gpio sdp3430_dss_gpios[] __initdata = {
static unsigned enable_gpio; {SDP3430_LCD_PANEL_ENABLE_GPIO, GPIOF_OUT_INIT_LOW, "LCD reset" },
{SDP3430_LCD_PANEL_BACKLIGHT_GPIO, GPIOF_OUT_INIT_LOW, "LCD Backlight"},
};
static int lcd_enabled; static int lcd_enabled;
static int dvi_enabled; static int dvi_enabled;
...@@ -187,29 +120,11 @@ static void __init sdp3430_display_init(void) ...@@ -187,29 +120,11 @@ static void __init sdp3430_display_init(void)
{ {
int r; int r;
enable_gpio = SDP3430_LCD_PANEL_ENABLE_GPIO; r = gpio_request_array(sdp3430_dss_gpios,
backlight_gpio = SDP3430_LCD_PANEL_BACKLIGHT_GPIO; ARRAY_SIZE(sdp3430_dss_gpios));
if (r)
r = gpio_request(enable_gpio, "LCD reset"); printk(KERN_ERR "failed to get LCD control GPIOs\n");
if (r) {
printk(KERN_ERR "failed to get LCD reset GPIO\n");
goto err0;
}
r = gpio_request(backlight_gpio, "LCD Backlight");
if (r) {
printk(KERN_ERR "failed to get LCD backlight GPIO\n");
goto err1;
}
gpio_direction_output(enable_gpio, 0);
gpio_direction_output(backlight_gpio, 0);
return;
err1:
gpio_free(enable_gpio);
err0:
return;
} }
static int sdp3430_panel_enable_lcd(struct omap_dss_device *dssdev) static int sdp3430_panel_enable_lcd(struct omap_dss_device *dssdev)
...@@ -219,8 +134,8 @@ static int sdp3430_panel_enable_lcd(struct omap_dss_device *dssdev) ...@@ -219,8 +134,8 @@ static int sdp3430_panel_enable_lcd(struct omap_dss_device *dssdev)
return -EINVAL; return -EINVAL;
} }
gpio_direction_output(enable_gpio, 1); gpio_direction_output(SDP3430_LCD_PANEL_ENABLE_GPIO, 1);
gpio_direction_output(backlight_gpio, 1); gpio_direction_output(SDP3430_LCD_PANEL_BACKLIGHT_GPIO, 1);
lcd_enabled = 1; lcd_enabled = 1;
...@@ -231,8 +146,8 @@ static void sdp3430_panel_disable_lcd(struct omap_dss_device *dssdev) ...@@ -231,8 +146,8 @@ static void sdp3430_panel_disable_lcd(struct omap_dss_device *dssdev)
{ {
lcd_enabled = 0; lcd_enabled = 0;
gpio_direction_output(enable_gpio, 0); gpio_direction_output(SDP3430_LCD_PANEL_ENABLE_GPIO, 0);
gpio_direction_output(backlight_gpio, 0); gpio_direction_output(SDP3430_LCD_PANEL_BACKLIGHT_GPIO, 0);
} }
static int sdp3430_panel_enable_dvi(struct omap_dss_device *dssdev) static int sdp3430_panel_enable_dvi(struct omap_dss_device *dssdev)
...@@ -360,12 +275,10 @@ static int sdp3430_twl_gpio_setup(struct device *dev, ...@@ -360,12 +275,10 @@ static int sdp3430_twl_gpio_setup(struct device *dev,
omap2_hsmmc_init(mmc); omap2_hsmmc_init(mmc);
/* gpio + 7 is "sub_lcd_en_bkl" (output/PWM1) */ /* gpio + 7 is "sub_lcd_en_bkl" (output/PWM1) */
gpio_request(gpio + 7, "sub_lcd_en_bkl"); gpio_request_one(gpio + 7, GPIOF_OUT_INIT_LOW, "sub_lcd_en_bkl");
gpio_direction_output(gpio + 7, 0);
/* gpio + 15 is "sub_lcd_nRST" (output) */ /* gpio + 15 is "sub_lcd_nRST" (output) */
gpio_request(gpio + 15, "sub_lcd_nRST"); gpio_request_one(gpio + 15, GPIOF_OUT_INIT_LOW, "sub_lcd_nRST");
gpio_direction_output(gpio + 15, 0);
return 0; return 0;
} }
...@@ -580,20 +493,10 @@ static struct twl4030_platform_data sdp3430_twldata = { ...@@ -580,20 +493,10 @@ static struct twl4030_platform_data sdp3430_twldata = {
.vpll2 = &sdp3430_vpll2, .vpll2 = &sdp3430_vpll2,
}; };
static struct i2c_board_info __initdata sdp3430_i2c_boardinfo[] = {
{
I2C_BOARD_INFO("twl4030", 0x48),
.flags = I2C_CLIENT_WAKE,
.irq = INT_34XX_SYS_NIRQ,
.platform_data = &sdp3430_twldata,
},
};
static int __init omap3430_i2c_init(void) static int __init omap3430_i2c_init(void)
{ {
/* i2c1 for PMIC only */ /* i2c1 for PMIC only */
omap_register_i2c_bus(1, 2600, sdp3430_i2c_boardinfo, omap3_pmic_init("twl4030", &sdp3430_twldata);
ARRAY_SIZE(sdp3430_i2c_boardinfo));
/* i2c2 on camera connector (for sensor control) and optional isp1301 */ /* i2c2 on camera connector (for sensor control) and optional isp1301 */
omap_register_i2c_bus(2, 400, NULL, 0); omap_register_i2c_bus(2, 400, NULL, 0);
/* i2c3 on display connector (for DVI, tfp410) */ /* i2c3 on display connector (for DVI, tfp410) */
...@@ -872,30 +775,22 @@ static struct flash_partitions sdp_flash_partitions[] = { ...@@ -872,30 +775,22 @@ static struct flash_partitions sdp_flash_partitions[] = {
}, },
}; };
static struct omap_musb_board_data musb_board_data = {
.interface_type = MUSB_INTERFACE_ULPI,
.mode = MUSB_OTG,
.power = 100,
};
static void __init omap_3430sdp_init(void) static void __init omap_3430sdp_init(void)
{ {
int gpio_pendown;
omap3_mux_init(board_mux, OMAP_PACKAGE_CBB); omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);
omap_board_config = sdp3430_config; omap_board_config = sdp3430_config;
omap_board_config_size = ARRAY_SIZE(sdp3430_config); omap_board_config_size = ARRAY_SIZE(sdp3430_config);
omap3_pm_init_cpuidle(omap3_cpuidle_params_table);
omap3430_i2c_init(); omap3430_i2c_init();
omap_display_init(&sdp3430_dss_data); omap_display_init(&sdp3430_dss_data);
if (omap_rev() > OMAP3430_REV_ES1_0) if (omap_rev() > OMAP3430_REV_ES1_0)
ts_gpio = SDP3430_TS_GPIO_IRQ_SDPV2; gpio_pendown = SDP3430_TS_GPIO_IRQ_SDPV2;
else else
ts_gpio = SDP3430_TS_GPIO_IRQ_SDPV1; gpio_pendown = SDP3430_TS_GPIO_IRQ_SDPV1;
sdp3430_spi_board_info[0].irq = gpio_to_irq(ts_gpio); omap_ads7846_init(1, gpio_pendown, 310, NULL);
spi_register_board_info(sdp3430_spi_board_info,
ARRAY_SIZE(sdp3430_spi_board_info));
ads7846_dev_init();
board_serial_init(); board_serial_init();
usb_musb_init(&musb_board_data); usb_musb_init(NULL);
board_smc91x_init(); board_smc91x_init();
board_flash_init(sdp_flash_partitions, chip_sel_3430, 0); board_flash_init(sdp_flash_partitions, chip_sel_3430, 0);
sdp3430_display_init(); sdp3430_display_init();
......
...@@ -42,6 +42,7 @@ ...@@ -42,6 +42,7 @@
#include "hsmmc.h" #include "hsmmc.h"
#include "timer-gp.h" #include "timer-gp.h"
#include "control.h" #include "control.h"
#include "common-board-devices.h"
#define ETH_KS8851_IRQ 34 #define ETH_KS8851_IRQ 34
#define ETH_KS8851_POWER_ON 48 #define ETH_KS8851_POWER_ON 48
...@@ -251,58 +252,22 @@ static struct spi_board_info sdp4430_spi_board_info[] __initdata = { ...@@ -251,58 +252,22 @@ static struct spi_board_info sdp4430_spi_board_info[] __initdata = {
}, },
}; };
static struct gpio sdp4430_eth_gpios[] __initdata = {
{ ETH_KS8851_POWER_ON, GPIOF_OUT_INIT_HIGH, "eth_power" },
{ ETH_KS8851_QUART, GPIOF_OUT_INIT_HIGH, "quart" },
{ ETH_KS8851_IRQ, GPIOF_IN, "eth_irq" },
};
static int omap_ethernet_init(void) static int omap_ethernet_init(void)
{ {
int status; int status;
/* Request of GPIO lines */ /* Request of GPIO lines */
status = gpio_request_array(sdp4430_eth_gpios,
ARRAY_SIZE(sdp4430_eth_gpios));
if (status)
pr_err("Cannot request ETH GPIOs\n");
status = gpio_request(ETH_KS8851_POWER_ON, "eth_power");
if (status) {
pr_err("Cannot request GPIO %d\n", ETH_KS8851_POWER_ON);
return status;
}
status = gpio_request(ETH_KS8851_QUART, "quart");
if (status) {
pr_err("Cannot request GPIO %d\n", ETH_KS8851_QUART);
goto error1;
}
status = gpio_request(ETH_KS8851_IRQ, "eth_irq");
if (status) {
pr_err("Cannot request GPIO %d\n", ETH_KS8851_IRQ);
goto error2;
}
/* Configuration of requested GPIO lines */
status = gpio_direction_output(ETH_KS8851_POWER_ON, 1);
if (status) {
pr_err("Cannot set output GPIO %d\n", ETH_KS8851_IRQ);
goto error3;
}
status = gpio_direction_output(ETH_KS8851_QUART, 1);
if (status) {
pr_err("Cannot set output GPIO %d\n", ETH_KS8851_QUART);
goto error3;
}
status = gpio_direction_input(ETH_KS8851_IRQ);
if (status) {
pr_err("Cannot set input GPIO %d\n", ETH_KS8851_IRQ);
goto error3;
}
return 0;
error3:
gpio_free(ETH_KS8851_IRQ);
error2:
gpio_free(ETH_KS8851_QUART);
error1:
gpio_free(ETH_KS8851_POWER_ON);
return status; return status;
} }
...@@ -575,14 +540,6 @@ static struct twl4030_platform_data sdp4430_twldata = { ...@@ -575,14 +540,6 @@ static struct twl4030_platform_data sdp4430_twldata = {
.usb = &omap4_usbphy_data .usb = &omap4_usbphy_data
}; };
static struct i2c_board_info __initdata sdp4430_i2c_boardinfo[] = {
{
I2C_BOARD_INFO("twl6030", 0x48),
.flags = I2C_CLIENT_WAKE,
.irq = OMAP44XX_IRQ_SYS_1N,
.platform_data = &sdp4430_twldata,
},
};
static struct i2c_board_info __initdata sdp4430_i2c_3_boardinfo[] = { static struct i2c_board_info __initdata sdp4430_i2c_3_boardinfo[] = {
{ {
I2C_BOARD_INFO("tmp105", 0x48), I2C_BOARD_INFO("tmp105", 0x48),
...@@ -598,12 +555,7 @@ static struct i2c_board_info __initdata sdp4430_i2c_4_boardinfo[] = { ...@@ -598,12 +555,7 @@ static struct i2c_board_info __initdata sdp4430_i2c_4_boardinfo[] = {
}; };
static int __init omap4_i2c_init(void) static int __init omap4_i2c_init(void)
{ {
/* omap4_pmic_init("twl6030", &sdp4430_twldata);
* Phoenix Audio IC needs I2C1 to
* start with 400 KHz or less
*/
omap_register_i2c_bus(1, 400, sdp4430_i2c_boardinfo,
ARRAY_SIZE(sdp4430_i2c_boardinfo));
omap_register_i2c_bus(2, 400, NULL, 0); omap_register_i2c_bus(2, 400, NULL, 0);
omap_register_i2c_bus(3, 400, sdp4430_i2c_3_boardinfo, omap_register_i2c_bus(3, 400, sdp4430_i2c_3_boardinfo,
ARRAY_SIZE(sdp4430_i2c_3_boardinfo)); ARRAY_SIZE(sdp4430_i2c_3_boardinfo));
...@@ -614,21 +566,13 @@ static int __init omap4_i2c_init(void) ...@@ -614,21 +566,13 @@ static int __init omap4_i2c_init(void)
static void __init omap_sfh7741prox_init(void) static void __init omap_sfh7741prox_init(void)
{ {
int error; int error;
error = gpio_request(OMAP4_SFH7741_ENABLE_GPIO, "sfh7741"); error = gpio_request_one(OMAP4_SFH7741_ENABLE_GPIO,
if (error < 0) { GPIOF_OUT_INIT_LOW, "sfh7741");
if (error < 0)
pr_err("%s:failed to request GPIO %d, error %d\n", pr_err("%s:failed to request GPIO %d, error %d\n",
__func__, OMAP4_SFH7741_ENABLE_GPIO, error); __func__, OMAP4_SFH7741_ENABLE_GPIO, error);
return;
}
error = gpio_direction_output(OMAP4_SFH7741_ENABLE_GPIO , 0);
if (error < 0) {
pr_err("%s: GPIO configuration failed: GPIO %d,error %d\n",
__func__, OMAP4_SFH7741_ENABLE_GPIO, error);
gpio_free(OMAP4_SFH7741_ENABLE_GPIO);
}
} }
static void sdp4430_hdmi_mux_init(void) static void sdp4430_hdmi_mux_init(void)
...@@ -645,27 +589,19 @@ static void sdp4430_hdmi_mux_init(void) ...@@ -645,27 +589,19 @@ static void sdp4430_hdmi_mux_init(void)
OMAP_PIN_INPUT_PULLUP); OMAP_PIN_INPUT_PULLUP);
} }
static struct gpio sdp4430_hdmi_gpios[] = {
{ HDMI_GPIO_HPD, GPIOF_OUT_INIT_HIGH, "hdmi_gpio_hpd" },
{ HDMI_GPIO_LS_OE, GPIOF_OUT_INIT_HIGH, "hdmi_gpio_ls_oe" },
};
static int sdp4430_panel_enable_hdmi(struct omap_dss_device *dssdev) static int sdp4430_panel_enable_hdmi(struct omap_dss_device *dssdev)
{ {
int status; int status;
status = gpio_request_one(HDMI_GPIO_HPD, GPIOF_OUT_INIT_HIGH, status = gpio_request_array(sdp4430_hdmi_gpios,
"hdmi_gpio_hpd"); ARRAY_SIZE(sdp4430_hdmi_gpios));
if (status) { if (status)
pr_err("Cannot request GPIO %d\n", HDMI_GPIO_HPD); pr_err("%s: Cannot request HDMI GPIOs\n", __func__);
return status;
}
status = gpio_request_one(HDMI_GPIO_LS_OE, GPIOF_OUT_INIT_HIGH,
"hdmi_gpio_ls_oe");
if (status) {
pr_err("Cannot request GPIO %d\n", HDMI_GPIO_LS_OE);
goto error1;
}
return 0;
error1:
gpio_free(HDMI_GPIO_HPD);
return status; return status;
} }
......
...@@ -89,19 +89,13 @@ static void __init am3517_crane_init(void) ...@@ -89,19 +89,13 @@ static void __init am3517_crane_init(void)
return; return;
} }
ret = gpio_request(GPIO_USB_POWER, "usb_ehci_enable"); ret = gpio_request_one(GPIO_USB_POWER, GPIOF_OUT_INIT_HIGH,
"usb_ehci_enable");
if (ret < 0) { if (ret < 0) {
pr_err("Can not request GPIO %d\n", GPIO_USB_POWER); pr_err("Can not request GPIO %d\n", GPIO_USB_POWER);
return; return;
} }
ret = gpio_direction_output(GPIO_USB_POWER, 1);
if (ret < 0) {
gpio_free(GPIO_USB_POWER);
pr_err("Unable to initialize EHCI power\n");
return;
}
usbhs_init(&usbhs_bdata); usbhs_init(&usbhs_bdata);
} }
......
...@@ -174,19 +174,14 @@ static void __init am3517_evm_rtc_init(void) ...@@ -174,19 +174,14 @@ static void __init am3517_evm_rtc_init(void)
int r; int r;
omap_mux_init_gpio(GPIO_RTCS35390A_IRQ, OMAP_PIN_INPUT_PULLUP); omap_mux_init_gpio(GPIO_RTCS35390A_IRQ, OMAP_PIN_INPUT_PULLUP);
r = gpio_request(GPIO_RTCS35390A_IRQ, "rtcs35390a-irq");
r = gpio_request_one(GPIO_RTCS35390A_IRQ, GPIOF_IN, "rtcs35390a-irq");
if (r < 0) { if (r < 0) {
printk(KERN_WARNING "failed to request GPIO#%d\n", printk(KERN_WARNING "failed to request GPIO#%d\n",
GPIO_RTCS35390A_IRQ); GPIO_RTCS35390A_IRQ);
return; return;
} }
r = gpio_direction_input(GPIO_RTCS35390A_IRQ);
if (r < 0) {
printk(KERN_WARNING "GPIO#%d cannot be configured as input\n",
GPIO_RTCS35390A_IRQ);
gpio_free(GPIO_RTCS35390A_IRQ);
return;
}
am3517evm_i2c1_boardinfo[0].irq = gpio_to_irq(GPIO_RTCS35390A_IRQ); am3517evm_i2c1_boardinfo[0].irq = gpio_to_irq(GPIO_RTCS35390A_IRQ);
} }
...@@ -242,6 +237,15 @@ static int dvi_enabled; ...@@ -242,6 +237,15 @@ static int dvi_enabled;
#if defined(CONFIG_PANEL_SHARP_LQ043T1DG01) || \ #if defined(CONFIG_PANEL_SHARP_LQ043T1DG01) || \
defined(CONFIG_PANEL_SHARP_LQ043T1DG01_MODULE) defined(CONFIG_PANEL_SHARP_LQ043T1DG01_MODULE)
static struct gpio am3517_evm_dss_gpios[] __initdata = {
/* GPIO 182 = LCD Backlight Power */
{ LCD_PANEL_BKLIGHT_PWR, GPIOF_OUT_INIT_HIGH, "lcd_backlight_pwr" },
/* GPIO 181 = LCD Panel PWM */
{ LCD_PANEL_PWM, GPIOF_OUT_INIT_HIGH, "lcd bl enable" },
/* GPIO 176 = LCD Panel Power enable pin */
{ LCD_PANEL_PWR, GPIOF_OUT_INIT_HIGH, "dvi enable" },
};
static void __init am3517_evm_display_init(void) static void __init am3517_evm_display_init(void)
{ {
int r; int r;
...@@ -249,41 +253,15 @@ static void __init am3517_evm_display_init(void) ...@@ -249,41 +253,15 @@ static void __init am3517_evm_display_init(void)
omap_mux_init_gpio(LCD_PANEL_PWR, OMAP_PIN_INPUT_PULLUP); omap_mux_init_gpio(LCD_PANEL_PWR, OMAP_PIN_INPUT_PULLUP);
omap_mux_init_gpio(LCD_PANEL_BKLIGHT_PWR, OMAP_PIN_INPUT_PULLDOWN); omap_mux_init_gpio(LCD_PANEL_BKLIGHT_PWR, OMAP_PIN_INPUT_PULLDOWN);
omap_mux_init_gpio(LCD_PANEL_PWM, OMAP_PIN_INPUT_PULLDOWN); omap_mux_init_gpio(LCD_PANEL_PWM, OMAP_PIN_INPUT_PULLDOWN);
/*
* Enable GPIO 182 = LCD Backlight Power r = gpio_request_array(am3517_evm_dss_gpios,
*/ ARRAY_SIZE(am3517_evm_dss_gpios));
r = gpio_request(LCD_PANEL_BKLIGHT_PWR, "lcd_backlight_pwr");
if (r) { if (r) {
printk(KERN_ERR "failed to get lcd_backlight_pwr\n"); printk(KERN_ERR "failed to get DSS panel control GPIOs\n");
return; return;
} }
gpio_direction_output(LCD_PANEL_BKLIGHT_PWR, 1);
/*
* Enable GPIO 181 = LCD Panel PWM
*/
r = gpio_request(LCD_PANEL_PWM, "lcd_pwm");
if (r) {
printk(KERN_ERR "failed to get lcd_pwm\n");
goto err_1;
}
gpio_direction_output(LCD_PANEL_PWM, 1);
/*
* Enable GPIO 176 = LCD Panel Power enable pin
*/
r = gpio_request(LCD_PANEL_PWR, "lcd_panel_pwr");
if (r) {
printk(KERN_ERR "failed to get lcd_panel_pwr\n");
goto err_2;
}
gpio_direction_output(LCD_PANEL_PWR, 1);
printk(KERN_INFO "Display initialized successfully\n"); printk(KERN_INFO "Display initialized successfully\n");
return;
err_2:
gpio_free(LCD_PANEL_PWM);
err_1:
gpio_free(LCD_PANEL_BKLIGHT_PWR);
} }
#else #else
static void __init am3517_evm_display_init(void) {} static void __init am3517_evm_display_init(void) {}
...@@ -396,7 +374,7 @@ static struct omap_musb_board_data musb_board_data = { ...@@ -396,7 +374,7 @@ static struct omap_musb_board_data musb_board_data = {
.power = 500, .power = 500,
.set_phy_power = am35x_musb_phy_power, .set_phy_power = am35x_musb_phy_power,
.clear_irq = am35x_musb_clear_irq, .clear_irq = am35x_musb_clear_irq,
.set_mode = am35x_musb_set_mode, .set_mode = am35x_set_mode,
.reset = am35x_musb_reset, .reset = am35x_musb_reset,
}; };
......
...@@ -202,6 +202,7 @@ static inline void __init apollon_init_smc91x(void) ...@@ -202,6 +202,7 @@ static inline void __init apollon_init_smc91x(void)
unsigned int rate; unsigned int rate;
struct clk *gpmc_fck; struct clk *gpmc_fck;
int eth_cs; int eth_cs;
int err;
gpmc_fck = clk_get(NULL, "gpmc_fck"); /* Always on ENABLE_ON_INIT */ gpmc_fck = clk_get(NULL, "gpmc_fck"); /* Always on ENABLE_ON_INIT */
if (IS_ERR(gpmc_fck)) { if (IS_ERR(gpmc_fck)) {
...@@ -245,15 +246,13 @@ static inline void __init apollon_init_smc91x(void) ...@@ -245,15 +246,13 @@ static inline void __init apollon_init_smc91x(void)
apollon_smc91x_resources[0].end = base + 0x30f; apollon_smc91x_resources[0].end = base + 0x30f;
udelay(100); udelay(100);
omap_mux_init_gpio(74, 0); omap_mux_init_gpio(APOLLON_ETHR_GPIO_IRQ, 0);
if (gpio_request(APOLLON_ETHR_GPIO_IRQ, "SMC91x irq") < 0) { err = gpio_request_one(APOLLON_ETHR_GPIO_IRQ, GPIOF_IN, "SMC91x irq");
if (err) {
printk(KERN_ERR "Failed to request GPIO%d for smc91x IRQ\n", printk(KERN_ERR "Failed to request GPIO%d for smc91x IRQ\n",
APOLLON_ETHR_GPIO_IRQ); APOLLON_ETHR_GPIO_IRQ);
gpmc_cs_free(APOLLON_ETH_CS); gpmc_cs_free(APOLLON_ETH_CS);
goto out;
} }
gpio_direction_input(APOLLON_ETHR_GPIO_IRQ);
out: out:
clk_disable(gpmc_fck); clk_disable(gpmc_fck);
clk_put(gpmc_fck); clk_put(gpmc_fck);
...@@ -280,20 +279,19 @@ static void __init omap_apollon_init_early(void) ...@@ -280,20 +279,19 @@ static void __init omap_apollon_init_early(void)
omap2_init_common_devices(NULL, NULL); omap2_init_common_devices(NULL, NULL);
} }
static struct gpio apollon_gpio_leds[] __initdata = {
{ LED0_GPIO13, GPIOF_OUT_INIT_LOW, "LED0" }, /* LED0 - AA10 */
{ LED1_GPIO14, GPIOF_OUT_INIT_LOW, "LED1" }, /* LED1 - AA6 */
{ LED2_GPIO15, GPIOF_OUT_INIT_LOW, "LED2" }, /* LED2 - AA4 */
};
static void __init apollon_led_init(void) static void __init apollon_led_init(void)
{ {
/* LED0 - AA10 */
omap_mux_init_signal("vlynq_clk.gpio_13", 0); omap_mux_init_signal("vlynq_clk.gpio_13", 0);
gpio_request(LED0_GPIO13, "LED0");
gpio_direction_output(LED0_GPIO13, 0);
/* LED1 - AA6 */
omap_mux_init_signal("vlynq_rx1.gpio_14", 0); omap_mux_init_signal("vlynq_rx1.gpio_14", 0);
gpio_request(LED1_GPIO14, "LED1");
gpio_direction_output(LED1_GPIO14, 0);
/* LED2 - AA4 */
omap_mux_init_signal("vlynq_rx0.gpio_15", 0); omap_mux_init_signal("vlynq_rx0.gpio_15", 0);
gpio_request(LED2_GPIO15, "LED2");
gpio_direction_output(LED2_GPIO15, 0); gpio_request_array(apollon_gpio_leds, ARRAY_SIZE(apollon_gpio_leds));
} }
static void __init apollon_usb_init(void) static void __init apollon_usb_init(void)
...@@ -301,8 +299,7 @@ static void __init apollon_usb_init(void) ...@@ -301,8 +299,7 @@ static void __init apollon_usb_init(void)
/* USB device */ /* USB device */
/* DEVICE_SUSPEND */ /* DEVICE_SUSPEND */
omap_mux_init_signal("mcbsp2_clkx.gpio_12", 0); omap_mux_init_signal("mcbsp2_clkx.gpio_12", 0);
gpio_request(12, "USB suspend"); gpio_request_one(12, GPIOF_OUT_INIT_LOW, "USB suspend");
gpio_direction_output(12, 0);
omap2_usbfs_init(&apollon_usb_config); omap2_usbfs_init(&apollon_usb_config);
} }
......
...@@ -54,6 +54,7 @@ ...@@ -54,6 +54,7 @@
#include "mux.h" #include "mux.h"
#include "sdram-micron-mt46h32m32lf-6.h" #include "sdram-micron-mt46h32m32lf-6.h"
#include "hsmmc.h" #include "hsmmc.h"
#include "common-board-devices.h"
#define CM_T35_GPIO_PENDOWN 57 #define CM_T35_GPIO_PENDOWN 57
...@@ -66,86 +67,28 @@ ...@@ -66,86 +67,28 @@
#if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE) #if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE)
#include <linux/smsc911x.h> #include <linux/smsc911x.h>
#include <plat/gpmc-smsc911x.h>
static struct smsc911x_platform_config cm_t35_smsc911x_config = { static struct omap_smsc911x_platform_data cm_t35_smsc911x_cfg = {
.irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_LOW,
.irq_type = SMSC911X_IRQ_TYPE_OPEN_DRAIN,
.flags = SMSC911X_USE_32BIT | SMSC911X_SAVE_MAC_ADDRESS,
.phy_interface = PHY_INTERFACE_MODE_MII,
};
static struct resource cm_t35_smsc911x_resources[] = {
{
.flags = IORESOURCE_MEM,
},
{
.start = OMAP_GPIO_IRQ(CM_T35_SMSC911X_GPIO),
.end = OMAP_GPIO_IRQ(CM_T35_SMSC911X_GPIO),
.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_LOWLEVEL,
},
};
static struct platform_device cm_t35_smsc911x_device = {
.name = "smsc911x",
.id = 0, .id = 0,
.num_resources = ARRAY_SIZE(cm_t35_smsc911x_resources), .cs = CM_T35_SMSC911X_CS,
.resource = cm_t35_smsc911x_resources, .gpio_irq = CM_T35_SMSC911X_GPIO,
.dev = { .gpio_reset = -EINVAL,
.platform_data = &cm_t35_smsc911x_config, .flags = SMSC911X_USE_32BIT | SMSC911X_SAVE_MAC_ADDRESS,
},
};
static struct resource sb_t35_smsc911x_resources[] = {
{
.flags = IORESOURCE_MEM,
},
{
.start = OMAP_GPIO_IRQ(SB_T35_SMSC911X_GPIO),
.end = OMAP_GPIO_IRQ(SB_T35_SMSC911X_GPIO),
.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_LOWLEVEL,
},
}; };
static struct platform_device sb_t35_smsc911x_device = { static struct omap_smsc911x_platform_data sb_t35_smsc911x_cfg = {
.name = "smsc911x",
.id = 1, .id = 1,
.num_resources = ARRAY_SIZE(sb_t35_smsc911x_resources), .cs = SB_T35_SMSC911X_CS,
.resource = sb_t35_smsc911x_resources, .gpio_irq = SB_T35_SMSC911X_GPIO,
.dev = { .gpio_reset = -EINVAL,
.platform_data = &cm_t35_smsc911x_config, .flags = SMSC911X_USE_32BIT | SMSC911X_SAVE_MAC_ADDRESS,
},
}; };
static void __init cm_t35_init_smsc911x(struct platform_device *dev,
int cs, int irq_gpio)
{
unsigned long cs_mem_base;
if (gpmc_cs_request(cs, SZ_16M, &cs_mem_base) < 0) {
pr_err("CM-T35: Failed request for GPMC mem for smsc911x\n");
return;
}
dev->resource[0].start = cs_mem_base + 0x0;
dev->resource[0].end = cs_mem_base + 0xff;
if ((gpio_request(irq_gpio, "ETH IRQ") == 0) &&
(gpio_direction_input(irq_gpio) == 0)) {
gpio_export(irq_gpio, 0);
} else {
pr_err("CM-T35: could not obtain gpio for SMSC911X IRQ\n");
return;
}
platform_device_register(dev);
}
static void __init cm_t35_init_ethernet(void) static void __init cm_t35_init_ethernet(void)
{ {
cm_t35_init_smsc911x(&cm_t35_smsc911x_device, gpmc_smsc911x_init(&cm_t35_smsc911x_cfg);
CM_T35_SMSC911X_CS, CM_T35_SMSC911X_GPIO); gpmc_smsc911x_init(&sb_t35_smsc911x_cfg);
cm_t35_init_smsc911x(&sb_t35_smsc911x_device,
SB_T35_SMSC911X_CS, SB_T35_SMSC911X_GPIO);
} }
#else #else
static inline void __init cm_t35_init_ethernet(void) { return; } static inline void __init cm_t35_init_ethernet(void) { return; }
...@@ -235,69 +178,10 @@ static void __init cm_t35_init_nand(void) ...@@ -235,69 +178,10 @@ static void __init cm_t35_init_nand(void)
static inline void cm_t35_init_nand(void) {} static inline void cm_t35_init_nand(void) {}
#endif #endif
#if defined(CONFIG_TOUCHSCREEN_ADS7846) || \
defined(CONFIG_TOUCHSCREEN_ADS7846_MODULE)
#include <linux/spi/ads7846.h>
static struct omap2_mcspi_device_config ads7846_mcspi_config = {
.turbo_mode = 0,
.single_channel = 1, /* 0: slave, 1: master */
};
static int ads7846_get_pendown_state(void)
{
return !gpio_get_value(CM_T35_GPIO_PENDOWN);
}
static 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,
};
static struct spi_board_info cm_t35_spi_board_info[] __initdata = {
{
.modalias = "ads7846",
.bus_num = 1,
.chip_select = 0,
.max_speed_hz = 1500000,
.controller_data = &ads7846_mcspi_config,
.irq = OMAP_GPIO_IRQ(CM_T35_GPIO_PENDOWN),
.platform_data = &ads7846_config,
},
};
static void __init cm_t35_init_ads7846(void)
{
if ((gpio_request(CM_T35_GPIO_PENDOWN, "ADS7846_PENDOWN") == 0) &&
(gpio_direction_input(CM_T35_GPIO_PENDOWN) == 0)) {
gpio_export(CM_T35_GPIO_PENDOWN, 0);
} else {
pr_err("CM-T35: could not obtain gpio for ADS7846_PENDOWN\n");
return;
}
spi_register_board_info(cm_t35_spi_board_info,
ARRAY_SIZE(cm_t35_spi_board_info));
}
#else
static inline void cm_t35_init_ads7846(void) {}
#endif
#define CM_T35_LCD_EN_GPIO 157 #define CM_T35_LCD_EN_GPIO 157
#define CM_T35_LCD_BL_GPIO 58 #define CM_T35_LCD_BL_GPIO 58
#define CM_T35_DVI_EN_GPIO 54 #define CM_T35_DVI_EN_GPIO 54
static int lcd_bl_gpio;
static int lcd_en_gpio;
static int dvi_en_gpio;
static int lcd_enabled; static int lcd_enabled;
static int dvi_enabled; static int dvi_enabled;
...@@ -308,8 +192,8 @@ static int cm_t35_panel_enable_lcd(struct omap_dss_device *dssdev) ...@@ -308,8 +192,8 @@ static int cm_t35_panel_enable_lcd(struct omap_dss_device *dssdev)
return -EINVAL; return -EINVAL;
} }
gpio_set_value(lcd_en_gpio, 1); gpio_set_value(CM_T35_LCD_EN_GPIO, 1);
gpio_set_value(lcd_bl_gpio, 1); gpio_set_value(CM_T35_LCD_BL_GPIO, 1);
lcd_enabled = 1; lcd_enabled = 1;
...@@ -320,8 +204,8 @@ static void cm_t35_panel_disable_lcd(struct omap_dss_device *dssdev) ...@@ -320,8 +204,8 @@ static void cm_t35_panel_disable_lcd(struct omap_dss_device *dssdev)
{ {
lcd_enabled = 0; lcd_enabled = 0;
gpio_set_value(lcd_bl_gpio, 0); gpio_set_value(CM_T35_LCD_BL_GPIO, 0);
gpio_set_value(lcd_en_gpio, 0); gpio_set_value(CM_T35_LCD_EN_GPIO, 0);
} }
static int cm_t35_panel_enable_dvi(struct omap_dss_device *dssdev) static int cm_t35_panel_enable_dvi(struct omap_dss_device *dssdev)
...@@ -331,7 +215,7 @@ static int cm_t35_panel_enable_dvi(struct omap_dss_device *dssdev) ...@@ -331,7 +215,7 @@ static int cm_t35_panel_enable_dvi(struct omap_dss_device *dssdev)
return -EINVAL; return -EINVAL;
} }
gpio_set_value(dvi_en_gpio, 0); gpio_set_value(CM_T35_DVI_EN_GPIO, 0);
dvi_enabled = 1; dvi_enabled = 1;
return 0; return 0;
...@@ -339,7 +223,7 @@ static int cm_t35_panel_enable_dvi(struct omap_dss_device *dssdev) ...@@ -339,7 +223,7 @@ static int cm_t35_panel_enable_dvi(struct omap_dss_device *dssdev)
static void cm_t35_panel_disable_dvi(struct omap_dss_device *dssdev) static void cm_t35_panel_disable_dvi(struct omap_dss_device *dssdev)
{ {
gpio_set_value(dvi_en_gpio, 1); gpio_set_value(CM_T35_DVI_EN_GPIO, 1);
dvi_enabled = 0; dvi_enabled = 0;
} }
...@@ -421,62 +305,38 @@ static struct spi_board_info cm_t35_lcd_spi_board_info[] __initdata = { ...@@ -421,62 +305,38 @@ static struct spi_board_info cm_t35_lcd_spi_board_info[] __initdata = {
}, },
}; };
static struct gpio cm_t35_dss_gpios[] __initdata = {
{ CM_T35_LCD_EN_GPIO, GPIOF_OUT_INIT_LOW, "lcd enable" },
{ CM_T35_LCD_BL_GPIO, GPIOF_OUT_INIT_LOW, "lcd bl enable" },
{ CM_T35_DVI_EN_GPIO, GPIOF_OUT_INIT_HIGH, "dvi enable" },
};
static void __init cm_t35_init_display(void) static void __init cm_t35_init_display(void)
{ {
int err; int err;
lcd_en_gpio = CM_T35_LCD_EN_GPIO;
lcd_bl_gpio = CM_T35_LCD_BL_GPIO;
dvi_en_gpio = CM_T35_DVI_EN_GPIO;
spi_register_board_info(cm_t35_lcd_spi_board_info, spi_register_board_info(cm_t35_lcd_spi_board_info,
ARRAY_SIZE(cm_t35_lcd_spi_board_info)); ARRAY_SIZE(cm_t35_lcd_spi_board_info));
err = gpio_request(lcd_en_gpio, "LCD RST"); err = gpio_request_array(cm_t35_dss_gpios,
if (err) { ARRAY_SIZE(cm_t35_dss_gpios));
pr_err("CM-T35: failed to get LCD reset GPIO\n");
goto out;
}
err = gpio_request(lcd_bl_gpio, "LCD BL");
if (err) { if (err) {
pr_err("CM-T35: failed to get LCD backlight control GPIO\n"); pr_err("CM-T35: failed to request DSS control GPIOs\n");
goto err_lcd_bl; return;
}
err = gpio_request(dvi_en_gpio, "DVI EN");
if (err) {
pr_err("CM-T35: failed to get DVI reset GPIO\n");
goto err_dvi_en;
} }
gpio_export(lcd_en_gpio, 0); gpio_export(CM_T35_LCD_EN_GPIO, 0);
gpio_export(lcd_bl_gpio, 0); gpio_export(CM_T35_LCD_BL_GPIO, 0);
gpio_export(dvi_en_gpio, 0); gpio_export(CM_T35_DVI_EN_GPIO, 0);
gpio_direction_output(lcd_en_gpio, 0);
gpio_direction_output(lcd_bl_gpio, 0);
gpio_direction_output(dvi_en_gpio, 1);
msleep(50); msleep(50);
gpio_set_value(lcd_en_gpio, 1); gpio_set_value(CM_T35_LCD_EN_GPIO, 1);
err = omap_display_init(&cm_t35_dss_data); err = omap_display_init(&cm_t35_dss_data);
if (err) { if (err) {
pr_err("CM-T35: failed to register DSS device\n"); pr_err("CM-T35: failed to register DSS device\n");
goto err_dev_reg; gpio_free_array(cm_t35_dss_gpios, ARRAY_SIZE(cm_t35_dss_gpios));
} }
return;
err_dev_reg:
gpio_free(dvi_en_gpio);
err_dvi_en:
gpio_free(lcd_bl_gpio);
err_lcd_bl:
gpio_free(lcd_en_gpio);
out:
return;
} }
static struct regulator_consumer_supply cm_t35_vmmc1_supply = { static struct regulator_consumer_supply cm_t35_vmmc1_supply = {
...@@ -609,10 +469,8 @@ static int cm_t35_twl_gpio_setup(struct device *dev, unsigned gpio, ...@@ -609,10 +469,8 @@ static int cm_t35_twl_gpio_setup(struct device *dev, unsigned gpio,
{ {
int wlan_rst = gpio + 2; int wlan_rst = gpio + 2;
if ((gpio_request(wlan_rst, "WLAN RST") == 0) && if (gpio_request_one(wlan_rst, GPIOF_OUT_INIT_HIGH, "WLAN RST") == 0) {
(gpio_direction_output(wlan_rst, 1) == 0)) {
gpio_export(wlan_rst, 0); gpio_export(wlan_rst, 0);
udelay(10); udelay(10);
gpio_set_value(wlan_rst, 0); gpio_set_value(wlan_rst, 0);
udelay(10); udelay(10);
...@@ -653,19 +511,9 @@ static struct twl4030_platform_data cm_t35_twldata = { ...@@ -653,19 +511,9 @@ static struct twl4030_platform_data cm_t35_twldata = {
.vpll2 = &cm_t35_vpll2, .vpll2 = &cm_t35_vpll2,
}; };
static struct i2c_board_info __initdata cm_t35_i2c_boardinfo[] = {
{
I2C_BOARD_INFO("tps65930", 0x48),
.flags = I2C_CLIENT_WAKE,
.irq = INT_34XX_SYS_NIRQ,
.platform_data = &cm_t35_twldata,
},
};
static void __init cm_t35_init_i2c(void) static void __init cm_t35_init_i2c(void)
{ {
omap_register_i2c_bus(1, 2600, cm_t35_i2c_boardinfo, omap3_pmic_init("tps65930", &cm_t35_twldata);
ARRAY_SIZE(cm_t35_i2c_boardinfo));
} }
static void __init cm_t35_init_early(void) static void __init cm_t35_init_early(void)
...@@ -775,12 +623,6 @@ static struct omap_board_mux board_mux[] __initdata = { ...@@ -775,12 +623,6 @@ static struct omap_board_mux board_mux[] __initdata = {
}; };
#endif #endif
static struct omap_musb_board_data musb_board_data = {
.interface_type = MUSB_INTERFACE_ULPI,
.mode = MUSB_OTG,
.power = 100,
};
static struct omap_board_config_kernel cm_t35_config[] __initdata = { static struct omap_board_config_kernel cm_t35_config[] __initdata = {
}; };
...@@ -792,12 +634,12 @@ static void __init cm_t35_init(void) ...@@ -792,12 +634,12 @@ static void __init cm_t35_init(void)
omap_serial_init(); omap_serial_init();
cm_t35_init_i2c(); cm_t35_init_i2c();
cm_t35_init_nand(); cm_t35_init_nand();
cm_t35_init_ads7846(); omap_ads7846_init(1, CM_T35_GPIO_PENDOWN, 0, NULL);
cm_t35_init_ethernet(); cm_t35_init_ethernet();
cm_t35_init_led(); cm_t35_init_led();
cm_t35_init_display(); cm_t35_init_display();
usb_musb_init(&musb_board_data); usb_musb_init(NULL);
usbhs_init(&usbhs_bdata); usbhs_init(&usbhs_bdata);
} }
......
...@@ -148,14 +148,13 @@ static void __init cm_t3517_init_rtc(void) ...@@ -148,14 +148,13 @@ static void __init cm_t3517_init_rtc(void)
{ {
int err; int err;
err = gpio_request(RTC_CS_EN_GPIO, "rtc cs en"); err = gpio_request_one(RTC_CS_EN_GPIO, GPIOF_OUT_INIT_HIGH,
"rtc cs en");
if (err) { if (err) {
pr_err("CM-T3517: rtc cs en gpio request failed: %d\n", err); pr_err("CM-T3517: rtc cs en gpio request failed: %d\n", err);
return; return;
} }
gpio_direction_output(RTC_CS_EN_GPIO, 1);
platform_device_register(&cm_t3517_rtc_device); platform_device_register(&cm_t3517_rtc_device);
} }
#else #else
...@@ -182,11 +181,11 @@ static int cm_t3517_init_usbh(void) ...@@ -182,11 +181,11 @@ static int cm_t3517_init_usbh(void)
{ {
int err; int err;
err = gpio_request(USB_HUB_RESET_GPIO, "usb hub rst"); err = gpio_request_one(USB_HUB_RESET_GPIO, GPIOF_OUT_INIT_LOW,
"usb hub rst");
if (err) { if (err) {
pr_err("CM-T3517: usb hub rst gpio request failed: %d\n", err); pr_err("CM-T3517: usb hub rst gpio request failed: %d\n", err);
} else { } else {
gpio_direction_output(USB_HUB_RESET_GPIO, 0);
udelay(10); udelay(10);
gpio_set_value(USB_HUB_RESET_GPIO, 1); gpio_set_value(USB_HUB_RESET_GPIO, 1);
msleep(1); msleep(1);
......
...@@ -51,7 +51,6 @@ ...@@ -51,7 +51,6 @@
#include <plat/mcspi.h> #include <plat/mcspi.h>
#include <linux/input/matrix_keypad.h> #include <linux/input/matrix_keypad.h>
#include <linux/spi/spi.h> #include <linux/spi/spi.h>
#include <linux/spi/ads7846.h>
#include <linux/dm9000.h> #include <linux/dm9000.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
...@@ -60,6 +59,7 @@ ...@@ -60,6 +59,7 @@
#include "mux.h" #include "mux.h"
#include "hsmmc.h" #include "hsmmc.h"
#include "timer-gp.h" #include "timer-gp.h"
#include "common-board-devices.h"
#define NAND_BLOCK_SIZE SZ_128K #define NAND_BLOCK_SIZE SZ_128K
...@@ -97,13 +97,6 @@ static struct mtd_partition devkit8000_nand_partitions[] = { ...@@ -97,13 +97,6 @@ static struct mtd_partition devkit8000_nand_partitions[] = {
}, },
}; };
static struct omap_nand_platform_data devkit8000_nand_data = {
.options = NAND_BUSWIDTH_16,
.parts = devkit8000_nand_partitions,
.nr_parts = ARRAY_SIZE(devkit8000_nand_partitions),
.dma_channel = -1, /* disable DMA in OMAP NAND driver */
};
static struct omap2_hsmmc_info mmc[] = { static struct omap2_hsmmc_info mmc[] = {
{ {
.mmc = 1, .mmc = 1,
...@@ -249,7 +242,7 @@ static int devkit8000_twl_gpio_setup(struct device *dev, ...@@ -249,7 +242,7 @@ static int devkit8000_twl_gpio_setup(struct device *dev,
/* TWL4030_GPIO_MAX + 0 is "LCD_PWREN" (out, active high) */ /* TWL4030_GPIO_MAX + 0 is "LCD_PWREN" (out, active high) */
devkit8000_lcd_device.reset_gpio = gpio + TWL4030_GPIO_MAX + 0; devkit8000_lcd_device.reset_gpio = gpio + TWL4030_GPIO_MAX + 0;
ret = gpio_request_one(devkit8000_lcd_device.reset_gpio, ret = gpio_request_one(devkit8000_lcd_device.reset_gpio,
GPIOF_DIR_OUT | GPIOF_INIT_LOW, "LCD_PWREN"); GPIOF_OUT_INIT_LOW, "LCD_PWREN");
if (ret < 0) { if (ret < 0) {
devkit8000_lcd_device.reset_gpio = -EINVAL; devkit8000_lcd_device.reset_gpio = -EINVAL;
printk(KERN_ERR "Failed to request GPIO for LCD_PWRN\n"); printk(KERN_ERR "Failed to request GPIO for LCD_PWRN\n");
...@@ -258,7 +251,7 @@ static int devkit8000_twl_gpio_setup(struct device *dev, ...@@ -258,7 +251,7 @@ static int devkit8000_twl_gpio_setup(struct device *dev,
/* gpio + 7 is "DVI_PD" (out, active low) */ /* gpio + 7 is "DVI_PD" (out, active low) */
devkit8000_dvi_device.reset_gpio = gpio + 7; devkit8000_dvi_device.reset_gpio = gpio + 7;
ret = gpio_request_one(devkit8000_dvi_device.reset_gpio, ret = gpio_request_one(devkit8000_dvi_device.reset_gpio,
GPIOF_DIR_OUT | GPIOF_INIT_LOW, "DVI PowerDown"); GPIOF_OUT_INIT_LOW, "DVI PowerDown");
if (ret < 0) { if (ret < 0) {
devkit8000_dvi_device.reset_gpio = -EINVAL; devkit8000_dvi_device.reset_gpio = -EINVAL;
printk(KERN_ERR "Failed to request GPIO for DVI PowerDown\n"); printk(KERN_ERR "Failed to request GPIO for DVI PowerDown\n");
...@@ -366,19 +359,9 @@ static struct twl4030_platform_data devkit8000_twldata = { ...@@ -366,19 +359,9 @@ static struct twl4030_platform_data devkit8000_twldata = {
.keypad = &devkit8000_kp_data, .keypad = &devkit8000_kp_data,
}; };
static struct i2c_board_info __initdata devkit8000_i2c_boardinfo[] = {
{
I2C_BOARD_INFO("tps65930", 0x48),
.flags = I2C_CLIENT_WAKE,
.irq = INT_34XX_SYS_NIRQ,
.platform_data = &devkit8000_twldata,
},
};
static int __init devkit8000_i2c_init(void) static int __init devkit8000_i2c_init(void)
{ {
omap_register_i2c_bus(1, 2600, devkit8000_i2c_boardinfo, omap3_pmic_init("tps65930", &devkit8000_twldata);
ARRAY_SIZE(devkit8000_i2c_boardinfo));
/* Bus 3 is attached to the DVI port where devices like the pico DLP /* Bus 3 is attached to the DVI port where devices like the pico DLP
* projector don't work reliably with 400kHz */ * projector don't work reliably with 400kHz */
omap_register_i2c_bus(3, 400, NULL, 0); omap_register_i2c_bus(3, 400, NULL, 0);
...@@ -463,56 +446,6 @@ static void __init devkit8000_init_irq(void) ...@@ -463,56 +446,6 @@ static void __init devkit8000_init_irq(void)
#endif #endif
} }
static void __init devkit8000_ads7846_init(void)
{
int gpio = OMAP3_DEVKIT_TS_GPIO;
int ret;
ret = gpio_request(gpio, "ads7846_pen_down");
if (ret < 0) {
printk(KERN_ERR "Failed to request GPIO %d for "
"ads7846 pen down IRQ\n", gpio);
return;
}
gpio_direction_input(gpio);
}
static int ads7846_get_pendown_state(void)
{
return !gpio_get_value(OMAP3_DEVKIT_TS_GPIO);
}
static struct ads7846_platform_data ads7846_config = {
.x_max = 0x0fff,
.y_max = 0x0fff,
.x_plate_ohms = 180,
.pressure_max = 255,
.debounce_max = 10,
.debounce_tol = 5,
.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 */
};
static struct spi_board_info devkit8000_spi_board_info[] __initdata = {
{
.modalias = "ads7846",
.bus_num = 2,
.chip_select = 0,
.max_speed_hz = 1500000,
.controller_data = &ads7846_mcspi_config,
.irq = OMAP_GPIO_IRQ(OMAP3_DEVKIT_TS_GPIO),
.platform_data = &ads7846_config,
}
};
#define OMAP_DM9000_BASE 0x2c000000 #define OMAP_DM9000_BASE 0x2c000000
static struct resource omap_dm9000_resources[] = { static struct resource omap_dm9000_resources[] = {
...@@ -550,14 +483,14 @@ static void __init omap_dm9000_init(void) ...@@ -550,14 +483,14 @@ static void __init omap_dm9000_init(void)
{ {
unsigned char *eth_addr = omap_dm9000_platdata.dev_addr; unsigned char *eth_addr = omap_dm9000_platdata.dev_addr;
struct omap_die_id odi; struct omap_die_id odi;
int ret;
if (gpio_request(OMAP_DM9000_GPIO_IRQ, "dm9000 irq") < 0) { ret = gpio_request_one(OMAP_DM9000_GPIO_IRQ, GPIOF_IN, "dm9000 irq");
if (ret < 0) {
printk(KERN_ERR "Failed to request GPIO%d for dm9000 IRQ\n", printk(KERN_ERR "Failed to request GPIO%d for dm9000 IRQ\n",
OMAP_DM9000_GPIO_IRQ); OMAP_DM9000_GPIO_IRQ);
return; return;
} }
gpio_direction_input(OMAP_DM9000_GPIO_IRQ);
/* init the mac address using DIE id */ /* init the mac address using DIE id */
omap_get_die_id(&odi); omap_get_die_id(&odi);
...@@ -576,45 +509,6 @@ static struct platform_device *devkit8000_devices[] __initdata = { ...@@ -576,45 +509,6 @@ static struct platform_device *devkit8000_devices[] __initdata = {
&omap_dm9000_dev, &omap_dm9000_dev,
}; };
static void __init devkit8000_flash_init(void)
{
u8 cs = 0;
u8 nandcs = GPMC_CS_NUM + 1;
/* 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) {
devkit8000_nand_data.cs = nandcs;
printk(KERN_INFO "Registering NAND on CS%d\n", nandcs);
if (gpmc_nand_init(&devkit8000_nand_data) < 0)
printk(KERN_ERR "Unable to register NAND device\n");
}
}
static struct omap_musb_board_data musb_board_data = {
.interface_type = MUSB_INTERFACE_ULPI,
.mode = MUSB_OTG,
.power = 100,
};
static const struct usbhs_omap_board_data usbhs_bdata __initconst = { static const struct usbhs_omap_board_data usbhs_bdata __initconst = {
.port_mode[0] = OMAP_EHCI_PORT_MODE_PHY, .port_mode[0] = OMAP_EHCI_PORT_MODE_PHY,
...@@ -795,14 +689,13 @@ static void __init devkit8000_init(void) ...@@ -795,14 +689,13 @@ static void __init devkit8000_init(void)
ARRAY_SIZE(devkit8000_devices)); ARRAY_SIZE(devkit8000_devices));
omap_display_init(&devkit8000_dss_data); omap_display_init(&devkit8000_dss_data);
spi_register_board_info(devkit8000_spi_board_info,
ARRAY_SIZE(devkit8000_spi_board_info));
devkit8000_ads7846_init(); omap_ads7846_init(2, OMAP3_DEVKIT_TS_GPIO, 0, NULL);
usb_musb_init(&musb_board_data); usb_musb_init(NULL);
usbhs_init(&usbhs_bdata); usbhs_init(&usbhs_bdata);
devkit8000_flash_init(); omap_nand_flash_init(NAND_BUSWIDTH_16, devkit8000_nand_partitions,
ARRAY_SIZE(devkit8000_nand_partitions));
/* Ensure SDRC pins are mux'd for self-refresh */ /* Ensure SDRC pins are mux'd for self-refresh */
omap_mux_init_signal("sdrc_cke0", OMAP_PIN_OUTPUT); omap_mux_init_signal("sdrc_cke0", OMAP_PIN_OUTPUT);
......
...@@ -38,6 +38,7 @@ ...@@ -38,6 +38,7 @@
#include "mux.h" #include "mux.h"
#include "hsmmc.h" #include "hsmmc.h"
#include "sdram-numonyx-m65kxxxxam.h" #include "sdram-numonyx-m65kxxxxam.h"
#include "common-board-devices.h"
#define IGEP2_SMSC911X_CS 5 #define IGEP2_SMSC911X_CS 5
#define IGEP2_SMSC911X_GPIO 176 #define IGEP2_SMSC911X_GPIO 176
...@@ -54,6 +55,11 @@ ...@@ -54,6 +55,11 @@
#define IGEP2_RC_GPIO_WIFI_NRESET 139 #define IGEP2_RC_GPIO_WIFI_NRESET 139
#define IGEP2_RC_GPIO_BT_NRESET 137 #define IGEP2_RC_GPIO_BT_NRESET 137
#define IGEP3_GPIO_LED0_GREEN 54
#define IGEP3_GPIO_LED0_RED 53
#define IGEP3_GPIO_LED1_RED 16
#define IGEP3_GPIO_USBH_NRESET 183
/* /*
* IGEP2 Hardware Revision Table * IGEP2 Hardware Revision Table
* *
...@@ -68,6 +74,7 @@ ...@@ -68,6 +74,7 @@
#define IGEP2_BOARD_HWREV_B 0 #define IGEP2_BOARD_HWREV_B 0
#define IGEP2_BOARD_HWREV_C 1 #define IGEP2_BOARD_HWREV_C 1
#define IGEP3_BOARD_HWREV 2
static u8 hwrev; static u8 hwrev;
...@@ -75,24 +82,29 @@ static void __init igep2_get_revision(void) ...@@ -75,24 +82,29 @@ static void __init igep2_get_revision(void)
{ {
u8 ret; u8 ret;
if (machine_is_igep0030()) {
hwrev = IGEP3_BOARD_HWREV;
return;
}
omap_mux_init_gpio(IGEP2_GPIO_LED1_RED, OMAP_PIN_INPUT); omap_mux_init_gpio(IGEP2_GPIO_LED1_RED, OMAP_PIN_INPUT);
if ((gpio_request(IGEP2_GPIO_LED1_RED, "GPIO_HW0_REV") == 0) && if (gpio_request_one(IGEP2_GPIO_LED1_RED, GPIOF_IN, "GPIO_HW0_REV")) {
(gpio_direction_input(IGEP2_GPIO_LED1_RED) == 0)) {
ret = gpio_get_value(IGEP2_GPIO_LED1_RED);
if (ret == 0) {
pr_info("IGEP2: Hardware Revision C (B-NON compatible)\n");
hwrev = IGEP2_BOARD_HWREV_C;
} else if (ret == 1) {
pr_info("IGEP2: Hardware Revision B/C (B compatible)\n");
hwrev = IGEP2_BOARD_HWREV_B;
} else {
pr_err("IGEP2: Unknown Hardware Revision\n");
hwrev = -1;
}
} else {
pr_warning("IGEP2: Could not obtain gpio GPIO_HW0_REV\n"); pr_warning("IGEP2: Could not obtain gpio GPIO_HW0_REV\n");
pr_err("IGEP2: Unknown Hardware Revision\n"); pr_err("IGEP2: Unknown Hardware Revision\n");
return;
}
ret = gpio_get_value(IGEP2_GPIO_LED1_RED);
if (ret == 0) {
pr_info("IGEP2: Hardware Revision C (B-NON compatible)\n");
hwrev = IGEP2_BOARD_HWREV_C;
} else if (ret == 1) {
pr_info("IGEP2: Hardware Revision B/C (B compatible)\n");
hwrev = IGEP2_BOARD_HWREV_B;
} else {
pr_err("IGEP2: Unknown Hardware Revision\n");
hwrev = -1;
} }
gpio_free(IGEP2_GPIO_LED1_RED); gpio_free(IGEP2_GPIO_LED1_RED);
...@@ -111,7 +123,7 @@ static void __init igep2_get_revision(void) ...@@ -111,7 +123,7 @@ static void __init igep2_get_revision(void)
* So MTD regards it as 4KiB page size and 256KiB block size 64*(2*2048) * So MTD regards it as 4KiB page size and 256KiB block size 64*(2*2048)
*/ */
static struct mtd_partition igep2_onenand_partitions[] = { static struct mtd_partition igep_onenand_partitions[] = {
{ {
.name = "X-Loader", .name = "X-Loader",
.offset = 0, .offset = 0,
...@@ -139,21 +151,21 @@ static struct mtd_partition igep2_onenand_partitions[] = { ...@@ -139,21 +151,21 @@ static struct mtd_partition igep2_onenand_partitions[] = {
}, },
}; };
static struct omap_onenand_platform_data igep2_onenand_data = { static struct omap_onenand_platform_data igep_onenand_data = {
.parts = igep2_onenand_partitions, .parts = igep_onenand_partitions,
.nr_parts = ARRAY_SIZE(igep2_onenand_partitions), .nr_parts = ARRAY_SIZE(igep_onenand_partitions),
.dma_channel = -1, /* disable DMA in OMAP OneNAND driver */ .dma_channel = -1, /* disable DMA in OMAP OneNAND driver */
}; };
static struct platform_device igep2_onenand_device = { static struct platform_device igep_onenand_device = {
.name = "omap2-onenand", .name = "omap2-onenand",
.id = -1, .id = -1,
.dev = { .dev = {
.platform_data = &igep2_onenand_data, .platform_data = &igep_onenand_data,
}, },
}; };
static void __init igep2_flash_init(void) static void __init igep_flash_init(void)
{ {
u8 cs = 0; u8 cs = 0;
u8 onenandcs = GPMC_CS_NUM + 1; u8 onenandcs = GPMC_CS_NUM + 1;
...@@ -165,7 +177,7 @@ static void __init igep2_flash_init(void) ...@@ -165,7 +177,7 @@ static void __init igep2_flash_init(void)
/* Check if NAND/oneNAND is configured */ /* Check if NAND/oneNAND is configured */
if ((ret & 0xC00) == 0x800) if ((ret & 0xC00) == 0x800)
/* NAND found */ /* NAND found */
pr_err("IGEP2: Unsupported NAND found\n"); pr_err("IGEP: Unsupported NAND found\n");
else { else {
ret = gpmc_cs_read_reg(cs, GPMC_CS_CONFIG7); ret = gpmc_cs_read_reg(cs, GPMC_CS_CONFIG7);
if ((ret & 0x3F) == (ONENAND_MAP >> 24)) if ((ret & 0x3F) == (ONENAND_MAP >> 24))
...@@ -175,85 +187,46 @@ static void __init igep2_flash_init(void) ...@@ -175,85 +187,46 @@ static void __init igep2_flash_init(void)
} }
if (onenandcs > GPMC_CS_NUM) { if (onenandcs > GPMC_CS_NUM) {
pr_err("IGEP2: Unable to find configuration in GPMC\n"); pr_err("IGEP: Unable to find configuration in GPMC\n");
return; return;
} }
igep2_onenand_data.cs = onenandcs; igep_onenand_data.cs = onenandcs;
if (platform_device_register(&igep2_onenand_device) < 0) if (platform_device_register(&igep_onenand_device) < 0)
pr_err("IGEP2: Unable to register OneNAND device\n"); pr_err("IGEP: Unable to register OneNAND device\n");
} }
#else #else
static void __init igep2_flash_init(void) {} static void __init igep_flash_init(void) {}
#endif #endif
#if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE) #if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE)
#include <linux/smsc911x.h> #include <linux/smsc911x.h>
#include <plat/gpmc-smsc911x.h>
static struct smsc911x_platform_config igep2_smsc911x_config = { static struct omap_smsc911x_platform_data smsc911x_cfg = {
.irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_LOW, .cs = IGEP2_SMSC911X_CS,
.irq_type = SMSC911X_IRQ_TYPE_OPEN_DRAIN, .gpio_irq = IGEP2_SMSC911X_GPIO,
.flags = SMSC911X_USE_32BIT | SMSC911X_SAVE_MAC_ADDRESS , .gpio_reset = -EINVAL,
.phy_interface = PHY_INTERFACE_MODE_MII, .flags = SMSC911X_USE_32BIT | SMSC911X_SAVE_MAC_ADDRESS,
};
static struct resource igep2_smsc911x_resources[] = {
{
.flags = IORESOURCE_MEM,
},
{
.start = OMAP_GPIO_IRQ(IGEP2_SMSC911X_GPIO),
.end = OMAP_GPIO_IRQ(IGEP2_SMSC911X_GPIO),
.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_LOWLEVEL,
},
};
static struct platform_device igep2_smsc911x_device = {
.name = "smsc911x",
.id = 0,
.num_resources = ARRAY_SIZE(igep2_smsc911x_resources),
.resource = igep2_smsc911x_resources,
.dev = {
.platform_data = &igep2_smsc911x_config,
},
}; };
static inline void __init igep2_init_smsc911x(void) static inline void __init igep2_init_smsc911x(void)
{ {
unsigned long cs_mem_base; gpmc_smsc911x_init(&smsc911x_cfg);
if (gpmc_cs_request(IGEP2_SMSC911X_CS, SZ_16M, &cs_mem_base) < 0) {
pr_err("IGEP v2: Failed request for GPMC mem for smsc911x\n");
gpmc_cs_free(IGEP2_SMSC911X_CS);
return;
}
igep2_smsc911x_resources[0].start = cs_mem_base + 0x0;
igep2_smsc911x_resources[0].end = cs_mem_base + 0xff;
if ((gpio_request(IGEP2_SMSC911X_GPIO, "SMSC911X IRQ") == 0) &&
(gpio_direction_input(IGEP2_SMSC911X_GPIO) == 0)) {
gpio_export(IGEP2_SMSC911X_GPIO, 0);
} else {
pr_err("IGEP v2: Could not obtain gpio for for SMSC911X IRQ\n");
return;
}
platform_device_register(&igep2_smsc911x_device);
} }
#else #else
static inline void __init igep2_init_smsc911x(void) { } static inline void __init igep2_init_smsc911x(void) { }
#endif #endif
static struct regulator_consumer_supply igep2_vmmc1_supply = static struct regulator_consumer_supply igep_vmmc1_supply =
REGULATOR_SUPPLY("vmmc", "omap_hsmmc.0"); REGULATOR_SUPPLY("vmmc", "omap_hsmmc.0");
/* VMMC1 for OMAP VDD_MMC1 (i/o) and MMC1 card */ /* VMMC1 for OMAP VDD_MMC1 (i/o) and MMC1 card */
static struct regulator_init_data igep2_vmmc1 = { static struct regulator_init_data igep_vmmc1 = {
.constraints = { .constraints = {
.min_uV = 1850000, .min_uV = 1850000,
.max_uV = 3150000, .max_uV = 3150000,
...@@ -264,13 +237,13 @@ static struct regulator_init_data igep2_vmmc1 = { ...@@ -264,13 +237,13 @@ static struct regulator_init_data igep2_vmmc1 = {
| REGULATOR_CHANGE_STATUS, | REGULATOR_CHANGE_STATUS,
}, },
.num_consumer_supplies = 1, .num_consumer_supplies = 1,
.consumer_supplies = &igep2_vmmc1_supply, .consumer_supplies = &igep_vmmc1_supply,
}; };
static struct regulator_consumer_supply igep2_vio_supply = static struct regulator_consumer_supply igep_vio_supply =
REGULATOR_SUPPLY("vmmc_aux", "omap_hsmmc.1"); REGULATOR_SUPPLY("vmmc_aux", "omap_hsmmc.1");
static struct regulator_init_data igep2_vio = { static struct regulator_init_data igep_vio = {
.constraints = { .constraints = {
.min_uV = 1800000, .min_uV = 1800000,
.max_uV = 1800000, .max_uV = 1800000,
...@@ -282,34 +255,34 @@ static struct regulator_init_data igep2_vio = { ...@@ -282,34 +255,34 @@ static struct regulator_init_data igep2_vio = {
| REGULATOR_CHANGE_STATUS, | REGULATOR_CHANGE_STATUS,
}, },
.num_consumer_supplies = 1, .num_consumer_supplies = 1,
.consumer_supplies = &igep2_vio_supply, .consumer_supplies = &igep_vio_supply,
}; };
static struct regulator_consumer_supply igep2_vmmc2_supply = static struct regulator_consumer_supply igep_vmmc2_supply =
REGULATOR_SUPPLY("vmmc", "omap_hsmmc.1"); REGULATOR_SUPPLY("vmmc", "omap_hsmmc.1");
static struct regulator_init_data igep2_vmmc2 = { static struct regulator_init_data igep_vmmc2 = {
.constraints = { .constraints = {
.valid_modes_mask = REGULATOR_MODE_NORMAL, .valid_modes_mask = REGULATOR_MODE_NORMAL,
.always_on = 1, .always_on = 1,
}, },
.num_consumer_supplies = 1, .num_consumer_supplies = 1,
.consumer_supplies = &igep2_vmmc2_supply, .consumer_supplies = &igep_vmmc2_supply,
}; };
static struct fixed_voltage_config igep2_vwlan = { static struct fixed_voltage_config igep_vwlan = {
.supply_name = "vwlan", .supply_name = "vwlan",
.microvolts = 3300000, .microvolts = 3300000,
.gpio = -EINVAL, .gpio = -EINVAL,
.enabled_at_boot = 1, .enabled_at_boot = 1,
.init_data = &igep2_vmmc2, .init_data = &igep_vmmc2,
}; };
static struct platform_device igep2_vwlan_device = { static struct platform_device igep_vwlan_device = {
.name = "reg-fixed-voltage", .name = "reg-fixed-voltage",
.id = 0, .id = 0,
.dev = { .dev = {
.platform_data = &igep2_vwlan, .platform_data = &igep_vwlan,
}, },
}; };
...@@ -334,20 +307,17 @@ static struct omap2_hsmmc_info mmc[] = { ...@@ -334,20 +307,17 @@ static struct omap2_hsmmc_info mmc[] = {
#if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE) #if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE)
#include <linux/leds.h> #include <linux/leds.h>
static struct gpio_led igep2_gpio_leds[] = { static struct gpio_led igep_gpio_leds[] = {
[0] = { [0] = {
.name = "gpio-led:red:d0", .name = "gpio-led:red:d0",
.gpio = IGEP2_GPIO_LED0_RED,
.default_trigger = "default-off" .default_trigger = "default-off"
}, },
[1] = { [1] = {
.name = "gpio-led:green:d0", .name = "gpio-led:green:d0",
.gpio = IGEP2_GPIO_LED0_GREEN,
.default_trigger = "default-off", .default_trigger = "default-off",
}, },
[2] = { [2] = {
.name = "gpio-led:red:d1", .name = "gpio-led:red:d1",
.gpio = IGEP2_GPIO_LED1_RED,
.default_trigger = "default-off", .default_trigger = "default-off",
}, },
[3] = { [3] = {
...@@ -358,94 +328,119 @@ static struct gpio_led igep2_gpio_leds[] = { ...@@ -358,94 +328,119 @@ static struct gpio_led igep2_gpio_leds[] = {
}, },
}; };
static struct gpio_led_platform_data igep2_led_pdata = { static struct gpio_led_platform_data igep_led_pdata = {
.leds = igep2_gpio_leds, .leds = igep_gpio_leds,
.num_leds = ARRAY_SIZE(igep2_gpio_leds), .num_leds = ARRAY_SIZE(igep_gpio_leds),
}; };
static struct platform_device igep2_led_device = { static struct platform_device igep_led_device = {
.name = "leds-gpio", .name = "leds-gpio",
.id = -1, .id = -1,
.dev = { .dev = {
.platform_data = &igep2_led_pdata, .platform_data = &igep_led_pdata,
}, },
}; };
static void __init igep2_leds_init(void) static void __init igep_leds_init(void)
{ {
platform_device_register(&igep2_led_device); if (machine_is_igep0020()) {
igep_gpio_leds[0].gpio = IGEP2_GPIO_LED0_RED;
igep_gpio_leds[1].gpio = IGEP2_GPIO_LED0_GREEN;
igep_gpio_leds[2].gpio = IGEP2_GPIO_LED1_RED;
} else {
igep_gpio_leds[0].gpio = IGEP3_GPIO_LED0_RED;
igep_gpio_leds[1].gpio = IGEP3_GPIO_LED0_GREEN;
igep_gpio_leds[2].gpio = IGEP3_GPIO_LED1_RED;
}
platform_device_register(&igep_led_device);
} }
#else #else
static inline void igep2_leds_init(void) static struct gpio igep_gpio_leds[] __initdata = {
{ -EINVAL, GPIOF_OUT_INIT_LOW, "gpio-led:red:d0" },
{ -EINVAL, GPIOF_OUT_INIT_LOW, "gpio-led:green:d0" },
{ -EINVAL, GPIOF_OUT_INIT_LOW, "gpio-led:red:d1" },
};
static inline void igep_leds_init(void)
{ {
if ((gpio_request(IGEP2_GPIO_LED0_RED, "gpio-led:red:d0") == 0) && int i;
(gpio_direction_output(IGEP2_GPIO_LED0_RED, 0) == 0))
gpio_export(IGEP2_GPIO_LED0_RED, 0);
else
pr_warning("IGEP v2: Could not obtain gpio GPIO_LED0_RED\n");
if ((gpio_request(IGEP2_GPIO_LED0_GREEN, "gpio-led:green:d0") == 0) && if (machine_is_igep0020()) {
(gpio_direction_output(IGEP2_GPIO_LED0_GREEN, 0) == 0)) igep_gpio_leds[0].gpio = IGEP2_GPIO_LED0_RED;
gpio_export(IGEP2_GPIO_LED0_GREEN, 0); igep_gpio_leds[1].gpio = IGEP2_GPIO_LED0_GREEN;
else igep_gpio_leds[2].gpio = IGEP2_GPIO_LED1_RED;
pr_warning("IGEP v2: Could not obtain gpio GPIO_LED0_GREEN\n"); } else {
igep_gpio_leds[0].gpio = IGEP3_GPIO_LED0_RED;
igep_gpio_leds[1].gpio = IGEP3_GPIO_LED0_GREEN;
igep_gpio_leds[2].gpio = IGEP3_GPIO_LED1_RED;
}
if ((gpio_request(IGEP2_GPIO_LED1_RED, "gpio-led:red:d1") == 0) && if (gpio_request_array(igep_gpio_leds, ARRAY_SIZE(igep_gpio_leds))) {
(gpio_direction_output(IGEP2_GPIO_LED1_RED, 0) == 0)) pr_warning("IGEP v2: Could not obtain leds gpios\n");
gpio_export(IGEP2_GPIO_LED1_RED, 0); return;
else }
pr_warning("IGEP v2: Could not obtain gpio GPIO_LED1_RED\n");
for (i = 0; i < ARRAY_SIZE(igep_gpio_leds); i++)
gpio_export(igep_gpio_leds[i].gpio, 0);
} }
#endif #endif
static int igep2_twl_gpio_setup(struct device *dev, static struct gpio igep2_twl_gpios[] = {
{ -EINVAL, GPIOF_IN, "GPIO_EHCI_NOC" },
{ -EINVAL, GPIOF_OUT_INIT_LOW, "GPIO_USBH_CPEN" },
};
static int igep_twl_gpio_setup(struct device *dev,
unsigned gpio, unsigned ngpio) unsigned gpio, unsigned ngpio)
{ {
int ret;
/* gpio + 0 is "mmc0_cd" (input/IRQ) */ /* gpio + 0 is "mmc0_cd" (input/IRQ) */
mmc[0].gpio_cd = gpio + 0; mmc[0].gpio_cd = gpio + 0;
omap2_hsmmc_init(mmc); omap2_hsmmc_init(mmc);
/*
* REVISIT: need ehci-omap hooks for external VBUS
* power switch and overcurrent detect
*/
if ((gpio_request(gpio + 1, "GPIO_EHCI_NOC") < 0) ||
(gpio_direction_input(gpio + 1) < 0))
pr_err("IGEP2: Could not obtain gpio for EHCI NOC");
/*
* TWL4030_GPIO_MAX + 0 == ledA, GPIO_USBH_CPEN
* (out, active low)
*/
if ((gpio_request(gpio + TWL4030_GPIO_MAX, "GPIO_USBH_CPEN") < 0) ||
(gpio_direction_output(gpio + TWL4030_GPIO_MAX, 0) < 0))
pr_err("IGEP2: Could not obtain gpio for USBH_CPEN");
/* TWL4030_GPIO_MAX + 1 == ledB (out, active low LED) */ /* TWL4030_GPIO_MAX + 1 == ledB (out, active low LED) */
#if !defined(CONFIG_LEDS_GPIO) && !defined(CONFIG_LEDS_GPIO_MODULE) #if !defined(CONFIG_LEDS_GPIO) && !defined(CONFIG_LEDS_GPIO_MODULE)
if ((gpio_request(gpio+TWL4030_GPIO_MAX+1, "gpio-led:green:d1") == 0) ret = gpio_request_one(gpio + TWL4030_GPIO_MAX + 1, GPIOF_OUT_INIT_HIGH,
&& (gpio_direction_output(gpio + TWL4030_GPIO_MAX + 1, 1) == 0)) "gpio-led:green:d1");
if (ret == 0)
gpio_export(gpio + TWL4030_GPIO_MAX + 1, 0); gpio_export(gpio + TWL4030_GPIO_MAX + 1, 0);
else else
pr_warning("IGEP v2: Could not obtain gpio GPIO_LED1_GREEN\n"); pr_warning("IGEP: Could not obtain gpio GPIO_LED1_GREEN\n");
#else #else
igep2_gpio_leds[3].gpio = gpio + TWL4030_GPIO_MAX + 1; igep_gpio_leds[3].gpio = gpio + TWL4030_GPIO_MAX + 1;
#endif #endif
if (machine_is_igep0030())
return 0;
/*
* REVISIT: need ehci-omap hooks for external VBUS
* power switch and overcurrent detect
*/
igep2_twl_gpios[0].gpio = gpio + 1;
/* TWL4030_GPIO_MAX + 0 == ledA, GPIO_USBH_CPEN (out, active low) */
igep2_twl_gpios[1].gpio = gpio + TWL4030_GPIO_MAX;
ret = gpio_request_array(igep2_twl_gpios, ARRAY_SIZE(igep2_twl_gpios));
if (ret < 0)
pr_err("IGEP2: Could not obtain gpio for USBH_CPEN");
return 0; return 0;
}; };
static struct twl4030_gpio_platform_data igep2_twl4030_gpio_pdata = { static struct twl4030_gpio_platform_data igep_twl4030_gpio_pdata = {
.gpio_base = OMAP_MAX_GPIO_LINES, .gpio_base = OMAP_MAX_GPIO_LINES,
.irq_base = TWL4030_GPIO_IRQ_BASE, .irq_base = TWL4030_GPIO_IRQ_BASE,
.irq_end = TWL4030_GPIO_IRQ_END, .irq_end = TWL4030_GPIO_IRQ_END,
.use_leds = true, .use_leds = true,
.setup = igep2_twl_gpio_setup, .setup = igep_twl_gpio_setup,
}; };
static struct twl4030_usb_data igep2_usb_data = { static struct twl4030_usb_data igep_usb_data = {
.usb_mode = T2_USB_MODE_ULPI, .usb_mode = T2_USB_MODE_ULPI,
}; };
...@@ -507,16 +502,17 @@ static struct regulator_init_data igep2_vpll2 = { ...@@ -507,16 +502,17 @@ static struct regulator_init_data igep2_vpll2 = {
static void __init igep2_display_init(void) static void __init igep2_display_init(void)
{ {
if (gpio_request(IGEP2_GPIO_DVI_PUP, "GPIO_DVI_PUP") && int err = gpio_request_one(IGEP2_GPIO_DVI_PUP, GPIOF_OUT_INIT_HIGH,
gpio_direction_output(IGEP2_GPIO_DVI_PUP, 1)) "GPIO_DVI_PUP");
if (err)
pr_err("IGEP v2: Could not obtain gpio GPIO_DVI_PUP\n"); pr_err("IGEP v2: Could not obtain gpio GPIO_DVI_PUP\n");
} }
static struct platform_device *igep2_devices[] __initdata = { static struct platform_device *igep_devices[] __initdata = {
&igep2_vwlan_device, &igep_vwlan_device,
}; };
static void __init igep2_init_early(void) static void __init igep_init_early(void)
{ {
omap2_init_common_infrastructure(); omap2_init_common_infrastructure();
omap2_init_common_devices(m65kxxxxam_sdrc_params, omap2_init_common_devices(m65kxxxxam_sdrc_params,
...@@ -561,27 +557,15 @@ static struct twl4030_keypad_data igep2_keypad_pdata = { ...@@ -561,27 +557,15 @@ static struct twl4030_keypad_data igep2_keypad_pdata = {
.rep = 1, .rep = 1,
}; };
static struct twl4030_platform_data igep2_twldata = { static struct twl4030_platform_data igep_twldata = {
.irq_base = TWL4030_IRQ_BASE, .irq_base = TWL4030_IRQ_BASE,
.irq_end = TWL4030_IRQ_END, .irq_end = TWL4030_IRQ_END,
/* platform_data for children goes here */ /* platform_data for children goes here */
.usb = &igep2_usb_data, .usb = &igep_usb_data,
.codec = &igep2_codec_data, .gpio = &igep_twl4030_gpio_pdata,
.gpio = &igep2_twl4030_gpio_pdata, .vmmc1 = &igep_vmmc1,
.keypad = &igep2_keypad_pdata, .vio = &igep_vio,
.vmmc1 = &igep2_vmmc1,
.vpll2 = &igep2_vpll2,
.vio = &igep2_vio,
};
static struct i2c_board_info __initdata igep2_i2c1_boardinfo[] = {
{
I2C_BOARD_INFO("twl4030", 0x48),
.flags = I2C_CLIENT_WAKE,
.irq = INT_34XX_SYS_NIRQ,
.platform_data = &igep2_twldata,
},
}; };
static struct i2c_board_info __initdata igep2_i2c3_boardinfo[] = { static struct i2c_board_info __initdata igep2_i2c3_boardinfo[] = {
...@@ -590,32 +574,29 @@ static struct i2c_board_info __initdata igep2_i2c3_boardinfo[] = { ...@@ -590,32 +574,29 @@ static struct i2c_board_info __initdata igep2_i2c3_boardinfo[] = {
}, },
}; };
static void __init igep2_i2c_init(void) static void __init igep_i2c_init(void)
{ {
int ret; int ret;
ret = omap_register_i2c_bus(1, 2600, igep2_i2c1_boardinfo, if (machine_is_igep0020()) {
ARRAY_SIZE(igep2_i2c1_boardinfo)); /*
if (ret) * Bus 3 is attached to the DVI port where devices like the
pr_warning("IGEP2: Could not register I2C1 bus (%d)\n", ret); * pico DLP projector don't work reliably with 400kHz
*/
ret = omap_register_i2c_bus(3, 100, igep2_i2c3_boardinfo,
ARRAY_SIZE(igep2_i2c3_boardinfo));
if (ret)
pr_warning("IGEP2: Could not register I2C3 bus (%d)\n", ret);
igep_twldata.codec = &igep2_codec_data;
igep_twldata.keypad = &igep2_keypad_pdata;
igep_twldata.vpll2 = &igep2_vpll2;
}
/* omap3_pmic_init("twl4030", &igep_twldata);
* Bus 3 is attached to the DVI port where devices like the pico DLP
* projector don't work reliably with 400kHz
*/
ret = omap_register_i2c_bus(3, 100, igep2_i2c3_boardinfo,
ARRAY_SIZE(igep2_i2c3_boardinfo));
if (ret)
pr_warning("IGEP2: Could not register I2C3 bus (%d)\n", ret);
} }
static struct omap_musb_board_data musb_board_data = { static const struct usbhs_omap_board_data igep2_usbhs_bdata __initconst = {
.interface_type = MUSB_INTERFACE_ULPI,
.mode = MUSB_OTG,
.power = 100,
};
static const struct usbhs_omap_board_data usbhs_bdata __initconst = {
.port_mode[0] = OMAP_EHCI_PORT_MODE_PHY, .port_mode[0] = OMAP_EHCI_PORT_MODE_PHY,
.port_mode[1] = OMAP_USBHS_PORT_MODE_UNUSED, .port_mode[1] = OMAP_USBHS_PORT_MODE_UNUSED,
.port_mode[2] = OMAP_USBHS_PORT_MODE_UNUSED, .port_mode[2] = OMAP_USBHS_PORT_MODE_UNUSED,
...@@ -626,6 +607,17 @@ static const struct usbhs_omap_board_data usbhs_bdata __initconst = { ...@@ -626,6 +607,17 @@ static const struct usbhs_omap_board_data usbhs_bdata __initconst = {
.reset_gpio_port[2] = -EINVAL, .reset_gpio_port[2] = -EINVAL,
}; };
static const struct usbhs_omap_board_data igep3_usbhs_bdata __initconst = {
.port_mode[0] = OMAP_USBHS_PORT_MODE_UNUSED,
.port_mode[1] = OMAP_EHCI_PORT_MODE_PHY,
.port_mode[2] = OMAP_USBHS_PORT_MODE_UNUSED,
.phy_reset = true,
.reset_gpio_port[0] = -EINVAL,
.reset_gpio_port[1] = IGEP3_GPIO_USBH_NRESET,
.reset_gpio_port[2] = -EINVAL,
};
#ifdef CONFIG_OMAP_MUX #ifdef CONFIG_OMAP_MUX
static struct omap_board_mux board_mux[] __initdata = { static struct omap_board_mux board_mux[] __initdata = {
{ .reg_offset = OMAP_MUX_TERMINATOR }, { .reg_offset = OMAP_MUX_TERMINATOR },
...@@ -633,82 +625,95 @@ static struct omap_board_mux board_mux[] __initdata = { ...@@ -633,82 +625,95 @@ static struct omap_board_mux board_mux[] __initdata = {
#endif #endif
#if defined(CONFIG_LIBERTAS_SDIO) || defined(CONFIG_LIBERTAS_SDIO_MODULE) #if defined(CONFIG_LIBERTAS_SDIO) || defined(CONFIG_LIBERTAS_SDIO_MODULE)
static struct gpio igep_wlan_bt_gpios[] __initdata = {
{ -EINVAL, GPIOF_OUT_INIT_HIGH, "GPIO_WIFI_NPD" },
{ -EINVAL, GPIOF_OUT_INIT_HIGH, "GPIO_WIFI_NRESET" },
{ -EINVAL, GPIOF_OUT_INIT_HIGH, "GPIO_BT_NRESET" },
};
static void __init igep2_wlan_bt_init(void) static void __init igep_wlan_bt_init(void)
{ {
unsigned npd, wreset, btreset; int err;
/* GPIO's for WLAN-BT combo depends on hardware revision */ /* GPIO's for WLAN-BT combo depends on hardware revision */
if (hwrev == IGEP2_BOARD_HWREV_B) { if (hwrev == IGEP2_BOARD_HWREV_B) {
npd = IGEP2_RB_GPIO_WIFI_NPD; igep_wlan_bt_gpios[0].gpio = IGEP2_RB_GPIO_WIFI_NPD;
wreset = IGEP2_RB_GPIO_WIFI_NRESET; igep_wlan_bt_gpios[1].gpio = IGEP2_RB_GPIO_WIFI_NRESET;
btreset = IGEP2_RB_GPIO_BT_NRESET; igep_wlan_bt_gpios[2].gpio = IGEP2_RB_GPIO_BT_NRESET;
} else if (hwrev == IGEP2_BOARD_HWREV_C) { } else if (hwrev == IGEP2_BOARD_HWREV_C || machine_is_igep0030()) {
npd = IGEP2_RC_GPIO_WIFI_NPD; igep_wlan_bt_gpios[0].gpio = IGEP2_RC_GPIO_WIFI_NPD;
wreset = IGEP2_RC_GPIO_WIFI_NRESET; igep_wlan_bt_gpios[1].gpio = IGEP2_RC_GPIO_WIFI_NRESET;
btreset = IGEP2_RC_GPIO_BT_NRESET; igep_wlan_bt_gpios[2].gpio = IGEP2_RC_GPIO_BT_NRESET;
} else } else
return; return;
/* Set GPIO's for WLAN-BT combo module */ err = gpio_request_array(igep_wlan_bt_gpios,
if ((gpio_request(npd, "GPIO_WIFI_NPD") == 0) && ARRAY_SIZE(igep_wlan_bt_gpios));
(gpio_direction_output(npd, 1) == 0)) { if (err) {
gpio_export(npd, 0); pr_warning("IGEP2: Could not obtain WIFI/BT gpios\n");
} else return;
pr_warning("IGEP2: Could not obtain gpio GPIO_WIFI_NPD\n"); }
if ((gpio_request(wreset, "GPIO_WIFI_NRESET") == 0) && gpio_export(igep_wlan_bt_gpios[0].gpio, 0);
(gpio_direction_output(wreset, 1) == 0)) { gpio_export(igep_wlan_bt_gpios[1].gpio, 0);
gpio_export(wreset, 0); gpio_export(igep_wlan_bt_gpios[2].gpio, 0);
gpio_set_value(wreset, 0);
udelay(10); gpio_set_value(igep_wlan_bt_gpios[1].gpio, 0);
gpio_set_value(wreset, 1); udelay(10);
} else gpio_set_value(igep_wlan_bt_gpios[1].gpio, 1);
pr_warning("IGEP2: Could not obtain gpio GPIO_WIFI_NRESET\n");
if ((gpio_request(btreset, "GPIO_BT_NRESET") == 0) &&
(gpio_direction_output(btreset, 1) == 0)) {
gpio_export(btreset, 0);
} else
pr_warning("IGEP2: Could not obtain gpio GPIO_BT_NRESET\n");
} }
#else #else
static inline void __init igep2_wlan_bt_init(void) { } static inline void __init igep_wlan_bt_init(void) { }
#endif #endif
static void __init igep2_init(void) static void __init igep_init(void)
{ {
omap3_mux_init(board_mux, OMAP_PACKAGE_CBB); omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);
/* Get IGEP2 hardware revision */ /* Get IGEP2 hardware revision */
igep2_get_revision(); igep2_get_revision();
/* Register I2C busses and drivers */ /* Register I2C busses and drivers */
igep2_i2c_init(); igep_i2c_init();
platform_add_devices(igep2_devices, ARRAY_SIZE(igep2_devices)); platform_add_devices(igep_devices, ARRAY_SIZE(igep_devices));
omap_display_init(&igep2_dss_data);
omap_serial_init(); omap_serial_init();
usb_musb_init(&musb_board_data); usb_musb_init(NULL);
usbhs_init(&usbhs_bdata);
igep2_flash_init(); igep_flash_init();
igep2_leds_init(); igep_leds_init();
igep2_display_init();
igep2_init_smsc911x();
/* /*
* WLAN-BT combo module from MuRata which has a Marvell WLAN * WLAN-BT combo module from MuRata which has a Marvell WLAN
* (88W8686) + CSR Bluetooth chipset. Uses SDIO interface. * (88W8686) + CSR Bluetooth chipset. Uses SDIO interface.
*/ */
igep2_wlan_bt_init(); igep_wlan_bt_init();
if (machine_is_igep0020()) {
omap_display_init(&igep2_dss_data);
igep2_display_init();
igep2_init_smsc911x();
usbhs_init(&igep2_usbhs_bdata);
} else {
usbhs_init(&igep3_usbhs_bdata);
}
} }
MACHINE_START(IGEP0020, "IGEP v2 board") MACHINE_START(IGEP0020, "IGEP v2 board")
.boot_params = 0x80000100, .boot_params = 0x80000100,
.reserve = omap_reserve, .reserve = omap_reserve,
.map_io = omap3_map_io, .map_io = omap3_map_io,
.init_early = igep2_init_early, .init_early = igep_init_early,
.init_irq = omap_init_irq,
.init_machine = igep_init,
.timer = &omap_timer,
MACHINE_END
MACHINE_START(IGEP0030, "IGEP OMAP3 module")
.boot_params = 0x80000100,
.reserve = omap_reserve,
.map_io = omap3_map_io,
.init_early = igep_init_early,
.init_irq = omap_init_irq, .init_irq = omap_init_irq,
.init_machine = igep2_init, .init_machine = igep_init,
.timer = &omap_timer, .timer = &omap_timer,
MACHINE_END MACHINE_END
/*
* Copyright (C) 2010 - ISEE 2007 SL
*
* Modified from mach-omap2/board-generic.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.
*/
#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/gpio.h>
#include <linux/interrupt.h>
#include <linux/regulator/machine.h>
#include <linux/regulator/fixed.h>
#include <linux/i2c/twl.h>
#include <linux/mmc/host.h>
#include <asm/mach-types.h>
#include <asm/mach/arch.h>
#include <plat/board.h>
#include <plat/common.h>
#include <plat/gpmc.h>
#include <plat/usb.h>
#include <plat/onenand.h>
#include "mux.h"
#include "hsmmc.h"
#include "sdram-numonyx-m65kxxxxam.h"
#define IGEP3_GPIO_LED0_GREEN 54
#define IGEP3_GPIO_LED0_RED 53
#define IGEP3_GPIO_LED1_RED 16
#define IGEP3_GPIO_WIFI_NPD 138
#define IGEP3_GPIO_WIFI_NRESET 139
#define IGEP3_GPIO_BT_NRESET 137
#define IGEP3_GPIO_USBH_NRESET 183
#if defined(CONFIG_MTD_ONENAND_OMAP2) || \
defined(CONFIG_MTD_ONENAND_OMAP2_MODULE)
#define ONENAND_MAP 0x20000000
/*
* x2 Flash built-in COMBO POP MEMORY
* Since the device is equipped with two DataRAMs, and two-plane NAND
* Flash memory array, these two component enables simultaneous program
* of 4KiB. Plane1 has only even blocks such as block0, block2, block4
* while Plane2 has only odd blocks such as block1, block3, block5.
* So MTD regards it as 4KiB page size and 256KiB block size 64*(2*2048)
*/
static struct mtd_partition igep3_onenand_partitions[] = {
{
.name = "X-Loader",
.offset = 0,
.size = 2 * (64*(2*2048))
},
{
.name = "U-Boot",
.offset = MTDPART_OFS_APPEND,
.size = 6 * (64*(2*2048)),
},
{
.name = "Environment",
.offset = MTDPART_OFS_APPEND,
.size = 2 * (64*(2*2048)),
},
{
.name = "Kernel",
.offset = MTDPART_OFS_APPEND,
.size = 12 * (64*(2*2048)),
},
{
.name = "File System",
.offset = MTDPART_OFS_APPEND,
.size = MTDPART_SIZ_FULL,
},
};
static struct omap_onenand_platform_data igep3_onenand_pdata = {
.parts = igep3_onenand_partitions,
.nr_parts = ARRAY_SIZE(igep3_onenand_partitions),
.onenand_setup = NULL,
.dma_channel = -1, /* disable DMA in OMAP OneNAND driver */
};
static struct platform_device igep3_onenand_device = {
.name = "omap2-onenand",
.id = -1,
.dev = {
.platform_data = &igep3_onenand_pdata,
},
};
static void __init igep3_flash_init(void)
{
u8 cs = 0;
u8 onenandcs = GPMC_CS_NUM + 1;
for (cs = 0; cs < GPMC_CS_NUM; cs++) {
u32 ret;
ret = gpmc_cs_read_reg(cs, GPMC_CS_CONFIG1);
/* Check if NAND/oneNAND is configured */
if ((ret & 0xC00) == 0x800)
/* NAND found */
pr_err("IGEP3: Unsupported NAND found\n");
else {
ret = gpmc_cs_read_reg(cs, GPMC_CS_CONFIG7);
if ((ret & 0x3F) == (ONENAND_MAP >> 24))
/* OneNAND found */
onenandcs = cs;
}
}
if (onenandcs > GPMC_CS_NUM) {
pr_err("IGEP3: Unable to find configuration in GPMC\n");
return;
}
igep3_onenand_pdata.cs = onenandcs;
if (platform_device_register(&igep3_onenand_device) < 0)
pr_err("IGEP3: Unable to register OneNAND device\n");
}
#else
static void __init igep3_flash_init(void) {}
#endif
static struct regulator_consumer_supply igep3_vmmc1_supply =
REGULATOR_SUPPLY("vmmc", "omap_hsmmc.0");
/* VMMC1 for OMAP VDD_MMC1 (i/o) and MMC1 card */
static struct regulator_init_data igep3_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 = &igep3_vmmc1_supply,
};
static struct regulator_consumer_supply igep3_vio_supply =
REGULATOR_SUPPLY("vmmc_aux", "omap_hsmmc.1");
static struct regulator_init_data igep3_vio = {
.constraints = {
.min_uV = 1800000,
.max_uV = 1800000,
.apply_uV = 1,
.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 = &igep3_vio_supply,
};
static struct regulator_consumer_supply igep3_vmmc2_supply =
REGULATOR_SUPPLY("vmmc", "omap_hsmmc.1");
static struct regulator_init_data igep3_vmmc2 = {
.constraints = {
.valid_modes_mask = REGULATOR_MODE_NORMAL,
.always_on = 1,
},
.num_consumer_supplies = 1,
.consumer_supplies = &igep3_vmmc2_supply,
};
static struct fixed_voltage_config igep3_vwlan = {
.supply_name = "vwlan",
.microvolts = 3300000,
.gpio = -EINVAL,
.enabled_at_boot = 1,
.init_data = &igep3_vmmc2,
};
static struct platform_device igep3_vwlan_device = {
.name = "reg-fixed-voltage",
.id = 0,
.dev = {
.platform_data = &igep3_vwlan,
},
};
static struct omap2_hsmmc_info mmc[] = {
[0] = {
.mmc = 1,
.caps = MMC_CAP_4_BIT_DATA,
.gpio_cd = -EINVAL,
.gpio_wp = -EINVAL,
},
#if defined(CONFIG_LIBERTAS_SDIO) || defined(CONFIG_LIBERTAS_SDIO_MODULE)
[1] = {
.mmc = 2,
.caps = MMC_CAP_4_BIT_DATA,
.gpio_cd = -EINVAL,
.gpio_wp = -EINVAL,
},
#endif
{} /* Terminator */
};
#if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE)
#include <linux/leds.h>
static struct gpio_led igep3_gpio_leds[] = {
[0] = {
.name = "gpio-led:red:d0",
.gpio = IGEP3_GPIO_LED0_RED,
.default_trigger = "default-off"
},
[1] = {
.name = "gpio-led:green:d0",
.gpio = IGEP3_GPIO_LED0_GREEN,
.default_trigger = "default-off",
},
[2] = {
.name = "gpio-led:red:d1",
.gpio = IGEP3_GPIO_LED1_RED,
.default_trigger = "default-off",
},
[3] = {
.name = "gpio-led:green:d1",
.default_trigger = "heartbeat",
.gpio = -EINVAL, /* gets replaced */
},
};
static struct gpio_led_platform_data igep3_led_pdata = {
.leds = igep3_gpio_leds,
.num_leds = ARRAY_SIZE(igep3_gpio_leds),
};
static struct platform_device igep3_led_device = {
.name = "leds-gpio",
.id = -1,
.dev = {
.platform_data = &igep3_led_pdata,
},
};
static void __init igep3_leds_init(void)
{
platform_device_register(&igep3_led_device);
}
#else
static inline void igep3_leds_init(void)
{
if ((gpio_request(IGEP3_GPIO_LED0_RED, "gpio-led:red:d0") == 0) &&
(gpio_direction_output(IGEP3_GPIO_LED0_RED, 1) == 0)) {
gpio_export(IGEP3_GPIO_LED0_RED, 0);
gpio_set_value(IGEP3_GPIO_LED0_RED, 1);
} else
pr_warning("IGEP3: Could not obtain gpio GPIO_LED0_RED\n");
if ((gpio_request(IGEP3_GPIO_LED0_GREEN, "gpio-led:green:d0") == 0) &&
(gpio_direction_output(IGEP3_GPIO_LED0_GREEN, 1) == 0)) {
gpio_export(IGEP3_GPIO_LED0_GREEN, 0);
gpio_set_value(IGEP3_GPIO_LED0_GREEN, 1);
} else
pr_warning("IGEP3: Could not obtain gpio GPIO_LED0_GREEN\n");
if ((gpio_request(IGEP3_GPIO_LED1_RED, "gpio-led:red:d1") == 0) &&
(gpio_direction_output(IGEP3_GPIO_LED1_RED, 1) == 0)) {
gpio_export(IGEP3_GPIO_LED1_RED, 0);
gpio_set_value(IGEP3_GPIO_LED1_RED, 1);
} else
pr_warning("IGEP3: Could not obtain gpio GPIO_LED1_RED\n");
}
#endif
static int igep3_twl4030_gpio_setup(struct device *dev,
unsigned gpio, unsigned ngpio)
{
/* gpio + 0 is "mmc0_cd" (input/IRQ) */
mmc[0].gpio_cd = gpio + 0;
omap2_hsmmc_init(mmc);
/* TWL4030_GPIO_MAX + 1 == ledB (out, active low LED) */
#if !defined(CONFIG_LEDS_GPIO) && !defined(CONFIG_LEDS_GPIO_MODULE)
if ((gpio_request(gpio+TWL4030_GPIO_MAX+1, "gpio-led:green:d1") == 0)
&& (gpio_direction_output(gpio + TWL4030_GPIO_MAX + 1, 1) == 0)) {
gpio_export(gpio + TWL4030_GPIO_MAX + 1, 0);
gpio_set_value(gpio + TWL4030_GPIO_MAX + 1, 0);
} else
pr_warning("IGEP3: Could not obtain gpio GPIO_LED1_GREEN\n");
#else
igep3_gpio_leds[3].gpio = gpio + TWL4030_GPIO_MAX + 1;
#endif
return 0;
};
static struct twl4030_gpio_platform_data igep3_twl4030_gpio_pdata = {
.gpio_base = OMAP_MAX_GPIO_LINES,
.irq_base = TWL4030_GPIO_IRQ_BASE,
.irq_end = TWL4030_GPIO_IRQ_END,
.use_leds = true,
.setup = igep3_twl4030_gpio_setup,
};
static struct twl4030_usb_data igep3_twl4030_usb_data = {
.usb_mode = T2_USB_MODE_ULPI,
};
static struct platform_device *igep3_devices[] __initdata = {
&igep3_vwlan_device,
};
static void __init igep3_init_early(void)
{
omap2_init_common_infrastructure();
omap2_init_common_devices(m65kxxxxam_sdrc_params,
m65kxxxxam_sdrc_params);
}
static struct twl4030_platform_data igep3_twl4030_pdata = {
.irq_base = TWL4030_IRQ_BASE,
.irq_end = TWL4030_IRQ_END,
/* platform_data for children goes here */
.usb = &igep3_twl4030_usb_data,
.gpio = &igep3_twl4030_gpio_pdata,
.vmmc1 = &igep3_vmmc1,
.vio = &igep3_vio,
};
static struct i2c_board_info __initdata igep3_i2c_boardinfo[] = {
{
I2C_BOARD_INFO("twl4030", 0x48),
.flags = I2C_CLIENT_WAKE,
.irq = INT_34XX_SYS_NIRQ,
.platform_data = &igep3_twl4030_pdata,
},
};
static int __init igep3_i2c_init(void)
{
omap_register_i2c_bus(1, 2600, igep3_i2c_boardinfo,
ARRAY_SIZE(igep3_i2c_boardinfo));
return 0;
}
static struct omap_musb_board_data musb_board_data = {
.interface_type = MUSB_INTERFACE_ULPI,
.mode = MUSB_OTG,
.power = 100,
};
#if defined(CONFIG_LIBERTAS_SDIO) || defined(CONFIG_LIBERTAS_SDIO_MODULE)
static void __init igep3_wifi_bt_init(void)
{
/* Configure MUX values for W-LAN + Bluetooth GPIO's */
omap_mux_init_gpio(IGEP3_GPIO_WIFI_NPD, OMAP_PIN_OUTPUT);
omap_mux_init_gpio(IGEP3_GPIO_WIFI_NRESET, OMAP_PIN_OUTPUT);
omap_mux_init_gpio(IGEP3_GPIO_BT_NRESET, OMAP_PIN_OUTPUT);
/* Set GPIO's for W-LAN + Bluetooth combo module */
if ((gpio_request(IGEP3_GPIO_WIFI_NPD, "GPIO_WIFI_NPD") == 0) &&
(gpio_direction_output(IGEP3_GPIO_WIFI_NPD, 1) == 0)) {
gpio_export(IGEP3_GPIO_WIFI_NPD, 0);
} else
pr_warning("IGEP3: Could not obtain gpio GPIO_WIFI_NPD\n");
if ((gpio_request(IGEP3_GPIO_WIFI_NRESET, "GPIO_WIFI_NRESET") == 0) &&
(gpio_direction_output(IGEP3_GPIO_WIFI_NRESET, 1) == 0)) {
gpio_export(IGEP3_GPIO_WIFI_NRESET, 0);
gpio_set_value(IGEP3_GPIO_WIFI_NRESET, 0);
udelay(10);
gpio_set_value(IGEP3_GPIO_WIFI_NRESET, 1);
} else
pr_warning("IGEP3: Could not obtain gpio GPIO_WIFI_NRESET\n");
if ((gpio_request(IGEP3_GPIO_BT_NRESET, "GPIO_BT_NRESET") == 0) &&
(gpio_direction_output(IGEP3_GPIO_BT_NRESET, 1) == 0)) {
gpio_export(IGEP3_GPIO_BT_NRESET, 0);
} else
pr_warning("IGEP3: Could not obtain gpio GPIO_BT_NRESET\n");
}
#else
void __init igep3_wifi_bt_init(void) {}
#endif
static const struct usbhs_omap_board_data usbhs_bdata __initconst = {
.port_mode[0] = OMAP_USBHS_PORT_MODE_UNUSED,
.port_mode[1] = OMAP_EHCI_PORT_MODE_PHY,
.port_mode[2] = OMAP_USBHS_PORT_MODE_UNUSED,
.phy_reset = true,
.reset_gpio_port[0] = -EINVAL,
.reset_gpio_port[1] = IGEP3_GPIO_USBH_NRESET,
.reset_gpio_port[2] = -EINVAL,
};
#ifdef CONFIG_OMAP_MUX
static struct omap_board_mux board_mux[] __initdata = {
OMAP3_MUX(I2C2_SDA, OMAP_MUX_MODE4 | OMAP_PIN_OUTPUT),
{ .reg_offset = OMAP_MUX_TERMINATOR },
};
#endif
static void __init igep3_init(void)
{
omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);
/* Register I2C busses and drivers */
igep3_i2c_init();
platform_add_devices(igep3_devices, ARRAY_SIZE(igep3_devices));
omap_serial_init();
usb_musb_init(&musb_board_data);
usbhs_init(&usbhs_bdata);
igep3_flash_init();
igep3_leds_init();
/*
* WLAN-BT combo module from MuRata which has a Marvell WLAN
* (88W8686) + CSR Bluetooth chipset. Uses SDIO interface.
*/
igep3_wifi_bt_init();
}
MACHINE_START(IGEP0030, "IGEP OMAP3 module")
.boot_params = 0x80000100,
.reserve = omap_reserve,
.map_io = omap3_map_io,
.init_early = igep3_init_early,
.init_irq = omap_init_irq,
.init_machine = igep3_init,
.timer = &omap_timer,
MACHINE_END
...@@ -22,7 +22,6 @@ ...@@ -22,7 +22,6 @@
#include <linux/err.h> #include <linux/err.h>
#include <linux/clk.h> #include <linux/clk.h>
#include <linux/spi/spi.h> #include <linux/spi/spi.h>
#include <linux/spi/ads7846.h>
#include <linux/regulator/machine.h> #include <linux/regulator/machine.h>
#include <linux/i2c/twl.h> #include <linux/i2c/twl.h>
#include <linux/io.h> #include <linux/io.h>
...@@ -43,47 +42,19 @@ ...@@ -43,47 +42,19 @@
#include <asm/delay.h> #include <asm/delay.h>
#include <plat/usb.h> #include <plat/usb.h>
#include <plat/gpmc-smsc911x.h>
#include "board-flash.h" #include "board-flash.h"
#include "mux.h" #include "mux.h"
#include "hsmmc.h" #include "hsmmc.h"
#include "control.h" #include "control.h"
#include "common-board-devices.h"
#define LDP_SMSC911X_CS 1 #define LDP_SMSC911X_CS 1
#define LDP_SMSC911X_GPIO 152 #define LDP_SMSC911X_GPIO 152
#define DEBUG_BASE 0x08000000 #define DEBUG_BASE 0x08000000
#define LDP_ETHR_START DEBUG_BASE #define LDP_ETHR_START DEBUG_BASE
static struct resource ldp_smsc911x_resources[] = {
[0] = {
.start = LDP_ETHR_START,
.end = LDP_ETHR_START + SZ_4K,
.flags = IORESOURCE_MEM,
},
[1] = {
.start = 0,
.end = 0,
.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_LOWLEVEL,
},
};
static struct smsc911x_platform_config ldp_smsc911x_config = {
.irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_LOW,
.irq_type = SMSC911X_IRQ_TYPE_OPEN_DRAIN,
.flags = SMSC911X_USE_32BIT,
.phy_interface = PHY_INTERFACE_MODE_MII,
};
static struct platform_device ldp_smsc911x_device = {
.name = "smsc911x",
.id = -1,
.num_resources = ARRAY_SIZE(ldp_smsc911x_resources),
.resource = ldp_smsc911x_resources,
.dev = {
.platform_data = &ldp_smsc911x_config,
},
};
static uint32_t board_keymap[] = { static uint32_t board_keymap[] = {
KEY(0, 0, KEY_1), KEY(0, 0, KEY_1),
KEY(1, 0, KEY_2), KEY(1, 0, KEY_2),
...@@ -197,82 +168,16 @@ static struct platform_device ldp_gpio_keys_device = { ...@@ -197,82 +168,16 @@ static struct platform_device ldp_gpio_keys_device = {
}, },
}; };
static int ts_gpio; static struct omap_smsc911x_platform_data smsc911x_cfg = {
.cs = LDP_SMSC911X_CS,
/** .gpio_irq = LDP_SMSC911X_GPIO,
* @brief ads7846_dev_init : Requests & sets GPIO line for pen-irq .gpio_reset = -EINVAL,
* .flags = SMSC911X_USE_32BIT,
* @return - void. If request gpio fails then Flag KERN_ERR.
*/
static void ads7846_dev_init(void)
{
if (gpio_request(ts_gpio, "ads7846 irq") < 0) {
printk(KERN_ERR "can't get ads746 pen down GPIO\n");
return;
}
gpio_direction_input(ts_gpio);
gpio_set_debounce(ts_gpio, 310);
}
static int ads7846_get_pendown_state(void)
{
return !gpio_get_value(ts_gpio);
}
static struct ads7846_platform_data tsc2046_config __initdata = {
.get_pendown_state = ads7846_get_pendown_state,
.keep_vref_on = 1,
};
static struct omap2_mcspi_device_config tsc2046_mcspi_config = {
.turbo_mode = 0,
.single_channel = 1, /* 0: slave, 1: master */
};
static struct spi_board_info ldp_spi_board_info[] __initdata = {
[0] = {
/*
* TSC2046 operates at a max freqency of 2MHz, so
* operate slightly below at 1.5MHz
*/
.modalias = "ads7846",
.bus_num = 1,
.chip_select = 0,
.max_speed_hz = 1500000,
.controller_data = &tsc2046_mcspi_config,
.irq = 0,
.platform_data = &tsc2046_config,
},
}; };
static inline void __init ldp_init_smsc911x(void) static inline void __init ldp_init_smsc911x(void)
{ {
int eth_cs; gpmc_smsc911x_init(&smsc911x_cfg);
unsigned long cs_mem_base;
int eth_gpio = 0;
eth_cs = LDP_SMSC911X_CS;
if (gpmc_cs_request(eth_cs, SZ_16M, &cs_mem_base) < 0) {
printk(KERN_ERR "Failed to request GPMC mem for smsc911x\n");
return;
}
ldp_smsc911x_resources[0].start = cs_mem_base + 0x0;
ldp_smsc911x_resources[0].end = cs_mem_base + 0xff;
udelay(100);
eth_gpio = LDP_SMSC911X_GPIO;
ldp_smsc911x_resources[1].start = OMAP_GPIO_IRQ(eth_gpio);
if (gpio_request(eth_gpio, "smsc911x irq") < 0) {
printk(KERN_ERR "Failed to request GPIO%d for smsc911x IRQ\n",
eth_gpio);
return;
}
gpio_direction_input(eth_gpio);
} }
static struct platform_device ldp_lcd_device = { static struct platform_device ldp_lcd_device = {
...@@ -360,19 +265,9 @@ static struct twl4030_platform_data ldp_twldata = { ...@@ -360,19 +265,9 @@ static struct twl4030_platform_data ldp_twldata = {
.keypad = &ldp_kp_twl4030_data, .keypad = &ldp_kp_twl4030_data,
}; };
static struct i2c_board_info __initdata ldp_i2c_boardinfo[] = {
{
I2C_BOARD_INFO("twl4030", 0x48),
.flags = I2C_CLIENT_WAKE,
.irq = INT_34XX_SYS_NIRQ,
.platform_data = &ldp_twldata,
},
};
static int __init omap_i2c_init(void) static int __init omap_i2c_init(void)
{ {
omap_register_i2c_bus(1, 2600, ldp_i2c_boardinfo, omap3_pmic_init("twl4030", &ldp_twldata);
ARRAY_SIZE(ldp_i2c_boardinfo));
omap_register_i2c_bus(2, 400, NULL, 0); omap_register_i2c_bus(2, 400, NULL, 0);
omap_register_i2c_bus(3, 400, NULL, 0); omap_register_i2c_bus(3, 400, NULL, 0);
return 0; return 0;
...@@ -389,7 +284,6 @@ static struct omap2_hsmmc_info mmc[] __initdata = { ...@@ -389,7 +284,6 @@ static struct omap2_hsmmc_info mmc[] __initdata = {
}; };
static struct platform_device *ldp_devices[] __initdata = { static struct platform_device *ldp_devices[] __initdata = {
&ldp_smsc911x_device,
&ldp_lcd_device, &ldp_lcd_device,
&ldp_gpio_keys_device, &ldp_gpio_keys_device,
}; };
...@@ -400,12 +294,6 @@ static struct omap_board_mux board_mux[] __initdata = { ...@@ -400,12 +294,6 @@ static struct omap_board_mux board_mux[] __initdata = {
}; };
#endif #endif
static struct omap_musb_board_data musb_board_data = {
.interface_type = MUSB_INTERFACE_ULPI,
.mode = MUSB_OTG,
.power = 100,
};
static struct mtd_partition ldp_nand_partitions[] = { static struct mtd_partition ldp_nand_partitions[] = {
/* All the partition sizes are listed in terms of NAND block size */ /* All the partition sizes are listed in terms of NAND block size */
{ {
...@@ -446,13 +334,9 @@ static void __init omap_ldp_init(void) ...@@ -446,13 +334,9 @@ static void __init omap_ldp_init(void)
ldp_init_smsc911x(); ldp_init_smsc911x();
omap_i2c_init(); omap_i2c_init();
platform_add_devices(ldp_devices, ARRAY_SIZE(ldp_devices)); platform_add_devices(ldp_devices, ARRAY_SIZE(ldp_devices));
ts_gpio = 54; omap_ads7846_init(1, 54, 310, NULL);
ldp_spi_board_info[0].irq = gpio_to_irq(ts_gpio);
spi_register_board_info(ldp_spi_board_info,
ARRAY_SIZE(ldp_spi_board_info));
ads7846_dev_init();
omap_serial_init(); omap_serial_init();
usb_musb_init(&musb_board_data); usb_musb_init(NULL);
board_nand_init(ldp_nand_partitions, board_nand_init(ldp_nand_partitions,
ARRAY_SIZE(ldp_nand_partitions), ZOOM_NAND_CS, 0); ARRAY_SIZE(ldp_nand_partitions), ZOOM_NAND_CS, 0);
......
...@@ -106,14 +106,13 @@ static void __init n8x0_usb_init(void) ...@@ -106,14 +106,13 @@ static void __init n8x0_usb_init(void)
static char announce[] __initdata = KERN_INFO "TUSB 6010\n"; static char announce[] __initdata = KERN_INFO "TUSB 6010\n";
/* PM companion chip power control pin */ /* PM companion chip power control pin */
ret = gpio_request(TUSB6010_GPIO_ENABLE, "TUSB6010 enable"); ret = gpio_request_one(TUSB6010_GPIO_ENABLE, GPIOF_OUT_INIT_LOW,
"TUSB6010 enable");
if (ret != 0) { if (ret != 0) {
printk(KERN_ERR "Could not get TUSB power GPIO%i\n", printk(KERN_ERR "Could not get TUSB power GPIO%i\n",
TUSB6010_GPIO_ENABLE); TUSB6010_GPIO_ENABLE);
return; return;
} }
gpio_direction_output(TUSB6010_GPIO_ENABLE, 0);
tusb_set_power(0); tusb_set_power(0);
ret = tusb6010_setup_interface(&tusb_data, TUSB6010_REFCLK_19, 2, ret = tusb6010_setup_interface(&tusb_data, TUSB6010_REFCLK_19, 2,
...@@ -494,8 +493,12 @@ static struct omap_mmc_platform_data mmc1_data = { ...@@ -494,8 +493,12 @@ static struct omap_mmc_platform_data mmc1_data = {
static struct omap_mmc_platform_data *mmc_data[OMAP24XX_NR_MMC]; static struct omap_mmc_platform_data *mmc_data[OMAP24XX_NR_MMC];
static void __init n8x0_mmc_init(void) static struct gpio n810_emmc_gpios[] __initdata = {
{ N810_EMMC_VSD_GPIO, GPIOF_OUT_INIT_LOW, "MMC slot 2 Vddf" },
{ N810_EMMC_VIO_GPIO, GPIOF_OUT_INIT_LOW, "MMC slot 2 Vdd" },
};
static void __init n8x0_mmc_init(void)
{ {
int err; int err;
...@@ -512,27 +515,18 @@ static void __init n8x0_mmc_init(void) ...@@ -512,27 +515,18 @@ static void __init n8x0_mmc_init(void)
mmc1_data.slots[1].ban_openended = 1; mmc1_data.slots[1].ban_openended = 1;
} }
err = gpio_request(N8X0_SLOT_SWITCH_GPIO, "MMC slot switch"); err = gpio_request_one(N8X0_SLOT_SWITCH_GPIO, GPIOF_OUT_INIT_LOW,
"MMC slot switch");
if (err) if (err)
return; return;
gpio_direction_output(N8X0_SLOT_SWITCH_GPIO, 0);
if (machine_is_nokia_n810()) { if (machine_is_nokia_n810()) {
err = gpio_request(N810_EMMC_VSD_GPIO, "MMC slot 2 Vddf"); err = gpio_request_array(n810_emmc_gpios,
if (err) { ARRAY_SIZE(n810_emmc_gpios));
gpio_free(N8X0_SLOT_SWITCH_GPIO);
return;
}
gpio_direction_output(N810_EMMC_VSD_GPIO, 0);
err = gpio_request(N810_EMMC_VIO_GPIO, "MMC slot 2 Vdd");
if (err) { if (err) {
gpio_free(N8X0_SLOT_SWITCH_GPIO); gpio_free(N8X0_SLOT_SWITCH_GPIO);
gpio_free(N810_EMMC_VSD_GPIO);
return; return;
} }
gpio_direction_output(N810_EMMC_VIO_GPIO, 0);
} }
mmc_data[0] = &mmc1_data; mmc_data[0] = &mmc1_data;
......
...@@ -52,6 +52,7 @@ ...@@ -52,6 +52,7 @@
#include "hsmmc.h" #include "hsmmc.h"
#include "timer-gp.h" #include "timer-gp.h"
#include "pm.h" #include "pm.h"
#include "common-board-devices.h"
#define NAND_BLOCK_SIZE SZ_128K #define NAND_BLOCK_SIZE SZ_128K
...@@ -79,6 +80,12 @@ static u8 omap3_beagle_get_rev(void) ...@@ -79,6 +80,12 @@ static u8 omap3_beagle_get_rev(void)
return omap3_beagle_version; return omap3_beagle_version;
} }
static struct gpio omap3_beagle_rev_gpios[] __initdata = {
{ 171, GPIOF_IN, "rev_id_0" },
{ 172, GPIOF_IN, "rev_id_1" },
{ 173, GPIOF_IN, "rev_id_2" },
};
static void __init omap3_beagle_init_rev(void) static void __init omap3_beagle_init_rev(void)
{ {
int ret; int ret;
...@@ -88,21 +95,13 @@ static void __init omap3_beagle_init_rev(void) ...@@ -88,21 +95,13 @@ static void __init omap3_beagle_init_rev(void)
omap_mux_init_gpio(172, OMAP_PIN_INPUT_PULLUP); omap_mux_init_gpio(172, OMAP_PIN_INPUT_PULLUP);
omap_mux_init_gpio(173, OMAP_PIN_INPUT_PULLUP); omap_mux_init_gpio(173, OMAP_PIN_INPUT_PULLUP);
ret = gpio_request(171, "rev_id_0"); ret = gpio_request_array(omap3_beagle_rev_gpios,
if (ret < 0) ARRAY_SIZE(omap3_beagle_rev_gpios));
goto fail0; if (ret < 0) {
printk(KERN_ERR "Unable to get revision detection GPIO pins\n");
ret = gpio_request(172, "rev_id_1"); omap3_beagle_version = OMAP3BEAGLE_BOARD_UNKN;
if (ret < 0) return;
goto fail1; }
ret = gpio_request(173, "rev_id_2");
if (ret < 0)
goto fail2;
gpio_direction_input(171);
gpio_direction_input(172);
gpio_direction_input(173);
beagle_rev = gpio_get_value(171) | (gpio_get_value(172) << 1) beagle_rev = gpio_get_value(171) | (gpio_get_value(172) << 1)
| (gpio_get_value(173) << 2); | (gpio_get_value(173) << 2);
...@@ -128,18 +127,6 @@ static void __init omap3_beagle_init_rev(void) ...@@ -128,18 +127,6 @@ static void __init omap3_beagle_init_rev(void)
printk(KERN_INFO "OMAP3 Beagle Rev: unknown %hd\n", beagle_rev); printk(KERN_INFO "OMAP3 Beagle Rev: unknown %hd\n", beagle_rev);
omap3_beagle_version = OMAP3BEAGLE_BOARD_UNKN; omap3_beagle_version = OMAP3BEAGLE_BOARD_UNKN;
} }
return;
fail2:
gpio_free(172);
fail1:
gpio_free(171);
fail0:
printk(KERN_ERR "Unable to get revision detection GPIO pins\n");
omap3_beagle_version = OMAP3BEAGLE_BOARD_UNKN;
return;
} }
static struct mtd_partition omap3beagle_nand_partitions[] = { static struct mtd_partition omap3beagle_nand_partitions[] = {
...@@ -173,15 +160,6 @@ static struct mtd_partition omap3beagle_nand_partitions[] = { ...@@ -173,15 +160,6 @@ static struct mtd_partition omap3beagle_nand_partitions[] = {
}, },
}; };
static struct omap_nand_platform_data omap3beagle_nand_data = {
.options = NAND_BUSWIDTH_16,
.parts = omap3beagle_nand_partitions,
.nr_parts = ARRAY_SIZE(omap3beagle_nand_partitions),
.dma_channel = -1, /* disable DMA in OMAP NAND driver */
.nand_setup = NULL,
.dev_ready = NULL,
};
/* DSS */ /* DSS */
static int beagle_enable_dvi(struct omap_dss_device *dssdev) static int beagle_enable_dvi(struct omap_dss_device *dssdev)
...@@ -243,13 +221,10 @@ static void __init beagle_display_init(void) ...@@ -243,13 +221,10 @@ static void __init beagle_display_init(void)
{ {
int r; int r;
r = gpio_request(beagle_dvi_device.reset_gpio, "DVI reset"); r = gpio_request_one(beagle_dvi_device.reset_gpio, GPIOF_OUT_INIT_LOW,
if (r < 0) { "DVI reset");
if (r < 0)
printk(KERN_ERR "Unable to get DVI reset GPIO\n"); printk(KERN_ERR "Unable to get DVI reset GPIO\n");
return;
}
gpio_direction_output(beagle_dvi_device.reset_gpio, 0);
} }
#include "sdram-micron-mt46h32m32lf-6.h" #include "sdram-micron-mt46h32m32lf-6.h"
...@@ -276,7 +251,7 @@ static struct gpio_led gpio_leds[]; ...@@ -276,7 +251,7 @@ static struct gpio_led gpio_leds[];
static int beagle_twl_gpio_setup(struct device *dev, static int beagle_twl_gpio_setup(struct device *dev,
unsigned gpio, unsigned ngpio) unsigned gpio, unsigned ngpio)
{ {
int r; int r, usb_pwr_level;
if (omap3_beagle_get_rev() == OMAP3BEAGLE_BOARD_XM) { if (omap3_beagle_get_rev() == OMAP3BEAGLE_BOARD_XM) {
mmc[0].gpio_wp = -EINVAL; mmc[0].gpio_wp = -EINVAL;
...@@ -295,66 +270,46 @@ static int beagle_twl_gpio_setup(struct device *dev, ...@@ -295,66 +270,46 @@ static int beagle_twl_gpio_setup(struct device *dev,
beagle_vmmc1_supply.dev = mmc[0].dev; beagle_vmmc1_supply.dev = mmc[0].dev;
beagle_vsim_supply.dev = mmc[0].dev; beagle_vsim_supply.dev = mmc[0].dev;
/* REVISIT: need ehci-omap hooks for external VBUS
* power switch and overcurrent detect
*/
if (omap3_beagle_get_rev() != OMAP3BEAGLE_BOARD_XM) {
r = gpio_request(gpio + 1, "EHCI_nOC");
if (!r) {
r = gpio_direction_input(gpio + 1);
if (r)
gpio_free(gpio + 1);
}
if (r)
pr_err("%s: unable to configure EHCI_nOC\n", __func__);
}
/* /*
* TWL4030_GPIO_MAX + 0 == ledA, EHCI nEN_USB_PWR (out, XM active * TWL4030_GPIO_MAX + 0 == ledA, EHCI nEN_USB_PWR (out, XM active
* high / others active low) * high / others active low)
*/ * DVI reset GPIO is different between beagle revisions
gpio_request(gpio + TWL4030_GPIO_MAX, "nEN_USB_PWR");
if (omap3_beagle_get_rev() == OMAP3BEAGLE_BOARD_XM)
gpio_direction_output(gpio + TWL4030_GPIO_MAX, 1);
else
gpio_direction_output(gpio + TWL4030_GPIO_MAX, 0);
/* DVI reset GPIO is different between beagle revisions */
if (omap3_beagle_get_rev() == OMAP3BEAGLE_BOARD_XM)
beagle_dvi_device.reset_gpio = 129;
else
beagle_dvi_device.reset_gpio = 170;
/* TWL4030_GPIO_MAX + 1 == ledB, PMU_STAT (out, active low LED) */
gpio_leds[2].gpio = gpio + TWL4030_GPIO_MAX + 1;
/*
* gpio + 1 on Xm controls the TFP410's enable line (active low)
* gpio + 2 control varies depending on the board rev as follows:
* P7/P8 revisions(prototype): Camera EN
* A2+ revisions (production): LDO (supplies DVI, serial, led blocks)
*/ */
if (omap3_beagle_get_rev() == OMAP3BEAGLE_BOARD_XM) { if (omap3_beagle_get_rev() == OMAP3BEAGLE_BOARD_XM) {
r = gpio_request(gpio + 1, "nDVI_PWR_EN"); usb_pwr_level = GPIOF_OUT_INIT_HIGH;
if (!r) { beagle_dvi_device.reset_gpio = 129;
r = gpio_direction_output(gpio + 1, 0); /*
if (r) * gpio + 1 on Xm controls the TFP410's enable line (active low)
gpio_free(gpio + 1); * gpio + 2 control varies depending on the board rev as below:
} * P7/P8 revisions(prototype): Camera EN
* A2+ revisions (production): LDO (DVI, serial, led blocks)
*/
r = gpio_request_one(gpio + 1, GPIOF_OUT_INIT_LOW,
"nDVI_PWR_EN");
if (r) if (r)
pr_err("%s: unable to configure nDVI_PWR_EN\n", pr_err("%s: unable to configure nDVI_PWR_EN\n",
__func__); __func__);
r = gpio_request(gpio + 2, "DVI_LDO_EN"); r = gpio_request_one(gpio + 2, GPIOF_OUT_INIT_HIGH,
if (!r) { "DVI_LDO_EN");
r = gpio_direction_output(gpio + 2, 1);
if (r)
gpio_free(gpio + 2);
}
if (r) if (r)
pr_err("%s: unable to configure DVI_LDO_EN\n", pr_err("%s: unable to configure DVI_LDO_EN\n",
__func__); __func__);
} else {
usb_pwr_level = GPIOF_OUT_INIT_LOW;
beagle_dvi_device.reset_gpio = 170;
/*
* REVISIT: need ehci-omap hooks for external VBUS
* power switch and overcurrent detect
*/
if (gpio_request_one(gpio + 1, GPIOF_IN, "EHCI_nOC"))
pr_err("%s: unable to configure EHCI_nOC\n", __func__);
} }
gpio_request_one(gpio + TWL4030_GPIO_MAX, usb_pwr_level, "nEN_USB_PWR");
/* TWL4030_GPIO_MAX + 1 == ledB, PMU_STAT (out, active low LED) */
gpio_leds[2].gpio = gpio + TWL4030_GPIO_MAX + 1;
return 0; return 0;
} }
...@@ -453,15 +408,6 @@ static struct twl4030_platform_data beagle_twldata = { ...@@ -453,15 +408,6 @@ static struct twl4030_platform_data beagle_twldata = {
.vpll2 = &beagle_vpll2, .vpll2 = &beagle_vpll2,
}; };
static struct i2c_board_info __initdata beagle_i2c_boardinfo[] = {
{
I2C_BOARD_INFO("twl4030", 0x48),
.flags = I2C_CLIENT_WAKE,
.irq = INT_34XX_SYS_NIRQ,
.platform_data = &beagle_twldata,
},
};
static struct i2c_board_info __initdata beagle_i2c_eeprom[] = { static struct i2c_board_info __initdata beagle_i2c_eeprom[] = {
{ {
I2C_BOARD_INFO("eeprom", 0x50), I2C_BOARD_INFO("eeprom", 0x50),
...@@ -470,8 +416,7 @@ static struct i2c_board_info __initdata beagle_i2c_eeprom[] = { ...@@ -470,8 +416,7 @@ static struct i2c_board_info __initdata beagle_i2c_eeprom[] = {
static int __init omap3_beagle_i2c_init(void) static int __init omap3_beagle_i2c_init(void)
{ {
omap_register_i2c_bus(1, 2600, beagle_i2c_boardinfo, omap3_pmic_init("twl4030", &beagle_twldata);
ARRAY_SIZE(beagle_i2c_boardinfo));
/* Bus 3 is attached to the DVI port where devices like the pico DLP /* Bus 3 is attached to the DVI port where devices like the pico DLP
* projector don't work reliably with 400kHz */ * projector don't work reliably with 400kHz */
omap_register_i2c_bus(3, 100, beagle_i2c_eeprom, ARRAY_SIZE(beagle_i2c_eeprom)); omap_register_i2c_bus(3, 100, beagle_i2c_eeprom, ARRAY_SIZE(beagle_i2c_eeprom));
...@@ -551,39 +496,6 @@ static struct platform_device *omap3_beagle_devices[] __initdata = { ...@@ -551,39 +496,6 @@ static struct platform_device *omap3_beagle_devices[] __initdata = {
&keys_gpio, &keys_gpio,
}; };
static void __init omap3beagle_flash_init(void)
{
u8 cs = 0;
u8 nandcs = GPMC_CS_NUM + 1;
/* 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) {
omap3beagle_nand_data.cs = nandcs;
printk(KERN_INFO "Registering NAND on CS%d\n", nandcs);
if (gpmc_nand_init(&omap3beagle_nand_data) < 0)
printk(KERN_ERR "Unable to register NAND device\n");
}
}
static const struct usbhs_omap_board_data usbhs_bdata __initconst = { static const struct usbhs_omap_board_data usbhs_bdata __initconst = {
.port_mode[0] = OMAP_EHCI_PORT_MODE_PHY, .port_mode[0] = OMAP_EHCI_PORT_MODE_PHY,
...@@ -602,12 +514,6 @@ static struct omap_board_mux board_mux[] __initdata = { ...@@ -602,12 +514,6 @@ static struct omap_board_mux board_mux[] __initdata = {
}; };
#endif #endif
static struct omap_musb_board_data musb_board_data = {
.interface_type = MUSB_INTERFACE_ULPI,
.mode = MUSB_OTG,
.power = 100,
};
static void __init beagle_opp_init(void) static void __init beagle_opp_init(void)
{ {
int r = 0; int r = 0;
...@@ -665,13 +571,13 @@ static void __init omap3_beagle_init(void) ...@@ -665,13 +571,13 @@ static void __init omap3_beagle_init(void)
omap_serial_init(); omap_serial_init();
omap_mux_init_gpio(170, OMAP_PIN_INPUT); omap_mux_init_gpio(170, OMAP_PIN_INPUT);
gpio_request(170, "DVI_nPD");
/* REVISIT leave DVI powered down until it's needed ... */ /* REVISIT leave DVI powered down until it's needed ... */
gpio_direction_output(170, true); gpio_request_one(170, GPIOF_OUT_INIT_HIGH, "DVI_nPD");
usb_musb_init(&musb_board_data); usb_musb_init(NULL);
usbhs_init(&usbhs_bdata); usbhs_init(&usbhs_bdata);
omap3beagle_flash_init(); omap_nand_flash_init(NAND_BUSWIDTH_16, omap3beagle_nand_partitions,
ARRAY_SIZE(omap3beagle_nand_partitions));
/* Ensure SDRC pins are mux'd for self-refresh */ /* Ensure SDRC pins are mux'd for self-refresh */
omap_mux_init_signal("sdrc_cke0", OMAP_PIN_OUTPUT); omap_mux_init_signal("sdrc_cke0", OMAP_PIN_OUTPUT);
......
...@@ -50,6 +50,7 @@ ...@@ -50,6 +50,7 @@
#include "mux.h" #include "mux.h"
#include "sdram-micron-mt46h32m32lf-6.h" #include "sdram-micron-mt46h32m32lf-6.h"
#include "hsmmc.h" #include "hsmmc.h"
#include "common-board-devices.h"
#define OMAP3_EVM_TS_GPIO 175 #define OMAP3_EVM_TS_GPIO 175
#define OMAP3_EVM_EHCI_VBUS 22 #define OMAP3_EVM_EHCI_VBUS 22
...@@ -101,49 +102,20 @@ static void __init omap3_evm_get_revision(void) ...@@ -101,49 +102,20 @@ static void __init omap3_evm_get_revision(void)
} }
#if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE) #if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE)
static struct resource omap3evm_smsc911x_resources[] = { #include <plat/gpmc-smsc911x.h>
[0] = {
.start = OMAP3EVM_ETHR_START,
.end = (OMAP3EVM_ETHR_START + OMAP3EVM_ETHR_SIZE - 1),
.flags = IORESOURCE_MEM,
},
[1] = {
.start = OMAP_GPIO_IRQ(OMAP3EVM_ETHR_GPIO_IRQ),
.end = OMAP_GPIO_IRQ(OMAP3EVM_ETHR_GPIO_IRQ),
.flags = (IORESOURCE_IRQ | IRQF_TRIGGER_LOW),
},
};
static struct smsc911x_platform_config smsc911x_config = { static struct omap_smsc911x_platform_data smsc911x_cfg = {
.phy_interface = PHY_INTERFACE_MODE_MII, .cs = OMAP3EVM_SMSC911X_CS,
.irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_LOW, .gpio_irq = OMAP3EVM_ETHR_GPIO_IRQ,
.irq_type = SMSC911X_IRQ_TYPE_OPEN_DRAIN, .gpio_reset = -EINVAL,
.flags = (SMSC911X_USE_32BIT | SMSC911X_SAVE_MAC_ADDRESS), .flags = SMSC911X_USE_32BIT | SMSC911X_SAVE_MAC_ADDRESS,
};
static struct platform_device omap3evm_smsc911x_device = {
.name = "smsc911x",
.id = -1,
.num_resources = ARRAY_SIZE(omap3evm_smsc911x_resources),
.resource = &omap3evm_smsc911x_resources[0],
.dev = {
.platform_data = &smsc911x_config,
},
}; };
static inline void __init omap3evm_init_smsc911x(void) static inline void __init omap3evm_init_smsc911x(void)
{ {
int eth_cs, eth_rst;
struct clk *l3ck; struct clk *l3ck;
unsigned int rate; unsigned int rate;
if (get_omap3_evm_rev() == OMAP3EVM_BOARD_GEN_1)
eth_rst = OMAP3EVM_GEN1_ETHR_GPIO_RST;
else
eth_rst = OMAP3EVM_GEN2_ETHR_GPIO_RST;
eth_cs = OMAP3EVM_SMSC911X_CS;
l3ck = clk_get(NULL, "l3_ck"); l3ck = clk_get(NULL, "l3_ck");
if (IS_ERR(l3ck)) if (IS_ERR(l3ck))
rate = 100000000; rate = 100000000;
...@@ -152,33 +124,13 @@ static inline void __init omap3evm_init_smsc911x(void) ...@@ -152,33 +124,13 @@ static inline void __init omap3evm_init_smsc911x(void)
/* Configure ethernet controller reset gpio */ /* Configure ethernet controller reset gpio */
if (cpu_is_omap3430()) { if (cpu_is_omap3430()) {
if (gpio_request(eth_rst, "SMSC911x gpio") < 0) { if (get_omap3_evm_rev() == OMAP3EVM_BOARD_GEN_1)
pr_err(KERN_ERR "Failed to request %d for smsc911x\n", smsc911x_cfg.gpio_reset = OMAP3EVM_GEN1_ETHR_GPIO_RST;
eth_rst); else
return; smsc911x_cfg.gpio_reset = OMAP3EVM_GEN2_ETHR_GPIO_RST;
}
if (gpio_direction_output(eth_rst, 1) < 0) {
pr_err(KERN_ERR "Failed to set direction of %d for" \
" smsc911x\n", eth_rst);
return;
}
/* reset pulse to ethernet controller*/
usleep_range(150, 220);
gpio_set_value(eth_rst, 0);
usleep_range(150, 220);
gpio_set_value(eth_rst, 1);
usleep_range(1, 2);
}
if (gpio_request(OMAP3EVM_ETHR_GPIO_IRQ, "SMSC911x irq") < 0) {
printk(KERN_ERR "Failed to request GPIO%d for smsc911x IRQ\n",
OMAP3EVM_ETHR_GPIO_IRQ);
return;
} }
gpio_direction_input(OMAP3EVM_ETHR_GPIO_IRQ); gpmc_smsc911x_init(&smsc911x_cfg);
platform_device_register(&omap3evm_smsc911x_device);
} }
#else #else
...@@ -197,6 +149,15 @@ static inline void __init omap3evm_init_smsc911x(void) { return; } ...@@ -197,6 +149,15 @@ static inline void __init omap3evm_init_smsc911x(void) { return; }
#define OMAP3EVM_LCD_PANEL_BKLIGHT_GPIO 210 #define OMAP3EVM_LCD_PANEL_BKLIGHT_GPIO 210
#define OMAP3EVM_DVI_PANEL_EN_GPIO 199 #define OMAP3EVM_DVI_PANEL_EN_GPIO 199
static struct gpio omap3_evm_dss_gpios[] __initdata = {
{ OMAP3EVM_LCD_PANEL_RESB, GPIOF_OUT_INIT_HIGH, "lcd_panel_resb" },
{ OMAP3EVM_LCD_PANEL_INI, GPIOF_OUT_INIT_HIGH, "lcd_panel_ini" },
{ OMAP3EVM_LCD_PANEL_QVGA, GPIOF_OUT_INIT_LOW, "lcd_panel_qvga" },
{ OMAP3EVM_LCD_PANEL_LR, GPIOF_OUT_INIT_HIGH, "lcd_panel_lr" },
{ OMAP3EVM_LCD_PANEL_UD, GPIOF_OUT_INIT_HIGH, "lcd_panel_ud" },
{ OMAP3EVM_LCD_PANEL_ENVDD, GPIOF_OUT_INIT_LOW, "lcd_panel_envdd" },
};
static int lcd_enabled; static int lcd_enabled;
static int dvi_enabled; static int dvi_enabled;
...@@ -204,61 +165,10 @@ static void __init omap3_evm_display_init(void) ...@@ -204,61 +165,10 @@ static void __init omap3_evm_display_init(void)
{ {
int r; int r;
r = gpio_request(OMAP3EVM_LCD_PANEL_RESB, "lcd_panel_resb"); r = gpio_request_array(omap3_evm_dss_gpios,
if (r) { ARRAY_SIZE(omap3_evm_dss_gpios));
printk(KERN_ERR "failed to get lcd_panel_resb\n"); if (r)
return; printk(KERN_ERR "failed to get lcd_panel_* gpios\n");
}
gpio_direction_output(OMAP3EVM_LCD_PANEL_RESB, 1);
r = gpio_request(OMAP3EVM_LCD_PANEL_INI, "lcd_panel_ini");
if (r) {
printk(KERN_ERR "failed to get lcd_panel_ini\n");
goto err_1;
}
gpio_direction_output(OMAP3EVM_LCD_PANEL_INI, 1);
r = gpio_request(OMAP3EVM_LCD_PANEL_QVGA, "lcd_panel_qvga");
if (r) {
printk(KERN_ERR "failed to get lcd_panel_qvga\n");
goto err_2;
}
gpio_direction_output(OMAP3EVM_LCD_PANEL_QVGA, 0);
r = gpio_request(OMAP3EVM_LCD_PANEL_LR, "lcd_panel_lr");
if (r) {
printk(KERN_ERR "failed to get lcd_panel_lr\n");
goto err_3;
}
gpio_direction_output(OMAP3EVM_LCD_PANEL_LR, 1);
r = gpio_request(OMAP3EVM_LCD_PANEL_UD, "lcd_panel_ud");
if (r) {
printk(KERN_ERR "failed to get lcd_panel_ud\n");
goto err_4;
}
gpio_direction_output(OMAP3EVM_LCD_PANEL_UD, 1);
r = gpio_request(OMAP3EVM_LCD_PANEL_ENVDD, "lcd_panel_envdd");
if (r) {
printk(KERN_ERR "failed to get lcd_panel_envdd\n");
goto err_5;
}
gpio_direction_output(OMAP3EVM_LCD_PANEL_ENVDD, 0);
return;
err_5:
gpio_free(OMAP3EVM_LCD_PANEL_UD);
err_4:
gpio_free(OMAP3EVM_LCD_PANEL_LR);
err_3:
gpio_free(OMAP3EVM_LCD_PANEL_QVGA);
err_2:
gpio_free(OMAP3EVM_LCD_PANEL_INI);
err_1:
gpio_free(OMAP3EVM_LCD_PANEL_RESB);
} }
static int omap3_evm_enable_lcd(struct omap_dss_device *dssdev) static int omap3_evm_enable_lcd(struct omap_dss_device *dssdev)
...@@ -448,7 +358,7 @@ static struct platform_device leds_gpio = { ...@@ -448,7 +358,7 @@ static struct platform_device leds_gpio = {
static int omap3evm_twl_gpio_setup(struct device *dev, static int omap3evm_twl_gpio_setup(struct device *dev,
unsigned gpio, unsigned ngpio) unsigned gpio, unsigned ngpio)
{ {
int r; int r, lcd_bl_en;
/* gpio + 0 is "mmc0_cd" (input/IRQ) */ /* gpio + 0 is "mmc0_cd" (input/IRQ) */
omap_mux_init_gpio(63, OMAP_PIN_INPUT); omap_mux_init_gpio(63, OMAP_PIN_INPUT);
...@@ -465,16 +375,14 @@ static int omap3evm_twl_gpio_setup(struct device *dev, ...@@ -465,16 +375,14 @@ static int omap3evm_twl_gpio_setup(struct device *dev,
*/ */
/* TWL4030_GPIO_MAX + 0 == ledA, LCD Backlight control */ /* TWL4030_GPIO_MAX + 0 == ledA, LCD Backlight control */
r = gpio_request(gpio + TWL4030_GPIO_MAX, "EN_LCD_BKL"); lcd_bl_en = get_omap3_evm_rev() >= OMAP3EVM_BOARD_GEN_2 ?
if (!r) GPIOF_OUT_INIT_HIGH : GPIOF_OUT_INIT_LOW;
r = gpio_direction_output(gpio + TWL4030_GPIO_MAX, r = gpio_request_one(gpio + TWL4030_GPIO_MAX, lcd_bl_en, "EN_LCD_BKL");
(get_omap3_evm_rev() >= OMAP3EVM_BOARD_GEN_2) ? 1 : 0);
if (r) if (r)
printk(KERN_ERR "failed to get/set lcd_bkl gpio\n"); printk(KERN_ERR "failed to get/set lcd_bkl gpio\n");
/* gpio + 7 == DVI Enable */ /* gpio + 7 == DVI Enable */
gpio_request(gpio + 7, "EN_DVI"); gpio_request_one(gpio + 7, GPIOF_OUT_INIT_LOW, "EN_DVI");
gpio_direction_output(gpio + 7, 0);
/* TWL4030_GPIO_MAX + 1 == ledB (out, active low LED) */ /* TWL4030_GPIO_MAX + 1 == ledB (out, active low LED) */
gpio_leds[2].gpio = gpio + TWL4030_GPIO_MAX + 1; gpio_leds[2].gpio = gpio + TWL4030_GPIO_MAX + 1;
...@@ -652,78 +560,18 @@ static struct twl4030_platform_data omap3evm_twldata = { ...@@ -652,78 +560,18 @@ static struct twl4030_platform_data omap3evm_twldata = {
.vdac = &omap3_evm_vdac, .vdac = &omap3_evm_vdac,
.vpll2 = &omap3_evm_vpll2, .vpll2 = &omap3_evm_vpll2,
.vio = &omap3evm_vio, .vio = &omap3evm_vio,
}; .vmmc1 = &omap3evm_vmmc1,
.vsim = &omap3evm_vsim,
static struct i2c_board_info __initdata omap3evm_i2c_boardinfo[] = {
{
I2C_BOARD_INFO("twl4030", 0x48),
.flags = I2C_CLIENT_WAKE,
.irq = INT_34XX_SYS_NIRQ,
.platform_data = &omap3evm_twldata,
},
}; };
static int __init omap3_evm_i2c_init(void) static int __init omap3_evm_i2c_init(void)
{ {
/* omap3_pmic_init("twl4030", &omap3evm_twldata);
* REVISIT: These entries can be set in omap3evm_twl_data
* after a merge with MFD tree
*/
omap3evm_twldata.vmmc1 = &omap3evm_vmmc1;
omap3evm_twldata.vsim = &omap3evm_vsim;
omap_register_i2c_bus(1, 2600, omap3evm_i2c_boardinfo,
ARRAY_SIZE(omap3evm_i2c_boardinfo));
omap_register_i2c_bus(2, 400, NULL, 0); omap_register_i2c_bus(2, 400, NULL, 0);
omap_register_i2c_bus(3, 400, NULL, 0); omap_register_i2c_bus(3, 400, NULL, 0);
return 0; return 0;
} }
static void ads7846_dev_init(void)
{
if (gpio_request(OMAP3_EVM_TS_GPIO, "ADS7846 pendown") < 0)
printk(KERN_ERR "can't get ads7846 pen down GPIO\n");
gpio_direction_input(OMAP3_EVM_TS_GPIO);
gpio_set_debounce(OMAP3_EVM_TS_GPIO, 310);
}
static int ads7846_get_pendown_state(void)
{
return !gpio_get_value(OMAP3_EVM_TS_GPIO);
}
static 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,
.wakeup = true,
};
static struct omap2_mcspi_device_config ads7846_mcspi_config = {
.turbo_mode = 0,
.single_channel = 1, /* 0: slave, 1: master */
};
static struct spi_board_info omap3evm_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_EVM_TS_GPIO),
.platform_data = &ads7846_config,
},
};
static struct omap_board_config_kernel omap3_evm_config[] __initdata = { static struct omap_board_config_kernel omap3_evm_config[] __initdata = {
}; };
...@@ -825,6 +673,11 @@ static struct omap_musb_board_data musb_board_data = { ...@@ -825,6 +673,11 @@ static struct omap_musb_board_data musb_board_data = {
.power = 100, .power = 100,
}; };
static struct gpio omap3_evm_ehci_gpios[] __initdata = {
{ OMAP3_EVM_EHCI_VBUS, GPIOF_OUT_INIT_HIGH, "enable EHCI VBUS" },
{ OMAP3_EVM_EHCI_SELECT, GPIOF_OUT_INIT_LOW, "select EHCI port" },
};
static void __init omap3_evm_init(void) static void __init omap3_evm_init(void)
{ {
omap3_evm_get_revision(); omap3_evm_get_revision();
...@@ -841,9 +694,6 @@ static void __init omap3_evm_init(void) ...@@ -841,9 +694,6 @@ static void __init omap3_evm_init(void)
omap_display_init(&omap3_evm_dss_data); omap_display_init(&omap3_evm_dss_data);
spi_register_board_info(omap3evm_spi_board_info,
ARRAY_SIZE(omap3evm_spi_board_info));
omap_serial_init(); omap_serial_init();
/* OMAP3EVM uses ISP1504 phy and so register nop transceiver */ /* OMAP3EVM uses ISP1504 phy and so register nop transceiver */
...@@ -851,16 +701,12 @@ static void __init omap3_evm_init(void) ...@@ -851,16 +701,12 @@ static void __init omap3_evm_init(void)
if (get_omap3_evm_rev() >= OMAP3EVM_BOARD_GEN_2) { if (get_omap3_evm_rev() >= OMAP3EVM_BOARD_GEN_2) {
/* enable EHCI VBUS using GPIO22 */ /* enable EHCI VBUS using GPIO22 */
omap_mux_init_gpio(22, OMAP_PIN_INPUT_PULLUP); omap_mux_init_gpio(OMAP3_EVM_EHCI_VBUS, OMAP_PIN_INPUT_PULLUP);
gpio_request(OMAP3_EVM_EHCI_VBUS, "enable EHCI VBUS");
gpio_direction_output(OMAP3_EVM_EHCI_VBUS, 0);
gpio_set_value(OMAP3_EVM_EHCI_VBUS, 1);
/* Select EHCI port on main board */ /* Select EHCI port on main board */
omap_mux_init_gpio(61, OMAP_PIN_INPUT_PULLUP); omap_mux_init_gpio(OMAP3_EVM_EHCI_SELECT,
gpio_request(OMAP3_EVM_EHCI_SELECT, "select EHCI port"); OMAP_PIN_INPUT_PULLUP);
gpio_direction_output(OMAP3_EVM_EHCI_SELECT, 0); gpio_request_array(omap3_evm_ehci_gpios,
gpio_set_value(OMAP3_EVM_EHCI_SELECT, 0); ARRAY_SIZE(omap3_evm_ehci_gpios));
/* setup EHCI phy reset config */ /* setup EHCI phy reset config */
omap_mux_init_gpio(21, OMAP_PIN_INPUT_PULLUP); omap_mux_init_gpio(21, OMAP_PIN_INPUT_PULLUP);
...@@ -876,7 +722,7 @@ static void __init omap3_evm_init(void) ...@@ -876,7 +722,7 @@ static void __init omap3_evm_init(void)
} }
usb_musb_init(&musb_board_data); usb_musb_init(&musb_board_data);
usbhs_init(&usbhs_bdata); usbhs_init(&usbhs_bdata);
ads7846_dev_init(); omap_ads7846_init(1, OMAP3_EVM_TS_GPIO, 310, NULL);
omap3evm_init_smsc911x(); omap3evm_init_smsc911x();
omap3_evm_display_init(); omap3_evm_display_init();
......
...@@ -37,6 +37,7 @@ ...@@ -37,6 +37,7 @@
#include "hsmmc.h" #include "hsmmc.h"
#include "timer-gp.h" #include "timer-gp.h"
#include "control.h" #include "control.h"
#include "common-board-devices.h"
#include <plat/mux.h> #include <plat/mux.h>
#include <plat/board.h> #include <plat/board.h>
...@@ -93,19 +94,9 @@ static struct twl4030_platform_data omap3logic_twldata = { ...@@ -93,19 +94,9 @@ static struct twl4030_platform_data omap3logic_twldata = {
.vmmc1 = &omap3logic_vmmc1, .vmmc1 = &omap3logic_vmmc1,
}; };
static struct i2c_board_info __initdata omap3logic_i2c_boardinfo[] = {
{
I2C_BOARD_INFO("twl4030", 0x48),
.flags = I2C_CLIENT_WAKE,
.irq = INT_34XX_SYS_NIRQ,
.platform_data = &omap3logic_twldata,
},
};
static int __init omap3logic_i2c_init(void) static int __init omap3logic_i2c_init(void)
{ {
omap_register_i2c_bus(1, 2600, omap3logic_i2c_boardinfo, omap3_pmic_init("twl4030", &omap3logic_twldata);
ARRAY_SIZE(omap3logic_i2c_boardinfo));
return 0; return 0;
} }
...@@ -147,7 +138,6 @@ static struct omap_smsc911x_platform_data __initdata board_smsc911x_data = { ...@@ -147,7 +138,6 @@ static struct omap_smsc911x_platform_data __initdata board_smsc911x_data = {
.cs = OMAP3LOGIC_SMSC911X_CS, .cs = OMAP3LOGIC_SMSC911X_CS,
.gpio_irq = -EINVAL, .gpio_irq = -EINVAL,
.gpio_reset = -EINVAL, .gpio_reset = -EINVAL,
.flags = IORESOURCE_IRQ_LOWLEVEL,
}; };
/* TODO/FIXME (comment by Peter Barada, LogicPD): /* TODO/FIXME (comment by Peter Barada, LogicPD):
......
...@@ -22,7 +22,6 @@ ...@@ -22,7 +22,6 @@
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/spi/spi.h> #include <linux/spi/spi.h>
#include <linux/spi/ads7846.h>
#include <linux/regulator/machine.h> #include <linux/regulator/machine.h>
#include <linux/i2c/twl.h> #include <linux/i2c/twl.h>
#include <linux/wl12xx.h> #include <linux/wl12xx.h>
...@@ -52,6 +51,7 @@ ...@@ -52,6 +51,7 @@
#include "mux.h" #include "mux.h"
#include "sdram-micron-mt46h32m32lf-6.h" #include "sdram-micron-mt46h32m32lf-6.h"
#include "hsmmc.h" #include "hsmmc.h"
#include "common-board-devices.h"
#define PANDORA_WIFI_IRQ_GPIO 21 #define PANDORA_WIFI_IRQ_GPIO 21
#define PANDORA_WIFI_NRESET_GPIO 23 #define PANDORA_WIFI_NRESET_GPIO 23
...@@ -305,24 +305,13 @@ static int omap3pandora_twl_gpio_setup(struct device *dev, ...@@ -305,24 +305,13 @@ static int omap3pandora_twl_gpio_setup(struct device *dev,
/* gpio + 13 drives 32kHz buffer for wifi module */ /* gpio + 13 drives 32kHz buffer for wifi module */
gpio_32khz = gpio + 13; gpio_32khz = gpio + 13;
ret = gpio_request(gpio_32khz, "wifi 32kHz"); ret = gpio_request_one(gpio_32khz, GPIOF_OUT_INIT_HIGH, "wifi 32kHz");
if (ret < 0) { if (ret < 0) {
pr_err("Cannot get GPIO line %d, ret=%d\n", gpio_32khz, ret); pr_err("Cannot get GPIO line %d, ret=%d\n", gpio_32khz, ret);
goto fail; return -ENODEV;
}
ret = gpio_direction_output(gpio_32khz, 1);
if (ret < 0) {
pr_err("Cannot set GPIO line %d, ret=%d\n", gpio_32khz, ret);
goto fail_direction;
} }
return 0; return 0;
fail_direction:
gpio_free(gpio_32khz);
fail:
return -ENODEV;
} }
static struct twl4030_gpio_platform_data omap3pandora_gpio_data = { static struct twl4030_gpio_platform_data omap3pandora_gpio_data = {
...@@ -544,15 +533,6 @@ static struct twl4030_platform_data omap3pandora_twldata = { ...@@ -544,15 +533,6 @@ static struct twl4030_platform_data omap3pandora_twldata = {
.bci = &pandora_bci_data, .bci = &pandora_bci_data,
}; };
static struct i2c_board_info __initdata omap3pandora_i2c_boardinfo[] = {
{
I2C_BOARD_INFO("tps65950", 0x48),
.flags = I2C_CLIENT_WAKE,
.irq = INT_34XX_SYS_NIRQ,
.platform_data = &omap3pandora_twldata,
},
};
static struct i2c_board_info __initdata omap3pandora_i2c3_boardinfo[] = { static struct i2c_board_info __initdata omap3pandora_i2c3_boardinfo[] = {
{ {
I2C_BOARD_INFO("bq27500", 0x55), I2C_BOARD_INFO("bq27500", 0x55),
...@@ -562,61 +542,15 @@ static struct i2c_board_info __initdata omap3pandora_i2c3_boardinfo[] = { ...@@ -562,61 +542,15 @@ static struct i2c_board_info __initdata omap3pandora_i2c3_boardinfo[] = {
static int __init omap3pandora_i2c_init(void) static int __init omap3pandora_i2c_init(void)
{ {
omap_register_i2c_bus(1, 2600, omap3pandora_i2c_boardinfo, omap3_pmic_init("tps65950", &omap3pandora_twldata);
ARRAY_SIZE(omap3pandora_i2c_boardinfo));
/* i2c2 pins are not connected */ /* i2c2 pins are not connected */
omap_register_i2c_bus(3, 100, omap3pandora_i2c3_boardinfo, omap_register_i2c_bus(3, 100, omap3pandora_i2c3_boardinfo,
ARRAY_SIZE(omap3pandora_i2c3_boardinfo)); ARRAY_SIZE(omap3pandora_i2c3_boardinfo));
return 0; return 0;
} }
static void __init omap3pandora_ads7846_init(void)
{
int gpio = OMAP3_PANDORA_TS_GPIO;
int ret;
ret = gpio_request(gpio, "ads7846_pen_down");
if (ret < 0) {
printk(KERN_ERR "Failed to request GPIO %d for "
"ads7846 pen down IRQ\n", gpio);
return;
}
gpio_direction_input(gpio);
}
static int ads7846_get_pendown_state(void)
{
return !gpio_get_value(OMAP3_PANDORA_TS_GPIO);
}
static 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,
};
static struct omap2_mcspi_device_config ads7846_mcspi_config = {
.turbo_mode = 0,
.single_channel = 1, /* 0: slave, 1: master */
};
static struct spi_board_info omap3pandora_spi_board_info[] __initdata = { static struct spi_board_info omap3pandora_spi_board_info[] __initdata = {
{ {
.modalias = "ads7846",
.bus_num = 1,
.chip_select = 0,
.max_speed_hz = 1500000,
.controller_data = &ads7846_mcspi_config,
.irq = OMAP_GPIO_IRQ(OMAP3_PANDORA_TS_GPIO),
.platform_data = &ads7846_config,
}, {
.modalias = "tpo_td043mtea1_panel_spi", .modalias = "tpo_td043mtea1_panel_spi",
.bus_num = 1, .bus_num = 1,
.chip_select = 1, .chip_select = 1,
...@@ -639,14 +573,10 @@ static void __init pandora_wl1251_init(void) ...@@ -639,14 +573,10 @@ static void __init pandora_wl1251_init(void)
memset(&pandora_wl1251_pdata, 0, sizeof(pandora_wl1251_pdata)); memset(&pandora_wl1251_pdata, 0, sizeof(pandora_wl1251_pdata));
ret = gpio_request(PANDORA_WIFI_IRQ_GPIO, "wl1251 irq"); ret = gpio_request_one(PANDORA_WIFI_IRQ_GPIO, GPIOF_IN, "wl1251 irq");
if (ret < 0) if (ret < 0)
goto fail; goto fail;
ret = gpio_direction_input(PANDORA_WIFI_IRQ_GPIO);
if (ret < 0)
goto fail_irq;
pandora_wl1251_pdata.irq = gpio_to_irq(PANDORA_WIFI_IRQ_GPIO); pandora_wl1251_pdata.irq = gpio_to_irq(PANDORA_WIFI_IRQ_GPIO);
if (pandora_wl1251_pdata.irq < 0) if (pandora_wl1251_pdata.irq < 0)
goto fail_irq; goto fail_irq;
...@@ -688,12 +618,6 @@ static struct omap_board_mux board_mux[] __initdata = { ...@@ -688,12 +618,6 @@ static struct omap_board_mux board_mux[] __initdata = {
}; };
#endif #endif
static struct omap_musb_board_data musb_board_data = {
.interface_type = MUSB_INTERFACE_ULPI,
.mode = MUSB_OTG,
.power = 100,
};
static void __init omap3pandora_init(void) static void __init omap3pandora_init(void)
{ {
omap3_mux_init(board_mux, OMAP_PACKAGE_CBB); omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);
...@@ -705,9 +629,9 @@ static void __init omap3pandora_init(void) ...@@ -705,9 +629,9 @@ static void __init omap3pandora_init(void)
omap_serial_init(); omap_serial_init();
spi_register_board_info(omap3pandora_spi_board_info, spi_register_board_info(omap3pandora_spi_board_info,
ARRAY_SIZE(omap3pandora_spi_board_info)); ARRAY_SIZE(omap3pandora_spi_board_info));
omap3pandora_ads7846_init(); omap_ads7846_init(1, OMAP3_PANDORA_TS_GPIO, 0, NULL);
usbhs_init(&usbhs_bdata); usbhs_init(&usbhs_bdata);
usb_musb_init(&musb_board_data); usb_musb_init(NULL);
gpmc_nand_init(&pandora_nand_data); gpmc_nand_init(&pandora_nand_data);
/* Ensure SDRC pins are mux'd for self-refresh */ /* Ensure SDRC pins are mux'd for self-refresh */
......
...@@ -45,7 +45,6 @@ ...@@ -45,7 +45,6 @@
#include <plat/mcspi.h> #include <plat/mcspi.h>
#include <linux/input/matrix_keypad.h> #include <linux/input/matrix_keypad.h>
#include <linux/spi/spi.h> #include <linux/spi/spi.h>
#include <linux/spi/ads7846.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/smsc911x.h> #include <linux/smsc911x.h>
#include <linux/i2c/at24.h> #include <linux/i2c/at24.h>
...@@ -54,52 +53,28 @@ ...@@ -54,52 +53,28 @@
#include "mux.h" #include "mux.h"
#include "hsmmc.h" #include "hsmmc.h"
#include "timer-gp.h" #include "timer-gp.h"
#include "common-board-devices.h"
#if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE) #if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE)
#include <plat/gpmc-smsc911x.h>
#define OMAP3STALKER_ETHR_START 0x2c000000 #define OMAP3STALKER_ETHR_START 0x2c000000
#define OMAP3STALKER_ETHR_SIZE 1024 #define OMAP3STALKER_ETHR_SIZE 1024
#define OMAP3STALKER_ETHR_GPIO_IRQ 19 #define OMAP3STALKER_ETHR_GPIO_IRQ 19
#define OMAP3STALKER_SMC911X_CS 5 #define OMAP3STALKER_SMC911X_CS 5
static struct resource omap3stalker_smsc911x_resources[] = { static struct omap_smsc911x_platform_data smsc911x_cfg = {
[0] = { .cs = OMAP3STALKER_SMC911X_CS,
.start = OMAP3STALKER_ETHR_START, .gpio_irq = OMAP3STALKER_ETHR_GPIO_IRQ,
.end = .gpio_reset = -EINVAL,
(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),
},
};
static struct smsc911x_platform_config smsc911x_config = {
.phy_interface = PHY_INTERFACE_MODE_MII,
.irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_LOW,
.irq_type = SMSC911X_IRQ_TYPE_OPEN_DRAIN,
.flags = (SMSC911X_USE_32BIT | SMSC911X_SAVE_MAC_ADDRESS), .flags = (SMSC911X_USE_32BIT | SMSC911X_SAVE_MAC_ADDRESS),
}; };
static struct platform_device omap3stalker_smsc911x_device = {
.name = "smsc911x",
.id = -1,
.num_resources = ARRAY_SIZE(omap3stalker_smsc911x_resources),
.resource = &omap3stalker_smsc911x_resources[0],
.dev = {
.platform_data = &smsc911x_config,
},
};
static inline void __init omap3stalker_init_eth(void) static inline void __init omap3stalker_init_eth(void)
{ {
int eth_cs;
struct clk *l3ck; struct clk *l3ck;
unsigned int rate; unsigned int rate;
eth_cs = OMAP3STALKER_SMC911X_CS;
l3ck = clk_get(NULL, "l3_ck"); l3ck = clk_get(NULL, "l3_ck");
if (IS_ERR(l3ck)) if (IS_ERR(l3ck))
rate = 100000000; rate = 100000000;
...@@ -107,16 +82,7 @@ static inline void __init omap3stalker_init_eth(void) ...@@ -107,16 +82,7 @@ static inline void __init omap3stalker_init_eth(void)
rate = clk_get_rate(l3ck); rate = clk_get_rate(l3ck);
omap_mux_init_gpio(19, OMAP_PIN_INPUT_PULLUP); omap_mux_init_gpio(19, OMAP_PIN_INPUT_PULLUP);
if (gpio_request(OMAP3STALKER_ETHR_GPIO_IRQ, "SMC911x irq") < 0) { gpmc_smsc911x_init(&smsc911x_cfg);
printk(KERN_ERR
"Failed to request GPIO%d for smc911x IRQ\n",
OMAP3STALKER_ETHR_GPIO_IRQ);
return;
}
gpio_direction_input(OMAP3STALKER_ETHR_GPIO_IRQ);
platform_device_register(&omap3stalker_smsc911x_device);
} }
#else #else
...@@ -365,12 +331,11 @@ omap3stalker_twl_gpio_setup(struct device *dev, ...@@ -365,12 +331,11 @@ omap3stalker_twl_gpio_setup(struct device *dev,
*/ */
/* TWL4030_GPIO_MAX + 0 == ledA, LCD Backlight control */ /* TWL4030_GPIO_MAX + 0 == ledA, LCD Backlight control */
gpio_request(gpio + TWL4030_GPIO_MAX, "EN_LCD_BKL"); gpio_request_one(gpio + TWL4030_GPIO_MAX, GPIOF_OUT_INIT_LOW,
gpio_direction_output(gpio + TWL4030_GPIO_MAX, 0); "EN_LCD_BKL");
/* gpio + 7 == DVI Enable */ /* gpio + 7 == DVI Enable */
gpio_request(gpio + 7, "EN_DVI"); gpio_request_one(gpio + 7, GPIOF_OUT_INIT_LOW, "EN_DVI");
gpio_direction_output(gpio + 7, 0);
/* TWL4030_GPIO_MAX + 1 == ledB (out, mmc0) */ /* TWL4030_GPIO_MAX + 1 == ledB (out, mmc0) */
gpio_leds[2].gpio = gpio + TWL4030_GPIO_MAX + 1; gpio_leds[2].gpio = gpio + TWL4030_GPIO_MAX + 1;
...@@ -489,15 +454,8 @@ static struct twl4030_platform_data omap3stalker_twldata = { ...@@ -489,15 +454,8 @@ static struct twl4030_platform_data omap3stalker_twldata = {
.codec = &omap3stalker_codec_data, .codec = &omap3stalker_codec_data,
.vdac = &omap3_stalker_vdac, .vdac = &omap3_stalker_vdac,
.vpll2 = &omap3_stalker_vpll2, .vpll2 = &omap3_stalker_vpll2,
}; .vmmc1 = &omap3stalker_vmmc1,
.vsim = &omap3stalker_vsim,
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 = { static struct at24_platform_data fram_info = {
...@@ -516,15 +474,7 @@ static struct i2c_board_info __initdata omap3stalker_i2c_boardinfo3[] = { ...@@ -516,15 +474,7 @@ static struct i2c_board_info __initdata omap3stalker_i2c_boardinfo3[] = {
static int __init omap3_stalker_i2c_init(void) static int __init omap3_stalker_i2c_init(void)
{ {
/* omap3_pmic_init("twl4030", &omap3stalker_twldata);
* 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(2, 400, NULL, 0);
omap_register_i2c_bus(3, 400, omap3stalker_i2c_boardinfo3, omap_register_i2c_bus(3, 400, omap3stalker_i2c_boardinfo3,
ARRAY_SIZE(omap3stalker_i2c_boardinfo3)); ARRAY_SIZE(omap3stalker_i2c_boardinfo3));
...@@ -532,49 +482,6 @@ static int __init omap3_stalker_i2c_init(void) ...@@ -532,49 +482,6 @@ static int __init omap3_stalker_i2c_init(void)
} }
#define OMAP3_STALKER_TS_GPIO 175 #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);
gpio_set_debounce(OMAP3_STALKER_TS_GPIO, 310);
}
static int ads7846_get_pendown_state(void)
{
return !gpio_get_value(OMAP3_STALKER_TS_GPIO);
}
static 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 */
};
static 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 struct omap_board_config_kernel omap3_stalker_config[] __initdata = {
}; };
...@@ -618,12 +525,6 @@ static struct omap_board_mux board_mux[] __initdata = { ...@@ -618,12 +525,6 @@ static struct omap_board_mux board_mux[] __initdata = {
}; };
#endif #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) static void __init omap3_stalker_init(void)
{ {
omap3_mux_init(board_mux, OMAP_PACKAGE_CUS); omap3_mux_init(board_mux, OMAP_PACKAGE_CUS);
...@@ -636,13 +537,11 @@ static void __init omap3_stalker_init(void) ...@@ -636,13 +537,11 @@ static void __init omap3_stalker_init(void)
ARRAY_SIZE(omap3_stalker_devices)); ARRAY_SIZE(omap3_stalker_devices));
omap_display_init(&omap3_stalker_dss_data); omap_display_init(&omap3_stalker_dss_data);
spi_register_board_info(omap3stalker_spi_board_info,
ARRAY_SIZE(omap3stalker_spi_board_info));
omap_serial_init(); omap_serial_init();
usb_musb_init(&musb_board_data); usb_musb_init(NULL);
usbhs_init(&usbhs_bdata); usbhs_init(&usbhs_bdata);
ads7846_dev_init(); omap_ads7846_init(1, OMAP3_STALKER_TS_GPIO, 310, NULL);
omap_mux_init_gpio(21, OMAP_PIN_OUTPUT); omap_mux_init_gpio(21, OMAP_PIN_OUTPUT);
omap_mux_init_gpio(18, OMAP_PIN_INPUT_PULLUP); omap_mux_init_gpio(18, OMAP_PIN_INPUT_PULLUP);
......
...@@ -52,6 +52,7 @@ ...@@ -52,6 +52,7 @@
#include "mux.h" #include "mux.h"
#include "hsmmc.h" #include "hsmmc.h"
#include "timer-gp.h" #include "timer-gp.h"
#include "common-board-devices.h"
#include <asm/setup.h> #include <asm/setup.h>
...@@ -95,15 +96,6 @@ static struct mtd_partition omap3touchbook_nand_partitions[] = { ...@@ -95,15 +96,6 @@ static struct mtd_partition omap3touchbook_nand_partitions[] = {
}, },
}; };
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,
};
#include "sdram-micron-mt46h32m32lf-6.h" #include "sdram-micron-mt46h32m32lf-6.h"
static struct omap2_hsmmc_info mmc[] = { static struct omap2_hsmmc_info mmc[] = {
...@@ -154,13 +146,11 @@ static int touchbook_twl_gpio_setup(struct device *dev, ...@@ -154,13 +146,11 @@ static int touchbook_twl_gpio_setup(struct device *dev,
/* REVISIT: need ehci-omap hooks for external VBUS /* REVISIT: need ehci-omap hooks for external VBUS
* power switch and overcurrent detect * power switch and overcurrent detect
*/ */
gpio_request_one(gpio + 1, GPIOF_IN, "EHCI_nOC");
gpio_request(gpio + 1, "EHCI_nOC");
gpio_direction_input(gpio + 1);
/* TWL4030_GPIO_MAX + 0 == ledA, EHCI nEN_USB_PWR (out, active low) */ /* TWL4030_GPIO_MAX + 0 == ledA, EHCI nEN_USB_PWR (out, active low) */
gpio_request(gpio + TWL4030_GPIO_MAX, "nEN_USB_PWR"); gpio_request_one(gpio + TWL4030_GPIO_MAX, GPIOF_OUT_INIT_LOW,
gpio_direction_output(gpio + TWL4030_GPIO_MAX, 0); "nEN_USB_PWR");
/* TWL4030_GPIO_MAX + 1 == ledB, PMU_STAT (out, active low LED) */ /* TWL4030_GPIO_MAX + 1 == ledB, PMU_STAT (out, active low LED) */
gpio_leds[2].gpio = gpio + TWL4030_GPIO_MAX + 1; gpio_leds[2].gpio = gpio + TWL4030_GPIO_MAX + 1;
...@@ -273,15 +263,6 @@ static struct twl4030_platform_data touchbook_twldata = { ...@@ -273,15 +263,6 @@ static struct twl4030_platform_data touchbook_twldata = {
.vpll2 = &touchbook_vpll2, .vpll2 = &touchbook_vpll2,
}; };
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[] = { static struct i2c_board_info __initdata touchBook_i2c_boardinfo[] = {
{ {
I2C_BOARD_INFO("bq27200", 0x55), I2C_BOARD_INFO("bq27200", 0x55),
...@@ -291,8 +272,7 @@ static struct i2c_board_info __initdata touchBook_i2c_boardinfo[] = { ...@@ -291,8 +272,7 @@ static struct i2c_board_info __initdata touchBook_i2c_boardinfo[] = {
static int __init omap3_touchbook_i2c_init(void) static int __init omap3_touchbook_i2c_init(void)
{ {
/* Standard TouchBook bus */ /* Standard TouchBook bus */
omap_register_i2c_bus(1, 2600, touchbook_i2c_boardinfo, omap3_pmic_init("twl4030", &touchbook_twldata);
ARRAY_SIZE(touchbook_i2c_boardinfo));
/* Additional TouchBook bus */ /* Additional TouchBook bus */
omap_register_i2c_bus(3, 100, touchBook_i2c_boardinfo, omap_register_i2c_bus(3, 100, touchBook_i2c_boardinfo,
...@@ -301,19 +281,7 @@ static int __init omap3_touchbook_i2c_init(void) ...@@ -301,19 +281,7 @@ static int __init omap3_touchbook_i2c_init(void)
return 0; return 0;
} }
static void __init omap3_ads7846_init(void) static struct ads7846_platform_data ads7846_pdata = {
{
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);
gpio_set_debounce(OMAP3_TS_GPIO, 310);
}
static struct ads7846_platform_data ads7846_config = {
.x_min = 100, .x_min = 100,
.y_min = 265, .y_min = 265,
.x_max = 3950, .x_max = 3950,
...@@ -327,23 +295,6 @@ static struct ads7846_platform_data ads7846_config = { ...@@ -327,23 +295,6 @@ static struct ads7846_platform_data ads7846_config = {
.keep_vref_on = 1, .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,
.irq = OMAP_GPIO_IRQ(OMAP3_TS_GPIO),
.platform_data = &ads7846_config,
}
};
static struct gpio_led gpio_leds[] = { static struct gpio_led gpio_leds[] = {
{ {
.name = "touchbook::usr0", .name = "touchbook::usr0",
...@@ -434,39 +385,6 @@ static struct platform_device *omap3_touchbook_devices[] __initdata = { ...@@ -434,39 +385,6 @@ static struct platform_device *omap3_touchbook_devices[] __initdata = {
&keys_gpio, &keys_gpio,
}; };
static void __init omap3touchbook_flash_init(void)
{
u8 cs = 0;
u8 nandcs = GPMC_CS_NUM + 1;
/* 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;
printk(KERN_INFO "Registering NAND on CS%d\n", nandcs);
if (gpmc_nand_init(&omap3touchbook_nand_data) < 0)
printk(KERN_ERR "Unable to register NAND device\n");
}
}
static const struct usbhs_omap_board_data usbhs_bdata __initconst = { static const struct usbhs_omap_board_data usbhs_bdata __initconst = {
.port_mode[0] = OMAP_EHCI_PORT_MODE_PHY, .port_mode[0] = OMAP_EHCI_PORT_MODE_PHY,
...@@ -481,15 +399,10 @@ static const struct usbhs_omap_board_data usbhs_bdata __initconst = { ...@@ -481,15 +399,10 @@ static const struct usbhs_omap_board_data usbhs_bdata __initconst = {
static void omap3_touchbook_poweroff(void) static void omap3_touchbook_poweroff(void)
{ {
int r; int pwr_off = TB_KILL_POWER_GPIO;
r = gpio_request(TB_KILL_POWER_GPIO, "DVI reset"); if (gpio_request_one(pwr_off, GPIOF_OUT_INIT_LOW, "DVI reset") < 0)
if (r < 0) {
printk(KERN_ERR "Unable to get kill power GPIO\n"); printk(KERN_ERR "Unable to get kill power GPIO\n");
return;
}
gpio_direction_output(TB_KILL_POWER_GPIO, 0);
} }
static int __init early_touchbook_revision(char *p) static int __init early_touchbook_revision(char *p)
...@@ -501,12 +414,6 @@ static int __init early_touchbook_revision(char *p) ...@@ -501,12 +414,6 @@ static int __init early_touchbook_revision(char *p)
} }
early_param("tbr", early_touchbook_revision); early_param("tbr", early_touchbook_revision);
static struct omap_musb_board_data musb_board_data = {
.interface_type = MUSB_INTERFACE_ULPI,
.mode = MUSB_OTG,
.power = 100,
};
static void __init omap3_touchbook_init(void) static void __init omap3_touchbook_init(void)
{ {
omap3_mux_init(board_mux, OMAP_PACKAGE_CBB); omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);
...@@ -521,17 +428,15 @@ static void __init omap3_touchbook_init(void) ...@@ -521,17 +428,15 @@ static void __init omap3_touchbook_init(void)
omap_serial_init(); omap_serial_init();
omap_mux_init_gpio(170, OMAP_PIN_INPUT); omap_mux_init_gpio(170, OMAP_PIN_INPUT);
gpio_request(176, "DVI_nPD");
/* REVISIT leave DVI powered down until it's needed ... */ /* REVISIT leave DVI powered down until it's needed ... */
gpio_direction_output(176, true); gpio_request_one(176, GPIOF_OUT_INIT_HIGH, "DVI_nPD");
/* Touchscreen and accelerometer */ /* Touchscreen and accelerometer */
spi_register_board_info(omap3_ads7846_spi_board_info, omap_ads7846_init(4, OMAP3_TS_GPIO, 310, &ads7846_pdata);
ARRAY_SIZE(omap3_ads7846_spi_board_info)); usb_musb_init(NULL);
omap3_ads7846_init();
usb_musb_init(&musb_board_data);
usbhs_init(&usbhs_bdata); usbhs_init(&usbhs_bdata);
omap3touchbook_flash_init(); omap_nand_flash_init(NAND_BUSWIDTH_16, omap3touchbook_nand_partitions,
ARRAY_SIZE(omap3touchbook_nand_partitions));
/* Ensure SDRC pins are mux'd for self-refresh */ /* Ensure SDRC pins are mux'd for self-refresh */
omap_mux_init_signal("sdrc_cke0", OMAP_PIN_OUTPUT); omap_mux_init_signal("sdrc_cke0", OMAP_PIN_OUTPUT);
......
...@@ -46,6 +46,7 @@ ...@@ -46,6 +46,7 @@
#include "hsmmc.h" #include "hsmmc.h"
#include "control.h" #include "control.h"
#include "mux.h" #include "mux.h"
#include "common-board-devices.h"
#define GPIO_HUB_POWER 1 #define GPIO_HUB_POWER 1
#define GPIO_HUB_NRESET 62 #define GPIO_HUB_NRESET 62
...@@ -111,6 +112,11 @@ static const struct usbhs_omap_board_data usbhs_bdata __initconst = { ...@@ -111,6 +112,11 @@ static const struct usbhs_omap_board_data usbhs_bdata __initconst = {
.reset_gpio_port[2] = -EINVAL .reset_gpio_port[2] = -EINVAL
}; };
static struct gpio panda_ehci_gpios[] __initdata = {
{ GPIO_HUB_POWER, GPIOF_OUT_INIT_LOW, "hub_power" },
{ GPIO_HUB_NRESET, GPIOF_OUT_INIT_LOW, "hub_nreset" },
};
static void __init omap4_ehci_init(void) static void __init omap4_ehci_init(void)
{ {
int ret; int ret;
...@@ -120,44 +126,27 @@ static void __init omap4_ehci_init(void) ...@@ -120,44 +126,27 @@ static void __init omap4_ehci_init(void)
phy_ref_clk = clk_get(NULL, "auxclk3_ck"); phy_ref_clk = clk_get(NULL, "auxclk3_ck");
if (IS_ERR(phy_ref_clk)) { if (IS_ERR(phy_ref_clk)) {
pr_err("Cannot request auxclk3\n"); pr_err("Cannot request auxclk3\n");
goto error1; return;
} }
clk_set_rate(phy_ref_clk, 19200000); clk_set_rate(phy_ref_clk, 19200000);
clk_enable(phy_ref_clk); clk_enable(phy_ref_clk);
/* disable the power to the usb hub prior to init */ /* disable the power to the usb hub prior to init and reset phy+hub */
ret = gpio_request(GPIO_HUB_POWER, "hub_power"); ret = gpio_request_array(panda_ehci_gpios,
ARRAY_SIZE(panda_ehci_gpios));
if (ret) { if (ret) {
pr_err("Cannot request GPIO %d\n", GPIO_HUB_POWER); pr_err("Unable to initialize EHCI power/reset\n");
goto error1; return;
} }
gpio_export(GPIO_HUB_POWER, 0);
gpio_direction_output(GPIO_HUB_POWER, 0);
gpio_set_value(GPIO_HUB_POWER, 0);
/* reset phy+hub */ gpio_export(GPIO_HUB_POWER, 0);
ret = gpio_request(GPIO_HUB_NRESET, "hub_nreset");
if (ret) {
pr_err("Cannot request GPIO %d\n", GPIO_HUB_NRESET);
goto error2;
}
gpio_export(GPIO_HUB_NRESET, 0); gpio_export(GPIO_HUB_NRESET, 0);
gpio_direction_output(GPIO_HUB_NRESET, 0);
gpio_set_value(GPIO_HUB_NRESET, 0);
gpio_set_value(GPIO_HUB_NRESET, 1); gpio_set_value(GPIO_HUB_NRESET, 1);
usbhs_init(&usbhs_bdata); usbhs_init(&usbhs_bdata);
/* enable power to hub */ /* enable power to hub */
gpio_set_value(GPIO_HUB_POWER, 1); gpio_set_value(GPIO_HUB_POWER, 1);
return;
error2:
gpio_free(GPIO_HUB_POWER);
error1:
pr_err("Unable to initialize EHCI power/reset\n");
return;
} }
static struct omap_musb_board_data musb_board_data = { static struct omap_musb_board_data musb_board_data = {
...@@ -408,15 +397,6 @@ static struct twl4030_platform_data omap4_panda_twldata = { ...@@ -408,15 +397,6 @@ static struct twl4030_platform_data omap4_panda_twldata = {
.usb = &omap4_usbphy_data, .usb = &omap4_usbphy_data,
}; };
static struct i2c_board_info __initdata omap4_panda_i2c_boardinfo[] = {
{
I2C_BOARD_INFO("twl6030", 0x48),
.flags = I2C_CLIENT_WAKE,
.irq = OMAP44XX_IRQ_SYS_1N,
.platform_data = &omap4_panda_twldata,
},
};
/* /*
* Display monitor features are burnt in their EEPROM as EDID data. The EEPROM * Display monitor features are burnt in their EEPROM as EDID data. The EEPROM
* is connected as I2C slave device, and can be accessed at address 0x50 * is connected as I2C slave device, and can be accessed at address 0x50
...@@ -429,12 +409,7 @@ static struct i2c_board_info __initdata panda_i2c_eeprom[] = { ...@@ -429,12 +409,7 @@ static struct i2c_board_info __initdata panda_i2c_eeprom[] = {
static int __init omap4_panda_i2c_init(void) static int __init omap4_panda_i2c_init(void)
{ {
/* omap4_pmic_init("twl6030", &omap4_panda_twldata);
* Phoenix Audio IC needs I2C1 to
* start with 400 KHz or less
*/
omap_register_i2c_bus(1, 400, omap4_panda_i2c_boardinfo,
ARRAY_SIZE(omap4_panda_i2c_boardinfo));
omap_register_i2c_bus(2, 400, NULL, 0); omap_register_i2c_bus(2, 400, NULL, 0);
/* /*
* Bus 3 is attached to the DVI port where devices like the pico DLP * Bus 3 is attached to the DVI port where devices like the pico DLP
...@@ -651,27 +626,19 @@ static void omap4_panda_hdmi_mux_init(void) ...@@ -651,27 +626,19 @@ static void omap4_panda_hdmi_mux_init(void)
OMAP_PIN_INPUT_PULLUP); OMAP_PIN_INPUT_PULLUP);
} }
static struct gpio panda_hdmi_gpios[] = {
{ HDMI_GPIO_HPD, GPIOF_OUT_INIT_HIGH, "hdmi_gpio_hpd" },
{ HDMI_GPIO_LS_OE, GPIOF_OUT_INIT_HIGH, "hdmi_gpio_ls_oe" },
};
static int omap4_panda_panel_enable_hdmi(struct omap_dss_device *dssdev) static int omap4_panda_panel_enable_hdmi(struct omap_dss_device *dssdev)
{ {
int status; int status;
status = gpio_request_one(HDMI_GPIO_HPD, GPIOF_OUT_INIT_HIGH, status = gpio_request_array(panda_hdmi_gpios,
"hdmi_gpio_hpd"); ARRAY_SIZE(panda_hdmi_gpios));
if (status) { if (status)
pr_err("Cannot request GPIO %d\n", HDMI_GPIO_HPD); pr_err("Cannot request HDMI GPIOs\n");
return status;
}
status = gpio_request_one(HDMI_GPIO_LS_OE, GPIOF_OUT_INIT_HIGH,
"hdmi_gpio_ls_oe");
if (status) {
pr_err("Cannot request GPIO %d\n", HDMI_GPIO_LS_OE);
goto error1;
}
return 0;
error1:
gpio_free(HDMI_GPIO_HPD);
return status; return status;
} }
......
...@@ -56,6 +56,7 @@ ...@@ -56,6 +56,7 @@
#include "mux.h" #include "mux.h"
#include "sdram-micron-mt46h32m32lf-6.h" #include "sdram-micron-mt46h32m32lf-6.h"
#include "hsmmc.h" #include "hsmmc.h"
#include "common-board-devices.h"
#define OVERO_GPIO_BT_XGATE 15 #define OVERO_GPIO_BT_XGATE 15
#define OVERO_GPIO_W2W_NRESET 16 #define OVERO_GPIO_W2W_NRESET 16
...@@ -74,30 +75,6 @@ ...@@ -74,30 +75,6 @@
#if defined(CONFIG_TOUCHSCREEN_ADS7846) || \ #if defined(CONFIG_TOUCHSCREEN_ADS7846) || \
defined(CONFIG_TOUCHSCREEN_ADS7846_MODULE) defined(CONFIG_TOUCHSCREEN_ADS7846_MODULE)
#include <linux/spi/ads7846.h>
static struct omap2_mcspi_device_config ads7846_mcspi_config = {
.turbo_mode = 0,
.single_channel = 1, /* 0: slave, 1: master */
};
static int ads7846_get_pendown_state(void)
{
return !gpio_get_value(OVERO_GPIO_PENDOWN);
}
static 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,
};
/* fixed regulator for ads7846 */ /* fixed regulator for ads7846 */
static struct regulator_consumer_supply ads7846_supply = static struct regulator_consumer_supply ads7846_supply =
REGULATOR_SUPPLY("vcc", "spi1.0"); REGULATOR_SUPPLY("vcc", "spi1.0");
...@@ -128,14 +105,7 @@ static struct platform_device vads7846_device = { ...@@ -128,14 +105,7 @@ static struct platform_device vads7846_device = {
static void __init overo_ads7846_init(void) static void __init overo_ads7846_init(void)
{ {
if ((gpio_request(OVERO_GPIO_PENDOWN, "ADS7846_PENDOWN") == 0) && omap_ads7846_init(1, OVERO_GPIO_PENDOWN, 0, NULL);
(gpio_direction_input(OVERO_GPIO_PENDOWN) == 0)) {
gpio_export(OVERO_GPIO_PENDOWN, 0);
} else {
printk(KERN_ERR "could not obtain gpio for ADS7846_PENDOWN\n");
return;
}
platform_device_register(&vads7846_device); platform_device_register(&vads7846_device);
} }
...@@ -146,106 +116,28 @@ static inline void __init overo_ads7846_init(void) { return; } ...@@ -146,106 +116,28 @@ static inline void __init overo_ads7846_init(void) { return; }
#if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE) #if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE)
#include <linux/smsc911x.h> #include <linux/smsc911x.h>
#include <plat/gpmc-smsc911x.h>
static struct resource overo_smsc911x_resources[] = { static struct omap_smsc911x_platform_data smsc911x_cfg = {
{
.name = "smsc911x-memory",
.flags = IORESOURCE_MEM,
},
{
.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_LOWLEVEL,
},
};
static struct resource overo_smsc911x2_resources[] = {
{
.name = "smsc911x2-memory",
.flags = IORESOURCE_MEM,
},
{
.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_LOWLEVEL,
},
};
static struct smsc911x_platform_config overo_smsc911x_config = {
.irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_LOW,
.irq_type = SMSC911X_IRQ_TYPE_OPEN_DRAIN,
.flags = SMSC911X_USE_32BIT ,
.phy_interface = PHY_INTERFACE_MODE_MII,
};
static struct platform_device overo_smsc911x_device = {
.name = "smsc911x",
.id = 0, .id = 0,
.num_resources = ARRAY_SIZE(overo_smsc911x_resources), .cs = OVERO_SMSC911X_CS,
.resource = overo_smsc911x_resources, .gpio_irq = OVERO_SMSC911X_GPIO,
.dev = { .gpio_reset = -EINVAL,
.platform_data = &overo_smsc911x_config, .flags = SMSC911X_USE_32BIT,
},
}; };
static struct platform_device overo_smsc911x2_device = { static struct omap_smsc911x_platform_data smsc911x2_cfg = {
.name = "smsc911x",
.id = 1, .id = 1,
.num_resources = ARRAY_SIZE(overo_smsc911x2_resources), .cs = OVERO_SMSC911X2_CS,
.resource = overo_smsc911x2_resources, .gpio_irq = OVERO_SMSC911X2_GPIO,
.dev = { .gpio_reset = -EINVAL,
.platform_data = &overo_smsc911x_config, .flags = SMSC911X_USE_32BIT,
},
}; };
static struct platform_device *smsc911x_devices[] = { static void __init overo_init_smsc911x(void)
&overo_smsc911x_device,
&overo_smsc911x2_device,
};
static inline void __init overo_init_smsc911x(void)
{ {
unsigned long cs_mem_base, cs_mem_base2; gpmc_smsc911x_init(&smsc911x_cfg);
gpmc_smsc911x_init(&smsc911x2_cfg);
/* set up first smsc911x chip */
if (gpmc_cs_request(OVERO_SMSC911X_CS, SZ_16M, &cs_mem_base) < 0) {
printk(KERN_ERR "Failed request for GPMC mem for smsc911x\n");
return;
}
overo_smsc911x_resources[0].start = cs_mem_base + 0x0;
overo_smsc911x_resources[0].end = cs_mem_base + 0xff;
if ((gpio_request(OVERO_SMSC911X_GPIO, "SMSC911X IRQ") == 0) &&
(gpio_direction_input(OVERO_SMSC911X_GPIO) == 0)) {
gpio_export(OVERO_SMSC911X_GPIO, 0);
} else {
printk(KERN_ERR "could not obtain gpio for SMSC911X IRQ\n");
return;
}
overo_smsc911x_resources[1].start = OMAP_GPIO_IRQ(OVERO_SMSC911X_GPIO);
overo_smsc911x_resources[1].end = 0;
/* set up second smsc911x chip */
if (gpmc_cs_request(OVERO_SMSC911X2_CS, SZ_16M, &cs_mem_base2) < 0) {
printk(KERN_ERR "Failed request for GPMC mem for smsc911x2\n");
return;
}
overo_smsc911x2_resources[0].start = cs_mem_base2 + 0x0;
overo_smsc911x2_resources[0].end = cs_mem_base2 + 0xff;
if ((gpio_request(OVERO_SMSC911X2_GPIO, "SMSC911X2 IRQ") == 0) &&
(gpio_direction_input(OVERO_SMSC911X2_GPIO) == 0)) {
gpio_export(OVERO_SMSC911X2_GPIO, 0);
} else {
printk(KERN_ERR "could not obtain gpio for SMSC911X2 IRQ\n");
return;
}
overo_smsc911x2_resources[1].start = OMAP_GPIO_IRQ(OVERO_SMSC911X2_GPIO);
overo_smsc911x2_resources[1].end = 0;
platform_add_devices(smsc911x_devices, ARRAY_SIZE(smsc911x_devices));
} }
#else #else
...@@ -259,21 +151,20 @@ static int dvi_enabled; ...@@ -259,21 +151,20 @@ static int dvi_enabled;
#define OVERO_GPIO_LCD_EN 144 #define OVERO_GPIO_LCD_EN 144
#define OVERO_GPIO_LCD_BL 145 #define OVERO_GPIO_LCD_BL 145
static struct gpio overo_dss_gpios[] __initdata = {
{ OVERO_GPIO_LCD_EN, GPIOF_OUT_INIT_HIGH, "OVERO_GPIO_LCD_EN" },
{ OVERO_GPIO_LCD_BL, GPIOF_OUT_INIT_HIGH, "OVERO_GPIO_LCD_BL" },
};
static void __init overo_display_init(void) static void __init overo_display_init(void)
{ {
if ((gpio_request(OVERO_GPIO_LCD_EN, "OVERO_GPIO_LCD_EN") == 0) && if (gpio_request_array(overo_dss_gpios, ARRAY_SIZE(overo_dss_gpios))) {
(gpio_direction_output(OVERO_GPIO_LCD_EN, 1) == 0)) printk(KERN_ERR "could not obtain DSS control GPIOs\n");
gpio_export(OVERO_GPIO_LCD_EN, 0); return;
else }
printk(KERN_ERR "could not obtain gpio for "
"OVERO_GPIO_LCD_EN\n");
if ((gpio_request(OVERO_GPIO_LCD_BL, "OVERO_GPIO_LCD_BL") == 0) && gpio_export(OVERO_GPIO_LCD_EN, 0);
(gpio_direction_output(OVERO_GPIO_LCD_BL, 1) == 0)) gpio_export(OVERO_GPIO_LCD_BL, 0);
gpio_export(OVERO_GPIO_LCD_BL, 0);
else
printk(KERN_ERR "could not obtain gpio for "
"OVERO_GPIO_LCD_BL\n");
} }
static int overo_panel_enable_dvi(struct omap_dss_device *dssdev) static int overo_panel_enable_dvi(struct omap_dss_device *dssdev)
...@@ -412,45 +303,6 @@ static struct mtd_partition overo_nand_partitions[] = { ...@@ -412,45 +303,6 @@ static struct mtd_partition overo_nand_partitions[] = {
}, },
}; };
static struct omap_nand_platform_data overo_nand_data = {
.parts = overo_nand_partitions,
.nr_parts = ARRAY_SIZE(overo_nand_partitions),
.dma_channel = -1, /* disable DMA in OMAP NAND driver */
};
static void __init overo_flash_init(void)
{
u8 cs = 0;
u8 nandcs = GPMC_CS_NUM + 1;
/* 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) {
overo_nand_data.cs = nandcs;
printk(KERN_INFO "Registering NAND on CS%d\n", nandcs);
if (gpmc_nand_init(&overo_nand_data) < 0)
printk(KERN_ERR "Unable to register NAND device\n");
}
}
static struct omap2_hsmmc_info mmc[] = { static struct omap2_hsmmc_info mmc[] = {
{ {
.mmc = 1, .mmc = 1,
...@@ -648,37 +500,15 @@ static struct twl4030_platform_data overo_twldata = { ...@@ -648,37 +500,15 @@ static struct twl4030_platform_data overo_twldata = {
.vpll2 = &overo_vpll2, .vpll2 = &overo_vpll2,
}; };
static struct i2c_board_info __initdata overo_i2c_boardinfo[] = {
{
I2C_BOARD_INFO("tps65950", 0x48),
.flags = I2C_CLIENT_WAKE,
.irq = INT_34XX_SYS_NIRQ,
.platform_data = &overo_twldata,
},
};
static int __init overo_i2c_init(void) static int __init overo_i2c_init(void)
{ {
omap_register_i2c_bus(1, 2600, overo_i2c_boardinfo, omap3_pmic_init("tps65950", &overo_twldata);
ARRAY_SIZE(overo_i2c_boardinfo));
/* i2c2 pins are used for gpio */ /* i2c2 pins are used for gpio */
omap_register_i2c_bus(3, 400, NULL, 0); omap_register_i2c_bus(3, 400, NULL, 0);
return 0; return 0;
} }
static struct spi_board_info overo_spi_board_info[] __initdata = { static struct spi_board_info overo_spi_board_info[] __initdata = {
#if defined(CONFIG_TOUCHSCREEN_ADS7846) || \
defined(CONFIG_TOUCHSCREEN_ADS7846_MODULE)
{
.modalias = "ads7846",
.bus_num = 1,
.chip_select = 0,
.max_speed_hz = 1500000,
.controller_data = &ads7846_mcspi_config,
.irq = OMAP_GPIO_IRQ(OVERO_GPIO_PENDOWN),
.platform_data = &ads7846_config,
},
#endif
#if defined(CONFIG_PANEL_LGPHILIPS_LB035Q02) || \ #if defined(CONFIG_PANEL_LGPHILIPS_LB035Q02) || \
defined(CONFIG_PANEL_LGPHILIPS_LB035Q02_MODULE) defined(CONFIG_PANEL_LGPHILIPS_LB035Q02_MODULE)
{ {
...@@ -722,20 +552,22 @@ static struct omap_board_mux board_mux[] __initdata = { ...@@ -722,20 +552,22 @@ static struct omap_board_mux board_mux[] __initdata = {
}; };
#endif #endif
static struct omap_musb_board_data musb_board_data = { static struct gpio overo_bt_gpios[] __initdata = {
.interface_type = MUSB_INTERFACE_ULPI, { OVERO_GPIO_BT_XGATE, GPIOF_OUT_INIT_LOW, "lcd enable" },
.mode = MUSB_OTG, { OVERO_GPIO_BT_NRESET, GPIOF_OUT_INIT_HIGH, "lcd bl enable" },
.power = 100,
}; };
static void __init overo_init(void) static void __init overo_init(void)
{ {
int ret;
omap3_mux_init(board_mux, OMAP_PACKAGE_CBB); omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);
overo_i2c_init(); overo_i2c_init();
omap_display_init(&overo_dss_data); omap_display_init(&overo_dss_data);
omap_serial_init(); omap_serial_init();
overo_flash_init(); omap_nand_flash_init(0, overo_nand_partitions,
usb_musb_init(&musb_board_data); ARRAY_SIZE(overo_nand_partitions));
usb_musb_init(NULL);
usbhs_init(&usbhs_bdata); usbhs_init(&usbhs_bdata);
overo_spi_init(); overo_spi_init();
overo_ads7846_init(); overo_ads7846_init();
...@@ -748,9 +580,9 @@ static void __init overo_init(void) ...@@ -748,9 +580,9 @@ static void __init overo_init(void)
omap_mux_init_signal("sdrc_cke0", OMAP_PIN_OUTPUT); omap_mux_init_signal("sdrc_cke0", OMAP_PIN_OUTPUT);
omap_mux_init_signal("sdrc_cke1", OMAP_PIN_OUTPUT); omap_mux_init_signal("sdrc_cke1", OMAP_PIN_OUTPUT);
if ((gpio_request(OVERO_GPIO_W2W_NRESET, ret = gpio_request_one(OVERO_GPIO_W2W_NRESET, GPIOF_OUT_INIT_HIGH,
"OVERO_GPIO_W2W_NRESET") == 0) && "OVERO_GPIO_W2W_NRESET");
(gpio_direction_output(OVERO_GPIO_W2W_NRESET, 1) == 0)) { if (ret == 0) {
gpio_export(OVERO_GPIO_W2W_NRESET, 0); gpio_export(OVERO_GPIO_W2W_NRESET, 0);
gpio_set_value(OVERO_GPIO_W2W_NRESET, 0); gpio_set_value(OVERO_GPIO_W2W_NRESET, 0);
udelay(10); udelay(10);
...@@ -760,25 +592,20 @@ static void __init overo_init(void) ...@@ -760,25 +592,20 @@ static void __init overo_init(void)
"OVERO_GPIO_W2W_NRESET\n"); "OVERO_GPIO_W2W_NRESET\n");
} }
if ((gpio_request(OVERO_GPIO_BT_XGATE, "OVERO_GPIO_BT_XGATE") == 0) && ret = gpio_request_array(overo_bt_gpios, ARRAY_SIZE(overo_bt_gpios));
(gpio_direction_output(OVERO_GPIO_BT_XGATE, 0) == 0)) if (ret) {
pr_err("%s: could not obtain BT gpios\n", __func__);
} else {
gpio_export(OVERO_GPIO_BT_XGATE, 0); gpio_export(OVERO_GPIO_BT_XGATE, 0);
else
printk(KERN_ERR "could not obtain gpio for OVERO_GPIO_BT_XGATE\n");
if ((gpio_request(OVERO_GPIO_BT_NRESET, "OVERO_GPIO_BT_NRESET") == 0) &&
(gpio_direction_output(OVERO_GPIO_BT_NRESET, 1) == 0)) {
gpio_export(OVERO_GPIO_BT_NRESET, 0); gpio_export(OVERO_GPIO_BT_NRESET, 0);
gpio_set_value(OVERO_GPIO_BT_NRESET, 0); gpio_set_value(OVERO_GPIO_BT_NRESET, 0);
mdelay(6); mdelay(6);
gpio_set_value(OVERO_GPIO_BT_NRESET, 1); gpio_set_value(OVERO_GPIO_BT_NRESET, 1);
} else {
printk(KERN_ERR "could not obtain gpio for "
"OVERO_GPIO_BT_NRESET\n");
} }
if ((gpio_request(OVERO_GPIO_USBH_CPEN, "OVERO_GPIO_USBH_CPEN") == 0) && ret = gpio_request_one(OVERO_GPIO_USBH_CPEN, GPIOF_OUT_INIT_HIGH,
(gpio_direction_output(OVERO_GPIO_USBH_CPEN, 1) == 0)) "OVERO_GPIO_USBH_CPEN");
if (ret == 0)
gpio_export(OVERO_GPIO_USBH_CPEN, 0); gpio_export(OVERO_GPIO_USBH_CPEN, 0);
else else
printk(KERN_ERR "could not obtain gpio for " printk(KERN_ERR "could not obtain gpio for "
......
...@@ -31,6 +31,7 @@ ...@@ -31,6 +31,7 @@
#include "mux.h" #include "mux.h"
#include "hsmmc.h" #include "hsmmc.h"
#include "sdram-nokia.h" #include "sdram-nokia.h"
#include "common-board-devices.h"
static struct regulator_consumer_supply rm680_vemmc_consumers[] = { static struct regulator_consumer_supply rm680_vemmc_consumers[] = {
REGULATOR_SUPPLY("vmmc", "omap_hsmmc.1"), REGULATOR_SUPPLY("vmmc", "omap_hsmmc.1"),
...@@ -90,19 +91,9 @@ static struct twl4030_platform_data rm680_twl_data = { ...@@ -90,19 +91,9 @@ static struct twl4030_platform_data rm680_twl_data = {
/* add rest of the children here */ /* add rest of the children here */
}; };
static struct i2c_board_info __initdata rm680_twl_i2c_board_info[] = {
{
I2C_BOARD_INFO("twl5031", 0x48),
.flags = I2C_CLIENT_WAKE,
.irq = INT_34XX_SYS_NIRQ,
.platform_data = &rm680_twl_data,
},
};
static void __init rm680_i2c_init(void) static void __init rm680_i2c_init(void)
{ {
omap_register_i2c_bus(1, 2900, rm680_twl_i2c_board_info, omap_pmic_init(1, 2900, "twl5031", INT_34XX_SYS_NIRQ, &rm680_twl_data);
ARRAY_SIZE(rm680_twl_i2c_board_info));
omap_register_i2c_bus(2, 400, NULL, 0); omap_register_i2c_bus(2, 400, NULL, 0);
omap_register_i2c_bus(3, 400, NULL, 0); omap_register_i2c_bus(3, 400, NULL, 0);
} }
...@@ -153,17 +144,11 @@ static struct omap_board_mux board_mux[] __initdata = { ...@@ -153,17 +144,11 @@ static struct omap_board_mux board_mux[] __initdata = {
}; };
#endif #endif
static struct omap_musb_board_data rm680_musb_data = {
.interface_type = MUSB_INTERFACE_ULPI,
.mode = MUSB_PERIPHERAL,
.power = 100,
};
static void __init rm680_init(void) static void __init rm680_init(void)
{ {
omap3_mux_init(board_mux, OMAP_PACKAGE_CBB); omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);
omap_serial_init(); omap_serial_init();
usb_musb_init(&rm680_musb_data); usb_musb_init(NULL);
rm680_peripherals_init(); rm680_peripherals_init();
} }
......
...@@ -43,6 +43,7 @@ ...@@ -43,6 +43,7 @@
#include "mux.h" #include "mux.h"
#include "hsmmc.h" #include "hsmmc.h"
#include "common-board-devices.h"
#define SYSTEM_REV_B_USES_VAUX3 0x1699 #define SYSTEM_REV_B_USES_VAUX3 0x1699
#define SYSTEM_REV_S_USES_VAUX3 0x8 #define SYSTEM_REV_S_USES_VAUX3 0x8
...@@ -557,10 +558,8 @@ static __init void rx51_init_si4713(void) ...@@ -557,10 +558,8 @@ static __init void rx51_init_si4713(void)
static int rx51_twlgpio_setup(struct device *dev, unsigned gpio, unsigned n) static int rx51_twlgpio_setup(struct device *dev, unsigned gpio, unsigned n)
{ {
/* FIXME this gpio setup is just a placeholder for now */ /* FIXME this gpio setup is just a placeholder for now */
gpio_request(gpio + 6, "backlight_pwm"); gpio_request_one(gpio + 6, GPIOF_OUT_INIT_LOW, "backlight_pwm");
gpio_direction_output(gpio + 6, 0); gpio_request_one(gpio + 7, GPIOF_OUT_INIT_HIGH, "speaker_en");
gpio_request(gpio + 7, "speaker_en");
gpio_direction_output(gpio + 7, 1);
return 0; return 0;
} }
...@@ -777,15 +776,6 @@ static struct tpa6130a2_platform_data rx51_tpa6130a2_data __initdata_or_module = ...@@ -777,15 +776,6 @@ static struct tpa6130a2_platform_data rx51_tpa6130a2_data __initdata_or_module =
.power_gpio = 98, .power_gpio = 98,
}; };
static struct i2c_board_info __initdata rx51_peripherals_i2c_board_info_1[] = {
{
I2C_BOARD_INFO("twl5030", 0x48),
.flags = I2C_CLIENT_WAKE,
.irq = INT_34XX_SYS_NIRQ,
.platform_data = &rx51_twldata,
},
};
/* Audio setup data */ /* Audio setup data */
static struct aic3x_setup_data rx51_aic34_setup = { static struct aic3x_setup_data rx51_aic34_setup = {
.gpio_func[0] = AIC3X_GPIO1_FUNC_DISABLED, .gpio_func[0] = AIC3X_GPIO1_FUNC_DISABLED,
...@@ -833,8 +823,7 @@ static int __init rx51_i2c_init(void) ...@@ -833,8 +823,7 @@ static int __init rx51_i2c_init(void)
rx51_twldata.vaux3 = &rx51_vaux3_cam; rx51_twldata.vaux3 = &rx51_vaux3_cam;
} }
rx51_twldata.vmmc2 = &rx51_vmmc2; rx51_twldata.vmmc2 = &rx51_vmmc2;
omap_register_i2c_bus(1, 2200, rx51_peripherals_i2c_board_info_1, omap_pmic_init(1, 2200, "twl5030", INT_34XX_SYS_NIRQ, &rx51_twldata);
ARRAY_SIZE(rx51_peripherals_i2c_board_info_1));
omap_register_i2c_bus(2, 100, rx51_peripherals_i2c_board_info_2, omap_register_i2c_bus(2, 100, rx51_peripherals_i2c_board_info_2,
ARRAY_SIZE(rx51_peripherals_i2c_board_info_2)); ARRAY_SIZE(rx51_peripherals_i2c_board_info_2));
omap_register_i2c_bus(3, 400, NULL, 0); omap_register_i2c_bus(3, 400, NULL, 0);
...@@ -921,26 +910,20 @@ static void rx51_wl1251_set_power(bool enable) ...@@ -921,26 +910,20 @@ static void rx51_wl1251_set_power(bool enable)
gpio_set_value(RX51_WL1251_POWER_GPIO, enable); gpio_set_value(RX51_WL1251_POWER_GPIO, enable);
} }
static struct gpio rx51_wl1251_gpios[] __initdata = {
{ RX51_WL1251_POWER_GPIO, GPIOF_OUT_INIT_LOW, "wl1251 power" },
{ RX51_WL1251_IRQ_GPIO, GPIOF_IN, "wl1251 irq" },
};
static void __init rx51_init_wl1251(void) static void __init rx51_init_wl1251(void)
{ {
int irq, ret; int irq, ret;
ret = gpio_request(RX51_WL1251_POWER_GPIO, "wl1251 power"); ret = gpio_request_array(rx51_wl1251_gpios,
ARRAY_SIZE(rx51_wl1251_gpios));
if (ret < 0) if (ret < 0)
goto error; goto error;
ret = gpio_direction_output(RX51_WL1251_POWER_GPIO, 0);
if (ret < 0)
goto err_power;
ret = gpio_request(RX51_WL1251_IRQ_GPIO, "wl1251 irq");
if (ret < 0)
goto err_power;
ret = gpio_direction_input(RX51_WL1251_IRQ_GPIO);
if (ret < 0)
goto err_irq;
irq = gpio_to_irq(RX51_WL1251_IRQ_GPIO); irq = gpio_to_irq(RX51_WL1251_IRQ_GPIO);
if (irq < 0) if (irq < 0)
goto err_irq; goto err_irq;
...@@ -952,10 +935,7 @@ static void __init rx51_init_wl1251(void) ...@@ -952,10 +935,7 @@ static void __init rx51_init_wl1251(void)
err_irq: err_irq:
gpio_free(RX51_WL1251_IRQ_GPIO); gpio_free(RX51_WL1251_IRQ_GPIO);
err_power:
gpio_free(RX51_WL1251_POWER_GPIO); gpio_free(RX51_WL1251_POWER_GPIO);
error: error:
printk(KERN_ERR "wl1251 board initialisation failed\n"); printk(KERN_ERR "wl1251 board initialisation failed\n");
wl1251_pdata.set_power = NULL; wl1251_pdata.set_power = NULL;
......
...@@ -76,13 +76,12 @@ static int __init rx51_video_init(void) ...@@ -76,13 +76,12 @@ static int __init rx51_video_init(void)
return 0; return 0;
} }
if (gpio_request(RX51_LCD_RESET_GPIO, "LCD ACX565AKM reset")) { if (gpio_request_one(RX51_LCD_RESET_GPIO, GPIOF_OUT_INIT_HIGH,
"LCD ACX565AKM reset")) {
pr_err("%s failed to get LCD Reset GPIO\n", __func__); pr_err("%s failed to get LCD Reset GPIO\n", __func__);
return 0; return 0;
} }
gpio_direction_output(RX51_LCD_RESET_GPIO, 1);
omap_display_init(&rx51_dss_board_info); omap_display_init(&rx51_dss_board_info);
return 0; return 0;
} }
......
...@@ -58,21 +58,25 @@ static struct platform_device leds_gpio = { ...@@ -58,21 +58,25 @@ static struct platform_device leds_gpio = {
}, },
}; };
/*
* cpuidle C-states definition override from the default values.
* The 'exit_latency' field is the sum of sleep and wake-up latencies.
*/
static struct cpuidle_params rx51_cpuidle_params[] = { static struct cpuidle_params rx51_cpuidle_params[] = {
/* C1 */ /* C1 */
{1, 110, 162, 5}, {110 + 162, 5 , 1},
/* C2 */ /* C2 */
{1, 106, 180, 309}, {106 + 180, 309, 1},
/* C3 */ /* C3 */
{0, 107, 410, 46057}, {107 + 410, 46057, 0},
/* C4 */ /* C4 */
{0, 121, 3374, 46057}, {121 + 3374, 46057, 0},
/* C5 */ /* C5 */
{1, 855, 1146, 46057}, {855 + 1146, 46057, 1},
/* C6 */ /* C6 */
{0, 7580, 4134, 484329}, {7580 + 4134, 484329, 0},
/* C7 */ /* C7 */
{1, 7505, 15274, 484329}, {7505 + 15274, 484329, 1},
}; };
static struct omap_lcd_config rx51_lcd_config = { static struct omap_lcd_config rx51_lcd_config = {
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <plat/gpmc.h> #include <plat/gpmc.h>
#include <plat/gpmc-smsc911x.h>
#include <mach/board-zoom.h> #include <mach/board-zoom.h>
...@@ -26,60 +27,16 @@ ...@@ -26,60 +27,16 @@
#define DEBUG_BASE 0x08000000 #define DEBUG_BASE 0x08000000
#define ZOOM_ETHR_START DEBUG_BASE #define ZOOM_ETHR_START DEBUG_BASE
static struct resource zoom_smsc911x_resources[] = { static struct omap_smsc911x_platform_data zoom_smsc911x_cfg = {
[0] = { .cs = ZOOM_SMSC911X_CS,
.start = ZOOM_ETHR_START, .gpio_irq = ZOOM_SMSC911X_GPIO,
.end = ZOOM_ETHR_START + SZ_4K, .gpio_reset = -EINVAL,
.flags = IORESOURCE_MEM,
},
[1] = {
.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_LOWLEVEL,
},
};
static struct smsc911x_platform_config zoom_smsc911x_config = {
.irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_LOW,
.irq_type = SMSC911X_IRQ_TYPE_OPEN_DRAIN,
.flags = SMSC911X_USE_32BIT, .flags = SMSC911X_USE_32BIT,
.phy_interface = PHY_INTERFACE_MODE_MII,
};
static struct platform_device zoom_smsc911x_device = {
.name = "smsc911x",
.id = -1,
.num_resources = ARRAY_SIZE(zoom_smsc911x_resources),
.resource = zoom_smsc911x_resources,
.dev = {
.platform_data = &zoom_smsc911x_config,
},
}; };
static inline void __init zoom_init_smsc911x(void) static inline void __init zoom_init_smsc911x(void)
{ {
int eth_cs; gpmc_smsc911x_init(&zoom_smsc911x_cfg);
unsigned long cs_mem_base;
int eth_gpio = 0;
eth_cs = ZOOM_SMSC911X_CS;
if (gpmc_cs_request(eth_cs, SZ_16M, &cs_mem_base) < 0) {
printk(KERN_ERR "Failed to request GPMC mem for smsc911x\n");
return;
}
zoom_smsc911x_resources[0].start = cs_mem_base + 0x0;
zoom_smsc911x_resources[0].end = cs_mem_base + 0xff;
eth_gpio = ZOOM_SMSC911X_GPIO;
zoom_smsc911x_resources[1].start = OMAP_GPIO_IRQ(eth_gpio);
if (gpio_request(eth_gpio, "smsc911x irq") < 0) {
printk(KERN_ERR "Failed to request GPIO%d for smsc911x IRQ\n",
eth_gpio);
return;
}
gpio_direction_input(eth_gpio);
} }
static struct plat_serial8250_port serial_platform_data[] = { static struct plat_serial8250_port serial_platform_data[] = {
...@@ -120,12 +77,9 @@ static inline void __init zoom_init_quaduart(void) ...@@ -120,12 +77,9 @@ static inline void __init zoom_init_quaduart(void)
quart_gpio = ZOOM_QUADUART_GPIO; quart_gpio = ZOOM_QUADUART_GPIO;
if (gpio_request(quart_gpio, "TL16CP754C GPIO") < 0) { if (gpio_request_one(quart_gpio, GPIOF_IN, "TL16CP754C GPIO") < 0)
printk(KERN_ERR "Failed to request GPIO%d for TL16CP754C\n", printk(KERN_ERR "Failed to request GPIO%d for TL16CP754C\n",
quart_gpio); quart_gpio);
return;
}
gpio_direction_input(quart_gpio);
} }
static inline int omap_zoom_debugboard_detect(void) static inline int omap_zoom_debugboard_detect(void)
...@@ -135,12 +89,12 @@ static inline int omap_zoom_debugboard_detect(void) ...@@ -135,12 +89,12 @@ static inline int omap_zoom_debugboard_detect(void)
debug_board_detect = ZOOM_SMSC911X_GPIO; debug_board_detect = ZOOM_SMSC911X_GPIO;
if (gpio_request(debug_board_detect, "Zoom debug board detect") < 0) { if (gpio_request_one(debug_board_detect, GPIOF_IN,
"Zoom debug board detect") < 0) {
printk(KERN_ERR "Failed to request GPIO%d for Zoom debug" printk(KERN_ERR "Failed to request GPIO%d for Zoom debug"
"board detect\n", debug_board_detect); "board detect\n", debug_board_detect);
return 0; return 0;
} }
gpio_direction_input(debug_board_detect);
if (!gpio_get_value(debug_board_detect)) { if (!gpio_get_value(debug_board_detect)) {
ret = 0; ret = 0;
...@@ -150,7 +104,6 @@ static inline int omap_zoom_debugboard_detect(void) ...@@ -150,7 +104,6 @@ static inline int omap_zoom_debugboard_detect(void)
} }
static struct platform_device *zoom_devices[] __initdata = { static struct platform_device *zoom_devices[] __initdata = {
&zoom_smsc911x_device,
&zoom_debugboard_serial_device, &zoom_debugboard_serial_device,
}; };
......
...@@ -21,34 +21,19 @@ ...@@ -21,34 +21,19 @@
#define LCD_PANEL_RESET_GPIO_PILOT 55 #define LCD_PANEL_RESET_GPIO_PILOT 55
#define LCD_PANEL_QVGA_GPIO 56 #define LCD_PANEL_QVGA_GPIO 56
static struct gpio zoom_lcd_gpios[] __initdata = {
{ -EINVAL, GPIOF_OUT_INIT_HIGH, "lcd reset" },
{ LCD_PANEL_QVGA_GPIO, GPIOF_OUT_INIT_HIGH, "lcd qvga" },
};
static void zoom_lcd_panel_init(void) static void zoom_lcd_panel_init(void)
{ {
int ret; zoom_lcd_gpios[0].gpio = (omap_rev() > OMAP3430_REV_ES3_0) ?
unsigned char lcd_panel_reset_gpio;
lcd_panel_reset_gpio = (omap_rev() > OMAP3430_REV_ES3_0) ?
LCD_PANEL_RESET_GPIO_PROD : LCD_PANEL_RESET_GPIO_PROD :
LCD_PANEL_RESET_GPIO_PILOT; LCD_PANEL_RESET_GPIO_PILOT;
ret = gpio_request(lcd_panel_reset_gpio, "lcd reset"); if (gpio_request_array(zoom_lcd_gpios, ARRAY_SIZE(zoom_lcd_gpios)))
if (ret) { pr_err("%s: Failed to get LCD GPIOs.\n", __func__);
pr_err("Failed to get LCD reset GPIO (gpio%d).\n",
lcd_panel_reset_gpio);
return;
}
gpio_direction_output(lcd_panel_reset_gpio, 1);
ret = gpio_request(LCD_PANEL_QVGA_GPIO, "lcd qvga");
if (ret) {
pr_err("Failed to get LCD_PANEL_QVGA_GPIO (gpio%d).\n",
LCD_PANEL_QVGA_GPIO);
goto err0;
}
gpio_direction_output(LCD_PANEL_QVGA_GPIO, 1);
return;
err0:
gpio_free(lcd_panel_reset_gpio);
} }
static int zoom_panel_enable_lcd(struct omap_dss_device *dssdev) static int zoom_panel_enable_lcd(struct omap_dss_device *dssdev)
......
...@@ -31,6 +31,7 @@ ...@@ -31,6 +31,7 @@
#include "mux.h" #include "mux.h"
#include "hsmmc.h" #include "hsmmc.h"
#include "common-board-devices.h"
#define OMAP_ZOOM_WLAN_PMENA_GPIO (101) #define OMAP_ZOOM_WLAN_PMENA_GPIO (101)
#define OMAP_ZOOM_WLAN_IRQ_GPIO (162) #define OMAP_ZOOM_WLAN_IRQ_GPIO (162)
...@@ -276,13 +277,11 @@ static int zoom_twl_gpio_setup(struct device *dev, ...@@ -276,13 +277,11 @@ static int zoom_twl_gpio_setup(struct device *dev,
zoom_vsim_supply.dev = mmc[0].dev; zoom_vsim_supply.dev = mmc[0].dev;
zoom_vmmc2_supply.dev = mmc[1].dev; zoom_vmmc2_supply.dev = mmc[1].dev;
ret = gpio_request(LCD_PANEL_ENABLE_GPIO, "lcd enable"); ret = gpio_request_one(LCD_PANEL_ENABLE_GPIO, GPIOF_OUT_INIT_LOW,
if (ret) { "lcd enable");
if (ret)
pr_err("Failed to get LCD_PANEL_ENABLE_GPIO (gpio%d).\n", pr_err("Failed to get LCD_PANEL_ENABLE_GPIO (gpio%d).\n",
LCD_PANEL_ENABLE_GPIO); LCD_PANEL_ENABLE_GPIO);
return ret;
}
gpio_direction_output(LCD_PANEL_ENABLE_GPIO, 0);
return ret; return ret;
} }
...@@ -349,15 +348,6 @@ static struct twl4030_platform_data zoom_twldata = { ...@@ -349,15 +348,6 @@ static struct twl4030_platform_data zoom_twldata = {
.vdac = &zoom_vdac, .vdac = &zoom_vdac,
}; };
static struct i2c_board_info __initdata zoom_i2c_boardinfo[] = {
{
I2C_BOARD_INFO("twl5030", 0x48),
.flags = I2C_CLIENT_WAKE,
.irq = INT_34XX_SYS_NIRQ,
.platform_data = &zoom_twldata,
},
};
static int __init omap_i2c_init(void) static int __init omap_i2c_init(void)
{ {
if (machine_is_omap_zoom2()) { if (machine_is_omap_zoom2()) {
...@@ -365,19 +355,12 @@ static int __init omap_i2c_init(void) ...@@ -365,19 +355,12 @@ static int __init omap_i2c_init(void)
zoom_audio_data.hs_extmute = 1; zoom_audio_data.hs_extmute = 1;
zoom_audio_data.set_hs_extmute = zoom2_set_hs_extmute; zoom_audio_data.set_hs_extmute = zoom2_set_hs_extmute;
} }
omap_register_i2c_bus(1, 2400, zoom_i2c_boardinfo, omap_pmic_init(1, 2400, "twl5030", INT_34XX_SYS_NIRQ, &zoom_twldata);
ARRAY_SIZE(zoom_i2c_boardinfo));
omap_register_i2c_bus(2, 400, NULL, 0); omap_register_i2c_bus(2, 400, NULL, 0);
omap_register_i2c_bus(3, 400, NULL, 0); omap_register_i2c_bus(3, 400, NULL, 0);
return 0; return 0;
} }
static struct omap_musb_board_data musb_board_data = {
.interface_type = MUSB_INTERFACE_ULPI,
.mode = MUSB_OTG,
.power = 100,
};
static void enable_board_wakeup_source(void) static void enable_board_wakeup_source(void)
{ {
/* T2 interrupt line (keypad) */ /* T2 interrupt line (keypad) */
...@@ -392,7 +375,7 @@ void __init zoom_peripherals_init(void) ...@@ -392,7 +375,7 @@ void __init zoom_peripherals_init(void)
omap_i2c_init(); omap_i2c_init();
platform_device_register(&omap_vwlan_device); platform_device_register(&omap_vwlan_device);
usb_musb_init(&musb_board_data); usb_musb_init(NULL);
enable_board_wakeup_source(); enable_board_wakeup_source();
omap_serial_init(); omap_serial_init();
} }
/*
* common-board-devices.c
*
* Copyright (C) 2011 CompuLab, Ltd.
* Author: Mike Rapoport <mike@compulab.co.il>
*
* 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.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA
*
*/
#include <linux/i2c.h>
#include <linux/i2c/twl.h>
#include <linux/gpio.h>
#include <linux/spi/spi.h>
#include <linux/spi/ads7846.h>
#include <plat/i2c.h>
#include <plat/mcspi.h>
#include <plat/nand.h>
#include "common-board-devices.h"
static struct i2c_board_info __initdata pmic_i2c_board_info = {
.addr = 0x48,
.flags = I2C_CLIENT_WAKE,
};
void __init omap_pmic_init(int bus, u32 clkrate,
const char *pmic_type, int pmic_irq,
struct twl4030_platform_data *pmic_data)
{
strncpy(pmic_i2c_board_info.type, pmic_type,
sizeof(pmic_i2c_board_info.type));
pmic_i2c_board_info.irq = pmic_irq;
pmic_i2c_board_info.platform_data = pmic_data;
omap_register_i2c_bus(bus, clkrate, &pmic_i2c_board_info, 1);
}
#if defined(CONFIG_TOUCHSCREEN_ADS7846) || \
defined(CONFIG_TOUCHSCREEN_ADS7846_MODULE)
static struct omap2_mcspi_device_config ads7846_mcspi_config = {
.turbo_mode = 0,
.single_channel = 1, /* 0: slave, 1: master */
};
static 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,
.gpio_pendown = -EINVAL,
.keep_vref_on = 1,
};
static struct spi_board_info ads7846_spi_board_info __initdata = {
.modalias = "ads7846",
.bus_num = -EINVAL,
.chip_select = 0,
.max_speed_hz = 1500000,
.controller_data = &ads7846_mcspi_config,
.irq = -EINVAL,
.platform_data = &ads7846_config,
};
void __init omap_ads7846_init(int bus_num, int gpio_pendown, int gpio_debounce,
struct ads7846_platform_data *board_pdata)
{
struct spi_board_info *spi_bi = &ads7846_spi_board_info;
int err;
err = gpio_request(gpio_pendown, "TS PenDown");
if (err) {
pr_err("Could not obtain gpio for TS PenDown: %d\n", err);
return;
}
gpio_direction_input(gpio_pendown);
gpio_export(gpio_pendown, 0);
if (gpio_debounce)
gpio_set_debounce(gpio_pendown, gpio_debounce);
ads7846_config.gpio_pendown = gpio_pendown;
spi_bi->bus_num = bus_num;
spi_bi->irq = OMAP_GPIO_IRQ(gpio_pendown);
if (board_pdata)
spi_bi->platform_data = board_pdata;
spi_register_board_info(&ads7846_spi_board_info, 1);
}
#else
void __init omap_ads7846_init(int bus_num, int gpio_pendown, int gpio_debounce,
struct ads7846_platform_data *board_pdata)
{
}
#endif
#if defined(CONFIG_MTD_NAND_OMAP2) || defined(CONFIG_MTD_NAND_OMAP2_MODULE)
static struct omap_nand_platform_data nand_data = {
.dma_channel = -1, /* disable DMA in OMAP NAND driver */
};
void __init omap_nand_flash_init(int options, struct mtd_partition *parts,
int nr_parts)
{
u8 cs = 0;
u8 nandcs = GPMC_CS_NUM + 1;
/* 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) {
nand_data.cs = nandcs;
nand_data.parts = parts;
nand_data.nr_parts = nr_parts;
nand_data.options = options;
printk(KERN_INFO "Registering NAND on CS%d\n", nandcs);
if (gpmc_nand_init(&nand_data) < 0)
printk(KERN_ERR "Unable to register NAND device\n");
}
}
#else
void __init omap_nand_flash_init(int options, struct mtd_partition *parts,
int nr_parts)
{
}
#endif
#ifndef __OMAP_COMMON_BOARD_DEVICES__
#define __OMAP_COMMON_BOARD_DEVICES__
struct twl4030_platform_data;
struct mtd_partition;
void omap_pmic_init(int bus, u32 clkrate, const char *pmic_type, int pmic_irq,
struct twl4030_platform_data *pmic_data);
static inline void omap2_pmic_init(const char *pmic_type,
struct twl4030_platform_data *pmic_data)
{
omap_pmic_init(2, 2600, pmic_type, INT_24XX_SYS_NIRQ, pmic_data);
}
static inline void omap3_pmic_init(const char *pmic_type,
struct twl4030_platform_data *pmic_data)
{
omap_pmic_init(1, 2600, pmic_type, INT_34XX_SYS_NIRQ, pmic_data);
}
static inline void omap4_pmic_init(const char *pmic_type,
struct twl4030_platform_data *pmic_data)
{
/* Phoenix Audio IC needs I2C1 to start with 400 KHz or less */
omap_pmic_init(1, 400, pmic_type, OMAP44XX_IRQ_SYS_1N, pmic_data);
}
struct ads7846_platform_data;
void omap_ads7846_init(int bus_num, int gpio_pendown, int gpio_debounce,
struct ads7846_platform_data *board_pdata);
void omap_nand_flash_init(int opts, struct mtd_partition *parts, int n_parts);
#endif /* __OMAP_COMMON_BOARD_DEVICES__ */
...@@ -36,36 +36,6 @@ ...@@ -36,36 +36,6 @@
#ifdef CONFIG_CPU_IDLE #ifdef CONFIG_CPU_IDLE
#define OMAP3_MAX_STATES 7
#define OMAP3_STATE_C1 0 /* C1 - MPU WFI + Core active */
#define OMAP3_STATE_C2 1 /* C2 - MPU WFI + Core inactive */
#define OMAP3_STATE_C3 2 /* C3 - MPU CSWR + Core inactive */
#define OMAP3_STATE_C4 3 /* C4 - MPU OFF + Core iactive */
#define OMAP3_STATE_C5 4 /* C5 - MPU RET + Core RET */
#define OMAP3_STATE_C6 5 /* C6 - MPU OFF + Core RET */
#define OMAP3_STATE_C7 6 /* C7 - MPU OFF + Core OFF */
#define OMAP3_STATE_MAX OMAP3_STATE_C7
#define CPUIDLE_FLAG_CHECK_BM 0x10000 /* use omap3_enter_idle_bm() */
struct omap3_processor_cx {
u8 valid;
u8 type;
u32 sleep_latency;
u32 wakeup_latency;
u32 mpu_state;
u32 core_state;
u32 threshold;
u32 flags;
const char *desc;
};
struct omap3_processor_cx omap3_power_states[OMAP3_MAX_STATES];
struct omap3_processor_cx current_cx_state;
struct powerdomain *mpu_pd, *core_pd, *per_pd;
struct powerdomain *cam_pd;
/* /*
* The latencies/thresholds for various C states have * The latencies/thresholds for various C states have
* to be configured from the respective board files. * to be configured from the respective board files.
...@@ -75,27 +45,31 @@ struct powerdomain *cam_pd; ...@@ -75,27 +45,31 @@ struct powerdomain *cam_pd;
*/ */
static struct cpuidle_params cpuidle_params_table[] = { static struct cpuidle_params cpuidle_params_table[] = {
/* C1 */ /* C1 */
{1, 2, 2, 5}, {2 + 2, 5, 1},
/* C2 */ /* C2 */
{1, 10, 10, 30}, {10 + 10, 30, 1},
/* C3 */ /* C3 */
{1, 50, 50, 300}, {50 + 50, 300, 1},
/* C4 */ /* C4 */
{1, 1500, 1800, 4000}, {1500 + 1800, 4000, 1},
/* C5 */ /* C5 */
{1, 2500, 7500, 12000}, {2500 + 7500, 12000, 1},
/* C6 */ /* C6 */
{1, 3000, 8500, 15000}, {3000 + 8500, 15000, 1},
/* C7 */ /* C7 */
{1, 10000, 30000, 300000}, {10000 + 30000, 300000, 1},
}; };
#define OMAP3_NUM_STATES ARRAY_SIZE(cpuidle_params_table)
static int omap3_idle_bm_check(void) /* Mach specific information to be recorded in the C-state driver_data */
{ struct omap3_idle_statedata {
if (!omap3_can_sleep()) u32 mpu_state;
return 1; u32 core_state;
return 0; u8 valid;
} };
struct omap3_idle_statedata omap3_idle_data[OMAP3_NUM_STATES];
struct powerdomain *mpu_pd, *core_pd, *per_pd, *cam_pd;
static int _cpuidle_allow_idle(struct powerdomain *pwrdm, static int _cpuidle_allow_idle(struct powerdomain *pwrdm,
struct clockdomain *clkdm) struct clockdomain *clkdm)
...@@ -122,12 +96,10 @@ static int _cpuidle_deny_idle(struct powerdomain *pwrdm, ...@@ -122,12 +96,10 @@ static int _cpuidle_deny_idle(struct powerdomain *pwrdm,
static int omap3_enter_idle(struct cpuidle_device *dev, static int omap3_enter_idle(struct cpuidle_device *dev,
struct cpuidle_state *state) struct cpuidle_state *state)
{ {
struct omap3_processor_cx *cx = cpuidle_get_statedata(state); struct omap3_idle_statedata *cx = cpuidle_get_statedata(state);
struct timespec ts_preidle, ts_postidle, ts_idle; struct timespec ts_preidle, ts_postidle, ts_idle;
u32 mpu_state = cx->mpu_state, core_state = cx->core_state; u32 mpu_state = cx->mpu_state, core_state = cx->core_state;
current_cx_state = *cx;
/* Used to keep track of the total time in idle */ /* Used to keep track of the total time in idle */
getnstimeofday(&ts_preidle); getnstimeofday(&ts_preidle);
...@@ -140,7 +112,8 @@ static int omap3_enter_idle(struct cpuidle_device *dev, ...@@ -140,7 +112,8 @@ static int omap3_enter_idle(struct cpuidle_device *dev,
if (omap_irq_pending() || need_resched()) if (omap_irq_pending() || need_resched())
goto return_sleep_time; goto return_sleep_time;
if (cx->type == OMAP3_STATE_C1) { /* Deny idle for C1 */
if (state == &dev->states[0]) {
pwrdm_for_each_clkdm(mpu_pd, _cpuidle_deny_idle); pwrdm_for_each_clkdm(mpu_pd, _cpuidle_deny_idle);
pwrdm_for_each_clkdm(core_pd, _cpuidle_deny_idle); pwrdm_for_each_clkdm(core_pd, _cpuidle_deny_idle);
} }
...@@ -148,7 +121,8 @@ static int omap3_enter_idle(struct cpuidle_device *dev, ...@@ -148,7 +121,8 @@ static int omap3_enter_idle(struct cpuidle_device *dev,
/* Execute ARM wfi */ /* Execute ARM wfi */
omap_sram_idle(); omap_sram_idle();
if (cx->type == OMAP3_STATE_C1) { /* Re-allow idle for C1 */
if (state == &dev->states[0]) {
pwrdm_for_each_clkdm(mpu_pd, _cpuidle_allow_idle); pwrdm_for_each_clkdm(mpu_pd, _cpuidle_allow_idle);
pwrdm_for_each_clkdm(core_pd, _cpuidle_allow_idle); pwrdm_for_each_clkdm(core_pd, _cpuidle_allow_idle);
} }
...@@ -164,41 +138,53 @@ static int omap3_enter_idle(struct cpuidle_device *dev, ...@@ -164,41 +138,53 @@ static int omap3_enter_idle(struct cpuidle_device *dev,
} }
/** /**
* next_valid_state - Find next valid c-state * next_valid_state - Find next valid C-state
* @dev: cpuidle device * @dev: cpuidle device
* @state: Currently selected c-state * @state: Currently selected C-state
* *
* If the current state is valid, it is returned back to the caller. * If the current state is valid, it is returned back to the caller.
* Else, this function searches for a lower c-state which is still * Else, this function searches for a lower c-state which is still
* valid (as defined in omap3_power_states[]). * valid.
*
* A state is valid if the 'valid' field is enabled and
* if it satisfies the enable_off_mode condition.
*/ */
static struct cpuidle_state *next_valid_state(struct cpuidle_device *dev, static struct cpuidle_state *next_valid_state(struct cpuidle_device *dev,
struct cpuidle_state *curr) struct cpuidle_state *curr)
{ {
struct cpuidle_state *next = NULL; struct cpuidle_state *next = NULL;
struct omap3_processor_cx *cx; struct omap3_idle_statedata *cx = cpuidle_get_statedata(curr);
u32 mpu_deepest_state = PWRDM_POWER_RET;
u32 core_deepest_state = PWRDM_POWER_RET;
cx = (struct omap3_processor_cx *)cpuidle_get_statedata(curr); if (enable_off_mode) {
mpu_deepest_state = PWRDM_POWER_OFF;
/*
* Erratum i583: valable for ES rev < Es1.2 on 3630.
* CORE OFF mode is not supported in a stable form, restrict
* instead the CORE state to RET.
*/
if (!IS_PM34XX_ERRATUM(PM_SDRC_WAKEUP_ERRATUM_i583))
core_deepest_state = PWRDM_POWER_OFF;
}
/* Check if current state is valid */ /* Check if current state is valid */
if (cx->valid) { if ((cx->valid) &&
(cx->mpu_state >= mpu_deepest_state) &&
(cx->core_state >= core_deepest_state)) {
return curr; return curr;
} else { } else {
u8 idx = OMAP3_STATE_MAX; int idx = OMAP3_NUM_STATES - 1;
/* /* Reach the current state starting at highest C-state */
* Reach the current state starting at highest C-state for (; idx >= 0; idx--) {
*/
for (; idx >= OMAP3_STATE_C1; idx--) {
if (&dev->states[idx] == curr) { if (&dev->states[idx] == curr) {
next = &dev->states[idx]; next = &dev->states[idx];
break; break;
} }
} }
/* /* Should never hit this condition */
* Should never hit this condition.
*/
WARN_ON(next == NULL); WARN_ON(next == NULL);
/* /*
...@@ -206,17 +192,17 @@ static struct cpuidle_state *next_valid_state(struct cpuidle_device *dev, ...@@ -206,17 +192,17 @@ static struct cpuidle_state *next_valid_state(struct cpuidle_device *dev,
* Start search from the next (lower) state. * Start search from the next (lower) state.
*/ */
idx--; idx--;
for (; idx >= OMAP3_STATE_C1; idx--) { for (; idx >= 0; idx--) {
struct omap3_processor_cx *cx;
cx = cpuidle_get_statedata(&dev->states[idx]); cx = cpuidle_get_statedata(&dev->states[idx]);
if (cx->valid) { if ((cx->valid) &&
(cx->mpu_state >= mpu_deepest_state) &&
(cx->core_state >= core_deepest_state)) {
next = &dev->states[idx]; next = &dev->states[idx];
break; break;
} }
} }
/* /*
* C1 and C2 are always valid. * C1 is always valid.
* So, no need to check for 'next==NULL' outside this loop. * So, no need to check for 'next==NULL' outside this loop.
*/ */
} }
...@@ -229,36 +215,22 @@ static struct cpuidle_state *next_valid_state(struct cpuidle_device *dev, ...@@ -229,36 +215,22 @@ static struct cpuidle_state *next_valid_state(struct cpuidle_device *dev,
* @dev: cpuidle device * @dev: cpuidle device
* @state: The target state to be programmed * @state: The target state to be programmed
* *
* Used for C states with CPUIDLE_FLAG_CHECK_BM flag set. This * This function checks for any pending activity and then programs
* function checks for any pending activity and then programs the * the device to the specified or a safer state.
* device to the specified or a safer state.
*/ */
static int omap3_enter_idle_bm(struct cpuidle_device *dev, static int omap3_enter_idle_bm(struct cpuidle_device *dev,
struct cpuidle_state *state) struct cpuidle_state *state)
{ {
struct cpuidle_state *new_state = next_valid_state(dev, state); struct cpuidle_state *new_state;
u32 core_next_state, per_next_state = 0, per_saved_state = 0; u32 core_next_state, per_next_state = 0, per_saved_state = 0, cam_state;
u32 cam_state; struct omap3_idle_statedata *cx;
struct omap3_processor_cx *cx;
int ret; int ret;
if ((state->flags & CPUIDLE_FLAG_CHECK_BM) && omap3_idle_bm_check()) { if (!omap3_can_sleep()) {
BUG_ON(!dev->safe_state);
new_state = dev->safe_state; new_state = dev->safe_state;
goto select_state; goto select_state;
} }
cx = cpuidle_get_statedata(state);
core_next_state = cx->core_state;
/*
* FIXME: we currently manage device-specific idle states
* for PER and CORE in combination with CPU-specific
* idle states. This is wrong, and device-specific
* idle management needs to be separated out into
* its own code.
*/
/* /*
* Prevent idle completely if CAM is active. * Prevent idle completely if CAM is active.
* CAM does not have wakeup capability in OMAP3. * CAM does not have wakeup capability in OMAP3.
...@@ -269,10 +241,20 @@ static int omap3_enter_idle_bm(struct cpuidle_device *dev, ...@@ -269,10 +241,20 @@ static int omap3_enter_idle_bm(struct cpuidle_device *dev,
goto select_state; goto select_state;
} }
/*
* FIXME: we currently manage device-specific idle states
* for PER and CORE in combination with CPU-specific
* idle states. This is wrong, and device-specific
* idle management needs to be separated out into
* its own code.
*/
/* /*
* Prevent PER off if CORE is not in retention or off as this * Prevent PER off if CORE is not in retention or off as this
* would disable PER wakeups completely. * would disable PER wakeups completely.
*/ */
cx = cpuidle_get_statedata(state);
core_next_state = cx->core_state;
per_next_state = per_saved_state = pwrdm_read_next_pwrst(per_pd); per_next_state = per_saved_state = pwrdm_read_next_pwrst(per_pd);
if ((per_next_state == PWRDM_POWER_OFF) && if ((per_next_state == PWRDM_POWER_OFF) &&
(core_next_state > PWRDM_POWER_RET)) (core_next_state > PWRDM_POWER_RET))
...@@ -282,6 +264,8 @@ static int omap3_enter_idle_bm(struct cpuidle_device *dev, ...@@ -282,6 +264,8 @@ static int omap3_enter_idle_bm(struct cpuidle_device *dev,
if (per_next_state != per_saved_state) if (per_next_state != per_saved_state)
pwrdm_set_next_pwrst(per_pd, per_next_state); pwrdm_set_next_pwrst(per_pd, per_next_state);
new_state = next_valid_state(dev, state);
select_state: select_state:
dev->last_state = new_state; dev->last_state = new_state;
ret = omap3_enter_idle(dev, new_state); ret = omap3_enter_idle(dev, new_state);
...@@ -295,31 +279,6 @@ static int omap3_enter_idle_bm(struct cpuidle_device *dev, ...@@ -295,31 +279,6 @@ static int omap3_enter_idle_bm(struct cpuidle_device *dev,
DEFINE_PER_CPU(struct cpuidle_device, omap3_idle_dev); DEFINE_PER_CPU(struct cpuidle_device, omap3_idle_dev);
/**
* omap3_cpuidle_update_states() - Update the cpuidle states
* @mpu_deepest_state: Enable states up to and including this for mpu domain
* @core_deepest_state: Enable states up to and including this for core domain
*
* This goes through the list of states available and enables and disables the
* validity of C states based on deepest state that can be achieved for the
* variable domain
*/
void omap3_cpuidle_update_states(u32 mpu_deepest_state, u32 core_deepest_state)
{
int i;
for (i = OMAP3_STATE_C1; i < OMAP3_MAX_STATES; i++) {
struct omap3_processor_cx *cx = &omap3_power_states[i];
if ((cx->mpu_state >= mpu_deepest_state) &&
(cx->core_state >= core_deepest_state)) {
cx->valid = 1;
} else {
cx->valid = 0;
}
}
}
void omap3_pm_init_cpuidle(struct cpuidle_params *cpuidle_board_params) void omap3_pm_init_cpuidle(struct cpuidle_params *cpuidle_board_params)
{ {
int i; int i;
...@@ -327,212 +286,109 @@ void omap3_pm_init_cpuidle(struct cpuidle_params *cpuidle_board_params) ...@@ -327,212 +286,109 @@ void omap3_pm_init_cpuidle(struct cpuidle_params *cpuidle_board_params)
if (!cpuidle_board_params) if (!cpuidle_board_params)
return; return;
for (i = OMAP3_STATE_C1; i < OMAP3_MAX_STATES; i++) { for (i = 0; i < OMAP3_NUM_STATES; i++) {
cpuidle_params_table[i].valid = cpuidle_params_table[i].valid = cpuidle_board_params[i].valid;
cpuidle_board_params[i].valid; cpuidle_params_table[i].exit_latency =
cpuidle_params_table[i].sleep_latency = cpuidle_board_params[i].exit_latency;
cpuidle_board_params[i].sleep_latency; cpuidle_params_table[i].target_residency =
cpuidle_params_table[i].wake_latency = cpuidle_board_params[i].target_residency;
cpuidle_board_params[i].wake_latency;
cpuidle_params_table[i].threshold =
cpuidle_board_params[i].threshold;
} }
return; return;
} }
/* omap3_init_power_states - Initialises the OMAP3 specific C states.
*
* Below is the desciption of each C state.
* C1 . MPU WFI + Core active
* C2 . MPU WFI + Core inactive
* C3 . MPU CSWR + Core inactive
* C4 . MPU OFF + Core inactive
* C5 . MPU CSWR + Core CSWR
* C6 . MPU OFF + Core CSWR
* C7 . MPU OFF + Core OFF
*/
void omap_init_power_states(void)
{
/* C1 . MPU WFI + Core active */
omap3_power_states[OMAP3_STATE_C1].valid =
cpuidle_params_table[OMAP3_STATE_C1].valid;
omap3_power_states[OMAP3_STATE_C1].type = OMAP3_STATE_C1;
omap3_power_states[OMAP3_STATE_C1].sleep_latency =
cpuidle_params_table[OMAP3_STATE_C1].sleep_latency;
omap3_power_states[OMAP3_STATE_C1].wakeup_latency =
cpuidle_params_table[OMAP3_STATE_C1].wake_latency;
omap3_power_states[OMAP3_STATE_C1].threshold =
cpuidle_params_table[OMAP3_STATE_C1].threshold;
omap3_power_states[OMAP3_STATE_C1].mpu_state = PWRDM_POWER_ON;
omap3_power_states[OMAP3_STATE_C1].core_state = PWRDM_POWER_ON;
omap3_power_states[OMAP3_STATE_C1].flags = CPUIDLE_FLAG_TIME_VALID;
omap3_power_states[OMAP3_STATE_C1].desc = "MPU ON + CORE ON";
/* C2 . MPU WFI + Core inactive */
omap3_power_states[OMAP3_STATE_C2].valid =
cpuidle_params_table[OMAP3_STATE_C2].valid;
omap3_power_states[OMAP3_STATE_C2].type = OMAP3_STATE_C2;
omap3_power_states[OMAP3_STATE_C2].sleep_latency =
cpuidle_params_table[OMAP3_STATE_C2].sleep_latency;
omap3_power_states[OMAP3_STATE_C2].wakeup_latency =
cpuidle_params_table[OMAP3_STATE_C2].wake_latency;
omap3_power_states[OMAP3_STATE_C2].threshold =
cpuidle_params_table[OMAP3_STATE_C2].threshold;
omap3_power_states[OMAP3_STATE_C2].mpu_state = PWRDM_POWER_ON;
omap3_power_states[OMAP3_STATE_C2].core_state = PWRDM_POWER_ON;
omap3_power_states[OMAP3_STATE_C2].flags = CPUIDLE_FLAG_TIME_VALID |
CPUIDLE_FLAG_CHECK_BM;
omap3_power_states[OMAP3_STATE_C2].desc = "MPU ON + CORE ON";
/* C3 . MPU CSWR + Core inactive */
omap3_power_states[OMAP3_STATE_C3].valid =
cpuidle_params_table[OMAP3_STATE_C3].valid;
omap3_power_states[OMAP3_STATE_C3].type = OMAP3_STATE_C3;
omap3_power_states[OMAP3_STATE_C3].sleep_latency =
cpuidle_params_table[OMAP3_STATE_C3].sleep_latency;
omap3_power_states[OMAP3_STATE_C3].wakeup_latency =
cpuidle_params_table[OMAP3_STATE_C3].wake_latency;
omap3_power_states[OMAP3_STATE_C3].threshold =
cpuidle_params_table[OMAP3_STATE_C3].threshold;
omap3_power_states[OMAP3_STATE_C3].mpu_state = PWRDM_POWER_RET;
omap3_power_states[OMAP3_STATE_C3].core_state = PWRDM_POWER_ON;
omap3_power_states[OMAP3_STATE_C3].flags = CPUIDLE_FLAG_TIME_VALID |
CPUIDLE_FLAG_CHECK_BM;
omap3_power_states[OMAP3_STATE_C3].desc = "MPU RET + CORE ON";
/* C4 . MPU OFF + Core inactive */
omap3_power_states[OMAP3_STATE_C4].valid =
cpuidle_params_table[OMAP3_STATE_C4].valid;
omap3_power_states[OMAP3_STATE_C4].type = OMAP3_STATE_C4;
omap3_power_states[OMAP3_STATE_C4].sleep_latency =
cpuidle_params_table[OMAP3_STATE_C4].sleep_latency;
omap3_power_states[OMAP3_STATE_C4].wakeup_latency =
cpuidle_params_table[OMAP3_STATE_C4].wake_latency;
omap3_power_states[OMAP3_STATE_C4].threshold =
cpuidle_params_table[OMAP3_STATE_C4].threshold;
omap3_power_states[OMAP3_STATE_C4].mpu_state = PWRDM_POWER_OFF;
omap3_power_states[OMAP3_STATE_C4].core_state = PWRDM_POWER_ON;
omap3_power_states[OMAP3_STATE_C4].flags = CPUIDLE_FLAG_TIME_VALID |
CPUIDLE_FLAG_CHECK_BM;
omap3_power_states[OMAP3_STATE_C4].desc = "MPU OFF + CORE ON";
/* C5 . MPU CSWR + Core CSWR*/
omap3_power_states[OMAP3_STATE_C5].valid =
cpuidle_params_table[OMAP3_STATE_C5].valid;
omap3_power_states[OMAP3_STATE_C5].type = OMAP3_STATE_C5;
omap3_power_states[OMAP3_STATE_C5].sleep_latency =
cpuidle_params_table[OMAP3_STATE_C5].sleep_latency;
omap3_power_states[OMAP3_STATE_C5].wakeup_latency =
cpuidle_params_table[OMAP3_STATE_C5].wake_latency;
omap3_power_states[OMAP3_STATE_C5].threshold =
cpuidle_params_table[OMAP3_STATE_C5].threshold;
omap3_power_states[OMAP3_STATE_C5].mpu_state = PWRDM_POWER_RET;
omap3_power_states[OMAP3_STATE_C5].core_state = PWRDM_POWER_RET;
omap3_power_states[OMAP3_STATE_C5].flags = CPUIDLE_FLAG_TIME_VALID |
CPUIDLE_FLAG_CHECK_BM;
omap3_power_states[OMAP3_STATE_C5].desc = "MPU RET + CORE RET";
/* C6 . MPU OFF + Core CSWR */
omap3_power_states[OMAP3_STATE_C6].valid =
cpuidle_params_table[OMAP3_STATE_C6].valid;
omap3_power_states[OMAP3_STATE_C6].type = OMAP3_STATE_C6;
omap3_power_states[OMAP3_STATE_C6].sleep_latency =
cpuidle_params_table[OMAP3_STATE_C6].sleep_latency;
omap3_power_states[OMAP3_STATE_C6].wakeup_latency =
cpuidle_params_table[OMAP3_STATE_C6].wake_latency;
omap3_power_states[OMAP3_STATE_C6].threshold =
cpuidle_params_table[OMAP3_STATE_C6].threshold;
omap3_power_states[OMAP3_STATE_C6].mpu_state = PWRDM_POWER_OFF;
omap3_power_states[OMAP3_STATE_C6].core_state = PWRDM_POWER_RET;
omap3_power_states[OMAP3_STATE_C6].flags = CPUIDLE_FLAG_TIME_VALID |
CPUIDLE_FLAG_CHECK_BM;
omap3_power_states[OMAP3_STATE_C6].desc = "MPU OFF + CORE RET";
/* C7 . MPU OFF + Core OFF */
omap3_power_states[OMAP3_STATE_C7].valid =
cpuidle_params_table[OMAP3_STATE_C7].valid;
omap3_power_states[OMAP3_STATE_C7].type = OMAP3_STATE_C7;
omap3_power_states[OMAP3_STATE_C7].sleep_latency =
cpuidle_params_table[OMAP3_STATE_C7].sleep_latency;
omap3_power_states[OMAP3_STATE_C7].wakeup_latency =
cpuidle_params_table[OMAP3_STATE_C7].wake_latency;
omap3_power_states[OMAP3_STATE_C7].threshold =
cpuidle_params_table[OMAP3_STATE_C7].threshold;
omap3_power_states[OMAP3_STATE_C7].mpu_state = PWRDM_POWER_OFF;
omap3_power_states[OMAP3_STATE_C7].core_state = PWRDM_POWER_OFF;
omap3_power_states[OMAP3_STATE_C7].flags = CPUIDLE_FLAG_TIME_VALID |
CPUIDLE_FLAG_CHECK_BM;
omap3_power_states[OMAP3_STATE_C7].desc = "MPU OFF + CORE OFF";
/*
* Erratum i583: implementation for ES rev < Es1.2 on 3630. We cannot
* enable OFF mode in a stable form for previous revisions.
* we disable C7 state as a result.
*/
if (IS_PM34XX_ERRATUM(PM_SDRC_WAKEUP_ERRATUM_i583)) {
omap3_power_states[OMAP3_STATE_C7].valid = 0;
cpuidle_params_table[OMAP3_STATE_C7].valid = 0;
pr_warn("%s: core off state C7 disabled due to i583\n",
__func__);
}
}
struct cpuidle_driver omap3_idle_driver = { struct cpuidle_driver omap3_idle_driver = {
.name = "omap3_idle", .name = "omap3_idle",
.owner = THIS_MODULE, .owner = THIS_MODULE,
}; };
/* Helper to fill the C-state common data and register the driver_data */
static inline struct omap3_idle_statedata *_fill_cstate(
struct cpuidle_device *dev,
int idx, const char *descr)
{
struct omap3_idle_statedata *cx = &omap3_idle_data[idx];
struct cpuidle_state *state = &dev->states[idx];
state->exit_latency = cpuidle_params_table[idx].exit_latency;
state->target_residency = cpuidle_params_table[idx].target_residency;
state->flags = CPUIDLE_FLAG_TIME_VALID;
state->enter = omap3_enter_idle_bm;
cx->valid = cpuidle_params_table[idx].valid;
sprintf(state->name, "C%d", idx + 1);
strncpy(state->desc, descr, CPUIDLE_DESC_LEN);
cpuidle_set_statedata(state, cx);
return cx;
}
/** /**
* omap3_idle_init - Init routine for OMAP3 idle * omap3_idle_init - Init routine for OMAP3 idle
* *
* Registers the OMAP3 specific cpuidle driver with the cpuidle * Registers the OMAP3 specific cpuidle driver to the cpuidle
* framework with the valid set of states. * framework with the valid set of states.
*/ */
int __init omap3_idle_init(void) int __init omap3_idle_init(void)
{ {
int i, count = 0;
struct omap3_processor_cx *cx;
struct cpuidle_state *state;
struct cpuidle_device *dev; struct cpuidle_device *dev;
struct omap3_idle_statedata *cx;
mpu_pd = pwrdm_lookup("mpu_pwrdm"); mpu_pd = pwrdm_lookup("mpu_pwrdm");
core_pd = pwrdm_lookup("core_pwrdm"); core_pd = pwrdm_lookup("core_pwrdm");
per_pd = pwrdm_lookup("per_pwrdm"); per_pd = pwrdm_lookup("per_pwrdm");
cam_pd = pwrdm_lookup("cam_pwrdm"); cam_pd = pwrdm_lookup("cam_pwrdm");
omap_init_power_states();
cpuidle_register_driver(&omap3_idle_driver); cpuidle_register_driver(&omap3_idle_driver);
dev = &per_cpu(omap3_idle_dev, smp_processor_id()); dev = &per_cpu(omap3_idle_dev, smp_processor_id());
for (i = OMAP3_STATE_C1; i < OMAP3_MAX_STATES; i++) { /* C1 . MPU WFI + Core active */
cx = &omap3_power_states[i]; cx = _fill_cstate(dev, 0, "MPU ON + CORE ON");
state = &dev->states[count]; (&dev->states[0])->enter = omap3_enter_idle;
dev->safe_state = &dev->states[0];
if (!cx->valid) cx->valid = 1; /* C1 is always valid */
continue; cx->mpu_state = PWRDM_POWER_ON;
cpuidle_set_statedata(state, cx); cx->core_state = PWRDM_POWER_ON;
state->exit_latency = cx->sleep_latency + cx->wakeup_latency;
state->target_residency = cx->threshold;
state->flags = cx->flags;
state->enter = (state->flags & CPUIDLE_FLAG_CHECK_BM) ?
omap3_enter_idle_bm : omap3_enter_idle;
if (cx->type == OMAP3_STATE_C1)
dev->safe_state = state;
sprintf(state->name, "C%d", count+1);
strncpy(state->desc, cx->desc, CPUIDLE_DESC_LEN);
count++;
}
if (!count) /* C2 . MPU WFI + Core inactive */
return -EINVAL; cx = _fill_cstate(dev, 1, "MPU ON + CORE ON");
dev->state_count = count; cx->mpu_state = PWRDM_POWER_ON;
cx->core_state = PWRDM_POWER_ON;
/* C3 . MPU CSWR + Core inactive */
cx = _fill_cstate(dev, 2, "MPU RET + CORE ON");
cx->mpu_state = PWRDM_POWER_RET;
cx->core_state = PWRDM_POWER_ON;
if (enable_off_mode) /* C4 . MPU OFF + Core inactive */
omap3_cpuidle_update_states(PWRDM_POWER_OFF, PWRDM_POWER_OFF); cx = _fill_cstate(dev, 3, "MPU OFF + CORE ON");
else cx->mpu_state = PWRDM_POWER_OFF;
omap3_cpuidle_update_states(PWRDM_POWER_RET, PWRDM_POWER_RET); cx->core_state = PWRDM_POWER_ON;
/* C5 . MPU RET + Core RET */
cx = _fill_cstate(dev, 4, "MPU RET + CORE RET");
cx->mpu_state = PWRDM_POWER_RET;
cx->core_state = PWRDM_POWER_RET;
/* C6 . MPU OFF + Core RET */
cx = _fill_cstate(dev, 5, "MPU OFF + CORE RET");
cx->mpu_state = PWRDM_POWER_OFF;
cx->core_state = PWRDM_POWER_RET;
/* C7 . MPU OFF + Core OFF */
cx = _fill_cstate(dev, 6, "MPU OFF + CORE OFF");
/*
* Erratum i583: implementation for ES rev < Es1.2 on 3630. We cannot
* enable OFF mode in a stable form for previous revisions.
* We disable C7 state as a result.
*/
if (IS_PM34XX_ERRATUM(PM_SDRC_WAKEUP_ERRATUM_i583)) {
cx->valid = 0;
pr_warn("%s: core off state C7 disabled due to i583\n",
__func__);
}
cx->mpu_state = PWRDM_POWER_OFF;
cx->core_state = PWRDM_POWER_OFF;
dev->state_count = OMAP3_NUM_STATES;
if (cpuidle_register_device(dev)) { if (cpuidle_register_device(dev)) {
printk(KERN_ERR "%s: CPUidle register device failed\n", printk(KERN_ERR "%s: CPUidle register device failed\n",
__func__); __func__);
......
...@@ -147,25 +147,24 @@ void __init gpmc_smc91x_init(struct omap_smc91x_platform_data *board_data) ...@@ -147,25 +147,24 @@ void __init gpmc_smc91x_init(struct omap_smc91x_platform_data *board_data)
goto free1; goto free1;
} }
if (gpio_request(gpmc_cfg->gpio_irq, "SMC91X irq") < 0) if (gpio_request_one(gpmc_cfg->gpio_irq, GPIOF_IN, "SMC91X irq") < 0)
goto free1; goto free1;
gpio_direction_input(gpmc_cfg->gpio_irq);
gpmc_smc91x_resources[1].start = gpio_to_irq(gpmc_cfg->gpio_irq); gpmc_smc91x_resources[1].start = gpio_to_irq(gpmc_cfg->gpio_irq);
if (gpmc_cfg->gpio_pwrdwn) { if (gpmc_cfg->gpio_pwrdwn) {
ret = gpio_request(gpmc_cfg->gpio_pwrdwn, "SMC91X powerdown"); ret = gpio_request_one(gpmc_cfg->gpio_pwrdwn,
GPIOF_OUT_INIT_LOW, "SMC91X powerdown");
if (ret) if (ret)
goto free2; goto free2;
gpio_direction_output(gpmc_cfg->gpio_pwrdwn, 0);
} }
if (gpmc_cfg->gpio_reset) { if (gpmc_cfg->gpio_reset) {
ret = gpio_request(gpmc_cfg->gpio_reset, "SMC91X reset"); ret = gpio_request_one(gpmc_cfg->gpio_reset,
GPIOF_OUT_INIT_LOW, "SMC91X reset");
if (ret) if (ret)
goto free3; goto free3;
gpio_direction_output(gpmc_cfg->gpio_reset, 0);
gpio_set_value(gpmc_cfg->gpio_reset, 1); gpio_set_value(gpmc_cfg->gpio_reset, 1);
msleep(100); msleep(100);
gpio_set_value(gpmc_cfg->gpio_reset, 0); gpio_set_value(gpmc_cfg->gpio_reset, 0);
......
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
* it under the terms of the GNU General Public License version 2 as * it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation. * published by the Free Software Foundation.
*/ */
#define pr_fmt(fmt) "%s: " fmt, __func__
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
...@@ -30,7 +31,7 @@ static struct resource gpmc_smsc911x_resources[] = { ...@@ -30,7 +31,7 @@ static struct resource gpmc_smsc911x_resources[] = {
.flags = IORESOURCE_MEM, .flags = IORESOURCE_MEM,
}, },
[1] = { [1] = {
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_LOWLEVEL,
}, },
}; };
...@@ -41,16 +42,6 @@ static struct smsc911x_platform_config gpmc_smsc911x_config = { ...@@ -41,16 +42,6 @@ static struct smsc911x_platform_config gpmc_smsc911x_config = {
.flags = SMSC911X_USE_16BIT, .flags = SMSC911X_USE_16BIT,
}; };
static struct platform_device gpmc_smsc911x_device = {
.name = "smsc911x",
.id = -1,
.num_resources = ARRAY_SIZE(gpmc_smsc911x_resources),
.resource = gpmc_smsc911x_resources,
.dev = {
.platform_data = &gpmc_smsc911x_config,
},
};
/* /*
* Initialize smsc911x device connected to the GPMC. Note that we * Initialize smsc911x device connected to the GPMC. Note that we
* assume that pin multiplexing is done in the board-*.c file, * assume that pin multiplexing is done in the board-*.c file,
...@@ -58,46 +49,49 @@ static struct platform_device gpmc_smsc911x_device = { ...@@ -58,46 +49,49 @@ static struct platform_device gpmc_smsc911x_device = {
*/ */
void __init gpmc_smsc911x_init(struct omap_smsc911x_platform_data *board_data) void __init gpmc_smsc911x_init(struct omap_smsc911x_platform_data *board_data)
{ {
struct platform_device *pdev;
unsigned long cs_mem_base; unsigned long cs_mem_base;
int ret; int ret;
gpmc_cfg = board_data; gpmc_cfg = board_data;
if (gpmc_cs_request(gpmc_cfg->cs, SZ_16M, &cs_mem_base) < 0) { if (gpmc_cs_request(gpmc_cfg->cs, SZ_16M, &cs_mem_base) < 0) {
printk(KERN_ERR "Failed to request GPMC mem for smsc911x\n"); pr_err("Failed to request GPMC mem region\n");
return; return;
} }
gpmc_smsc911x_resources[0].start = cs_mem_base + 0x0; gpmc_smsc911x_resources[0].start = cs_mem_base + 0x0;
gpmc_smsc911x_resources[0].end = cs_mem_base + 0xff; gpmc_smsc911x_resources[0].end = cs_mem_base + 0xff;
if (gpio_request(gpmc_cfg->gpio_irq, "smsc911x irq") < 0) { if (gpio_request_one(gpmc_cfg->gpio_irq, GPIOF_IN, "smsc911x irq")) {
printk(KERN_ERR "Failed to request GPIO%d for smsc911x IRQ\n", pr_err("Failed to request IRQ GPIO%d\n", gpmc_cfg->gpio_irq);
gpmc_cfg->gpio_irq);
goto free1; goto free1;
} }
gpio_direction_input(gpmc_cfg->gpio_irq);
gpmc_smsc911x_resources[1].start = gpio_to_irq(gpmc_cfg->gpio_irq); gpmc_smsc911x_resources[1].start = gpio_to_irq(gpmc_cfg->gpio_irq);
gpmc_smsc911x_resources[1].flags |=
(gpmc_cfg->flags & IRQF_TRIGGER_MASK);
if (gpio_is_valid(gpmc_cfg->gpio_reset)) { if (gpio_is_valid(gpmc_cfg->gpio_reset)) {
ret = gpio_request(gpmc_cfg->gpio_reset, "smsc911x reset"); ret = gpio_request_one(gpmc_cfg->gpio_reset,
GPIOF_OUT_INIT_HIGH, "smsc911x reset");
if (ret) { if (ret) {
printk(KERN_ERR "Failed to request GPIO%d for smsc911x reset\n", pr_err("Failed to request reset GPIO%d\n",
gpmc_cfg->gpio_reset); gpmc_cfg->gpio_reset);
goto free2; goto free2;
} }
gpio_direction_output(gpmc_cfg->gpio_reset, 1);
gpio_set_value(gpmc_cfg->gpio_reset, 0); gpio_set_value(gpmc_cfg->gpio_reset, 0);
msleep(100); msleep(100);
gpio_set_value(gpmc_cfg->gpio_reset, 1); gpio_set_value(gpmc_cfg->gpio_reset, 1);
} }
if (platform_device_register(&gpmc_smsc911x_device) < 0) { if (gpmc_cfg->flags)
printk(KERN_ERR "Unable to register smsc911x device\n"); gpmc_smsc911x_config.flags = gpmc_cfg->flags;
pdev = platform_device_register_resndata(NULL, "smsc911x", gpmc_cfg->id,
gpmc_smsc911x_resources, ARRAY_SIZE(gpmc_smsc911x_resources),
&gpmc_smsc911x_config, sizeof(gpmc_smsc911x_config));
if (!pdev) {
pr_err("Unable to register platform device\n");
gpio_free(gpmc_cfg->gpio_reset); gpio_free(gpmc_cfg->gpio_reset);
goto free2; goto free2;
} }
...@@ -109,5 +103,5 @@ void __init gpmc_smsc911x_init(struct omap_smsc911x_platform_data *board_data) ...@@ -109,5 +103,5 @@ void __init gpmc_smsc911x_init(struct omap_smsc911x_platform_data *board_data)
free1: free1:
gpmc_cs_free(gpmc_cfg->cs); gpmc_cs_free(gpmc_cfg->cs);
printk(KERN_ERR "Could not initialize smsc911x\n"); pr_err("Could not initialize smsc911x device\n");
} }
...@@ -63,10 +63,7 @@ static irqreturn_t l3_interrupt_handler(int irq, void *_l3) ...@@ -63,10 +63,7 @@ static irqreturn_t l3_interrupt_handler(int irq, void *_l3)
char *source_name; char *source_name;
/* Get the Type of interrupt */ /* Get the Type of interrupt */
if (irq == l3->app_irq) inttype = irq == l3->app_irq ? L3_APPLICATION_ERROR : L3_DEBUG_ERROR;
inttype = L3_APPLICATION_ERROR;
else
inttype = L3_DEBUG_ERROR;
for (i = 0; i < L3_MODULES; i++) { for (i = 0; i < L3_MODULES; i++) {
/* /*
...@@ -84,10 +81,10 @@ static irqreturn_t l3_interrupt_handler(int irq, void *_l3) ...@@ -84,10 +81,10 @@ static irqreturn_t l3_interrupt_handler(int irq, void *_l3)
err_src = j; err_src = j;
/* Read the stderrlog_main_source from clk domain */ /* Read the stderrlog_main_source from clk domain */
std_err_main_addr = base + (*(l3_targ[i] + err_src)); std_err_main_addr = base + *(l3_targ[i] + err_src);
std_err_main = readl(std_err_main_addr); std_err_main = readl(std_err_main_addr);
switch ((std_err_main & CUSTOM_ERROR)) { switch (std_err_main & CUSTOM_ERROR) {
case STANDARD_ERROR: case STANDARD_ERROR:
source_name = source_name =
l3_targ_stderrlog_main_name[i][err_src]; l3_targ_stderrlog_main_name[i][err_src];
...@@ -132,49 +129,49 @@ static int __init omap4_l3_probe(struct platform_device *pdev) ...@@ -132,49 +129,49 @@ static int __init omap4_l3_probe(struct platform_device *pdev)
l3 = kzalloc(sizeof(*l3), GFP_KERNEL); l3 = kzalloc(sizeof(*l3), GFP_KERNEL);
if (!l3) if (!l3)
ret = -ENOMEM; return -ENOMEM;
platform_set_drvdata(pdev, l3); platform_set_drvdata(pdev, l3);
res = platform_get_resource(pdev, IORESOURCE_MEM, 0); res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (!res) { if (!res) {
dev_err(&pdev->dev, "couldn't find resource 0\n"); dev_err(&pdev->dev, "couldn't find resource 0\n");
ret = -ENODEV; ret = -ENODEV;
goto err1; goto err0;
} }
l3->l3_base[0] = ioremap(res->start, resource_size(res)); l3->l3_base[0] = ioremap(res->start, resource_size(res));
if (!(l3->l3_base[0])) { if (!l3->l3_base[0]) {
dev_err(&pdev->dev, "ioremap failed\n"); dev_err(&pdev->dev, "ioremap failed\n");
ret = -ENOMEM; ret = -ENOMEM;
goto err2; goto err0;
} }
res = platform_get_resource(pdev, IORESOURCE_MEM, 1); res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
if (!res) { if (!res) {
dev_err(&pdev->dev, "couldn't find resource 1\n"); dev_err(&pdev->dev, "couldn't find resource 1\n");
ret = -ENODEV; ret = -ENODEV;
goto err3; goto err1;
} }
l3->l3_base[1] = ioremap(res->start, resource_size(res)); l3->l3_base[1] = ioremap(res->start, resource_size(res));
if (!(l3->l3_base[1])) { if (!l3->l3_base[1]) {
dev_err(&pdev->dev, "ioremap failed\n"); dev_err(&pdev->dev, "ioremap failed\n");
ret = -ENOMEM; ret = -ENOMEM;
goto err4; goto err1;
} }
res = platform_get_resource(pdev, IORESOURCE_MEM, 2); res = platform_get_resource(pdev, IORESOURCE_MEM, 2);
if (!res) { if (!res) {
dev_err(&pdev->dev, "couldn't find resource 2\n"); dev_err(&pdev->dev, "couldn't find resource 2\n");
ret = -ENODEV; ret = -ENODEV;
goto err5; goto err2;
} }
l3->l3_base[2] = ioremap(res->start, resource_size(res)); l3->l3_base[2] = ioremap(res->start, resource_size(res));
if (!(l3->l3_base[2])) { if (!l3->l3_base[2]) {
dev_err(&pdev->dev, "ioremap failed\n"); dev_err(&pdev->dev, "ioremap failed\n");
ret = -ENOMEM; ret = -ENOMEM;
goto err6; goto err2;
} }
/* /*
...@@ -187,7 +184,7 @@ static int __init omap4_l3_probe(struct platform_device *pdev) ...@@ -187,7 +184,7 @@ static int __init omap4_l3_probe(struct platform_device *pdev)
if (ret) { if (ret) {
pr_crit("L3: request_irq failed to register for 0x%x\n", pr_crit("L3: request_irq failed to register for 0x%x\n",
OMAP44XX_IRQ_L3_DBG); OMAP44XX_IRQ_L3_DBG);
goto err7; goto err3;
} }
l3->debug_irq = irq; l3->debug_irq = irq;
...@@ -198,24 +195,22 @@ static int __init omap4_l3_probe(struct platform_device *pdev) ...@@ -198,24 +195,22 @@ static int __init omap4_l3_probe(struct platform_device *pdev)
if (ret) { if (ret) {
pr_crit("L3: request_irq failed to register for 0x%x\n", pr_crit("L3: request_irq failed to register for 0x%x\n",
OMAP44XX_IRQ_L3_APP); OMAP44XX_IRQ_L3_APP);
goto err8; goto err4;
} }
l3->app_irq = irq; l3->app_irq = irq;
goto err0; return 0;
err8:
err7:
iounmap(l3->l3_base[2]);
err6:
err5:
iounmap(l3->l3_base[1]);
err4: err4:
free_irq(l3->debug_irq, l3);
err3: err3:
iounmap(l3->l3_base[0]); iounmap(l3->l3_base[2]);
err2: err2:
iounmap(l3->l3_base[1]);
err1: err1:
kfree(l3); iounmap(l3->l3_base[0]);
err0: err0:
kfree(l3);
return ret; return ret;
} }
......
...@@ -155,7 +155,7 @@ static irqreturn_t omap3_l3_block_irq(struct omap3_l3 *l3, ...@@ -155,7 +155,7 @@ static irqreturn_t omap3_l3_block_irq(struct omap3_l3 *l3,
u8 multi = error & L3_ERROR_LOG_MULTI; u8 multi = error & L3_ERROR_LOG_MULTI;
u32 address = omap3_l3_decode_addr(error_addr); u32 address = omap3_l3_decode_addr(error_addr);
WARN(true, "%s Error seen by %s %s at address %x\n", WARN(true, "%s seen by %s %s at address %x\n",
omap3_l3_code_string(code), omap3_l3_code_string(code),
omap3_l3_initiator_string(initid), omap3_l3_initiator_string(initid),
multi ? "Multiple Errors" : "", multi ? "Multiple Errors" : "",
...@@ -167,21 +167,15 @@ static irqreturn_t omap3_l3_block_irq(struct omap3_l3 *l3, ...@@ -167,21 +167,15 @@ static irqreturn_t omap3_l3_block_irq(struct omap3_l3 *l3,
static irqreturn_t omap3_l3_app_irq(int irq, void *_l3) static irqreturn_t omap3_l3_app_irq(int irq, void *_l3)
{ {
struct omap3_l3 *l3 = _l3; struct omap3_l3 *l3 = _l3;
u64 status, clear; u64 status, clear;
u64 error; u64 error;
u64 error_addr; u64 error_addr;
u64 err_source = 0; u64 err_source = 0;
void __iomem *base; void __iomem *base;
int int_type; int int_type;
irqreturn_t ret = IRQ_NONE; irqreturn_t ret = IRQ_NONE;
if (irq == l3->app_irq) int_type = irq == l3->app_irq ? L3_APPLICATION_ERROR : L3_DEBUG_ERROR;
int_type = L3_APPLICATION_ERROR;
else
int_type = L3_DEBUG_ERROR;
if (!int_type) { if (!int_type) {
status = omap3_l3_readll(l3->rt, L3_SI_FLAG_STATUS_0); status = omap3_l3_readll(l3->rt, L3_SI_FLAG_STATUS_0);
/* /*
...@@ -202,7 +196,6 @@ static irqreturn_t omap3_l3_app_irq(int irq, void *_l3) ...@@ -202,7 +196,6 @@ static irqreturn_t omap3_l3_app_irq(int irq, void *_l3)
base = l3->rt + *(omap3_l3_bases[int_type] + err_source); base = l3->rt + *(omap3_l3_bases[int_type] + err_source);
error = omap3_l3_readll(base, L3_ERROR_LOG); error = omap3_l3_readll(base, L3_ERROR_LOG);
if (error) { if (error) {
error_addr = omap3_l3_readll(base, L3_ERROR_LOG_ADDR); error_addr = omap3_l3_readll(base, L3_ERROR_LOG_ADDR);
...@@ -210,9 +203,8 @@ static irqreturn_t omap3_l3_app_irq(int irq, void *_l3) ...@@ -210,9 +203,8 @@ static irqreturn_t omap3_l3_app_irq(int irq, void *_l3)
} }
/* Clear the status register */ /* Clear the status register */
clear = ((L3_AGENT_STATUS_CLEAR_IA << int_type) | clear = (L3_AGENT_STATUS_CLEAR_IA << int_type) |
(L3_AGENT_STATUS_CLEAR_TA)); L3_AGENT_STATUS_CLEAR_TA;
omap3_l3_writell(base, L3_AGENT_STATUS, clear); omap3_l3_writell(base, L3_AGENT_STATUS, clear);
/* clear the error log register */ /* clear the error log register */
...@@ -228,10 +220,8 @@ static int __init omap3_l3_probe(struct platform_device *pdev) ...@@ -228,10 +220,8 @@ static int __init omap3_l3_probe(struct platform_device *pdev)
int ret; int ret;
l3 = kzalloc(sizeof(*l3), GFP_KERNEL); l3 = kzalloc(sizeof(*l3), GFP_KERNEL);
if (!l3) { if (!l3)
ret = -ENOMEM; return -ENOMEM;
goto err0;
}
platform_set_drvdata(pdev, l3); platform_set_drvdata(pdev, l3);
...@@ -239,13 +229,13 @@ static int __init omap3_l3_probe(struct platform_device *pdev) ...@@ -239,13 +229,13 @@ static int __init omap3_l3_probe(struct platform_device *pdev)
if (!res) { if (!res) {
dev_err(&pdev->dev, "couldn't find resource\n"); dev_err(&pdev->dev, "couldn't find resource\n");
ret = -ENODEV; ret = -ENODEV;
goto err1; goto err0;
} }
l3->rt = ioremap(res->start, resource_size(res)); l3->rt = ioremap(res->start, resource_size(res));
if (!(l3->rt)) { if (!l3->rt) {
dev_err(&pdev->dev, "ioremap failed\n"); dev_err(&pdev->dev, "ioremap failed\n");
ret = -ENOMEM; ret = -ENOMEM;
goto err2; goto err0;
} }
l3->debug_irq = platform_get_irq(pdev, 0); l3->debug_irq = platform_get_irq(pdev, 0);
...@@ -254,28 +244,26 @@ static int __init omap3_l3_probe(struct platform_device *pdev) ...@@ -254,28 +244,26 @@ static int __init omap3_l3_probe(struct platform_device *pdev)
"l3-debug-irq", l3); "l3-debug-irq", l3);
if (ret) { if (ret) {
dev_err(&pdev->dev, "couldn't request debug irq\n"); dev_err(&pdev->dev, "couldn't request debug irq\n");
goto err3; goto err1;
} }
l3->app_irq = platform_get_irq(pdev, 1); l3->app_irq = platform_get_irq(pdev, 1);
ret = request_irq(l3->app_irq, omap3_l3_app_irq, ret = request_irq(l3->app_irq, omap3_l3_app_irq,
IRQF_DISABLED | IRQF_TRIGGER_RISING, IRQF_DISABLED | IRQF_TRIGGER_RISING,
"l3-app-irq", l3); "l3-app-irq", l3);
if (ret) { if (ret) {
dev_err(&pdev->dev, "couldn't request app irq\n"); dev_err(&pdev->dev, "couldn't request app irq\n");
goto err4; goto err2;
} }
goto err0; return 0;
err4:
err3:
iounmap(l3->rt);
err2: err2:
free_irq(l3->debug_irq, l3);
err1: err1:
kfree(l3); iounmap(l3->rt);
err0: err0:
kfree(l3);
return ret; return ret;
} }
......
...@@ -50,13 +50,16 @@ int omap4430_phy_init(struct device *dev) ...@@ -50,13 +50,16 @@ int omap4430_phy_init(struct device *dev)
{ {
ctrl_base = ioremap(OMAP443X_SCM_BASE, SZ_1K); ctrl_base = ioremap(OMAP443X_SCM_BASE, SZ_1K);
if (!ctrl_base) { if (!ctrl_base) {
dev_err(dev, "control module ioremap failed\n"); pr_err("control module ioremap failed\n");
return -ENOMEM; return -ENOMEM;
} }
/* Power down the phy */ /* Power down the phy */
__raw_writel(PHY_PD, ctrl_base + CONTROL_DEV_CONF); __raw_writel(PHY_PD, ctrl_base + CONTROL_DEV_CONF);
phyclk = clk_get(dev, "ocp2scp_usb_phy_ick");
if (!dev)
return 0;
phyclk = clk_get(dev, "ocp2scp_usb_phy_ick");
if (IS_ERR(phyclk)) { if (IS_ERR(phyclk)) {
dev_err(dev, "cannot clk_get ocp2scp_usb_phy_ick\n"); dev_err(dev, "cannot clk_get ocp2scp_usb_phy_ick\n");
iounmap(ctrl_base); iounmap(ctrl_base);
...@@ -228,7 +231,7 @@ void am35x_musb_clear_irq(void) ...@@ -228,7 +231,7 @@ void am35x_musb_clear_irq(void)
regval = omap_ctrl_readl(AM35XX_CONTROL_LVL_INTR_CLEAR); regval = omap_ctrl_readl(AM35XX_CONTROL_LVL_INTR_CLEAR);
} }
void am35x_musb_set_mode(u8 musb_mode) void am35x_set_mode(u8 musb_mode)
{ {
u32 devconf2 = omap_ctrl_readl(AM35XX_CONTROL_DEVCONF2); u32 devconf2 = omap_ctrl_readl(AM35XX_CONTROL_DEVCONF2);
......
...@@ -36,11 +36,16 @@ static inline int omap4_opp_init(void) ...@@ -36,11 +36,16 @@ static inline int omap4_opp_init(void)
} }
#endif #endif
/*
* cpuidle mach specific parameters
*
* The board code can override the default C-states definition using
* omap3_pm_init_cpuidle
*/
struct cpuidle_params { struct cpuidle_params {
u8 valid; u32 exit_latency; /* exit_latency = sleep + wake-up latencies */
u32 sleep_latency; u32 target_residency;
u32 wake_latency; u8 valid; /* validates the C-state */
u32 threshold;
}; };
#if defined(CONFIG_PM) && defined(CONFIG_CPU_IDLE) #if defined(CONFIG_PM) && defined(CONFIG_CPU_IDLE)
...@@ -73,10 +78,6 @@ extern u32 sleep_while_idle; ...@@ -73,10 +78,6 @@ extern u32 sleep_while_idle;
#define sleep_while_idle 0 #define sleep_while_idle 0
#endif #endif
#if defined(CONFIG_CPU_IDLE)
extern void omap3_cpuidle_update_states(u32, u32);
#endif
#if defined(CONFIG_PM_DEBUG) && defined(CONFIG_DEBUG_FS) #if defined(CONFIG_PM_DEBUG) && defined(CONFIG_DEBUG_FS)
extern void pm_dbg_update_time(struct powerdomain *pwrdm, int prev); extern void pm_dbg_update_time(struct powerdomain *pwrdm, int prev);
extern int pm_dbg_regset_save(int reg_set); extern int pm_dbg_regset_save(int reg_set);
......
...@@ -779,18 +779,6 @@ void omap3_pm_off_mode_enable(int enable) ...@@ -779,18 +779,6 @@ void omap3_pm_off_mode_enable(int enable)
else else
state = PWRDM_POWER_RET; state = PWRDM_POWER_RET;
#ifdef CONFIG_CPU_IDLE
/*
* Erratum i583: implementation for ES rev < Es1.2 on 3630. We cannot
* enable OFF mode in a stable form for previous revisions, restrict
* instead to RET
*/
if (IS_PM34XX_ERRATUM(PM_SDRC_WAKEUP_ERRATUM_i583))
omap3_cpuidle_update_states(state, PWRDM_POWER_RET);
else
omap3_cpuidle_update_states(state, state);
#endif
list_for_each_entry(pwrst, &pwrst_list, node) { list_for_each_entry(pwrst, &pwrst_list, node) {
if (IS_PM34XX_ERRATUM(PM_SDRC_WAKEUP_ERRATUM_i583) && if (IS_PM34XX_ERRATUM(PM_SDRC_WAKEUP_ERRATUM_i583) &&
pwrst->pwrdm == core_pwrdm && pwrst->pwrdm == core_pwrdm &&
...@@ -895,8 +883,6 @@ static int __init omap3_pm_init(void) ...@@ -895,8 +883,6 @@ static int __init omap3_pm_init(void)
pm_errata_configure(); pm_errata_configure();
printk(KERN_ERR "Power Management for TI OMAP3.\n");
/* XXX prcm_setup_regs needs to be before enabling hw /* XXX prcm_setup_regs needs to be before enabling hw
* supervised mode for powerdomains */ * supervised mode for powerdomains */
prcm_setup_regs(); prcm_setup_regs();
......
...@@ -105,13 +105,11 @@ static int __init omap4_pm_init(void) ...@@ -105,13 +105,11 @@ static int __init omap4_pm_init(void)
pr_err("Power Management for TI OMAP4.\n"); pr_err("Power Management for TI OMAP4.\n");
#ifdef CONFIG_PM
ret = pwrdm_for_each(pwrdms_setup, NULL); ret = pwrdm_for_each(pwrdms_setup, NULL);
if (ret) { if (ret) {
pr_err("Failed to setup powerdomains\n"); pr_err("Failed to setup powerdomains\n");
goto err2; goto err2;
} }
#endif
#ifdef CONFIG_SUSPEND #ifdef CONFIG_SUSPEND
suspend_set_ops(&omap_pm_ops); suspend_set_ops(&omap_pm_ops);
......
...@@ -847,6 +847,14 @@ static int __init omap_sr_probe(struct platform_device *pdev) ...@@ -847,6 +847,14 @@ static int __init omap_sr_probe(struct platform_device *pdev)
goto err_free_devinfo; goto err_free_devinfo;
} }
mem = request_mem_region(mem->start, resource_size(mem),
dev_name(&pdev->dev));
if (!mem) {
dev_err(&pdev->dev, "%s: no mem region\n", __func__);
ret = -EBUSY;
goto err_free_devinfo;
}
irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0); irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
pm_runtime_enable(&pdev->dev); pm_runtime_enable(&pdev->dev);
...@@ -883,7 +891,7 @@ static int __init omap_sr_probe(struct platform_device *pdev) ...@@ -883,7 +891,7 @@ static int __init omap_sr_probe(struct platform_device *pdev)
ret = sr_late_init(sr_info); ret = sr_late_init(sr_info);
if (ret) { if (ret) {
pr_warning("%s: Error in SR late init\n", __func__); pr_warning("%s: Error in SR late init\n", __func__);
goto err_release_region; return ret;
} }
} }
...@@ -896,7 +904,7 @@ static int __init omap_sr_probe(struct platform_device *pdev) ...@@ -896,7 +904,7 @@ static int __init omap_sr_probe(struct platform_device *pdev)
vdd_dbg_dir = omap_voltage_get_dbgdir(sr_info->voltdm); vdd_dbg_dir = omap_voltage_get_dbgdir(sr_info->voltdm);
if (!vdd_dbg_dir) { if (!vdd_dbg_dir) {
ret = -EINVAL; ret = -EINVAL;
goto err_release_region; goto err_iounmap;
} }
sr_info->dbg_dir = debugfs_create_dir("smartreflex", vdd_dbg_dir); sr_info->dbg_dir = debugfs_create_dir("smartreflex", vdd_dbg_dir);
...@@ -904,7 +912,7 @@ static int __init omap_sr_probe(struct platform_device *pdev) ...@@ -904,7 +912,7 @@ static int __init omap_sr_probe(struct platform_device *pdev)
dev_err(&pdev->dev, "%s: Unable to create debugfs directory\n", dev_err(&pdev->dev, "%s: Unable to create debugfs directory\n",
__func__); __func__);
ret = PTR_ERR(sr_info->dbg_dir); ret = PTR_ERR(sr_info->dbg_dir);
goto err_release_region; goto err_iounmap;
} }
(void) debugfs_create_file("autocomp", S_IRUGO | S_IWUSR, (void) debugfs_create_file("autocomp", S_IRUGO | S_IWUSR,
...@@ -921,7 +929,7 @@ static int __init omap_sr_probe(struct platform_device *pdev) ...@@ -921,7 +929,7 @@ static int __init omap_sr_probe(struct platform_device *pdev)
dev_err(&pdev->dev, "%s: Unable to create debugfs directory" dev_err(&pdev->dev, "%s: Unable to create debugfs directory"
"for n-values\n", __func__); "for n-values\n", __func__);
ret = PTR_ERR(nvalue_dir); ret = PTR_ERR(nvalue_dir);
goto err_release_region; goto err_debugfs;
} }
omap_voltage_get_volttable(sr_info->voltdm, &volt_data); omap_voltage_get_volttable(sr_info->voltdm, &volt_data);
...@@ -931,7 +939,7 @@ static int __init omap_sr_probe(struct platform_device *pdev) ...@@ -931,7 +939,7 @@ static int __init omap_sr_probe(struct platform_device *pdev)
"entries for n-values\n", "entries for n-values\n",
__func__, sr_info->voltdm->name); __func__, sr_info->voltdm->name);
ret = -ENODATA; ret = -ENODATA;
goto err_release_region; goto err_debugfs;
} }
for (i = 0; i < sr_info->nvalue_count; i++) { for (i = 0; i < sr_info->nvalue_count; i++) {
...@@ -945,6 +953,11 @@ static int __init omap_sr_probe(struct platform_device *pdev) ...@@ -945,6 +953,11 @@ static int __init omap_sr_probe(struct platform_device *pdev)
return ret; return ret;
err_debugfs:
debugfs_remove_recursive(sr_info->dbg_dir);
err_iounmap:
list_del(&sr_info->node);
iounmap(sr_info->base);
err_release_region: err_release_region:
release_mem_region(mem->start, resource_size(mem)); release_mem_region(mem->start, resource_size(mem));
err_free_devinfo: err_free_devinfo:
......
...@@ -108,7 +108,13 @@ static void usb_musb_mux_init(struct omap_musb_board_data *board_data) ...@@ -108,7 +108,13 @@ static void usb_musb_mux_init(struct omap_musb_board_data *board_data)
} }
} }
void __init usb_musb_init(struct omap_musb_board_data *board_data) static struct omap_musb_board_data musb_default_board_data = {
.interface_type = MUSB_INTERFACE_ULPI,
.mode = MUSB_OTG,
.power = 100,
};
void __init usb_musb_init(struct omap_musb_board_data *musb_board_data)
{ {
struct omap_hwmod *oh; struct omap_hwmod *oh;
struct omap_device *od; struct omap_device *od;
...@@ -116,11 +122,12 @@ void __init usb_musb_init(struct omap_musb_board_data *board_data) ...@@ -116,11 +122,12 @@ void __init usb_musb_init(struct omap_musb_board_data *board_data)
struct device *dev; struct device *dev;
int bus_id = -1; int bus_id = -1;
const char *oh_name, *name; const char *oh_name, *name;
struct omap_musb_board_data *board_data;
if (cpu_is_omap3517() || cpu_is_omap3505()) { if (musb_board_data)
} else if (cpu_is_omap44xx()) { board_data = musb_board_data;
usb_musb_mux_init(board_data); else
} board_data = &musb_default_board_data;
/* /*
* REVISIT: This line can be removed once all the platforms using * REVISIT: This line can be removed once all the platforms using
...@@ -164,10 +171,15 @@ void __init usb_musb_init(struct omap_musb_board_data *board_data) ...@@ -164,10 +171,15 @@ void __init usb_musb_init(struct omap_musb_board_data *board_data)
dev->dma_mask = &musb_dmamask; dev->dma_mask = &musb_dmamask;
dev->coherent_dma_mask = musb_dmamask; dev->coherent_dma_mask = musb_dmamask;
put_device(dev); put_device(dev);
if (cpu_is_omap44xx())
omap4430_phy_init(dev);
} }
#else #else
void __init usb_musb_init(struct omap_musb_board_data *board_data) void __init usb_musb_init(struct omap_musb_board_data *board_data)
{ {
if (cpu_is_omap44xx())
omap4430_phy_init(NULL);
} }
#endif /* CONFIG_USB_MUSB_SOC */ #endif /* CONFIG_USB_MUSB_SOC */
...@@ -293,12 +293,11 @@ tusb6010_setup_interface(struct musb_hdrc_platform_data *data, ...@@ -293,12 +293,11 @@ tusb6010_setup_interface(struct musb_hdrc_platform_data *data,
); );
/* IRQ */ /* IRQ */
status = gpio_request(irq, "TUSB6010 irq"); status = gpio_request_one(irq, GPIOF_IN, "TUSB6010 irq");
if (status < 0) { if (status < 0) {
printk(error, 3, status); printk(error, 3, status);
return status; return status;
} }
gpio_direction_input(irq);
tusb_resources[2].start = irq + IH_GPIO_BASE; tusb_resources[2].start = irq + IH_GPIO_BASE;
/* set up memory timings ... can speed them up later */ /* set up memory timings ... can speed them up later */
......
...@@ -148,7 +148,6 @@ static int vp_volt_debug_get(void *data, u64 *val) ...@@ -148,7 +148,6 @@ static int vp_volt_debug_get(void *data, u64 *val)
} }
vsel = vdd->read_reg(prm_mod_offs, vdd->vp_data->voltage); vsel = vdd->read_reg(prm_mod_offs, vdd->vp_data->voltage);
pr_notice("curr_vsel = %x\n", vsel);
if (!vdd->pmic_info->vsel_to_uv) { if (!vdd->pmic_info->vsel_to_uv) {
pr_warning("PMIC function to convert vsel to voltage" pr_warning("PMIC function to convert vsel to voltage"
......
...@@ -14,14 +14,14 @@ ...@@ -14,14 +14,14 @@
#ifndef __ASM_ARCH_OMAP_GPMC_SMSC911X_H__ #ifndef __ASM_ARCH_OMAP_GPMC_SMSC911X_H__
struct omap_smsc911x_platform_data { struct omap_smsc911x_platform_data {
int id;
int cs; int cs;
int gpio_irq; int gpio_irq;
int gpio_reset; int gpio_reset;
u32 flags; u32 flags;
}; };
#if defined(CONFIG_SMSC911X) || \ #if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE)
defined(CONFIG_SMSC911X_MODULE)
extern void gpmc_smsc911x_init(struct omap_smsc911x_platform_data *d); extern void gpmc_smsc911x_init(struct omap_smsc911x_platform_data *d);
......
...@@ -129,7 +129,6 @@ static inline void __arch_decomp_setup(unsigned long arch_id) ...@@ -129,7 +129,6 @@ static inline void __arch_decomp_setup(unsigned long arch_id)
DEBUG_LL_OMAP1(3, sx1); DEBUG_LL_OMAP1(3, sx1);
/* omap2 based boards using UART1 */ /* omap2 based boards using UART1 */
DEBUG_LL_OMAP2(1, omap2evm);
DEBUG_LL_OMAP2(1, omap_2430sdp); DEBUG_LL_OMAP2(1, omap_2430sdp);
DEBUG_LL_OMAP2(1, omap_apollon); DEBUG_LL_OMAP2(1, omap_apollon);
DEBUG_LL_OMAP2(1, omap_h4); DEBUG_LL_OMAP2(1, omap_h4);
......
...@@ -113,7 +113,7 @@ extern int omap4430_phy_suspend(struct device *dev, int suspend); ...@@ -113,7 +113,7 @@ extern int omap4430_phy_suspend(struct device *dev, int suspend);
extern void am35x_musb_reset(void); extern void am35x_musb_reset(void);
extern void am35x_musb_phy_power(u8 on); extern void am35x_musb_phy_power(u8 on);
extern void am35x_musb_clear_irq(void); extern void am35x_musb_clear_irq(void);
extern void am35x_musb_set_mode(u8 musb_mode); extern void am35x_set_mode(u8 musb_mode);
/* /*
* FIXME correct answer depends on hmc_mode, * FIXME correct answer depends on hmc_mode,
......
...@@ -30,7 +30,6 @@ objs-y$(CONFIG_MACH_OMAP_APOLLON) += lcd_apollon.o ...@@ -30,7 +30,6 @@ objs-y$(CONFIG_MACH_OMAP_APOLLON) += lcd_apollon.o
objs-y$(CONFIG_MACH_OMAP_2430SDP) += lcd_2430sdp.o objs-y$(CONFIG_MACH_OMAP_2430SDP) += lcd_2430sdp.o
objs-y$(CONFIG_MACH_OMAP_3430SDP) += lcd_2430sdp.o objs-y$(CONFIG_MACH_OMAP_3430SDP) += lcd_2430sdp.o
objs-y$(CONFIG_MACH_OMAP_LDP) += lcd_ldp.o objs-y$(CONFIG_MACH_OMAP_LDP) += lcd_ldp.o
objs-y$(CONFIG_MACH_OMAP2EVM) += lcd_omap2evm.o
objs-y$(CONFIG_MACH_OMAP3EVM) += lcd_omap3evm.o objs-y$(CONFIG_MACH_OMAP3EVM) += lcd_omap3evm.o
objs-y$(CONFIG_MACH_OMAP3_BEAGLE) += lcd_omap3beagle.o objs-y$(CONFIG_MACH_OMAP3_BEAGLE) += lcd_omap3beagle.o
objs-y$(CONFIG_FB_OMAP_LCD_MIPID) += lcd_mipid.o objs-y$(CONFIG_FB_OMAP_LCD_MIPID) += lcd_mipid.o
......
/*
* LCD panel support for the MISTRAL OMAP2EVM board
*
* Author: Arun C <arunedarath@mistralsolutions.com>
*
* Derived from drivers/video/omap/lcd_omap3evm.c
* Derived from drivers/video/omap/lcd-apollon.c
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/gpio.h>
#include <linux/i2c/twl.h>
#include <plat/mux.h>
#include <asm/mach-types.h>
#include "omapfb.h"
#define LCD_PANEL_ENABLE_GPIO 154
#define LCD_PANEL_LR 128
#define LCD_PANEL_UD 129
#define LCD_PANEL_INI 152
#define LCD_PANEL_QVGA 148
#define LCD_PANEL_RESB 153
#define TWL_LED_LEDEN 0x00
#define TWL_PWMA_PWMAON 0x00
#define TWL_PWMA_PWMAOFF 0x01
static unsigned int bklight_level;
static int omap2evm_panel_init(struct lcd_panel *panel,
struct omapfb_device *fbdev)
{
gpio_request(LCD_PANEL_ENABLE_GPIO, "LCD enable");
gpio_request(LCD_PANEL_LR, "LCD lr");
gpio_request(LCD_PANEL_UD, "LCD ud");
gpio_request(LCD_PANEL_INI, "LCD ini");
gpio_request(LCD_PANEL_QVGA, "LCD qvga");
gpio_request(LCD_PANEL_RESB, "LCD resb");
gpio_direction_output(LCD_PANEL_ENABLE_GPIO, 1);
gpio_direction_output(LCD_PANEL_RESB, 1);
gpio_direction_output(LCD_PANEL_INI, 1);
gpio_direction_output(LCD_PANEL_QVGA, 0);
gpio_direction_output(LCD_PANEL_LR, 1);
gpio_direction_output(LCD_PANEL_UD, 1);
twl_i2c_write_u8(TWL4030_MODULE_LED, 0x11, TWL_LED_LEDEN);
twl_i2c_write_u8(TWL4030_MODULE_PWMA, 0x01, TWL_PWMA_PWMAON);
twl_i2c_write_u8(TWL4030_MODULE_PWMA, 0x02, TWL_PWMA_PWMAOFF);
bklight_level = 100;
return 0;
}
static void omap2evm_panel_cleanup(struct lcd_panel *panel)
{
gpio_free(LCD_PANEL_RESB);
gpio_free(LCD_PANEL_QVGA);
gpio_free(LCD_PANEL_INI);
gpio_free(LCD_PANEL_UD);
gpio_free(LCD_PANEL_LR);
gpio_free(LCD_PANEL_ENABLE_GPIO);
}
static int omap2evm_panel_enable(struct lcd_panel *panel)
{
gpio_set_value(LCD_PANEL_ENABLE_GPIO, 0);
return 0;
}
static void omap2evm_panel_disable(struct lcd_panel *panel)
{
gpio_set_value(LCD_PANEL_ENABLE_GPIO, 1);
}
static unsigned long omap2evm_panel_get_caps(struct lcd_panel *panel)
{
return 0;
}
static int omap2evm_bklight_setlevel(struct lcd_panel *panel,
unsigned int level)
{
u8 c;
if ((level >= 0) && (level <= 100)) {
c = (125 * (100 - level)) / 100 + 2;
twl_i2c_write_u8(TWL4030_MODULE_PWMA, c, TWL_PWMA_PWMAOFF);
bklight_level = level;
}
return 0;
}
static unsigned int omap2evm_bklight_getlevel(struct lcd_panel *panel)
{
return bklight_level;
}
static unsigned int omap2evm_bklight_getmaxlevel(struct lcd_panel *panel)
{
return 100;
}
struct lcd_panel omap2evm_panel = {
.name = "omap2evm",
.config = OMAP_LCDC_PANEL_TFT | OMAP_LCDC_INV_VSYNC |
OMAP_LCDC_INV_HSYNC,
.bpp = 16,
.data_lines = 18,
.x_res = 480,
.y_res = 640,
.hsw = 3,
.hfp = 0,
.hbp = 28,
.vsw = 2,
.vfp = 1,
.vbp = 0,
.pixel_clock = 20000,
.init = omap2evm_panel_init,
.cleanup = omap2evm_panel_cleanup,
.enable = omap2evm_panel_enable,
.disable = omap2evm_panel_disable,
.get_caps = omap2evm_panel_get_caps,
.set_bklight_level = omap2evm_bklight_setlevel,
.get_bklight_level = omap2evm_bklight_getlevel,
.get_bklight_max = omap2evm_bklight_getmaxlevel,
};
static int omap2evm_panel_probe(struct platform_device *pdev)
{
omapfb_register_panel(&omap2evm_panel);
return 0;
}
static int omap2evm_panel_remove(struct platform_device *pdev)
{
return 0;
}
static int omap2evm_panel_suspend(struct platform_device *pdev,
pm_message_t mesg)
{
return 0;
}
static int omap2evm_panel_resume(struct platform_device *pdev)
{
return 0;
}
struct platform_driver omap2evm_panel_driver = {
.probe = omap2evm_panel_probe,
.remove = omap2evm_panel_remove,
.suspend = omap2evm_panel_suspend,
.resume = omap2evm_panel_resume,
.driver = {
.name = "omap2evm_lcd",
.owner = THIS_MODULE,
},
};
static int __init omap2evm_panel_drv_init(void)
{
return platform_driver_register(&omap2evm_panel_driver);
}
static void __exit omap2evm_panel_drv_exit(void)
{
platform_driver_unregister(&omap2evm_panel_driver);
}
module_init(omap2evm_panel_drv_init);
module_exit(omap2evm_panel_drv_exit);
...@@ -65,14 +65,6 @@ config SND_OMAP_SOC_OVERO ...@@ -65,14 +65,6 @@ config SND_OMAP_SOC_OVERO
Say Y if you want to add support for SoC audio on the Say Y if you want to add support for SoC audio on the
Gumstix Overo or CompuLab CM-T35 Gumstix Overo or CompuLab CM-T35
config SND_OMAP_SOC_OMAP2EVM
tristate "SoC Audio support for OMAP2EVM board"
depends on TWL4030_CORE && SND_OMAP_SOC && MACH_OMAP2EVM
select SND_OMAP_SOC_MCBSP
select SND_SOC_TWL4030
help
Say Y if you want to add support for SoC audio on the omap2evm board.
config SND_OMAP_SOC_OMAP3EVM config SND_OMAP_SOC_OMAP3EVM
tristate "SoC Audio support for OMAP3EVM board" tristate "SoC Audio support for OMAP3EVM board"
depends on TWL4030_CORE && SND_OMAP_SOC && MACH_OMAP3EVM depends on TWL4030_CORE && SND_OMAP_SOC && MACH_OMAP3EVM
......
...@@ -13,7 +13,6 @@ snd-soc-rx51-objs := rx51.o ...@@ -13,7 +13,6 @@ snd-soc-rx51-objs := rx51.o
snd-soc-ams-delta-objs := ams-delta.o snd-soc-ams-delta-objs := ams-delta.o
snd-soc-osk5912-objs := osk5912.o snd-soc-osk5912-objs := osk5912.o
snd-soc-overo-objs := overo.o snd-soc-overo-objs := overo.o
snd-soc-omap2evm-objs := omap2evm.o
snd-soc-omap3evm-objs := omap3evm.o snd-soc-omap3evm-objs := omap3evm.o
snd-soc-am3517evm-objs := am3517evm.o snd-soc-am3517evm-objs := am3517evm.o
snd-soc-sdp3430-objs := sdp3430.o snd-soc-sdp3430-objs := sdp3430.o
......
/*
* omap2evm.c -- SoC audio machine driver for omap2evm board
*
* Author: Arun KS <arunks@mistralsolutions.com>
*
* Based on sound/soc/omap/overo.c by Steve Sakoman
*
* 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.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA
*
*/
#include <linux/clk.h>
#include <linux/platform_device.h>
#include <sound/core.h>
#include <sound/pcm.h>
#include <sound/soc.h>
#include <asm/mach-types.h>
#include <mach/hardware.h>
#include <mach/gpio.h>
#include <plat/mcbsp.h>
#include "omap-mcbsp.h"
#include "omap-pcm.h"
static int omap2evm_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *params)
{
struct snd_soc_pcm_runtime *rtd = substream->private_data;
struct snd_soc_dai *codec_dai = rtd->codec_dai;
struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
int ret;
/* Set codec DAI configuration */
ret = snd_soc_dai_set_fmt(codec_dai,
SND_SOC_DAIFMT_I2S |
SND_SOC_DAIFMT_NB_NF |
SND_SOC_DAIFMT_CBM_CFM);
if (ret < 0) {
printk(KERN_ERR "can't set codec DAI configuration\n");
return ret;
}
/* Set cpu DAI configuration */
ret = snd_soc_dai_set_fmt(cpu_dai,
SND_SOC_DAIFMT_I2S |
SND_SOC_DAIFMT_NB_NF |
SND_SOC_DAIFMT_CBM_CFM);
if (ret < 0) {
printk(KERN_ERR "can't set cpu DAI configuration\n");
return ret;
}
/* Set the codec system clock for DAC and ADC */
ret = snd_soc_dai_set_sysclk(codec_dai, 0, 26000000,
SND_SOC_CLOCK_IN);
if (ret < 0) {
printk(KERN_ERR "can't set codec system clock\n");
return ret;
}
return 0;
}
static struct snd_soc_ops omap2evm_ops = {
.hw_params = omap2evm_hw_params,
};
/* Digital audio interface glue - connects codec <--> CPU */
static struct snd_soc_dai_link omap2evm_dai = {
.name = "TWL4030",
.stream_name = "TWL4030",
.cpu_dai_name = "omap-mcbsp-dai.1",
.codec_dai_name = "twl4030-hifi",
.platform_name = "omap-pcm-audio",
.codec_name = "twl4030-codec",
.ops = &omap2evm_ops,
};
/* Audio machine driver */
static struct snd_soc_card snd_soc_omap2evm = {
.name = "omap2evm",
.dai_link = &omap2evm_dai,
.num_links = 1,
};
static struct platform_device *omap2evm_snd_device;
static int __init omap2evm_soc_init(void)
{
int ret;
if (!machine_is_omap2evm())
return -ENODEV;
printk(KERN_INFO "omap2evm SoC init\n");
omap2evm_snd_device = platform_device_alloc("soc-audio", -1);
if (!omap2evm_snd_device) {
printk(KERN_ERR "Platform device allocation failed\n");
return -ENOMEM;
}
platform_set_drvdata(omap2evm_snd_device, &snd_soc_omap2evm);
ret = platform_device_add(omap2evm_snd_device);
if (ret)
goto err1;
return 0;
err1:
printk(KERN_ERR "Unable to add platform device\n");
platform_device_put(omap2evm_snd_device);
return ret;
}
module_init(omap2evm_soc_init);
static void __exit omap2evm_soc_exit(void)
{
platform_device_unregister(omap2evm_snd_device);
}
module_exit(omap2evm_soc_exit);
MODULE_AUTHOR("Arun KS <arunks@mistralsolutions.com>");
MODULE_DESCRIPTION("ALSA SoC omap2evm");
MODULE_LICENSE("GPL");
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment