Merge branches 'devel-fixes', 'devel-cleanup' and 'devel-genirq' into for-next
This commit is contained in:
Коммит
b08827f4c7
|
@ -191,8 +191,8 @@
|
|||
<para>
|
||||
Whenever an interrupt triggers, the lowlevel arch code calls into
|
||||
the generic interrupt code by calling desc->handle_irq().
|
||||
This highlevel IRQ handling function only uses desc->chip primitives
|
||||
referenced by the assigned chip descriptor structure.
|
||||
This highlevel IRQ handling function only uses desc->irq_data.chip
|
||||
primitives referenced by the assigned chip descriptor structure.
|
||||
</para>
|
||||
</sect1>
|
||||
<sect1 id="Highlevel_Driver_API">
|
||||
|
@ -206,11 +206,11 @@
|
|||
<listitem><para>enable_irq()</para></listitem>
|
||||
<listitem><para>disable_irq_nosync() (SMP only)</para></listitem>
|
||||
<listitem><para>synchronize_irq() (SMP only)</para></listitem>
|
||||
<listitem><para>set_irq_type()</para></listitem>
|
||||
<listitem><para>set_irq_wake()</para></listitem>
|
||||
<listitem><para>set_irq_data()</para></listitem>
|
||||
<listitem><para>set_irq_chip()</para></listitem>
|
||||
<listitem><para>set_irq_chip_data()</para></listitem>
|
||||
<listitem><para>irq_set_irq_type()</para></listitem>
|
||||
<listitem><para>irq_set_irq_wake()</para></listitem>
|
||||
<listitem><para>irq_set_handler_data()</para></listitem>
|
||||
<listitem><para>irq_set_chip()</para></listitem>
|
||||
<listitem><para>irq_set_chip_data()</para></listitem>
|
||||
</itemizedlist>
|
||||
See the autogenerated function documentation for details.
|
||||
</para>
|
||||
|
@ -225,6 +225,8 @@
|
|||
<listitem><para>handle_fasteoi_irq</para></listitem>
|
||||
<listitem><para>handle_simple_irq</para></listitem>
|
||||
<listitem><para>handle_percpu_irq</para></listitem>
|
||||
<listitem><para>handle_edge_eoi_irq</para></listitem>
|
||||
<listitem><para>handle_bad_irq</para></listitem>
|
||||
</itemizedlist>
|
||||
The interrupt flow handlers (either predefined or architecture
|
||||
specific) are assigned to specific interrupts by the architecture
|
||||
|
@ -241,13 +243,13 @@
|
|||
<programlisting>
|
||||
default_enable(struct irq_data *data)
|
||||
{
|
||||
desc->chip->irq_unmask(data);
|
||||
desc->irq_data.chip->irq_unmask(data);
|
||||
}
|
||||
|
||||
default_disable(struct irq_data *data)
|
||||
{
|
||||
if (!delay_disable(data))
|
||||
desc->chip->irq_mask(data);
|
||||
desc->irq_data.chip->irq_mask(data);
|
||||
}
|
||||
|
||||
default_ack(struct irq_data *data)
|
||||
|
@ -284,9 +286,9 @@ noop(struct irq_data *data))
|
|||
<para>
|
||||
The following control flow is implemented (simplified excerpt):
|
||||
<programlisting>
|
||||
desc->chip->irq_mask();
|
||||
handle_IRQ_event(desc->action);
|
||||
desc->chip->irq_unmask();
|
||||
desc->irq_data.chip->irq_mask_ack();
|
||||
handle_irq_event(desc->action);
|
||||
desc->irq_data.chip->irq_unmask();
|
||||
</programlisting>
|
||||
</para>
|
||||
</sect3>
|
||||
|
@ -300,8 +302,8 @@ desc->chip->irq_unmask();
|
|||
<para>
|
||||
The following control flow is implemented (simplified excerpt):
|
||||
<programlisting>
|
||||
handle_IRQ_event(desc->action);
|
||||
desc->chip->irq_eoi();
|
||||
handle_irq_event(desc->action);
|
||||
desc->irq_data.chip->irq_eoi();
|
||||
</programlisting>
|
||||
</para>
|
||||
</sect3>
|
||||
|
@ -315,17 +317,17 @@ desc->chip->irq_eoi();
|
|||
The following control flow is implemented (simplified excerpt):
|
||||
<programlisting>
|
||||
if (desc->status & running) {
|
||||
desc->chip->irq_mask();
|
||||
desc->irq_data.chip->irq_mask_ack();
|
||||
desc->status |= pending | masked;
|
||||
return;
|
||||
}
|
||||
desc->chip->irq_ack();
|
||||
desc->irq_data.chip->irq_ack();
|
||||
desc->status |= running;
|
||||
do {
|
||||
if (desc->status & masked)
|
||||
desc->chip->irq_unmask();
|
||||
desc->irq_data.chip->irq_unmask();
|
||||
desc->status &= ~pending;
|
||||
handle_IRQ_event(desc->action);
|
||||
handle_irq_event(desc->action);
|
||||
} while (status & pending);
|
||||
desc->status &= ~running;
|
||||
</programlisting>
|
||||
|
@ -344,7 +346,7 @@ desc->status &= ~running;
|
|||
<para>
|
||||
The following control flow is implemented (simplified excerpt):
|
||||
<programlisting>
|
||||
handle_IRQ_event(desc->action);
|
||||
handle_irq_event(desc->action);
|
||||
</programlisting>
|
||||
</para>
|
||||
</sect3>
|
||||
|
@ -362,12 +364,29 @@ handle_IRQ_event(desc->action);
|
|||
<para>
|
||||
The following control flow is implemented (simplified excerpt):
|
||||
<programlisting>
|
||||
handle_IRQ_event(desc->action);
|
||||
if (desc->chip->irq_eoi)
|
||||
desc->chip->irq_eoi();
|
||||
if (desc->irq_data.chip->irq_ack)
|
||||
desc->irq_data.chip->irq_ack();
|
||||
handle_irq_event(desc->action);
|
||||
if (desc->irq_data.chip->irq_eoi)
|
||||
desc->irq_data.chip->irq_eoi();
|
||||
</programlisting>
|
||||
</para>
|
||||
</sect3>
|
||||
<sect3 id="EOI_Edge_IRQ_flow_handler">
|
||||
<title>EOI Edge IRQ flow handler</title>
|
||||
<para>
|
||||
handle_edge_eoi_irq provides an abnomination of the edge
|
||||
handler which is solely used to tame a badly wreckaged
|
||||
irq controller on powerpc/cell.
|
||||
</para>
|
||||
</sect3>
|
||||
<sect3 id="BAD_IRQ_flow_handler">
|
||||
<title>Bad IRQ flow handler</title>
|
||||
<para>
|
||||
handle_bad_irq is used for spurious interrupts which
|
||||
have no real handler assigned..
|
||||
</para>
|
||||
</sect3>
|
||||
</sect2>
|
||||
<sect2 id="Quirks_and_optimizations">
|
||||
<title>Quirks and optimizations</title>
|
||||
|
@ -410,6 +429,7 @@ if (desc->chip->irq_eoi)
|
|||
<listitem><para>irq_mask_ack() - Optional, recommended for performance</para></listitem>
|
||||
<listitem><para>irq_mask()</para></listitem>
|
||||
<listitem><para>irq_unmask()</para></listitem>
|
||||
<listitem><para>irq_eoi() - Optional, required for eoi flow handlers</para></listitem>
|
||||
<listitem><para>irq_retrigger() - Optional</para></listitem>
|
||||
<listitem><para>irq_set_type() - Optional</para></listitem>
|
||||
<listitem><para>irq_set_wake() - Optional</para></listitem>
|
||||
|
@ -424,32 +444,24 @@ if (desc->chip->irq_eoi)
|
|||
<chapter id="doirq">
|
||||
<title>__do_IRQ entry point</title>
|
||||
<para>
|
||||
The original implementation __do_IRQ() is an alternative entry
|
||||
point for all types of interrupts.
|
||||
The original implementation __do_IRQ() was an alternative entry
|
||||
point for all types of interrupts. It not longer exists.
|
||||
</para>
|
||||
<para>
|
||||
This handler turned out to be not suitable for all
|
||||
interrupt hardware and was therefore reimplemented with split
|
||||
functionality for egde/level/simple/percpu interrupts. This is not
|
||||
functionality for edge/level/simple/percpu interrupts. This is not
|
||||
only a functional optimization. It also shortens code paths for
|
||||
interrupts.
|
||||
</para>
|
||||
<para>
|
||||
To make use of the split implementation, replace the call to
|
||||
__do_IRQ by a call to desc->handle_irq() and associate
|
||||
the appropriate handler function to desc->handle_irq().
|
||||
In most cases the generic handler implementations should
|
||||
be sufficient.
|
||||
</para>
|
||||
</chapter>
|
||||
|
||||
<chapter id="locking">
|
||||
<title>Locking on SMP</title>
|
||||
<para>
|
||||
The locking of chip registers is up to the architecture that
|
||||
defines the chip primitives. There is a chip->lock field that can be used
|
||||
for serialization, but the generic layer does not touch it. The per-irq
|
||||
structure is protected via desc->lock, by the generic layer.
|
||||
defines the chip primitives. The per-irq structure is
|
||||
protected via desc->lock, by the generic layer.
|
||||
</para>
|
||||
</chapter>
|
||||
<chapter id="structs">
|
||||
|
|
|
@ -21,58 +21,22 @@ CONFIG_MODVERSIONS=y
|
|||
CONFIG_MODULE_SRCVERSION_ALL=y
|
||||
# CONFIG_BLK_DEV_BSG is not set
|
||||
CONFIG_ARCH_OMAP=y
|
||||
CONFIG_ARCH_OMAP2=y
|
||||
CONFIG_ARCH_OMAP3=y
|
||||
CONFIG_ARCH_OMAP4=y
|
||||
CONFIG_OMAP_RESET_CLOCKS=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_L1_CACHE_SHIFT=5
|
||||
CONFIG_ARM_ERRATA_411920=y
|
||||
CONFIG_NO_HZ=y
|
||||
CONFIG_HIGH_RES_TIMERS=y
|
||||
CONFIG_SMP=y
|
||||
CONFIG_NR_CPUS=2
|
||||
# CONFIG_LOCAL_TIMERS is not set
|
||||
CONFIG_AEABI=y
|
||||
CONFIG_LEDS=y
|
||||
CONFIG_ZBOOT_ROM_TEXT=0x0
|
||||
CONFIG_ZBOOT_ROM_BSS=0x0
|
||||
CONFIG_CMDLINE="root=/dev/mmcblk0p2 rootwait console=ttyO2,115200"
|
||||
CONFIG_KEXEC=y
|
||||
CONFIG_FPE_NWFPE=y
|
||||
CONFIG_VFP=y
|
||||
CONFIG_NEON=y
|
||||
CONFIG_BINFMT_MISC=y
|
||||
CONFIG_PM=y
|
||||
CONFIG_PM_DEBUG=y
|
||||
CONFIG_PM_RUNTIME=y
|
||||
CONFIG_NET=y
|
||||
CONFIG_PACKET=y
|
||||
CONFIG_UNIX=y
|
||||
|
@ -89,14 +53,6 @@ CONFIG_IP_PNP_RARP=y
|
|||
# CONFIG_IPV6 is not set
|
||||
CONFIG_NETFILTER=y
|
||||
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_H4=y
|
||||
CONFIG_BT_HCIUART_BCSP=y
|
||||
|
@ -107,11 +63,9 @@ CONFIG_CFG80211=m
|
|||
CONFIG_MAC80211=m
|
||||
CONFIG_MAC80211_RC_PID=y
|
||||
CONFIG_MAC80211_RC_DEFAULT_PID=y
|
||||
CONFIG_MAC80211_LEDS=y
|
||||
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
|
||||
CONFIG_CONNECTOR=y
|
||||
CONFIG_MTD=y
|
||||
CONFIG_MTD_CONCAT=y
|
||||
CONFIG_MTD_CMDLINE_PARTS=y
|
||||
CONFIG_MTD_CHAR=y
|
||||
CONFIG_MTD_BLOCK=y
|
||||
|
@ -127,7 +81,6 @@ CONFIG_MTD_UBI=y
|
|||
CONFIG_BLK_DEV_LOOP=y
|
||||
CONFIG_BLK_DEV_RAM=y
|
||||
CONFIG_BLK_DEV_RAM_SIZE=16384
|
||||
CONFIG_EEPROM_LEGACY=y
|
||||
CONFIG_SCSI=y
|
||||
CONFIG_BLK_DEV_SD=y
|
||||
CONFIG_SCSI_MULTI_LUN=y
|
||||
|
@ -158,19 +111,15 @@ CONFIG_TOUCHSCREEN_ADS7846=y
|
|||
CONFIG_INPUT_MISC=y
|
||||
CONFIG_INPUT_TWL4030_PWRBUTTON=y
|
||||
CONFIG_VT_HW_CONSOLE_BINDING=y
|
||||
CONFIG_SERIAL_8250=y
|
||||
CONFIG_SERIAL_8250_CONSOLE=y
|
||||
# CONFIG_LEGACY_PTYS is not set
|
||||
CONFIG_SERIAL_8250_NR_UARTS=32
|
||||
CONFIG_SERIAL_8250_EXTENDED=y
|
||||
CONFIG_SERIAL_8250_MANY_PORTS=y
|
||||
CONFIG_SERIAL_8250_SHARE_IRQ=y
|
||||
CONFIG_SERIAL_8250_DETECT_IRQ=y
|
||||
CONFIG_SERIAL_8250_RSA=y
|
||||
# CONFIG_LEGACY_PTYS is not set
|
||||
CONFIG_HW_RANDOM=y
|
||||
CONFIG_I2C=y
|
||||
CONFIG_I2C_CHARDEV=y
|
||||
CONFIG_I2C_OMAP=y
|
||||
CONFIG_SPI=y
|
||||
CONFIG_SPI_OMAP24XX=y
|
||||
CONFIG_DEBUG_GPIO=y
|
||||
|
@ -181,10 +130,6 @@ CONFIG_POWER_SUPPLY=y
|
|||
CONFIG_WATCHDOG=y
|
||||
CONFIG_OMAP_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_TPS65023=y
|
||||
CONFIG_REGULATOR_TPS6507X=y
|
||||
|
@ -208,7 +153,6 @@ CONFIG_BACKLIGHT_LCD_SUPPORT=y
|
|||
CONFIG_LCD_CLASS_DEVICE=y
|
||||
CONFIG_LCD_PLATFORM=y
|
||||
CONFIG_DISPLAY_SUPPORT=y
|
||||
# CONFIG_VGA_CONSOLE is not set
|
||||
CONFIG_FRAMEBUFFER_CONSOLE=y
|
||||
CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
|
||||
CONFIG_FONTS=y
|
||||
|
@ -217,25 +161,20 @@ CONFIG_FONT_8x16=y
|
|||
CONFIG_LOGO=y
|
||||
CONFIG_SOUND=m
|
||||
CONFIG_SND=m
|
||||
CONFIG_SND_MIXER_OSS=y
|
||||
CONFIG_SND_PCM_OSS=y
|
||||
CONFIG_SND_MIXER_OSS=m
|
||||
CONFIG_SND_PCM_OSS=m
|
||||
CONFIG_SND_VERBOSE_PRINTK=y
|
||||
CONFIG_SND_DEBUG=y
|
||||
CONFIG_SND_USB_AUDIO=y
|
||||
CONFIG_SND_SOC=y
|
||||
CONFIG_SND_OMAP_SOC=y
|
||||
CONFIG_SND_OMAP_SOC_OMAP3_PANDORA=y
|
||||
CONFIG_SND_USB_AUDIO=m
|
||||
CONFIG_SND_SOC=m
|
||||
CONFIG_SND_OMAP_SOC=m
|
||||
CONFIG_SND_OMAP_SOC_OMAP3_PANDORA=m
|
||||
CONFIG_USB=y
|
||||
CONFIG_USB_DEBUG=y
|
||||
CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
|
||||
CONFIG_USB_DEVICEFS=y
|
||||
CONFIG_USB_SUSPEND=y
|
||||
# CONFIG_USB_OTG_WHITELIST is not set
|
||||
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_STORAGE=y
|
||||
CONFIG_USB_LIBUSUAL=y
|
||||
|
@ -250,18 +189,12 @@ CONFIG_MMC_UNSAFE_RESUME=y
|
|||
CONFIG_SDIO_UART=y
|
||||
CONFIG_MMC_OMAP=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_DRV_TWL92330=y
|
||||
CONFIG_RTC_DRV_TWL4030=y
|
||||
CONFIG_EXT2_FS=y
|
||||
CONFIG_EXT3_FS=y
|
||||
# CONFIG_EXT3_FS_XATTR is not set
|
||||
CONFIG_INOTIFY=y
|
||||
CONFIG_QUOTA=y
|
||||
CONFIG_QFMT_V2=y
|
||||
CONFIG_MSDOS_FS=y
|
||||
|
@ -285,12 +218,10 @@ CONFIG_NLS_CODEPAGE_437=y
|
|||
CONFIG_NLS_ISO8859_1=y
|
||||
CONFIG_PRINTK_TIME=y
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_DEBUG_FS=y
|
||||
CONFIG_DEBUG_KERNEL=y
|
||||
CONFIG_SCHEDSTATS=y
|
||||
CONFIG_TIMER_STATS=y
|
||||
CONFIG_PROVE_LOCKING=y
|
||||
# CONFIG_LOCK_STAT is not set
|
||||
CONFIG_DEBUG_SPINLOCK_SLEEP=y
|
||||
# CONFIG_DEBUG_BUGVERBOSE is not set
|
||||
CONFIG_DEBUG_INFO=y
|
||||
|
|
|
@ -288,6 +288,7 @@ config MACH_IGEP0030
|
|||
depends on ARCH_OMAP3
|
||||
default y
|
||||
select OMAP_PACKAGE_CBB
|
||||
select MACH_IGEP0020
|
||||
|
||||
config MACH_SBC3530
|
||||
bool "OMAP3 SBC STALKER board"
|
||||
|
|
|
@ -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_IGEP0020) += board-igep0020.o \
|
||||
hsmmc.o
|
||||
obj-$(CONFIG_MACH_IGEP0030) += board-igep0030.o \
|
||||
hsmmc.o
|
||||
obj-$(CONFIG_MACH_OMAP3_TOUCHBOOK) += board-omap3touchbook.o \
|
||||
hsmmc.o
|
||||
obj-$(CONFIG_MACH_OMAP_4430SDP) += board-4430sdp.o \
|
||||
|
@ -270,3 +268,5 @@ obj-$(CONFIG_ARCH_OMAP4) += hwspinlock.o
|
|||
|
||||
disp-$(CONFIG_OMAP2_DSS) := display.o
|
||||
obj-y += $(disp-m) $(disp-y)
|
||||
|
||||
obj-y += common-board-devices.o
|
||||
|
|
|
@ -41,6 +41,7 @@
|
|||
|
||||
#include "mux.h"
|
||||
#include "hsmmc.h"
|
||||
#include "common-board-devices.h"
|
||||
|
||||
#define SDP2430_CS0_BASE 0x04000000
|
||||
#define SECONDARY_LCD_GPIO 147
|
||||
|
@ -180,15 +181,6 @@ static struct twl4030_platform_data sdp2430_twldata = {
|
|||
.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[] = {
|
||||
{
|
||||
I2C_BOARD_INFO("isp1301_omap", 0x2D),
|
||||
|
@ -201,8 +193,7 @@ static int __init omap2430_i2c_init(void)
|
|||
{
|
||||
omap_register_i2c_bus(1, 100, sdp2430_i2c1_boardinfo,
|
||||
ARRAY_SIZE(sdp2430_i2c1_boardinfo));
|
||||
omap_register_i2c_bus(2, 2600, sdp2430_i2c_boardinfo,
|
||||
ARRAY_SIZE(sdp2430_i2c_boardinfo));
|
||||
omap2_pmic_init("twl4030", &sdp2430_twldata);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -217,11 +208,6 @@ static struct omap2_hsmmc_info mmc[] __initdata = {
|
|||
{} /* 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 = {
|
||||
.otg = 1,
|
||||
#ifdef CONFIG_USB_GADGET_OMAP
|
||||
|
@ -240,8 +226,6 @@ static struct omap_board_mux board_mux[] __initdata = {
|
|||
|
||||
static void __init omap_2430sdp_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
omap2430_mux_init(board_mux, OMAP_PACKAGE_ZAC);
|
||||
|
||||
omap_board_config = sdp2430_config;
|
||||
|
@ -255,14 +239,13 @@ static void __init omap_2430sdp_init(void)
|
|||
omap2_usbfs_init(&sdp2430_usb_config);
|
||||
|
||||
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();
|
||||
|
||||
/* Turn off secondary LCD backlight */
|
||||
ret = gpio_request(SECONDARY_LCD_GPIO, "Secondary LCD backlight");
|
||||
if (ret == 0)
|
||||
gpio_direction_output(SECONDARY_LCD_GPIO, 0);
|
||||
gpio_request_one(SECONDARY_LCD_GPIO, GPIOF_OUT_INIT_LOW,
|
||||
"Secondary LCD backlight");
|
||||
}
|
||||
|
||||
static void __init omap_2430sdp_map_io(void)
|
||||
|
|
|
@ -19,7 +19,6 @@
|
|||
#include <linux/input.h>
|
||||
#include <linux/input/matrix_keypad.h>
|
||||
#include <linux/spi/spi.h>
|
||||
#include <linux/spi/ads7846.h>
|
||||
#include <linux/i2c/twl.h>
|
||||
#include <linux/regulator/machine.h>
|
||||
#include <linux/io.h>
|
||||
|
@ -48,6 +47,7 @@
|
|||
#include "hsmmc.h"
|
||||
#include "pm.h"
|
||||
#include "control.h"
|
||||
#include "common-board-devices.h"
|
||||
|
||||
#define CONFIG_DISABLE_HFCLK 1
|
||||
|
||||
|
@ -123,63 +123,14 @@ static struct twl4030_keypad_data sdp3430_kp_data = {
|
|||
.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_ENABLE_GPIO 5
|
||||
|
||||
static unsigned backlight_gpio;
|
||||
static unsigned enable_gpio;
|
||||
static struct gpio sdp3430_dss_gpios[] __initdata = {
|
||||
{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 dvi_enabled;
|
||||
|
||||
|
@ -187,29 +138,11 @@ static void __init sdp3430_display_init(void)
|
|||
{
|
||||
int r;
|
||||
|
||||
enable_gpio = SDP3430_LCD_PANEL_ENABLE_GPIO;
|
||||
backlight_gpio = SDP3430_LCD_PANEL_BACKLIGHT_GPIO;
|
||||
r = gpio_request_array(sdp3430_dss_gpios,
|
||||
ARRAY_SIZE(sdp3430_dss_gpios));
|
||||
if (r)
|
||||
printk(KERN_ERR "failed to get LCD control GPIOs\n");
|
||||
|
||||
r = gpio_request(enable_gpio, "LCD reset");
|
||||
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)
|
||||
|
@ -219,8 +152,8 @@ static int sdp3430_panel_enable_lcd(struct omap_dss_device *dssdev)
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
gpio_direction_output(enable_gpio, 1);
|
||||
gpio_direction_output(backlight_gpio, 1);
|
||||
gpio_direction_output(SDP3430_LCD_PANEL_ENABLE_GPIO, 1);
|
||||
gpio_direction_output(SDP3430_LCD_PANEL_BACKLIGHT_GPIO, 1);
|
||||
|
||||
lcd_enabled = 1;
|
||||
|
||||
|
@ -231,8 +164,8 @@ static void sdp3430_panel_disable_lcd(struct omap_dss_device *dssdev)
|
|||
{
|
||||
lcd_enabled = 0;
|
||||
|
||||
gpio_direction_output(enable_gpio, 0);
|
||||
gpio_direction_output(backlight_gpio, 0);
|
||||
gpio_direction_output(SDP3430_LCD_PANEL_ENABLE_GPIO, 0);
|
||||
gpio_direction_output(SDP3430_LCD_PANEL_BACKLIGHT_GPIO, 0);
|
||||
}
|
||||
|
||||
static int sdp3430_panel_enable_dvi(struct omap_dss_device *dssdev)
|
||||
|
@ -360,12 +293,10 @@ static int sdp3430_twl_gpio_setup(struct device *dev,
|
|||
omap2_hsmmc_init(mmc);
|
||||
|
||||
/* gpio + 7 is "sub_lcd_en_bkl" (output/PWM1) */
|
||||
gpio_request(gpio + 7, "sub_lcd_en_bkl");
|
||||
gpio_direction_output(gpio + 7, 0);
|
||||
gpio_request_one(gpio + 7, GPIOF_OUT_INIT_LOW, "sub_lcd_en_bkl");
|
||||
|
||||
/* gpio + 15 is "sub_lcd_nRST" (output) */
|
||||
gpio_request(gpio + 15, "sub_lcd_nRST");
|
||||
gpio_direction_output(gpio + 15, 0);
|
||||
gpio_request_one(gpio + 15, GPIOF_OUT_INIT_LOW, "sub_lcd_nRST");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -580,20 +511,10 @@ static struct twl4030_platform_data sdp3430_twldata = {
|
|||
.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)
|
||||
{
|
||||
/* i2c1 for PMIC only */
|
||||
omap_register_i2c_bus(1, 2600, sdp3430_i2c_boardinfo,
|
||||
ARRAY_SIZE(sdp3430_i2c_boardinfo));
|
||||
omap3_pmic_init("twl4030", &sdp3430_twldata);
|
||||
/* i2c2 on camera connector (for sensor control) and optional isp1301 */
|
||||
omap_register_i2c_bus(2, 400, NULL, 0);
|
||||
/* i2c3 on display connector (for DVI, tfp410) */
|
||||
|
@ -872,14 +793,10 @@ 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)
|
||||
{
|
||||
int gpio_pendown;
|
||||
|
||||
omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);
|
||||
omap_board_config = sdp3430_config;
|
||||
omap_board_config_size = ARRAY_SIZE(sdp3430_config);
|
||||
|
@ -887,15 +804,12 @@ static void __init omap_3430sdp_init(void)
|
|||
omap3430_i2c_init();
|
||||
omap_display_init(&sdp3430_dss_data);
|
||||
if (omap_rev() > OMAP3430_REV_ES1_0)
|
||||
ts_gpio = SDP3430_TS_GPIO_IRQ_SDPV2;
|
||||
gpio_pendown = SDP3430_TS_GPIO_IRQ_SDPV2;
|
||||
else
|
||||
ts_gpio = SDP3430_TS_GPIO_IRQ_SDPV1;
|
||||
sdp3430_spi_board_info[0].irq = gpio_to_irq(ts_gpio);
|
||||
spi_register_board_info(sdp3430_spi_board_info,
|
||||
ARRAY_SIZE(sdp3430_spi_board_info));
|
||||
ads7846_dev_init();
|
||||
gpio_pendown = SDP3430_TS_GPIO_IRQ_SDPV1;
|
||||
omap_ads7846_init(1, gpio_pendown, 310, NULL);
|
||||
board_serial_init();
|
||||
usb_musb_init(&musb_board_data);
|
||||
usb_musb_init(NULL);
|
||||
board_smc91x_init();
|
||||
board_flash_init(sdp_flash_partitions, chip_sel_3430, 0);
|
||||
sdp3430_display_init();
|
||||
|
|
|
@ -42,6 +42,7 @@
|
|||
#include "hsmmc.h"
|
||||
#include "timer-gp.h"
|
||||
#include "control.h"
|
||||
#include "common-board-devices.h"
|
||||
|
||||
#define ETH_KS8851_IRQ 34
|
||||
#define ETH_KS8851_POWER_ON 48
|
||||
|
@ -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)
|
||||
{
|
||||
int status;
|
||||
|
||||
/* 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;
|
||||
}
|
||||
|
||||
|
@ -575,14 +540,6 @@ static struct twl4030_platform_data sdp4430_twldata = {
|
|||
.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[] = {
|
||||
{
|
||||
I2C_BOARD_INFO("tmp105", 0x48),
|
||||
|
@ -598,12 +555,7 @@ static struct i2c_board_info __initdata sdp4430_i2c_4_boardinfo[] = {
|
|||
};
|
||||
static int __init omap4_i2c_init(void)
|
||||
{
|
||||
/*
|
||||
* 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));
|
||||
omap4_pmic_init("twl6030", &sdp4430_twldata);
|
||||
omap_register_i2c_bus(2, 400, NULL, 0);
|
||||
omap_register_i2c_bus(3, 400, sdp4430_i2c_3_boardinfo,
|
||||
ARRAY_SIZE(sdp4430_i2c_3_boardinfo));
|
||||
|
@ -614,21 +566,13 @@ static int __init omap4_i2c_init(void)
|
|||
|
||||
static void __init omap_sfh7741prox_init(void)
|
||||
{
|
||||
int error;
|
||||
int error;
|
||||
|
||||
error = gpio_request(OMAP4_SFH7741_ENABLE_GPIO, "sfh7741");
|
||||
if (error < 0) {
|
||||
error = gpio_request_one(OMAP4_SFH7741_ENABLE_GPIO,
|
||||
GPIOF_OUT_INIT_LOW, "sfh7741");
|
||||
if (error < 0)
|
||||
pr_err("%s:failed to request GPIO %d, error %d\n",
|
||||
__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)
|
||||
|
@ -645,27 +589,19 @@ static void sdp4430_hdmi_mux_init(void)
|
|||
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)
|
||||
{
|
||||
int status;
|
||||
|
||||
status = gpio_request_one(HDMI_GPIO_HPD, GPIOF_OUT_INIT_HIGH,
|
||||
"hdmi_gpio_hpd");
|
||||
if (status) {
|
||||
pr_err("Cannot request GPIO %d\n", HDMI_GPIO_HPD);
|
||||
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);
|
||||
status = gpio_request_array(sdp4430_hdmi_gpios,
|
||||
ARRAY_SIZE(sdp4430_hdmi_gpios));
|
||||
if (status)
|
||||
pr_err("%s: Cannot request HDMI GPIOs\n", __func__);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
|
|
@ -89,19 +89,13 @@ static void __init am3517_crane_init(void)
|
|||
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) {
|
||||
pr_err("Can not request GPIO %d\n", GPIO_USB_POWER);
|
||||
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);
|
||||
}
|
||||
|
||||
|
|
|
@ -174,19 +174,14 @@ static void __init am3517_evm_rtc_init(void)
|
|||
int r;
|
||||
|
||||
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) {
|
||||
printk(KERN_WARNING "failed to request GPIO#%d\n",
|
||||
GPIO_RTCS35390A_IRQ);
|
||||
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);
|
||||
}
|
||||
|
||||
|
@ -242,6 +237,15 @@ static int dvi_enabled;
|
|||
|
||||
#if defined(CONFIG_PANEL_SHARP_LQ043T1DG01) || \
|
||||
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)
|
||||
{
|
||||
int r;
|
||||
|
@ -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_BKLIGHT_PWR, OMAP_PIN_INPUT_PULLDOWN);
|
||||
omap_mux_init_gpio(LCD_PANEL_PWM, OMAP_PIN_INPUT_PULLDOWN);
|
||||
/*
|
||||
* Enable GPIO 182 = LCD Backlight Power
|
||||
*/
|
||||
r = gpio_request(LCD_PANEL_BKLIGHT_PWR, "lcd_backlight_pwr");
|
||||
|
||||
r = gpio_request_array(am3517_evm_dss_gpios,
|
||||
ARRAY_SIZE(am3517_evm_dss_gpios));
|
||||
if (r) {
|
||||
printk(KERN_ERR "failed to get lcd_backlight_pwr\n");
|
||||
printk(KERN_ERR "failed to get DSS panel control GPIOs\n");
|
||||
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");
|
||||
return;
|
||||
|
||||
err_2:
|
||||
gpio_free(LCD_PANEL_PWM);
|
||||
err_1:
|
||||
gpio_free(LCD_PANEL_BKLIGHT_PWR);
|
||||
}
|
||||
#else
|
||||
static void __init am3517_evm_display_init(void) {}
|
||||
|
|
|
@ -202,6 +202,7 @@ static inline void __init apollon_init_smc91x(void)
|
|||
unsigned int rate;
|
||||
struct clk *gpmc_fck;
|
||||
int eth_cs;
|
||||
int err;
|
||||
|
||||
gpmc_fck = clk_get(NULL, "gpmc_fck"); /* Always on ENABLE_ON_INIT */
|
||||
if (IS_ERR(gpmc_fck)) {
|
||||
|
@ -245,15 +246,13 @@ static inline void __init apollon_init_smc91x(void)
|
|||
apollon_smc91x_resources[0].end = base + 0x30f;
|
||||
udelay(100);
|
||||
|
||||
omap_mux_init_gpio(74, 0);
|
||||
if (gpio_request(APOLLON_ETHR_GPIO_IRQ, "SMC91x irq") < 0) {
|
||||
omap_mux_init_gpio(APOLLON_ETHR_GPIO_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",
|
||||
APOLLON_ETHR_GPIO_IRQ);
|
||||
gpmc_cs_free(APOLLON_ETH_CS);
|
||||
goto out;
|
||||
}
|
||||
gpio_direction_input(APOLLON_ETHR_GPIO_IRQ);
|
||||
|
||||
out:
|
||||
clk_disable(gpmc_fck);
|
||||
clk_put(gpmc_fck);
|
||||
|
@ -280,20 +279,19 @@ static void __init omap_apollon_init_early(void)
|
|||
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)
|
||||
{
|
||||
/* LED0 - AA10 */
|
||||
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);
|
||||
gpio_request(LED1_GPIO14, "LED1");
|
||||
gpio_direction_output(LED1_GPIO14, 0);
|
||||
/* LED2 - AA4 */
|
||||
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)
|
||||
|
@ -301,8 +299,7 @@ static void __init apollon_usb_init(void)
|
|||
/* USB device */
|
||||
/* DEVICE_SUSPEND */
|
||||
omap_mux_init_signal("mcbsp2_clkx.gpio_12", 0);
|
||||
gpio_request(12, "USB suspend");
|
||||
gpio_direction_output(12, 0);
|
||||
gpio_request_one(12, GPIOF_OUT_INIT_LOW, "USB suspend");
|
||||
omap2_usbfs_init(&apollon_usb_config);
|
||||
}
|
||||
|
||||
|
|
|
@ -54,6 +54,7 @@
|
|||
#include "mux.h"
|
||||
#include "sdram-micron-mt46h32m32lf-6.h"
|
||||
#include "hsmmc.h"
|
||||
#include "common-board-devices.h"
|
||||
|
||||
#define CM_T35_GPIO_PENDOWN 57
|
||||
|
||||
|
@ -66,86 +67,28 @@
|
|||
|
||||
#if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE)
|
||||
#include <linux/smsc911x.h>
|
||||
#include <plat/gpmc-smsc911x.h>
|
||||
|
||||
static struct smsc911x_platform_config cm_t35_smsc911x_config = {
|
||||
.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",
|
||||
static struct omap_smsc911x_platform_data cm_t35_smsc911x_cfg = {
|
||||
.id = 0,
|
||||
.num_resources = ARRAY_SIZE(cm_t35_smsc911x_resources),
|
||||
.resource = cm_t35_smsc911x_resources,
|
||||
.dev = {
|
||||
.platform_data = &cm_t35_smsc911x_config,
|
||||
},
|
||||
.cs = CM_T35_SMSC911X_CS,
|
||||
.gpio_irq = CM_T35_SMSC911X_GPIO,
|
||||
.gpio_reset = -EINVAL,
|
||||
.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 = {
|
||||
.name = "smsc911x",
|
||||
static struct omap_smsc911x_platform_data sb_t35_smsc911x_cfg = {
|
||||
.id = 1,
|
||||
.num_resources = ARRAY_SIZE(sb_t35_smsc911x_resources),
|
||||
.resource = sb_t35_smsc911x_resources,
|
||||
.dev = {
|
||||
.platform_data = &cm_t35_smsc911x_config,
|
||||
},
|
||||
.cs = SB_T35_SMSC911X_CS,
|
||||
.gpio_irq = SB_T35_SMSC911X_GPIO,
|
||||
.gpio_reset = -EINVAL,
|
||||
.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)
|
||||
{
|
||||
cm_t35_init_smsc911x(&cm_t35_smsc911x_device,
|
||||
CM_T35_SMSC911X_CS, CM_T35_SMSC911X_GPIO);
|
||||
cm_t35_init_smsc911x(&sb_t35_smsc911x_device,
|
||||
SB_T35_SMSC911X_CS, SB_T35_SMSC911X_GPIO);
|
||||
gpmc_smsc911x_init(&cm_t35_smsc911x_cfg);
|
||||
gpmc_smsc911x_init(&sb_t35_smsc911x_cfg);
|
||||
}
|
||||
#else
|
||||
static inline void __init cm_t35_init_ethernet(void) { return; }
|
||||
|
@ -235,69 +178,10 @@ static void __init cm_t35_init_nand(void)
|
|||
static inline void cm_t35_init_nand(void) {}
|
||||
#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_BL_GPIO 58
|
||||
#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 dvi_enabled;
|
||||
|
||||
|
@ -308,8 +192,8 @@ static int cm_t35_panel_enable_lcd(struct omap_dss_device *dssdev)
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
gpio_set_value(lcd_en_gpio, 1);
|
||||
gpio_set_value(lcd_bl_gpio, 1);
|
||||
gpio_set_value(CM_T35_LCD_EN_GPIO, 1);
|
||||
gpio_set_value(CM_T35_LCD_BL_GPIO, 1);
|
||||
|
||||
lcd_enabled = 1;
|
||||
|
||||
|
@ -320,8 +204,8 @@ static void cm_t35_panel_disable_lcd(struct omap_dss_device *dssdev)
|
|||
{
|
||||
lcd_enabled = 0;
|
||||
|
||||
gpio_set_value(lcd_bl_gpio, 0);
|
||||
gpio_set_value(lcd_en_gpio, 0);
|
||||
gpio_set_value(CM_T35_LCD_BL_GPIO, 0);
|
||||
gpio_set_value(CM_T35_LCD_EN_GPIO, 0);
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
gpio_set_value(dvi_en_gpio, 0);
|
||||
gpio_set_value(CM_T35_DVI_EN_GPIO, 0);
|
||||
dvi_enabled = 1;
|
||||
|
||||
return 0;
|
||||
|
@ -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)
|
||||
{
|
||||
gpio_set_value(dvi_en_gpio, 1);
|
||||
gpio_set_value(CM_T35_DVI_EN_GPIO, 1);
|
||||
dvi_enabled = 0;
|
||||
}
|
||||
|
||||
|
@ -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)
|
||||
{
|
||||
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,
|
||||
ARRAY_SIZE(cm_t35_lcd_spi_board_info));
|
||||
|
||||
err = gpio_request(lcd_en_gpio, "LCD RST");
|
||||
err = gpio_request_array(cm_t35_dss_gpios,
|
||||
ARRAY_SIZE(cm_t35_dss_gpios));
|
||||
if (err) {
|
||||
pr_err("CM-T35: failed to get LCD reset GPIO\n");
|
||||
goto out;
|
||||
pr_err("CM-T35: failed to request DSS control GPIOs\n");
|
||||
return;
|
||||
}
|
||||
|
||||
err = gpio_request(lcd_bl_gpio, "LCD BL");
|
||||
if (err) {
|
||||
pr_err("CM-T35: failed to get LCD backlight control GPIO\n");
|
||||
goto err_lcd_bl;
|
||||
}
|
||||
|
||||
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(lcd_bl_gpio, 0);
|
||||
gpio_export(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);
|
||||
gpio_export(CM_T35_LCD_EN_GPIO, 0);
|
||||
gpio_export(CM_T35_LCD_BL_GPIO, 0);
|
||||
gpio_export(CM_T35_DVI_EN_GPIO, 0);
|
||||
|
||||
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);
|
||||
if (err) {
|
||||
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 = {
|
||||
|
@ -609,10 +469,8 @@ static int cm_t35_twl_gpio_setup(struct device *dev, unsigned gpio,
|
|||
{
|
||||
int wlan_rst = gpio + 2;
|
||||
|
||||
if ((gpio_request(wlan_rst, "WLAN RST") == 0) &&
|
||||
(gpio_direction_output(wlan_rst, 1) == 0)) {
|
||||
if (gpio_request_one(wlan_rst, GPIOF_OUT_INIT_HIGH, "WLAN RST") == 0) {
|
||||
gpio_export(wlan_rst, 0);
|
||||
|
||||
udelay(10);
|
||||
gpio_set_value(wlan_rst, 0);
|
||||
udelay(10);
|
||||
|
@ -653,19 +511,9 @@ static struct twl4030_platform_data cm_t35_twldata = {
|
|||
.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)
|
||||
{
|
||||
omap_register_i2c_bus(1, 2600, cm_t35_i2c_boardinfo,
|
||||
ARRAY_SIZE(cm_t35_i2c_boardinfo));
|
||||
omap3_pmic_init("tps65930", &cm_t35_twldata);
|
||||
}
|
||||
|
||||
static void __init cm_t35_init_early(void)
|
||||
|
@ -775,12 +623,6 @@ static struct omap_board_mux board_mux[] __initdata = {
|
|||
};
|
||||
#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 = {
|
||||
};
|
||||
|
||||
|
@ -792,12 +634,12 @@ static void __init cm_t35_init(void)
|
|||
omap_serial_init();
|
||||
cm_t35_init_i2c();
|
||||
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_led();
|
||||
cm_t35_init_display();
|
||||
|
||||
usb_musb_init(&musb_board_data);
|
||||
usb_musb_init(NULL);
|
||||
usbhs_init(&usbhs_bdata);
|
||||
}
|
||||
|
||||
|
|
|
@ -148,14 +148,13 @@ static void __init cm_t3517_init_rtc(void)
|
|||
{
|
||||
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) {
|
||||
pr_err("CM-T3517: rtc cs en gpio request failed: %d\n", err);
|
||||
return;
|
||||
}
|
||||
|
||||
gpio_direction_output(RTC_CS_EN_GPIO, 1);
|
||||
|
||||
platform_device_register(&cm_t3517_rtc_device);
|
||||
}
|
||||
#else
|
||||
|
@ -182,11 +181,11 @@ static int cm_t3517_init_usbh(void)
|
|||
{
|
||||
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) {
|
||||
pr_err("CM-T3517: usb hub rst gpio request failed: %d\n", err);
|
||||
} else {
|
||||
gpio_direction_output(USB_HUB_RESET_GPIO, 0);
|
||||
udelay(10);
|
||||
gpio_set_value(USB_HUB_RESET_GPIO, 1);
|
||||
msleep(1);
|
||||
|
|
|
@ -51,7 +51,6 @@
|
|||
#include <plat/mcspi.h>
|
||||
#include <linux/input/matrix_keypad.h>
|
||||
#include <linux/spi/spi.h>
|
||||
#include <linux/spi/ads7846.h>
|
||||
#include <linux/dm9000.h>
|
||||
#include <linux/interrupt.h>
|
||||
|
||||
|
@ -60,6 +59,7 @@
|
|||
#include "mux.h"
|
||||
#include "hsmmc.h"
|
||||
#include "timer-gp.h"
|
||||
#include "common-board-devices.h"
|
||||
|
||||
#define NAND_BLOCK_SIZE SZ_128K
|
||||
|
||||
|
@ -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[] = {
|
||||
{
|
||||
.mmc = 1,
|
||||
|
@ -249,7 +242,7 @@ static int devkit8000_twl_gpio_setup(struct device *dev,
|
|||
/* TWL4030_GPIO_MAX + 0 is "LCD_PWREN" (out, active high) */
|
||||
devkit8000_lcd_device.reset_gpio = gpio + TWL4030_GPIO_MAX + 0;
|
||||
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) {
|
||||
devkit8000_lcd_device.reset_gpio = -EINVAL;
|
||||
printk(KERN_ERR "Failed to request GPIO for LCD_PWRN\n");
|
||||
|
@ -258,7 +251,7 @@ static int devkit8000_twl_gpio_setup(struct device *dev,
|
|||
/* gpio + 7 is "DVI_PD" (out, active low) */
|
||||
devkit8000_dvi_device.reset_gpio = gpio + 7;
|
||||
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) {
|
||||
devkit8000_dvi_device.reset_gpio = -EINVAL;
|
||||
printk(KERN_ERR "Failed to request GPIO for DVI PowerDown\n");
|
||||
|
@ -366,19 +359,9 @@ static struct twl4030_platform_data devkit8000_twldata = {
|
|||
.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)
|
||||
{
|
||||
omap_register_i2c_bus(1, 2600, devkit8000_i2c_boardinfo,
|
||||
ARRAY_SIZE(devkit8000_i2c_boardinfo));
|
||||
omap3_pmic_init("tps65930", &devkit8000_twldata);
|
||||
/* Bus 3 is attached to the DVI port where devices like the pico DLP
|
||||
* projector don't work reliably with 400kHz */
|
||||
omap_register_i2c_bus(3, 400, NULL, 0);
|
||||
|
@ -463,56 +446,6 @@ static void __init devkit8000_init_irq(void)
|
|||
#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
|
||||
|
||||
static struct resource omap_dm9000_resources[] = {
|
||||
|
@ -550,14 +483,14 @@ static void __init omap_dm9000_init(void)
|
|||
{
|
||||
unsigned char *eth_addr = omap_dm9000_platdata.dev_addr;
|
||||
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",
|
||||
OMAP_DM9000_GPIO_IRQ);
|
||||
return;
|
||||
}
|
||||
|
||||
gpio_direction_input(OMAP_DM9000_GPIO_IRQ);
|
||||
}
|
||||
|
||||
/* init the mac address using DIE id */
|
||||
omap_get_die_id(&odi);
|
||||
|
@ -576,45 +509,6 @@ static struct platform_device *devkit8000_devices[] __initdata = {
|
|||
&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 = {
|
||||
|
||||
.port_mode[0] = OMAP_EHCI_PORT_MODE_PHY,
|
||||
|
@ -795,14 +689,13 @@ static void __init devkit8000_init(void)
|
|||
ARRAY_SIZE(devkit8000_devices));
|
||||
|
||||
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);
|
||||
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 */
|
||||
omap_mux_init_signal("sdrc_cke0", OMAP_PIN_OUTPUT);
|
||||
|
|
|
@ -38,6 +38,7 @@
|
|||
#include "mux.h"
|
||||
#include "hsmmc.h"
|
||||
#include "sdram-numonyx-m65kxxxxam.h"
|
||||
#include "common-board-devices.h"
|
||||
|
||||
#define IGEP2_SMSC911X_CS 5
|
||||
#define IGEP2_SMSC911X_GPIO 176
|
||||
|
@ -54,6 +55,11 @@
|
|||
#define IGEP2_RC_GPIO_WIFI_NRESET 139
|
||||
#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
|
||||
*
|
||||
|
@ -68,6 +74,7 @@
|
|||
|
||||
#define IGEP2_BOARD_HWREV_B 0
|
||||
#define IGEP2_BOARD_HWREV_C 1
|
||||
#define IGEP3_BOARD_HWREV 2
|
||||
|
||||
static u8 hwrev;
|
||||
|
||||
|
@ -75,24 +82,29 @@ static void __init igep2_get_revision(void)
|
|||
{
|
||||
u8 ret;
|
||||
|
||||
if (machine_is_igep0030()) {
|
||||
hwrev = IGEP3_BOARD_HWREV;
|
||||
return;
|
||||
}
|
||||
|
||||
omap_mux_init_gpio(IGEP2_GPIO_LED1_RED, OMAP_PIN_INPUT);
|
||||
|
||||
if ((gpio_request(IGEP2_GPIO_LED1_RED, "GPIO_HW0_REV") == 0) &&
|
||||
(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 {
|
||||
if (gpio_request_one(IGEP2_GPIO_LED1_RED, GPIOF_IN, "GPIO_HW0_REV")) {
|
||||
pr_warning("IGEP2: Could not obtain gpio GPIO_HW0_REV\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);
|
||||
|
@ -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)
|
||||
*/
|
||||
|
||||
static struct mtd_partition igep2_onenand_partitions[] = {
|
||||
static struct mtd_partition igep_onenand_partitions[] = {
|
||||
{
|
||||
.name = "X-Loader",
|
||||
.offset = 0,
|
||||
|
@ -139,21 +151,21 @@ static struct mtd_partition igep2_onenand_partitions[] = {
|
|||
},
|
||||
};
|
||||
|
||||
static struct omap_onenand_platform_data igep2_onenand_data = {
|
||||
.parts = igep2_onenand_partitions,
|
||||
.nr_parts = ARRAY_SIZE(igep2_onenand_partitions),
|
||||
static struct omap_onenand_platform_data igep_onenand_data = {
|
||||
.parts = igep_onenand_partitions,
|
||||
.nr_parts = ARRAY_SIZE(igep_onenand_partitions),
|
||||
.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",
|
||||
.id = -1,
|
||||
.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 onenandcs = GPMC_CS_NUM + 1;
|
||||
|
@ -165,7 +177,7 @@ static void __init igep2_flash_init(void)
|
|||
/* Check if NAND/oneNAND is configured */
|
||||
if ((ret & 0xC00) == 0x800)
|
||||
/* NAND found */
|
||||
pr_err("IGEP2: Unsupported NAND found\n");
|
||||
pr_err("IGEP: Unsupported NAND found\n");
|
||||
else {
|
||||
ret = gpmc_cs_read_reg(cs, GPMC_CS_CONFIG7);
|
||||
if ((ret & 0x3F) == (ONENAND_MAP >> 24))
|
||||
|
@ -175,85 +187,46 @@ static void __init igep2_flash_init(void)
|
|||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
igep2_onenand_data.cs = onenandcs;
|
||||
igep_onenand_data.cs = onenandcs;
|
||||
|
||||
if (platform_device_register(&igep2_onenand_device) < 0)
|
||||
pr_err("IGEP2: Unable to register OneNAND device\n");
|
||||
if (platform_device_register(&igep_onenand_device) < 0)
|
||||
pr_err("IGEP: Unable to register OneNAND device\n");
|
||||
}
|
||||
|
||||
#else
|
||||
static void __init igep2_flash_init(void) {}
|
||||
static void __init igep_flash_init(void) {}
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE)
|
||||
|
||||
#include <linux/smsc911x.h>
|
||||
#include <plat/gpmc-smsc911x.h>
|
||||
|
||||
static struct smsc911x_platform_config igep2_smsc911x_config = {
|
||||
.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 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 struct omap_smsc911x_platform_data smsc911x_cfg = {
|
||||
.cs = IGEP2_SMSC911X_CS,
|
||||
.gpio_irq = IGEP2_SMSC911X_GPIO,
|
||||
.gpio_reset = -EINVAL,
|
||||
.flags = SMSC911X_USE_32BIT | SMSC911X_SAVE_MAC_ADDRESS,
|
||||
};
|
||||
|
||||
static inline void __init igep2_init_smsc911x(void)
|
||||
{
|
||||
unsigned long cs_mem_base;
|
||||
|
||||
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);
|
||||
gpmc_smsc911x_init(&smsc911x_cfg);
|
||||
}
|
||||
|
||||
#else
|
||||
static inline void __init igep2_init_smsc911x(void) { }
|
||||
#endif
|
||||
|
||||
static struct regulator_consumer_supply igep2_vmmc1_supply =
|
||||
static struct regulator_consumer_supply igep_vmmc1_supply =
|
||||
REGULATOR_SUPPLY("vmmc", "omap_hsmmc.0");
|
||||
|
||||
/* 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 = {
|
||||
.min_uV = 1850000,
|
||||
.max_uV = 3150000,
|
||||
|
@ -264,13 +237,13 @@ static struct regulator_init_data igep2_vmmc1 = {
|
|||
| REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
.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");
|
||||
|
||||
static struct regulator_init_data igep2_vio = {
|
||||
static struct regulator_init_data igep_vio = {
|
||||
.constraints = {
|
||||
.min_uV = 1800000,
|
||||
.max_uV = 1800000,
|
||||
|
@ -282,34 +255,34 @@ static struct regulator_init_data igep2_vio = {
|
|||
| REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
.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");
|
||||
|
||||
static struct regulator_init_data igep2_vmmc2 = {
|
||||
static struct regulator_init_data igep_vmmc2 = {
|
||||
.constraints = {
|
||||
.valid_modes_mask = REGULATOR_MODE_NORMAL,
|
||||
.always_on = 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",
|
||||
.microvolts = 3300000,
|
||||
.gpio = -EINVAL,
|
||||
.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",
|
||||
.id = 0,
|
||||
.dev = {
|
||||
.platform_data = &igep2_vwlan,
|
||||
.platform_data = &igep_vwlan,
|
||||
},
|
||||
};
|
||||
|
||||
|
@ -334,20 +307,17 @@ static struct omap2_hsmmc_info mmc[] = {
|
|||
#if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE)
|
||||
#include <linux/leds.h>
|
||||
|
||||
static struct gpio_led igep2_gpio_leds[] = {
|
||||
static struct gpio_led igep_gpio_leds[] = {
|
||||
[0] = {
|
||||
.name = "gpio-led:red:d0",
|
||||
.gpio = IGEP2_GPIO_LED0_RED,
|
||||
.default_trigger = "default-off"
|
||||
},
|
||||
[1] = {
|
||||
.name = "gpio-led:green:d0",
|
||||
.gpio = IGEP2_GPIO_LED0_GREEN,
|
||||
.default_trigger = "default-off",
|
||||
},
|
||||
[2] = {
|
||||
.name = "gpio-led:red:d1",
|
||||
.gpio = IGEP2_GPIO_LED1_RED,
|
||||
.default_trigger = "default-off",
|
||||
},
|
||||
[3] = {
|
||||
|
@ -358,94 +328,119 @@ static struct gpio_led igep2_gpio_leds[] = {
|
|||
},
|
||||
};
|
||||
|
||||
static struct gpio_led_platform_data igep2_led_pdata = {
|
||||
.leds = igep2_gpio_leds,
|
||||
.num_leds = ARRAY_SIZE(igep2_gpio_leds),
|
||||
static struct gpio_led_platform_data igep_led_pdata = {
|
||||
.leds = igep_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",
|
||||
.id = -1,
|
||||
.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
|
||||
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) &&
|
||||
(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");
|
||||
int i;
|
||||
|
||||
if ((gpio_request(IGEP2_GPIO_LED0_GREEN, "gpio-led:green:d0") == 0) &&
|
||||
(gpio_direction_output(IGEP2_GPIO_LED0_GREEN, 0) == 0))
|
||||
gpio_export(IGEP2_GPIO_LED0_GREEN, 0);
|
||||
else
|
||||
pr_warning("IGEP v2: Could not obtain gpio GPIO_LED0_GREEN\n");
|
||||
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;
|
||||
}
|
||||
|
||||
if ((gpio_request(IGEP2_GPIO_LED1_RED, "gpio-led:red:d1") == 0) &&
|
||||
(gpio_direction_output(IGEP2_GPIO_LED1_RED, 0) == 0))
|
||||
gpio_export(IGEP2_GPIO_LED1_RED, 0);
|
||||
else
|
||||
pr_warning("IGEP v2: Could not obtain gpio GPIO_LED1_RED\n");
|
||||
if (gpio_request_array(igep_gpio_leds, ARRAY_SIZE(igep_gpio_leds))) {
|
||||
pr_warning("IGEP v2: Could not obtain leds gpios\n");
|
||||
return;
|
||||
}
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(igep_gpio_leds); i++)
|
||||
gpio_export(igep_gpio_leds[i].gpio, 0);
|
||||
}
|
||||
#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)
|
||||
{
|
||||
int ret;
|
||||
|
||||
/* 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)
|
||||
ret = gpio_request_one(gpio + TWL4030_GPIO_MAX + 1, GPIOF_OUT_INIT_HIGH,
|
||||
"gpio-led:green:d1");
|
||||
if (ret == 0)
|
||||
gpio_export(gpio + TWL4030_GPIO_MAX + 1, 0);
|
||||
else
|
||||
pr_warning("IGEP: Could not obtain gpio GPIO_LED1_GREEN\n");
|
||||
#else
|
||||
igep_gpio_leds[3].gpio = gpio + TWL4030_GPIO_MAX + 1;
|
||||
#endif
|
||||
|
||||
if (machine_is_igep0030())
|
||||
return 0;
|
||||
|
||||
/*
|
||||
* 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");
|
||||
igep2_twl_gpios[0].gpio = gpio + 1;
|
||||
|
||||
/*
|
||||
* 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))
|
||||
/* 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");
|
||||
|
||||
/* 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);
|
||||
else
|
||||
pr_warning("IGEP v2: Could not obtain gpio GPIO_LED1_GREEN\n");
|
||||
#else
|
||||
igep2_gpio_leds[3].gpio = gpio + TWL4030_GPIO_MAX + 1;
|
||||
#endif
|
||||
|
||||
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,
|
||||
.irq_base = TWL4030_GPIO_IRQ_BASE,
|
||||
.irq_end = TWL4030_GPIO_IRQ_END,
|
||||
.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,
|
||||
};
|
||||
|
||||
|
@ -507,16 +502,17 @@ static struct regulator_init_data igep2_vpll2 = {
|
|||
|
||||
static void __init igep2_display_init(void)
|
||||
{
|
||||
if (gpio_request(IGEP2_GPIO_DVI_PUP, "GPIO_DVI_PUP") &&
|
||||
gpio_direction_output(IGEP2_GPIO_DVI_PUP, 1))
|
||||
int err = gpio_request_one(IGEP2_GPIO_DVI_PUP, GPIOF_OUT_INIT_HIGH,
|
||||
"GPIO_DVI_PUP");
|
||||
if (err)
|
||||
pr_err("IGEP v2: Could not obtain gpio GPIO_DVI_PUP\n");
|
||||
}
|
||||
|
||||
static struct platform_device *igep2_devices[] __initdata = {
|
||||
&igep2_vwlan_device,
|
||||
static struct platform_device *igep_devices[] __initdata = {
|
||||
&igep_vwlan_device,
|
||||
};
|
||||
|
||||
static void __init igep2_init_early(void)
|
||||
static void __init igep_init_early(void)
|
||||
{
|
||||
omap2_init_common_infrastructure();
|
||||
omap2_init_common_devices(m65kxxxxam_sdrc_params,
|
||||
|
@ -561,27 +557,15 @@ static struct twl4030_keypad_data igep2_keypad_pdata = {
|
|||
.rep = 1,
|
||||
};
|
||||
|
||||
static struct twl4030_platform_data igep2_twldata = {
|
||||
static struct twl4030_platform_data igep_twldata = {
|
||||
.irq_base = TWL4030_IRQ_BASE,
|
||||
.irq_end = TWL4030_IRQ_END,
|
||||
|
||||
/* platform_data for children goes here */
|
||||
.usb = &igep2_usb_data,
|
||||
.codec = &igep2_codec_data,
|
||||
.gpio = &igep2_twl4030_gpio_pdata,
|
||||
.keypad = &igep2_keypad_pdata,
|
||||
.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,
|
||||
},
|
||||
.usb = &igep_usb_data,
|
||||
.gpio = &igep_twl4030_gpio_pdata,
|
||||
.vmmc1 = &igep_vmmc1,
|
||||
.vio = &igep_vio,
|
||||
};
|
||||
|
||||
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;
|
||||
|
||||
ret = omap_register_i2c_bus(1, 2600, igep2_i2c1_boardinfo,
|
||||
ARRAY_SIZE(igep2_i2c1_boardinfo));
|
||||
if (ret)
|
||||
pr_warning("IGEP2: Could not register I2C1 bus (%d)\n", ret);
|
||||
if (machine_is_igep0020()) {
|
||||
/*
|
||||
* 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);
|
||||
|
||||
/*
|
||||
* 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);
|
||||
igep_twldata.codec = &igep2_codec_data;
|
||||
igep_twldata.keypad = &igep2_keypad_pdata;
|
||||
igep_twldata.vpll2 = &igep2_vpll2;
|
||||
}
|
||||
|
||||
omap3_pmic_init("twl4030", &igep_twldata);
|
||||
}
|
||||
|
||||
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 igep2_usbhs_bdata __initconst = {
|
||||
.port_mode[0] = OMAP_EHCI_PORT_MODE_PHY,
|
||||
.port_mode[1] = 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 = {
|
|||
.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
|
||||
static struct omap_board_mux board_mux[] __initdata = {
|
||||
{ .reg_offset = OMAP_MUX_TERMINATOR },
|
||||
|
@ -633,82 +625,95 @@ static struct omap_board_mux board_mux[] __initdata = {
|
|||
#endif
|
||||
|
||||
#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 */
|
||||
if (hwrev == IGEP2_BOARD_HWREV_B) {
|
||||
npd = IGEP2_RB_GPIO_WIFI_NPD;
|
||||
wreset = IGEP2_RB_GPIO_WIFI_NRESET;
|
||||
btreset = IGEP2_RB_GPIO_BT_NRESET;
|
||||
} else if (hwrev == IGEP2_BOARD_HWREV_C) {
|
||||
npd = IGEP2_RC_GPIO_WIFI_NPD;
|
||||
wreset = IGEP2_RC_GPIO_WIFI_NRESET;
|
||||
btreset = IGEP2_RC_GPIO_BT_NRESET;
|
||||
igep_wlan_bt_gpios[0].gpio = IGEP2_RB_GPIO_WIFI_NPD;
|
||||
igep_wlan_bt_gpios[1].gpio = IGEP2_RB_GPIO_WIFI_NRESET;
|
||||
igep_wlan_bt_gpios[2].gpio = IGEP2_RB_GPIO_BT_NRESET;
|
||||
} else if (hwrev == IGEP2_BOARD_HWREV_C || machine_is_igep0030()) {
|
||||
igep_wlan_bt_gpios[0].gpio = IGEP2_RC_GPIO_WIFI_NPD;
|
||||
igep_wlan_bt_gpios[1].gpio = IGEP2_RC_GPIO_WIFI_NRESET;
|
||||
igep_wlan_bt_gpios[2].gpio = IGEP2_RC_GPIO_BT_NRESET;
|
||||
} else
|
||||
return;
|
||||
|
||||
/* Set GPIO's for WLAN-BT combo module */
|
||||
if ((gpio_request(npd, "GPIO_WIFI_NPD") == 0) &&
|
||||
(gpio_direction_output(npd, 1) == 0)) {
|
||||
gpio_export(npd, 0);
|
||||
} else
|
||||
pr_warning("IGEP2: Could not obtain gpio GPIO_WIFI_NPD\n");
|
||||
err = gpio_request_array(igep_wlan_bt_gpios,
|
||||
ARRAY_SIZE(igep_wlan_bt_gpios));
|
||||
if (err) {
|
||||
pr_warning("IGEP2: Could not obtain WIFI/BT gpios\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if ((gpio_request(wreset, "GPIO_WIFI_NRESET") == 0) &&
|
||||
(gpio_direction_output(wreset, 1) == 0)) {
|
||||
gpio_export(wreset, 0);
|
||||
gpio_set_value(wreset, 0);
|
||||
udelay(10);
|
||||
gpio_set_value(wreset, 1);
|
||||
} else
|
||||
pr_warning("IGEP2: Could not obtain gpio GPIO_WIFI_NRESET\n");
|
||||
gpio_export(igep_wlan_bt_gpios[0].gpio, 0);
|
||||
gpio_export(igep_wlan_bt_gpios[1].gpio, 0);
|
||||
gpio_export(igep_wlan_bt_gpios[2].gpio, 0);
|
||||
|
||||
gpio_set_value(igep_wlan_bt_gpios[1].gpio, 0);
|
||||
udelay(10);
|
||||
gpio_set_value(igep_wlan_bt_gpios[1].gpio, 1);
|
||||
|
||||
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
|
||||
static inline void __init igep2_wlan_bt_init(void) { }
|
||||
static inline void __init igep_wlan_bt_init(void) { }
|
||||
#endif
|
||||
|
||||
static void __init igep2_init(void)
|
||||
static void __init igep_init(void)
|
||||
{
|
||||
omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);
|
||||
|
||||
/* Get IGEP2 hardware revision */
|
||||
igep2_get_revision();
|
||||
/* Register I2C busses and drivers */
|
||||
igep2_i2c_init();
|
||||
platform_add_devices(igep2_devices, ARRAY_SIZE(igep2_devices));
|
||||
omap_display_init(&igep2_dss_data);
|
||||
igep_i2c_init();
|
||||
platform_add_devices(igep_devices, ARRAY_SIZE(igep_devices));
|
||||
omap_serial_init();
|
||||
usb_musb_init(&musb_board_data);
|
||||
usbhs_init(&usbhs_bdata);
|
||||
usb_musb_init(NULL);
|
||||
|
||||
igep2_flash_init();
|
||||
igep2_leds_init();
|
||||
igep2_display_init();
|
||||
igep2_init_smsc911x();
|
||||
igep_flash_init();
|
||||
igep_leds_init();
|
||||
|
||||
/*
|
||||
* WLAN-BT combo module from MuRata which has a Marvell WLAN
|
||||
* (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")
|
||||
.boot_params = 0x80000100,
|
||||
.reserve = omap_reserve,
|
||||
.map_io = omap3_map_io,
|
||||
.init_early = igep2_init_early,
|
||||
.init_early = igep_init_early,
|
||||
.init_irq = omap_init_irq,
|
||||
.init_machine = igep2_init,
|
||||
.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_machine = igep_init,
|
||||
.timer = &omap_timer,
|
||||
MACHINE_END
|
||||
|
|
|
@ -1,458 +0,0 @@
|
|||
/*
|
||||
* 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 @@
|
|||
#include <linux/err.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/spi/spi.h>
|
||||
#include <linux/spi/ads7846.h>
|
||||
#include <linux/regulator/machine.h>
|
||||
#include <linux/i2c/twl.h>
|
||||
#include <linux/io.h>
|
||||
|
@ -43,47 +42,19 @@
|
|||
|
||||
#include <asm/delay.h>
|
||||
#include <plat/usb.h>
|
||||
#include <plat/gpmc-smsc911x.h>
|
||||
|
||||
#include "board-flash.h"
|
||||
#include "mux.h"
|
||||
#include "hsmmc.h"
|
||||
#include "control.h"
|
||||
#include "common-board-devices.h"
|
||||
|
||||
#define LDP_SMSC911X_CS 1
|
||||
#define LDP_SMSC911X_GPIO 152
|
||||
#define DEBUG_BASE 0x08000000
|
||||
#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[] = {
|
||||
KEY(0, 0, KEY_1),
|
||||
KEY(1, 0, KEY_2),
|
||||
|
@ -197,82 +168,16 @@ static struct platform_device ldp_gpio_keys_device = {
|
|||
},
|
||||
};
|
||||
|
||||
static int ts_gpio;
|
||||
|
||||
/**
|
||||
* @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 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 struct omap_smsc911x_platform_data smsc911x_cfg = {
|
||||
.cs = LDP_SMSC911X_CS,
|
||||
.gpio_irq = LDP_SMSC911X_GPIO,
|
||||
.gpio_reset = -EINVAL,
|
||||
.flags = SMSC911X_USE_32BIT,
|
||||
};
|
||||
|
||||
static inline void __init ldp_init_smsc911x(void)
|
||||
{
|
||||
int eth_cs;
|
||||
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);
|
||||
gpmc_smsc911x_init(&smsc911x_cfg);
|
||||
}
|
||||
|
||||
static struct platform_device ldp_lcd_device = {
|
||||
|
@ -360,19 +265,9 @@ static struct twl4030_platform_data ldp_twldata = {
|
|||
.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)
|
||||
{
|
||||
omap_register_i2c_bus(1, 2600, ldp_i2c_boardinfo,
|
||||
ARRAY_SIZE(ldp_i2c_boardinfo));
|
||||
omap3_pmic_init("twl4030", &ldp_twldata);
|
||||
omap_register_i2c_bus(2, 400, NULL, 0);
|
||||
omap_register_i2c_bus(3, 400, NULL, 0);
|
||||
return 0;
|
||||
|
@ -389,7 +284,6 @@ static struct omap2_hsmmc_info mmc[] __initdata = {
|
|||
};
|
||||
|
||||
static struct platform_device *ldp_devices[] __initdata = {
|
||||
&ldp_smsc911x_device,
|
||||
&ldp_lcd_device,
|
||||
&ldp_gpio_keys_device,
|
||||
};
|
||||
|
@ -400,12 +294,6 @@ static struct omap_board_mux board_mux[] __initdata = {
|
|||
};
|
||||
#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[] = {
|
||||
/* All the partition sizes are listed in terms of NAND block size */
|
||||
{
|
||||
|
@ -446,13 +334,9 @@ static void __init omap_ldp_init(void)
|
|||
ldp_init_smsc911x();
|
||||
omap_i2c_init();
|
||||
platform_add_devices(ldp_devices, ARRAY_SIZE(ldp_devices));
|
||||
ts_gpio = 54;
|
||||
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_ads7846_init(1, 54, 310, NULL);
|
||||
omap_serial_init();
|
||||
usb_musb_init(&musb_board_data);
|
||||
usb_musb_init(NULL);
|
||||
board_nand_init(ldp_nand_partitions,
|
||||
ARRAY_SIZE(ldp_nand_partitions), ZOOM_NAND_CS, 0);
|
||||
|
||||
|
|
|
@ -106,14 +106,13 @@ static void __init n8x0_usb_init(void)
|
|||
static char announce[] __initdata = KERN_INFO "TUSB 6010\n";
|
||||
|
||||
/* 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) {
|
||||
printk(KERN_ERR "Could not get TUSB power GPIO%i\n",
|
||||
TUSB6010_GPIO_ENABLE);
|
||||
return;
|
||||
}
|
||||
gpio_direction_output(TUSB6010_GPIO_ENABLE, 0);
|
||||
|
||||
tusb_set_power(0);
|
||||
|
||||
ret = tusb6010_setup_interface(&tusb_data, TUSB6010_REFCLK_19, 2,
|
||||
|
@ -494,8 +493,12 @@ static struct omap_mmc_platform_data mmc1_data = {
|
|||
|
||||
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;
|
||||
|
||||
|
@ -512,27 +515,18 @@ static void __init n8x0_mmc_init(void)
|
|||
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)
|
||||
return;
|
||||
|
||||
gpio_direction_output(N8X0_SLOT_SWITCH_GPIO, 0);
|
||||
|
||||
if (machine_is_nokia_n810()) {
|
||||
err = gpio_request(N810_EMMC_VSD_GPIO, "MMC slot 2 Vddf");
|
||||
err = gpio_request_array(n810_emmc_gpios,
|
||||
ARRAY_SIZE(n810_emmc_gpios));
|
||||
if (err) {
|
||||
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) {
|
||||
gpio_free(N8X0_SLOT_SWITCH_GPIO);
|
||||
gpio_free(N810_EMMC_VSD_GPIO);
|
||||
return;
|
||||
}
|
||||
gpio_direction_output(N810_EMMC_VIO_GPIO, 0);
|
||||
}
|
||||
|
||||
mmc_data[0] = &mmc1_data;
|
||||
|
|
|
@ -52,6 +52,7 @@
|
|||
#include "hsmmc.h"
|
||||
#include "timer-gp.h"
|
||||
#include "pm.h"
|
||||
#include "common-board-devices.h"
|
||||
|
||||
#define NAND_BLOCK_SIZE SZ_128K
|
||||
|
||||
|
@ -79,6 +80,12 @@ static u8 omap3_beagle_get_rev(void)
|
|||
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)
|
||||
{
|
||||
int ret;
|
||||
|
@ -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(173, OMAP_PIN_INPUT_PULLUP);
|
||||
|
||||
ret = gpio_request(171, "rev_id_0");
|
||||
if (ret < 0)
|
||||
goto fail0;
|
||||
|
||||
ret = gpio_request(172, "rev_id_1");
|
||||
if (ret < 0)
|
||||
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);
|
||||
ret = gpio_request_array(omap3_beagle_rev_gpios,
|
||||
ARRAY_SIZE(omap3_beagle_rev_gpios));
|
||||
if (ret < 0) {
|
||||
printk(KERN_ERR "Unable to get revision detection GPIO pins\n");
|
||||
omap3_beagle_version = OMAP3BEAGLE_BOARD_UNKN;
|
||||
return;
|
||||
}
|
||||
|
||||
beagle_rev = gpio_get_value(171) | (gpio_get_value(172) << 1)
|
||||
| (gpio_get_value(173) << 2);
|
||||
|
@ -128,18 +127,6 @@ static void __init omap3_beagle_init_rev(void)
|
|||
printk(KERN_INFO "OMAP3 Beagle Rev: unknown %hd\n", beagle_rev);
|
||||
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[] = {
|
||||
|
@ -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 */
|
||||
|
||||
static int beagle_enable_dvi(struct omap_dss_device *dssdev)
|
||||
|
@ -243,13 +221,10 @@ static void __init beagle_display_init(void)
|
|||
{
|
||||
int r;
|
||||
|
||||
r = gpio_request(beagle_dvi_device.reset_gpio, "DVI reset");
|
||||
if (r < 0) {
|
||||
r = gpio_request_one(beagle_dvi_device.reset_gpio, GPIOF_OUT_INIT_LOW,
|
||||
"DVI reset");
|
||||
if (r < 0)
|
||||
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"
|
||||
|
@ -276,7 +251,7 @@ static struct gpio_led gpio_leds[];
|
|||
static int beagle_twl_gpio_setup(struct device *dev,
|
||||
unsigned gpio, unsigned ngpio)
|
||||
{
|
||||
int r;
|
||||
int r, usb_pwr_level;
|
||||
|
||||
if (omap3_beagle_get_rev() == OMAP3BEAGLE_BOARD_XM) {
|
||||
mmc[0].gpio_wp = -EINVAL;
|
||||
|
@ -295,66 +270,46 @@ static int beagle_twl_gpio_setup(struct device *dev,
|
|||
beagle_vmmc1_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
|
||||
* high / others active low)
|
||||
*/
|
||||
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)
|
||||
* DVI reset GPIO is different between beagle revisions
|
||||
*/
|
||||
if (omap3_beagle_get_rev() == OMAP3BEAGLE_BOARD_XM) {
|
||||
r = gpio_request(gpio + 1, "nDVI_PWR_EN");
|
||||
if (!r) {
|
||||
r = gpio_direction_output(gpio + 1, 0);
|
||||
if (r)
|
||||
gpio_free(gpio + 1);
|
||||
}
|
||||
usb_pwr_level = GPIOF_OUT_INIT_HIGH;
|
||||
beagle_dvi_device.reset_gpio = 129;
|
||||
/*
|
||||
* gpio + 1 on Xm controls the TFP410's enable line (active low)
|
||||
* 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)
|
||||
pr_err("%s: unable to configure nDVI_PWR_EN\n",
|
||||
__func__);
|
||||
r = gpio_request(gpio + 2, "DVI_LDO_EN");
|
||||
if (!r) {
|
||||
r = gpio_direction_output(gpio + 2, 1);
|
||||
if (r)
|
||||
gpio_free(gpio + 2);
|
||||
}
|
||||
r = gpio_request_one(gpio + 2, GPIOF_OUT_INIT_HIGH,
|
||||
"DVI_LDO_EN");
|
||||
if (r)
|
||||
pr_err("%s: unable to configure DVI_LDO_EN\n",
|
||||
__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;
|
||||
}
|
||||
|
||||
|
@ -453,15 +408,6 @@ static struct twl4030_platform_data beagle_twldata = {
|
|||
.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[] = {
|
||||
{
|
||||
I2C_BOARD_INFO("eeprom", 0x50),
|
||||
|
@ -470,8 +416,7 @@ static struct i2c_board_info __initdata beagle_i2c_eeprom[] = {
|
|||
|
||||
static int __init omap3_beagle_i2c_init(void)
|
||||
{
|
||||
omap_register_i2c_bus(1, 2600, beagle_i2c_boardinfo,
|
||||
ARRAY_SIZE(beagle_i2c_boardinfo));
|
||||
omap3_pmic_init("twl4030", &beagle_twldata);
|
||||
/* Bus 3 is attached to the DVI port where devices like the pico DLP
|
||||
* projector don't work reliably with 400kHz */
|
||||
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 = {
|
|||
&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 = {
|
||||
|
||||
.port_mode[0] = OMAP_EHCI_PORT_MODE_PHY,
|
||||
|
@ -602,12 +514,6 @@ static struct omap_board_mux board_mux[] __initdata = {
|
|||
};
|
||||
#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)
|
||||
{
|
||||
int r = 0;
|
||||
|
@ -665,13 +571,13 @@ static void __init omap3_beagle_init(void)
|
|||
omap_serial_init();
|
||||
|
||||
omap_mux_init_gpio(170, OMAP_PIN_INPUT);
|
||||
gpio_request(170, "DVI_nPD");
|
||||
/* 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);
|
||||
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 */
|
||||
omap_mux_init_signal("sdrc_cke0", OMAP_PIN_OUTPUT);
|
||||
|
|
|
@ -50,6 +50,7 @@
|
|||
#include "mux.h"
|
||||
#include "sdram-micron-mt46h32m32lf-6.h"
|
||||
#include "hsmmc.h"
|
||||
#include "common-board-devices.h"
|
||||
|
||||
#define OMAP3_EVM_TS_GPIO 175
|
||||
#define OMAP3_EVM_EHCI_VBUS 22
|
||||
|
@ -101,49 +102,20 @@ static void __init omap3_evm_get_revision(void)
|
|||
}
|
||||
|
||||
#if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE)
|
||||
static struct resource omap3evm_smsc911x_resources[] = {
|
||||
[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),
|
||||
},
|
||||
};
|
||||
#include <plat/gpmc-smsc911x.h>
|
||||
|
||||
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),
|
||||
};
|
||||
|
||||
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 struct omap_smsc911x_platform_data smsc911x_cfg = {
|
||||
.cs = OMAP3EVM_SMSC911X_CS,
|
||||
.gpio_irq = OMAP3EVM_ETHR_GPIO_IRQ,
|
||||
.gpio_reset = -EINVAL,
|
||||
.flags = SMSC911X_USE_32BIT | SMSC911X_SAVE_MAC_ADDRESS,
|
||||
};
|
||||
|
||||
static inline void __init omap3evm_init_smsc911x(void)
|
||||
{
|
||||
int eth_cs, eth_rst;
|
||||
struct clk *l3ck;
|
||||
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");
|
||||
if (IS_ERR(l3ck))
|
||||
rate = 100000000;
|
||||
|
@ -152,33 +124,13 @@ static inline void __init omap3evm_init_smsc911x(void)
|
|||
|
||||
/* Configure ethernet controller reset gpio */
|
||||
if (cpu_is_omap3430()) {
|
||||
if (gpio_request(eth_rst, "SMSC911x gpio") < 0) {
|
||||
pr_err(KERN_ERR "Failed to request %d for smsc911x\n",
|
||||
eth_rst);
|
||||
return;
|
||||
}
|
||||
|
||||
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 (get_omap3_evm_rev() == OMAP3EVM_BOARD_GEN_1)
|
||||
smsc911x_cfg.gpio_reset = OMAP3EVM_GEN1_ETHR_GPIO_RST;
|
||||
else
|
||||
smsc911x_cfg.gpio_reset = OMAP3EVM_GEN2_ETHR_GPIO_RST;
|
||||
}
|
||||
|
||||
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);
|
||||
platform_device_register(&omap3evm_smsc911x_device);
|
||||
gpmc_smsc911x_init(&smsc911x_cfg);
|
||||
}
|
||||
|
||||
#else
|
||||
|
@ -197,6 +149,15 @@ static inline void __init omap3evm_init_smsc911x(void) { return; }
|
|||
#define OMAP3EVM_LCD_PANEL_BKLIGHT_GPIO 210
|
||||
#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 dvi_enabled;
|
||||
|
||||
|
@ -204,61 +165,10 @@ static void __init omap3_evm_display_init(void)
|
|||
{
|
||||
int r;
|
||||
|
||||
r = gpio_request(OMAP3EVM_LCD_PANEL_RESB, "lcd_panel_resb");
|
||||
if (r) {
|
||||
printk(KERN_ERR "failed to get lcd_panel_resb\n");
|
||||
return;
|
||||
}
|
||||
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);
|
||||
|
||||
r = gpio_request_array(omap3_evm_dss_gpios,
|
||||
ARRAY_SIZE(omap3_evm_dss_gpios));
|
||||
if (r)
|
||||
printk(KERN_ERR "failed to get lcd_panel_* gpios\n");
|
||||
}
|
||||
|
||||
static int omap3_evm_enable_lcd(struct omap_dss_device *dssdev)
|
||||
|
@ -448,7 +358,7 @@ static struct platform_device leds_gpio = {
|
|||
static int omap3evm_twl_gpio_setup(struct device *dev,
|
||||
unsigned gpio, unsigned ngpio)
|
||||
{
|
||||
int r;
|
||||
int r, lcd_bl_en;
|
||||
|
||||
/* gpio + 0 is "mmc0_cd" (input/IRQ) */
|
||||
omap_mux_init_gpio(63, OMAP_PIN_INPUT);
|
||||
|
@ -465,16 +375,14 @@ static int omap3evm_twl_gpio_setup(struct device *dev,
|
|||
*/
|
||||
|
||||
/* TWL4030_GPIO_MAX + 0 == ledA, LCD Backlight control */
|
||||
r = gpio_request(gpio + TWL4030_GPIO_MAX, "EN_LCD_BKL");
|
||||
if (!r)
|
||||
r = gpio_direction_output(gpio + TWL4030_GPIO_MAX,
|
||||
(get_omap3_evm_rev() >= OMAP3EVM_BOARD_GEN_2) ? 1 : 0);
|
||||
lcd_bl_en = get_omap3_evm_rev() >= OMAP3EVM_BOARD_GEN_2 ?
|
||||
GPIOF_OUT_INIT_HIGH : GPIOF_OUT_INIT_LOW;
|
||||
r = gpio_request_one(gpio + TWL4030_GPIO_MAX, lcd_bl_en, "EN_LCD_BKL");
|
||||
if (r)
|
||||
printk(KERN_ERR "failed to get/set lcd_bkl gpio\n");
|
||||
|
||||
/* gpio + 7 == DVI Enable */
|
||||
gpio_request(gpio + 7, "EN_DVI");
|
||||
gpio_direction_output(gpio + 7, 0);
|
||||
gpio_request_one(gpio + 7, GPIOF_OUT_INIT_LOW, "EN_DVI");
|
||||
|
||||
/* TWL4030_GPIO_MAX + 1 == ledB (out, active low LED) */
|
||||
gpio_leds[2].gpio = gpio + TWL4030_GPIO_MAX + 1;
|
||||
|
@ -652,78 +560,18 @@ static struct twl4030_platform_data omap3evm_twldata = {
|
|||
.vdac = &omap3_evm_vdac,
|
||||
.vpll2 = &omap3_evm_vpll2,
|
||||
.vio = &omap3evm_vio,
|
||||
};
|
||||
|
||||
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,
|
||||
},
|
||||
.vmmc1 = &omap3evm_vmmc1,
|
||||
.vsim = &omap3evm_vsim,
|
||||
};
|
||||
|
||||
static int __init omap3_evm_i2c_init(void)
|
||||
{
|
||||
/*
|
||||
* 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));
|
||||
omap3_pmic_init("twl4030", &omap3evm_twldata);
|
||||
omap_register_i2c_bus(2, 400, NULL, 0);
|
||||
omap_register_i2c_bus(3, 400, NULL, 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 = {
|
||||
};
|
||||
|
||||
|
@ -825,6 +673,11 @@ static struct omap_musb_board_data musb_board_data = {
|
|||
.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)
|
||||
{
|
||||
omap3_evm_get_revision();
|
||||
|
@ -841,9 +694,6 @@ static void __init omap3_evm_init(void)
|
|||
|
||||
omap_display_init(&omap3_evm_dss_data);
|
||||
|
||||
spi_register_board_info(omap3evm_spi_board_info,
|
||||
ARRAY_SIZE(omap3evm_spi_board_info));
|
||||
|
||||
omap_serial_init();
|
||||
|
||||
/* OMAP3EVM uses ISP1504 phy and so register nop transceiver */
|
||||
|
@ -851,16 +701,12 @@ static void __init omap3_evm_init(void)
|
|||
|
||||
if (get_omap3_evm_rev() >= OMAP3EVM_BOARD_GEN_2) {
|
||||
/* enable EHCI VBUS using GPIO22 */
|
||||
omap_mux_init_gpio(22, 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);
|
||||
|
||||
omap_mux_init_gpio(OMAP3_EVM_EHCI_VBUS, OMAP_PIN_INPUT_PULLUP);
|
||||
/* Select EHCI port on main board */
|
||||
omap_mux_init_gpio(61, OMAP_PIN_INPUT_PULLUP);
|
||||
gpio_request(OMAP3_EVM_EHCI_SELECT, "select EHCI port");
|
||||
gpio_direction_output(OMAP3_EVM_EHCI_SELECT, 0);
|
||||
gpio_set_value(OMAP3_EVM_EHCI_SELECT, 0);
|
||||
omap_mux_init_gpio(OMAP3_EVM_EHCI_SELECT,
|
||||
OMAP_PIN_INPUT_PULLUP);
|
||||
gpio_request_array(omap3_evm_ehci_gpios,
|
||||
ARRAY_SIZE(omap3_evm_ehci_gpios));
|
||||
|
||||
/* setup EHCI phy reset config */
|
||||
omap_mux_init_gpio(21, OMAP_PIN_INPUT_PULLUP);
|
||||
|
@ -876,7 +722,7 @@ static void __init omap3_evm_init(void)
|
|||
}
|
||||
usb_musb_init(&musb_board_data);
|
||||
usbhs_init(&usbhs_bdata);
|
||||
ads7846_dev_init();
|
||||
omap_ads7846_init(1, OMAP3_EVM_TS_GPIO, 310, NULL);
|
||||
omap3evm_init_smsc911x();
|
||||
omap3_evm_display_init();
|
||||
|
||||
|
|
|
@ -37,6 +37,7 @@
|
|||
#include "hsmmc.h"
|
||||
#include "timer-gp.h"
|
||||
#include "control.h"
|
||||
#include "common-board-devices.h"
|
||||
|
||||
#include <plat/mux.h>
|
||||
#include <plat/board.h>
|
||||
|
@ -93,19 +94,9 @@ static struct twl4030_platform_data omap3logic_twldata = {
|
|||
.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)
|
||||
{
|
||||
omap_register_i2c_bus(1, 2600, omap3logic_i2c_boardinfo,
|
||||
ARRAY_SIZE(omap3logic_i2c_boardinfo));
|
||||
omap3_pmic_init("twl4030", &omap3logic_twldata);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -147,7 +138,6 @@ static struct omap_smsc911x_platform_data __initdata board_smsc911x_data = {
|
|||
.cs = OMAP3LOGIC_SMSC911X_CS,
|
||||
.gpio_irq = -EINVAL,
|
||||
.gpio_reset = -EINVAL,
|
||||
.flags = IORESOURCE_IRQ_LOWLEVEL,
|
||||
};
|
||||
|
||||
/* TODO/FIXME (comment by Peter Barada, LogicPD):
|
||||
|
|
|
@ -22,7 +22,6 @@
|
|||
#include <linux/platform_device.h>
|
||||
|
||||
#include <linux/spi/spi.h>
|
||||
#include <linux/spi/ads7846.h>
|
||||
#include <linux/regulator/machine.h>
|
||||
#include <linux/i2c/twl.h>
|
||||
#include <linux/wl12xx.h>
|
||||
|
@ -52,6 +51,7 @@
|
|||
#include "mux.h"
|
||||
#include "sdram-micron-mt46h32m32lf-6.h"
|
||||
#include "hsmmc.h"
|
||||
#include "common-board-devices.h"
|
||||
|
||||
#define PANDORA_WIFI_IRQ_GPIO 21
|
||||
#define PANDORA_WIFI_NRESET_GPIO 23
|
||||
|
@ -305,24 +305,13 @@ static int omap3pandora_twl_gpio_setup(struct device *dev,
|
|||
|
||||
/* gpio + 13 drives 32kHz buffer for wifi module */
|
||||
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) {
|
||||
pr_err("Cannot get GPIO line %d, ret=%d\n", gpio_32khz, ret);
|
||||
goto fail;
|
||||
}
|
||||
|
||||
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 -ENODEV;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
fail_direction:
|
||||
gpio_free(gpio_32khz);
|
||||
fail:
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static struct twl4030_gpio_platform_data omap3pandora_gpio_data = {
|
||||
|
@ -544,15 +533,6 @@ static struct twl4030_platform_data omap3pandora_twldata = {
|
|||
.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[] = {
|
||||
{
|
||||
I2C_BOARD_INFO("bq27500", 0x55),
|
||||
|
@ -562,61 +542,15 @@ static struct i2c_board_info __initdata omap3pandora_i2c3_boardinfo[] = {
|
|||
|
||||
static int __init omap3pandora_i2c_init(void)
|
||||
{
|
||||
omap_register_i2c_bus(1, 2600, omap3pandora_i2c_boardinfo,
|
||||
ARRAY_SIZE(omap3pandora_i2c_boardinfo));
|
||||
omap3_pmic_init("tps65950", &omap3pandora_twldata);
|
||||
/* i2c2 pins are not connected */
|
||||
omap_register_i2c_bus(3, 100, omap3pandora_i2c3_boardinfo,
|
||||
ARRAY_SIZE(omap3pandora_i2c3_boardinfo));
|
||||
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 = {
|
||||
{
|
||||
.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",
|
||||
.bus_num = 1,
|
||||
.chip_select = 1,
|
||||
|
@ -639,14 +573,10 @@ static void __init pandora_wl1251_init(void)
|
|||
|
||||
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)
|
||||
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);
|
||||
if (pandora_wl1251_pdata.irq < 0)
|
||||
goto fail_irq;
|
||||
|
@ -688,12 +618,6 @@ static struct omap_board_mux board_mux[] __initdata = {
|
|||
};
|
||||
#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)
|
||||
{
|
||||
omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);
|
||||
|
@ -705,9 +629,9 @@ static void __init omap3pandora_init(void)
|
|||
omap_serial_init();
|
||||
spi_register_board_info(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);
|
||||
usb_musb_init(&musb_board_data);
|
||||
usb_musb_init(NULL);
|
||||
gpmc_nand_init(&pandora_nand_data);
|
||||
|
||||
/* Ensure SDRC pins are mux'd for self-refresh */
|
||||
|
|
|
@ -45,7 +45,6 @@
|
|||
#include <plat/mcspi.h>
|
||||
#include <linux/input/matrix_keypad.h>
|
||||
#include <linux/spi/spi.h>
|
||||
#include <linux/spi/ads7846.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/smsc911x.h>
|
||||
#include <linux/i2c/at24.h>
|
||||
|
@ -54,52 +53,28 @@
|
|||
#include "mux.h"
|
||||
#include "hsmmc.h"
|
||||
#include "timer-gp.h"
|
||||
#include "common-board-devices.h"
|
||||
|
||||
#if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE)
|
||||
#include <plat/gpmc-smsc911x.h>
|
||||
|
||||
#define OMAP3STALKER_ETHR_START 0x2c000000
|
||||
#define OMAP3STALKER_ETHR_SIZE 1024
|
||||
#define OMAP3STALKER_ETHR_GPIO_IRQ 19
|
||||
#define OMAP3STALKER_SMC911X_CS 5
|
||||
|
||||
static struct resource omap3stalker_smsc911x_resources[] = {
|
||||
[0] = {
|
||||
.start = OMAP3STALKER_ETHR_START,
|
||||
.end =
|
||||
(OMAP3STALKER_ETHR_START + OMAP3STALKER_ETHR_SIZE - 1),
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = OMAP_GPIO_IRQ(OMAP3STALKER_ETHR_GPIO_IRQ),
|
||||
.end = OMAP_GPIO_IRQ(OMAP3STALKER_ETHR_GPIO_IRQ),
|
||||
.flags = (IORESOURCE_IRQ | IRQF_TRIGGER_LOW),
|
||||
},
|
||||
};
|
||||
|
||||
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,
|
||||
static struct omap_smsc911x_platform_data smsc911x_cfg = {
|
||||
.cs = OMAP3STALKER_SMC911X_CS,
|
||||
.gpio_irq = OMAP3STALKER_ETHR_GPIO_IRQ,
|
||||
.gpio_reset = -EINVAL,
|
||||
.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)
|
||||
{
|
||||
int eth_cs;
|
||||
struct clk *l3ck;
|
||||
unsigned int rate;
|
||||
|
||||
eth_cs = OMAP3STALKER_SMC911X_CS;
|
||||
|
||||
l3ck = clk_get(NULL, "l3_ck");
|
||||
if (IS_ERR(l3ck))
|
||||
rate = 100000000;
|
||||
|
@ -107,16 +82,7 @@ static inline void __init omap3stalker_init_eth(void)
|
|||
rate = clk_get_rate(l3ck);
|
||||
|
||||
omap_mux_init_gpio(19, OMAP_PIN_INPUT_PULLUP);
|
||||
if (gpio_request(OMAP3STALKER_ETHR_GPIO_IRQ, "SMC911x irq") < 0) {
|
||||
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);
|
||||
gpmc_smsc911x_init(&smsc911x_cfg);
|
||||
}
|
||||
|
||||
#else
|
||||
|
@ -365,12 +331,11 @@ omap3stalker_twl_gpio_setup(struct device *dev,
|
|||
*/
|
||||
|
||||
/* TWL4030_GPIO_MAX + 0 == ledA, LCD Backlight control */
|
||||
gpio_request(gpio + TWL4030_GPIO_MAX, "EN_LCD_BKL");
|
||||
gpio_direction_output(gpio + TWL4030_GPIO_MAX, 0);
|
||||
gpio_request_one(gpio + TWL4030_GPIO_MAX, GPIOF_OUT_INIT_LOW,
|
||||
"EN_LCD_BKL");
|
||||
|
||||
/* gpio + 7 == DVI Enable */
|
||||
gpio_request(gpio + 7, "EN_DVI");
|
||||
gpio_direction_output(gpio + 7, 0);
|
||||
gpio_request_one(gpio + 7, GPIOF_OUT_INIT_LOW, "EN_DVI");
|
||||
|
||||
/* TWL4030_GPIO_MAX + 1 == ledB (out, mmc0) */
|
||||
gpio_leds[2].gpio = gpio + TWL4030_GPIO_MAX + 1;
|
||||
|
@ -489,15 +454,8 @@ static struct twl4030_platform_data omap3stalker_twldata = {
|
|||
.codec = &omap3stalker_codec_data,
|
||||
.vdac = &omap3_stalker_vdac,
|
||||
.vpll2 = &omap3_stalker_vpll2,
|
||||
};
|
||||
|
||||
static struct i2c_board_info __initdata omap3stalker_i2c_boardinfo[] = {
|
||||
{
|
||||
I2C_BOARD_INFO("twl4030", 0x48),
|
||||
.flags = I2C_CLIENT_WAKE,
|
||||
.irq = INT_34XX_SYS_NIRQ,
|
||||
.platform_data = &omap3stalker_twldata,
|
||||
},
|
||||
.vmmc1 = &omap3stalker_vmmc1,
|
||||
.vsim = &omap3stalker_vsim,
|
||||
};
|
||||
|
||||
static struct at24_platform_data fram_info = {
|
||||
|
@ -516,15 +474,7 @@ static struct i2c_board_info __initdata omap3stalker_i2c_boardinfo3[] = {
|
|||
|
||||
static int __init omap3_stalker_i2c_init(void)
|
||||
{
|
||||
/*
|
||||
* REVISIT: These entries can be set in omap3evm_twl_data
|
||||
* after a merge with MFD tree
|
||||
*/
|
||||
omap3stalker_twldata.vmmc1 = &omap3stalker_vmmc1;
|
||||
omap3stalker_twldata.vsim = &omap3stalker_vsim;
|
||||
|
||||
omap_register_i2c_bus(1, 2600, omap3stalker_i2c_boardinfo,
|
||||
ARRAY_SIZE(omap3stalker_i2c_boardinfo));
|
||||
omap3_pmic_init("twl4030", &omap3stalker_twldata);
|
||||
omap_register_i2c_bus(2, 400, NULL, 0);
|
||||
omap_register_i2c_bus(3, 400, omap3stalker_i2c_boardinfo3,
|
||||
ARRAY_SIZE(omap3stalker_i2c_boardinfo3));
|
||||
|
@ -532,49 +482,6 @@ static int __init omap3_stalker_i2c_init(void)
|
|||
}
|
||||
|
||||
#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 = {
|
||||
};
|
||||
|
@ -618,12 +525,6 @@ static struct omap_board_mux board_mux[] __initdata = {
|
|||
};
|
||||
#endif
|
||||
|
||||
static struct omap_musb_board_data musb_board_data = {
|
||||
.interface_type = MUSB_INTERFACE_ULPI,
|
||||
.mode = MUSB_OTG,
|
||||
.power = 100,
|
||||
};
|
||||
|
||||
static void __init omap3_stalker_init(void)
|
||||
{
|
||||
omap3_mux_init(board_mux, OMAP_PACKAGE_CUS);
|
||||
|
@ -636,13 +537,11 @@ static void __init omap3_stalker_init(void)
|
|||
ARRAY_SIZE(omap3_stalker_devices));
|
||||
|
||||
omap_display_init(&omap3_stalker_dss_data);
|
||||
spi_register_board_info(omap3stalker_spi_board_info,
|
||||
ARRAY_SIZE(omap3stalker_spi_board_info));
|
||||
|
||||
omap_serial_init();
|
||||
usb_musb_init(&musb_board_data);
|
||||
usb_musb_init(NULL);
|
||||
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(18, OMAP_PIN_INPUT_PULLUP);
|
||||
|
|
|
@ -52,6 +52,7 @@
|
|||
#include "mux.h"
|
||||
#include "hsmmc.h"
|
||||
#include "timer-gp.h"
|
||||
#include "common-board-devices.h"
|
||||
|
||||
#include <asm/setup.h>
|
||||
|
||||
|
@ -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"
|
||||
|
||||
static struct omap2_hsmmc_info mmc[] = {
|
||||
|
@ -154,13 +146,11 @@ static int touchbook_twl_gpio_setup(struct device *dev,
|
|||
/* REVISIT: need ehci-omap hooks for external VBUS
|
||||
* power switch and overcurrent detect
|
||||
*/
|
||||
|
||||
gpio_request(gpio + 1, "EHCI_nOC");
|
||||
gpio_direction_input(gpio + 1);
|
||||
gpio_request_one(gpio + 1, GPIOF_IN, "EHCI_nOC");
|
||||
|
||||
/* TWL4030_GPIO_MAX + 0 == ledA, EHCI nEN_USB_PWR (out, active low) */
|
||||
gpio_request(gpio + TWL4030_GPIO_MAX, "nEN_USB_PWR");
|
||||
gpio_direction_output(gpio + TWL4030_GPIO_MAX, 0);
|
||||
gpio_request_one(gpio + TWL4030_GPIO_MAX, GPIOF_OUT_INIT_LOW,
|
||||
"nEN_USB_PWR");
|
||||
|
||||
/* TWL4030_GPIO_MAX + 1 == ledB, PMU_STAT (out, active low LED) */
|
||||
gpio_leds[2].gpio = gpio + TWL4030_GPIO_MAX + 1;
|
||||
|
@ -273,15 +263,6 @@ static struct twl4030_platform_data touchbook_twldata = {
|
|||
.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[] = {
|
||||
{
|
||||
I2C_BOARD_INFO("bq27200", 0x55),
|
||||
|
@ -291,8 +272,7 @@ static struct i2c_board_info __initdata touchBook_i2c_boardinfo[] = {
|
|||
static int __init omap3_touchbook_i2c_init(void)
|
||||
{
|
||||
/* Standard TouchBook bus */
|
||||
omap_register_i2c_bus(1, 2600, touchbook_i2c_boardinfo,
|
||||
ARRAY_SIZE(touchbook_i2c_boardinfo));
|
||||
omap3_pmic_init("twl4030", &touchbook_twldata);
|
||||
|
||||
/* Additional TouchBook bus */
|
||||
omap_register_i2c_bus(3, 100, touchBook_i2c_boardinfo,
|
||||
|
@ -301,19 +281,7 @@ static int __init omap3_touchbook_i2c_init(void)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void __init omap3_ads7846_init(void)
|
||||
{
|
||||
if (gpio_request(OMAP3_TS_GPIO, "ads7846_pen_down")) {
|
||||
printk(KERN_ERR "Failed to request GPIO %d for "
|
||||
"ads7846 pen down IRQ\n", OMAP3_TS_GPIO);
|
||||
return;
|
||||
}
|
||||
|
||||
gpio_direction_input(OMAP3_TS_GPIO);
|
||||
gpio_set_debounce(OMAP3_TS_GPIO, 310);
|
||||
}
|
||||
|
||||
static struct ads7846_platform_data ads7846_config = {
|
||||
static struct ads7846_platform_data ads7846_pdata = {
|
||||
.x_min = 100,
|
||||
.y_min = 265,
|
||||
.x_max = 3950,
|
||||
|
@ -327,23 +295,6 @@ static struct ads7846_platform_data ads7846_config = {
|
|||
.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[] = {
|
||||
{
|
||||
.name = "touchbook::usr0",
|
||||
|
@ -434,39 +385,6 @@ static struct platform_device *omap3_touchbook_devices[] __initdata = {
|
|||
&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 = {
|
||||
|
||||
.port_mode[0] = OMAP_EHCI_PORT_MODE_PHY,
|
||||
|
@ -481,15 +399,10 @@ static const struct usbhs_omap_board_data usbhs_bdata __initconst = {
|
|||
|
||||
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 (r < 0) {
|
||||
if (gpio_request_one(pwr_off, GPIOF_OUT_INIT_LOW, "DVI reset") < 0)
|
||||
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)
|
||||
|
@ -501,12 +414,6 @@ static int __init early_touchbook_revision(char *p)
|
|||
}
|
||||
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)
|
||||
{
|
||||
omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);
|
||||
|
@ -521,17 +428,15 @@ static void __init omap3_touchbook_init(void)
|
|||
omap_serial_init();
|
||||
|
||||
omap_mux_init_gpio(170, OMAP_PIN_INPUT);
|
||||
gpio_request(176, "DVI_nPD");
|
||||
/* 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 */
|
||||
spi_register_board_info(omap3_ads7846_spi_board_info,
|
||||
ARRAY_SIZE(omap3_ads7846_spi_board_info));
|
||||
omap3_ads7846_init();
|
||||
usb_musb_init(&musb_board_data);
|
||||
omap_ads7846_init(4, OMAP3_TS_GPIO, 310, &ads7846_pdata);
|
||||
usb_musb_init(NULL);
|
||||
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 */
|
||||
omap_mux_init_signal("sdrc_cke0", OMAP_PIN_OUTPUT);
|
||||
|
|
|
@ -46,6 +46,7 @@
|
|||
#include "hsmmc.h"
|
||||
#include "control.h"
|
||||
#include "mux.h"
|
||||
#include "common-board-devices.h"
|
||||
|
||||
#define GPIO_HUB_POWER 1
|
||||
#define GPIO_HUB_NRESET 62
|
||||
|
@ -111,6 +112,11 @@ static const struct usbhs_omap_board_data usbhs_bdata __initconst = {
|
|||
.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)
|
||||
{
|
||||
int ret;
|
||||
|
@ -120,44 +126,27 @@ static void __init omap4_ehci_init(void)
|
|||
phy_ref_clk = clk_get(NULL, "auxclk3_ck");
|
||||
if (IS_ERR(phy_ref_clk)) {
|
||||
pr_err("Cannot request auxclk3\n");
|
||||
goto error1;
|
||||
return;
|
||||
}
|
||||
clk_set_rate(phy_ref_clk, 19200000);
|
||||
clk_enable(phy_ref_clk);
|
||||
|
||||
/* disable the power to the usb hub prior to init */
|
||||
ret = gpio_request(GPIO_HUB_POWER, "hub_power");
|
||||
/* disable the power to the usb hub prior to init and reset phy+hub */
|
||||
ret = gpio_request_array(panda_ehci_gpios,
|
||||
ARRAY_SIZE(panda_ehci_gpios));
|
||||
if (ret) {
|
||||
pr_err("Cannot request GPIO %d\n", GPIO_HUB_POWER);
|
||||
goto error1;
|
||||
pr_err("Unable to initialize EHCI power/reset\n");
|
||||
return;
|
||||
}
|
||||
gpio_export(GPIO_HUB_POWER, 0);
|
||||
gpio_direction_output(GPIO_HUB_POWER, 0);
|
||||
gpio_set_value(GPIO_HUB_POWER, 0);
|
||||
|
||||
/* reset phy+hub */
|
||||
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_POWER, 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);
|
||||
|
||||
usbhs_init(&usbhs_bdata);
|
||||
|
||||
/* enable power to hub */
|
||||
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 = {
|
||||
|
@ -408,15 +397,6 @@ static struct twl4030_platform_data omap4_panda_twldata = {
|
|||
.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
|
||||
* 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[] = {
|
|||
|
||||
static int __init omap4_panda_i2c_init(void)
|
||||
{
|
||||
/*
|
||||
* 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));
|
||||
omap4_pmic_init("twl6030", &omap4_panda_twldata);
|
||||
omap_register_i2c_bus(2, 400, NULL, 0);
|
||||
/*
|
||||
* 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)
|
|||
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)
|
||||
{
|
||||
int status;
|
||||
|
||||
status = gpio_request_one(HDMI_GPIO_HPD, GPIOF_OUT_INIT_HIGH,
|
||||
"hdmi_gpio_hpd");
|
||||
if (status) {
|
||||
pr_err("Cannot request GPIO %d\n", HDMI_GPIO_HPD);
|
||||
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);
|
||||
status = gpio_request_array(panda_hdmi_gpios,
|
||||
ARRAY_SIZE(panda_hdmi_gpios));
|
||||
if (status)
|
||||
pr_err("Cannot request HDMI GPIOs\n");
|
||||
|
||||
return status;
|
||||
}
|
||||
|
|
|
@ -56,6 +56,7 @@
|
|||
#include "mux.h"
|
||||
#include "sdram-micron-mt46h32m32lf-6.h"
|
||||
#include "hsmmc.h"
|
||||
#include "common-board-devices.h"
|
||||
|
||||
#define OVERO_GPIO_BT_XGATE 15
|
||||
#define OVERO_GPIO_W2W_NRESET 16
|
||||
|
@ -74,30 +75,6 @@
|
|||
#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(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 */
|
||||
static struct regulator_consumer_supply ads7846_supply =
|
||||
REGULATOR_SUPPLY("vcc", "spi1.0");
|
||||
|
@ -128,14 +105,7 @@ static struct platform_device vads7846_device = {
|
|||
|
||||
static void __init overo_ads7846_init(void)
|
||||
{
|
||||
if ((gpio_request(OVERO_GPIO_PENDOWN, "ADS7846_PENDOWN") == 0) &&
|
||||
(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;
|
||||
}
|
||||
|
||||
omap_ads7846_init(1, OVERO_GPIO_PENDOWN, 0, NULL);
|
||||
platform_device_register(&vads7846_device);
|
||||
}
|
||||
|
||||
|
@ -146,106 +116,28 @@ static inline void __init overo_ads7846_init(void) { return; }
|
|||
#if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE)
|
||||
|
||||
#include <linux/smsc911x.h>
|
||||
#include <plat/gpmc-smsc911x.h>
|
||||
|
||||
static struct resource overo_smsc911x_resources[] = {
|
||||
{
|
||||
.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",
|
||||
static struct omap_smsc911x_platform_data smsc911x_cfg = {
|
||||
.id = 0,
|
||||
.num_resources = ARRAY_SIZE(overo_smsc911x_resources),
|
||||
.resource = overo_smsc911x_resources,
|
||||
.dev = {
|
||||
.platform_data = &overo_smsc911x_config,
|
||||
},
|
||||
.cs = OVERO_SMSC911X_CS,
|
||||
.gpio_irq = OVERO_SMSC911X_GPIO,
|
||||
.gpio_reset = -EINVAL,
|
||||
.flags = SMSC911X_USE_32BIT,
|
||||
};
|
||||
|
||||
static struct platform_device overo_smsc911x2_device = {
|
||||
.name = "smsc911x",
|
||||
static struct omap_smsc911x_platform_data smsc911x2_cfg = {
|
||||
.id = 1,
|
||||
.num_resources = ARRAY_SIZE(overo_smsc911x2_resources),
|
||||
.resource = overo_smsc911x2_resources,
|
||||
.dev = {
|
||||
.platform_data = &overo_smsc911x_config,
|
||||
},
|
||||
.cs = OVERO_SMSC911X2_CS,
|
||||
.gpio_irq = OVERO_SMSC911X2_GPIO,
|
||||
.gpio_reset = -EINVAL,
|
||||
.flags = SMSC911X_USE_32BIT,
|
||||
};
|
||||
|
||||
static struct platform_device *smsc911x_devices[] = {
|
||||
&overo_smsc911x_device,
|
||||
&overo_smsc911x2_device,
|
||||
};
|
||||
|
||||
static inline void __init overo_init_smsc911x(void)
|
||||
static void __init overo_init_smsc911x(void)
|
||||
{
|
||||
unsigned long cs_mem_base, cs_mem_base2;
|
||||
|
||||
/* 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));
|
||||
gpmc_smsc911x_init(&smsc911x_cfg);
|
||||
gpmc_smsc911x_init(&smsc911x2_cfg);
|
||||
}
|
||||
|
||||
#else
|
||||
|
@ -259,21 +151,20 @@ static int dvi_enabled;
|
|||
#define OVERO_GPIO_LCD_EN 144
|
||||
#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)
|
||||
{
|
||||
if ((gpio_request(OVERO_GPIO_LCD_EN, "OVERO_GPIO_LCD_EN") == 0) &&
|
||||
(gpio_direction_output(OVERO_GPIO_LCD_EN, 1) == 0))
|
||||
gpio_export(OVERO_GPIO_LCD_EN, 0);
|
||||
else
|
||||
printk(KERN_ERR "could not obtain gpio for "
|
||||
"OVERO_GPIO_LCD_EN\n");
|
||||
if (gpio_request_array(overo_dss_gpios, ARRAY_SIZE(overo_dss_gpios))) {
|
||||
printk(KERN_ERR "could not obtain DSS control GPIOs\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if ((gpio_request(OVERO_GPIO_LCD_BL, "OVERO_GPIO_LCD_BL") == 0) &&
|
||||
(gpio_direction_output(OVERO_GPIO_LCD_BL, 1) == 0))
|
||||
gpio_export(OVERO_GPIO_LCD_BL, 0);
|
||||
else
|
||||
printk(KERN_ERR "could not obtain gpio for "
|
||||
"OVERO_GPIO_LCD_BL\n");
|
||||
gpio_export(OVERO_GPIO_LCD_EN, 0);
|
||||
gpio_export(OVERO_GPIO_LCD_BL, 0);
|
||||
}
|
||||
|
||||
static int overo_panel_enable_dvi(struct omap_dss_device *dssdev)
|
||||
|
@ -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[] = {
|
||||
{
|
||||
.mmc = 1,
|
||||
|
@ -648,37 +500,15 @@ static struct twl4030_platform_data overo_twldata = {
|
|||
.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)
|
||||
{
|
||||
omap_register_i2c_bus(1, 2600, overo_i2c_boardinfo,
|
||||
ARRAY_SIZE(overo_i2c_boardinfo));
|
||||
omap3_pmic_init("tps65950", &overo_twldata);
|
||||
/* i2c2 pins are used for gpio */
|
||||
omap_register_i2c_bus(3, 400, NULL, 0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
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) || \
|
||||
defined(CONFIG_PANEL_LGPHILIPS_LB035Q02_MODULE)
|
||||
{
|
||||
|
@ -722,20 +552,22 @@ static struct omap_board_mux board_mux[] __initdata = {
|
|||
};
|
||||
#endif
|
||||
|
||||
static struct omap_musb_board_data musb_board_data = {
|
||||
.interface_type = MUSB_INTERFACE_ULPI,
|
||||
.mode = MUSB_OTG,
|
||||
.power = 100,
|
||||
static struct gpio overo_bt_gpios[] __initdata = {
|
||||
{ OVERO_GPIO_BT_XGATE, GPIOF_OUT_INIT_LOW, "lcd enable" },
|
||||
{ OVERO_GPIO_BT_NRESET, GPIOF_OUT_INIT_HIGH, "lcd bl enable" },
|
||||
};
|
||||
|
||||
static void __init overo_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);
|
||||
overo_i2c_init();
|
||||
omap_display_init(&overo_dss_data);
|
||||
omap_serial_init();
|
||||
overo_flash_init();
|
||||
usb_musb_init(&musb_board_data);
|
||||
omap_nand_flash_init(0, overo_nand_partitions,
|
||||
ARRAY_SIZE(overo_nand_partitions));
|
||||
usb_musb_init(NULL);
|
||||
usbhs_init(&usbhs_bdata);
|
||||
overo_spi_init();
|
||||
overo_ads7846_init();
|
||||
|
@ -748,9 +580,9 @@ static void __init overo_init(void)
|
|||
omap_mux_init_signal("sdrc_cke0", OMAP_PIN_OUTPUT);
|
||||
omap_mux_init_signal("sdrc_cke1", OMAP_PIN_OUTPUT);
|
||||
|
||||
if ((gpio_request(OVERO_GPIO_W2W_NRESET,
|
||||
"OVERO_GPIO_W2W_NRESET") == 0) &&
|
||||
(gpio_direction_output(OVERO_GPIO_W2W_NRESET, 1) == 0)) {
|
||||
ret = gpio_request_one(OVERO_GPIO_W2W_NRESET, GPIOF_OUT_INIT_HIGH,
|
||||
"OVERO_GPIO_W2W_NRESET");
|
||||
if (ret == 0) {
|
||||
gpio_export(OVERO_GPIO_W2W_NRESET, 0);
|
||||
gpio_set_value(OVERO_GPIO_W2W_NRESET, 0);
|
||||
udelay(10);
|
||||
|
@ -760,25 +592,20 @@ static void __init overo_init(void)
|
|||
"OVERO_GPIO_W2W_NRESET\n");
|
||||
}
|
||||
|
||||
if ((gpio_request(OVERO_GPIO_BT_XGATE, "OVERO_GPIO_BT_XGATE") == 0) &&
|
||||
(gpio_direction_output(OVERO_GPIO_BT_XGATE, 0) == 0))
|
||||
ret = gpio_request_array(overo_bt_gpios, ARRAY_SIZE(overo_bt_gpios));
|
||||
if (ret) {
|
||||
pr_err("%s: could not obtain BT gpios\n", __func__);
|
||||
} else {
|
||||
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_set_value(OVERO_GPIO_BT_NRESET, 0);
|
||||
mdelay(6);
|
||||
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) &&
|
||||
(gpio_direction_output(OVERO_GPIO_USBH_CPEN, 1) == 0))
|
||||
ret = gpio_request_one(OVERO_GPIO_USBH_CPEN, GPIOF_OUT_INIT_HIGH,
|
||||
"OVERO_GPIO_USBH_CPEN");
|
||||
if (ret == 0)
|
||||
gpio_export(OVERO_GPIO_USBH_CPEN, 0);
|
||||
else
|
||||
printk(KERN_ERR "could not obtain gpio for "
|
||||
|
|
|
@ -31,6 +31,7 @@
|
|||
#include "mux.h"
|
||||
#include "hsmmc.h"
|
||||
#include "sdram-nokia.h"
|
||||
#include "common-board-devices.h"
|
||||
|
||||
static struct regulator_consumer_supply rm680_vemmc_consumers[] = {
|
||||
REGULATOR_SUPPLY("vmmc", "omap_hsmmc.1"),
|
||||
|
@ -90,19 +91,9 @@ static struct twl4030_platform_data rm680_twl_data = {
|
|||
/* 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)
|
||||
{
|
||||
omap_register_i2c_bus(1, 2900, rm680_twl_i2c_board_info,
|
||||
ARRAY_SIZE(rm680_twl_i2c_board_info));
|
||||
omap_pmic_init(1, 2900, "twl5031", INT_34XX_SYS_NIRQ, &rm680_twl_data);
|
||||
omap_register_i2c_bus(2, 400, NULL, 0);
|
||||
omap_register_i2c_bus(3, 400, NULL, 0);
|
||||
}
|
||||
|
@ -153,17 +144,11 @@ static struct omap_board_mux board_mux[] __initdata = {
|
|||
};
|
||||
#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)
|
||||
{
|
||||
omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);
|
||||
omap_serial_init();
|
||||
usb_musb_init(&rm680_musb_data);
|
||||
usb_musb_init(NULL);
|
||||
rm680_peripherals_init();
|
||||
}
|
||||
|
||||
|
|
|
@ -43,6 +43,7 @@
|
|||
|
||||
#include "mux.h"
|
||||
#include "hsmmc.h"
|
||||
#include "common-board-devices.h"
|
||||
|
||||
#define SYSTEM_REV_B_USES_VAUX3 0x1699
|
||||
#define SYSTEM_REV_S_USES_VAUX3 0x8
|
||||
|
@ -557,10 +558,8 @@ static __init void rx51_init_si4713(void)
|
|||
static int rx51_twlgpio_setup(struct device *dev, unsigned gpio, unsigned n)
|
||||
{
|
||||
/* FIXME this gpio setup is just a placeholder for now */
|
||||
gpio_request(gpio + 6, "backlight_pwm");
|
||||
gpio_direction_output(gpio + 6, 0);
|
||||
gpio_request(gpio + 7, "speaker_en");
|
||||
gpio_direction_output(gpio + 7, 1);
|
||||
gpio_request_one(gpio + 6, GPIOF_OUT_INIT_LOW, "backlight_pwm");
|
||||
gpio_request_one(gpio + 7, GPIOF_OUT_INIT_HIGH, "speaker_en");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -777,15 +776,6 @@ static struct tpa6130a2_platform_data rx51_tpa6130a2_data __initdata_or_module =
|
|||
.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 */
|
||||
static struct aic3x_setup_data rx51_aic34_setup = {
|
||||
.gpio_func[0] = AIC3X_GPIO1_FUNC_DISABLED,
|
||||
|
@ -833,8 +823,7 @@ static int __init rx51_i2c_init(void)
|
|||
rx51_twldata.vaux3 = &rx51_vaux3_cam;
|
||||
}
|
||||
rx51_twldata.vmmc2 = &rx51_vmmc2;
|
||||
omap_register_i2c_bus(1, 2200, rx51_peripherals_i2c_board_info_1,
|
||||
ARRAY_SIZE(rx51_peripherals_i2c_board_info_1));
|
||||
omap_pmic_init(1, 2200, "twl5030", INT_34XX_SYS_NIRQ, &rx51_twldata);
|
||||
omap_register_i2c_bus(2, 100, rx51_peripherals_i2c_board_info_2,
|
||||
ARRAY_SIZE(rx51_peripherals_i2c_board_info_2));
|
||||
omap_register_i2c_bus(3, 400, NULL, 0);
|
||||
|
@ -921,26 +910,20 @@ static void rx51_wl1251_set_power(bool 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)
|
||||
{
|
||||
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)
|
||||
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);
|
||||
if (irq < 0)
|
||||
goto err_irq;
|
||||
|
@ -952,10 +935,7 @@ static void __init rx51_init_wl1251(void)
|
|||
|
||||
err_irq:
|
||||
gpio_free(RX51_WL1251_IRQ_GPIO);
|
||||
|
||||
err_power:
|
||||
gpio_free(RX51_WL1251_POWER_GPIO);
|
||||
|
||||
error:
|
||||
printk(KERN_ERR "wl1251 board initialisation failed\n");
|
||||
wl1251_pdata.set_power = NULL;
|
||||
|
|
|
@ -76,13 +76,12 @@ static int __init rx51_video_init(void)
|
|||
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__);
|
||||
return 0;
|
||||
}
|
||||
|
||||
gpio_direction_output(RX51_LCD_RESET_GPIO, 1);
|
||||
|
||||
omap_display_init(&rx51_dss_board_info);
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -15,6 +15,7 @@
|
|||
#include <linux/interrupt.h>
|
||||
|
||||
#include <plat/gpmc.h>
|
||||
#include <plat/gpmc-smsc911x.h>
|
||||
|
||||
#include <mach/board-zoom.h>
|
||||
|
||||
|
@ -26,60 +27,16 @@
|
|||
#define DEBUG_BASE 0x08000000
|
||||
#define ZOOM_ETHR_START DEBUG_BASE
|
||||
|
||||
static struct resource zoom_smsc911x_resources[] = {
|
||||
[0] = {
|
||||
.start = ZOOM_ETHR_START,
|
||||
.end = ZOOM_ETHR_START + SZ_4K,
|
||||
.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,
|
||||
static struct omap_smsc911x_platform_data zoom_smsc911x_cfg = {
|
||||
.cs = ZOOM_SMSC911X_CS,
|
||||
.gpio_irq = ZOOM_SMSC911X_GPIO,
|
||||
.gpio_reset = -EINVAL,
|
||||
.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)
|
||||
{
|
||||
int eth_cs;
|
||||
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);
|
||||
gpmc_smsc911x_init(&zoom_smsc911x_cfg);
|
||||
}
|
||||
|
||||
static struct plat_serial8250_port serial_platform_data[] = {
|
||||
|
@ -120,12 +77,9 @@ static inline void __init zoom_init_quaduart(void)
|
|||
|
||||
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",
|
||||
quart_gpio);
|
||||
return;
|
||||
}
|
||||
gpio_direction_input(quart_gpio);
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
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"
|
||||
"board detect\n", debug_board_detect);
|
||||
return 0;
|
||||
}
|
||||
gpio_direction_input(debug_board_detect);
|
||||
|
||||
if (!gpio_get_value(debug_board_detect)) {
|
||||
ret = 0;
|
||||
|
@ -150,7 +104,6 @@ static inline int omap_zoom_debugboard_detect(void)
|
|||
}
|
||||
|
||||
static struct platform_device *zoom_devices[] __initdata = {
|
||||
&zoom_smsc911x_device,
|
||||
&zoom_debugboard_serial_device,
|
||||
};
|
||||
|
||||
|
|
|
@ -21,34 +21,19 @@
|
|||
#define LCD_PANEL_RESET_GPIO_PILOT 55
|
||||
#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)
|
||||
{
|
||||
int ret;
|
||||
unsigned char lcd_panel_reset_gpio;
|
||||
|
||||
lcd_panel_reset_gpio = (omap_rev() > OMAP3430_REV_ES3_0) ?
|
||||
zoom_lcd_gpios[0].gpio = (omap_rev() > OMAP3430_REV_ES3_0) ?
|
||||
LCD_PANEL_RESET_GPIO_PROD :
|
||||
LCD_PANEL_RESET_GPIO_PILOT;
|
||||
|
||||
ret = gpio_request(lcd_panel_reset_gpio, "lcd reset");
|
||||
if (ret) {
|
||||
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);
|
||||
if (gpio_request_array(zoom_lcd_gpios, ARRAY_SIZE(zoom_lcd_gpios)))
|
||||
pr_err("%s: Failed to get LCD GPIOs.\n", __func__);
|
||||
}
|
||||
|
||||
static int zoom_panel_enable_lcd(struct omap_dss_device *dssdev)
|
||||
|
|
|
@ -31,6 +31,7 @@
|
|||
|
||||
#include "mux.h"
|
||||
#include "hsmmc.h"
|
||||
#include "common-board-devices.h"
|
||||
|
||||
#define OMAP_ZOOM_WLAN_PMENA_GPIO (101)
|
||||
#define OMAP_ZOOM_WLAN_IRQ_GPIO (162)
|
||||
|
@ -276,13 +277,11 @@ static int zoom_twl_gpio_setup(struct device *dev,
|
|||
zoom_vsim_supply.dev = mmc[0].dev;
|
||||
zoom_vmmc2_supply.dev = mmc[1].dev;
|
||||
|
||||
ret = gpio_request(LCD_PANEL_ENABLE_GPIO, "lcd enable");
|
||||
if (ret) {
|
||||
ret = gpio_request_one(LCD_PANEL_ENABLE_GPIO, GPIOF_OUT_INIT_LOW,
|
||||
"lcd enable");
|
||||
if (ret)
|
||||
pr_err("Failed to get LCD_PANEL_ENABLE_GPIO (gpio%d).\n",
|
||||
LCD_PANEL_ENABLE_GPIO);
|
||||
return ret;
|
||||
}
|
||||
gpio_direction_output(LCD_PANEL_ENABLE_GPIO, 0);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
@ -349,15 +348,6 @@ static struct twl4030_platform_data zoom_twldata = {
|
|||
.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)
|
||||
{
|
||||
if (machine_is_omap_zoom2()) {
|
||||
|
@ -365,19 +355,12 @@ static int __init omap_i2c_init(void)
|
|||
zoom_audio_data.hs_extmute = 1;
|
||||
zoom_audio_data.set_hs_extmute = zoom2_set_hs_extmute;
|
||||
}
|
||||
omap_register_i2c_bus(1, 2400, zoom_i2c_boardinfo,
|
||||
ARRAY_SIZE(zoom_i2c_boardinfo));
|
||||
omap_pmic_init(1, 2400, "twl5030", INT_34XX_SYS_NIRQ, &zoom_twldata);
|
||||
omap_register_i2c_bus(2, 400, NULL, 0);
|
||||
omap_register_i2c_bus(3, 400, NULL, 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)
|
||||
{
|
||||
/* T2 interrupt line (keypad) */
|
||||
|
@ -392,7 +375,7 @@ void __init zoom_peripherals_init(void)
|
|||
|
||||
omap_i2c_init();
|
||||
platform_device_register(&omap_vwlan_device);
|
||||
usb_musb_init(&musb_board_data);
|
||||
usb_musb_init(NULL);
|
||||
enable_board_wakeup_source();
|
||||
omap_serial_init();
|
||||
}
|
||||
|
|
|
@ -115,6 +115,7 @@ int omap3_core_dpll_m2_set_rate(struct clk *clk, unsigned long rate)
|
|||
sdrc_cs0->rfr_ctrl, sdrc_cs0->actim_ctrla,
|
||||
sdrc_cs0->actim_ctrlb, sdrc_cs0->mr,
|
||||
0, 0, 0, 0);
|
||||
clk->rate = rate;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -0,0 +1,163 @@
|
|||
/*
|
||||
* 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
|
|
@ -0,0 +1,35 @@
|
|||
#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__ */
|
|
@ -147,25 +147,24 @@ void __init gpmc_smc91x_init(struct omap_smc91x_platform_data *board_data)
|
|||
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;
|
||||
|
||||
gpio_direction_input(gpmc_cfg->gpio_irq);
|
||||
gpmc_smc91x_resources[1].start = gpio_to_irq(gpmc_cfg->gpio_irq);
|
||||
|
||||
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)
|
||||
goto free2;
|
||||
gpio_direction_output(gpmc_cfg->gpio_pwrdwn, 0);
|
||||
}
|
||||
|
||||
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)
|
||||
goto free3;
|
||||
|
||||
gpio_direction_output(gpmc_cfg->gpio_reset, 0);
|
||||
gpio_set_value(gpmc_cfg->gpio_reset, 1);
|
||||
msleep(100);
|
||||
gpio_set_value(gpmc_cfg->gpio_reset, 0);
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
#define pr_fmt(fmt) "%s: " fmt, __func__
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
@ -30,7 +31,7 @@ static struct resource gpmc_smsc911x_resources[] = {
|
|||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.flags = IORESOURCE_IRQ,
|
||||
.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_LOWLEVEL,
|
||||
},
|
||||
};
|
||||
|
||||
|
@ -41,16 +42,6 @@ static struct smsc911x_platform_config gpmc_smsc911x_config = {
|
|||
.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
|
||||
* assume that pin multiplexing is done in the board-*.c file,
|
||||
|
@ -58,46 +49,49 @@ static struct platform_device gpmc_smsc911x_device = {
|
|||
*/
|
||||
void __init gpmc_smsc911x_init(struct omap_smsc911x_platform_data *board_data)
|
||||
{
|
||||
struct platform_device *pdev;
|
||||
unsigned long cs_mem_base;
|
||||
int ret;
|
||||
|
||||
gpmc_cfg = board_data;
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
gpmc_smsc911x_resources[0].start = cs_mem_base + 0x0;
|
||||
gpmc_smsc911x_resources[0].end = cs_mem_base + 0xff;
|
||||
|
||||
if (gpio_request(gpmc_cfg->gpio_irq, "smsc911x irq") < 0) {
|
||||
printk(KERN_ERR "Failed to request GPIO%d for smsc911x IRQ\n",
|
||||
gpmc_cfg->gpio_irq);
|
||||
if (gpio_request_one(gpmc_cfg->gpio_irq, GPIOF_IN, "smsc911x irq")) {
|
||||
pr_err("Failed to request IRQ GPIO%d\n", gpmc_cfg->gpio_irq);
|
||||
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].flags |=
|
||||
(gpmc_cfg->flags & IRQF_TRIGGER_MASK);
|
||||
|
||||
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) {
|
||||
printk(KERN_ERR "Failed to request GPIO%d for smsc911x reset\n",
|
||||
gpmc_cfg->gpio_reset);
|
||||
pr_err("Failed to request reset GPIO%d\n",
|
||||
gpmc_cfg->gpio_reset);
|
||||
goto free2;
|
||||
}
|
||||
|
||||
gpio_direction_output(gpmc_cfg->gpio_reset, 1);
|
||||
gpio_set_value(gpmc_cfg->gpio_reset, 0);
|
||||
msleep(100);
|
||||
gpio_set_value(gpmc_cfg->gpio_reset, 1);
|
||||
}
|
||||
|
||||
if (platform_device_register(&gpmc_smsc911x_device) < 0) {
|
||||
printk(KERN_ERR "Unable to register smsc911x device\n");
|
||||
if (gpmc_cfg->flags)
|
||||
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);
|
||||
goto free2;
|
||||
}
|
||||
|
@ -109,5 +103,5 @@ free2:
|
|||
free1:
|
||||
gpmc_cs_free(gpmc_cfg->cs);
|
||||
|
||||
printk(KERN_ERR "Could not initialize smsc911x\n");
|
||||
pr_err("Could not initialize smsc911x device\n");
|
||||
}
|
||||
|
|
|
@ -73,83 +73,18 @@ static u32 intc_bank_read_reg(struct omap_irq_bank *bank, u16 reg)
|
|||
return __raw_readl(bank->base_reg + reg);
|
||||
}
|
||||
|
||||
static int previous_irq;
|
||||
|
||||
/*
|
||||
* On 34xx we can get occasional spurious interrupts if the ack from
|
||||
* an interrupt handler does not get posted before we unmask. Warn about
|
||||
* the interrupt handlers that need to flush posted writes.
|
||||
*/
|
||||
static int omap_check_spurious(unsigned int irq)
|
||||
{
|
||||
u32 sir, spurious;
|
||||
|
||||
sir = intc_bank_read_reg(&irq_banks[0], INTC_SIR);
|
||||
spurious = sir >> 7;
|
||||
|
||||
if (spurious) {
|
||||
printk(KERN_WARNING "Spurious irq %i: 0x%08x, please flush "
|
||||
"posted write for irq %i\n",
|
||||
irq, sir, previous_irq);
|
||||
return spurious;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* XXX: FIQ and additional INTC support (only MPU at the moment) */
|
||||
static void omap_ack_irq(struct irq_data *d)
|
||||
{
|
||||
intc_bank_write_reg(0x1, &irq_banks[0], INTC_CONTROL);
|
||||
}
|
||||
|
||||
static void omap_mask_irq(struct irq_data *d)
|
||||
{
|
||||
unsigned int irq = d->irq;
|
||||
int offset = irq & (~(IRQ_BITS_PER_REG - 1));
|
||||
|
||||
if (cpu_is_omap34xx() && !cpu_is_ti816x()) {
|
||||
int spurious = 0;
|
||||
|
||||
/*
|
||||
* INT_34XX_GPT12_IRQ is also the spurious irq. Maybe because
|
||||
* it is the highest irq number?
|
||||
*/
|
||||
if (irq == INT_34XX_GPT12_IRQ)
|
||||
spurious = omap_check_spurious(irq);
|
||||
|
||||
if (!spurious)
|
||||
previous_irq = irq;
|
||||
}
|
||||
|
||||
irq &= (IRQ_BITS_PER_REG - 1);
|
||||
|
||||
intc_bank_write_reg(1 << irq, &irq_banks[0], INTC_MIR_SET0 + offset);
|
||||
}
|
||||
|
||||
static void omap_unmask_irq(struct irq_data *d)
|
||||
{
|
||||
unsigned int irq = d->irq;
|
||||
int offset = irq & (~(IRQ_BITS_PER_REG - 1));
|
||||
|
||||
irq &= (IRQ_BITS_PER_REG - 1);
|
||||
|
||||
intc_bank_write_reg(1 << irq, &irq_banks[0], INTC_MIR_CLEAR0 + offset);
|
||||
}
|
||||
|
||||
static void omap_mask_ack_irq(struct irq_data *d)
|
||||
{
|
||||
omap_mask_irq(d);
|
||||
irq_gc_mask_disable_reg(d);
|
||||
omap_ack_irq(d);
|
||||
}
|
||||
|
||||
static struct irq_chip omap_irq_chip = {
|
||||
.name = "INTC",
|
||||
.irq_ack = omap_mask_ack_irq,
|
||||
.irq_mask = omap_mask_irq,
|
||||
.irq_unmask = omap_unmask_irq,
|
||||
};
|
||||
|
||||
static void __init omap_irq_bank_init_one(struct omap_irq_bank *bank)
|
||||
{
|
||||
unsigned long tmp;
|
||||
|
@ -186,11 +121,31 @@ int omap_irq_pending(void)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static __init void
|
||||
omap_alloc_gc(void __iomem *base, unsigned int irq_start, unsigned int num)
|
||||
{
|
||||
struct irq_chip_generic *gc;
|
||||
struct irq_chip_type *ct;
|
||||
|
||||
gc = irq_alloc_generic_chip("INTC", 1, irq_start, base,
|
||||
handle_level_irq);
|
||||
ct = gc->chip_types;
|
||||
ct->chip.irq_ack = omap_mask_ack_irq;
|
||||
ct->chip.irq_mask = irq_gc_mask_disable_reg;
|
||||
ct->chip.irq_unmask = irq_gc_unmask_enable_reg;
|
||||
|
||||
ct->regs.ack = INTC_CONTROL;
|
||||
ct->regs.enable = INTC_MIR_CLEAR0;
|
||||
ct->regs.disable = INTC_MIR_SET0;
|
||||
irq_setup_generic_chip(gc, IRQ_MSK(num), IRQ_GC_INIT_MASK_CACHE,
|
||||
IRQ_NOREQUEST | IRQ_NOPROBE, 0);
|
||||
}
|
||||
|
||||
void __init omap_init_irq(void)
|
||||
{
|
||||
unsigned long nr_of_irqs = 0;
|
||||
unsigned int nr_banks = 0;
|
||||
int i;
|
||||
int i, j;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(irq_banks); i++) {
|
||||
unsigned long base = 0;
|
||||
|
@ -215,17 +170,15 @@ void __init omap_init_irq(void)
|
|||
|
||||
omap_irq_bank_init_one(bank);
|
||||
|
||||
for (i = 0, j = 0; i < bank->nr_irqs; i += 32, j += 0x20)
|
||||
omap_alloc_gc(bank->base_reg + j, i, 32);
|
||||
|
||||
nr_of_irqs += bank->nr_irqs;
|
||||
nr_banks++;
|
||||
}
|
||||
|
||||
printk(KERN_INFO "Total of %ld interrupts on %d active controller%s\n",
|
||||
nr_of_irqs, nr_banks, nr_banks > 1 ? "s" : "");
|
||||
|
||||
for (i = 0; i < nr_of_irqs; i++) {
|
||||
irq_set_chip_and_handler(i, &omap_irq_chip, handle_level_irq);
|
||||
set_irq_flags(i, IRQF_VALID);
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef CONFIG_ARCH_OMAP3
|
||||
|
|
|
@ -63,10 +63,7 @@ static irqreturn_t l3_interrupt_handler(int irq, void *_l3)
|
|||
char *source_name;
|
||||
|
||||
/* Get the Type of interrupt */
|
||||
if (irq == l3->app_irq)
|
||||
inttype = L3_APPLICATION_ERROR;
|
||||
else
|
||||
inttype = L3_DEBUG_ERROR;
|
||||
inttype = irq == l3->app_irq ? L3_APPLICATION_ERROR : L3_DEBUG_ERROR;
|
||||
|
||||
for (i = 0; i < L3_MODULES; i++) {
|
||||
/*
|
||||
|
@ -84,10 +81,10 @@ static irqreturn_t l3_interrupt_handler(int irq, void *_l3)
|
|||
|
||||
err_src = j;
|
||||
/* Read the stderrlog_main_source from clk domain */
|
||||
std_err_main_addr = base + (*(l3_targ[i] + err_src));
|
||||
std_err_main = readl(std_err_main_addr);
|
||||
std_err_main_addr = base + *(l3_targ[i] + err_src);
|
||||
std_err_main = readl(std_err_main_addr);
|
||||
|
||||
switch ((std_err_main & CUSTOM_ERROR)) {
|
||||
switch (std_err_main & CUSTOM_ERROR) {
|
||||
case STANDARD_ERROR:
|
||||
source_name =
|
||||
l3_targ_stderrlog_main_name[i][err_src];
|
||||
|
@ -132,49 +129,49 @@ static int __init omap4_l3_probe(struct platform_device *pdev)
|
|||
|
||||
l3 = kzalloc(sizeof(*l3), GFP_KERNEL);
|
||||
if (!l3)
|
||||
ret = -ENOMEM;
|
||||
return -ENOMEM;
|
||||
|
||||
platform_set_drvdata(pdev, l3);
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
if (!res) {
|
||||
dev_err(&pdev->dev, "couldn't find resource 0\n");
|
||||
ret = -ENODEV;
|
||||
goto err1;
|
||||
goto err0;
|
||||
}
|
||||
|
||||
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");
|
||||
ret = -ENOMEM;
|
||||
goto err2;
|
||||
goto err0;
|
||||
}
|
||||
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
|
||||
if (!res) {
|
||||
dev_err(&pdev->dev, "couldn't find resource 1\n");
|
||||
ret = -ENODEV;
|
||||
goto err3;
|
||||
goto err1;
|
||||
}
|
||||
|
||||
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");
|
||||
ret = -ENOMEM;
|
||||
goto err4;
|
||||
goto err1;
|
||||
}
|
||||
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 2);
|
||||
if (!res) {
|
||||
dev_err(&pdev->dev, "couldn't find resource 2\n");
|
||||
ret = -ENODEV;
|
||||
goto err5;
|
||||
goto err2;
|
||||
}
|
||||
|
||||
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");
|
||||
ret = -ENOMEM;
|
||||
goto err6;
|
||||
goto err2;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -187,7 +184,7 @@ static int __init omap4_l3_probe(struct platform_device *pdev)
|
|||
if (ret) {
|
||||
pr_crit("L3: request_irq failed to register for 0x%x\n",
|
||||
OMAP44XX_IRQ_L3_DBG);
|
||||
goto err7;
|
||||
goto err3;
|
||||
}
|
||||
l3->debug_irq = irq;
|
||||
|
||||
|
@ -198,24 +195,22 @@ static int __init omap4_l3_probe(struct platform_device *pdev)
|
|||
if (ret) {
|
||||
pr_crit("L3: request_irq failed to register for 0x%x\n",
|
||||
OMAP44XX_IRQ_L3_APP);
|
||||
goto err8;
|
||||
goto err4;
|
||||
}
|
||||
l3->app_irq = irq;
|
||||
|
||||
goto err0;
|
||||
err8:
|
||||
err7:
|
||||
iounmap(l3->l3_base[2]);
|
||||
err6:
|
||||
err5:
|
||||
iounmap(l3->l3_base[1]);
|
||||
return 0;
|
||||
|
||||
err4:
|
||||
free_irq(l3->debug_irq, l3);
|
||||
err3:
|
||||
iounmap(l3->l3_base[0]);
|
||||
iounmap(l3->l3_base[2]);
|
||||
err2:
|
||||
iounmap(l3->l3_base[1]);
|
||||
err1:
|
||||
kfree(l3);
|
||||
iounmap(l3->l3_base[0]);
|
||||
err0:
|
||||
kfree(l3);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
@ -155,7 +155,7 @@ static irqreturn_t omap3_l3_block_irq(struct omap3_l3 *l3,
|
|||
u8 multi = error & L3_ERROR_LOG_MULTI;
|
||||
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_initiator_string(initid),
|
||||
multi ? "Multiple Errors" : "",
|
||||
|
@ -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)
|
||||
{
|
||||
struct omap3_l3 *l3 = _l3;
|
||||
|
||||
u64 status, clear;
|
||||
u64 error;
|
||||
u64 error_addr;
|
||||
u64 err_source = 0;
|
||||
void __iomem *base;
|
||||
int int_type;
|
||||
|
||||
irqreturn_t ret = IRQ_NONE;
|
||||
|
||||
if (irq == l3->app_irq)
|
||||
int_type = L3_APPLICATION_ERROR;
|
||||
else
|
||||
int_type = L3_DEBUG_ERROR;
|
||||
|
||||
int_type = irq == l3->app_irq ? L3_APPLICATION_ERROR : L3_DEBUG_ERROR;
|
||||
if (!int_type) {
|
||||
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)
|
|||
|
||||
base = l3->rt + *(omap3_l3_bases[int_type] + err_source);
|
||||
error = omap3_l3_readll(base, L3_ERROR_LOG);
|
||||
|
||||
if (error) {
|
||||
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)
|
|||
}
|
||||
|
||||
/* Clear the status register */
|
||||
clear = ((L3_AGENT_STATUS_CLEAR_IA << int_type) |
|
||||
(L3_AGENT_STATUS_CLEAR_TA));
|
||||
|
||||
clear = (L3_AGENT_STATUS_CLEAR_IA << int_type) |
|
||||
L3_AGENT_STATUS_CLEAR_TA;
|
||||
omap3_l3_writell(base, L3_AGENT_STATUS, clear);
|
||||
|
||||
/* clear the error log register */
|
||||
|
@ -228,10 +220,8 @@ static int __init omap3_l3_probe(struct platform_device *pdev)
|
|||
int ret;
|
||||
|
||||
l3 = kzalloc(sizeof(*l3), GFP_KERNEL);
|
||||
if (!l3) {
|
||||
ret = -ENOMEM;
|
||||
goto err0;
|
||||
}
|
||||
if (!l3)
|
||||
return -ENOMEM;
|
||||
|
||||
platform_set_drvdata(pdev, l3);
|
||||
|
||||
|
@ -239,13 +229,13 @@ static int __init omap3_l3_probe(struct platform_device *pdev)
|
|||
if (!res) {
|
||||
dev_err(&pdev->dev, "couldn't find resource\n");
|
||||
ret = -ENODEV;
|
||||
goto err1;
|
||||
goto err0;
|
||||
}
|
||||
l3->rt = ioremap(res->start, resource_size(res));
|
||||
if (!(l3->rt)) {
|
||||
if (!l3->rt) {
|
||||
dev_err(&pdev->dev, "ioremap failed\n");
|
||||
ret = -ENOMEM;
|
||||
goto err2;
|
||||
goto err0;
|
||||
}
|
||||
|
||||
l3->debug_irq = platform_get_irq(pdev, 0);
|
||||
|
@ -254,28 +244,26 @@ static int __init omap3_l3_probe(struct platform_device *pdev)
|
|||
"l3-debug-irq", l3);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "couldn't request debug irq\n");
|
||||
goto err3;
|
||||
goto err1;
|
||||
}
|
||||
|
||||
l3->app_irq = platform_get_irq(pdev, 1);
|
||||
ret = request_irq(l3->app_irq, omap3_l3_app_irq,
|
||||
IRQF_DISABLED | IRQF_TRIGGER_RISING,
|
||||
"l3-app-irq", l3);
|
||||
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "couldn't request app irq\n");
|
||||
goto err4;
|
||||
goto err2;
|
||||
}
|
||||
|
||||
goto err0;
|
||||
return 0;
|
||||
|
||||
err4:
|
||||
err3:
|
||||
iounmap(l3->rt);
|
||||
err2:
|
||||
free_irq(l3->debug_irq, l3);
|
||||
err1:
|
||||
kfree(l3);
|
||||
iounmap(l3->rt);
|
||||
err0:
|
||||
kfree(l3);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
@ -105,13 +105,11 @@ static int __init omap4_pm_init(void)
|
|||
|
||||
pr_err("Power Management for TI OMAP4.\n");
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
ret = pwrdm_for_each(pwrdms_setup, NULL);
|
||||
if (ret) {
|
||||
pr_err("Failed to setup powerdomains\n");
|
||||
goto err2;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_SUSPEND
|
||||
suspend_set_ops(&omap_pm_ops);
|
||||
|
|
|
@ -847,6 +847,14 @@ static int __init omap_sr_probe(struct platform_device *pdev)
|
|||
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);
|
||||
|
||||
pm_runtime_enable(&pdev->dev);
|
||||
|
@ -883,7 +891,7 @@ static int __init omap_sr_probe(struct platform_device *pdev)
|
|||
ret = sr_late_init(sr_info);
|
||||
if (ret) {
|
||||
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)
|
|||
vdd_dbg_dir = omap_voltage_get_dbgdir(sr_info->voltdm);
|
||||
if (!vdd_dbg_dir) {
|
||||
ret = -EINVAL;
|
||||
goto err_release_region;
|
||||
goto err_iounmap;
|
||||
}
|
||||
|
||||
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)
|
|||
dev_err(&pdev->dev, "%s: Unable to create debugfs directory\n",
|
||||
__func__);
|
||||
ret = PTR_ERR(sr_info->dbg_dir);
|
||||
goto err_release_region;
|
||||
goto err_iounmap;
|
||||
}
|
||||
|
||||
(void) debugfs_create_file("autocomp", S_IRUGO | S_IWUSR,
|
||||
|
@ -921,7 +929,7 @@ static int __init omap_sr_probe(struct platform_device *pdev)
|
|||
dev_err(&pdev->dev, "%s: Unable to create debugfs directory"
|
||||
"for n-values\n", __func__);
|
||||
ret = PTR_ERR(nvalue_dir);
|
||||
goto err_release_region;
|
||||
goto err_debugfs;
|
||||
}
|
||||
|
||||
omap_voltage_get_volttable(sr_info->voltdm, &volt_data);
|
||||
|
@ -931,7 +939,7 @@ static int __init omap_sr_probe(struct platform_device *pdev)
|
|||
"entries for n-values\n",
|
||||
__func__, sr_info->voltdm->name);
|
||||
ret = -ENODATA;
|
||||
goto err_release_region;
|
||||
goto err_debugfs;
|
||||
}
|
||||
|
||||
for (i = 0; i < sr_info->nvalue_count; i++) {
|
||||
|
@ -945,6 +953,11 @@ static int __init omap_sr_probe(struct platform_device *pdev)
|
|||
|
||||
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:
|
||||
release_mem_region(mem->start, resource_size(mem));
|
||||
err_free_devinfo:
|
||||
|
|
|
@ -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_device *od;
|
||||
|
@ -116,6 +122,12 @@ void __init usb_musb_init(struct omap_musb_board_data *board_data)
|
|||
struct device *dev;
|
||||
int bus_id = -1;
|
||||
const char *oh_name, *name;
|
||||
struct omap_musb_board_data *board_data;
|
||||
|
||||
if (musb_board_data)
|
||||
board_data = musb_board_data;
|
||||
else
|
||||
board_data = &musb_default_board_data;
|
||||
|
||||
if (cpu_is_omap3517() || cpu_is_omap3505()) {
|
||||
} else if (cpu_is_omap44xx()) {
|
||||
|
|
|
@ -293,12 +293,11 @@ tusb6010_setup_interface(struct musb_hdrc_platform_data *data,
|
|||
);
|
||||
|
||||
/* IRQ */
|
||||
status = gpio_request(irq, "TUSB6010 irq");
|
||||
status = gpio_request_one(irq, GPIOF_IN, "TUSB6010 irq");
|
||||
if (status < 0) {
|
||||
printk(error, 3, status);
|
||||
return status;
|
||||
}
|
||||
gpio_direction_input(irq);
|
||||
tusb_resources[2].start = irq + IH_GPIO_BASE;
|
||||
|
||||
/* set up memory timings ... can speed them up later */
|
||||
|
|
|
@ -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);
|
||||
pr_notice("curr_vsel = %x\n", vsel);
|
||||
|
||||
if (!vdd->pmic_info->vsel_to_uv) {
|
||||
pr_warning("PMIC function to convert vsel to voltage"
|
||||
|
|
|
@ -14,14 +14,14 @@
|
|||
#ifndef __ASM_ARCH_OMAP_GPMC_SMSC911X_H__
|
||||
|
||||
struct omap_smsc911x_platform_data {
|
||||
int id;
|
||||
int cs;
|
||||
int gpio_irq;
|
||||
int gpio_reset;
|
||||
u32 flags;
|
||||
};
|
||||
|
||||
#if defined(CONFIG_SMSC911X) || \
|
||||
defined(CONFIG_SMSC911X_MODULE)
|
||||
#if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE)
|
||||
|
||||
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)
|
|||
DEBUG_LL_OMAP1(3, sx1);
|
||||
|
||||
/* omap2 based boards using UART1 */
|
||||
DEBUG_LL_OMAP2(1, omap2evm);
|
||||
DEBUG_LL_OMAP2(1, omap_2430sdp);
|
||||
DEBUG_LL_OMAP2(1, omap_apollon);
|
||||
DEBUG_LL_OMAP2(1, omap_h4);
|
||||
|
|
|
@ -793,6 +793,8 @@ static irqreturn_t iommu_fault_handler(int irq, void *data)
|
|||
clk_enable(obj->clk);
|
||||
errs = iommu_report_fault(obj, &da);
|
||||
clk_disable(obj->clk);
|
||||
if (errs == 0)
|
||||
return IRQ_HANDLED;
|
||||
|
||||
/* Fault callback or TLB/PTE Dynamic loading */
|
||||
if (obj->isr && !obj->isr(obj, da, errs, obj->isr_priv))
|
||||
|
|
|
@ -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_3430SDP) += lcd_2430sdp.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_OMAP3_BEAGLE) += lcd_omap3beagle.o
|
||||
objs-y$(CONFIG_FB_OMAP_LCD_MIPID) += lcd_mipid.o
|
||||
|
|
|
@ -1,192 +0,0 @@
|
|||
/*
|
||||
* 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);
|
|
@ -53,12 +53,13 @@ typedef void (*irq_preflow_handler_t)(struct irq_data *data);
|
|||
* Bits which can be modified via irq_set/clear/modify_status_flags()
|
||||
* IRQ_LEVEL - Interrupt is level type. Will be also
|
||||
* updated in the code when the above trigger
|
||||
* bits are modified via set_irq_type()
|
||||
* bits are modified via irq_set_irq_type()
|
||||
* IRQ_PER_CPU - Mark an interrupt PER_CPU. Will protect
|
||||
* it from affinity setting
|
||||
* IRQ_NOPROBE - Interrupt cannot be probed by autoprobing
|
||||
* IRQ_NOREQUEST - Interrupt cannot be requested via
|
||||
* request_irq()
|
||||
* IRQ_NOTHREAD - Interrupt cannot be threaded
|
||||
* IRQ_NOAUTOEN - Interrupt is not automatically enabled in
|
||||
* request/setup_irq()
|
||||
* IRQ_NO_BALANCING - Interrupt cannot be balanced (affinity set)
|
||||
|
@ -85,6 +86,7 @@ enum {
|
|||
IRQ_NO_BALANCING = (1 << 13),
|
||||
IRQ_MOVE_PCNTXT = (1 << 14),
|
||||
IRQ_NESTED_THREAD = (1 << 15),
|
||||
IRQ_NOTHREAD = (1 << 16),
|
||||
};
|
||||
|
||||
#define IRQF_MODIFY_MASK \
|
||||
|
@ -261,23 +263,6 @@ static inline void irqd_clr_chained_irq_inprogress(struct irq_data *d)
|
|||
* struct irq_chip - hardware interrupt chip descriptor
|
||||
*
|
||||
* @name: name for /proc/interrupts
|
||||
* @startup: deprecated, replaced by irq_startup
|
||||
* @shutdown: deprecated, replaced by irq_shutdown
|
||||
* @enable: deprecated, replaced by irq_enable
|
||||
* @disable: deprecated, replaced by irq_disable
|
||||
* @ack: deprecated, replaced by irq_ack
|
||||
* @mask: deprecated, replaced by irq_mask
|
||||
* @mask_ack: deprecated, replaced by irq_mask_ack
|
||||
* @unmask: deprecated, replaced by irq_unmask
|
||||
* @eoi: deprecated, replaced by irq_eoi
|
||||
* @end: deprecated, will go away with __do_IRQ()
|
||||
* @set_affinity: deprecated, replaced by irq_set_affinity
|
||||
* @retrigger: deprecated, replaced by irq_retrigger
|
||||
* @set_type: deprecated, replaced by irq_set_type
|
||||
* @set_wake: deprecated, replaced by irq_wake
|
||||
* @bus_lock: deprecated, replaced by irq_bus_lock
|
||||
* @bus_sync_unlock: deprecated, replaced by irq_bus_sync_unlock
|
||||
*
|
||||
* @irq_startup: start up the interrupt (defaults to ->enable if NULL)
|
||||
* @irq_shutdown: shut down the interrupt (defaults to ->disable if NULL)
|
||||
* @irq_enable: enable the interrupt (defaults to chip->unmask if NULL)
|
||||
|
@ -295,6 +280,9 @@ static inline void irqd_clr_chained_irq_inprogress(struct irq_data *d)
|
|||
* @irq_bus_sync_unlock:function to sync and unlock slow bus (i2c) chips
|
||||
* @irq_cpu_online: configure an interrupt source for a secondary CPU
|
||||
* @irq_cpu_offline: un-configure an interrupt source for a secondary CPU
|
||||
* @irq_suspend: function called from core code on suspend once per chip
|
||||
* @irq_resume: function called from core code on resume once per chip
|
||||
* @irq_pm_shutdown: function called from core code on shutdown once per chip
|
||||
* @irq_print_chip: optional to print special chip info in show_interrupts
|
||||
* @flags: chip specific flags
|
||||
*
|
||||
|
@ -324,6 +312,10 @@ struct irq_chip {
|
|||
void (*irq_cpu_online)(struct irq_data *data);
|
||||
void (*irq_cpu_offline)(struct irq_data *data);
|
||||
|
||||
void (*irq_suspend)(struct irq_data *data);
|
||||
void (*irq_resume)(struct irq_data *data);
|
||||
void (*irq_pm_shutdown)(struct irq_data *data);
|
||||
|
||||
void (*irq_print_chip)(struct irq_data *data, struct seq_file *p);
|
||||
|
||||
unsigned long flags;
|
||||
|
@ -439,7 +431,7 @@ irq_set_handler(unsigned int irq, irq_flow_handler_t handle)
|
|||
/*
|
||||
* Set a highlevel chained flow handler for a given IRQ.
|
||||
* (a chained handler is automatically enabled and set to
|
||||
* IRQ_NOREQUEST and IRQ_NOPROBE)
|
||||
* IRQ_NOREQUEST, IRQ_NOPROBE, and IRQ_NOTHREAD)
|
||||
*/
|
||||
static inline void
|
||||
irq_set_chained_handler(unsigned int irq, irq_flow_handler_t handle)
|
||||
|
@ -469,6 +461,16 @@ static inline void irq_set_probe(unsigned int irq)
|
|||
irq_modify_status(irq, IRQ_NOPROBE, 0);
|
||||
}
|
||||
|
||||
static inline void irq_set_nothread(unsigned int irq)
|
||||
{
|
||||
irq_modify_status(irq, 0, IRQ_NOTHREAD);
|
||||
}
|
||||
|
||||
static inline void irq_set_thread(unsigned int irq)
|
||||
{
|
||||
irq_modify_status(irq, IRQ_NOTHREAD, 0);
|
||||
}
|
||||
|
||||
static inline void irq_set_nested_thread(unsigned int irq, bool nest)
|
||||
{
|
||||
if (nest)
|
||||
|
@ -573,6 +575,145 @@ static inline int irq_reserve_irq(unsigned int irq)
|
|||
return irq_reserve_irqs(irq, 1);
|
||||
}
|
||||
|
||||
#ifndef irq_reg_writel
|
||||
# define irq_reg_writel(val, addr) writel(val, addr)
|
||||
#endif
|
||||
#ifndef irq_reg_readl
|
||||
# define irq_reg_readl(addr) readl(addr)
|
||||
#endif
|
||||
|
||||
/**
|
||||
* struct irq_chip_regs - register offsets for struct irq_gci
|
||||
* @enable: Enable register offset to reg_base
|
||||
* @disable: Disable register offset to reg_base
|
||||
* @mask: Mask register offset to reg_base
|
||||
* @ack: Ack register offset to reg_base
|
||||
* @eoi: Eoi register offset to reg_base
|
||||
* @type: Type configuration register offset to reg_base
|
||||
* @polarity: Polarity configuration register offset to reg_base
|
||||
*/
|
||||
struct irq_chip_regs {
|
||||
unsigned long enable;
|
||||
unsigned long disable;
|
||||
unsigned long mask;
|
||||
unsigned long ack;
|
||||
unsigned long eoi;
|
||||
unsigned long type;
|
||||
unsigned long polarity;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct irq_chip_type - Generic interrupt chip instance for a flow type
|
||||
* @chip: The real interrupt chip which provides the callbacks
|
||||
* @regs: Register offsets for this chip
|
||||
* @handler: Flow handler associated with this chip
|
||||
* @type: Chip can handle these flow types
|
||||
*
|
||||
* A irq_generic_chip can have several instances of irq_chip_type when
|
||||
* it requires different functions and register offsets for different
|
||||
* flow types.
|
||||
*/
|
||||
struct irq_chip_type {
|
||||
struct irq_chip chip;
|
||||
struct irq_chip_regs regs;
|
||||
irq_flow_handler_t handler;
|
||||
u32 type;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct irq_chip_generic - Generic irq chip data structure
|
||||
* @lock: Lock to protect register and cache data access
|
||||
* @reg_base: Register base address (virtual)
|
||||
* @irq_base: Interrupt base nr for this chip
|
||||
* @irq_cnt: Number of interrupts handled by this chip
|
||||
* @mask_cache: Cached mask register
|
||||
* @type_cache: Cached type register
|
||||
* @polarity_cache: Cached polarity register
|
||||
* @wake_enabled: Interrupt can wakeup from suspend
|
||||
* @wake_active: Interrupt is marked as an wakeup from suspend source
|
||||
* @num_ct: Number of available irq_chip_type instances (usually 1)
|
||||
* @private: Private data for non generic chip callbacks
|
||||
* @list: List head for keeping track of instances
|
||||
* @chip_types: Array of interrupt irq_chip_types
|
||||
*
|
||||
* Note, that irq_chip_generic can have multiple irq_chip_type
|
||||
* implementations which can be associated to a particular irq line of
|
||||
* an irq_chip_generic instance. That allows to share and protect
|
||||
* state in an irq_chip_generic instance when we need to implement
|
||||
* different flow mechanisms (level/edge) for it.
|
||||
*/
|
||||
struct irq_chip_generic {
|
||||
raw_spinlock_t lock;
|
||||
void __iomem *reg_base;
|
||||
unsigned int irq_base;
|
||||
unsigned int irq_cnt;
|
||||
u32 mask_cache;
|
||||
u32 type_cache;
|
||||
u32 polarity_cache;
|
||||
u32 wake_enabled;
|
||||
u32 wake_active;
|
||||
unsigned int num_ct;
|
||||
void *private;
|
||||
struct list_head list;
|
||||
struct irq_chip_type chip_types[0];
|
||||
};
|
||||
|
||||
/**
|
||||
* enum irq_gc_flags - Initialization flags for generic irq chips
|
||||
* @IRQ_GC_INIT_MASK_CACHE: Initialize the mask_cache by reading mask reg
|
||||
* @IRQ_GC_INIT_NESTED_LOCK: Set the lock class of the irqs to nested for
|
||||
* irq chips which need to call irq_set_wake() on
|
||||
* the parent irq. Usually GPIO implementations
|
||||
*/
|
||||
enum irq_gc_flags {
|
||||
IRQ_GC_INIT_MASK_CACHE = 1 << 0,
|
||||
IRQ_GC_INIT_NESTED_LOCK = 1 << 1,
|
||||
};
|
||||
|
||||
/* Generic chip callback functions */
|
||||
void irq_gc_noop(struct irq_data *d);
|
||||
void irq_gc_mask_disable_reg(struct irq_data *d);
|
||||
void irq_gc_mask_set_bit(struct irq_data *d);
|
||||
void irq_gc_mask_clr_bit(struct irq_data *d);
|
||||
void irq_gc_unmask_enable_reg(struct irq_data *d);
|
||||
void irq_gc_ack(struct irq_data *d);
|
||||
void irq_gc_mask_disable_reg_and_ack(struct irq_data *d);
|
||||
void irq_gc_eoi(struct irq_data *d);
|
||||
int irq_gc_set_wake(struct irq_data *d, unsigned int on);
|
||||
|
||||
/* Setup functions for irq_chip_generic */
|
||||
struct irq_chip_generic *
|
||||
irq_alloc_generic_chip(const char *name, int nr_ct, unsigned int irq_base,
|
||||
void __iomem *reg_base, irq_flow_handler_t handler);
|
||||
void irq_setup_generic_chip(struct irq_chip_generic *gc, u32 msk,
|
||||
enum irq_gc_flags flags, unsigned int clr,
|
||||
unsigned int set);
|
||||
int irq_setup_alt_chip(struct irq_data *d, unsigned int type);
|
||||
void irq_remove_generic_chip(struct irq_chip_generic *gc, u32 msk,
|
||||
unsigned int clr, unsigned int set);
|
||||
|
||||
static inline struct irq_chip_type *irq_data_get_chip_type(struct irq_data *d)
|
||||
{
|
||||
return container_of(d->chip, struct irq_chip_type, chip);
|
||||
}
|
||||
|
||||
#define IRQ_MSK(n) (u32)((n) < 32 ? ((1 << (n)) - 1) : UINT_MAX)
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
static inline void irq_gc_lock(struct irq_chip_generic *gc)
|
||||
{
|
||||
raw_spin_lock(&gc->lock);
|
||||
}
|
||||
|
||||
static inline void irq_gc_unlock(struct irq_chip_generic *gc)
|
||||
{
|
||||
raw_spin_unlock(&gc->lock);
|
||||
}
|
||||
#else
|
||||
static inline void irq_gc_lock(struct irq_chip_generic *gc) { }
|
||||
static inline void irq_gc_unlock(struct irq_chip_generic *gc) { }
|
||||
#endif
|
||||
|
||||
#endif /* CONFIG_GENERIC_HARDIRQS */
|
||||
|
||||
#endif /* !CONFIG_S390 */
|
||||
|
|
|
@ -16,16 +16,18 @@ struct timer_rand_state;
|
|||
* @irq_data: per irq and chip data passed down to chip functions
|
||||
* @timer_rand_state: pointer to timer rand state struct
|
||||
* @kstat_irqs: irq stats per cpu
|
||||
* @handle_irq: highlevel irq-events handler [if NULL, __do_IRQ()]
|
||||
* @handle_irq: highlevel irq-events handler
|
||||
* @preflow_handler: handler called before the flow handler (currently used by sparc)
|
||||
* @action: the irq action chain
|
||||
* @status: status information
|
||||
* @core_internal_state__do_not_mess_with_it: core internal status information
|
||||
* @depth: disable-depth, for nested irq_disable() calls
|
||||
* @wake_depth: enable depth, for multiple set_irq_wake() callers
|
||||
* @wake_depth: enable depth, for multiple irq_set_irq_wake() callers
|
||||
* @irq_count: stats field to detect stalled irqs
|
||||
* @last_unhandled: aging timer for unhandled count
|
||||
* @irqs_unhandled: stats field for spurious unhandled interrupts
|
||||
* @lock: locking for SMP
|
||||
* @affinity_hint: hint to user space for preferred irq affinity
|
||||
* @affinity_notify: context for notification of affinity changes
|
||||
* @pending_mask: pending rebalanced interrupts
|
||||
* @threads_oneshot: bitfield to handle shared oneshot threads
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
|
||||
obj-y := irqdesc.o handle.o manage.o spurious.o resend.o chip.o dummychip.o devres.o
|
||||
obj-y += generic-chip.o
|
||||
obj-$(CONFIG_GENERIC_IRQ_PROBE) += autoprobe.o
|
||||
obj-$(CONFIG_PROC_FS) += proc.o
|
||||
obj-$(CONFIG_GENERIC_PENDING_IRQ) += migration.o
|
||||
|
|
|
@ -573,6 +573,7 @@ __irq_set_handler(unsigned int irq, irq_flow_handler_t handle, int is_chained,
|
|||
if (handle != handle_bad_irq && is_chained) {
|
||||
irq_settings_set_noprobe(desc);
|
||||
irq_settings_set_norequest(desc);
|
||||
irq_settings_set_nothread(desc);
|
||||
irq_startup(desc);
|
||||
}
|
||||
out:
|
||||
|
|
|
@ -27,6 +27,7 @@ static inline void print_irq_desc(unsigned int irq, struct irq_desc *desc)
|
|||
P(IRQ_PER_CPU);
|
||||
P(IRQ_NOPROBE);
|
||||
P(IRQ_NOREQUEST);
|
||||
P(IRQ_NOTHREAD);
|
||||
P(IRQ_NOAUTOEN);
|
||||
|
||||
PS(IRQS_AUTODETECT);
|
||||
|
|
|
@ -0,0 +1,354 @@
|
|||
/*
|
||||
* Library implementing the most common irq chip callback functions
|
||||
*
|
||||
* Copyright (C) 2011, Thomas Gleixner
|
||||
*/
|
||||
#include <linux/io.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/kernel_stat.h>
|
||||
#include <linux/syscore_ops.h>
|
||||
|
||||
#include "internals.h"
|
||||
|
||||
static LIST_HEAD(gc_list);
|
||||
static DEFINE_RAW_SPINLOCK(gc_lock);
|
||||
|
||||
static inline struct irq_chip_regs *cur_regs(struct irq_data *d)
|
||||
{
|
||||
return &container_of(d->chip, struct irq_chip_type, chip)->regs;
|
||||
}
|
||||
|
||||
/**
|
||||
* irq_gc_noop - NOOP function
|
||||
* @d: irq_data
|
||||
*/
|
||||
void irq_gc_noop(struct irq_data *d)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* irq_gc_mask_disable_reg - Mask chip via disable register
|
||||
* @d: irq_data
|
||||
*
|
||||
* Chip has separate enable/disable registers instead of a single mask
|
||||
* register.
|
||||
*/
|
||||
void irq_gc_mask_disable_reg(struct irq_data *d)
|
||||
{
|
||||
struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d);
|
||||
u32 mask = 1 << (d->irq - gc->irq_base);
|
||||
|
||||
irq_gc_lock(gc);
|
||||
irq_reg_writel(mask, gc->reg_base + cur_regs(d)->disable);
|
||||
gc->mask_cache &= ~mask;
|
||||
irq_gc_unlock(gc);
|
||||
}
|
||||
|
||||
/**
|
||||
* irq_gc_mask_set_mask_bit - Mask chip via setting bit in mask register
|
||||
* @d: irq_data
|
||||
*
|
||||
* Chip has a single mask register. Values of this register are cached
|
||||
* and protected by gc->lock
|
||||
*/
|
||||
void irq_gc_mask_set_bit(struct irq_data *d)
|
||||
{
|
||||
struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d);
|
||||
u32 mask = 1 << (d->irq - gc->irq_base);
|
||||
|
||||
irq_gc_lock(gc);
|
||||
gc->mask_cache |= mask;
|
||||
irq_reg_writel(gc->mask_cache, gc->reg_base + cur_regs(d)->mask);
|
||||
irq_gc_unlock(gc);
|
||||
}
|
||||
|
||||
/**
|
||||
* irq_gc_mask_set_mask_bit - Mask chip via clearing bit in mask register
|
||||
* @d: irq_data
|
||||
*
|
||||
* Chip has a single mask register. Values of this register are cached
|
||||
* and protected by gc->lock
|
||||
*/
|
||||
void irq_gc_mask_clr_bit(struct irq_data *d)
|
||||
{
|
||||
struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d);
|
||||
u32 mask = 1 << (d->irq - gc->irq_base);
|
||||
|
||||
irq_gc_lock(gc);
|
||||
gc->mask_cache &= ~mask;
|
||||
irq_reg_writel(gc->mask_cache, gc->reg_base + cur_regs(d)->mask);
|
||||
irq_gc_unlock(gc);
|
||||
}
|
||||
|
||||
/**
|
||||
* irq_gc_unmask_enable_reg - Unmask chip via enable register
|
||||
* @d: irq_data
|
||||
*
|
||||
* Chip has separate enable/disable registers instead of a single mask
|
||||
* register.
|
||||
*/
|
||||
void irq_gc_unmask_enable_reg(struct irq_data *d)
|
||||
{
|
||||
struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d);
|
||||
u32 mask = 1 << (d->irq - gc->irq_base);
|
||||
|
||||
irq_gc_lock(gc);
|
||||
irq_reg_writel(mask, gc->reg_base + cur_regs(d)->enable);
|
||||
gc->mask_cache |= mask;
|
||||
irq_gc_unlock(gc);
|
||||
}
|
||||
|
||||
/**
|
||||
* irq_gc_ack - Ack pending interrupt
|
||||
* @d: irq_data
|
||||
*/
|
||||
void irq_gc_ack(struct irq_data *d)
|
||||
{
|
||||
struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d);
|
||||
u32 mask = 1 << (d->irq - gc->irq_base);
|
||||
|
||||
irq_gc_lock(gc);
|
||||
irq_reg_writel(mask, gc->reg_base + cur_regs(d)->ack);
|
||||
irq_gc_unlock(gc);
|
||||
}
|
||||
|
||||
/**
|
||||
* irq_gc_mask_disable_reg_and_ack- Mask and ack pending interrupt
|
||||
* @d: irq_data
|
||||
*/
|
||||
void irq_gc_mask_disable_reg_and_ack(struct irq_data *d)
|
||||
{
|
||||
struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d);
|
||||
u32 mask = 1 << (d->irq - gc->irq_base);
|
||||
|
||||
irq_gc_lock(gc);
|
||||
irq_reg_writel(mask, gc->reg_base + cur_regs(d)->mask);
|
||||
irq_reg_writel(mask, gc->reg_base + cur_regs(d)->ack);
|
||||
irq_gc_unlock(gc);
|
||||
}
|
||||
|
||||
/**
|
||||
* irq_gc_eoi - EOI interrupt
|
||||
* @d: irq_data
|
||||
*/
|
||||
void irq_gc_eoi(struct irq_data *d)
|
||||
{
|
||||
struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d);
|
||||
u32 mask = 1 << (d->irq - gc->irq_base);
|
||||
|
||||
irq_gc_lock(gc);
|
||||
irq_reg_writel(mask, gc->reg_base + cur_regs(d)->eoi);
|
||||
irq_gc_unlock(gc);
|
||||
}
|
||||
|
||||
/**
|
||||
* irq_gc_set_wake - Set/clr wake bit for an interrupt
|
||||
* @d: irq_data
|
||||
*
|
||||
* For chips where the wake from suspend functionality is not
|
||||
* configured in a separate register and the wakeup active state is
|
||||
* just stored in a bitmask.
|
||||
*/
|
||||
int irq_gc_set_wake(struct irq_data *d, unsigned int on)
|
||||
{
|
||||
struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d);
|
||||
u32 mask = 1 << (d->irq - gc->irq_base);
|
||||
|
||||
if (!(mask & gc->wake_enabled))
|
||||
return -EINVAL;
|
||||
|
||||
irq_gc_lock(gc);
|
||||
if (on)
|
||||
gc->wake_active |= mask;
|
||||
else
|
||||
gc->wake_active &= ~mask;
|
||||
irq_gc_unlock(gc);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* irq_alloc_generic_chip - Allocate a generic chip and initialize it
|
||||
* @name: Name of the irq chip
|
||||
* @num_ct: Number of irq_chip_type instances associated with this
|
||||
* @irq_base: Interrupt base nr for this chip
|
||||
* @reg_base: Register base address (virtual)
|
||||
* @handler: Default flow handler associated with this chip
|
||||
*
|
||||
* Returns an initialized irq_chip_generic structure. The chip defaults
|
||||
* to the primary (index 0) irq_chip_type and @handler
|
||||
*/
|
||||
struct irq_chip_generic *
|
||||
irq_alloc_generic_chip(const char *name, int num_ct, unsigned int irq_base,
|
||||
void __iomem *reg_base, irq_flow_handler_t handler)
|
||||
{
|
||||
struct irq_chip_generic *gc;
|
||||
unsigned long sz = sizeof(*gc) + num_ct * sizeof(struct irq_chip_type);
|
||||
|
||||
gc = kzalloc(sz, GFP_KERNEL);
|
||||
if (gc) {
|
||||
raw_spin_lock_init(&gc->lock);
|
||||
gc->num_ct = num_ct;
|
||||
gc->irq_base = irq_base;
|
||||
gc->reg_base = reg_base;
|
||||
gc->chip_types->chip.name = name;
|
||||
gc->chip_types->handler = handler;
|
||||
}
|
||||
return gc;
|
||||
}
|
||||
|
||||
/*
|
||||
* Separate lockdep class for interrupt chip which can nest irq_desc
|
||||
* lock.
|
||||
*/
|
||||
static struct lock_class_key irq_nested_lock_class;
|
||||
|
||||
/**
|
||||
* irq_setup_generic_chip - Setup a range of interrupts with a generic chip
|
||||
* @gc: Generic irq chip holding all data
|
||||
* @msk: Bitmask holding the irqs to initialize relative to gc->irq_base
|
||||
* @flags: Flags for initialization
|
||||
* @clr: IRQ_* bits to clear
|
||||
* @set: IRQ_* bits to set
|
||||
*
|
||||
* Set up max. 32 interrupts starting from gc->irq_base. Note, this
|
||||
* initializes all interrupts to the primary irq_chip_type and its
|
||||
* associated handler.
|
||||
*/
|
||||
void irq_setup_generic_chip(struct irq_chip_generic *gc, u32 msk,
|
||||
enum irq_gc_flags flags, unsigned int clr,
|
||||
unsigned int set)
|
||||
{
|
||||
struct irq_chip_type *ct = gc->chip_types;
|
||||
unsigned int i;
|
||||
|
||||
raw_spin_lock(&gc_lock);
|
||||
list_add_tail(&gc->list, &gc_list);
|
||||
raw_spin_unlock(&gc_lock);
|
||||
|
||||
/* Init mask cache ? */
|
||||
if (flags & IRQ_GC_INIT_MASK_CACHE)
|
||||
gc->mask_cache = irq_reg_readl(gc->reg_base + ct->regs.mask);
|
||||
|
||||
for (i = gc->irq_base; msk; msk >>= 1, i++) {
|
||||
if (!msk & 0x01)
|
||||
continue;
|
||||
|
||||
if (flags & IRQ_GC_INIT_NESTED_LOCK)
|
||||
irq_set_lockdep_class(i, &irq_nested_lock_class);
|
||||
|
||||
irq_set_chip_and_handler(i, &ct->chip, ct->handler);
|
||||
irq_set_chip_data(i, gc);
|
||||
irq_modify_status(i, clr, set);
|
||||
}
|
||||
gc->irq_cnt = i - gc->irq_base;
|
||||
}
|
||||
|
||||
/**
|
||||
* irq_setup_alt_chip - Switch to alternative chip
|
||||
* @d: irq_data for this interrupt
|
||||
* @type Flow type to be initialized
|
||||
*
|
||||
* Only to be called from chip->irq_set_type() callbacks.
|
||||
*/
|
||||
int irq_setup_alt_chip(struct irq_data *d, unsigned int type)
|
||||
{
|
||||
struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d);
|
||||
struct irq_chip_type *ct = gc->chip_types;
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < gc->num_ct; i++, ct++) {
|
||||
if (ct->type & type) {
|
||||
d->chip = &ct->chip;
|
||||
irq_data_to_desc(d)->handle_irq = ct->handler;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/**
|
||||
* irq_remove_generic_chip - Remove a chip
|
||||
* @gc: Generic irq chip holding all data
|
||||
* @msk: Bitmask holding the irqs to initialize relative to gc->irq_base
|
||||
* @clr: IRQ_* bits to clear
|
||||
* @set: IRQ_* bits to set
|
||||
*
|
||||
* Remove up to 32 interrupts starting from gc->irq_base.
|
||||
*/
|
||||
void irq_remove_generic_chip(struct irq_chip_generic *gc, u32 msk,
|
||||
unsigned int clr, unsigned int set)
|
||||
{
|
||||
unsigned int i = gc->irq_base;
|
||||
|
||||
raw_spin_lock(&gc_lock);
|
||||
list_del(&gc->list);
|
||||
raw_spin_unlock(&gc_lock);
|
||||
|
||||
for (; msk; msk >>= 1, i++) {
|
||||
if (!msk & 0x01)
|
||||
continue;
|
||||
|
||||
/* Remove handler first. That will mask the irq line */
|
||||
irq_set_handler(i, NULL);
|
||||
irq_set_chip(i, &no_irq_chip);
|
||||
irq_set_chip_data(i, NULL);
|
||||
irq_modify_status(i, clr, set);
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
static int irq_gc_suspend(void)
|
||||
{
|
||||
struct irq_chip_generic *gc;
|
||||
|
||||
list_for_each_entry(gc, &gc_list, list) {
|
||||
struct irq_chip_type *ct = gc->chip_types;
|
||||
|
||||
if (ct->chip.irq_suspend)
|
||||
ct->chip.irq_suspend(irq_get_irq_data(gc->irq_base));
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void irq_gc_resume(void)
|
||||
{
|
||||
struct irq_chip_generic *gc;
|
||||
|
||||
list_for_each_entry(gc, &gc_list, list) {
|
||||
struct irq_chip_type *ct = gc->chip_types;
|
||||
|
||||
if (ct->chip.irq_resume)
|
||||
ct->chip.irq_resume(irq_get_irq_data(gc->irq_base));
|
||||
}
|
||||
}
|
||||
#else
|
||||
#define irq_gc_suspend NULL
|
||||
#define irq_gc_resume NULL
|
||||
#endif
|
||||
|
||||
static void irq_gc_shutdown(void)
|
||||
{
|
||||
struct irq_chip_generic *gc;
|
||||
|
||||
list_for_each_entry(gc, &gc_list, list) {
|
||||
struct irq_chip_type *ct = gc->chip_types;
|
||||
|
||||
if (ct->chip.irq_pm_shutdown)
|
||||
ct->chip.irq_pm_shutdown(irq_get_irq_data(gc->irq_base));
|
||||
}
|
||||
}
|
||||
|
||||
static struct syscore_ops irq_gc_syscore_ops = {
|
||||
.suspend = irq_gc_suspend,
|
||||
.resume = irq_gc_resume,
|
||||
.shutdown = irq_gc_shutdown,
|
||||
};
|
||||
|
||||
static int __init irq_gc_init_ops(void)
|
||||
{
|
||||
register_syscore_ops(&irq_gc_syscore_ops);
|
||||
return 0;
|
||||
}
|
||||
device_initcall(irq_gc_init_ops);
|
|
@ -900,7 +900,8 @@ __setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new)
|
|||
*/
|
||||
new->handler = irq_nested_primary_handler;
|
||||
} else {
|
||||
irq_setup_forced_threading(new);
|
||||
if (irq_settings_can_thread(desc))
|
||||
irq_setup_forced_threading(new);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -8,6 +8,7 @@ enum {
|
|||
_IRQ_LEVEL = IRQ_LEVEL,
|
||||
_IRQ_NOPROBE = IRQ_NOPROBE,
|
||||
_IRQ_NOREQUEST = IRQ_NOREQUEST,
|
||||
_IRQ_NOTHREAD = IRQ_NOTHREAD,
|
||||
_IRQ_NOAUTOEN = IRQ_NOAUTOEN,
|
||||
_IRQ_MOVE_PCNTXT = IRQ_MOVE_PCNTXT,
|
||||
_IRQ_NO_BALANCING = IRQ_NO_BALANCING,
|
||||
|
@ -20,6 +21,7 @@ enum {
|
|||
#define IRQ_LEVEL GOT_YOU_MORON
|
||||
#define IRQ_NOPROBE GOT_YOU_MORON
|
||||
#define IRQ_NOREQUEST GOT_YOU_MORON
|
||||
#define IRQ_NOTHREAD GOT_YOU_MORON
|
||||
#define IRQ_NOAUTOEN GOT_YOU_MORON
|
||||
#define IRQ_NESTED_THREAD GOT_YOU_MORON
|
||||
#undef IRQF_MODIFY_MASK
|
||||
|
@ -94,6 +96,21 @@ static inline void irq_settings_set_norequest(struct irq_desc *desc)
|
|||
desc->status_use_accessors |= _IRQ_NOREQUEST;
|
||||
}
|
||||
|
||||
static inline bool irq_settings_can_thread(struct irq_desc *desc)
|
||||
{
|
||||
return !(desc->status_use_accessors & _IRQ_NOTHREAD);
|
||||
}
|
||||
|
||||
static inline void irq_settings_clr_nothread(struct irq_desc *desc)
|
||||
{
|
||||
desc->status_use_accessors &= ~_IRQ_NOTHREAD;
|
||||
}
|
||||
|
||||
static inline void irq_settings_set_nothread(struct irq_desc *desc)
|
||||
{
|
||||
desc->status_use_accessors |= _IRQ_NOTHREAD;
|
||||
}
|
||||
|
||||
static inline bool irq_settings_can_probe(struct irq_desc *desc)
|
||||
{
|
||||
return !(desc->status_use_accessors & _IRQ_NOPROBE);
|
||||
|
|
|
@ -65,14 +65,6 @@ config SND_OMAP_SOC_OVERO
|
|||
Say Y if you want to add support for SoC audio on the
|
||||
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
|
||||
tristate "SoC Audio support for OMAP3EVM board"
|
||||
depends on TWL4030_CORE && SND_OMAP_SOC && MACH_OMAP3EVM
|
||||
|
|
|
@ -13,7 +13,6 @@ snd-soc-rx51-objs := rx51.o
|
|||
snd-soc-ams-delta-objs := ams-delta.o
|
||||
snd-soc-osk5912-objs := osk5912.o
|
||||
snd-soc-overo-objs := overo.o
|
||||
snd-soc-omap2evm-objs := omap2evm.o
|
||||
snd-soc-omap3evm-objs := omap3evm.o
|
||||
snd-soc-am3517evm-objs := am3517evm.o
|
||||
snd-soc-sdp3430-objs := sdp3430.o
|
||||
|
|
|
@ -1,139 +0,0 @@
|
|||
/*
|
||||
* 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");
|
Загрузка…
Ссылка в новой задаче