linux-omap2 git: sync with Sakomans tree
authorKoen Kooi <koen@openembedded.org>
Wed, 9 Jul 2008 10:07:17 +0000 (10:07 +0000)
committerKoen Kooi <koen@openembedded.org>
Wed, 9 Jul 2008 10:07:17 +0000 (10:07 +0000)
packages/linux/linux-omap2-git/omap3evm/defconfig
packages/linux/linux-omap2-git/omap3evm/soc.patch [new file with mode: 0644]
packages/linux/linux-omap2-git/omap3evm/timer-suppression.patch [new file with mode: 0644]
packages/linux/linux-omap2-git/omap3evm/touchscreen.patch [new file with mode: 0644]

index f74cef9..e61fad4 100644 (file)
@@ -1,7 +1,7 @@
 #
 # Automatically generated make config: don't edit
-# Linux kernel version: 2.6.26-rc3-omap1
-# Wed May 21 07:38:41 2008
+# Linux kernel version: 2.6.26-rc5-omap1
+# Sun Jun 15 21:58:01 2008
 #
 CONFIG_ARM=y
 CONFIG_SYS_SUPPORTS_APM_EMULATION=y
@@ -42,7 +42,8 @@ CONFIG_BSD_PROCESS_ACCT=y
 # CONFIG_BSD_PROCESS_ACCT_V3 is not set
 # CONFIG_TASKSTATS is not set
 # CONFIG_AUDIT is not set
-# CONFIG_IKCONFIG is not set
+CONFIG_IKCONFIG=y
+CONFIG_IKCONFIG_PROC=y
 CONFIG_LOG_BUF_SHIFT=14
 # CONFIG_CGROUPS is not set
 CONFIG_GROUP_SCHED=y
@@ -170,9 +171,9 @@ CONFIG_ARCH_OMAP3=y
 #
 # OMAP Feature Selections
 #
-CONFIG_OMAP_DEBUG_SRAM_PATCH=y
 # CONFIG_OMAP_DEBUG_POWERDOMAIN is not set
 # CONFIG_OMAP_DEBUG_CLOCKDOMAIN is not set
+# CONFIG_OMAP_SMARTREFLEX is not set
 # CONFIG_OMAP_RESET_CLOCKS is not set
 CONFIG_OMAP_BOOT_TAG=y
 CONFIG_OMAP_BOOT_REASON=y
@@ -186,9 +187,9 @@ CONFIG_OMAP_MCBSP=y
 CONFIG_OMAP_32K_TIMER=y
 CONFIG_OMAP_32K_TIMER_HZ=128
 CONFIG_OMAP_DM_TIMER=y
-# CONFIG_OMAP_LL_DEBUG_UART1 is not set
+CONFIG_OMAP_LL_DEBUG_UART1=y
 # CONFIG_OMAP_LL_DEBUG_UART2 is not set
-CONFIG_OMAP_LL_DEBUG_UART3=y
+# CONFIG_OMAP_LL_DEBUG_UART3 is not set
 CONFIG_ARCH_OMAP34XX=y
 CONFIG_ARCH_OMAP3430=y
 
@@ -232,10 +233,6 @@ CONFIG_ARM_THUMB=y
 # CONFIG_ARM_THUMBEE is not set
 # CONFIG_CPU_ICACHE_DISABLE is not set
 # CONFIG_CPU_DCACHE_DISABLE is not set
-# CONFIG_CPU_LOCKDOWN_TO_64K_L2 is not set
-# CONFIG_CPU_LOCKDOWN_TO_128K_L2 is not set
-CONFIG_CPU_LOCKDOWN_TO_256K_L2=y
-# CONFIG_CPU_L2CACHE_DISABLE is not set
 # CONFIG_CPU_BPREDICT_DISABLE is not set
 CONFIG_HAS_TLS_REG=y
 # CONFIG_OUTER_CACHE is not set
@@ -257,7 +254,7 @@ CONFIG_GENERIC_CLOCKEVENTS_BUILD=y
 # CONFIG_PREEMPT is not set
 CONFIG_HZ=128
 CONFIG_AEABI=y
-CONFIG_OABI_COMPAT=y
+# CONFIG_OABI_COMPAT is not set
 # CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
 CONFIG_SELECT_MEMORY_MODEL=y
 CONFIG_FLATMEM_MANUAL=y
@@ -286,6 +283,15 @@ CONFIG_CMDLINE=" quiet "
 # CONFIG_KEXEC is not set
 
 #
+# CPUIdle
+#
+
+#
+# CPU idle PM support
+#
+# CONFIG_CPU_IDLE is not set
+
+#
 # CPU Frequency scaling
 #
 # CONFIG_CPU_FREQ is not set
@@ -297,9 +303,6 @@ CONFIG_CMDLINE=" quiet "
 #
 # At least one emulation must be selected
 #
-CONFIG_FPE_NWFPE=y
-# CONFIG_FPE_NWFPE_XP is not set
-# CONFIG_FPE_FASTFPE is not set
 CONFIG_VFP=y
 CONFIG_VFPv3=y
 # CONFIG_NEON is not set
@@ -593,9 +596,42 @@ CONFIG_HAVE_IDE=y
 # SCSI device support
 #
 # CONFIG_RAID_ATTRS is not set
-# CONFIG_SCSI is not set
-# CONFIG_SCSI_DMA is not set
+CONFIG_SCSI=y
+CONFIG_SCSI_DMA=y
+# CONFIG_SCSI_TGT is not set
 # CONFIG_SCSI_NETLINK is not set
+CONFIG_SCSI_PROC_FS=y
+
+#
+# SCSI support type (disk, tape, CD-ROM)
+#
+CONFIG_BLK_DEV_SD=y
+# CONFIG_CHR_DEV_ST is not set
+# CONFIG_CHR_DEV_OSST is not set
+# CONFIG_BLK_DEV_SR is not set
+# CONFIG_CHR_DEV_SG is not set
+# CONFIG_CHR_DEV_SCH is not set
+
+#
+# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
+#
+# CONFIG_SCSI_MULTI_LUN is not set
+# CONFIG_SCSI_CONSTANTS is not set
+# CONFIG_SCSI_LOGGING is not set
+# CONFIG_SCSI_SCAN_ASYNC is not set
+CONFIG_SCSI_WAIT_SCAN=m
+
+#
+# SCSI Transports
+#
+# CONFIG_SCSI_SPI_ATTRS is not set
+# CONFIG_SCSI_FC_ATTRS is not set
+# CONFIG_SCSI_ISCSI_ATTRS is not set
+# CONFIG_SCSI_SAS_LIBSAS is not set
+# CONFIG_SCSI_SRP_ATTRS is not set
+CONFIG_SCSI_LOWLEVEL=y
+# CONFIG_ISCSI_TCP is not set
+# CONFIG_SCSI_DEBUG is not set
 # CONFIG_ATA is not set
 # CONFIG_MD is not set
 CONFIG_NETDEVICES=y
@@ -697,7 +733,10 @@ CONFIG_INPUT=y
 #
 # Userland interfaces
 #
-# CONFIG_INPUT_MOUSEDEV is not set
+CONFIG_INPUT_MOUSEDEV=y
+CONFIG_INPUT_MOUSEDEV_PSAUX=y
+CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
 # CONFIG_INPUT_JOYDEV is not set
 CONFIG_INPUT_EVDEV=y
 CONFIG_INPUT_EVBUG=y
@@ -714,7 +753,18 @@ CONFIG_INPUT_KEYBOARD=y
 # CONFIG_KEYBOARD_STOWAWAY is not set
 # CONFIG_KEYBOARD_LM8323 is not set
 # CONFIG_KEYBOARD_GPIO is not set
-# CONFIG_INPUT_MOUSE is not set
+CONFIG_INPUT_MOUSE=y
+CONFIG_MOUSE_PS2=y
+CONFIG_MOUSE_PS2_ALPS=y
+CONFIG_MOUSE_PS2_LOGIPS2PP=y
+CONFIG_MOUSE_PS2_SYNAPTICS=y
+CONFIG_MOUSE_PS2_LIFEBOOK=y
+CONFIG_MOUSE_PS2_TRACKPOINT=y
+# CONFIG_MOUSE_PS2_TOUCHKIT is not set
+# CONFIG_MOUSE_SERIAL is not set
+# CONFIG_MOUSE_APPLETOUCH is not set
+# CONFIG_MOUSE_VSXXXAA is not set
+# CONFIG_MOUSE_GPIO is not set
 # CONFIG_INPUT_JOYSTICK is not set
 # CONFIG_INPUT_TABLET is not set
 CONFIG_INPUT_TOUCHSCREEN=y
@@ -737,7 +787,10 @@ CONFIG_TOUCHSCREEN_ADS7846=y
 #
 # Hardware I/O ports
 #
-# CONFIG_SERIO is not set
+CONFIG_SERIO=y
+CONFIG_SERIO_SERPORT=y
+CONFIG_SERIO_LIBPS2=y
+# CONFIG_SERIO_RAW is not set
 # CONFIG_GAMEPORT is not set
 
 #
@@ -950,9 +1003,17 @@ CONFIG_DUMMY_CONSOLE=y
 CONFIG_FRAMEBUFFER_CONSOLE=y
 # CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set
 CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
-# CONFIG_FONTS is not set
-CONFIG_FONT_8x8=y
+CONFIG_FONTS=y
+# CONFIG_FONT_8x8 is not set
 CONFIG_FONT_8x16=y
+# CONFIG_FONT_6x11 is not set
+# CONFIG_FONT_7x14 is not set
+# CONFIG_FONT_PEARL_8x8 is not set
+# CONFIG_FONT_ACORN_8x8 is not set
+# CONFIG_FONT_MINI_4x6 is not set
+# CONFIG_FONT_SUN8x16 is not set
+# CONFIG_FONT_SUN12x22 is not set
+# CONFIG_FONT_10x18 is not set
 # CONFIG_LOGO is not set
 
 #
@@ -966,9 +1027,11 @@ CONFIG_SOUND=y
 CONFIG_SND=y
 CONFIG_SND_TIMER=y
 CONFIG_SND_PCM=y
+CONFIG_SND_HWDEP=y
+CONFIG_SND_RAWMIDI=y
 # CONFIG_SND_SEQUENCER is not set
 CONFIG_SND_OSSEMUL=y
-# CONFIG_SND_MIXER_OSS is not set
+CONFIG_SND_MIXER_OSS=y
 CONFIG_SND_PCM_OSS=y
 CONFIG_SND_PCM_OSS_PLUGINS=y
 # CONFIG_SND_DYNAMIC_MINORS is not set
@@ -1003,7 +1066,7 @@ CONFIG_SND_PCM_XRUN_DEBUG=y
 #
 # USB devices
 #
-# CONFIG_SND_USB_AUDIO is not set
+CONFIG_SND_USB_AUDIO=y
 # CONFIG_SND_USB_CAIAQ is not set
 
 #
@@ -1027,8 +1090,6 @@ CONFIG_SND_SOC_TWL4030=y
 # Open Sound System
 #
 CONFIG_SOUND_PRIME=y
-# CONFIG_SOUND_MSNDCLAS is not set
-# CONFIG_SOUND_MSNDPIN is not set
 CONFIG_HID_SUPPORT=y
 CONFIG_HID=y
 # CONFIG_HID_DEBUG is not set
@@ -1077,7 +1138,7 @@ CONFIG_USB_OHCI_HCD=y
 CONFIG_USB_OHCI_LITTLE_ENDIAN=y
 CONFIG_USB_SL811_HCD=y
 CONFIG_USB_R8A66597_HCD=y
-CONFIG_USB_MUSB_HDRC=m
+CONFIG_USB_MUSB_HDRC=y
 CONFIG_USB_MUSB_SOC=y
 
 #
@@ -1086,7 +1147,6 @@ CONFIG_USB_MUSB_SOC=y
 CONFIG_USB_MUSB_HOST=y
 # CONFIG_USB_MUSB_PERIPHERAL is not set
 # CONFIG_USB_MUSB_OTG is not set
-# CONFIG_USB_GADGET_MUSB_HDRC is not set
 CONFIG_USB_MUSB_HDRC_HCD=y
 # CONFIG_MUSB_PIO_ONLY is not set
 CONFIG_USB_INVENTRA_DMA=y
@@ -1098,6 +1158,7 @@ CONFIG_USB_MUSB_LOGLEVEL=0
 #
 # CONFIG_USB_ACM is not set
 # CONFIG_USB_PRINTER is not set
+# CONFIG_USB_WDM is not set
 
 #
 # NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
@@ -1106,12 +1167,27 @@ CONFIG_USB_MUSB_LOGLEVEL=0
 #
 # may also be needed; see USB_STORAGE Help for more information
 #
-# CONFIG_USB_LIBUSUAL is not set
+CONFIG_USB_STORAGE=y
+# CONFIG_USB_STORAGE_DEBUG is not set
+# CONFIG_USB_STORAGE_DATAFAB is not set
+# CONFIG_USB_STORAGE_FREECOM is not set
+# CONFIG_USB_STORAGE_ISD200 is not set
+# CONFIG_USB_STORAGE_DPCM is not set
+# CONFIG_USB_STORAGE_USBAT is not set
+# CONFIG_USB_STORAGE_SDDR09 is not set
+# CONFIG_USB_STORAGE_SDDR55 is not set
+# CONFIG_USB_STORAGE_JUMPSHOT is not set
+# CONFIG_USB_STORAGE_ALAUDA is not set
+# CONFIG_USB_STORAGE_ONETOUCH is not set
+# CONFIG_USB_STORAGE_KARMA is not set
+# CONFIG_USB_STORAGE_CYPRESS_ATACB is not set
+CONFIG_USB_LIBUSUAL=y
 
 #
 # USB Imaging devices
 #
 # CONFIG_USB_MDC800 is not set
+# CONFIG_USB_MICROTEK is not set
 CONFIG_USB_MON=y
 
 #
@@ -1142,34 +1218,8 @@ CONFIG_USB_MON=y
 # CONFIG_USB_TRANCEVIBRATOR is not set
 # CONFIG_USB_IOWARRIOR is not set
 # CONFIG_USB_TEST is not set
-CONFIG_USB_GADGET=m
-# CONFIG_USB_GADGET_DEBUG is not set
-# CONFIG_USB_GADGET_DEBUG_FILES is not set
-CONFIG_USB_GADGET_SELECTED=y
-# CONFIG_USB_GADGET_AMD5536UDC is not set
-# CONFIG_USB_GADGET_ATMEL_USBA is not set
-# CONFIG_USB_GADGET_FSL_USB2 is not set
-# CONFIG_USB_GADGET_NET2280 is not set
-# CONFIG_USB_GADGET_PXA2XX is not set
-# CONFIG_USB_GADGET_M66592 is not set
-# CONFIG_USB_GADGET_PXA27X is not set
-# CONFIG_USB_GADGET_GOKU is not set
-# CONFIG_USB_GADGET_LH7A40X is not set
-CONFIG_USB_GADGET_OMAP=y
-CONFIG_USB_OMAP=m
-# CONFIG_USB_GADGET_S3C2410 is not set
-# CONFIG_USB_GADGET_AT91 is not set
-# CONFIG_USB_GADGET_DUMMY_HCD is not set
-# CONFIG_USB_GADGET_DUALSPEED is not set
-# CONFIG_USB_ZERO is not set
-CONFIG_USB_ETH=m
-CONFIG_USB_ETH_RNDIS=y
-CONFIG_USB_GADGETFS=m
-CONFIG_USB_FILE_STORAGE=m
-# CONFIG_USB_FILE_STORAGE_TEST is not set
-CONFIG_USB_G_SERIAL=m
-# CONFIG_USB_MIDI_GADGET is not set
-CONFIG_USB_G_PRINTER=m
+# CONFIG_USB_ISIGHTFW is not set
+# CONFIG_USB_GADGET is not set
 CONFIG_MMC=y
 # CONFIG_MMC_DEBUG is not set
 CONFIG_MMC_UNSAFE_RESUME=y
@@ -1180,6 +1230,7 @@ CONFIG_MMC_UNSAFE_RESUME=y
 CONFIG_MMC_BLOCK=y
 CONFIG_MMC_BLOCK_BOUNCE=y
 CONFIG_SDIO_UART=m
+# CONFIG_MMC_TEST is not set
 
 #
 # MMC/SD Host Controller Drivers
@@ -1259,7 +1310,7 @@ CONFIG_EXT3_FS=y
 CONFIG_JBD=y
 # CONFIG_REISERFS_FS is not set
 # CONFIG_JFS_FS is not set
-# CONFIG_FS_POSIX_ACL is not set
+CONFIG_FS_POSIX_ACL=y
 CONFIG_XFS_FS=m
 CONFIG_XFS_QUOTA=y
 # CONFIG_XFS_POSIX_ACL is not set
@@ -1327,12 +1378,14 @@ CONFIG_JFFS2_FS_DEBUG=0
 CONFIG_JFFS2_FS_WRITEBUFFER=y
 # CONFIG_JFFS2_FS_WBUF_VERIFY is not set
 CONFIG_JFFS2_SUMMARY=y
-# CONFIG_JFFS2_FS_XATTR is not set
+CONFIG_JFFS2_FS_XATTR=y
+CONFIG_JFFS2_FS_POSIX_ACL=y
+CONFIG_JFFS2_FS_SECURITY=y
 CONFIG_JFFS2_COMPRESSION_OPTIONS=y
 CONFIG_JFFS2_ZLIB=y
-# CONFIG_JFFS2_LZO is not set
+CONFIG_JFFS2_LZO=y
 CONFIG_JFFS2_RTIME=y
-# CONFIG_JFFS2_RUBIN is not set
+CONFIG_JFFS2_RUBIN=y
 # CONFIG_JFFS2_CMODE_NONE is not set
 CONFIG_JFFS2_CMODE_PRIORITY=y
 # CONFIG_JFFS2_CMODE_SIZE is not set
@@ -1461,7 +1514,7 @@ CONFIG_FRAME_POINTER=y
 # CONFIG_DEBUG_USER is not set
 # CONFIG_DEBUG_ERRORS is not set
 # CONFIG_DEBUG_STACK_USAGE is not set
-CONFIG_DEBUG_LL=y
+# CONFIG_DEBUG_LL is not set
 # CONFIG_DEBUG_ICEDCC is not set
 
 #
@@ -1561,6 +1614,8 @@ CONFIG_CRC32=y
 CONFIG_LIBCRC32C=y
 CONFIG_ZLIB_INFLATE=y
 CONFIG_ZLIB_DEFLATE=y
+CONFIG_LZO_COMPRESS=y
+CONFIG_LZO_DECOMPRESS=y
 CONFIG_PLIST=y
 CONFIG_HAS_IOMEM=y
 CONFIG_HAS_IOPORT=y
diff --git a/packages/linux/linux-omap2-git/omap3evm/soc.patch b/packages/linux/linux-omap2-git/omap3evm/soc.patch
new file mode 100644 (file)
index 0000000..bb97403
--- /dev/null
@@ -0,0 +1,1173 @@
+diff --git a/sound/soc/codecs/Kconfig b/sound/soc/codecs/Kconfig
+index 3903ab7..468536d 100644
+--- a/sound/soc/codecs/Kconfig
++++ b/sound/soc/codecs/Kconfig
+@@ -44,3 +44,7 @@ config SND_SOC_CS4270_VD33_ERRATA
+ config SND_SOC_TLV320AIC3X
+       tristate
+       depends on SND_SOC && I2C
++
++config SND_SOC_TWL4030
++      tristate
++      depends on SND_SOC && I2C
+diff --git a/sound/soc/codecs/Makefile b/sound/soc/codecs/Makefile
+index 4e1314c..d2c0b12 100644
+--- a/sound/soc/codecs/Makefile
++++ b/sound/soc/codecs/Makefile
+@@ -6,6 +6,7 @@ snd-soc-wm9712-objs := wm9712.o
+ snd-soc-wm9713-objs := wm9713.o
+ snd-soc-cs4270-objs := cs4270.o
+ snd-soc-tlv320aic3x-objs := tlv320aic3x.o
++snd-soc-twl4030-objs := twl4030.o
+ obj-$(CONFIG_SND_SOC_AC97_CODEC)      += snd-soc-ac97.o
+ obj-$(CONFIG_SND_SOC_WM8731)  += snd-soc-wm8731.o
+@@ -15,3 +16,4 @@ obj-$(CONFIG_SND_SOC_WM9712) += snd-soc-wm9712.o
+ obj-$(CONFIG_SND_SOC_WM9713)  += snd-soc-wm9713.o
+ obj-$(CONFIG_SND_SOC_CS4270)  += snd-soc-cs4270.o
+ obj-$(CONFIG_SND_SOC_TLV320AIC3X)     += snd-soc-tlv320aic3x.o
++obj-$(CONFIG_SND_SOC_TWL4030) += snd-soc-twl4030.o
+diff --git a/sound/soc/codecs/twl4030.c b/sound/soc/codecs/twl4030.c
+new file mode 100644
+index 0000000..c9eee19
+--- /dev/null
++++ b/sound/soc/codecs/twl4030.c
+@@ -0,0 +1,595 @@
++/*
++ * ALSA SoC TWL4030 codec driver
++ *
++ * Author:      Steve Sakoman, <steve@sakoman.com>
++ *
++ * 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/module.h>
++#include <linux/moduleparam.h>
++#include <linux/init.h>
++#include <linux/delay.h>
++#include <linux/pm.h>
++#include <linux/i2c.h>
++#include <linux/platform_device.h>
++#include <linux/i2c/twl4030.h>
++#include <sound/core.h>
++#include <sound/pcm.h>
++#include <sound/pcm_params.h>
++#include <sound/soc.h>
++#include <sound/soc-dapm.h>
++#include <sound/initval.h>
++
++#include "twl4030.h"
++
++/*
++ * twl4030 register cache & default register settings
++ */
++static const u8 twl4030_reg[TWL4030_CACHEREGNUM] = {
++      0x00, // this register not used
++      0x93, // REG_CODEC_MODE         (0x1)
++      0xc3, // REG_OPTION             (0x2)
++      0x00, // REG_UNKNOWN            (0x3)
++      0x00, // REG_MICBIAS_CTL        (0x4)
++      0x34, // REG_ANAMICL            (0x5)
++      0x14, // REG_ANAMICR            (0x6)
++      0x0a, // REG_AVADC_CTL          (0x7)
++      0x00, // REG_ADCMICSEL          (0x8)
++      0x00, // REG_DIGMIXING          (0x9)
++      0x0c, // REG_ATXL1PGA           (0xA)
++      0x0c, // REG_ATXR1PGA           (0xB)
++      0x00, // REG_AVTXL2PGA          (0xC)
++      0x00, // REG_AVTXR2PGA          (0xD)
++      0x01, // REG_AUDIO_IF           (0xE)
++      0x00, // REG_VOICE_IF           (0xF)
++      0x00, // REG_ARXR1PGA           (0x10)
++      0x00, // REG_ARXL1PGA           (0x11)
++      0x6c, // REG_ARXR2PGA           (0x12)
++      0x6c, // REG_ARXL2PGA           (0x13)
++      0x00, // REG_VRXPGA             (0x14)
++      0x00, // REG_VSTPGA             (0x15)
++      0x00, // REG_VRX2ARXPGA         (0x16)
++      0x0c, // REG_AVDAC_CTL          (0x17)
++      0x00, // REG_ARX2VTXPGA         (0x18)
++      0x00, // REG_ARXL1_APGA_CTL     (0x19)
++      0x00, // REG_ARXR1_APGA_CTL     (0x1A)
++      0x4b, // REG_ARXL2_APGA_CTL     (0x1B)
++      0x4b, // REG_ARXR2_APGA_CTL     (0x1C)
++      0x00, // REG_ATX2ARXPGA         (0x1D)
++      0x00, // REG_BT_IF              (0x1E)
++      0x00, // REG_BTPGA              (0x1F)
++      0x00, // REG_BTSTPGA            (0x20)
++      0x00, // REG_EAR_CTL            (0x21)
++      0x24, // REG_HS_SEL             (0x22)
++      0x0a, // REG_HS_GAIN_SET        (0x23)
++      0x00, // REG_HS_POPN_SET        (0x24)
++      0x00, // REG_PREDL_CTL          (0x25)
++      0x00, // REG_PREDR_CTL          (0x26)
++      0x00, // REG_PRECKL_CTL         (0x27)
++      0x00, // REG_PRECKR_CTL         (0x28)
++      0x00, // REG_HFL_CTL            (0x29)
++      0x00, // REG_HFR_CTL            (0x2A)
++      0x00, // REG_ALC_CTL            (0x2B)
++      0x00, // REG_ALC_SET1           (0x2C)
++      0x00, // REG_ALC_SET2           (0x2D)
++      0x00, // REG_BOOST_CTL          (0x2E)
++      0x01, // REG_SOFTVOL_CTL        (0x2F)
++      0x00, // REG_DTMF_FREQSEL       (0x30)
++      0x00, // REG_DTMF_TONEXT1H      (0x31)
++      0x00, // REG_DTMF_TONEXT1L      (0x32)
++      0x00, // REG_DTMF_TONEXT2H      (0x33)
++      0x00, // REG_DTMF_TONEXT2L      (0x34)
++      0x00, // REG_DTMF_TONOFF        (0x35)
++      0x00, // REG_DTMF_WANONOFF      (0x36)
++      0x00, // REG_I2S_RX_SCRAMBLE_H  (0x37)
++      0x00, // REG_I2S_RX_SCRAMBLE_M  (0x38)
++      0x00, // REG_I2S_RX_SCRAMBLE_L  (0x39)
++      0x16, // REG_APLL_CTL           (0x3A)
++      0x00, // REG_DTMF_CTL           (0x3B)
++      0x00, // REG_DTMF_PGA_CTL2      (0x3C)
++      0x00, // REG_DTMF_PGA_CTL1      (0x3D)
++      0x00, // REG_MISC_SET_1         (0x3E)
++      0x00, // REG_PCMBTMUX           (0x3F)
++      0x00, // REG_RX_PATH_SEL        (0x43)
++      0x00, // REG_VDL_APGA_CTL       (0x44)
++      0x00, // REG_VIBRA_CTL          (0x45)
++      0x00, // REG_VIBRA_SET          (0x46)
++      0x00, // REG_VIBRA_PWM_SET      (0x47)
++      0x00, // REG_ANAMIC_GAIN        (0x48)
++      0x00, // REG_MISC_SET_2         (0x49)
++};
++
++static void twl4030_dump_registers(void)
++{
++      int i = 0;
++      u8 data;
++
++      printk(KERN_INFO "TWL 4030 Register dump for Audio Module\n");
++
++      for (i = REG_CODEC_MODE; i <= REG_MISC_SET_2; i++) {
++              twl4030_i2c_read_u8(TWL4030_MODULE_AUDIO_VOICE, &data, i);
++              printk(KERN_INFO "Register[0x%02x]=0x%02x\n", i, data);
++      }
++}
++
++struct twl4030_priv {
++      unsigned int dummy;
++};
++
++/*
++ * read twl4030 register cache
++ */
++static inline unsigned int twl4030_read_reg_cache(struct snd_soc_codec *codec,
++      unsigned int reg)
++{
++      u8 *cache = codec->reg_cache;
++
++      return cache[reg];
++}
++
++/*
++ * write twl4030 register cache
++ */
++static inline void twl4030_write_reg_cache(struct snd_soc_codec *codec,
++                                              u8 reg, u8 value)
++{
++      u8 *cache = codec->reg_cache;
++
++      if (reg >= TWL4030_CACHEREGNUM)
++              return;
++      cache[reg] = value;
++}
++
++/*
++ * write to the twl4030 register space
++ */
++static int twl4030_write(struct snd_soc_codec *codec,
++                      unsigned int reg, unsigned int value)
++{
++      twl4030_write_reg_cache(codec, reg, value);
++      return twl4030_i2c_write_u8(TWL4030_MODULE_AUDIO_VOICE, value, reg);
++}
++
++static void twl4030_init_chip(void)
++{
++      unsigned char byte;
++      int i;
++
++      twl4030_i2c_write_u8(TWL4030_MODULE_AUDIO_VOICE,
++              twl4030_reg[REG_CODEC_MODE] & 0xfd, REG_CODEC_MODE);
++
++      udelay(10); /* 10 ms delay for power settling */
++
++      for (i = REG_OPTION; i <= REG_MISC_SET_2; i++) {
++              twl4030_i2c_write_u8(TWL4030_MODULE_AUDIO_VOICE, twl4030_reg[i], i);
++      }
++
++      twl4030_i2c_write_u8(TWL4030_MODULE_AUDIO_VOICE,
++              twl4030_reg[REG_CODEC_MODE], REG_CODEC_MODE);
++
++      udelay(10); /* 10 ms delay for power settling */
++
++      /* initiate offset cancellation */
++      twl4030_i2c_write_u8(TWL4030_MODULE_AUDIO_VOICE,
++              twl4030_reg[REG_ANAMICL] | 0x80, REG_ANAMICL);
++
++      /* wait for offset cancellation to complete */
++      twl4030_i2c_read_u8(TWL4030_MODULE_AUDIO_VOICE, &byte, REG_ANAMICL);
++      while ((byte & 0x80) == 0x80)
++              twl4030_i2c_read_u8(TWL4030_MODULE_AUDIO_VOICE, &byte, REG_ANAMICL);
++
++      twl4030_i2c_write_u8(TWL4030_MODULE_AUDIO_VOICE,
++              twl4030_reg[REG_MISC_SET_1] | 0x02, REG_MISC_SET_1);
++
++      twl4030_dump_registers();
++}
++
++static const struct snd_kcontrol_new twl4030_snd_controls[] = {
++      SOC_DOUBLE_R("Master Playback Volume",
++               REG_ARXL2PGA, REG_ARXR2PGA,
++              0, 127, 0),
++      SOC_DOUBLE_R("Capture Volume",
++               REG_ATXL1PGA, REG_ATXR1PGA,
++              0, 127, 0),
++};
++
++/* add non dapm controls */
++static int twl4030_add_controls(struct snd_soc_codec *codec)
++{
++      int err, i;
++
++      for (i = 0; i < ARRAY_SIZE(twl4030_snd_controls); i++) {
++              err = snd_ctl_add(codec->card,
++                                snd_soc_cnew(&twl4030_snd_controls[i],
++                                              codec, NULL));
++              if (err < 0)
++                      return err;
++      }
++
++      return 0;
++}
++
++#define TWL4030_PWR 0
++
++static const struct snd_soc_dapm_widget twl4030_dapm_widgets[] = {
++      SND_SOC_DAPM_INPUT("INL"),
++      SND_SOC_DAPM_INPUT("INR"),
++
++      SND_SOC_DAPM_OUTPUT("OUTL"),
++      SND_SOC_DAPM_OUTPUT("OUTR"),
++
++      SND_SOC_DAPM_DAC("DACL", "Left Playback", SND_SOC_NOPM, 0, 0),
++      SND_SOC_DAPM_DAC("DACR", "Right Playback", SND_SOC_NOPM, 0, 0),
++
++      SND_SOC_DAPM_ADC("ADCL", "Left Capture", SND_SOC_NOPM, 0, 0),
++      SND_SOC_DAPM_ADC("ADCR", "Right Capture", SND_SOC_NOPM, 0, 0),
++};
++
++static const char *intercon[][3] = {
++      /* outputs */
++      {"OUTL", NULL, "DACL"},
++      {"OUTR", NULL, "DACR"},
++
++      /* inputs */
++      {"ADCL", NULL, "INL"},
++      {"ADCR", NULL, "INR"},
++
++      /* terminator */
++      {NULL, NULL, NULL},
++};
++
++static int twl4030_add_widgets(struct snd_soc_codec *codec)
++{
++      int i;
++
++      for (i = 0; i < ARRAY_SIZE(twl4030_dapm_widgets); i++)
++              snd_soc_dapm_new_control(codec, &twl4030_dapm_widgets[i]);
++
++      /* set up audio path interconnects */
++      for (i = 0; intercon[i][0] != NULL; i++)
++              snd_soc_dapm_connect_input(codec, intercon[i][0],
++                      intercon[i][1], intercon[i][2]);
++
++      snd_soc_dapm_new_widgets(codec);
++      return 0;
++}
++
++static int twl4030_dapm_event(struct snd_soc_codec *codec, int event)
++{
++
++      printk(KERN_INFO "TWL4030 Audio Codec dapm event\n");
++      switch (event) {
++      case SNDRV_CTL_POWER_D0: /* full On */
++              break;
++      case SNDRV_CTL_POWER_D1: /* partial On */
++      case SNDRV_CTL_POWER_D2: /* partial On */
++              break;
++      case SNDRV_CTL_POWER_D3hot: /* off, with power */
++              break;
++      case SNDRV_CTL_POWER_D3cold: /* off, without power */
++              break;
++      }
++      codec->dapm_state = event;
++
++      return 0;
++}
++
++static void twl4030_power_up (struct snd_soc_codec *codec, u8 mode)
++{
++      twl4030_write(codec, REG_CODEC_MODE, mode & ~CODECPDZ);
++      twl4030_write(codec, REG_CODEC_MODE, mode | CODECPDZ);
++      udelay(10);
++
++      u8 popn = twl4030_read_reg_cache(codec, REG_HS_POPN_SET) | (0x40);
++      twl4030_write(codec, REG_HS_POPN_SET, popn);
++
++      u8 hsgain = twl4030_read_reg_cache(codec, REG_HS_GAIN_SET) | (0x0a);
++      twl4030_write(codec, REG_HS_GAIN_SET, hsgain);
++
++      popn = twl4030_read_reg_cache(codec, REG_HS_POPN_SET) | (0x02);
++      twl4030_write(codec, REG_HS_POPN_SET, popn);
++}
++
++static void twl4030_power_down (struct snd_soc_codec *codec)
++{
++      u8 popn = twl4030_read_reg_cache(codec, REG_HS_POPN_SET) & ~(0x02);
++      twl4030_write(codec, REG_HS_POPN_SET, popn);
++
++      u8 hsgain = twl4030_read_reg_cache(codec, REG_HS_GAIN_SET) & ~(0x0f);
++      twl4030_write(codec, REG_HS_GAIN_SET, hsgain);
++
++      popn = twl4030_read_reg_cache(codec, REG_HS_POPN_SET) & ~(0x40);
++      twl4030_write(codec, REG_HS_POPN_SET, popn);
++
++      u8 mode = twl4030_read_reg_cache(codec, REG_CODEC_MODE) & ~CODECPDZ;
++      twl4030_write(codec, REG_CODEC_MODE, mode);
++      udelay(10);
++}
++
++
++static int twl4030_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_device *socdev = rtd->socdev;
++      struct snd_soc_codec *codec = socdev->codec;
++      struct twl4030_priv *twl4030 = codec->private_data;
++
++      twl4030_power_down(codec);
++
++      u8 mode = twl4030_read_reg_cache(codec, REG_CODEC_MODE) & ~CODECPDZ;
++
++      mode &= ~APLL_RATE;
++      switch (params_rate(params)) {
++      case 44100:
++              printk(KERN_INFO "TWL4030 hw params: set rate to 44.1khz\n");
++              mode |= APLL_RATE_44100;
++              break;
++      case 48000:
++              printk(KERN_INFO "TWL4030 hw params: set rate to 48khz\n");
++              mode |= APLL_RATE_48000;
++              break;
++      default:
++              printk(KERN_INFO "TWL4030 hw params: unknown rate %d\n", params_rate(params));
++              return -EINVAL;
++      }
++
++      /* bit size */
++      switch (params_format(params)) {
++      case SNDRV_PCM_FORMAT_S16_LE:
++              printk(KERN_INFO "TWL4030 hw params: set format to S16_LE\n");
++              break;
++      case SNDRV_PCM_FORMAT_S24_LE:
++              printk(KERN_INFO "TWL4030 hw params: set format to S24_LE\n");
++              break;
++      default:
++              printk(KERN_INFO "TWL4030 hw params: unknown format %d\n", params_format(params));
++              return -EINVAL;
++      }
++
++      /* change rate and turn codec back on */
++      twl4030_power_up(codec, mode);
++
++      return 0;
++}
++
++static int twl4030_mute(struct snd_soc_codec_dai *dai, int mute)
++{
++      struct snd_soc_codec *codec = dai->codec;
++
++      u8 ldac_reg = twl4030_read_reg_cache(codec, REG_ARXL2PGA);
++      u8 rdac_reg = twl4030_read_reg_cache(codec, REG_ARXR2PGA);
++
++      if (mute) {
++              printk(KERN_INFO "TWL4030 Audio Codec mute\n");
++              twl4030_write(codec, REG_ARXL2PGA, 0x00);
++              twl4030_write(codec, REG_ARXR2PGA, 0x00);
++              twl4030_write_reg_cache(codec, REG_ARXL2PGA, ldac_reg);
++              twl4030_write_reg_cache(codec, REG_ARXR2PGA, rdac_reg);
++      }
++      else {
++              printk(KERN_INFO "TWL4030 Audio Codec unmute: %02x/%02x\n", ldac_reg, rdac_reg);
++              twl4030_write(codec, REG_ARXL2PGA, ldac_reg);
++              twl4030_write(codec, REG_ARXR2PGA, rdac_reg);
++      }
++
++      return 0;
++}
++
++static int twl4030_set_dai_fmt(struct snd_soc_codec_dai *codec_dai,
++                           unsigned int fmt)
++{
++      struct snd_soc_codec *codec = codec_dai->codec;
++      struct twl4030_priv *twl4030 = codec->private_data;
++
++      /* get current format */
++      u8 format = twl4030_read_reg_cache(codec, REG_AUDIO_IF);
++
++      /* set master/slave audio interface */
++      switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
++      case SND_SOC_DAIFMT_CBM_CFM:
++              printk(KERN_INFO "TWL4030 set dai fmt: master\n");
++              format &= ~(AIF_SLAVE_EN);
++              format |= CLK256FS_EN;
++              break;
++      case SND_SOC_DAIFMT_CBS_CFS:
++              printk(KERN_INFO "TWL4030 set dai fmt: slave\n");
++              format &= ~(CLK256FS_EN);
++              format |= AIF_SLAVE_EN;
++              break;
++      default:
++              return -EINVAL;
++      }
++
++      /* interface format */
++      format &= ~AIF_FORMAT;
++      switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
++      case SND_SOC_DAIFMT_I2S:
++              printk(KERN_INFO "TWL4030 set dai fmt: i2s\n");
++              format |= AIF_FORMAT_CODEC;
++              break;
++      default:
++              return -EINVAL;
++      }
++
++      /* turn off codec before changing format */
++      twl4030_power_down(codec);
++
++      /* change format */
++      twl4030_write(codec, REG_AUDIO_IF, format);
++
++      u8 mode = twl4030_read_reg_cache(codec, REG_CODEC_MODE);
++      twl4030_power_up(codec, mode);
++
++      return 0;
++}
++
++#define TWL4030_RATES  SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000
++#define TWL4030_FORMATS        SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FORMAT_S24_LE
++
++struct snd_soc_codec_dai twl4030_dai = {
++      .name = "twl4030",
++      .playback = {
++              .stream_name = "Playback",
++              .channels_min = 2,
++              .channels_max = 2,
++              .rates = TWL4030_RATES,
++              .formats = TWL4030_FORMATS,},
++      .capture = {
++              .stream_name = "Capture",
++              .channels_min = 2,
++              .channels_max = 2,
++              .rates = TWL4030_RATES,
++              .formats = TWL4030_FORMATS,},
++      .ops = {
++              .hw_params = twl4030_hw_params,
++      },
++      .dai_ops = {
++              .digital_mute = twl4030_mute,
++              .set_fmt = twl4030_set_dai_fmt,
++      }
++};
++
++EXPORT_SYMBOL_GPL(twl4030_dai);
++
++static int twl4030_suspend(struct platform_device *pdev, pm_message_t state)
++{
++      struct snd_soc_device *socdev = platform_get_drvdata(pdev);
++      struct snd_soc_codec *codec = socdev->codec;
++
++      printk(KERN_INFO "TWL4030 Audio Codec suspend\n");
++      twl4030_dapm_event(codec, SNDRV_CTL_POWER_D3cold);
++
++      return 0;
++}
++
++static int twl4030_resume(struct platform_device *pdev)
++{
++      struct snd_soc_device *socdev = platform_get_drvdata(pdev);
++      struct snd_soc_codec *codec = socdev->codec;
++      int i;
++      u16 *cache = codec->reg_cache;
++
++      printk(KERN_INFO "TWL4030 Audio Codec resume\n");
++      /* Sync reg_cache with the hardware */
++      for (i = REG_CODEC_MODE; i <= REG_MISC_SET_2; i++) {
++              twl4030_i2c_write_u8(TWL4030_MODULE_AUDIO_VOICE, cache[i], i);
++      }
++      twl4030_dapm_event(codec, SNDRV_CTL_POWER_D3hot);
++      twl4030_dapm_event(codec, codec->suspend_dapm_state);
++      return 0;
++}
++
++/*
++ * initialize the driver
++ * register the mixer and dsp interfaces with the kernel
++ */
++
++static int twl4030_init(struct snd_soc_device *socdev)
++{
++      struct snd_soc_codec *codec = socdev->codec;
++      int ret = 0;
++
++      printk(KERN_INFO "TWL4030 Audio Codec init \n");
++
++      twl4030_init_chip();
++
++      codec->name = "twl4030";
++      codec->owner = THIS_MODULE;
++      codec->read = twl4030_read_reg_cache;
++      codec->write = twl4030_write;
++      codec->dapm_event = twl4030_dapm_event;
++      codec->dai = &twl4030_dai;
++      codec->num_dai = 1;
++      codec->reg_cache_size = sizeof(twl4030_reg);
++      codec->reg_cache = kmemdup(twl4030_reg, sizeof(twl4030_reg), GFP_KERNEL);
++      if (codec->reg_cache == NULL)
++              return -ENOMEM;
++
++      /* register pcms */
++      ret = snd_soc_new_pcms(socdev, SNDRV_DEFAULT_IDX1, SNDRV_DEFAULT_STR1);
++      if (ret < 0) {
++              printk(KERN_ERR "twl4030: failed to create pcms\n");
++              goto pcm_err;
++      }
++
++      twl4030_add_controls(codec);
++      twl4030_add_widgets(codec);
++
++      ret = snd_soc_register_card(socdev);
++      if (ret < 0) {
++              printk(KERN_ERR "twl4030: failed to register card\n");
++              goto card_err;
++      }
++
++      return ret;
++
++card_err:
++      printk(KERN_INFO "TWL4030 Audio Codec init card error\n");
++      snd_soc_free_pcms(socdev);
++      snd_soc_dapm_free(socdev);
++pcm_err:
++      printk(KERN_INFO "TWL4030 Audio Codec init pcm error\n");
++      kfree(codec->reg_cache);
++      return ret;
++}
++
++static struct snd_soc_device *twl4030_socdev;
++
++static int twl4030_probe(struct platform_device *pdev)
++{
++      struct snd_soc_device *socdev = platform_get_drvdata(pdev);
++      struct snd_soc_codec *codec;
++      struct twl4030_priv *twl4030;
++
++      printk(KERN_INFO "TWL4030 Audio Codec probe\n");
++
++      codec = kzalloc(sizeof(struct snd_soc_codec), GFP_KERNEL);
++      if (codec == NULL)
++              return -ENOMEM;
++
++      twl4030 = kzalloc(sizeof(struct twl4030_priv), GFP_KERNEL);
++      if (twl4030 == NULL) {
++              kfree(codec);
++              return -ENOMEM;
++      }
++
++      codec->private_data = twl4030;
++      socdev->codec = codec;
++      mutex_init(&codec->mutex);
++      INIT_LIST_HEAD(&codec->dapm_widgets);
++      INIT_LIST_HEAD(&codec->dapm_paths);
++
++      twl4030_socdev = socdev;
++      twl4030_init(socdev);
++
++      printk(KERN_INFO "TWL4030 Audio Codec probe exit\n");
++      return 0;
++}
++
++static int twl4030_remove(struct platform_device *pdev)
++{
++      struct snd_soc_device *socdev = platform_get_drvdata(pdev);
++      struct snd_soc_codec *codec = socdev->codec;
++
++      printk(KERN_INFO "TWL4030 Audio Codec remove\n");
++      kfree(codec->private_data);
++      kfree(codec);
++
++      return 0;
++}
++
++struct snd_soc_codec_device soc_codec_dev_twl4030 = {
++      .probe = twl4030_probe,
++      .remove = twl4030_remove,
++      .suspend = twl4030_suspend,
++      .resume = twl4030_resume,
++};
++EXPORT_SYMBOL_GPL(soc_codec_dev_twl4030);
++
++MODULE_DESCRIPTION("ASoC TWL4030 codec driver");
++MODULE_AUTHOR("Steve Sakoman");
++MODULE_LICENSE("GPL");
+diff --git a/sound/soc/codecs/twl4030.h b/sound/soc/codecs/twl4030.h
+new file mode 100644
+index 0000000..af8eb43
+--- /dev/null
++++ b/sound/soc/codecs/twl4030.h
+@@ -0,0 +1,125 @@
++/*
++ * ALSA SoC TWL4030 codec driver
++ *
++ * Author:      Steve Sakoman, <steve@sakoman.com>
++ *
++ * 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.
++ */
++
++#ifndef __TWL4030_AUDIO_H__
++#define __TWL4030_AUDIO_H__
++
++#define REG_CODEC_MODE                0x1
++#define REG_OPTION            0x2
++#define REG_UNKNOWN           0x3
++#define REG_MICBIAS_CTL               0x4
++#define REG_ANAMICL           0x5
++#define REG_ANAMICR           0x6
++#define REG_AVADC_CTL         0x7
++#define REG_ADCMICSEL         0x8
++#define REG_DIGMIXING         0x9
++#define REG_ATXL1PGA          0xA
++#define REG_ATXR1PGA          0xB
++#define REG_AVTXL2PGA         0xC
++#define REG_AVTXR2PGA         0xD
++#define REG_AUDIO_IF          0xE
++#define REG_VOICE_IF          0xF
++#define REG_ARXR1PGA          0x10
++#define REG_ARXL1PGA          0x11
++#define REG_ARXR2PGA          0x12
++#define REG_ARXL2PGA          0x13
++#define REG_VRXPGA            0x14
++#define REG_VSTPGA            0x15
++#define REG_VRX2ARXPGA                0x16
++#define REG_AVDAC_CTL         0x17
++#define REG_ARX2VTXPGA                0x18
++#define REG_ARXL1_APGA_CTL    0x19
++#define REG_ARXR1_APGA_CTL    0x1A
++#define REG_ARXL2_APGA_CTL    0x1B
++#define REG_ARXR2_APGA_CTL    0x1C
++#define REG_ATX2ARXPGA                0x1D
++#define REG_BT_IF             0x1E
++#define REG_BTPGA             0x1F
++#define REG_BTSTPGA           0x20
++#define REG_EAR_CTL           0x21
++#define REG_HS_SEL            0x22
++#define REG_HS_GAIN_SET               0x23
++#define REG_HS_POPN_SET               0x24
++#define REG_PREDL_CTL         0x25
++#define REG_PREDR_CTL         0x26
++#define REG_PRECKL_CTL                0x27
++#define REG_PRECKR_CTL                0x28
++#define REG_HFL_CTL           0x29
++#define REG_HFR_CTL           0x2A
++#define REG_ALC_CTL           0x2B
++#define REG_ALC_SET1          0x2C
++#define REG_ALC_SET2          0x2D
++#define REG_BOOST_CTL         0x2E
++#define REG_SOFTVOL_CTL               0x2F
++#define REG_DTMF_FREQSEL      0x30
++#define REG_DTMF_TONEXT1H     0x31
++#define REG_DTMF_TONEXT1L     0x32
++#define REG_DTMF_TONEXT2H     0x33
++#define REG_DTMF_TONEXT2L     0x34
++#define REG_DTMF_TONOFF               0x35
++#define REG_DTMF_WANONOFF     0x36
++#define REG_I2S_RX_SCRAMBLE_H 0x37
++#define REG_I2S_RX_SCRAMBLE_M 0x38
++#define REG_I2S_RX_SCRAMBLE_L 0x39
++#define REG_APLL_CTL          0x3A
++#define REG_DTMF_CTL          0x3B
++#define REG_DTMF_PGA_CTL2     0x3C
++#define REG_DTMF_PGA_CTL1     0x3D
++#define REG_MISC_SET_1                0x3E
++#define REG_PCMBTMUX          0x3F
++#define REG_RX_PATH_SEL               0x43
++#define REG_VDL_APGA_CTL      0x44
++#define REG_VIBRA_CTL         0x45
++#define REG_VIBRA_SET         0x46
++#define REG_VIBRA_PWM_SET     0x47
++#define REG_ANAMIC_GAIN               0x48
++#define REG_MISC_SET_2                0x49
++
++#define TWL4030_CACHEREGNUM   REG_MISC_SET_2 + 1
++
++/* Bitfield Definitions */
++
++/* CODEC_MODE Fields */
++
++#define APLL_RATE             0xF0
++#define APLL_RATE_8000                0x00
++#define APLL_RATE_11025               0x10
++#define APLL_RATE_12000               0x20
++#define APLL_RATE_16000               0x40
++#define APLL_RATE_22050               0x50
++#define APLL_RATE_24000               0x60
++#define APLL_RATE_32000               0x80
++#define APLL_RATE_44100               0x90
++#define APLL_RATE_48000               0xa0
++#define SEL_16K                       0x04
++#define CODECPDZ              0x02
++#define OPT_MODE              0x01
++
++/* AUDIO_IF Fields */
++
++#define AIF_SLAVE_EN          0x80
++#define DATA_WIDTH            0x60
++#define DATA_WIDTH_16S_16W    0x00
++#define DATA_WIDTH_32S_16W    0x40
++#define DATA_WIDTH_32S_24W    0x60
++#define AIF_FORMAT            0x18
++#define AIF_FORMAT_CODEC      0x00
++#define AIF_FORMAT_LEFT               0x08
++#define AIF_FORMAT_RIGHT      0x10
++#define AIF_FORMAT_TDM                0x18
++#define AIF_TRI_EN            0x04
++#define CLK256FS_EN           0x02
++#define AIF_EN                        0x01
++
++
++extern struct snd_soc_codec_dai twl4030_dai;
++extern struct snd_soc_codec_device soc_codec_dev_twl4030;
++
++#endif        /* End of __TWL4030_AUDIO_H__ */
+diff --git a/sound/soc/omap/Kconfig b/sound/soc/omap/Kconfig
+index 0230d83..8703cea 100644
+--- a/sound/soc/omap/Kconfig
++++ b/sound/soc/omap/Kconfig
+@@ -16,4 +16,20 @@ config SND_OMAP_SOC_N810
+       help
+         Say Y if you want to add support for SoC audio on Nokia N810.
++config SND_OMAP_SOC_OMAP3EVM
++      tristate "SoC Audio support for OMAP3 EVM"
++      depends on SND_OMAP_SOC && MACH_OMAP3EVM
++      select SND_OMAP_SOC_MCBSP
++      select SND_SOC_TWL4030
++      help
++        Say Y if you want to add support for SoC audio on the OMAP3 EVM.
++
++config SND_OMAP_SOC_OMAP3BEAGLE
++      tristate "SoC Audio support for OMAP3 Beagle"
++      depends on SND_OMAP_SOC && MACH_OMAP3_BEAGLE
++      select SND_OMAP_SOC_MCBSP
++      select SND_SOC_TWL4030
++      help
++        Say Y if you want to add support for SoC audio on the OMAP3 Beagle.
++
+ endmenu
+diff --git a/sound/soc/omap/Makefile b/sound/soc/omap/Makefile
+index d8d8d58..638a240 100644
+--- a/sound/soc/omap/Makefile
++++ b/sound/soc/omap/Makefile
+@@ -7,5 +7,10 @@ obj-$(CONFIG_SND_OMAP_SOC_MCBSP) += snd-soc-omap-mcbsp.o
+ # OMAP Machine Support
+ snd-soc-n810-objs := n810.o
++snd-soc-omap3evm-objs := omap3evm.o
++snd-soc-omap3beagle-objs := omap3beagle.o
+ obj-$(CONFIG_SND_OMAP_SOC_N810) += snd-soc-n810.o
++obj-$(CONFIG_SND_OMAP_SOC_OMAP3EVM) += snd-soc-omap3evm.o
++obj-$(CONFIG_SND_OMAP_SOC_OMAP3BEAGLE) += snd-soc-omap3beagle.o
++
+diff --git a/sound/soc/omap/omap3beagle.c b/sound/soc/omap/omap3beagle.c
+new file mode 100644
+index 0000000..fb79938
+--- /dev/null
++++ b/sound/soc/omap/omap3beagle.c
+@@ -0,0 +1,180 @@
++/*
++ * omap3beagle.c  --  SoC audio for OMAP3 Beagle
++ *
++ * Author: Steve Sakoman <steve@sakoman.com>
++ *
++ * 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 <sound/soc-dapm.h>
++
++#include <asm/mach-types.h>
++#include <asm/arch/hardware.h>
++#include <asm/arch/gpio.h>
++#include <asm/arch/mcbsp.h>
++
++#include "omap-mcbsp.h"
++#include "omap-pcm.h"
++#include "../codecs/twl4030.h"
++
++static int omap3beagle_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_codec_dai *codec_dai = rtd->dai->codec_dai;
++      struct snd_soc_cpu_dai *cpu_dai = rtd->dai->cpu_dai;
++      int ret;
++
++      /* Set codec DAI configuration */
++      ret = codec_dai->dai_ops.set_fmt(codec_dai,
++                                       SND_SOC_DAIFMT_I2S |
++                                       SND_SOC_DAIFMT_NB_NF |
++                                       SND_SOC_DAIFMT_CBM_CFM);
++      if (ret < 0) {
++      printk(KERN_INFO "can't set codec DAI configuration\n");
++              return ret;
++      }
++
++      /* Set cpu DAI configuration */
++      ret = cpu_dai->dai_ops.set_fmt(cpu_dai,
++                                     SND_SOC_DAIFMT_I2S |
++                                     SND_SOC_DAIFMT_NB_NF |
++                                     SND_SOC_DAIFMT_CBM_CFM);
++      if (ret < 0) {
++      printk(KERN_INFO "can't set cpu DAI configuration\n");
++              return ret;
++      }
++
++      return 0;
++}
++
++static struct snd_soc_ops omap3beagle_ops = {
++      .hw_params = omap3beagle_hw_params,
++};
++
++static const struct snd_soc_dapm_widget twl4030_dapm_widgets[] = {
++      SND_SOC_DAPM_HP("Headphone Jack", NULL),
++      SND_SOC_DAPM_LINE("Line In", NULL),
++};
++
++static const char *audio_map[][3] = {
++      {"Headphone Jack", NULL, "HPLOUT"},
++      {"Headphone Jack", NULL, "HPROUT"},
++
++      {"Line In", NULL, "Line In"},
++      {"Line In", NULL, "Line In"},
++};
++
++static int omap3beagle_twl4030_init(struct snd_soc_codec *codec)
++{
++      int i;
++
++      printk(KERN_INFO "OMAP3 Beagle TWL4030 SoC init\n");
++
++      /* Add omap3beagle specific widgets */
++      for (i = 0; i < ARRAY_SIZE(twl4030_dapm_widgets); i++)
++              snd_soc_dapm_new_control(codec, &twl4030_dapm_widgets[i]);
++
++      /* Set up omap3beagle specific audio path audio_map */
++      for (i = 0; i < ARRAY_SIZE(audio_map); i++)
++              snd_soc_dapm_connect_input(codec, audio_map[i][0],
++                      audio_map[i][1], audio_map[i][2]);
++
++      /* always connected */
++      snd_soc_dapm_set_endpoint(codec, "Headphone Jack", 1);
++      snd_soc_dapm_set_endpoint(codec, "Line In", 1);
++
++      snd_soc_dapm_sync_endpoints(codec);
++
++      return 0;
++}
++
++/* Digital audio interface glue - connects codec <--> CPU */
++static struct snd_soc_dai_link omap3beagle_dai = {
++      .name = "TWL4030",
++      .stream_name = "TWL4030",
++      .cpu_dai = &omap_mcbsp_dai[0],
++      .codec_dai = &twl4030_dai,
++      .init = omap3beagle_twl4030_init,
++      .ops = &omap3beagle_ops,
++};
++
++/* Audio machine driver */
++static struct snd_soc_machine snd_soc_machine_omap3beagle = {
++      .name = "omap3beagle",
++      .dai_link = &omap3beagle_dai,
++      .num_links = 1,
++};
++
++/* Audio subsystem */
++static struct snd_soc_device omap3beagle_snd_devdata = {
++      .machine = &snd_soc_machine_omap3beagle,
++      .platform = &omap_soc_platform,
++      .codec_dev = &soc_codec_dev_twl4030,
++};
++
++static struct platform_device *omap3beagle_snd_device;
++
++static int __init omap3beagle_soc_init(void)
++{
++      int ret;
++
++      printk(KERN_INFO "OMAP3 Beagle SoC init\n");
++      if (!machine_is_omap3_beagle()) {
++              printk(KERN_INFO "Not OMAP3 Beagle!\n");
++              return -ENODEV;
++      }
++
++      omap3beagle_snd_device = platform_device_alloc("soc-audio", -1);
++      if (!omap3beagle_snd_device) {
++              printk(KERN_INFO "Platform device allocation failed\n");        
++              return -ENOMEM;
++      }
++
++      platform_set_drvdata(omap3beagle_snd_device, &omap3beagle_snd_devdata);
++      omap3beagle_snd_devdata.dev = &omap3beagle_snd_device->dev;
++      *(unsigned int *)omap3beagle_dai.cpu_dai->private_data = 1; /* McBSP2 */
++
++      ret = platform_device_add(omap3beagle_snd_device);
++      if (ret)
++              goto err1;
++
++      return 0;
++
++err1:
++      printk(KERN_INFO "Unable to add platform device\n");            
++      platform_device_put(omap3beagle_snd_device);
++
++      return ret;
++}
++
++static void __exit omap3beagle_soc_exit(void)
++{
++      printk(KERN_INFO "OMAP3 Beagle SoC exit\n");
++      platform_device_unregister(omap3beagle_snd_device);
++}
++
++module_init(omap3beagle_soc_init);
++module_exit(omap3beagle_soc_exit);
++
++MODULE_AUTHOR("Steve Sakoman <steve@sakoman.com>");
++MODULE_DESCRIPTION("ALSA SoC OMAP3 Beagle");
++MODULE_LICENSE("GPL");
+diff --git a/sound/soc/omap/omap3evm.c b/sound/soc/omap/omap3evm.c
+new file mode 100644
+index 0000000..32d4f5d
+--- /dev/null
++++ b/sound/soc/omap/omap3evm.c
+@@ -0,0 +1,180 @@
++/*
++ * omap3evm.c  --  SoC audio for OMAP3 EVM
++ *
++ * Author: Steve Sakoman <steve@sakoman.com>
++ *
++ * 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 <sound/soc-dapm.h>
++
++#include <asm/mach-types.h>
++#include <asm/arch/hardware.h>
++#include <asm/arch/gpio.h>
++#include <asm/arch/mcbsp.h>
++
++#include "omap-mcbsp.h"
++#include "omap-pcm.h"
++#include "../codecs/twl4030.h"
++
++static int omap3evm_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_codec_dai *codec_dai = rtd->dai->codec_dai;
++      struct snd_soc_cpu_dai *cpu_dai = rtd->dai->cpu_dai;
++      int ret;
++
++      /* Set codec DAI configuration */
++      ret = codec_dai->dai_ops.set_fmt(codec_dai,
++                                       SND_SOC_DAIFMT_I2S |
++                                       SND_SOC_DAIFMT_NB_NF |
++                                       SND_SOC_DAIFMT_CBM_CFM);
++      if (ret < 0) {
++      printk(KERN_INFO "can't set codec DAI configuration\n");
++              return ret;
++      }
++
++      /* Set cpu DAI configuration */
++      ret = cpu_dai->dai_ops.set_fmt(cpu_dai,
++                                     SND_SOC_DAIFMT_I2S |
++                                     SND_SOC_DAIFMT_NB_NF |
++                                     SND_SOC_DAIFMT_CBM_CFM);
++      if (ret < 0) {
++      printk(KERN_INFO "can't set cpu DAI configuration\n");
++              return ret;
++      }
++
++      return 0;
++}
++
++static struct snd_soc_ops omap3evm_ops = {
++      .hw_params = omap3evm_hw_params,
++};
++
++static const struct snd_soc_dapm_widget twl4030_dapm_widgets[] = {
++      SND_SOC_DAPM_HP("Headphone Jack", NULL),
++      SND_SOC_DAPM_LINE("Line In", NULL),
++};
++
++static const char *audio_map[][3] = {
++      {"Headphone Jack", NULL, "HPLOUT"},
++      {"Headphone Jack", NULL, "HPROUT"},
++
++      {"Line In", NULL, "Line In"},
++      {"Line In", NULL, "Line In"},
++};
++
++static int omap3evm_twl4030_init(struct snd_soc_codec *codec)
++{
++      int i;
++
++      printk(KERN_INFO "OMAP3 EVM TWL4030 SoC init\n");
++
++      /* Add omap3evm specific widgets */
++      for (i = 0; i < ARRAY_SIZE(twl4030_dapm_widgets); i++)
++              snd_soc_dapm_new_control(codec, &twl4030_dapm_widgets[i]);
++
++      /* Set up omap3evm specific audio path audio_map */
++      for (i = 0; i < ARRAY_SIZE(audio_map); i++)
++              snd_soc_dapm_connect_input(codec, audio_map[i][0],
++                      audio_map[i][1], audio_map[i][2]);
++
++      /* always connected */
++      snd_soc_dapm_set_endpoint(codec, "Headphone Jack", 1);
++      snd_soc_dapm_set_endpoint(codec, "Line In", 1);
++
++      snd_soc_dapm_sync_endpoints(codec);
++
++      return 0;
++}
++
++/* Digital audio interface glue - connects codec <--> CPU */
++static struct snd_soc_dai_link omap3evm_dai = {
++      .name = "TWL4030",
++      .stream_name = "TWL4030",
++      .cpu_dai = &omap_mcbsp_dai[0],
++      .codec_dai = &twl4030_dai,
++      .init = omap3evm_twl4030_init,
++      .ops = &omap3evm_ops,
++};
++
++/* Audio machine driver */
++static struct snd_soc_machine snd_soc_machine_omap3evm = {
++      .name = "omap3evm",
++      .dai_link = &omap3evm_dai,
++      .num_links = 1,
++};
++
++/* Audio subsystem */
++static struct snd_soc_device omap3evm_snd_devdata = {
++      .machine = &snd_soc_machine_omap3evm,
++      .platform = &omap_soc_platform,
++      .codec_dev = &soc_codec_dev_twl4030,
++};
++
++static struct platform_device *omap3evm_snd_device;
++
++static int __init omap3evm_soc_init(void)
++{
++      int ret;
++
++      printk(KERN_INFO "OMAP3 EVM SoC init\n");
++      if (!machine_is_omap3evm()) {
++              printk(KERN_INFO "Not OMAP3 EVM!\n");
++              return -ENODEV;
++      }
++
++      omap3evm_snd_device = platform_device_alloc("soc-audio", -1);
++      if (!omap3evm_snd_device) {
++              printk(KERN_INFO "Platform device allocation failed\n");        
++              return -ENOMEM;
++      }
++
++      platform_set_drvdata(omap3evm_snd_device, &omap3evm_snd_devdata);
++      omap3evm_snd_devdata.dev = &omap3evm_snd_device->dev;
++      *(unsigned int *)omap3evm_dai.cpu_dai->private_data = 1; /* McBSP2 */
++
++      ret = platform_device_add(omap3evm_snd_device);
++      if (ret)
++              goto err1;
++
++      return 0;
++
++err1:
++      printk(KERN_INFO "Unable to add platform device\n");            
++      platform_device_put(omap3evm_snd_device);
++
++      return ret;
++}
++
++static void __exit omap3evm_soc_exit(void)
++{
++      printk(KERN_INFO "OMAP3 EVM SoC exit\n");
++      platform_device_unregister(omap3evm_snd_device);
++}
++
++module_init(omap3evm_soc_init);
++module_exit(omap3evm_soc_exit);
++
++MODULE_AUTHOR("Steve Sakoman <steve@sakoman.com>");
++MODULE_DESCRIPTION("ALSA SoC OMAP3 EVM");
++MODULE_LICENSE("GPL");
diff --git a/packages/linux/linux-omap2-git/omap3evm/timer-suppression.patch b/packages/linux/linux-omap2-git/omap3evm/timer-suppression.patch
new file mode 100644 (file)
index 0000000..04362c9
--- /dev/null
@@ -0,0 +1,43 @@
+diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c
+index b854a89..26f5569 100644
+--- a/kernel/time/tick-sched.c
++++ b/kernel/time/tick-sched.c
+@@ -253,6 +253,16 @@ void tick_nohz_stop_sched_tick(void)
+       /* Schedule the tick, if we are at least one jiffie off */
+       if ((long)delta_jiffies >= 1) {
++              /*
++               * calculate the expiry time for the next timer wheel
++               * timer
++               */
++              expires = ktime_add_ns(last_update, tick_period.tv64 *
++                                      delta_jiffies);
++
++              /* Skip reprogram of event if its not changed */
++              if(ts->tick_stopped && ktime_equal(expires, dev->next_event))
++              goto out2;
+               if (delta_jiffies > 1)
+                       cpu_set(cpu, nohz_cpu_mask);
+@@ -304,12 +314,7 @@ void tick_nohz_stop_sched_tick(void)
+                       goto out;
+               }
+-              /*
+-               * calculate the expiry time for the next timer wheel
+-               * timer
+-               */
+-              expires = ktime_add_ns(last_update, tick_period.tv64 *
+-                                     delta_jiffies);
++              /* Mark expiries */
+               ts->idle_expires = expires;
+               if (ts->nohz_mode == NOHZ_MODE_HIGHRES) {
+@@ -328,6 +333,7 @@ void tick_nohz_stop_sched_tick(void)
+               tick_do_update_jiffies64(ktime_get());
+               cpu_clear(cpu, nohz_cpu_mask);
+       }
++out2: 
+       raise_softirq_irqoff(TIMER_SOFTIRQ);
+ out:
+       ts->next_jiffies = next_jiffies;
diff --git a/packages/linux/linux-omap2-git/omap3evm/touchscreen.patch b/packages/linux/linux-omap2-git/omap3evm/touchscreen.patch
new file mode 100644 (file)
index 0000000..2325c40
--- /dev/null
@@ -0,0 +1,22 @@
+diff --git a/arch/arm/mach-omap2/board-omap3evm.c b/arch/arm/mach-omap2/board-omap3evm.c
+index d8109ae..f8ce669 100644
+--- a/arch/arm/mach-omap2/board-omap3evm.c
++++ b/arch/arm/mach-omap2/board-omap3evm.c
+@@ -128,8 +128,16 @@ static int ads7846_get_pendown_state(void)
+ }
+ 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 = {
+