mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-19 11:43:40 +00:00
Merge branch 'omap-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap-2.6
* 'omap-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap-2.6: (163 commits) omap: complete removal of machine_desc.io_pg_offst and .phys_io omap: UART: fix wakeup registers for OMAP24xx UART2 omap: Fix spotty MMC voltages ASoC: OMAP4: MCPDM: Remove unnecessary include of plat/control.h serial: omap-serial: fix signess error OMAP3: DMA: Errata i541: sDMA FIFO draining does not finish omap: dma: Fix buffering disable bit setting for omap24xx omap: serial: Fix the boot-up crash/reboot without CONFIG_PM OMAP3: PM: fix scratchpad memory accesses for off-mode omap4: pandaboard: enable the ehci port on pandaboard omap4: pandaboard: Fix the init if CONFIG_MMC_OMAP_HS is not set omap4: pandaboard: remove unused hsmmc definition OMAP: McBSP: Remove null omap44xx ops comment OMAP: McBSP: Swap CLKS source definition OMAP: McBSP: Fix CLKR and FSR signal muxing OMAP2+: clock: reduce the amount of standard debugging while disabling unused clocks OMAP: control: move plat-omap/control.h to mach-omap2/control.h OMAP: split plat-omap/common.c OMAP: McBSP: implement functional clock switching via clock framework OMAP: McBSP: implement McBSP CLKR and FSR signal muxing via mach-omap2/mcbsp.c ... Fixed up trivial conflicts in arch/arm/mach-omap2/ {board-zoom-peripherals.c,devices.c} as per Tony
This commit is contained in:
commit
7b6181e068
@ -831,7 +831,7 @@ config ARCH_OMAP
|
||||
select GENERIC_CLOCKEVENTS
|
||||
select ARCH_HAS_HOLES_MEMORYMODEL
|
||||
help
|
||||
Support for TI's OMAP platform (OMAP1 and OMAP2).
|
||||
Support for TI's OMAP platform (OMAP1/2/3/4).
|
||||
|
||||
config PLAT_SPEAR
|
||||
bool "ST SPEAr"
|
||||
|
@ -1,94 +0,0 @@
|
||||
CONFIG_EXPERIMENTAL=y
|
||||
CONFIG_SYSVIPC=y
|
||||
CONFIG_LOG_BUF_SHIFT=14
|
||||
CONFIG_BLK_DEV_INITRD=y
|
||||
CONFIG_MODULES=y
|
||||
CONFIG_MODULE_UNLOAD=y
|
||||
# CONFIG_LBDAF is not set
|
||||
# CONFIG_BLK_DEV_BSG is not set
|
||||
# CONFIG_IOSCHED_DEADLINE is not set
|
||||
CONFIG_ARCH_OMAP=y
|
||||
CONFIG_ARCH_OMAP2=y
|
||||
CONFIG_OMAP_RESET_CLOCKS=y
|
||||
# CONFIG_OMAP_MUX is not set
|
||||
# CONFIG_OMAP_MCBSP is not set
|
||||
CONFIG_OMAP_MBOX_FWK=y
|
||||
CONFIG_OMAP_32K_TIMER=y
|
||||
CONFIG_ARCH_OMAP2420=y
|
||||
CONFIG_MACH_NOKIA_N8X0=y
|
||||
CONFIG_AEABI=y
|
||||
CONFIG_LEDS=y
|
||||
CONFIG_ZBOOT_ROM_TEXT=0x10C08000
|
||||
CONFIG_ZBOOT_ROM_BSS=0x10200000
|
||||
CONFIG_CMDLINE="root=/dev/mmcblk0p2 console=ttyS2,115200n8 debug earlyprintk rootwait"
|
||||
CONFIG_FPE_NWFPE=y
|
||||
CONFIG_VFP=y
|
||||
CONFIG_PM=y
|
||||
CONFIG_PM_RUNTIME=y
|
||||
CONFIG_NET=y
|
||||
CONFIG_UNIX=y
|
||||
CONFIG_INET=y
|
||||
# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
|
||||
# CONFIG_INET_XFRM_MODE_TUNNEL is not set
|
||||
# CONFIG_INET_XFRM_MODE_BEET is not set
|
||||
# CONFIG_INET_LRO is not set
|
||||
# CONFIG_IPV6 is not set
|
||||
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
|
||||
CONFIG_MTD=y
|
||||
CONFIG_MTD_CMDLINE_PARTS=y
|
||||
CONFIG_MTD_ONENAND=y
|
||||
CONFIG_MTD_ONENAND_OMAP2=y
|
||||
CONFIG_MTD_ONENAND_OTP=y
|
||||
CONFIG_BLK_DEV_RAM=y
|
||||
# CONFIG_MISC_DEVICES is not set
|
||||
# CONFIG_INPUT_MOUSEDEV_PSAUX is not set
|
||||
# CONFIG_INPUT_KEYBOARD is not set
|
||||
# CONFIG_INPUT_MOUSE is not set
|
||||
CONFIG_SERIAL_8250=y
|
||||
CONFIG_SERIAL_8250_CONSOLE=y
|
||||
# CONFIG_LEGACY_PTYS is not set
|
||||
# CONFIG_HW_RANDOM is not set
|
||||
CONFIG_I2C=y
|
||||
# CONFIG_I2C_COMPAT is not set
|
||||
# CONFIG_I2C_HELPER_AUTO is not set
|
||||
CONFIG_I2C_OMAP=y
|
||||
CONFIG_SPI=y
|
||||
CONFIG_SPI_OMAP24XX=y
|
||||
# CONFIG_HWMON is not set
|
||||
CONFIG_MENELAUS=y
|
||||
CONFIG_REGULATOR=y
|
||||
# CONFIG_VGA_CONSOLE is not set
|
||||
# CONFIG_HID_SUPPORT is not set
|
||||
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_MUSB_HDRC=y
|
||||
CONFIG_USB_MUSB_OTG=y
|
||||
CONFIG_USB_GADGET_MUSB_HDRC=y
|
||||
# CONFIG_MUSB_PIO_ONLY is not set
|
||||
CONFIG_USB_MUSB_DEBUG=y
|
||||
CONFIG_USB_GADGET=y
|
||||
CONFIG_USB_GADGET_DEBUG=y
|
||||
CONFIG_USB_GADGET_DEBUG_FILES=y
|
||||
CONFIG_USB_ETH=m
|
||||
CONFIG_USB_ETH_EEM=y
|
||||
CONFIG_MMC=y
|
||||
CONFIG_MMC_OMAP=y
|
||||
CONFIG_EXT3_FS=y
|
||||
CONFIG_INOTIFY=y
|
||||
CONFIG_VFAT_FS=y
|
||||
CONFIG_TMPFS=y
|
||||
CONFIG_JFFS2_FS=y
|
||||
CONFIG_JFFS2_SUMMARY=y
|
||||
CONFIG_JFFS2_COMPRESSION_OPTIONS=y
|
||||
CONFIG_JFFS2_LZO=y
|
||||
CONFIG_PRINTK_TIME=y
|
||||
CONFIG_DEBUG_KERNEL=y
|
||||
CONFIG_DEBUG_INFO=y
|
||||
# CONFIG_RCU_CPU_STALL_DETECTOR is not set
|
||||
CONFIG_DEBUG_USER=y
|
||||
CONFIG_DEBUG_ERRORS=y
|
||||
CONFIG_CRC_CCITT=y
|
@ -53,18 +53,18 @@ 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_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=ttyS2,115200"
|
||||
CONFIG_CMDLINE="root=/dev/mmcblk0p2 rootwait console=ttyO2,115200"
|
||||
CONFIG_KEXEC=y
|
||||
CONFIG_CPU_FREQ=y
|
||||
CONFIG_CPU_FREQ_STAT_DETAILS=y
|
||||
CONFIG_CPU_FREQ_GOV_USERSPACE=y
|
||||
CONFIG_CPU_FREQ_GOV_ONDEMAND=y
|
||||
CONFIG_FPE_NWFPE=y
|
||||
CONFIG_VFP=y
|
||||
CONFIG_NEON=y
|
||||
@ -87,23 +87,23 @@ CONFIG_IP_PNP_RARP=y
|
||||
# CONFIG_INET_LRO is not set
|
||||
# CONFIG_IPV6 is not set
|
||||
CONFIG_NETFILTER=y
|
||||
CONFIG_BT=y
|
||||
CONFIG_BT_L2CAP=y
|
||||
CONFIG_BT_SCO=y
|
||||
CONFIG_BT=m
|
||||
CONFIG_BT_L2CAP=m
|
||||
CONFIG_BT_SCO=m
|
||||
CONFIG_BT_RFCOMM=y
|
||||
CONFIG_BT_RFCOMM_TTY=y
|
||||
CONFIG_BT_BNEP=y
|
||||
CONFIG_BT_BNEP=m
|
||||
CONFIG_BT_BNEP_MC_FILTER=y
|
||||
CONFIG_BT_BNEP_PROTO_FILTER=y
|
||||
CONFIG_BT_HIDP=y
|
||||
CONFIG_BT_HCIUART=y
|
||||
CONFIG_BT_HIDP=m
|
||||
CONFIG_BT_HCIUART=m
|
||||
CONFIG_BT_HCIUART_H4=y
|
||||
CONFIG_BT_HCIUART_BCSP=y
|
||||
CONFIG_BT_HCIUART_LL=y
|
||||
CONFIG_BT_HCIBCM203X=y
|
||||
CONFIG_BT_HCIBPA10X=y
|
||||
CONFIG_CFG80211=y
|
||||
CONFIG_MAC80211=y
|
||||
CONFIG_BT_HCIBCM203X=m
|
||||
CONFIG_BT_HCIBPA10X=m
|
||||
CONFIG_CFG80211=m
|
||||
CONFIG_MAC80211=m
|
||||
CONFIG_MAC80211_RC_PID=y
|
||||
CONFIG_MAC80211_RC_DEFAULT_PID=y
|
||||
CONFIG_MAC80211_LEDS=y
|
||||
@ -137,9 +137,11 @@ CONFIG_SMSC_PHY=y
|
||||
CONFIG_NET_ETHERNET=y
|
||||
CONFIG_SMC91X=y
|
||||
CONFIG_SMSC911X=y
|
||||
CONFIG_LIBERTAS=y
|
||||
CONFIG_LIBERTAS_USB=y
|
||||
CONFIG_LIBERTAS_SDIO=y
|
||||
CONFIG_KS8851=y
|
||||
CONFIG_KS8851_MLL=y
|
||||
CONFIG_LIBERTAS=m
|
||||
CONFIG_LIBERTAS_USB=m
|
||||
CONFIG_LIBERTAS_SDIO=m
|
||||
CONFIG_LIBERTAS_DEBUG=y
|
||||
CONFIG_USB_USBNET=y
|
||||
CONFIG_USB_ALI_M5632=y
|
||||
@ -201,8 +203,8 @@ CONFIG_FONTS=y
|
||||
CONFIG_FONT_8x8=y
|
||||
CONFIG_FONT_8x16=y
|
||||
CONFIG_LOGO=y
|
||||
CONFIG_SOUND=y
|
||||
CONFIG_SND=y
|
||||
CONFIG_SOUND=m
|
||||
CONFIG_SND=m
|
||||
CONFIG_SND_MIXER_OSS=y
|
||||
CONFIG_SND_PCM_OSS=y
|
||||
CONFIG_SND_VERBOSE_PRINTK=y
|
||||
@ -218,9 +220,9 @@ CONFIG_USB_DEVICEFS=y
|
||||
CONFIG_USB_SUSPEND=y
|
||||
# CONFIG_USB_OTG_WHITELIST is not set
|
||||
CONFIG_USB_MON=y
|
||||
CONFIG_USB_MUSB_HDRC=y
|
||||
CONFIG_USB_MUSB_OTG=y
|
||||
CONFIG_USB_GADGET_MUSB_HDRC=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
|
||||
@ -276,12 +278,11 @@ CONFIG_DEBUG_KERNEL=y
|
||||
CONFIG_SCHEDSTATS=y
|
||||
CONFIG_TIMER_STATS=y
|
||||
CONFIG_PROVE_LOCKING=y
|
||||
CONFIG_LOCK_STAT=y
|
||||
# CONFIG_LOCK_STAT is not set
|
||||
CONFIG_DEBUG_SPINLOCK_SLEEP=y
|
||||
# CONFIG_DEBUG_BUGVERBOSE is not set
|
||||
CONFIG_DEBUG_INFO=y
|
||||
# CONFIG_RCU_CPU_STALL_DETECTOR is not set
|
||||
CONFIG_DEBUG_LL=y
|
||||
CONFIG_SECURITY=y
|
||||
CONFIG_CRYPTO_MICHAEL_MIC=y
|
||||
# CONFIG_CRYPTO_ANSI_CPRNG is not set
|
@ -1,125 +0,0 @@
|
||||
CONFIG_EXPERIMENTAL=y
|
||||
CONFIG_SYSVIPC=y
|
||||
CONFIG_BSD_PROCESS_ACCT=y
|
||||
CONFIG_LOG_BUF_SHIFT=14
|
||||
CONFIG_BLK_DEV_INITRD=y
|
||||
CONFIG_EMBEDDED=y
|
||||
# CONFIG_SYSCTL_SYSCALL is not set
|
||||
# CONFIG_ELF_CORE is not set
|
||||
CONFIG_MODULES=y
|
||||
CONFIG_MODULE_UNLOAD=y
|
||||
CONFIG_MODVERSIONS=y
|
||||
CONFIG_MODULE_SRCVERSION_ALL=y
|
||||
# CONFIG_BLK_DEV_BSG is not set
|
||||
CONFIG_ARCH_OMAP=y
|
||||
CONFIG_ARCH_OMAP4=y
|
||||
# CONFIG_ARCH_OMAP2PLUS_TYPICAL is not set
|
||||
# CONFIG_ARCH_OMAP2 is not set
|
||||
# CONFIG_ARCH_OMAP3 is not set
|
||||
# CONFIG_OMAP_MUX is not set
|
||||
CONFIG_OMAP_32K_TIMER=y
|
||||
CONFIG_OMAP_DM_TIMER=y
|
||||
CONFIG_MACH_OMAP_4430SDP=y
|
||||
# CONFIG_ARM_THUMB is not set
|
||||
CONFIG_PL310_ERRATA_588369=y
|
||||
CONFIG_SMP=y
|
||||
CONFIG_NR_CPUS=2
|
||||
# CONFIG_LOCAL_TIMERS is not set
|
||||
CONFIG_PREEMPT=y
|
||||
CONFIG_AEABI=y
|
||||
CONFIG_ZBOOT_ROM_TEXT=0x0
|
||||
CONFIG_ZBOOT_ROM_BSS=0x0
|
||||
CONFIG_CMDLINE="root=/dev/ram0 rw mem=128M console=ttyS2,115200n8 initrd=0x81600000,20M ramdisk_size=20480"
|
||||
CONFIG_VFP=y
|
||||
CONFIG_NEON=y
|
||||
CONFIG_BINFMT_MISC=y
|
||||
CONFIG_NET=y
|
||||
CONFIG_PACKET=y
|
||||
CONFIG_INET=y
|
||||
CONFIG_IP_PNP=y
|
||||
CONFIG_IP_PNP_DHCP=y
|
||||
CONFIG_IP_PNP_BOOTP=y
|
||||
CONFIG_IP_PNP_RARP=y
|
||||
# CONFIG_IPV6 is not set
|
||||
# CONFIG_WIRELESS is not set
|
||||
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
|
||||
# CONFIG_FW_LOADER is not set
|
||||
CONFIG_BLK_DEV_LOOP=y
|
||||
CONFIG_BLK_DEV_RAM=y
|
||||
CONFIG_BLK_DEV_RAM_SIZE=16384
|
||||
# CONFIG_MISC_DEVICES is not set
|
||||
CONFIG_NETDEVICES=y
|
||||
CONFIG_NET_ETHERNET=y
|
||||
CONFIG_KS8851=y
|
||||
# CONFIG_NETDEV_1000 is not set
|
||||
# CONFIG_NETDEV_10000 is not set
|
||||
# CONFIG_WLAN is not set
|
||||
# CONFIG_INPUT_MOUSEDEV is not set
|
||||
CONFIG_INPUT_EVDEV=y
|
||||
# CONFIG_INPUT_KEYBOARD is not set
|
||||
# CONFIG_INPUT_MOUSE is not set
|
||||
# CONFIG_SERIO is not set
|
||||
CONFIG_SERIAL_8250=y
|
||||
CONFIG_SERIAL_8250_CONSOLE=y
|
||||
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_HWMON is not set
|
||||
CONFIG_WATCHDOG=y
|
||||
CONFIG_OMAP_WATCHDOG=y
|
||||
CONFIG_TWL4030_CORE=y
|
||||
CONFIG_REGULATOR=y
|
||||
CONFIG_REGULATOR_TWL4030=y
|
||||
# CONFIG_VGA_CONSOLE is not set
|
||||
# CONFIG_HID_SUPPORT is not set
|
||||
# CONFIG_USB_SUPPORT is not set
|
||||
CONFIG_MMC=y
|
||||
CONFIG_MMC_OMAP_HS=y
|
||||
CONFIG_RTC_CLASS=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
|
||||
CONFIG_VFAT_FS=y
|
||||
CONFIG_TMPFS=y
|
||||
CONFIG_NFS_FS=y
|
||||
CONFIG_NFS_V3=y
|
||||
CONFIG_NFS_V3_ACL=y
|
||||
CONFIG_NFS_V4=y
|
||||
CONFIG_ROOT_NFS=y
|
||||
CONFIG_PARTITION_ADVANCED=y
|
||||
CONFIG_NLS_CODEPAGE_437=y
|
||||
CONFIG_NLS_ISO8859_1=y
|
||||
# CONFIG_ENABLE_WARN_DEPRECATED is not set
|
||||
# CONFIG_ENABLE_MUST_CHECK is not set
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_DEBUG_KERNEL=y
|
||||
# CONFIG_DETECT_SOFTLOCKUP is not set
|
||||
CONFIG_DETECT_HUNG_TASK=y
|
||||
# CONFIG_SCHED_DEBUG is not set
|
||||
# CONFIG_DEBUG_PREEMPT is not set
|
||||
# CONFIG_DEBUG_BUGVERBOSE is not set
|
||||
CONFIG_DEBUG_INFO=y
|
||||
# CONFIG_RCU_CPU_STALL_DETECTOR is not set
|
||||
# CONFIG_FTRACE is not set
|
||||
# CONFIG_ARM_UNWIND is not set
|
||||
CONFIG_CRYPTO_ECB=m
|
||||
CONFIG_CRYPTO_PCBC=m
|
||||
# CONFIG_CRYPTO_ANSI_CPRNG is not set
|
||||
CONFIG_CRC_CCITT=y
|
||||
CONFIG_CRC_T10DIF=y
|
||||
CONFIG_LIBCRC32C=y
|
@ -1,37 +0,0 @@
|
||||
CONFIG_EXPERIMENTAL=y
|
||||
CONFIG_SYSVIPC=y
|
||||
CONFIG_LOG_BUF_SHIFT=14
|
||||
CONFIG_BLK_DEV_INITRD=y
|
||||
CONFIG_MODULES=y
|
||||
CONFIG_MODULE_UNLOAD=y
|
||||
# CONFIG_BLK_DEV_BSG is not set
|
||||
CONFIG_ARCH_OMAP=y
|
||||
CONFIG_ARCH_OMAP2=y
|
||||
# CONFIG_OMAP_MUX is not set
|
||||
CONFIG_MACH_OMAP_GENERIC=y
|
||||
CONFIG_ARCH_OMAP2420=y
|
||||
CONFIG_LEDS=y
|
||||
CONFIG_ZBOOT_ROM_TEXT=0x10C08000
|
||||
CONFIG_ZBOOT_ROM_BSS=0x10200000
|
||||
CONFIG_FPE_NWFPE=y
|
||||
CONFIG_BLK_DEV_RAM=y
|
||||
CONFIG_INPUT_EVDEV=y
|
||||
# CONFIG_INPUT_KEYBOARD is not set
|
||||
# CONFIG_INPUT_MOUSE is not set
|
||||
CONFIG_SERIAL_8250=y
|
||||
CONFIG_SERIAL_8250_CONSOLE=y
|
||||
# CONFIG_LEGACY_PTYS is not set
|
||||
CONFIG_WATCHDOG=y
|
||||
CONFIG_WATCHDOG_NOWAYOUT=y
|
||||
CONFIG_VIDEO_OUTPUT_CONTROL=m
|
||||
# CONFIG_VGA_CONSOLE is not set
|
||||
CONFIG_EXT2_FS=y
|
||||
CONFIG_EXT2_FS_XATTR=y
|
||||
CONFIG_INOTIFY=y
|
||||
CONFIG_ROMFS_FS=y
|
||||
CONFIG_DEBUG_KERNEL=y
|
||||
CONFIG_DEBUG_INFO=y
|
||||
CONFIG_DEBUG_USER=y
|
||||
CONFIG_DEBUG_ERRORS=y
|
||||
CONFIG_DEBUG_LL=y
|
||||
CONFIG_CRC_CCITT=y
|
@ -12,7 +12,7 @@ obj-$(CONFIG_OMAP_MPU_TIMER) += time.o
|
||||
obj-$(CONFIG_OMAP_32K_TIMER) += timer32k.o
|
||||
|
||||
# Power Management
|
||||
obj-$(CONFIG_PM) += pm.o sleep.o
|
||||
obj-$(CONFIG_PM) += pm.o sleep.o pm_bus.o
|
||||
|
||||
# DSP
|
||||
obj-$(CONFIG_OMAP_MBOX_FWK) += mailbox_mach.o
|
||||
|
@ -16,9 +16,12 @@
|
||||
#include <linux/init.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/leds.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/serial_8250.h>
|
||||
|
||||
#include <media/soc_camera.h>
|
||||
|
||||
#include <asm/serial.h>
|
||||
#include <mach/hardware.h>
|
||||
#include <asm/mach-types.h>
|
||||
@ -32,6 +35,7 @@
|
||||
#include <plat/usb.h>
|
||||
#include <plat/board.h>
|
||||
#include <plat/common.h>
|
||||
#include <mach/camera.h>
|
||||
|
||||
#include <mach/ams-delta-fiq.h>
|
||||
|
||||
@ -213,10 +217,56 @@ static struct platform_device ams_delta_led_device = {
|
||||
.id = -1
|
||||
};
|
||||
|
||||
static struct i2c_board_info ams_delta_camera_board_info[] = {
|
||||
{
|
||||
I2C_BOARD_INFO("ov6650", 0x60),
|
||||
},
|
||||
};
|
||||
|
||||
#ifdef CONFIG_LEDS_TRIGGERS
|
||||
DEFINE_LED_TRIGGER(ams_delta_camera_led_trigger);
|
||||
|
||||
static int ams_delta_camera_power(struct device *dev, int power)
|
||||
{
|
||||
/*
|
||||
* turn on camera LED
|
||||
*/
|
||||
if (power)
|
||||
led_trigger_event(ams_delta_camera_led_trigger, LED_FULL);
|
||||
else
|
||||
led_trigger_event(ams_delta_camera_led_trigger, LED_OFF);
|
||||
return 0;
|
||||
}
|
||||
#else
|
||||
#define ams_delta_camera_power NULL
|
||||
#endif
|
||||
|
||||
static struct soc_camera_link __initdata ams_delta_iclink = {
|
||||
.bus_id = 0, /* OMAP1 SoC camera bus */
|
||||
.i2c_adapter_id = 1,
|
||||
.board_info = &ams_delta_camera_board_info[0],
|
||||
.module_name = "ov6650",
|
||||
.power = ams_delta_camera_power,
|
||||
};
|
||||
|
||||
static struct platform_device ams_delta_camera_device = {
|
||||
.name = "soc-camera-pdrv",
|
||||
.id = 0,
|
||||
.dev = {
|
||||
.platform_data = &ams_delta_iclink,
|
||||
},
|
||||
};
|
||||
|
||||
static struct omap1_cam_platform_data ams_delta_camera_platform_data = {
|
||||
.camexclk_khz = 12000, /* default 12MHz clock, no extra DPLL */
|
||||
.lclk_khz_max = 1334, /* results in 5fps CIF, 10fps QCIF */
|
||||
};
|
||||
|
||||
static struct platform_device *ams_delta_devices[] __initdata = {
|
||||
&ams_delta_kp_device,
|
||||
&ams_delta_lcd_device,
|
||||
&ams_delta_led_device,
|
||||
&ams_delta_camera_device,
|
||||
};
|
||||
|
||||
static void __init ams_delta_init(void)
|
||||
@ -225,6 +275,20 @@ static void __init ams_delta_init(void)
|
||||
omap_cfg_reg(UART1_TX);
|
||||
omap_cfg_reg(UART1_RTS);
|
||||
|
||||
/* parallel camera interface */
|
||||
omap_cfg_reg(H19_1610_CAM_EXCLK);
|
||||
omap_cfg_reg(J15_1610_CAM_LCLK);
|
||||
omap_cfg_reg(L18_1610_CAM_VS);
|
||||
omap_cfg_reg(L15_1610_CAM_HS);
|
||||
omap_cfg_reg(L19_1610_CAM_D0);
|
||||
omap_cfg_reg(K14_1610_CAM_D1);
|
||||
omap_cfg_reg(K15_1610_CAM_D2);
|
||||
omap_cfg_reg(K19_1610_CAM_D3);
|
||||
omap_cfg_reg(K18_1610_CAM_D4);
|
||||
omap_cfg_reg(J14_1610_CAM_D5);
|
||||
omap_cfg_reg(J19_1610_CAM_D6);
|
||||
omap_cfg_reg(J18_1610_CAM_D7);
|
||||
|
||||
iotable_init(ams_delta_io_desc, ARRAY_SIZE(ams_delta_io_desc));
|
||||
|
||||
omap_board_config = ams_delta_config;
|
||||
@ -236,6 +300,11 @@ static void __init ams_delta_init(void)
|
||||
ams_delta_latch2_write(~0, 0);
|
||||
|
||||
omap1_usb_init(&ams_delta_usb_config);
|
||||
omap1_set_camera_info(&ams_delta_camera_platform_data);
|
||||
#ifdef CONFIG_LEDS_TRIGGERS
|
||||
led_trigger_register_simple("ams_delta_camera",
|
||||
&ams_delta_camera_led_trigger);
|
||||
#endif
|
||||
platform_add_devices(ams_delta_devices, ARRAY_SIZE(ams_delta_devices));
|
||||
|
||||
#ifdef CONFIG_AMS_DELTA_FIQ
|
||||
|
@ -58,8 +58,7 @@ static struct omap_mmc_platform_data mmc1_data = {
|
||||
.dma_mask = 0xffffffff,
|
||||
.slots[0] = {
|
||||
.set_power = mmc_set_power,
|
||||
.ocr_mask = MMC_VDD_28_29 | MMC_VDD_30_31 |
|
||||
MMC_VDD_32_33 | MMC_VDD_33_34,
|
||||
.ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34,
|
||||
.name = "mmcblk",
|
||||
},
|
||||
};
|
||||
|
@ -40,8 +40,7 @@ static struct omap_mmc_platform_data mmc1_data = {
|
||||
.dma_mask = 0xffffffff,
|
||||
.slots[0] = {
|
||||
.set_power = mmc_set_power,
|
||||
.ocr_mask = MMC_VDD_28_29 | MMC_VDD_30_31 |
|
||||
MMC_VDD_32_33 | MMC_VDD_33_34,
|
||||
.ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34,
|
||||
.name = "mmcblk",
|
||||
},
|
||||
};
|
||||
|
@ -30,6 +30,13 @@
|
||||
#include <linux/input.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/gpio_keys.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/i2c-gpio.h>
|
||||
#include <linux/htcpld.h>
|
||||
#include <linux/leds.h>
|
||||
#include <linux/spi/spi.h>
|
||||
#include <linux/spi/ads7846.h>
|
||||
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/mach/arch.h>
|
||||
@ -39,6 +46,7 @@
|
||||
#include <plat/board.h>
|
||||
#include <plat/keypad.h>
|
||||
#include <plat/usb.h>
|
||||
#include <plat/mmc.h>
|
||||
|
||||
#include <mach/irqs.h>
|
||||
|
||||
@ -52,13 +60,123 @@
|
||||
#define OMAP_LCDC_CTRL_LCD_EN (1 << 0)
|
||||
#define OMAP_LCDC_STAT_DONE (1 << 0)
|
||||
|
||||
static struct omap_lcd_config htcherald_lcd_config __initdata = {
|
||||
.ctrl_name = "internal",
|
||||
};
|
||||
/* GPIO definitions for the power button and keyboard slide switch */
|
||||
#define HTCHERALD_GPIO_POWER 139
|
||||
#define HTCHERALD_GPIO_SLIDE 174
|
||||
#define HTCHERALD_GIRQ_BTNS 141
|
||||
|
||||
static struct omap_board_config_kernel htcherald_config[] __initdata = {
|
||||
{ OMAP_TAG_LCD, &htcherald_lcd_config },
|
||||
};
|
||||
/* GPIO definitions for the touchscreen */
|
||||
#define HTCHERALD_GPIO_TS 76
|
||||
|
||||
/* HTCPLD definitions */
|
||||
|
||||
/*
|
||||
* CPLD Logic
|
||||
*
|
||||
* Chip 3 - 0x03
|
||||
*
|
||||
* Function 7 6 5 4 3 2 1 0
|
||||
* ------------------------------------
|
||||
* DPAD light x x x x x x x 1
|
||||
* SoundDev x x x x 1 x x x
|
||||
* Screen white 1 x x x x x x x
|
||||
* MMC power on x x x x x 1 x x
|
||||
* Happy times (n) 0 x x x x 1 x x
|
||||
*
|
||||
* Chip 4 - 0x04
|
||||
*
|
||||
* Function 7 6 5 4 3 2 1 0
|
||||
* ------------------------------------
|
||||
* Keyboard light x x x x x x x 1
|
||||
* LCD Bright (4) x x x x x 1 1 x
|
||||
* LCD Bright (3) x x x x x 0 1 x
|
||||
* LCD Bright (2) x x x x x 1 0 x
|
||||
* LCD Bright (1) x x x x x 0 0 x
|
||||
* LCD Off x x x x 0 x x x
|
||||
* LCD image (fb) 1 x x x x x x x
|
||||
* LCD image (white) 0 x x x x x x x
|
||||
* Caps lock LED x x 1 x x x x x
|
||||
*
|
||||
* Chip 5 - 0x05
|
||||
*
|
||||
* Function 7 6 5 4 3 2 1 0
|
||||
* ------------------------------------
|
||||
* Red (solid) x x x x x 1 x x
|
||||
* Red (flash) x x x x x x 1 x
|
||||
* Green (GSM flash) x x x x 1 x x x
|
||||
* Green (GSM solid) x x x 1 x x x x
|
||||
* Green (wifi flash) x x 1 x x x x x
|
||||
* Blue (bt flash) x 1 x x x x x x
|
||||
* DPAD Int Enable 1 x x x x x x 0
|
||||
*
|
||||
* (Combinations of the above can be made for different colors.)
|
||||
* The direction pad interrupt enable must be set each time the
|
||||
* interrupt is handled.
|
||||
*
|
||||
* Chip 6 - 0x06
|
||||
*
|
||||
* Function 7 6 5 4 3 2 1 0
|
||||
* ------------------------------------
|
||||
* Vibrator x x x x 1 x x x
|
||||
* Alt LED x x x 1 x x x x
|
||||
* Screen white 1 x x x x x x x
|
||||
* Screen white x x 1 x x x x x
|
||||
* Screen white x 0 x x x x x x
|
||||
* Enable kbd dpad x x x x x x 0 x
|
||||
* Happy Times 0 1 0 x x x 0 x
|
||||
*/
|
||||
|
||||
/*
|
||||
* HTCPLD GPIO lines start 16 after OMAP_MAX_GPIO_LINES to account
|
||||
* for the 16 MPUIO lines.
|
||||
*/
|
||||
#define HTCPLD_GPIO_START_OFFSET (OMAP_MAX_GPIO_LINES + 16)
|
||||
#define HTCPLD_IRQ(chip, offset) (OMAP_IRQ_END + 8 * (chip) + (offset))
|
||||
#define HTCPLD_BASE(chip, offset) \
|
||||
(HTCPLD_GPIO_START_OFFSET + 8 * (chip) + (offset))
|
||||
|
||||
#define HTCPLD_GPIO_LED_DPAD HTCPLD_BASE(0, 0)
|
||||
#define HTCPLD_GPIO_LED_KBD HTCPLD_BASE(1, 0)
|
||||
#define HTCPLD_GPIO_LED_CAPS HTCPLD_BASE(1, 5)
|
||||
#define HTCPLD_GPIO_LED_RED_FLASH HTCPLD_BASE(2, 1)
|
||||
#define HTCPLD_GPIO_LED_RED_SOLID HTCPLD_BASE(2, 2)
|
||||
#define HTCPLD_GPIO_LED_GREEN_FLASH HTCPLD_BASE(2, 3)
|
||||
#define HTCPLD_GPIO_LED_GREEN_SOLID HTCPLD_BASE(2, 4)
|
||||
#define HTCPLD_GPIO_LED_WIFI HTCPLD_BASE(2, 5)
|
||||
#define HTCPLD_GPIO_LED_BT HTCPLD_BASE(2, 6)
|
||||
#define HTCPLD_GPIO_LED_VIBRATE HTCPLD_BASE(3, 3)
|
||||
#define HTCPLD_GPIO_LED_ALT HTCPLD_BASE(3, 4)
|
||||
|
||||
#define HTCPLD_GPIO_RIGHT_KBD HTCPLD_BASE(6, 7)
|
||||
#define HTCPLD_GPIO_UP_KBD HTCPLD_BASE(6, 6)
|
||||
#define HTCPLD_GPIO_LEFT_KBD HTCPLD_BASE(6, 5)
|
||||
#define HTCPLD_GPIO_DOWN_KBD HTCPLD_BASE(6, 4)
|
||||
|
||||
#define HTCPLD_GPIO_RIGHT_DPAD HTCPLD_BASE(7, 7)
|
||||
#define HTCPLD_GPIO_UP_DPAD HTCPLD_BASE(7, 6)
|
||||
#define HTCPLD_GPIO_LEFT_DPAD HTCPLD_BASE(7, 5)
|
||||
#define HTCPLD_GPIO_DOWN_DPAD HTCPLD_BASE(7, 4)
|
||||
#define HTCPLD_GPIO_ENTER_DPAD HTCPLD_BASE(7, 3)
|
||||
|
||||
/*
|
||||
* The htcpld chip requires a gpio write to a specific line
|
||||
* to re-enable interrupts after one has occurred.
|
||||
*/
|
||||
#define HTCPLD_GPIO_INT_RESET_HI HTCPLD_BASE(2, 7)
|
||||
#define HTCPLD_GPIO_INT_RESET_LO HTCPLD_BASE(2, 0)
|
||||
|
||||
/* Chip 5 */
|
||||
#define HTCPLD_IRQ_RIGHT_KBD HTCPLD_IRQ(0, 7)
|
||||
#define HTCPLD_IRQ_UP_KBD HTCPLD_IRQ(0, 6)
|
||||
#define HTCPLD_IRQ_LEFT_KBD HTCPLD_IRQ(0, 5)
|
||||
#define HTCPLD_IRQ_DOWN_KBD HTCPLD_IRQ(0, 4)
|
||||
|
||||
/* Chip 6 */
|
||||
#define HTCPLD_IRQ_RIGHT_DPAD HTCPLD_IRQ(1, 7)
|
||||
#define HTCPLD_IRQ_UP_DPAD HTCPLD_IRQ(1, 6)
|
||||
#define HTCPLD_IRQ_LEFT_DPAD HTCPLD_IRQ(1, 5)
|
||||
#define HTCPLD_IRQ_DOWN_DPAD HTCPLD_IRQ(1, 4)
|
||||
#define HTCPLD_IRQ_ENTER_DPAD HTCPLD_IRQ(1, 3)
|
||||
|
||||
/* Keyboard definition */
|
||||
|
||||
@ -140,6 +258,129 @@ static struct platform_device kp_device = {
|
||||
.resource = kp_resources,
|
||||
};
|
||||
|
||||
/* GPIO buttons for keyboard slide and power button */
|
||||
static struct gpio_keys_button herald_gpio_keys_table[] = {
|
||||
{BTN_0, HTCHERALD_GPIO_POWER, 1, "POWER", EV_KEY, 1, 20},
|
||||
{SW_LID, HTCHERALD_GPIO_SLIDE, 0, "SLIDE", EV_SW, 1, 20},
|
||||
|
||||
{KEY_LEFT, HTCPLD_GPIO_LEFT_KBD, 1, "LEFT", EV_KEY, 1, 20},
|
||||
{KEY_RIGHT, HTCPLD_GPIO_RIGHT_KBD, 1, "RIGHT", EV_KEY, 1, 20},
|
||||
{KEY_UP, HTCPLD_GPIO_UP_KBD, 1, "UP", EV_KEY, 1, 20},
|
||||
{KEY_DOWN, HTCPLD_GPIO_DOWN_KBD, 1, "DOWN", EV_KEY, 1, 20},
|
||||
|
||||
{KEY_LEFT, HTCPLD_GPIO_LEFT_DPAD, 1, "DLEFT", EV_KEY, 1, 20},
|
||||
{KEY_RIGHT, HTCPLD_GPIO_RIGHT_DPAD, 1, "DRIGHT", EV_KEY, 1, 20},
|
||||
{KEY_UP, HTCPLD_GPIO_UP_DPAD, 1, "DUP", EV_KEY, 1, 20},
|
||||
{KEY_DOWN, HTCPLD_GPIO_DOWN_DPAD, 1, "DDOWN", EV_KEY, 1, 20},
|
||||
{KEY_ENTER, HTCPLD_GPIO_ENTER_DPAD, 1, "DENTER", EV_KEY, 1, 20},
|
||||
};
|
||||
|
||||
static struct gpio_keys_platform_data herald_gpio_keys_data = {
|
||||
.buttons = herald_gpio_keys_table,
|
||||
.nbuttons = ARRAY_SIZE(herald_gpio_keys_table),
|
||||
.rep = 1,
|
||||
};
|
||||
|
||||
static struct platform_device herald_gpiokeys_device = {
|
||||
.name = "gpio-keys",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &herald_gpio_keys_data,
|
||||
},
|
||||
};
|
||||
|
||||
/* LEDs for the Herald. These connect to the HTCPLD GPIO device. */
|
||||
static struct gpio_led gpio_leds[] = {
|
||||
{"dpad", NULL, HTCPLD_GPIO_LED_DPAD, 0, 0, LEDS_GPIO_DEFSTATE_OFF},
|
||||
{"kbd", NULL, HTCPLD_GPIO_LED_KBD, 0, 0, LEDS_GPIO_DEFSTATE_OFF},
|
||||
{"vibrate", NULL, HTCPLD_GPIO_LED_VIBRATE, 0, 0, LEDS_GPIO_DEFSTATE_OFF},
|
||||
{"green_solid", NULL, HTCPLD_GPIO_LED_GREEN_SOLID, 0, 0, LEDS_GPIO_DEFSTATE_OFF},
|
||||
{"green_flash", NULL, HTCPLD_GPIO_LED_GREEN_FLASH, 0, 0, LEDS_GPIO_DEFSTATE_OFF},
|
||||
{"red_solid", "mmc0", HTCPLD_GPIO_LED_RED_SOLID, 0, 0, LEDS_GPIO_DEFSTATE_OFF},
|
||||
{"red_flash", NULL, HTCPLD_GPIO_LED_RED_FLASH, 0, 0, LEDS_GPIO_DEFSTATE_OFF},
|
||||
{"wifi", NULL, HTCPLD_GPIO_LED_WIFI, 0, 0, LEDS_GPIO_DEFSTATE_OFF},
|
||||
{"bt", NULL, HTCPLD_GPIO_LED_BT, 0, 0, LEDS_GPIO_DEFSTATE_OFF},
|
||||
{"caps", NULL, HTCPLD_GPIO_LED_CAPS, 0, 0, LEDS_GPIO_DEFSTATE_OFF},
|
||||
{"alt", NULL, HTCPLD_GPIO_LED_ALT, 0, 0, LEDS_GPIO_DEFSTATE_OFF},
|
||||
};
|
||||
|
||||
static struct gpio_led_platform_data gpio_leds_data = {
|
||||
.leds = gpio_leds,
|
||||
.num_leds = ARRAY_SIZE(gpio_leds),
|
||||
};
|
||||
|
||||
static struct platform_device gpio_leds_device = {
|
||||
.name = "leds-gpio",
|
||||
.id = 0,
|
||||
.dev = {
|
||||
.platform_data = &gpio_leds_data,
|
||||
},
|
||||
};
|
||||
|
||||
/* HTC PLD chips */
|
||||
|
||||
static struct resource htcpld_resources[] = {
|
||||
[0] = {
|
||||
.start = OMAP_GPIO_IRQ(HTCHERALD_GIRQ_BTNS),
|
||||
.end = OMAP_GPIO_IRQ(HTCHERALD_GIRQ_BTNS),
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
struct htcpld_chip_platform_data htcpld_chips[] = {
|
||||
[0] = {
|
||||
.addr = 0x03,
|
||||
.reset = 0x04,
|
||||
.num_gpios = 8,
|
||||
.gpio_out_base = HTCPLD_BASE(0, 0),
|
||||
.gpio_in_base = HTCPLD_BASE(4, 0),
|
||||
},
|
||||
[1] = {
|
||||
.addr = 0x04,
|
||||
.reset = 0x8e,
|
||||
.num_gpios = 8,
|
||||
.gpio_out_base = HTCPLD_BASE(1, 0),
|
||||
.gpio_in_base = HTCPLD_BASE(5, 0),
|
||||
},
|
||||
[2] = {
|
||||
.addr = 0x05,
|
||||
.reset = 0x80,
|
||||
.num_gpios = 8,
|
||||
.gpio_out_base = HTCPLD_BASE(2, 0),
|
||||
.gpio_in_base = HTCPLD_BASE(6, 0),
|
||||
.irq_base = HTCPLD_IRQ(0, 0),
|
||||
.num_irqs = 8,
|
||||
},
|
||||
[3] = {
|
||||
.addr = 0x06,
|
||||
.reset = 0x40,
|
||||
.num_gpios = 8,
|
||||
.gpio_out_base = HTCPLD_BASE(3, 0),
|
||||
.gpio_in_base = HTCPLD_BASE(7, 0),
|
||||
.irq_base = HTCPLD_IRQ(1, 0),
|
||||
.num_irqs = 8,
|
||||
},
|
||||
};
|
||||
|
||||
struct htcpld_core_platform_data htcpld_pfdata = {
|
||||
.int_reset_gpio_hi = HTCPLD_GPIO_INT_RESET_HI,
|
||||
.int_reset_gpio_lo = HTCPLD_GPIO_INT_RESET_LO,
|
||||
.i2c_adapter_id = 1,
|
||||
|
||||
.chip = htcpld_chips,
|
||||
.num_chip = ARRAY_SIZE(htcpld_chips),
|
||||
};
|
||||
|
||||
static struct platform_device htcpld_device = {
|
||||
.name = "i2c-htcpld",
|
||||
.id = -1,
|
||||
.resource = htcpld_resources,
|
||||
.num_resources = ARRAY_SIZE(htcpld_resources),
|
||||
.dev = {
|
||||
.platform_data = &htcpld_pfdata,
|
||||
},
|
||||
};
|
||||
|
||||
/* USB Device */
|
||||
static struct omap_usb_config htcherald_usb_config __initdata = {
|
||||
.otg = 0,
|
||||
@ -150,14 +391,71 @@ static struct omap_usb_config htcherald_usb_config __initdata = {
|
||||
};
|
||||
|
||||
/* LCD Device resources */
|
||||
static struct omap_lcd_config htcherald_lcd_config __initdata = {
|
||||
.ctrl_name = "internal",
|
||||
};
|
||||
|
||||
static struct omap_board_config_kernel htcherald_config[] __initdata = {
|
||||
{ OMAP_TAG_LCD, &htcherald_lcd_config },
|
||||
};
|
||||
|
||||
static struct platform_device lcd_device = {
|
||||
.name = "lcd_htcherald",
|
||||
.id = -1,
|
||||
};
|
||||
|
||||
/* MMC Card */
|
||||
#if defined(CONFIG_MMC_OMAP) || defined(CONFIG_MMC_OMAP_MODULE)
|
||||
static struct omap_mmc_platform_data htc_mmc1_data = {
|
||||
.nr_slots = 1,
|
||||
.switch_slot = NULL,
|
||||
.slots[0] = {
|
||||
.ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34,
|
||||
.name = "mmcblk",
|
||||
.nomux = 1,
|
||||
.wires = 4,
|
||||
.switch_pin = -1,
|
||||
},
|
||||
};
|
||||
|
||||
static struct omap_mmc_platform_data *htc_mmc_data[1];
|
||||
#endif
|
||||
|
||||
|
||||
/* Platform devices for the Herald */
|
||||
static struct platform_device *devices[] __initdata = {
|
||||
&kp_device,
|
||||
&lcd_device,
|
||||
&htcpld_device,
|
||||
&gpio_leds_device,
|
||||
&herald_gpiokeys_device,
|
||||
};
|
||||
|
||||
/*
|
||||
* Touchscreen
|
||||
*/
|
||||
static const struct ads7846_platform_data htcherald_ts_platform_data = {
|
||||
.model = 7846,
|
||||
.keep_vref_on = 1,
|
||||
.x_plate_ohms = 496,
|
||||
.gpio_pendown = HTCHERALD_GPIO_TS,
|
||||
.pressure_max = 100000,
|
||||
.pressure_min = 5000,
|
||||
.x_min = 528,
|
||||
.x_max = 3760,
|
||||
.y_min = 624,
|
||||
.y_max = 3760,
|
||||
};
|
||||
|
||||
static struct spi_board_info __initdata htcherald_spi_board_info[] = {
|
||||
{
|
||||
.modalias = "ads7846",
|
||||
.platform_data = &htcherald_ts_platform_data,
|
||||
.irq = OMAP_GPIO_IRQ(HTCHERALD_GPIO_TS),
|
||||
.max_speed_hz = 2500000,
|
||||
.bus_num = 2,
|
||||
.chip_select = 1,
|
||||
}
|
||||
};
|
||||
|
||||
/*
|
||||
@ -278,6 +576,7 @@ static void __init htcherald_init(void)
|
||||
{
|
||||
printk(KERN_INFO "HTC Herald init.\n");
|
||||
|
||||
/* Do board initialization before we register all the devices */
|
||||
omap_gpio_init();
|
||||
|
||||
omap_board_config = htcherald_config;
|
||||
@ -288,6 +587,16 @@ static void __init htcherald_init(void)
|
||||
|
||||
htcherald_usb_enable();
|
||||
omap1_usb_init(&htcherald_usb_config);
|
||||
|
||||
spi_register_board_info(htcherald_spi_board_info,
|
||||
ARRAY_SIZE(htcherald_spi_board_info));
|
||||
|
||||
omap_register_i2c_bus(1, 100, NULL, 0);
|
||||
|
||||
#if defined(CONFIG_MMC_OMAP) || defined(CONFIG_MMC_OMAP_MODULE)
|
||||
htc_mmc_data[0] = &htc_mmc1_data;
|
||||
omap1_init_mmc(htc_mmc_data, 1);
|
||||
#endif
|
||||
}
|
||||
|
||||
static void __init htcherald_init_irq(void)
|
||||
|
@ -44,8 +44,7 @@ static struct omap_mmc_platform_data mmc1_data = {
|
||||
.nr_slots = 1,
|
||||
.slots[0] = {
|
||||
.set_power = mmc_set_power,
|
||||
.ocr_mask = MMC_VDD_28_29 | MMC_VDD_30_31 |
|
||||
MMC_VDD_32_33 | MMC_VDD_33_34,
|
||||
.ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34,
|
||||
.name = "mmcblk",
|
||||
},
|
||||
};
|
||||
|
@ -9,6 +9,7 @@
|
||||
* (at your option) any later version.
|
||||
*/
|
||||
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
@ -192,6 +193,48 @@ static inline void omap_init_spi100k(void)
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#define OMAP1_CAMERA_BASE 0xfffb6800
|
||||
#define OMAP1_CAMERA_IOSIZE 0x1c
|
||||
|
||||
static struct resource omap1_camera_resources[] = {
|
||||
[0] = {
|
||||
.start = OMAP1_CAMERA_BASE,
|
||||
.end = OMAP1_CAMERA_BASE + OMAP1_CAMERA_IOSIZE - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = INT_CAMERA,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static u64 omap1_camera_dma_mask = DMA_BIT_MASK(32);
|
||||
|
||||
static struct platform_device omap1_camera_device = {
|
||||
.name = "omap1-camera",
|
||||
.id = 0, /* This is used to put cameras on this interface */
|
||||
.dev = {
|
||||
.dma_mask = &omap1_camera_dma_mask,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
},
|
||||
.num_resources = ARRAY_SIZE(omap1_camera_resources),
|
||||
.resource = omap1_camera_resources,
|
||||
};
|
||||
|
||||
void __init omap1_camera_init(void *info)
|
||||
{
|
||||
struct platform_device *dev = &omap1_camera_device;
|
||||
int ret;
|
||||
|
||||
dev->dev.platform_data = info;
|
||||
|
||||
ret = platform_device_register(dev);
|
||||
if (ret)
|
||||
dev_err(&dev->dev, "unable to register device: %d\n", ret);
|
||||
}
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
|
||||
static inline void omap_init_sti(void) {}
|
||||
@ -258,3 +301,30 @@ static int __init omap1_init_devices(void)
|
||||
}
|
||||
arch_initcall(omap1_init_devices);
|
||||
|
||||
#if defined(CONFIG_OMAP_WATCHDOG) || defined(CONFIG_OMAP_WATCHDOG_MODULE)
|
||||
|
||||
static struct resource wdt_resources[] = {
|
||||
{
|
||||
.start = 0xfffeb000,
|
||||
.end = 0xfffeb07F,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device omap_wdt_device = {
|
||||
.name = "omap_wdt",
|
||||
.id = -1,
|
||||
.num_resources = ARRAY_SIZE(wdt_resources),
|
||||
.resource = wdt_resources,
|
||||
};
|
||||
|
||||
static int __init omap_init_wdt(void)
|
||||
{
|
||||
if (!cpu_is_omap16xx())
|
||||
return;
|
||||
|
||||
platform_device_register(&omap_wdt_device);
|
||||
return 0;
|
||||
}
|
||||
subsys_initcall(omap_init_wdt);
|
||||
#endif
|
||||
|
11
arch/arm/mach-omap1/include/mach/camera.h
Normal file
11
arch/arm/mach-omap1/include/mach/camera.h
Normal file
@ -0,0 +1,11 @@
|
||||
#ifndef __ASM_ARCH_CAMERA_H_
|
||||
#define __ASM_ARCH_CAMERA_H_
|
||||
|
||||
void omap1_camera_init(void *);
|
||||
|
||||
static inline void omap1_set_camera_info(struct omap1_cam_platform_data *info)
|
||||
{
|
||||
omap1_camera_init(info);
|
||||
}
|
||||
|
||||
#endif /* __ASM_ARCH_CAMERA_H_ */
|
98
arch/arm/mach-omap1/pm_bus.c
Normal file
98
arch/arm/mach-omap1/pm_bus.c
Normal file
@ -0,0 +1,98 @@
|
||||
/*
|
||||
* Runtime PM support code for OMAP1
|
||||
*
|
||||
* Author: Kevin Hilman, Deep Root Systems, LLC
|
||||
*
|
||||
* Copyright (C) 2010 Texas Instruments, Inc.
|
||||
*
|
||||
* This file is licensed under the terms of the GNU General Public
|
||||
* License version 2. This program is licensed "as is" without any
|
||||
* warranty of any kind, whether express or implied.
|
||||
*/
|
||||
#include <linux/init.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/err.h>
|
||||
|
||||
#include <plat/omap_device.h>
|
||||
#include <plat/omap-pm.h>
|
||||
|
||||
#ifdef CONFIG_PM_RUNTIME
|
||||
static int omap1_pm_runtime_suspend(struct device *dev)
|
||||
{
|
||||
struct clk *iclk, *fclk;
|
||||
int ret = 0;
|
||||
|
||||
dev_dbg(dev, "%s\n", __func__);
|
||||
|
||||
ret = pm_generic_runtime_suspend(dev);
|
||||
|
||||
fclk = clk_get(dev, "fck");
|
||||
if (!IS_ERR(fclk)) {
|
||||
clk_disable(fclk);
|
||||
clk_put(fclk);
|
||||
}
|
||||
|
||||
iclk = clk_get(dev, "ick");
|
||||
if (!IS_ERR(iclk)) {
|
||||
clk_disable(iclk);
|
||||
clk_put(iclk);
|
||||
}
|
||||
|
||||
return 0;
|
||||
};
|
||||
|
||||
static int omap1_pm_runtime_resume(struct device *dev)
|
||||
{
|
||||
int ret = 0;
|
||||
struct clk *iclk, *fclk;
|
||||
|
||||
dev_dbg(dev, "%s\n", __func__);
|
||||
|
||||
iclk = clk_get(dev, "ick");
|
||||
if (!IS_ERR(iclk)) {
|
||||
clk_enable(iclk);
|
||||
clk_put(iclk);
|
||||
}
|
||||
|
||||
fclk = clk_get(dev, "fck");
|
||||
if (!IS_ERR(fclk)) {
|
||||
clk_enable(fclk);
|
||||
clk_put(fclk);
|
||||
}
|
||||
|
||||
return pm_generic_runtime_resume(dev);
|
||||
};
|
||||
|
||||
static int __init omap1_pm_runtime_init(void)
|
||||
{
|
||||
const struct dev_pm_ops *pm;
|
||||
struct dev_pm_ops *omap_pm;
|
||||
|
||||
pm = platform_bus_get_pm_ops();
|
||||
if (!pm) {
|
||||
pr_err("%s: unable to get dev_pm_ops from platform_bus\n",
|
||||
__func__);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
omap_pm = kmemdup(pm, sizeof(struct dev_pm_ops), GFP_KERNEL);
|
||||
if (!omap_pm) {
|
||||
pr_err("%s: unable to alloc memory for new dev_pm_ops\n",
|
||||
__func__);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
omap_pm->runtime_suspend = omap1_pm_runtime_suspend;
|
||||
omap_pm->runtime_resume = omap1_pm_runtime_resume;
|
||||
|
||||
platform_bus_set_pm_ops(omap_pm);
|
||||
|
||||
return 0;
|
||||
}
|
||||
core_initcall(omap1_pm_runtime_init);
|
||||
#endif /* CONFIG_PM_RUNTIME */
|
@ -11,9 +11,8 @@ config ARCH_OMAP2PLUS_TYPICAL
|
||||
select PM_RUNTIME
|
||||
select VFP
|
||||
select NEON if ARCH_OMAP3 || ARCH_OMAP4
|
||||
select SERIAL_8250
|
||||
select SERIAL_CORE_CONSOLE
|
||||
select SERIAL_8250_CONSOLE
|
||||
select SERIAL_OMAP
|
||||
select SERIAL_OMAP_CONSOLE
|
||||
select I2C
|
||||
select I2C_OMAP
|
||||
select MFD
|
||||
@ -35,7 +34,7 @@ config ARCH_OMAP3
|
||||
default y
|
||||
select CPU_V7
|
||||
select USB_ARCH_HAS_EHCI
|
||||
select ARM_L1_CACHE_SHIFT_6
|
||||
select ARM_L1_CACHE_SHIFT_6 if !ARCH_OMAP4
|
||||
|
||||
config ARCH_OMAP4
|
||||
bool "TI OMAP4"
|
||||
@ -43,6 +42,8 @@ config ARCH_OMAP4
|
||||
depends on ARCH_OMAP2PLUS
|
||||
select CPU_V7
|
||||
select ARM_GIC
|
||||
select PL310_ERRATA_588369
|
||||
select ARM_ERRATA_720789
|
||||
|
||||
comment "OMAP Core Type"
|
||||
depends on ARCH_OMAP2
|
||||
@ -99,20 +100,20 @@ config MACH_OMAP2_TUSB6010
|
||||
|
||||
config MACH_OMAP_H4
|
||||
bool "OMAP 2420 H4 board"
|
||||
depends on ARCH_OMAP2
|
||||
depends on ARCH_OMAP2420
|
||||
default y
|
||||
select OMAP_PACKAGE_ZAF
|
||||
select OMAP_DEBUG_DEVICES
|
||||
|
||||
config MACH_OMAP_APOLLON
|
||||
bool "OMAP 2420 Apollon board"
|
||||
depends on ARCH_OMAP2
|
||||
depends on ARCH_OMAP2420
|
||||
default y
|
||||
select OMAP_PACKAGE_ZAC
|
||||
|
||||
config MACH_OMAP_2430SDP
|
||||
bool "OMAP 2430 SDP board"
|
||||
depends on ARCH_OMAP2
|
||||
depends on ARCH_OMAP2430
|
||||
default y
|
||||
select OMAP_PACKAGE_ZAC
|
||||
|
||||
@ -135,6 +136,26 @@ config MACH_OMAP_LDP
|
||||
default y
|
||||
select OMAP_PACKAGE_CBB
|
||||
|
||||
config MACH_OMAP3530_LV_SOM
|
||||
bool "OMAP3 Logic 3530 LV SOM board"
|
||||
depends on ARCH_OMAP3
|
||||
select OMAP_PACKAGE_CBB
|
||||
default y
|
||||
help
|
||||
Support for the LogicPD OMAP3530 SOM Development kit
|
||||
for full description please see the products webpage at
|
||||
http://www.logicpd.com/products/development-kits/texas-instruments-zoom%E2%84%A2-omap35x-development-kit
|
||||
|
||||
config MACH_OMAP3_TORPEDO
|
||||
bool "OMAP3 Logic 35x Torpedo board"
|
||||
depends on ARCH_OMAP3
|
||||
select OMAP_PACKAGE_CBB
|
||||
default y
|
||||
help
|
||||
Support for the LogicPD OMAP35x Torpedo Development kit
|
||||
for full description please see the products webpage at
|
||||
http://www.logicpd.com/products/development-kits/zoom-omap35x-torpedo-development-kit
|
||||
|
||||
config MACH_OVERO
|
||||
bool "Gumstix Overo board"
|
||||
depends on ARCH_OMAP3
|
||||
@ -200,12 +221,18 @@ config MACH_OMAP_ZOOM2
|
||||
depends on ARCH_OMAP3
|
||||
default y
|
||||
select OMAP_PACKAGE_CBB
|
||||
select SERIAL_8250
|
||||
select SERIAL_CORE_CONSOLE
|
||||
select SERIAL_8250_CONSOLE
|
||||
|
||||
config MACH_OMAP_ZOOM3
|
||||
bool "OMAP3630 Zoom3 board"
|
||||
depends on ARCH_OMAP3
|
||||
default y
|
||||
select OMAP_PACKAGE_CBP
|
||||
select SERIAL_8250
|
||||
select SERIAL_CORE_CONSOLE
|
||||
select SERIAL_8250_CONSOLE
|
||||
|
||||
config MACH_CM_T35
|
||||
bool "CompuLab CM-T35 module"
|
||||
@ -214,12 +241,25 @@ config MACH_CM_T35
|
||||
select OMAP_PACKAGE_CUS
|
||||
select OMAP_MUX
|
||||
|
||||
config MACH_CM_T3517
|
||||
bool "CompuLab CM-T3517 module"
|
||||
depends on ARCH_OMAP3
|
||||
default y
|
||||
select OMAP_PACKAGE_CBB
|
||||
select OMAP_MUX
|
||||
|
||||
config MACH_IGEP0020
|
||||
bool "IGEP v2 board"
|
||||
depends on ARCH_OMAP3
|
||||
default y
|
||||
select OMAP_PACKAGE_CBB
|
||||
|
||||
config MACH_IGEP0030
|
||||
bool "IGEP OMAP3 module"
|
||||
depends on ARCH_OMAP3
|
||||
default y
|
||||
select OMAP_PACKAGE_CBB
|
||||
|
||||
config MACH_SBC3530
|
||||
bool "OMAP3 SBC STALKER board"
|
||||
depends on ARCH_OMAP3
|
||||
|
@ -3,9 +3,10 @@
|
||||
#
|
||||
|
||||
# Common support
|
||||
obj-y := id.o io.o control.o mux.o devices.o serial.o gpmc.o timer-gp.o pm.o
|
||||
obj-y := id.o io.o control.o mux.o devices.o serial.o gpmc.o timer-gp.o pm.o \
|
||||
common.o
|
||||
|
||||
omap-2-3-common = irq.o sdrc.o
|
||||
omap-2-3-common = irq.o sdrc.o prm2xxx_3xxx.o
|
||||
hwmod-common = omap_hwmod.o \
|
||||
omap_hwmod_common_data.o
|
||||
prcm-common = prcm.o powerdomain.o
|
||||
@ -15,7 +16,7 @@ clock-common = clock.o clock_common_data.o \
|
||||
|
||||
obj-$(CONFIG_ARCH_OMAP2) += $(omap-2-3-common) $(prcm-common) $(hwmod-common)
|
||||
obj-$(CONFIG_ARCH_OMAP3) += $(omap-2-3-common) $(prcm-common) $(hwmod-common)
|
||||
obj-$(CONFIG_ARCH_OMAP4) += $(prcm-common) $(hwmod-common)
|
||||
obj-$(CONFIG_ARCH_OMAP4) += $(prcm-common) prm44xx.o $(hwmod-common)
|
||||
|
||||
obj-$(CONFIG_OMAP_MCBSP) += mcbsp.o
|
||||
|
||||
@ -49,14 +50,18 @@ obj-$(CONFIG_ARCH_OMAP2) += sdrc2xxx.o
|
||||
# Power Management
|
||||
ifeq ($(CONFIG_PM),y)
|
||||
obj-$(CONFIG_ARCH_OMAP2) += pm24xx.o
|
||||
obj-$(CONFIG_ARCH_OMAP2) += sleep24xx.o
|
||||
obj-$(CONFIG_ARCH_OMAP3) += pm34xx.o sleep34xx.o cpuidle34xx.o
|
||||
obj-$(CONFIG_ARCH_OMAP4) += pm44xx.o
|
||||
obj-$(CONFIG_ARCH_OMAP2) += sleep24xx.o pm_bus.o
|
||||
obj-$(CONFIG_ARCH_OMAP3) += pm34xx.o sleep34xx.o cpuidle34xx.o pm_bus.o
|
||||
obj-$(CONFIG_ARCH_OMAP4) += pm44xx.o pm_bus.o
|
||||
obj-$(CONFIG_PM_DEBUG) += pm-debug.o
|
||||
|
||||
AFLAGS_sleep24xx.o :=-Wa,-march=armv6
|
||||
AFLAGS_sleep34xx.o :=-Wa,-march=armv7-a
|
||||
|
||||
ifeq ($(CONFIG_PM_VERBOSE),y)
|
||||
CFLAGS_pm_bus.o += -DDEBUG
|
||||
endif
|
||||
|
||||
endif
|
||||
|
||||
# PRCM
|
||||
@ -87,6 +92,7 @@ obj-$(CONFIG_ARCH_OMAP2430) += opp2430_data.o
|
||||
obj-$(CONFIG_ARCH_OMAP2420) += omap_hwmod_2420_data.o
|
||||
obj-$(CONFIG_ARCH_OMAP2430) += omap_hwmod_2430_data.o
|
||||
obj-$(CONFIG_ARCH_OMAP3) += omap_hwmod_3xxx_data.o
|
||||
obj-$(CONFIG_ARCH_OMAP4) += omap_hwmod_44xx_data.o
|
||||
|
||||
# EMU peripherals
|
||||
obj-$(CONFIG_OMAP3_EMU) += emu.o
|
||||
@ -115,6 +121,10 @@ obj-$(CONFIG_MACH_DEVKIT8000) += board-devkit8000.o \
|
||||
obj-$(CONFIG_MACH_OMAP_LDP) += board-ldp.o \
|
||||
board-flash.o \
|
||||
hsmmc.o
|
||||
obj-$(CONFIG_MACH_OMAP3530_LV_SOM) += board-omap3logic.o \
|
||||
hsmmc.o
|
||||
obj-$(CONFIG_MACH_OMAP3_TORPEDO) += board-omap3logic.o \
|
||||
hsmmc.o
|
||||
obj-$(CONFIG_MACH_OVERO) += board-overo.o \
|
||||
hsmmc.o
|
||||
obj-$(CONFIG_MACH_OMAP3EVM) += board-omap3evm.o \
|
||||
@ -146,8 +156,11 @@ obj-$(CONFIG_MACH_OMAP_3630SDP) += board-3630sdp.o \
|
||||
hsmmc.o
|
||||
obj-$(CONFIG_MACH_CM_T35) += board-cm-t35.o \
|
||||
hsmmc.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 \
|
||||
@ -174,3 +187,6 @@ obj-y += $(nand-m) $(nand-y)
|
||||
|
||||
smc91x-$(CONFIG_SMC91X) := gpmc-smc91x.o
|
||||
obj-y += $(smc91x-m) $(smc91x-y)
|
||||
|
||||
smsc911x-$(CONFIG_SMSC911X) := gpmc-smsc911x.o
|
||||
obj-y += $(smsc911x-m) $(smsc911x-y)
|
||||
|
@ -19,6 +19,7 @@
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
#include <linux/mtd/physmap.h>
|
||||
#include <linux/mmc/host.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/i2c/twl.h>
|
||||
#include <linux/err.h>
|
||||
@ -190,7 +191,7 @@ static int __init omap2430_i2c_init(void)
|
||||
static struct omap2_hsmmc_info mmc[] __initdata = {
|
||||
{
|
||||
.mmc = 1,
|
||||
.wires = 4,
|
||||
.caps = MMC_CAP_4_BIT_DATA,
|
||||
.gpio_cd = -EINVAL,
|
||||
.gpio_wp = -EINVAL,
|
||||
.ext_clock = 1,
|
||||
|
@ -24,6 +24,7 @@
|
||||
#include <linux/regulator/machine.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/mmc/host.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <asm/mach-types.h>
|
||||
@ -38,15 +39,14 @@
|
||||
#include <plat/gpmc.h>
|
||||
#include <plat/display.h>
|
||||
|
||||
#include <plat/control.h>
|
||||
#include <plat/gpmc-smc91x.h>
|
||||
|
||||
#include <mach/board-flash.h>
|
||||
|
||||
#include "board-flash.h"
|
||||
#include "mux.h"
|
||||
#include "sdram-qimonda-hyb18m512160af-6.h"
|
||||
#include "hsmmc.h"
|
||||
#include "pm.h"
|
||||
#include "control.h"
|
||||
|
||||
#define CONFIG_DISABLE_HFCLK 1
|
||||
|
||||
@ -76,7 +76,7 @@ static struct cpuidle_params omap3_cpuidle_params_table[] = {
|
||||
{1, 10000, 30000, 300000},
|
||||
};
|
||||
|
||||
static int board_keymap[] = {
|
||||
static uint32_t board_keymap[] = {
|
||||
KEY(0, 0, KEY_LEFT),
|
||||
KEY(0, 1, KEY_RIGHT),
|
||||
KEY(0, 2, KEY_A),
|
||||
@ -353,12 +353,12 @@ static struct omap2_hsmmc_info mmc[] = {
|
||||
/* 8 bits (default) requires S6.3 == ON,
|
||||
* so the SIM card isn't used; else 4 bits.
|
||||
*/
|
||||
.wires = 8,
|
||||
.caps = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA,
|
||||
.gpio_wp = 4,
|
||||
},
|
||||
{
|
||||
.mmc = 2,
|
||||
.wires = 8,
|
||||
.caps = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA,
|
||||
.gpio_wp = 7,
|
||||
},
|
||||
{} /* Terminator */
|
||||
|
@ -21,8 +21,8 @@
|
||||
#include <plat/usb.h>
|
||||
|
||||
#include <mach/board-zoom.h>
|
||||
#include <mach/board-flash.h>
|
||||
|
||||
#include "board-flash.h"
|
||||
#include "mux.h"
|
||||
#include "sdram-hynix-h8mbx00u0mer-0em.h"
|
||||
|
||||
@ -208,7 +208,6 @@ static struct flash_partitions sdp_flash_partitions[] = {
|
||||
static void __init omap_sdp_init(void)
|
||||
{
|
||||
omap3_mux_init(board_mux, OMAP_PACKAGE_CBP);
|
||||
omap_serial_init();
|
||||
zoom_peripherals_init();
|
||||
board_smc91x_init();
|
||||
board_flash_init(sdp_flash_partitions, chip_sel_sdp);
|
||||
|
@ -20,6 +20,7 @@
|
||||
#include <linux/usb/otg.h>
|
||||
#include <linux/spi/spi.h>
|
||||
#include <linux/i2c/twl.h>
|
||||
#include <linux/gpio_keys.h>
|
||||
#include <linux/regulator/machine.h>
|
||||
#include <linux/leds.h>
|
||||
|
||||
@ -31,15 +32,18 @@
|
||||
|
||||
#include <plat/board.h>
|
||||
#include <plat/common.h>
|
||||
#include <plat/control.h>
|
||||
#include <plat/timer-gp.h>
|
||||
#include <plat/usb.h>
|
||||
#include <plat/mmc.h>
|
||||
|
||||
#include "hsmmc.h"
|
||||
#include "timer-gp.h"
|
||||
#include "control.h"
|
||||
|
||||
#define ETH_KS8851_IRQ 34
|
||||
#define ETH_KS8851_POWER_ON 48
|
||||
#define ETH_KS8851_QUART 138
|
||||
#define OMAP4_SFH7741_SENSOR_OUTPUT_GPIO 184
|
||||
#define OMAP4_SFH7741_ENABLE_GPIO 188
|
||||
|
||||
static struct gpio_led sdp4430_gpio_leds[] = {
|
||||
{
|
||||
@ -77,11 +81,47 @@ static struct gpio_led sdp4430_gpio_leds[] = {
|
||||
|
||||
};
|
||||
|
||||
static struct gpio_keys_button sdp4430_gpio_keys[] = {
|
||||
{
|
||||
.desc = "Proximity Sensor",
|
||||
.type = EV_SW,
|
||||
.code = SW_FRONT_PROXIMITY,
|
||||
.gpio = OMAP4_SFH7741_SENSOR_OUTPUT_GPIO,
|
||||
.active_low = 0,
|
||||
}
|
||||
};
|
||||
|
||||
static struct gpio_led_platform_data sdp4430_led_data = {
|
||||
.leds = sdp4430_gpio_leds,
|
||||
.num_leds = ARRAY_SIZE(sdp4430_gpio_leds),
|
||||
};
|
||||
|
||||
static int omap_prox_activate(struct device *dev)
|
||||
{
|
||||
gpio_set_value(OMAP4_SFH7741_ENABLE_GPIO , 1);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void omap_prox_deactivate(struct device *dev)
|
||||
{
|
||||
gpio_set_value(OMAP4_SFH7741_ENABLE_GPIO , 0);
|
||||
}
|
||||
|
||||
static struct gpio_keys_platform_data sdp4430_gpio_keys_data = {
|
||||
.buttons = sdp4430_gpio_keys,
|
||||
.nbuttons = ARRAY_SIZE(sdp4430_gpio_keys),
|
||||
.enable = omap_prox_activate,
|
||||
.disable = omap_prox_deactivate,
|
||||
};
|
||||
|
||||
static struct platform_device sdp4430_gpio_keys_device = {
|
||||
.name = "gpio-keys",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &sdp4430_gpio_keys_data,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device sdp4430_leds_gpio = {
|
||||
.name = "leds-gpio",
|
||||
.id = -1,
|
||||
@ -161,6 +201,7 @@ static struct platform_device sdp4430_lcd_device = {
|
||||
|
||||
static struct platform_device *sdp4430_devices[] __initdata = {
|
||||
&sdp4430_lcd_device,
|
||||
&sdp4430_gpio_keys_device,
|
||||
&sdp4430_leds_gpio,
|
||||
};
|
||||
|
||||
@ -193,15 +234,16 @@ static struct omap_musb_board_data musb_board_data = {
|
||||
static struct omap2_hsmmc_info mmc[] = {
|
||||
{
|
||||
.mmc = 1,
|
||||
.wires = 8,
|
||||
.caps = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA,
|
||||
.gpio_wp = -EINVAL,
|
||||
},
|
||||
{
|
||||
.mmc = 2,
|
||||
.wires = 8,
|
||||
.caps = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA,
|
||||
.gpio_cd = -EINVAL,
|
||||
.gpio_wp = -EINVAL,
|
||||
.nonremovable = true,
|
||||
.ocr_mask = MMC_VDD_29_30,
|
||||
},
|
||||
{} /* Terminator */
|
||||
};
|
||||
@ -235,8 +277,14 @@ static int omap4_twl6030_hsmmc_late_init(struct device *dev)
|
||||
|
||||
static __init void omap4_twl6030_hsmmc_set_late_init(struct device *dev)
|
||||
{
|
||||
struct omap_mmc_platform_data *pdata = dev->platform_data;
|
||||
struct omap_mmc_platform_data *pdata;
|
||||
|
||||
/* dev can be null if CONFIG_MMC_OMAP_HS is not set */
|
||||
if (!dev) {
|
||||
pr_err("Failed %s\n", __func__);
|
||||
return;
|
||||
}
|
||||
pdata = dev->platform_data;
|
||||
pdata->init = omap4_twl6030_hsmmc_late_init;
|
||||
}
|
||||
|
||||
@ -412,6 +460,11 @@ static struct i2c_board_info __initdata sdp4430_i2c_3_boardinfo[] = {
|
||||
I2C_BOARD_INFO("tmp105", 0x48),
|
||||
},
|
||||
};
|
||||
static struct i2c_board_info __initdata sdp4430_i2c_4_boardinfo[] = {
|
||||
{
|
||||
I2C_BOARD_INFO("hmc5843", 0x1e),
|
||||
},
|
||||
};
|
||||
static int __init omap4_i2c_init(void)
|
||||
{
|
||||
/*
|
||||
@ -423,14 +476,36 @@ static int __init omap4_i2c_init(void)
|
||||
omap_register_i2c_bus(2, 400, NULL, 0);
|
||||
omap_register_i2c_bus(3, 400, sdp4430_i2c_3_boardinfo,
|
||||
ARRAY_SIZE(sdp4430_i2c_3_boardinfo));
|
||||
omap_register_i2c_bus(4, 400, NULL, 0);
|
||||
omap_register_i2c_bus(4, 400, sdp4430_i2c_4_boardinfo,
|
||||
ARRAY_SIZE(sdp4430_i2c_4_boardinfo));
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void __init omap_sfh7741prox_init(void)
|
||||
{
|
||||
int error;
|
||||
|
||||
error = gpio_request(OMAP4_SFH7741_ENABLE_GPIO, "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 __init omap_4430sdp_init(void)
|
||||
{
|
||||
int status;
|
||||
|
||||
omap4_i2c_init();
|
||||
omap_sfh7741prox_init();
|
||||
platform_add_devices(sdp4430_devices, ARRAY_SIZE(sdp4430_devices));
|
||||
omap_serial_init();
|
||||
omap4_twl6030_hsmmc_init(mmc);
|
||||
|
@ -33,11 +33,11 @@
|
||||
|
||||
#include <plat/board.h>
|
||||
#include <plat/common.h>
|
||||
#include <plat/control.h>
|
||||
#include <plat/usb.h>
|
||||
#include <plat/display.h>
|
||||
|
||||
#include "mux.h"
|
||||
#include "control.h"
|
||||
|
||||
#define AM35XX_EVM_MDIO_FREQUENCY (1000000)
|
||||
|
||||
@ -125,7 +125,7 @@ static void am3517_disable_ethernet_int(void)
|
||||
regval = omap_ctrl_readl(AM35XX_CONTROL_LVL_INTR_CLEAR);
|
||||
}
|
||||
|
||||
void am3517_evm_ethernet_init(struct emac_platform_data *pdata)
|
||||
static void am3517_evm_ethernet_init(struct emac_platform_data *pdata)
|
||||
{
|
||||
unsigned int regval;
|
||||
|
||||
@ -160,7 +160,6 @@ void am3517_evm_ethernet_init(struct emac_platform_data *pdata)
|
||||
static struct i2c_board_info __initdata am3517evm_i2c1_boardinfo[] = {
|
||||
{
|
||||
I2C_BOARD_INFO("s35390a", 0x30),
|
||||
.type = "s35390a",
|
||||
},
|
||||
};
|
||||
|
||||
@ -368,7 +367,7 @@ static struct omap_dss_board_info am3517_evm_dss_data = {
|
||||
.default_device = &am3517_evm_lcd_device,
|
||||
};
|
||||
|
||||
struct platform_device am3517_evm_dss_device = {
|
||||
static struct platform_device am3517_evm_dss_device = {
|
||||
.name = "omapdss",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
|
@ -39,9 +39,9 @@
|
||||
#include <plat/board.h>
|
||||
#include <plat/common.h>
|
||||
#include <plat/gpmc.h>
|
||||
#include <plat/control.h>
|
||||
|
||||
#include "mux.h"
|
||||
#include "control.h"
|
||||
|
||||
/* LED & Switch macros */
|
||||
#define LED0_GPIO13 13
|
||||
|
@ -31,6 +31,7 @@
|
||||
#include <linux/i2c/at24.h>
|
||||
#include <linux/i2c/twl.h>
|
||||
#include <linux/regulator/machine.h>
|
||||
#include <linux/mmc/host.h>
|
||||
|
||||
#include <linux/spi/spi.h>
|
||||
#include <linux/spi/tdo24m.h>
|
||||
@ -237,8 +238,6 @@ static inline void cm_t35_init_nand(void) {}
|
||||
defined(CONFIG_TOUCHSCREEN_ADS7846_MODULE)
|
||||
#include <linux/spi/ads7846.h>
|
||||
|
||||
#include <plat/mcspi.h>
|
||||
|
||||
static struct omap2_mcspi_device_config ads7846_mcspi_config = {
|
||||
.turbo_mode = 0,
|
||||
.single_channel = 1, /* 0: slave, 1: master */
|
||||
@ -558,7 +557,7 @@ static struct twl4030_usb_data cm_t35_usb_data = {
|
||||
.usb_mode = T2_USB_MODE_ULPI,
|
||||
};
|
||||
|
||||
static int cm_t35_keymap[] = {
|
||||
static uint32_t cm_t35_keymap[] = {
|
||||
KEY(0, 0, KEY_A), KEY(0, 1, KEY_B), KEY(0, 2, KEY_LEFT),
|
||||
KEY(1, 0, KEY_UP), KEY(1, 1, KEY_ENTER), KEY(1, 2, KEY_DOWN),
|
||||
KEY(2, 0, KEY_RIGHT), KEY(2, 1, KEY_C), KEY(2, 2, KEY_D),
|
||||
@ -579,14 +578,14 @@ static struct twl4030_keypad_data cm_t35_kp_data = {
|
||||
static struct omap2_hsmmc_info mmc[] = {
|
||||
{
|
||||
.mmc = 1,
|
||||
.wires = 4,
|
||||
.caps = MMC_CAP_4_BIT_DATA,
|
||||
.gpio_cd = -EINVAL,
|
||||
.gpio_wp = -EINVAL,
|
||||
|
||||
},
|
||||
{
|
||||
.mmc = 2,
|
||||
.wires = 4,
|
||||
.caps = MMC_CAP_4_BIT_DATA,
|
||||
.transceiver = 1,
|
||||
.gpio_cd = -EINVAL,
|
||||
.gpio_wp = -EINVAL,
|
||||
|
292
arch/arm/mach-omap2/board-cm-t3517.c
Normal file
292
arch/arm/mach-omap2/board-cm-t3517.c
Normal file
@ -0,0 +1,292 @@
|
||||
/*
|
||||
* linux/arch/arm/mach-omap2/board-cm-t3517.c
|
||||
*
|
||||
* Support for the CompuLab CM-T3517 modules
|
||||
*
|
||||
* Copyright (C) 2010 CompuLab, Ltd.
|
||||
* Author: Igor Grinberg <grinberg@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/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/leds.h>
|
||||
#include <linux/rtc-v3020.h>
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/mtd/nand.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
#include <linux/can/platform/ti_hecc.h>
|
||||
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/map.h>
|
||||
|
||||
#include <plat/board.h>
|
||||
#include <plat/common.h>
|
||||
#include <plat/usb.h>
|
||||
#include <plat/nand.h>
|
||||
#include <plat/gpmc.h>
|
||||
|
||||
#include <mach/am35xx.h>
|
||||
|
||||
#include "mux.h"
|
||||
#include "control.h"
|
||||
|
||||
#if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE)
|
||||
static struct gpio_led cm_t3517_leds[] = {
|
||||
[0] = {
|
||||
.gpio = 186,
|
||||
.name = "cm-t3517:green",
|
||||
.default_trigger = "heartbeat",
|
||||
.active_low = 0,
|
||||
},
|
||||
};
|
||||
|
||||
static struct gpio_led_platform_data cm_t3517_led_pdata = {
|
||||
.num_leds = ARRAY_SIZE(cm_t3517_leds),
|
||||
.leds = cm_t3517_leds,
|
||||
};
|
||||
|
||||
static struct platform_device cm_t3517_led_device = {
|
||||
.name = "leds-gpio",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &cm_t3517_led_pdata,
|
||||
},
|
||||
};
|
||||
|
||||
static void __init cm_t3517_init_leds(void)
|
||||
{
|
||||
platform_device_register(&cm_t3517_led_device);
|
||||
}
|
||||
#else
|
||||
static inline void cm_t3517_init_leds(void) {}
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_CAN_TI_HECC) || defined(CONFIG_CAN_TI_HECC_MODULE)
|
||||
static struct resource cm_t3517_hecc_resources[] = {
|
||||
{
|
||||
.start = AM35XX_IPSS_HECC_BASE,
|
||||
.end = AM35XX_IPSS_HECC_BASE + SZ_16K - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
{
|
||||
.start = INT_35XX_HECC0_IRQ,
|
||||
.end = INT_35XX_HECC0_IRQ,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct ti_hecc_platform_data cm_t3517_hecc_pdata = {
|
||||
.scc_hecc_offset = AM35XX_HECC_SCC_HECC_OFFSET,
|
||||
.scc_ram_offset = AM35XX_HECC_SCC_RAM_OFFSET,
|
||||
.hecc_ram_offset = AM35XX_HECC_RAM_OFFSET,
|
||||
.mbx_offset = AM35XX_HECC_MBOX_OFFSET,
|
||||
.int_line = AM35XX_HECC_INT_LINE,
|
||||
.version = AM35XX_HECC_VERSION,
|
||||
};
|
||||
|
||||
static struct platform_device cm_t3517_hecc_device = {
|
||||
.name = "ti_hecc",
|
||||
.id = 1,
|
||||
.num_resources = ARRAY_SIZE(cm_t3517_hecc_resources),
|
||||
.resource = cm_t3517_hecc_resources,
|
||||
.dev = {
|
||||
.platform_data = &cm_t3517_hecc_pdata,
|
||||
},
|
||||
};
|
||||
|
||||
static void cm_t3517_init_hecc(void)
|
||||
{
|
||||
platform_device_register(&cm_t3517_hecc_device);
|
||||
}
|
||||
#else
|
||||
static inline void cm_t3517_init_hecc(void) {}
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_RTC_DRV_V3020) || defined(CONFIG_RTC_DRV_V3020_MODULE)
|
||||
#define RTC_IO_GPIO (153)
|
||||
#define RTC_WR_GPIO (154)
|
||||
#define RTC_RD_GPIO (160)
|
||||
#define RTC_CS_GPIO (163)
|
||||
|
||||
struct v3020_platform_data cm_t3517_v3020_pdata = {
|
||||
.use_gpio = 1,
|
||||
.gpio_cs = RTC_CS_GPIO,
|
||||
.gpio_wr = RTC_WR_GPIO,
|
||||
.gpio_rd = RTC_RD_GPIO,
|
||||
.gpio_io = RTC_IO_GPIO,
|
||||
};
|
||||
|
||||
static struct platform_device cm_t3517_rtc_device = {
|
||||
.name = "v3020",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &cm_t3517_v3020_pdata,
|
||||
}
|
||||
};
|
||||
|
||||
static void __init cm_t3517_init_rtc(void)
|
||||
{
|
||||
platform_device_register(&cm_t3517_rtc_device);
|
||||
}
|
||||
#else
|
||||
static inline void cm_t3517_init_rtc(void) {}
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_USB_EHCI_HCD) || defined(CONFIG_USB_EHCI_HCD_MODULE)
|
||||
#define HSUSB1_RESET_GPIO (146)
|
||||
#define HSUSB2_RESET_GPIO (147)
|
||||
#define USB_HUB_RESET_GPIO (152)
|
||||
|
||||
static struct ehci_hcd_omap_platform_data cm_t3517_ehci_pdata __initdata = {
|
||||
.port_mode[0] = EHCI_HCD_OMAP_MODE_PHY,
|
||||
.port_mode[1] = EHCI_HCD_OMAP_MODE_PHY,
|
||||
.port_mode[2] = EHCI_HCD_OMAP_MODE_UNKNOWN,
|
||||
|
||||
.phy_reset = true,
|
||||
.reset_gpio_port[0] = HSUSB1_RESET_GPIO,
|
||||
.reset_gpio_port[1] = HSUSB2_RESET_GPIO,
|
||||
.reset_gpio_port[2] = -EINVAL,
|
||||
};
|
||||
|
||||
static int cm_t3517_init_usbh(void)
|
||||
{
|
||||
int err;
|
||||
|
||||
err = gpio_request(USB_HUB_RESET_GPIO, "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);
|
||||
}
|
||||
|
||||
usb_ehci_init(&cm_t3517_ehci_pdata);
|
||||
|
||||
return 0;
|
||||
}
|
||||
#else
|
||||
static inline int cm_t3517_init_usbh(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_MTD_NAND_OMAP2) || defined(CONFIG_MTD_NAND_OMAP2_MODULE)
|
||||
#define NAND_BLOCK_SIZE SZ_128K
|
||||
|
||||
static struct mtd_partition cm_t3517_nand_partitions[] = {
|
||||
{
|
||||
.name = "xloader",
|
||||
.offset = 0, /* Offset = 0x00000 */
|
||||
.size = 4 * NAND_BLOCK_SIZE,
|
||||
.mask_flags = MTD_WRITEABLE
|
||||
},
|
||||
{
|
||||
.name = "uboot",
|
||||
.offset = MTDPART_OFS_APPEND, /* Offset = 0x80000 */
|
||||
.size = 15 * NAND_BLOCK_SIZE,
|
||||
},
|
||||
{
|
||||
.name = "uboot environment",
|
||||
.offset = MTDPART_OFS_APPEND, /* Offset = 0x260000 */
|
||||
.size = 2 * NAND_BLOCK_SIZE,
|
||||
},
|
||||
{
|
||||
.name = "linux",
|
||||
.offset = MTDPART_OFS_APPEND, /* Offset = 0x280000 */
|
||||
.size = 32 * NAND_BLOCK_SIZE,
|
||||
},
|
||||
{
|
||||
.name = "rootfs",
|
||||
.offset = MTDPART_OFS_APPEND, /* Offset = 0x680000 */
|
||||
.size = MTDPART_SIZ_FULL,
|
||||
},
|
||||
};
|
||||
|
||||
static struct omap_nand_platform_data cm_t3517_nand_data = {
|
||||
.parts = cm_t3517_nand_partitions,
|
||||
.nr_parts = ARRAY_SIZE(cm_t3517_nand_partitions),
|
||||
.dma_channel = -1, /* disable DMA in OMAP NAND driver */
|
||||
.cs = 0,
|
||||
};
|
||||
|
||||
static void __init cm_t3517_init_nand(void)
|
||||
{
|
||||
if (gpmc_nand_init(&cm_t3517_nand_data) < 0)
|
||||
pr_err("CM-T3517: NAND initialization failed\n");
|
||||
}
|
||||
#else
|
||||
static inline void cm_t3517_init_nand(void) {}
|
||||
#endif
|
||||
|
||||
static struct omap_board_config_kernel cm_t3517_config[] __initdata = {
|
||||
};
|
||||
|
||||
static void __init cm_t3517_init_irq(void)
|
||||
{
|
||||
omap_board_config = cm_t3517_config;
|
||||
omap_board_config_size = ARRAY_SIZE(cm_t3517_config);
|
||||
|
||||
omap2_init_common_hw(NULL, NULL);
|
||||
omap_init_irq();
|
||||
omap_gpio_init();
|
||||
}
|
||||
|
||||
static struct omap_board_mux board_mux[] __initdata = {
|
||||
/* GPIO186 - Green LED */
|
||||
OMAP3_MUX(SYS_CLKOUT2, OMAP_MUX_MODE4 | OMAP_PIN_OUTPUT),
|
||||
/* RTC GPIOs: IO, WR#, RD#, CS# */
|
||||
OMAP3_MUX(MCBSP4_DR, OMAP_MUX_MODE4 | OMAP_PIN_INPUT),
|
||||
OMAP3_MUX(MCBSP4_DX, OMAP_MUX_MODE4 | OMAP_PIN_INPUT),
|
||||
OMAP3_MUX(MCBSP_CLKS, OMAP_MUX_MODE4 | OMAP_PIN_INPUT),
|
||||
OMAP3_MUX(UART3_CTS_RCTX, OMAP_MUX_MODE4 | OMAP_PIN_INPUT),
|
||||
/* HSUSB1 RESET */
|
||||
OMAP3_MUX(UART2_TX, OMAP_MUX_MODE4 | OMAP_PIN_OUTPUT),
|
||||
/* HSUSB2 RESET */
|
||||
OMAP3_MUX(UART2_RX, OMAP_MUX_MODE4 | OMAP_PIN_OUTPUT),
|
||||
/* CM-T3517 USB HUB nRESET */
|
||||
OMAP3_MUX(MCBSP4_CLKX, OMAP_MUX_MODE4 | OMAP_PIN_OUTPUT),
|
||||
|
||||
{ .reg_offset = OMAP_MUX_TERMINATOR },
|
||||
};
|
||||
|
||||
static void __init cm_t3517_init(void)
|
||||
{
|
||||
omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);
|
||||
omap_serial_init();
|
||||
cm_t3517_init_leds();
|
||||
cm_t3517_init_nand();
|
||||
cm_t3517_init_rtc();
|
||||
cm_t3517_init_usbh();
|
||||
cm_t3517_init_hecc();
|
||||
}
|
||||
|
||||
MACHINE_START(CM_T3517, "Compulab CM-T3517")
|
||||
.boot_params = 0x80000100,
|
||||
.map_io = omap3_map_io,
|
||||
.reserve = omap_reserve,
|
||||
.init_irq = cm_t3517_init_irq,
|
||||
.init_machine = cm_t3517_init,
|
||||
.timer = &omap_timer,
|
||||
MACHINE_END
|
@ -28,6 +28,7 @@
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
#include <linux/mtd/nand.h>
|
||||
#include <linux/mmc/host.h>
|
||||
|
||||
#include <linux/regulator/machine.h>
|
||||
#include <linux/i2c/twl.h>
|
||||
@ -44,7 +45,6 @@
|
||||
#include <plat/gpmc.h>
|
||||
#include <plat/nand.h>
|
||||
#include <plat/usb.h>
|
||||
#include <plat/timer-gp.h>
|
||||
#include <plat/display.h>
|
||||
|
||||
#include <plat/mcspi.h>
|
||||
@ -58,6 +58,7 @@
|
||||
|
||||
#include "mux.h"
|
||||
#include "hsmmc.h"
|
||||
#include "timer-gp.h"
|
||||
|
||||
#define NAND_BLOCK_SIZE SZ_128K
|
||||
|
||||
@ -105,7 +106,7 @@ static struct omap_nand_platform_data devkit8000_nand_data = {
|
||||
static struct omap2_hsmmc_info mmc[] = {
|
||||
{
|
||||
.mmc = 1,
|
||||
.wires = 8,
|
||||
.caps = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA,
|
||||
.gpio_wp = 29,
|
||||
},
|
||||
{} /* Terminator */
|
||||
@ -198,7 +199,7 @@ static struct platform_device devkit8000_dss_device = {
|
||||
static struct regulator_consumer_supply devkit8000_vdda_dac_supply =
|
||||
REGULATOR_SUPPLY("vdda_dac", "omapdss");
|
||||
|
||||
static int board_keymap[] = {
|
||||
static uint32_t board_keymap[] = {
|
||||
KEY(0, 0, KEY_1),
|
||||
KEY(1, 0, KEY_2),
|
||||
KEY(2, 0, KEY_3),
|
||||
|
@ -21,7 +21,8 @@
|
||||
#include <plat/nand.h>
|
||||
#include <plat/onenand.h>
|
||||
#include <plat/tc.h>
|
||||
#include <mach/board-flash.h>
|
||||
|
||||
#include "board-flash.h"
|
||||
|
||||
#define REG_FPGA_REV 0x10
|
||||
#define REG_FPGA_DIP_SWITCH_INPUT2 0x60
|
||||
|
@ -26,3 +26,5 @@ struct flash_partitions {
|
||||
|
||||
extern void board_flash_init(struct flash_partitions [],
|
||||
char chip_sel[][GPMC_CS_NUM]);
|
||||
extern void board_nand_init(struct mtd_partition *nand_parts,
|
||||
u8 nr_parts, u8 cs);
|
@ -48,10 +48,22 @@ static void __init omap_generic_init(void)
|
||||
|
||||
static void __init omap_generic_map_io(void)
|
||||
{
|
||||
omap2_set_globals_242x(); /* should be 242x, 243x, or 343x */
|
||||
omap242x_map_common_io();
|
||||
if (cpu_is_omap242x()) {
|
||||
omap2_set_globals_242x();
|
||||
omap242x_map_common_io();
|
||||
} else if (cpu_is_omap243x()) {
|
||||
omap2_set_globals_243x();
|
||||
omap243x_map_common_io();
|
||||
} else if (cpu_is_omap34xx()) {
|
||||
omap2_set_globals_3xxx();
|
||||
omap34xx_map_common_io();
|
||||
} else if (cpu_is_omap44xx()) {
|
||||
omap2_set_globals_443x();
|
||||
omap44xx_map_common_io();
|
||||
}
|
||||
}
|
||||
|
||||
/* XXX This machine entry name should be updated */
|
||||
MACHINE_START(OMAP_GENERIC, "Generic OMAP24xx")
|
||||
/* Maintainer: Paul Mundt <paul.mundt@nokia.com> */
|
||||
.boot_params = 0x80000100,
|
||||
|
@ -31,7 +31,6 @@
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/map.h>
|
||||
|
||||
#include <plat/control.h>
|
||||
#include <mach/gpio.h>
|
||||
#include <plat/usb.h>
|
||||
#include <plat/board.h>
|
||||
@ -42,6 +41,7 @@
|
||||
#include <plat/gpmc.h>
|
||||
|
||||
#include "mux.h"
|
||||
#include "control.h"
|
||||
|
||||
#define H4_FLASH_CS 0
|
||||
#define H4_SMC91X_CS 1
|
||||
|
@ -20,6 +20,7 @@
|
||||
|
||||
#include <linux/regulator/machine.h>
|
||||
#include <linux/i2c/twl.h>
|
||||
#include <linux/mmc/host.h>
|
||||
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/mach/arch.h>
|
||||
@ -38,12 +39,61 @@
|
||||
#define IGEP2_SMSC911X_CS 5
|
||||
#define IGEP2_SMSC911X_GPIO 176
|
||||
#define IGEP2_GPIO_USBH_NRESET 24
|
||||
#define IGEP2_GPIO_LED0_GREEN 26
|
||||
#define IGEP2_GPIO_LED0_RED 27
|
||||
#define IGEP2_GPIO_LED1_RED 28
|
||||
#define IGEP2_GPIO_DVI_PUP 170
|
||||
#define IGEP2_GPIO_WIFI_NPD 94
|
||||
#define IGEP2_GPIO_WIFI_NRESET 95
|
||||
#define IGEP2_GPIO_LED0_GREEN 26
|
||||
#define IGEP2_GPIO_LED0_RED 27
|
||||
#define IGEP2_GPIO_LED1_RED 28
|
||||
#define IGEP2_GPIO_DVI_PUP 170
|
||||
|
||||
#define IGEP2_RB_GPIO_WIFI_NPD 94
|
||||
#define IGEP2_RB_GPIO_WIFI_NRESET 95
|
||||
#define IGEP2_RB_GPIO_BT_NRESET 137
|
||||
#define IGEP2_RC_GPIO_WIFI_NPD 138
|
||||
#define IGEP2_RC_GPIO_WIFI_NRESET 139
|
||||
#define IGEP2_RC_GPIO_BT_NRESET 137
|
||||
|
||||
/*
|
||||
* IGEP2 Hardware Revision Table
|
||||
*
|
||||
* --------------------------------------------------------------------------
|
||||
* | Id. | Hw Rev. | HW0 (28) | WIFI_NPD | WIFI_NRESET | BT_NRESET |
|
||||
* --------------------------------------------------------------------------
|
||||
* | 0 | B | high | gpio94 | gpio95 | - |
|
||||
* | 0 | B/C (B-compatible) | high | gpio94 | gpio95 | gpio137 |
|
||||
* | 1 | C | low | gpio138 | gpio139 | gpio137 |
|
||||
* --------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#define IGEP2_BOARD_HWREV_B 0
|
||||
#define IGEP2_BOARD_HWREV_C 1
|
||||
|
||||
static u8 hwrev;
|
||||
|
||||
static void __init igep2_get_revision(void)
|
||||
{
|
||||
u8 ret;
|
||||
|
||||
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 {
|
||||
pr_warning("IGEP2: Could not obtain gpio GPIO_HW0_REV\n");
|
||||
pr_err("IGEP2: Unknown Hardware Revision\n");
|
||||
}
|
||||
|
||||
gpio_free(IGEP2_GPIO_LED1_RED);
|
||||
}
|
||||
|
||||
#if defined(CONFIG_MTD_ONENAND_OMAP2) || \
|
||||
defined(CONFIG_MTD_ONENAND_OMAP2_MODULE)
|
||||
@ -107,7 +157,7 @@ static struct platform_device igep2_onenand_device = {
|
||||
},
|
||||
};
|
||||
|
||||
void __init igep2_flash_init(void)
|
||||
static void __init igep2_flash_init(void)
|
||||
{
|
||||
u8 cs = 0;
|
||||
u8 onenandcs = GPMC_CS_NUM + 1;
|
||||
@ -141,7 +191,7 @@ void __init igep2_flash_init(void)
|
||||
}
|
||||
|
||||
#else
|
||||
void __init igep2_flash_init(void) {}
|
||||
static void __init igep2_flash_init(void) {}
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE)
|
||||
@ -211,10 +261,6 @@ static struct regulator_consumer_supply igep2_vmmc1_supply = {
|
||||
.supply = "vmmc",
|
||||
};
|
||||
|
||||
static struct regulator_consumer_supply igep2_vmmc2_supply = {
|
||||
.supply = "vmmc",
|
||||
};
|
||||
|
||||
/* VMMC1 for OMAP VDD_MMC1 (i/o) and MMC1 card */
|
||||
static struct regulator_init_data igep2_vmmc1 = {
|
||||
.constraints = {
|
||||
@ -230,37 +276,95 @@ static struct regulator_init_data igep2_vmmc1 = {
|
||||
.consumer_supplies = &igep2_vmmc1_supply,
|
||||
};
|
||||
|
||||
/* VMMC2 for OMAP VDD_MMC2 (i/o) and MMC2 WIFI */
|
||||
static struct regulator_init_data igep2_vmmc2 = {
|
||||
.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 = &igep2_vmmc2_supply,
|
||||
};
|
||||
|
||||
static struct omap2_hsmmc_info mmc[] = {
|
||||
{
|
||||
.mmc = 1,
|
||||
.wires = 4,
|
||||
.caps = MMC_CAP_4_BIT_DATA,
|
||||
.gpio_cd = -EINVAL,
|
||||
.gpio_wp = -EINVAL,
|
||||
},
|
||||
#if defined(CONFIG_LIBERTAS_SDIO) || defined(CONFIG_LIBERTAS_SDIO_MODULE)
|
||||
{
|
||||
.mmc = 2,
|
||||
.wires = 4,
|
||||
.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 igep2_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] = {
|
||||
.name = "gpio-led:green:d1",
|
||||
.default_trigger = "heartbeat",
|
||||
.gpio = -EINVAL, /* gets replaced */
|
||||
},
|
||||
};
|
||||
|
||||
static struct gpio_led_platform_data igep2_led_pdata = {
|
||||
.leds = igep2_gpio_leds,
|
||||
.num_leds = ARRAY_SIZE(igep2_gpio_leds),
|
||||
};
|
||||
|
||||
static struct platform_device igep2_led_device = {
|
||||
.name = "leds-gpio",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &igep2_led_pdata,
|
||||
},
|
||||
};
|
||||
|
||||
static void __init igep2_leds_init(void)
|
||||
{
|
||||
platform_device_register(&igep2_led_device);
|
||||
}
|
||||
|
||||
#else
|
||||
static inline void igep2_leds_init(void)
|
||||
{
|
||||
if ((gpio_request(IGEP2_GPIO_LED0_RED, "gpio-led:red:d0") == 0) &&
|
||||
(gpio_direction_output(IGEP2_GPIO_LED0_RED, 1) == 0)) {
|
||||
gpio_export(IGEP2_GPIO_LED0_RED, 0);
|
||||
gpio_set_value(IGEP2_GPIO_LED0_RED, 0);
|
||||
} else
|
||||
pr_warning("IGEP v2: Could not obtain gpio GPIO_LED0_RED\n");
|
||||
|
||||
if ((gpio_request(IGEP2_GPIO_LED0_GREEN, "gpio-led:green:d0") == 0) &&
|
||||
(gpio_direction_output(IGEP2_GPIO_LED0_GREEN, 1) == 0)) {
|
||||
gpio_export(IGEP2_GPIO_LED0_GREEN, 0);
|
||||
gpio_set_value(IGEP2_GPIO_LED0_GREEN, 0);
|
||||
} else
|
||||
pr_warning("IGEP v2: Could not obtain gpio GPIO_LED0_GREEN\n");
|
||||
|
||||
if ((gpio_request(IGEP2_GPIO_LED1_RED, "gpio-led:red:d1") == 0) &&
|
||||
(gpio_direction_output(IGEP2_GPIO_LED1_RED, 1) == 0)) {
|
||||
gpio_export(IGEP2_GPIO_LED1_RED, 0);
|
||||
gpio_set_value(IGEP2_GPIO_LED1_RED, 0);
|
||||
} else
|
||||
pr_warning("IGEP v2: Could not obtain gpio GPIO_LED1_RED\n");
|
||||
|
||||
}
|
||||
#endif
|
||||
|
||||
static int igep2_twl_gpio_setup(struct device *dev,
|
||||
unsigned gpio, unsigned ngpio)
|
||||
{
|
||||
@ -268,20 +372,48 @@ static int igep2_twl_gpio_setup(struct device *dev,
|
||||
mmc[0].gpio_cd = gpio + 0;
|
||||
omap2_hsmmc_init(mmc);
|
||||
|
||||
/* link regulators to MMC adapters ... we "know" the
|
||||
/*
|
||||
* link regulators to MMC adapters ... we "know" the
|
||||
* regulators will be set up only *after* we return.
|
||||
*/
|
||||
*/
|
||||
igep2_vmmc1_supply.dev = mmc[0].dev;
|
||||
igep2_vmmc2_supply.dev = mmc[1].dev;
|
||||
|
||||
/*
|
||||
* REVISIT: need ehci-omap hooks for external VBUS
|
||||
* power switch and overcurrent detect
|
||||
*/
|
||||
if ((gpio_request(gpio + 1, "GPIO_EHCI_NOC") < 0) ||
|
||||
(gpio_direction_input(gpio + 1) < 0))
|
||||
pr_err("IGEP2: Could not obtain gpio for EHCI NOC");
|
||||
|
||||
/*
|
||||
* TWL4030_GPIO_MAX + 0 == ledA, GPIO_USBH_CPEN
|
||||
* (out, active low)
|
||||
*/
|
||||
if ((gpio_request(gpio + TWL4030_GPIO_MAX, "GPIO_USBH_CPEN") < 0) ||
|
||||
(gpio_direction_output(gpio + TWL4030_GPIO_MAX, 0) < 0))
|
||||
pr_err("IGEP2: Could not obtain gpio for USBH_CPEN");
|
||||
|
||||
/* TWL4030_GPIO_MAX + 1 == ledB (out, active low LED) */
|
||||
#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("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_gpio_data = {
|
||||
static struct twl4030_gpio_platform_data igep2_twl4030_gpio_pdata = {
|
||||
.gpio_base = OMAP_MAX_GPIO_LINES,
|
||||
.irq_base = TWL4030_GPIO_IRQ_BASE,
|
||||
.irq_end = TWL4030_GPIO_IRQ_END,
|
||||
.use_leds = false,
|
||||
.use_leds = true,
|
||||
.setup = igep2_twl_gpio_setup,
|
||||
};
|
||||
|
||||
@ -355,47 +487,6 @@ static void __init igep2_display_init(void)
|
||||
pr_err("IGEP v2: Could not obtain gpio GPIO_DVI_PUP\n");
|
||||
}
|
||||
|
||||
#if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE)
|
||||
#include <linux/leds.h>
|
||||
|
||||
static struct gpio_led igep2_gpio_leds[] = {
|
||||
{
|
||||
.name = "led0:red",
|
||||
.gpio = IGEP2_GPIO_LED0_RED,
|
||||
},
|
||||
{
|
||||
.name = "led0:green",
|
||||
.default_trigger = "heartbeat",
|
||||
.gpio = IGEP2_GPIO_LED0_GREEN,
|
||||
},
|
||||
{
|
||||
.name = "led1:red",
|
||||
.gpio = IGEP2_GPIO_LED1_RED,
|
||||
},
|
||||
};
|
||||
|
||||
static struct gpio_led_platform_data igep2_led_pdata = {
|
||||
.leds = igep2_gpio_leds,
|
||||
.num_leds = ARRAY_SIZE(igep2_gpio_leds),
|
||||
};
|
||||
|
||||
static struct platform_device igep2_led_device = {
|
||||
.name = "leds-gpio",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &igep2_led_pdata,
|
||||
},
|
||||
};
|
||||
|
||||
static void __init igep2_init_led(void)
|
||||
{
|
||||
platform_device_register(&igep2_led_device);
|
||||
}
|
||||
|
||||
#else
|
||||
static inline void igep2_init_led(void) {}
|
||||
#endif
|
||||
|
||||
static struct platform_device *igep2_devices[] __initdata = {
|
||||
&igep2_dss_device,
|
||||
};
|
||||
@ -425,14 +516,13 @@ static struct twl4030_platform_data igep2_twldata = {
|
||||
/* platform_data for children goes here */
|
||||
.usb = &igep2_usb_data,
|
||||
.codec = &igep2_codec_data,
|
||||
.gpio = &igep2_gpio_data,
|
||||
.gpio = &igep2_twl4030_gpio_pdata,
|
||||
.vmmc1 = &igep2_vmmc1,
|
||||
.vmmc2 = &igep2_vmmc2,
|
||||
.vpll2 = &igep2_vpll2,
|
||||
|
||||
};
|
||||
|
||||
static struct i2c_board_info __initdata igep2_i2c_boardinfo[] = {
|
||||
static struct i2c_board_info __initdata igep2_i2c1_boardinfo[] = {
|
||||
{
|
||||
I2C_BOARD_INFO("twl4030", 0x48),
|
||||
.flags = I2C_CLIENT_WAKE,
|
||||
@ -441,14 +531,29 @@ static struct i2c_board_info __initdata igep2_i2c_boardinfo[] = {
|
||||
},
|
||||
};
|
||||
|
||||
static int __init igep2_i2c_init(void)
|
||||
static struct i2c_board_info __initdata igep2_i2c3_boardinfo[] = {
|
||||
{
|
||||
I2C_BOARD_INFO("eeprom", 0x50),
|
||||
},
|
||||
};
|
||||
|
||||
static void __init igep2_i2c_init(void)
|
||||
{
|
||||
omap_register_i2c_bus(1, 2600, igep2_i2c_boardinfo,
|
||||
ARRAY_SIZE(igep2_i2c_boardinfo));
|
||||
/* 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, NULL, 0);
|
||||
return 0;
|
||||
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);
|
||||
|
||||
/*
|
||||
* Bus 3 is attached to the DVI port where devices like the pico DLP
|
||||
* projector don't work reliably with 400kHz
|
||||
*/
|
||||
ret = omap_register_i2c_bus(3, 100, igep2_i2c3_boardinfo,
|
||||
ARRAY_SIZE(igep2_i2c3_boardinfo));
|
||||
if (ret)
|
||||
pr_warning("IGEP2: Could not register I2C3 bus (%d)\n", ret);
|
||||
}
|
||||
|
||||
static struct omap_musb_board_data musb_board_data = {
|
||||
@ -476,9 +581,57 @@ static struct omap_board_mux board_mux[] __initdata = {
|
||||
#define board_mux NULL
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_LIBERTAS_SDIO) || defined(CONFIG_LIBERTAS_SDIO_MODULE)
|
||||
|
||||
static void __init igep2_wlan_bt_init(void)
|
||||
{
|
||||
unsigned npd, wreset, btreset;
|
||||
|
||||
/* 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;
|
||||
} 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");
|
||||
|
||||
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");
|
||||
|
||||
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) { }
|
||||
#endif
|
||||
|
||||
static void __init igep2_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_serial_init();
|
||||
@ -486,50 +639,16 @@ static void __init igep2_init(void)
|
||||
usb_ehci_init(&ehci_pdata);
|
||||
|
||||
igep2_flash_init();
|
||||
igep2_init_led();
|
||||
igep2_leds_init();
|
||||
igep2_display_init();
|
||||
igep2_init_smsc911x();
|
||||
|
||||
/* GPIO userspace leds */
|
||||
#if !defined(CONFIG_LEDS_GPIO) && !defined(CONFIG_LEDS_GPIO_MODULE)
|
||||
if ((gpio_request(IGEP2_GPIO_LED0_RED, "led0:red") == 0) &&
|
||||
(gpio_direction_output(IGEP2_GPIO_LED0_RED, 1) == 0)) {
|
||||
gpio_export(IGEP2_GPIO_LED0_RED, 0);
|
||||
gpio_set_value(IGEP2_GPIO_LED0_RED, 0);
|
||||
} else
|
||||
pr_warning("IGEP v2: Could not obtain gpio GPIO_LED0_RED\n");
|
||||
/*
|
||||
* WLAN-BT combo module from MuRata wich has a Marvell WLAN
|
||||
* (88W8686) + CSR Bluetooth chipset. Uses SDIO interface.
|
||||
*/
|
||||
igep2_wlan_bt_init();
|
||||
|
||||
if ((gpio_request(IGEP2_GPIO_LED0_GREEN, "led0:green") == 0) &&
|
||||
(gpio_direction_output(IGEP2_GPIO_LED0_GREEN, 1) == 0)) {
|
||||
gpio_export(IGEP2_GPIO_LED0_GREEN, 0);
|
||||
gpio_set_value(IGEP2_GPIO_LED0_GREEN, 0);
|
||||
} else
|
||||
pr_warning("IGEP v2: Could not obtain gpio GPIO_LED0_GREEN\n");
|
||||
|
||||
if ((gpio_request(IGEP2_GPIO_LED1_RED, "led1:red") == 0) &&
|
||||
(gpio_direction_output(IGEP2_GPIO_LED1_RED, 1) == 0)) {
|
||||
gpio_export(IGEP2_GPIO_LED1_RED, 0);
|
||||
gpio_set_value(IGEP2_GPIO_LED1_RED, 0);
|
||||
} else
|
||||
pr_warning("IGEP v2: Could not obtain gpio GPIO_LED1_RED\n");
|
||||
#endif
|
||||
|
||||
/* GPIO W-LAN + Bluetooth combo module */
|
||||
if ((gpio_request(IGEP2_GPIO_WIFI_NPD, "GPIO_WIFI_NPD") == 0) &&
|
||||
(gpio_direction_output(IGEP2_GPIO_WIFI_NPD, 1) == 0)) {
|
||||
gpio_export(IGEP2_GPIO_WIFI_NPD, 0);
|
||||
/* gpio_set_value(IGEP2_GPIO_WIFI_NPD, 0); */
|
||||
} else
|
||||
pr_warning("IGEP v2: Could not obtain gpio GPIO_WIFI_NPD\n");
|
||||
|
||||
if ((gpio_request(IGEP2_GPIO_WIFI_NRESET, "GPIO_WIFI_NRESET") == 0) &&
|
||||
(gpio_direction_output(IGEP2_GPIO_WIFI_NRESET, 1) == 0)) {
|
||||
gpio_export(IGEP2_GPIO_WIFI_NRESET, 0);
|
||||
gpio_set_value(IGEP2_GPIO_WIFI_NRESET, 0);
|
||||
udelay(10);
|
||||
gpio_set_value(IGEP2_GPIO_WIFI_NRESET, 1);
|
||||
} else
|
||||
pr_warning("IGEP v2: Could not obtain gpio GPIO_WIFI_NRESET\n");
|
||||
}
|
||||
|
||||
MACHINE_START(IGEP0020, "IGEP v2 board")
|
||||
|
400
arch/arm/mach-omap2/board-igep0030.c
Normal file
400
arch/arm/mach-omap2/board-igep0030.c
Normal file
@ -0,0 +1,400 @@
|
||||
/*
|
||||
* 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/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 115
|
||||
|
||||
|
||||
#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,
|
||||
},
|
||||
};
|
||||
|
||||
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
|
||||
void __init igep3_flash_init(void) {}
|
||||
#endif
|
||||
|
||||
static struct regulator_consumer_supply igep3_vmmc1_supply = {
|
||||
.supply = "vmmc",
|
||||
};
|
||||
|
||||
/* 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 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);
|
||||
|
||||
/*
|
||||
* link regulators to MMC adapters ... we "know" the
|
||||
* regulators will be set up only *after* we return.
|
||||
*/
|
||||
igep3_vmmc1_supply.dev = mmc[0].dev;
|
||||
|
||||
/* 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 void __init igep3_init_irq(void)
|
||||
{
|
||||
omap2_init_common_hw(m65kxxxxam_sdrc_params, m65kxxxxam_sdrc_params);
|
||||
omap_init_irq();
|
||||
omap_gpio_init();
|
||||
}
|
||||
|
||||
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,
|
||||
};
|
||||
|
||||
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
|
||||
|
||||
#ifdef CONFIG_OMAP_MUX
|
||||
static struct omap_board_mux board_mux[] __initdata = {
|
||||
{ .reg_offset = OMAP_MUX_TERMINATOR },
|
||||
};
|
||||
#else
|
||||
#define board_mux NULL
|
||||
#endif
|
||||
|
||||
static void __init igep3_init(void)
|
||||
{
|
||||
omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);
|
||||
|
||||
/* Register I2C busses and drivers */
|
||||
igep3_i2c_init();
|
||||
|
||||
omap_serial_init();
|
||||
usb_musb_init(&musb_board_data);
|
||||
|
||||
igep3_flash_init();
|
||||
igep3_leds_init();
|
||||
|
||||
/*
|
||||
* WLAN-BT combo module from MuRata wich has a Marvell WLAN
|
||||
* (88W8686) + CSR Bluetooth chipset. Uses SDIO interface.
|
||||
*/
|
||||
igep3_wifi_bt_init();
|
||||
|
||||
}
|
||||
|
||||
MACHINE_START(IGEP0030, "IGEP OMAP3 module")
|
||||
.boot_params = 0x80000100,
|
||||
.map_io = omap3_map_io,
|
||||
.init_irq = igep3_init_irq,
|
||||
.init_machine = igep3_init,
|
||||
.timer = &omap_timer,
|
||||
MACHINE_END
|
@ -27,6 +27,7 @@
|
||||
#include <linux/i2c/twl.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/smsc911x.h>
|
||||
#include <linux/mmc/host.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <asm/mach-types.h>
|
||||
@ -41,11 +42,12 @@
|
||||
#include <mach/board-zoom.h>
|
||||
|
||||
#include <asm/delay.h>
|
||||
#include <plat/control.h>
|
||||
#include <plat/usb.h>
|
||||
|
||||
#include "board-flash.h"
|
||||
#include "mux.h"
|
||||
#include "hsmmc.h"
|
||||
#include "control.h"
|
||||
|
||||
#define LDP_SMSC911X_CS 1
|
||||
#define LDP_SMSC911X_GPIO 152
|
||||
@ -82,7 +84,7 @@ static struct platform_device ldp_smsc911x_device = {
|
||||
},
|
||||
};
|
||||
|
||||
static int board_keymap[] = {
|
||||
static uint32_t board_keymap[] = {
|
||||
KEY(0, 0, KEY_1),
|
||||
KEY(1, 0, KEY_2),
|
||||
KEY(2, 0, KEY_3),
|
||||
@ -362,7 +364,7 @@ static int __init omap_i2c_init(void)
|
||||
static struct omap2_hsmmc_info mmc[] __initdata = {
|
||||
{
|
||||
.mmc = 1,
|
||||
.wires = 4,
|
||||
.caps = MMC_CAP_4_BIT_DATA,
|
||||
.gpio_cd = -EINVAL,
|
||||
.gpio_wp = -EINVAL,
|
||||
},
|
||||
|
@ -20,6 +20,7 @@
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/spi/spi.h>
|
||||
#include <linux/usb/musb.h>
|
||||
#include <sound/tlv320aic3x.h>
|
||||
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach-types.h>
|
||||
@ -383,15 +384,6 @@ static void n8x0_mmc_callback(void *data, u8 card_mask)
|
||||
omap_mmc_notify_cover_event(mmc_device, index, *openp);
|
||||
}
|
||||
|
||||
void n8x0_mmc_slot1_cover_handler(void *arg, int closed_state)
|
||||
{
|
||||
if (mmc_device == NULL)
|
||||
return;
|
||||
|
||||
slot1_cover_open = !closed_state;
|
||||
omap_mmc_notify_cover_event(mmc_device, 0, closed_state);
|
||||
}
|
||||
|
||||
static int n8x0_mmc_late_init(struct device *dev)
|
||||
{
|
||||
int r, bit, *openp;
|
||||
@ -511,7 +503,7 @@ static struct omap_mmc_platform_data mmc1_data = {
|
||||
|
||||
static struct omap_mmc_platform_data *mmc_data[OMAP24XX_NR_MMC];
|
||||
|
||||
void __init n8x0_mmc_init(void)
|
||||
static void __init n8x0_mmc_init(void)
|
||||
|
||||
{
|
||||
int err;
|
||||
@ -560,11 +552,6 @@ void __init n8x0_mmc_init(void)
|
||||
void __init n8x0_mmc_init(void)
|
||||
{
|
||||
}
|
||||
|
||||
void n8x0_mmc_slot1_cover_handler(void *arg, int state)
|
||||
{
|
||||
}
|
||||
|
||||
#endif /* CONFIG_MMC_OMAP */
|
||||
|
||||
#ifdef CONFIG_MENELAUS
|
||||
@ -614,29 +601,35 @@ static int n8x0_menelaus_late_init(struct device *dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct i2c_board_info __initdata n8x0_i2c_board_info_1[] = {
|
||||
{
|
||||
I2C_BOARD_INFO("menelaus", 0x72),
|
||||
.irq = INT_24XX_SYS_NIRQ,
|
||||
},
|
||||
};
|
||||
#else
|
||||
static int n8x0_menelaus_late_init(struct device *dev)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
static struct menelaus_platform_data n8x0_menelaus_platform_data = {
|
||||
static struct menelaus_platform_data n8x0_menelaus_platform_data __initdata = {
|
||||
.late_init = n8x0_menelaus_late_init,
|
||||
};
|
||||
|
||||
static void __init n8x0_menelaus_init(void)
|
||||
{
|
||||
n8x0_i2c_board_info_1[0].platform_data = &n8x0_menelaus_platform_data;
|
||||
omap_register_i2c_bus(1, 400, n8x0_i2c_board_info_1,
|
||||
ARRAY_SIZE(n8x0_i2c_board_info_1));
|
||||
}
|
||||
static struct i2c_board_info __initdata n8x0_i2c_board_info_1[] __initdata = {
|
||||
{
|
||||
I2C_BOARD_INFO("menelaus", 0x72),
|
||||
.irq = INT_24XX_SYS_NIRQ,
|
||||
.platform_data = &n8x0_menelaus_platform_data,
|
||||
},
|
||||
};
|
||||
|
||||
#else
|
||||
static inline void __init n8x0_menelaus_init(void)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
static struct aic3x_pdata n810_aic33_data __initdata = {
|
||||
.gpio_reset = 118,
|
||||
};
|
||||
|
||||
static struct i2c_board_info n810_i2c_board_info_2[] __initdata = {
|
||||
{
|
||||
I2C_BOARD_INFO("tlv320aic3x", 0x18),
|
||||
.platform_data = &n810_aic33_data,
|
||||
},
|
||||
};
|
||||
|
||||
static void __init n8x0_map_io(void)
|
||||
{
|
||||
@ -653,6 +646,11 @@ static void __init n8x0_init_irq(void)
|
||||
|
||||
#ifdef CONFIG_OMAP_MUX
|
||||
static struct omap_board_mux board_mux[] __initdata = {
|
||||
/* I2S codec port pins for McBSP block */
|
||||
OMAP2420_MUX(EAC_AC_SCLK, OMAP_MUX_MODE1 | OMAP_PIN_INPUT),
|
||||
OMAP2420_MUX(EAC_AC_FS, OMAP_MUX_MODE1 | OMAP_PIN_INPUT),
|
||||
OMAP2420_MUX(EAC_AC_DIN, OMAP_MUX_MODE1 | OMAP_PIN_INPUT),
|
||||
OMAP2420_MUX(EAC_AC_DOUT, OMAP_MUX_MODE1 | OMAP_PIN_OUTPUT),
|
||||
{ .reg_offset = OMAP_MUX_TERMINATOR },
|
||||
};
|
||||
#else
|
||||
@ -665,9 +663,14 @@ static void __init n8x0_init_machine(void)
|
||||
/* FIXME: add n810 spi devices */
|
||||
spi_register_board_info(n800_spi_board_info,
|
||||
ARRAY_SIZE(n800_spi_board_info));
|
||||
omap_register_i2c_bus(1, 400, n8x0_i2c_board_info_1,
|
||||
ARRAY_SIZE(n8x0_i2c_board_info_1));
|
||||
omap_register_i2c_bus(2, 400, NULL, 0);
|
||||
if (machine_is_nokia_n810())
|
||||
i2c_register_board_info(2, n810_i2c_board_info_2,
|
||||
ARRAY_SIZE(n810_i2c_board_info_2));
|
||||
|
||||
omap_serial_init();
|
||||
n8x0_menelaus_init();
|
||||
n8x0_onenand_init();
|
||||
n8x0_mmc_init();
|
||||
n8x0_usb_init();
|
||||
|
@ -27,6 +27,7 @@
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
#include <linux/mtd/nand.h>
|
||||
#include <linux/mmc/host.h>
|
||||
|
||||
#include <linux/regulator/machine.h>
|
||||
#include <linux/i2c/twl.h>
|
||||
@ -43,13 +44,100 @@
|
||||
#include <plat/gpmc.h>
|
||||
#include <plat/nand.h>
|
||||
#include <plat/usb.h>
|
||||
#include <plat/timer-gp.h>
|
||||
|
||||
#include "mux.h"
|
||||
#include "hsmmc.h"
|
||||
#include "timer-gp.h"
|
||||
|
||||
#define NAND_BLOCK_SIZE SZ_128K
|
||||
|
||||
/*
|
||||
* OMAP3 Beagle revision
|
||||
* Run time detection of Beagle revision is done by reading GPIO.
|
||||
* GPIO ID -
|
||||
* AXBX = GPIO173, GPIO172, GPIO171: 1 1 1
|
||||
* C1_3 = GPIO173, GPIO172, GPIO171: 1 1 0
|
||||
* C4 = GPIO173, GPIO172, GPIO171: 1 0 1
|
||||
* XM = GPIO173, GPIO172, GPIO171: 0 0 0
|
||||
*/
|
||||
enum {
|
||||
OMAP3BEAGLE_BOARD_UNKN = 0,
|
||||
OMAP3BEAGLE_BOARD_AXBX,
|
||||
OMAP3BEAGLE_BOARD_C1_3,
|
||||
OMAP3BEAGLE_BOARD_C4,
|
||||
OMAP3BEAGLE_BOARD_XM,
|
||||
};
|
||||
|
||||
static u8 omap3_beagle_version;
|
||||
|
||||
static u8 omap3_beagle_get_rev(void)
|
||||
{
|
||||
return omap3_beagle_version;
|
||||
}
|
||||
|
||||
static void __init omap3_beagle_init_rev(void)
|
||||
{
|
||||
int ret;
|
||||
u16 beagle_rev = 0;
|
||||
|
||||
omap_mux_init_gpio(171, OMAP_PIN_INPUT_PULLUP);
|
||||
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);
|
||||
|
||||
beagle_rev = gpio_get_value(171) | (gpio_get_value(172) << 1)
|
||||
| (gpio_get_value(173) << 2);
|
||||
|
||||
switch (beagle_rev) {
|
||||
case 7:
|
||||
printk(KERN_INFO "OMAP3 Beagle Rev: Ax/Bx\n");
|
||||
omap3_beagle_version = OMAP3BEAGLE_BOARD_AXBX;
|
||||
break;
|
||||
case 6:
|
||||
printk(KERN_INFO "OMAP3 Beagle Rev: C1/C2/C3\n");
|
||||
omap3_beagle_version = OMAP3BEAGLE_BOARD_C1_3;
|
||||
break;
|
||||
case 5:
|
||||
printk(KERN_INFO "OMAP3 Beagle Rev: C4\n");
|
||||
omap3_beagle_version = OMAP3BEAGLE_BOARD_C4;
|
||||
break;
|
||||
case 0:
|
||||
printk(KERN_INFO "OMAP3 Beagle Rev: xM\n");
|
||||
omap3_beagle_version = OMAP3BEAGLE_BOARD_XM;
|
||||
break;
|
||||
default:
|
||||
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[] = {
|
||||
/* All the partition sizes are listed in terms of NAND block size */
|
||||
{
|
||||
@ -166,7 +254,7 @@ static void __init beagle_display_init(void)
|
||||
static struct omap2_hsmmc_info mmc[] = {
|
||||
{
|
||||
.mmc = 1,
|
||||
.wires = 8,
|
||||
.caps = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA,
|
||||
.gpio_wp = 29,
|
||||
},
|
||||
{} /* Terminator */
|
||||
@ -185,7 +273,10 @@ static struct gpio_led gpio_leds[];
|
||||
static int beagle_twl_gpio_setup(struct device *dev,
|
||||
unsigned gpio, unsigned ngpio)
|
||||
{
|
||||
if (system_rev >= 0x20 && system_rev <= 0x34301000) {
|
||||
if (omap3_beagle_get_rev() == OMAP3BEAGLE_BOARD_XM) {
|
||||
mmc[0].gpio_wp = -EINVAL;
|
||||
} else if ((omap3_beagle_get_rev() == OMAP3BEAGLE_BOARD_C1_3) ||
|
||||
(omap3_beagle_get_rev() == OMAP3BEAGLE_BOARD_C4)) {
|
||||
omap_mux_init_gpio(23, OMAP_PIN_INPUT);
|
||||
mmc[0].gpio_wp = 23;
|
||||
} else {
|
||||
@ -322,13 +413,19 @@ static struct i2c_board_info __initdata beagle_i2c_boardinfo[] = {
|
||||
},
|
||||
};
|
||||
|
||||
static struct i2c_board_info __initdata beagle_i2c_eeprom[] = {
|
||||
{
|
||||
I2C_BOARD_INFO("eeprom", 0x50),
|
||||
},
|
||||
};
|
||||
|
||||
static int __init omap3_beagle_i2c_init(void)
|
||||
{
|
||||
omap_register_i2c_bus(1, 2600, beagle_i2c_boardinfo,
|
||||
ARRAY_SIZE(beagle_i2c_boardinfo));
|
||||
/* 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, NULL, 0);
|
||||
omap_register_i2c_bus(3, 100, beagle_i2c_eeprom, ARRAY_SIZE(beagle_i2c_eeprom));
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -464,6 +561,7 @@ static struct omap_musb_board_data musb_board_data = {
|
||||
static void __init omap3_beagle_init(void)
|
||||
{
|
||||
omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);
|
||||
omap3_beagle_init_rev();
|
||||
omap3_beagle_i2c_init();
|
||||
platform_add_devices(omap3_beagle_devices,
|
||||
ARRAY_SIZE(omap3_beagle_devices));
|
||||
|
@ -31,6 +31,7 @@
|
||||
#include <linux/smsc911x.h>
|
||||
|
||||
#include <linux/regulator/machine.h>
|
||||
#include <linux/mmc/host.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <asm/mach-types.h>
|
||||
@ -370,7 +371,7 @@ static struct regulator_init_data omap3evm_vsim = {
|
||||
static struct omap2_hsmmc_info mmc[] = {
|
||||
{
|
||||
.mmc = 1,
|
||||
.wires = 4,
|
||||
.caps = MMC_CAP_4_BIT_DATA,
|
||||
.gpio_cd = -EINVAL,
|
||||
.gpio_wp = 63,
|
||||
},
|
||||
@ -446,7 +447,7 @@ static struct twl4030_usb_data omap3evm_usb_data = {
|
||||
.usb_mode = T2_USB_MODE_ULPI,
|
||||
};
|
||||
|
||||
static int board_keymap[] = {
|
||||
static uint32_t board_keymap[] = {
|
||||
KEY(0, 0, KEY_LEFT),
|
||||
KEY(0, 1, KEY_DOWN),
|
||||
KEY(0, 2, KEY_ENTER),
|
||||
@ -584,7 +585,7 @@ static int ads7846_get_pendown_state(void)
|
||||
return !gpio_get_value(OMAP3_EVM_TS_GPIO);
|
||||
}
|
||||
|
||||
struct ads7846_platform_data ads7846_config = {
|
||||
static struct ads7846_platform_data ads7846_config = {
|
||||
.x_max = 0x0fff,
|
||||
.y_max = 0x0fff,
|
||||
.x_plate_ohms = 180,
|
||||
@ -603,7 +604,7 @@ static struct omap2_mcspi_device_config ads7846_mcspi_config = {
|
||||
.single_channel = 1, /* 0: slave, 1: master */
|
||||
};
|
||||
|
||||
struct spi_board_info omap3evm_spi_board_info[] = {
|
||||
static struct spi_board_info omap3evm_spi_board_info[] = {
|
||||
[0] = {
|
||||
.modalias = "ads7846",
|
||||
.bus_num = 1,
|
||||
|
241
arch/arm/mach-omap2/board-omap3logic.c
Normal file
241
arch/arm/mach-omap2/board-omap3logic.c
Normal file
@ -0,0 +1,241 @@
|
||||
/*
|
||||
* linux/arch/arm/mach-omap2/board-omap3logic.c
|
||||
*
|
||||
* Copyright (C) 2010 Li-Pro.Net
|
||||
* Stephan Linz <linz@li-pro.net>
|
||||
*
|
||||
* Copyright (C) 2010 Logic Product Development, Inc.
|
||||
* Peter Barada <peter.barada@logicpd.com>
|
||||
*
|
||||
* Modified from Beagle, EVM, and RX51
|
||||
*
|
||||
* 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/regulator/machine.h>
|
||||
|
||||
#include <linux/i2c/twl.h>
|
||||
#include <linux/mmc/host.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/map.h>
|
||||
|
||||
#include "mux.h"
|
||||
#include "hsmmc.h"
|
||||
#include "timer-gp.h"
|
||||
#include "control.h"
|
||||
|
||||
#include <plat/mux.h>
|
||||
#include <plat/board.h>
|
||||
#include <plat/common.h>
|
||||
#include <plat/gpmc-smsc911x.h>
|
||||
#include <plat/gpmc.h>
|
||||
#include <plat/sdrc.h>
|
||||
|
||||
#define OMAP3LOGIC_SMSC911X_CS 1
|
||||
|
||||
#define OMAP3530_LV_SOM_MMC_GPIO_CD 110
|
||||
#define OMAP3530_LV_SOM_MMC_GPIO_WP 126
|
||||
#define OMAP3530_LV_SOM_SMSC911X_GPIO_IRQ 152
|
||||
|
||||
#define OMAP3_TORPEDO_MMC_GPIO_CD 127
|
||||
#define OMAP3_TORPEDO_SMSC911X_GPIO_IRQ 129
|
||||
|
||||
static struct regulator_consumer_supply omap3logic_vmmc1_supply = {
|
||||
.supply = "vmmc",
|
||||
};
|
||||
|
||||
/* VMMC1 for MMC1 pins CMD, CLK, DAT0..DAT3 (20 mA, plus card == max 220 mA) */
|
||||
static struct regulator_init_data omap3logic_vmmc1 = {
|
||||
.constraints = {
|
||||
.name = "VMMC1",
|
||||
.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 = &omap3logic_vmmc1_supply,
|
||||
};
|
||||
|
||||
static struct twl4030_gpio_platform_data omap3logic_gpio_data = {
|
||||
.gpio_base = OMAP_MAX_GPIO_LINES,
|
||||
.irq_base = TWL4030_GPIO_IRQ_BASE,
|
||||
.irq_end = TWL4030_GPIO_IRQ_END,
|
||||
.use_leds = true,
|
||||
.pullups = BIT(1),
|
||||
.pulldowns = BIT(2) | BIT(6) | BIT(7) | BIT(8)
|
||||
| BIT(13) | BIT(15) | BIT(16) | BIT(17),
|
||||
};
|
||||
|
||||
static struct twl4030_platform_data omap3logic_twldata = {
|
||||
.irq_base = TWL4030_IRQ_BASE,
|
||||
.irq_end = TWL4030_IRQ_END,
|
||||
|
||||
/* platform_data for children goes here */
|
||||
.gpio = &omap3logic_gpio_data,
|
||||
.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));
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct omap2_hsmmc_info __initdata board_mmc_info[] = {
|
||||
{
|
||||
.name = "external",
|
||||
.mmc = 1,
|
||||
.caps = MMC_CAP_4_BIT_DATA,
|
||||
.gpio_cd = -EINVAL,
|
||||
.gpio_wp = -EINVAL,
|
||||
},
|
||||
{} /* Terminator */
|
||||
};
|
||||
|
||||
static void __init board_mmc_init(void)
|
||||
{
|
||||
if (machine_is_omap3530_lv_som()) {
|
||||
/* OMAP3530 LV SOM board */
|
||||
board_mmc_info[0].gpio_cd = OMAP3530_LV_SOM_MMC_GPIO_CD;
|
||||
board_mmc_info[0].gpio_wp = OMAP3530_LV_SOM_MMC_GPIO_WP;
|
||||
omap_mux_init_signal("gpio_110", OMAP_PIN_OUTPUT);
|
||||
omap_mux_init_signal("gpio_126", OMAP_PIN_OUTPUT);
|
||||
} else if (machine_is_omap3_torpedo()) {
|
||||
/* OMAP3 Torpedo board */
|
||||
board_mmc_info[0].gpio_cd = OMAP3_TORPEDO_MMC_GPIO_CD;
|
||||
omap_mux_init_signal("gpio_127", OMAP_PIN_OUTPUT);
|
||||
} else {
|
||||
/* unsupported board */
|
||||
printk(KERN_ERR "%s(): unknown machine type\n", __func__);
|
||||
return;
|
||||
}
|
||||
|
||||
omap2_hsmmc_init(board_mmc_info);
|
||||
/* link regulators to MMC adapters */
|
||||
omap3logic_vmmc1_supply.dev = board_mmc_info[0].dev;
|
||||
}
|
||||
|
||||
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):
|
||||
* Fix the PBIAS voltage for Torpedo MMC1 pins that
|
||||
* are used for other needs (IRQs, etc). */
|
||||
static void omap3torpedo_fix_pbias_voltage(void)
|
||||
{
|
||||
u16 control_pbias_offset = OMAP343X_CONTROL_PBIAS_LITE;
|
||||
u32 reg;
|
||||
|
||||
if (machine_is_omap3_torpedo())
|
||||
{
|
||||
/* Set the bias for the pin */
|
||||
reg = omap_ctrl_readl(control_pbias_offset);
|
||||
|
||||
reg &= ~OMAP343X_PBIASLITEPWRDNZ1;
|
||||
omap_ctrl_writel(reg, control_pbias_offset);
|
||||
|
||||
/* 100ms delay required for PBIAS configuration */
|
||||
msleep(100);
|
||||
|
||||
reg |= OMAP343X_PBIASLITEVMODE1;
|
||||
reg |= OMAP343X_PBIASLITEPWRDNZ1;
|
||||
omap_ctrl_writel(reg | 0x300, control_pbias_offset);
|
||||
}
|
||||
}
|
||||
|
||||
static inline void __init board_smsc911x_init(void)
|
||||
{
|
||||
if (machine_is_omap3530_lv_som()) {
|
||||
/* OMAP3530 LV SOM board */
|
||||
board_smsc911x_data.gpio_irq =
|
||||
OMAP3530_LV_SOM_SMSC911X_GPIO_IRQ;
|
||||
omap_mux_init_signal("gpio_152", OMAP_PIN_INPUT);
|
||||
} else if (machine_is_omap3_torpedo()) {
|
||||
/* OMAP3 Torpedo board */
|
||||
board_smsc911x_data.gpio_irq = OMAP3_TORPEDO_SMSC911X_GPIO_IRQ;
|
||||
omap_mux_init_signal("gpio_129", OMAP_PIN_INPUT);
|
||||
} else {
|
||||
/* unsupported board */
|
||||
printk(KERN_ERR "%s(): unknown machine type\n", __func__);
|
||||
return;
|
||||
}
|
||||
|
||||
gpmc_smsc911x_init(&board_smsc911x_data);
|
||||
}
|
||||
|
||||
static void __init omap3logic_init_irq(void)
|
||||
{
|
||||
omap2_init_common_hw(NULL, NULL);
|
||||
omap_init_irq();
|
||||
omap_gpio_init();
|
||||
}
|
||||
|
||||
#ifdef CONFIG_OMAP_MUX
|
||||
static struct omap_board_mux board_mux[] __initdata = {
|
||||
{ .reg_offset = OMAP_MUX_TERMINATOR },
|
||||
};
|
||||
#else
|
||||
#define board_mux NULL
|
||||
#endif
|
||||
|
||||
static void __init omap3logic_init(void)
|
||||
{
|
||||
omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);
|
||||
omap3torpedo_fix_pbias_voltage();
|
||||
omap3logic_i2c_init();
|
||||
omap_serial_init();
|
||||
board_mmc_init();
|
||||
board_smsc911x_init();
|
||||
|
||||
/* Ensure SDRC pins are mux'd for self-refresh */
|
||||
omap_mux_init_signal("sdrc_cke0", OMAP_PIN_OUTPUT);
|
||||
omap_mux_init_signal("sdrc_cke1", OMAP_PIN_OUTPUT);
|
||||
}
|
||||
|
||||
MACHINE_START(OMAP3_TORPEDO, "Logic OMAP3 Torpedo board")
|
||||
.boot_params = 0x80000100,
|
||||
.map_io = omap3_map_io,
|
||||
.init_irq = omap3logic_init_irq,
|
||||
.init_machine = omap3logic_init,
|
||||
.timer = &omap_timer,
|
||||
MACHINE_END
|
||||
|
||||
MACHINE_START(OMAP3530_LV_SOM, "OMAP Logic 3530 LV SOM board")
|
||||
.boot_params = 0x80000100,
|
||||
.map_io = omap3_map_io,
|
||||
.init_irq = omap3logic_init_irq,
|
||||
.init_machine = omap3logic_init,
|
||||
.timer = &omap_timer,
|
||||
MACHINE_END
|
@ -32,7 +32,9 @@
|
||||
#include <linux/input.h>
|
||||
#include <linux/input/matrix_keypad.h>
|
||||
#include <linux/gpio_keys.h>
|
||||
#include <linux/mmc/host.h>
|
||||
#include <linux/mmc/card.h>
|
||||
#include <linux/regulator/fixed.h>
|
||||
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/mach/arch.h>
|
||||
@ -276,14 +278,14 @@ static void pandora_wl1251_init_card(struct mmc_card *card)
|
||||
static struct omap2_hsmmc_info omap3pandora_mmc[] = {
|
||||
{
|
||||
.mmc = 1,
|
||||
.wires = 4,
|
||||
.caps = MMC_CAP_4_BIT_DATA,
|
||||
.gpio_cd = -EINVAL,
|
||||
.gpio_wp = 126,
|
||||
.ext_clock = 0,
|
||||
},
|
||||
{
|
||||
.mmc = 2,
|
||||
.wires = 4,
|
||||
.caps = MMC_CAP_4_BIT_DATA,
|
||||
.gpio_cd = -EINVAL,
|
||||
.gpio_wp = 127,
|
||||
.ext_clock = 1,
|
||||
@ -291,7 +293,7 @@ static struct omap2_hsmmc_info omap3pandora_mmc[] = {
|
||||
},
|
||||
{
|
||||
.mmc = 3,
|
||||
.wires = 4,
|
||||
.caps = MMC_CAP_4_BIT_DATA,
|
||||
.gpio_cd = -EINVAL,
|
||||
.gpio_wp = -EINVAL,
|
||||
.init_card = pandora_wl1251_init_card,
|
||||
@ -344,6 +346,9 @@ static struct regulator_consumer_supply pandora_vmmc1_supply =
|
||||
static struct regulator_consumer_supply pandora_vmmc2_supply =
|
||||
REGULATOR_SUPPLY("vmmc", "mmci-omap-hs.1");
|
||||
|
||||
static struct regulator_consumer_supply pandora_vmmc3_supply =
|
||||
REGULATOR_SUPPLY("vmmc", "mmci-omap-hs.2");
|
||||
|
||||
static struct regulator_consumer_supply pandora_vdda_dac_supply =
|
||||
REGULATOR_SUPPLY("vdda_dac", "omapdss");
|
||||
|
||||
@ -488,6 +493,33 @@ static struct regulator_init_data pandora_vsim = {
|
||||
.consumer_supplies = &pandora_adac_supply,
|
||||
};
|
||||
|
||||
/* Fixed regulator internal to Wifi module */
|
||||
static struct regulator_init_data pandora_vmmc3 = {
|
||||
.constraints = {
|
||||
.valid_ops_mask = REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
.num_consumer_supplies = 1,
|
||||
.consumer_supplies = &pandora_vmmc3_supply,
|
||||
};
|
||||
|
||||
static struct fixed_voltage_config pandora_vwlan = {
|
||||
.supply_name = "vwlan",
|
||||
.microvolts = 1800000, /* 1.8V */
|
||||
.gpio = PANDORA_WIFI_NRESET_GPIO,
|
||||
.startup_delay = 50000, /* 50ms */
|
||||
.enable_high = 1,
|
||||
.enabled_at_boot = 0,
|
||||
.init_data = &pandora_vmmc3,
|
||||
};
|
||||
|
||||
static struct platform_device pandora_vwlan_device = {
|
||||
.name = "reg-fixed-voltage",
|
||||
.id = 1,
|
||||
.dev = {
|
||||
.platform_data = &pandora_vwlan,
|
||||
},
|
||||
};
|
||||
|
||||
static struct twl4030_usb_data omap3pandora_usb_data = {
|
||||
.usb_mode = T2_USB_MODE_ULPI,
|
||||
};
|
||||
@ -501,6 +533,8 @@ static struct twl4030_codec_data omap3pandora_codec_data = {
|
||||
.audio = &omap3pandora_audio_data,
|
||||
};
|
||||
|
||||
static struct twl4030_bci_platform_data pandora_bci_data;
|
||||
|
||||
static struct twl4030_platform_data omap3pandora_twldata = {
|
||||
.irq_base = TWL4030_IRQ_BASE,
|
||||
.irq_end = TWL4030_IRQ_END,
|
||||
@ -516,6 +550,7 @@ static struct twl4030_platform_data omap3pandora_twldata = {
|
||||
.vaux4 = &pandora_vaux4,
|
||||
.vsim = &pandora_vsim,
|
||||
.keypad = &pandora_kp_data,
|
||||
.bci = &pandora_bci_data,
|
||||
};
|
||||
|
||||
static struct i2c_board_info __initdata omap3pandora_i2c_boardinfo[] = {
|
||||
@ -644,19 +679,8 @@ static void pandora_wl1251_init(void)
|
||||
if (pandora_wl1251_pdata.irq < 0)
|
||||
goto fail_irq;
|
||||
|
||||
ret = gpio_request(PANDORA_WIFI_NRESET_GPIO, "wl1251 nreset");
|
||||
if (ret < 0)
|
||||
goto fail_irq;
|
||||
|
||||
/* start powered so that it probes with MMC subsystem */
|
||||
ret = gpio_direction_output(PANDORA_WIFI_NRESET_GPIO, 1);
|
||||
if (ret < 0)
|
||||
goto fail_nreset;
|
||||
|
||||
return;
|
||||
|
||||
fail_nreset:
|
||||
gpio_free(PANDORA_WIFI_NRESET_GPIO);
|
||||
fail_irq:
|
||||
gpio_free(PANDORA_WIFI_IRQ_GPIO);
|
||||
fail:
|
||||
@ -668,6 +692,7 @@ static struct platform_device *omap3pandora_devices[] __initdata = {
|
||||
&pandora_keys_gpio,
|
||||
&pandora_dss_device,
|
||||
&pandora_wl1251_data,
|
||||
&pandora_vwlan_device,
|
||||
};
|
||||
|
||||
static const struct ehci_hcd_omap_platform_data ehci_pdata __initconst = {
|
||||
|
@ -26,6 +26,7 @@
|
||||
|
||||
#include <linux/regulator/machine.h>
|
||||
#include <linux/i2c/twl.h>
|
||||
#include <linux/mmc/host.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <asm/mach-types.h>
|
||||
@ -38,7 +39,6 @@
|
||||
#include <plat/gpmc.h>
|
||||
#include <plat/nand.h>
|
||||
#include <plat/usb.h>
|
||||
#include <plat/timer-gp.h>
|
||||
#include <plat/display.h>
|
||||
|
||||
#include <plat/mcspi.h>
|
||||
@ -52,6 +52,7 @@
|
||||
#include "sdram-micron-mt46h32m32lf-6.h"
|
||||
#include "mux.h"
|
||||
#include "hsmmc.h"
|
||||
#include "timer-gp.h"
|
||||
|
||||
#if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE)
|
||||
#define OMAP3STALKER_ETHR_START 0x2c000000
|
||||
@ -275,7 +276,7 @@ static struct regulator_init_data omap3stalker_vsim = {
|
||||
static struct omap2_hsmmc_info mmc[] = {
|
||||
{
|
||||
.mmc = 1,
|
||||
.wires = 4,
|
||||
.caps = MMC_CAP_4_BIT_DATA,
|
||||
.gpio_cd = -EINVAL,
|
||||
.gpio_wp = 23,
|
||||
},
|
||||
@ -389,7 +390,7 @@ static struct twl4030_usb_data omap3stalker_usb_data = {
|
||||
.usb_mode = T2_USB_MODE_ULPI,
|
||||
};
|
||||
|
||||
static int board_keymap[] = {
|
||||
static uint32_t board_keymap[] = {
|
||||
KEY(0, 0, KEY_LEFT),
|
||||
KEY(0, 1, KEY_DOWN),
|
||||
KEY(0, 2, KEY_ENTER),
|
||||
@ -564,7 +565,7 @@ static struct omap2_mcspi_device_config ads7846_mcspi_config = {
|
||||
.single_channel = 1, /* 0: slave, 1: master */
|
||||
};
|
||||
|
||||
struct spi_board_info omap3stalker_spi_board_info[] = {
|
||||
static struct spi_board_info omap3stalker_spi_board_info[] = {
|
||||
[0] = {
|
||||
.modalias = "ads7846",
|
||||
.bus_num = 1,
|
||||
|
@ -27,6 +27,7 @@
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
#include <linux/mtd/nand.h>
|
||||
#include <linux/mmc/host.h>
|
||||
|
||||
#include <plat/mcspi.h>
|
||||
#include <linux/spi/spi.h>
|
||||
@ -47,10 +48,10 @@
|
||||
#include <plat/gpmc.h>
|
||||
#include <plat/nand.h>
|
||||
#include <plat/usb.h>
|
||||
#include <plat/timer-gp.h>
|
||||
|
||||
#include "mux.h"
|
||||
#include "hsmmc.h"
|
||||
#include "timer-gp.h"
|
||||
|
||||
#include <asm/setup.h>
|
||||
|
||||
@ -61,7 +62,7 @@
|
||||
#define TB_BL_PWM_TIMER 9
|
||||
#define TB_KILL_POWER_GPIO 168
|
||||
|
||||
unsigned long touchbook_revision;
|
||||
static unsigned long touchbook_revision;
|
||||
|
||||
static struct mtd_partition omap3touchbook_nand_partitions[] = {
|
||||
/* All the partition sizes are listed in terms of NAND block size */
|
||||
@ -108,7 +109,7 @@ static struct omap_nand_platform_data omap3touchbook_nand_data = {
|
||||
static struct omap2_hsmmc_info mmc[] = {
|
||||
{
|
||||
.mmc = 1,
|
||||
.wires = 8,
|
||||
.caps = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA,
|
||||
.gpio_wp = 29,
|
||||
},
|
||||
{} /* Terminator */
|
||||
|
@ -20,6 +20,7 @@
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/leds.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/usb/otg.h>
|
||||
#include <linux/i2c/twl.h>
|
||||
@ -33,12 +34,45 @@
|
||||
|
||||
#include <plat/board.h>
|
||||
#include <plat/common.h>
|
||||
#include <plat/control.h>
|
||||
#include <plat/timer-gp.h>
|
||||
#include <plat/usb.h>
|
||||
#include <plat/mmc.h>
|
||||
#include "hsmmc.h"
|
||||
#include "timer-gp.h"
|
||||
|
||||
#include "hsmmc.h"
|
||||
#include "control.h"
|
||||
|
||||
#define GPIO_HUB_POWER 1
|
||||
#define GPIO_HUB_NRESET 62
|
||||
|
||||
static struct gpio_led gpio_leds[] = {
|
||||
{
|
||||
.name = "pandaboard::status1",
|
||||
.default_trigger = "heartbeat",
|
||||
.gpio = 7,
|
||||
},
|
||||
{
|
||||
.name = "pandaboard::status2",
|
||||
.default_trigger = "mmc0",
|
||||
.gpio = 8,
|
||||
},
|
||||
};
|
||||
|
||||
static struct gpio_led_platform_data gpio_led_info = {
|
||||
.leds = gpio_leds,
|
||||
.num_leds = ARRAY_SIZE(gpio_leds),
|
||||
};
|
||||
|
||||
static struct platform_device leds_gpio = {
|
||||
.name = "leds-gpio",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &gpio_led_info,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device *panda_devices[] __initdata = {
|
||||
&leds_gpio,
|
||||
};
|
||||
|
||||
static void __init omap4_panda_init_irq(void)
|
||||
{
|
||||
@ -47,6 +81,56 @@ static void __init omap4_panda_init_irq(void)
|
||||
omap_gpio_init();
|
||||
}
|
||||
|
||||
static const struct ehci_hcd_omap_platform_data ehci_pdata __initconst = {
|
||||
.port_mode[0] = EHCI_HCD_OMAP_MODE_PHY,
|
||||
.port_mode[1] = EHCI_HCD_OMAP_MODE_UNKNOWN,
|
||||
.port_mode[2] = EHCI_HCD_OMAP_MODE_UNKNOWN,
|
||||
.phy_reset = false,
|
||||
.reset_gpio_port[0] = -EINVAL,
|
||||
.reset_gpio_port[1] = -EINVAL,
|
||||
.reset_gpio_port[2] = -EINVAL
|
||||
};
|
||||
|
||||
static void __init omap4_ehci_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
|
||||
/* disable the power to the usb hub prior to init */
|
||||
ret = gpio_request(GPIO_HUB_POWER, "hub_power");
|
||||
if (ret) {
|
||||
pr_err("Cannot request GPIO %d\n", GPIO_HUB_POWER);
|
||||
goto error1;
|
||||
}
|
||||
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_NRESET, 0);
|
||||
gpio_direction_output(GPIO_HUB_NRESET, 0);
|
||||
gpio_set_value(GPIO_HUB_NRESET, 0);
|
||||
gpio_set_value(GPIO_HUB_NRESET, 1);
|
||||
|
||||
usb_ehci_init(&ehci_pdata);
|
||||
|
||||
/* 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 = {
|
||||
.interface_type = MUSB_INTERFACE_UTMI,
|
||||
.mode = MUSB_PERIPHERAL,
|
||||
@ -56,7 +140,7 @@ static struct omap_musb_board_data musb_board_data = {
|
||||
static struct omap2_hsmmc_info mmc[] = {
|
||||
{
|
||||
.mmc = 1,
|
||||
.wires = 8,
|
||||
.caps = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA,
|
||||
.gpio_wp = -EINVAL,
|
||||
},
|
||||
{} /* Terminator */
|
||||
@ -67,10 +151,6 @@ static struct regulator_consumer_supply omap4_panda_vmmc_supply[] = {
|
||||
.supply = "vmmc",
|
||||
.dev_name = "mmci-omap-hs.0",
|
||||
},
|
||||
{
|
||||
.supply = "vmmc",
|
||||
.dev_name = "mmci-omap-hs.1",
|
||||
},
|
||||
};
|
||||
|
||||
static int omap4_twl6030_hsmmc_late_init(struct device *dev)
|
||||
@ -89,7 +169,14 @@ static int omap4_twl6030_hsmmc_late_init(struct device *dev)
|
||||
|
||||
static __init void omap4_twl6030_hsmmc_set_late_init(struct device *dev)
|
||||
{
|
||||
struct omap_mmc_platform_data *pdata = dev->platform_data;
|
||||
struct omap_mmc_platform_data *pdata;
|
||||
|
||||
/* dev can be null if CONFIG_MMC_OMAP_HS is not set */
|
||||
if (!dev) {
|
||||
pr_err("Failed omap4_twl6030_hsmmc_set_late_init\n");
|
||||
return;
|
||||
}
|
||||
pdata = dev->platform_data;
|
||||
|
||||
pdata->init = omap4_twl6030_hsmmc_late_init;
|
||||
}
|
||||
@ -156,7 +243,7 @@ static struct regulator_init_data omap4_panda_vmmc = {
|
||||
| REGULATOR_CHANGE_MODE
|
||||
| REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
.num_consumer_supplies = 2,
|
||||
.num_consumer_supplies = 1,
|
||||
.consumer_supplies = omap4_panda_vmmc_supply,
|
||||
};
|
||||
|
||||
@ -274,13 +361,13 @@ static int __init omap4_panda_i2c_init(void)
|
||||
}
|
||||
static void __init omap4_panda_init(void)
|
||||
{
|
||||
int status;
|
||||
|
||||
omap4_panda_i2c_init();
|
||||
platform_add_devices(panda_devices, ARRAY_SIZE(panda_devices));
|
||||
omap_serial_init();
|
||||
omap4_twl6030_hsmmc_init(mmc);
|
||||
/* OMAP4 Panda uses internal transceiver so register nop transceiver */
|
||||
usb_nop_xceiv_register();
|
||||
omap4_ehci_init();
|
||||
/* FIXME: allow multi-omap to boot until musb is updated for omap4 */
|
||||
if (!cpu_is_omap44xx())
|
||||
usb_musb_init(&musb_board_data);
|
||||
|
@ -32,6 +32,7 @@
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/mtd/nand.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
#include <linux/mmc/host.h>
|
||||
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/mach/arch.h>
|
||||
@ -303,13 +304,13 @@ static void __init overo_flash_init(void)
|
||||
static struct omap2_hsmmc_info mmc[] = {
|
||||
{
|
||||
.mmc = 1,
|
||||
.wires = 4,
|
||||
.caps = MMC_CAP_4_BIT_DATA,
|
||||
.gpio_cd = -EINVAL,
|
||||
.gpio_wp = -EINVAL,
|
||||
},
|
||||
{
|
||||
.mmc = 2,
|
||||
.wires = 4,
|
||||
.caps = MMC_CAP_4_BIT_DATA,
|
||||
.gpio_cd = -EINVAL,
|
||||
.gpio_wp = -EINVAL,
|
||||
.transceiver = true,
|
||||
|
@ -33,6 +33,8 @@
|
||||
#include <plat/onenand.h>
|
||||
#include <plat/gpmc-smc91x.h>
|
||||
|
||||
#include <mach/board-rx51.h>
|
||||
|
||||
#include <sound/tlv320aic3x.h>
|
||||
#include <sound/tpa6130a2-plat.h>
|
||||
|
||||
@ -185,7 +187,7 @@ static void __init rx51_add_gpio_keys(void)
|
||||
}
|
||||
#endif /* CONFIG_KEYBOARD_GPIO || CONFIG_KEYBOARD_GPIO_MODULE */
|
||||
|
||||
static int board_keymap[] = {
|
||||
static uint32_t board_keymap[] = {
|
||||
/*
|
||||
* Note that KEY(x, 8, KEY_XXX) entries represent "entrire row
|
||||
* connected to the ground" matrix state.
|
||||
@ -303,7 +305,7 @@ static struct omap2_hsmmc_info mmc[] __initdata = {
|
||||
{
|
||||
.name = "external",
|
||||
.mmc = 1,
|
||||
.wires = 4,
|
||||
.caps = MMC_CAP_4_BIT_DATA,
|
||||
.cover_only = true,
|
||||
.gpio_cd = 160,
|
||||
.gpio_wp = -EINVAL,
|
||||
@ -312,7 +314,8 @@ static struct omap2_hsmmc_info mmc[] __initdata = {
|
||||
{
|
||||
.name = "internal",
|
||||
.mmc = 2,
|
||||
.wires = 8, /* See also rx51_mmc2_remux */
|
||||
.caps = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA,
|
||||
/* See also rx51_mmc2_remux */
|
||||
.gpio_cd = -EINVAL,
|
||||
.gpio_wp = -EINVAL,
|
||||
.nonremovable = true,
|
||||
|
@ -43,7 +43,7 @@ struct sdram_timings {
|
||||
u32 tWTR;
|
||||
};
|
||||
|
||||
struct omap_sdrc_params rx51_sdrc_params[4];
|
||||
static struct omap_sdrc_params rx51_sdrc_params[4];
|
||||
|
||||
static const struct sdram_timings rx51_timings[] = {
|
||||
{
|
||||
|
@ -20,6 +20,8 @@
|
||||
#include <plat/vram.h>
|
||||
#include <plat/mcspi.h>
|
||||
|
||||
#include <mach/board-rx51.h>
|
||||
|
||||
#include "mux.h"
|
||||
|
||||
#define RX51_LCD_RESET_GPIO 90
|
||||
|
@ -16,6 +16,8 @@
|
||||
|
||||
#include <plat/gpmc.h>
|
||||
|
||||
#include <mach/board-zoom.h>
|
||||
|
||||
#define ZOOM_SMSC911X_CS 7
|
||||
#define ZOOM_SMSC911X_GPIO 158
|
||||
#define ZOOM_QUADUART_CS 3
|
||||
|
@ -18,6 +18,7 @@
|
||||
#include <linux/regulator/machine.h>
|
||||
#include <linux/regulator/fixed.h>
|
||||
#include <linux/wl12xx.h>
|
||||
#include <linux/mmc/host.h>
|
||||
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/mach/arch.h>
|
||||
@ -35,7 +36,7 @@
|
||||
#define OMAP_ZOOM_WLAN_IRQ_GPIO (162)
|
||||
|
||||
/* Zoom2 has Qwerty keyboard*/
|
||||
static int board_keymap[] = {
|
||||
static uint32_t board_keymap[] = {
|
||||
KEY(0, 0, KEY_E),
|
||||
KEY(0, 1, KEY_R),
|
||||
KEY(0, 2, KEY_T),
|
||||
@ -199,14 +200,14 @@ static struct omap2_hsmmc_info mmc[] __initdata = {
|
||||
{
|
||||
.name = "external",
|
||||
.mmc = 1,
|
||||
.wires = 4,
|
||||
.caps = MMC_CAP_4_BIT_DATA,
|
||||
.gpio_wp = -EINVAL,
|
||||
.power_saving = true,
|
||||
},
|
||||
{
|
||||
.name = "internal",
|
||||
.mmc = 2,
|
||||
.wires = 8,
|
||||
.caps = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA,
|
||||
.gpio_cd = -EINVAL,
|
||||
.gpio_wp = -EINVAL,
|
||||
.nonremovable = true,
|
||||
@ -348,4 +349,5 @@ void __init zoom_peripherals_init(void)
|
||||
platform_device_register(&omap_vwlan_device);
|
||||
usb_musb_init(&musb_board_data);
|
||||
enable_board_wakeup_source();
|
||||
omap_serial_init();
|
||||
}
|
||||
|
@ -24,6 +24,7 @@
|
||||
|
||||
#include <mach/board-zoom.h>
|
||||
|
||||
#include "board-flash.h"
|
||||
#include "mux.h"
|
||||
#include "sdram-micron-mt46h32m32lf-6.h"
|
||||
|
||||
|
@ -22,6 +22,7 @@
|
||||
#include <plat/board.h>
|
||||
#include <plat/usb.h>
|
||||
|
||||
#include "board-flash.h"
|
||||
#include "mux.h"
|
||||
#include "sdram-hynix-h8mbx00u0mer-0em.h"
|
||||
|
||||
|
@ -395,7 +395,7 @@ void omap2_clk_disable_unused(struct clk *clk)
|
||||
if ((regval32 & (1 << clk->enable_bit)) == v)
|
||||
return;
|
||||
|
||||
printk(KERN_DEBUG "Disabling unused clock \"%s\"\n", clk->name);
|
||||
pr_debug("Disabling unused clock \"%s\"\n", clk->name);
|
||||
if (cpu_is_omap34xx()) {
|
||||
omap2_clk_enable(clk);
|
||||
omap2_clk_disable(clk);
|
||||
|
@ -27,6 +27,7 @@
|
||||
#include "prm-regbits-24xx.h"
|
||||
#include "cm-regbits-24xx.h"
|
||||
#include "sdrc.h"
|
||||
#include "control.h"
|
||||
|
||||
#define OMAP_CM_REGADDR OMAP2420_CM_REGADDR
|
||||
|
||||
@ -89,6 +90,12 @@ static struct clk alt_ck = { /* Typical 54M or 48M, may not exist */
|
||||
.clkdm_name = "wkup_clkdm",
|
||||
};
|
||||
|
||||
/* Optional external clock input for McBSP CLKS */
|
||||
static struct clk mcbsp_clks = {
|
||||
.name = "mcbsp_clks",
|
||||
.ops = &clkops_null,
|
||||
};
|
||||
|
||||
/*
|
||||
* Analog domain root source clocks
|
||||
*/
|
||||
@ -1135,14 +1142,34 @@ static struct clk mcbsp1_ick = {
|
||||
.recalc = &followparent_recalc,
|
||||
};
|
||||
|
||||
static const struct clksel_rate common_mcbsp_96m_rates[] = {
|
||||
{ .div = 1, .val = 0, .flags = RATE_IN_24XX },
|
||||
{ .div = 0 }
|
||||
};
|
||||
|
||||
static const struct clksel_rate common_mcbsp_mcbsp_rates[] = {
|
||||
{ .div = 1, .val = 1, .flags = RATE_IN_24XX },
|
||||
{ .div = 0 }
|
||||
};
|
||||
|
||||
static const struct clksel mcbsp_fck_clksel[] = {
|
||||
{ .parent = &func_96m_ck, .rates = common_mcbsp_96m_rates },
|
||||
{ .parent = &mcbsp_clks, .rates = common_mcbsp_mcbsp_rates },
|
||||
{ .parent = NULL }
|
||||
};
|
||||
|
||||
static struct clk mcbsp1_fck = {
|
||||
.name = "mcbsp1_fck",
|
||||
.ops = &clkops_omap2_dflt_wait,
|
||||
.parent = &func_96m_ck,
|
||||
.init = &omap2_init_clksel_parent,
|
||||
.clkdm_name = "core_l4_clkdm",
|
||||
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
|
||||
.enable_bit = OMAP24XX_EN_MCBSP1_SHIFT,
|
||||
.recalc = &followparent_recalc,
|
||||
.clksel_reg = OMAP242X_CTRL_REGADDR(OMAP2_CONTROL_DEVCONF0),
|
||||
.clksel_mask = OMAP2_MCBSP1_CLKS_MASK,
|
||||
.clksel = mcbsp_fck_clksel,
|
||||
.recalc = &omap2_clksel_recalc,
|
||||
};
|
||||
|
||||
static struct clk mcbsp2_ick = {
|
||||
@ -1159,10 +1186,14 @@ static struct clk mcbsp2_fck = {
|
||||
.name = "mcbsp2_fck",
|
||||
.ops = &clkops_omap2_dflt_wait,
|
||||
.parent = &func_96m_ck,
|
||||
.init = &omap2_init_clksel_parent,
|
||||
.clkdm_name = "core_l4_clkdm",
|
||||
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
|
||||
.enable_bit = OMAP24XX_EN_MCBSP2_SHIFT,
|
||||
.recalc = &followparent_recalc,
|
||||
.clksel_reg = OMAP242X_CTRL_REGADDR(OMAP2_CONTROL_DEVCONF0),
|
||||
.clksel_mask = OMAP2_MCBSP2_CLKS_MASK,
|
||||
.clksel = mcbsp_fck_clksel,
|
||||
.recalc = &omap2_clksel_recalc,
|
||||
};
|
||||
|
||||
static struct clk mcspi1_ick = {
|
||||
@ -1721,6 +1752,9 @@ static struct omap_clk omap2420_clks[] = {
|
||||
CLK(NULL, "osc_ck", &osc_ck, CK_242X),
|
||||
CLK(NULL, "sys_ck", &sys_ck, CK_242X),
|
||||
CLK(NULL, "alt_ck", &alt_ck, CK_242X),
|
||||
CLK("omap-mcbsp.1", "pad_fck", &mcbsp_clks, CK_242X),
|
||||
CLK("omap-mcbsp.2", "pad_fck", &mcbsp_clks, CK_242X),
|
||||
CLK(NULL, "mcbsp_clks", &mcbsp_clks, CK_242X),
|
||||
/* internal analog sources */
|
||||
CLK(NULL, "dpll_ck", &dpll_ck, CK_242X),
|
||||
CLK(NULL, "apll96_ck", &apll96_ck, CK_242X),
|
||||
@ -1728,6 +1762,8 @@ static struct omap_clk omap2420_clks[] = {
|
||||
/* internal prcm root sources */
|
||||
CLK(NULL, "func_54m_ck", &func_54m_ck, CK_242X),
|
||||
CLK(NULL, "core_ck", &core_ck, CK_242X),
|
||||
CLK("omap-mcbsp.1", "prcm_fck", &func_96m_ck, CK_242X),
|
||||
CLK("omap-mcbsp.2", "prcm_fck", &func_96m_ck, CK_242X),
|
||||
CLK(NULL, "func_96m_ck", &func_96m_ck, CK_242X),
|
||||
CLK(NULL, "func_48m_ck", &func_48m_ck, CK_242X),
|
||||
CLK(NULL, "func_12m_ck", &func_12m_ck, CK_242X),
|
||||
|
@ -27,6 +27,7 @@
|
||||
#include "prm-regbits-24xx.h"
|
||||
#include "cm-regbits-24xx.h"
|
||||
#include "sdrc.h"
|
||||
#include "control.h"
|
||||
|
||||
#define OMAP_CM_REGADDR OMAP2430_CM_REGADDR
|
||||
|
||||
@ -89,6 +90,12 @@ static struct clk alt_ck = { /* Typical 54M or 48M, may not exist */
|
||||
.clkdm_name = "wkup_clkdm",
|
||||
};
|
||||
|
||||
/* Optional external clock input for McBSP CLKS */
|
||||
static struct clk mcbsp_clks = {
|
||||
.name = "mcbsp_clks",
|
||||
.ops = &clkops_null,
|
||||
};
|
||||
|
||||
/*
|
||||
* Analog domain root source clocks
|
||||
*/
|
||||
@ -1123,14 +1130,34 @@ static struct clk mcbsp1_ick = {
|
||||
.recalc = &followparent_recalc,
|
||||
};
|
||||
|
||||
static const struct clksel_rate common_mcbsp_96m_rates[] = {
|
||||
{ .div = 1, .val = 0, .flags = RATE_IN_24XX },
|
||||
{ .div = 0 }
|
||||
};
|
||||
|
||||
static const struct clksel_rate common_mcbsp_mcbsp_rates[] = {
|
||||
{ .div = 1, .val = 1, .flags = RATE_IN_24XX },
|
||||
{ .div = 0 }
|
||||
};
|
||||
|
||||
static const struct clksel mcbsp_fck_clksel[] = {
|
||||
{ .parent = &func_96m_ck, .rates = common_mcbsp_96m_rates },
|
||||
{ .parent = &mcbsp_clks, .rates = common_mcbsp_mcbsp_rates },
|
||||
{ .parent = NULL }
|
||||
};
|
||||
|
||||
static struct clk mcbsp1_fck = {
|
||||
.name = "mcbsp1_fck",
|
||||
.ops = &clkops_omap2_dflt_wait,
|
||||
.parent = &func_96m_ck,
|
||||
.init = &omap2_init_clksel_parent,
|
||||
.clkdm_name = "core_l4_clkdm",
|
||||
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
|
||||
.enable_bit = OMAP24XX_EN_MCBSP1_SHIFT,
|
||||
.recalc = &followparent_recalc,
|
||||
.clksel_reg = OMAP243X_CTRL_REGADDR(OMAP2_CONTROL_DEVCONF0),
|
||||
.clksel_mask = OMAP2_MCBSP1_CLKS_MASK,
|
||||
.clksel = mcbsp_fck_clksel,
|
||||
.recalc = &omap2_clksel_recalc,
|
||||
};
|
||||
|
||||
static struct clk mcbsp2_ick = {
|
||||
@ -1147,10 +1174,14 @@ static struct clk mcbsp2_fck = {
|
||||
.name = "mcbsp2_fck",
|
||||
.ops = &clkops_omap2_dflt_wait,
|
||||
.parent = &func_96m_ck,
|
||||
.init = &omap2_init_clksel_parent,
|
||||
.clkdm_name = "core_l4_clkdm",
|
||||
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
|
||||
.enable_bit = OMAP24XX_EN_MCBSP2_SHIFT,
|
||||
.recalc = &followparent_recalc,
|
||||
.clksel_reg = OMAP243X_CTRL_REGADDR(OMAP2_CONTROL_DEVCONF0),
|
||||
.clksel_mask = OMAP2_MCBSP2_CLKS_MASK,
|
||||
.clksel = mcbsp_fck_clksel,
|
||||
.recalc = &omap2_clksel_recalc,
|
||||
};
|
||||
|
||||
static struct clk mcbsp3_ick = {
|
||||
@ -1167,10 +1198,14 @@ static struct clk mcbsp3_fck = {
|
||||
.name = "mcbsp3_fck",
|
||||
.ops = &clkops_omap2_dflt_wait,
|
||||
.parent = &func_96m_ck,
|
||||
.init = &omap2_init_clksel_parent,
|
||||
.clkdm_name = "core_l4_clkdm",
|
||||
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_FCLKEN2),
|
||||
.enable_bit = OMAP2430_EN_MCBSP3_SHIFT,
|
||||
.recalc = &followparent_recalc,
|
||||
.clksel_reg = OMAP243X_CTRL_REGADDR(OMAP243X_CONTROL_DEVCONF1),
|
||||
.clksel_mask = OMAP2_MCBSP3_CLKS_MASK,
|
||||
.clksel = mcbsp_fck_clksel,
|
||||
.recalc = &omap2_clksel_recalc,
|
||||
};
|
||||
|
||||
static struct clk mcbsp4_ick = {
|
||||
@ -1187,10 +1222,14 @@ static struct clk mcbsp4_fck = {
|
||||
.name = "mcbsp4_fck",
|
||||
.ops = &clkops_omap2_dflt_wait,
|
||||
.parent = &func_96m_ck,
|
||||
.init = &omap2_init_clksel_parent,
|
||||
.clkdm_name = "core_l4_clkdm",
|
||||
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_FCLKEN2),
|
||||
.enable_bit = OMAP2430_EN_MCBSP4_SHIFT,
|
||||
.recalc = &followparent_recalc,
|
||||
.clksel_reg = OMAP243X_CTRL_REGADDR(OMAP243X_CONTROL_DEVCONF1),
|
||||
.clksel_mask = OMAP2_MCBSP4_CLKS_MASK,
|
||||
.clksel = mcbsp_fck_clksel,
|
||||
.recalc = &omap2_clksel_recalc,
|
||||
};
|
||||
|
||||
static struct clk mcbsp5_ick = {
|
||||
@ -1207,10 +1246,14 @@ static struct clk mcbsp5_fck = {
|
||||
.name = "mcbsp5_fck",
|
||||
.ops = &clkops_omap2_dflt_wait,
|
||||
.parent = &func_96m_ck,
|
||||
.init = &omap2_init_clksel_parent,
|
||||
.clkdm_name = "core_l4_clkdm",
|
||||
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, OMAP24XX_CM_FCLKEN2),
|
||||
.enable_bit = OMAP2430_EN_MCBSP5_SHIFT,
|
||||
.recalc = &followparent_recalc,
|
||||
.clksel_reg = OMAP243X_CTRL_REGADDR(OMAP243X_CONTROL_DEVCONF1),
|
||||
.clksel_mask = OMAP2_MCBSP5_CLKS_MASK,
|
||||
.clksel = mcbsp_fck_clksel,
|
||||
.recalc = &omap2_clksel_recalc,
|
||||
};
|
||||
|
||||
static struct clk mcspi1_ick = {
|
||||
@ -1808,6 +1851,12 @@ static struct omap_clk omap2430_clks[] = {
|
||||
CLK(NULL, "osc_ck", &osc_ck, CK_243X),
|
||||
CLK(NULL, "sys_ck", &sys_ck, CK_243X),
|
||||
CLK(NULL, "alt_ck", &alt_ck, CK_243X),
|
||||
CLK("omap-mcbsp.1", "pad_fck", &mcbsp_clks, CK_243X),
|
||||
CLK("omap-mcbsp.2", "pad_fck", &mcbsp_clks, CK_243X),
|
||||
CLK("omap-mcbsp.3", "pad_fck", &mcbsp_clks, CK_243X),
|
||||
CLK("omap-mcbsp.4", "pad_fck", &mcbsp_clks, CK_243X),
|
||||
CLK("omap-mcbsp.5", "pad_fck", &mcbsp_clks, CK_243X),
|
||||
CLK(NULL, "mcbsp_clks", &mcbsp_clks, CK_243X),
|
||||
/* internal analog sources */
|
||||
CLK(NULL, "dpll_ck", &dpll_ck, CK_243X),
|
||||
CLK(NULL, "apll96_ck", &apll96_ck, CK_243X),
|
||||
@ -1815,6 +1864,11 @@ static struct omap_clk omap2430_clks[] = {
|
||||
/* internal prcm root sources */
|
||||
CLK(NULL, "func_54m_ck", &func_54m_ck, CK_243X),
|
||||
CLK(NULL, "core_ck", &core_ck, CK_243X),
|
||||
CLK("omap-mcbsp.1", "prcm_fck", &func_96m_ck, CK_243X),
|
||||
CLK("omap-mcbsp.2", "prcm_fck", &func_96m_ck, CK_243X),
|
||||
CLK("omap-mcbsp.3", "prcm_fck", &func_96m_ck, CK_243X),
|
||||
CLK("omap-mcbsp.4", "prcm_fck", &func_96m_ck, CK_243X),
|
||||
CLK("omap-mcbsp.5", "prcm_fck", &func_96m_ck, CK_243X),
|
||||
CLK(NULL, "func_96m_ck", &func_96m_ck, CK_243X),
|
||||
CLK(NULL, "func_48m_ck", &func_48m_ck, CK_243X),
|
||||
CLK(NULL, "func_12m_ck", &func_12m_ck, CK_243X),
|
||||
|
@ -20,7 +20,6 @@
|
||||
#include <linux/clk.h>
|
||||
#include <linux/list.h>
|
||||
|
||||
#include <plat/control.h>
|
||||
#include <plat/clkdev_omap.h>
|
||||
|
||||
#include "clock.h"
|
||||
@ -33,6 +32,7 @@
|
||||
#include "cm-regbits-34xx.h"
|
||||
#include "prm.h"
|
||||
#include "prm-regbits-34xx.h"
|
||||
#include "control.h"
|
||||
|
||||
/*
|
||||
* clocks
|
||||
@ -2465,6 +2465,16 @@ static struct clk uart3_fck = {
|
||||
.recalc = &followparent_recalc,
|
||||
};
|
||||
|
||||
static struct clk uart4_fck = {
|
||||
.name = "uart4_fck",
|
||||
.ops = &clkops_omap2_dflt_wait,
|
||||
.parent = &per_48m_fck,
|
||||
.enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_FCLKEN),
|
||||
.enable_bit = OMAP3630_EN_UART4_SHIFT,
|
||||
.clkdm_name = "per_clkdm",
|
||||
.recalc = &followparent_recalc,
|
||||
};
|
||||
|
||||
static struct clk gpt2_fck = {
|
||||
.name = "gpt2_fck",
|
||||
.ops = &clkops_omap2_dflt_wait,
|
||||
@ -2715,6 +2725,16 @@ static struct clk uart3_ick = {
|
||||
.recalc = &followparent_recalc,
|
||||
};
|
||||
|
||||
static struct clk uart4_ick = {
|
||||
.name = "uart4_ick",
|
||||
.ops = &clkops_omap2_dflt_wait,
|
||||
.parent = &per_l4_ick,
|
||||
.enable_reg = OMAP_CM_REGADDR(OMAP3430_PER_MOD, CM_ICLKEN),
|
||||
.enable_bit = OMAP3630_EN_UART4_SHIFT,
|
||||
.clkdm_name = "per_clkdm",
|
||||
.recalc = &followparent_recalc,
|
||||
};
|
||||
|
||||
static struct clk gpt9_ick = {
|
||||
.name = "gpt9_ick",
|
||||
.ops = &clkops_omap2_dflt_wait,
|
||||
@ -3188,6 +3208,11 @@ static struct omap_clk omap3xxx_clks[] = {
|
||||
CLK(NULL, "osc_sys_ck", &osc_sys_ck, CK_3XXX),
|
||||
CLK(NULL, "sys_ck", &sys_ck, CK_3XXX),
|
||||
CLK(NULL, "sys_altclk", &sys_altclk, CK_3XXX),
|
||||
CLK("omap-mcbsp.1", "pad_fck", &mcbsp_clks, CK_3XXX),
|
||||
CLK("omap-mcbsp.2", "pad_fck", &mcbsp_clks, CK_3XXX),
|
||||
CLK("omap-mcbsp.3", "pad_fck", &mcbsp_clks, CK_3XXX),
|
||||
CLK("omap-mcbsp.4", "pad_fck", &mcbsp_clks, CK_3XXX),
|
||||
CLK("omap-mcbsp.5", "pad_fck", &mcbsp_clks, CK_3XXX),
|
||||
CLK(NULL, "mcbsp_clks", &mcbsp_clks, CK_3XXX),
|
||||
CLK(NULL, "sys_clkout1", &sys_clkout1, CK_3XXX),
|
||||
CLK(NULL, "dpll1_ck", &dpll1_ck, CK_3XXX),
|
||||
@ -3253,6 +3278,8 @@ static struct omap_clk omap3xxx_clks[] = {
|
||||
CLK(NULL, "cpefuse_fck", &cpefuse_fck, CK_3430ES2 | CK_AM35XX),
|
||||
CLK(NULL, "ts_fck", &ts_fck, CK_3430ES2 | CK_AM35XX),
|
||||
CLK(NULL, "usbtll_fck", &usbtll_fck, CK_3430ES2 | CK_AM35XX),
|
||||
CLK("omap-mcbsp.1", "prcm_fck", &core_96m_fck, CK_3XXX),
|
||||
CLK("omap-mcbsp.5", "prcm_fck", &core_96m_fck, CK_3XXX),
|
||||
CLK(NULL, "core_96m_fck", &core_96m_fck, CK_3XXX),
|
||||
CLK("mmci-omap-hs.2", "fck", &mmchs3_fck, CK_3430ES2 | CK_AM35XX),
|
||||
CLK("mmci-omap-hs.1", "fck", &mmchs2_fck, CK_3XXX),
|
||||
@ -3346,9 +3373,13 @@ static struct omap_clk omap3xxx_clks[] = {
|
||||
CLK(NULL, "omap_32ksync_ick", &omap_32ksync_ick, CK_3XXX),
|
||||
CLK(NULL, "gpt12_ick", &gpt12_ick, CK_3XXX),
|
||||
CLK(NULL, "gpt1_ick", &gpt1_ick, CK_3XXX),
|
||||
CLK("omap-mcbsp.2", "prcm_fck", &per_96m_fck, CK_3XXX),
|
||||
CLK("omap-mcbsp.3", "prcm_fck", &per_96m_fck, CK_3XXX),
|
||||
CLK("omap-mcbsp.4", "prcm_fck", &per_96m_fck, CK_3XXX),
|
||||
CLK(NULL, "per_96m_fck", &per_96m_fck, CK_3XXX),
|
||||
CLK(NULL, "per_48m_fck", &per_48m_fck, CK_3XXX),
|
||||
CLK(NULL, "uart3_fck", &uart3_fck, CK_3XXX),
|
||||
CLK(NULL, "uart4_fck", &uart4_fck, CK_36XX),
|
||||
CLK(NULL, "gpt2_fck", &gpt2_fck, CK_3XXX),
|
||||
CLK(NULL, "gpt3_fck", &gpt3_fck, CK_3XXX),
|
||||
CLK(NULL, "gpt4_fck", &gpt4_fck, CK_3XXX),
|
||||
@ -3372,6 +3403,7 @@ static struct omap_clk omap3xxx_clks[] = {
|
||||
CLK(NULL, "gpio2_ick", &gpio2_ick, CK_3XXX),
|
||||
CLK(NULL, "wdt3_ick", &wdt3_ick, CK_3XXX),
|
||||
CLK(NULL, "uart3_ick", &uart3_ick, CK_3XXX),
|
||||
CLK(NULL, "uart4_ick", &uart4_ick, CK_36XX),
|
||||
CLK(NULL, "gpt9_ick", &gpt9_ick, CK_3XXX),
|
||||
CLK(NULL, "gpt8_ick", &gpt8_ick, CK_3XXX),
|
||||
CLK(NULL, "gpt7_ick", &gpt7_ick, CK_3XXX),
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -258,97 +258,6 @@ static void _omap2_clkdm_set_hwsup(struct clockdomain *clkdm, int enable)
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* _init_wkdep_usecount - initialize wkdep usecounts to match hardware
|
||||
* @clkdm: clockdomain to initialize wkdep usecounts
|
||||
*
|
||||
* Initialize the wakeup dependency usecount variables for clockdomain @clkdm.
|
||||
* If a wakeup dependency is present in the hardware, the usecount will be
|
||||
* set to 1; otherwise, it will be set to 0. Software should clear all
|
||||
* software wakeup dependencies prior to calling this function if it wishes
|
||||
* to ensure that all usecounts start at 0. No return value.
|
||||
*/
|
||||
static void _init_wkdep_usecount(struct clockdomain *clkdm)
|
||||
{
|
||||
u32 v;
|
||||
struct clkdm_dep *cd;
|
||||
|
||||
if (!clkdm->wkdep_srcs)
|
||||
return;
|
||||
|
||||
for (cd = clkdm->wkdep_srcs; cd->clkdm_name; cd++) {
|
||||
if (!omap_chip_is(cd->omap_chip))
|
||||
continue;
|
||||
|
||||
if (!cd->clkdm && cd->clkdm_name)
|
||||
cd->clkdm = _clkdm_lookup(cd->clkdm_name);
|
||||
|
||||
if (!cd->clkdm) {
|
||||
WARN(!cd->clkdm, "clockdomain: %s: wkdep clkdm %s not "
|
||||
"found\n", clkdm->name, cd->clkdm_name);
|
||||
continue;
|
||||
}
|
||||
|
||||
v = prm_read_mod_bits_shift(clkdm->pwrdm.ptr->prcm_offs,
|
||||
PM_WKDEP,
|
||||
(1 << cd->clkdm->dep_bit));
|
||||
|
||||
if (v)
|
||||
pr_debug("clockdomain: %s: wakeup dependency already "
|
||||
"set to wake up when %s wakes\n",
|
||||
clkdm->name, cd->clkdm->name);
|
||||
|
||||
atomic_set(&cd->wkdep_usecount, (v) ? 1 : 0);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* _init_sleepdep_usecount - initialize sleepdep usecounts to match hardware
|
||||
* @clkdm: clockdomain to initialize sleepdep usecounts
|
||||
*
|
||||
* Initialize the sleep dependency usecount variables for clockdomain @clkdm.
|
||||
* If a sleep dependency is present in the hardware, the usecount will be
|
||||
* set to 1; otherwise, it will be set to 0. Software should clear all
|
||||
* software sleep dependencies prior to calling this function if it wishes
|
||||
* to ensure that all usecounts start at 0. No return value.
|
||||
*/
|
||||
static void _init_sleepdep_usecount(struct clockdomain *clkdm)
|
||||
{
|
||||
u32 v;
|
||||
struct clkdm_dep *cd;
|
||||
|
||||
if (!cpu_is_omap34xx())
|
||||
return;
|
||||
|
||||
if (!clkdm->sleepdep_srcs)
|
||||
return;
|
||||
|
||||
for (cd = clkdm->sleepdep_srcs; cd->clkdm_name; cd++) {
|
||||
if (!omap_chip_is(cd->omap_chip))
|
||||
continue;
|
||||
|
||||
if (!cd->clkdm && cd->clkdm_name)
|
||||
cd->clkdm = _clkdm_lookup(cd->clkdm_name);
|
||||
|
||||
if (!cd->clkdm) {
|
||||
WARN(!cd->clkdm, "clockdomain: %s: sleepdep clkdm %s "
|
||||
"not found\n", clkdm->name, cd->clkdm_name);
|
||||
continue;
|
||||
}
|
||||
|
||||
v = prm_read_mod_bits_shift(clkdm->pwrdm.ptr->prcm_offs,
|
||||
OMAP3430_CM_SLEEPDEP,
|
||||
(1 << cd->clkdm->dep_bit));
|
||||
|
||||
if (v)
|
||||
pr_debug("clockdomain: %s: sleep dependency already "
|
||||
"set to prevent from idling until %s "
|
||||
"idles\n", clkdm->name, cd->clkdm->name);
|
||||
|
||||
atomic_set(&cd->sleepdep_usecount, (v) ? 1 : 0);
|
||||
}
|
||||
};
|
||||
|
||||
/* Public functions */
|
||||
|
||||
/**
|
||||
@ -379,12 +288,17 @@ void clkdm_init(struct clockdomain **clkdms,
|
||||
_autodep_lookup(autodep);
|
||||
|
||||
/*
|
||||
* Ensure that the *dep_usecount registers reflect the current
|
||||
* state of the PRCM.
|
||||
* Put all clockdomains into software-supervised mode; PM code
|
||||
* should later enable hardware-supervised mode as appropriate
|
||||
*/
|
||||
list_for_each_entry(clkdm, &clkdm_list, node) {
|
||||
_init_wkdep_usecount(clkdm);
|
||||
_init_sleepdep_usecount(clkdm);
|
||||
if (clkdm->flags & CLKDM_CAN_FORCE_WAKEUP)
|
||||
omap2_clkdm_wakeup(clkdm);
|
||||
else if (clkdm->flags & CLKDM_CAN_DISABLE_AUTO)
|
||||
omap2_clkdm_deny_idle(clkdm);
|
||||
|
||||
clkdm_clear_all_wkdeps(clkdm);
|
||||
clkdm_clear_all_sleepdeps(clkdm);
|
||||
}
|
||||
}
|
||||
|
||||
@ -592,6 +506,9 @@ int clkdm_clear_all_wkdeps(struct clockdomain *clkdm)
|
||||
if (!omap_chip_is(cd->omap_chip))
|
||||
continue;
|
||||
|
||||
if (!cd->clkdm && cd->clkdm_name)
|
||||
cd->clkdm = _clkdm_lookup(cd->clkdm_name);
|
||||
|
||||
/* PRM accesses are slow, so minimize them */
|
||||
mask |= 1 << cd->clkdm->dep_bit;
|
||||
atomic_set(&cd->wkdep_usecount, 0);
|
||||
@ -752,6 +669,9 @@ int clkdm_clear_all_sleepdeps(struct clockdomain *clkdm)
|
||||
if (!omap_chip_is(cd->omap_chip))
|
||||
continue;
|
||||
|
||||
if (!cd->clkdm && cd->clkdm_name)
|
||||
cd->clkdm = _clkdm_lookup(cd->clkdm_name);
|
||||
|
||||
/* PRM accesses are slow, so minimize them */
|
||||
mask |= 1 << cd->clkdm->dep_bit;
|
||||
atomic_set(&cd->sleepdep_usecount, 0);
|
||||
|
@ -649,6 +649,8 @@
|
||||
#define OMAP3430_ST_MCBSP2_MASK (1 << 0)
|
||||
|
||||
/* CM_AUTOIDLE_PER */
|
||||
#define OMAP3630_AUTO_UART4_MASK (1 << 18)
|
||||
#define OMAP3630_AUTO_UART4_SHIFT 18
|
||||
#define OMAP3430_AUTO_GPIO6_MASK (1 << 17)
|
||||
#define OMAP3430_AUTO_GPIO6_SHIFT 17
|
||||
#define OMAP3430_AUTO_GPIO5_MASK (1 << 16)
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -195,6 +195,42 @@
|
||||
#define OMAP4_CM1_ABE_WDT3_CLKCTRL_OFFSET 0x0088
|
||||
#define OMAP4430_CM1_ABE_WDT3_CLKCTRL OMAP44XX_CM1_REGADDR(OMAP4430_CM1_ABE_MOD, 0x0088)
|
||||
|
||||
/* CM1.RESTORE_CM1 register offsets */
|
||||
#define OMAP4_CM_CLKSEL_CORE_RESTORE_OFFSET 0x0000
|
||||
#define OMAP4430_CM_CLKSEL_CORE_RESTORE OMAP44XX_CM1_REGADDR(OMAP4430_CM1_RESTORE_MOD, 0x0000)
|
||||
#define OMAP4_CM_DIV_M2_DPLL_CORE_RESTORE_OFFSET 0x0004
|
||||
#define OMAP4430_CM_DIV_M2_DPLL_CORE_RESTORE OMAP44XX_CM1_REGADDR(OMAP4430_CM1_RESTORE_MOD, 0x0004)
|
||||
#define OMAP4_CM_DIV_M3_DPLL_CORE_RESTORE_OFFSET 0x0008
|
||||
#define OMAP4430_CM_DIV_M3_DPLL_CORE_RESTORE OMAP44XX_CM1_REGADDR(OMAP4430_CM1_RESTORE_MOD, 0x0008)
|
||||
#define OMAP4_CM_DIV_M4_DPLL_CORE_RESTORE_OFFSET 0x000c
|
||||
#define OMAP4430_CM_DIV_M4_DPLL_CORE_RESTORE OMAP44XX_CM1_REGADDR(OMAP4430_CM1_RESTORE_MOD, 0x000c)
|
||||
#define OMAP4_CM_DIV_M5_DPLL_CORE_RESTORE_OFFSET 0x0010
|
||||
#define OMAP4430_CM_DIV_M5_DPLL_CORE_RESTORE OMAP44XX_CM1_REGADDR(OMAP4430_CM1_RESTORE_MOD, 0x0010)
|
||||
#define OMAP4_CM_DIV_M6_DPLL_CORE_RESTORE_OFFSET 0x0014
|
||||
#define OMAP4430_CM_DIV_M6_DPLL_CORE_RESTORE OMAP44XX_CM1_REGADDR(OMAP4430_CM1_RESTORE_MOD, 0x0014)
|
||||
#define OMAP4_CM_DIV_M7_DPLL_CORE_RESTORE_OFFSET 0x0018
|
||||
#define OMAP4430_CM_DIV_M7_DPLL_CORE_RESTORE OMAP44XX_CM1_REGADDR(OMAP4430_CM1_RESTORE_MOD, 0x0018)
|
||||
#define OMAP4_CM_CLKSEL_DPLL_CORE_RESTORE_OFFSET 0x001c
|
||||
#define OMAP4430_CM_CLKSEL_DPLL_CORE_RESTORE OMAP44XX_CM1_REGADDR(OMAP4430_CM1_RESTORE_MOD, 0x001c)
|
||||
#define OMAP4_CM_SSC_DELTAMSTEP_DPLL_CORE_RESTORE_OFFSET 0x0020
|
||||
#define OMAP4430_CM_SSC_DELTAMSTEP_DPLL_CORE_RESTORE OMAP44XX_CM1_REGADDR(OMAP4430_CM1_RESTORE_MOD, 0x0020)
|
||||
#define OMAP4_CM_SSC_MODFREQDIV_DPLL_CORE_RESTORE_OFFSET 0x0024
|
||||
#define OMAP4430_CM_SSC_MODFREQDIV_DPLL_CORE_RESTORE OMAP44XX_CM1_REGADDR(OMAP4430_CM1_RESTORE_MOD, 0x0024)
|
||||
#define OMAP4_CM_CLKMODE_DPLL_CORE_RESTORE_OFFSET 0x0028
|
||||
#define OMAP4430_CM_CLKMODE_DPLL_CORE_RESTORE OMAP44XX_CM1_REGADDR(OMAP4430_CM1_RESTORE_MOD, 0x0028)
|
||||
#define OMAP4_CM_SHADOW_FREQ_CONFIG2_RESTORE_OFFSET 0x002c
|
||||
#define OMAP4430_CM_SHADOW_FREQ_CONFIG2_RESTORE OMAP44XX_CM1_REGADDR(OMAP4430_CM1_RESTORE_MOD, 0x002c)
|
||||
#define OMAP4_CM_SHADOW_FREQ_CONFIG1_RESTORE_OFFSET 0x0030
|
||||
#define OMAP4430_CM_SHADOW_FREQ_CONFIG1_RESTORE OMAP44XX_CM1_REGADDR(OMAP4430_CM1_RESTORE_MOD, 0x0030)
|
||||
#define OMAP4_CM_AUTOIDLE_DPLL_CORE_RESTORE_OFFSET 0x0034
|
||||
#define OMAP4430_CM_AUTOIDLE_DPLL_CORE_RESTORE OMAP44XX_CM1_REGADDR(OMAP4430_CM1_RESTORE_MOD, 0x0034)
|
||||
#define OMAP4_CM_MPU_CLKSTCTRL_RESTORE_OFFSET 0x0038
|
||||
#define OMAP4430_CM_MPU_CLKSTCTRL_RESTORE OMAP44XX_CM1_REGADDR(OMAP4430_CM1_RESTORE_MOD, 0x0038)
|
||||
#define OMAP4_CM_CM1_PROFILING_CLKCTRL_RESTORE_OFFSET 0x003c
|
||||
#define OMAP4430_CM_CM1_PROFILING_CLKCTRL_RESTORE OMAP44XX_CM1_REGADDR(OMAP4430_CM1_RESTORE_MOD, 0x003c)
|
||||
#define OMAP4_CM_DYN_DEP_PRESCAL_RESTORE_OFFSET 0x0040
|
||||
#define OMAP4430_CM_DYN_DEP_PRESCAL_RESTORE OMAP44XX_CM1_REGADDR(OMAP4430_CM1_RESTORE_MOD, 0x0040)
|
||||
|
||||
/* CM2 */
|
||||
|
||||
/* CM2.OCP_SOCKET_CM2 register offsets */
|
||||
@ -252,8 +288,6 @@
|
||||
#define OMAP4430_CM_SSC_DELTAMSTEP_DPLL_PER OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CKGEN_MOD, 0x0068)
|
||||
#define OMAP4_CM_SSC_MODFREQDIV_DPLL_PER_OFFSET 0x006c
|
||||
#define OMAP4430_CM_SSC_MODFREQDIV_DPLL_PER OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CKGEN_MOD, 0x006c)
|
||||
#define OMAP4_CM_EMU_OVERRIDE_DPLL_PER_OFFSET 0x0070
|
||||
#define OMAP4430_CM_EMU_OVERRIDE_DPLL_PER OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CKGEN_MOD, 0x0070)
|
||||
#define OMAP4_CM_CLKMODE_DPLL_USB_OFFSET 0x0080
|
||||
#define OMAP4430_CM_CLKMODE_DPLL_USB OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CKGEN_MOD, 0x0080)
|
||||
#define OMAP4_CM_IDLEST_DPLL_USB_OFFSET 0x0084
|
||||
@ -296,6 +330,8 @@
|
||||
#define OMAP4430_CM_ALWON_SR_IVA_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_ALWAYS_ON_MOD, 0x0030)
|
||||
#define OMAP4_CM_ALWON_SR_CORE_CLKCTRL_OFFSET 0x0038
|
||||
#define OMAP4430_CM_ALWON_SR_CORE_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_ALWAYS_ON_MOD, 0x0038)
|
||||
#define OMAP4_CM_ALWON_USBPHY_CLKCTRL_OFFSET 0x0040
|
||||
#define OMAP4430_CM_ALWON_USBPHY_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_ALWAYS_ON_MOD, 0x0040)
|
||||
|
||||
/* CM2.CORE_CM2 register offsets */
|
||||
#define OMAP4_CM_L3_1_CLKSTCTRL_OFFSET 0x0000
|
||||
@ -578,4 +614,54 @@
|
||||
#define OMAP4430_CM_CEFUSE_CLKSTCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CEFUSE_MOD, 0x0000)
|
||||
#define OMAP4_CM_CEFUSE_CEFUSE_CLKCTRL_OFFSET 0x0020
|
||||
#define OMAP4430_CM_CEFUSE_CEFUSE_CLKCTRL OMAP44XX_CM2_REGADDR(OMAP4430_CM2_CEFUSE_MOD, 0x0020)
|
||||
|
||||
/* CM2.RESTORE_CM2 register offsets */
|
||||
#define OMAP4_CM_L3_1_CLKSTCTRL_RESTORE_OFFSET 0x0000
|
||||
#define OMAP4430_CM_L3_1_CLKSTCTRL_RESTORE OMAP44XX_CM2_REGADDR(OMAP4430_CM2_RESTORE_MOD, 0x0000)
|
||||
#define OMAP4_CM_L3_2_CLKSTCTRL_RESTORE_OFFSET 0x0004
|
||||
#define OMAP4430_CM_L3_2_CLKSTCTRL_RESTORE OMAP44XX_CM2_REGADDR(OMAP4430_CM2_RESTORE_MOD, 0x0004)
|
||||
#define OMAP4_CM_L4CFG_CLKSTCTRL_RESTORE_OFFSET 0x0008
|
||||
#define OMAP4430_CM_L4CFG_CLKSTCTRL_RESTORE OMAP44XX_CM2_REGADDR(OMAP4430_CM2_RESTORE_MOD, 0x0008)
|
||||
#define OMAP4_CM_MEMIF_CLKSTCTRL_RESTORE_OFFSET 0x000c
|
||||
#define OMAP4430_CM_MEMIF_CLKSTCTRL_RESTORE OMAP44XX_CM2_REGADDR(OMAP4430_CM2_RESTORE_MOD, 0x000c)
|
||||
#define OMAP4_CM_L4PER_CLKSTCTRL_RESTORE_OFFSET 0x0010
|
||||
#define OMAP4430_CM_L4PER_CLKSTCTRL_RESTORE OMAP44XX_CM2_REGADDR(OMAP4430_CM2_RESTORE_MOD, 0x0010)
|
||||
#define OMAP4_CM_L3INIT_CLKSTCTRL_RESTORE_OFFSET 0x0014
|
||||
#define OMAP4430_CM_L3INIT_CLKSTCTRL_RESTORE OMAP44XX_CM2_REGADDR(OMAP4430_CM2_RESTORE_MOD, 0x0014)
|
||||
#define OMAP4_CM_L3INSTR_L3_3_CLKCTRL_RESTORE_OFFSET 0x0018
|
||||
#define OMAP4430_CM_L3INSTR_L3_3_CLKCTRL_RESTORE OMAP44XX_CM2_REGADDR(OMAP4430_CM2_RESTORE_MOD, 0x0018)
|
||||
#define OMAP4_CM_L3INSTR_L3_INSTR_CLKCTRL_RESTORE_OFFSET 0x001c
|
||||
#define OMAP4430_CM_L3INSTR_L3_INSTR_CLKCTRL_RESTORE OMAP44XX_CM2_REGADDR(OMAP4430_CM2_RESTORE_MOD, 0x001c)
|
||||
#define OMAP4_CM_L3INSTR_OCP_WP1_CLKCTRL_RESTORE_OFFSET 0x0020
|
||||
#define OMAP4430_CM_L3INSTR_OCP_WP1_CLKCTRL_RESTORE OMAP44XX_CM2_REGADDR(OMAP4430_CM2_RESTORE_MOD, 0x0020)
|
||||
#define OMAP4_CM_CM2_PROFILING_CLKCTRL_RESTORE_OFFSET 0x0024
|
||||
#define OMAP4430_CM_CM2_PROFILING_CLKCTRL_RESTORE OMAP44XX_CM2_REGADDR(OMAP4430_CM2_RESTORE_MOD, 0x0024)
|
||||
#define OMAP4_CM_D2D_STATICDEP_RESTORE_OFFSET 0x0028
|
||||
#define OMAP4430_CM_D2D_STATICDEP_RESTORE OMAP44XX_CM2_REGADDR(OMAP4430_CM2_RESTORE_MOD, 0x0028)
|
||||
#define OMAP4_CM_L3_1_DYNAMICDEP_RESTORE_OFFSET 0x002c
|
||||
#define OMAP4430_CM_L3_1_DYNAMICDEP_RESTORE OMAP44XX_CM2_REGADDR(OMAP4430_CM2_RESTORE_MOD, 0x002c)
|
||||
#define OMAP4_CM_L3_2_DYNAMICDEP_RESTORE_OFFSET 0x0030
|
||||
#define OMAP4430_CM_L3_2_DYNAMICDEP_RESTORE OMAP44XX_CM2_REGADDR(OMAP4430_CM2_RESTORE_MOD, 0x0030)
|
||||
#define OMAP4_CM_D2D_DYNAMICDEP_RESTORE_OFFSET 0x0034
|
||||
#define OMAP4430_CM_D2D_DYNAMICDEP_RESTORE OMAP44XX_CM2_REGADDR(OMAP4430_CM2_RESTORE_MOD, 0x0034)
|
||||
#define OMAP4_CM_L4CFG_DYNAMICDEP_RESTORE_OFFSET 0x0038
|
||||
#define OMAP4430_CM_L4CFG_DYNAMICDEP_RESTORE OMAP44XX_CM2_REGADDR(OMAP4430_CM2_RESTORE_MOD, 0x0038)
|
||||
#define OMAP4_CM_L4PER_DYNAMICDEP_RESTORE_OFFSET 0x003c
|
||||
#define OMAP4430_CM_L4PER_DYNAMICDEP_RESTORE OMAP44XX_CM2_REGADDR(OMAP4430_CM2_RESTORE_MOD, 0x003c)
|
||||
#define OMAP4_CM_L4PER_GPIO2_CLKCTRL_RESTORE_OFFSET 0x0040
|
||||
#define OMAP4430_CM_L4PER_GPIO2_CLKCTRL_RESTORE OMAP44XX_CM2_REGADDR(OMAP4430_CM2_RESTORE_MOD, 0x0040)
|
||||
#define OMAP4_CM_L4PER_GPIO3_CLKCTRL_RESTORE_OFFSET 0x0044
|
||||
#define OMAP4430_CM_L4PER_GPIO3_CLKCTRL_RESTORE OMAP44XX_CM2_REGADDR(OMAP4430_CM2_RESTORE_MOD, 0x0044)
|
||||
#define OMAP4_CM_L4PER_GPIO4_CLKCTRL_RESTORE_OFFSET 0x0048
|
||||
#define OMAP4430_CM_L4PER_GPIO4_CLKCTRL_RESTORE OMAP44XX_CM2_REGADDR(OMAP4430_CM2_RESTORE_MOD, 0x0048)
|
||||
#define OMAP4_CM_L4PER_GPIO5_CLKCTRL_RESTORE_OFFSET 0x004c
|
||||
#define OMAP4430_CM_L4PER_GPIO5_CLKCTRL_RESTORE OMAP44XX_CM2_REGADDR(OMAP4430_CM2_RESTORE_MOD, 0x004c)
|
||||
#define OMAP4_CM_L4PER_GPIO6_CLKCTRL_RESTORE_OFFSET 0x0050
|
||||
#define OMAP4430_CM_L4PER_GPIO6_CLKCTRL_RESTORE OMAP44XX_CM2_REGADDR(OMAP4430_CM2_RESTORE_MOD, 0x0050)
|
||||
#define OMAP4_CM_L3INIT_USB_HOST_CLKCTRL_RESTORE_OFFSET 0x0054
|
||||
#define OMAP4430_CM_L3INIT_USB_HOST_CLKCTRL_RESTORE OMAP44XX_CM2_REGADDR(OMAP4430_CM2_RESTORE_MOD, 0x0054)
|
||||
#define OMAP4_CM_L3INIT_USB_TLL_CLKCTRL_RESTORE_OFFSET 0x0058
|
||||
#define OMAP4430_CM_L3INIT_USB_TLL_CLKCTRL_RESTORE OMAP44XX_CM2_REGADDR(OMAP4430_CM2_RESTORE_MOD, 0x0058)
|
||||
#define OMAP4_CM_SDMA_STATICDEP_RESTORE_OFFSET 0x005c
|
||||
#define OMAP4430_CM_SDMA_STATICDEP_RESTORE OMAP44XX_CM2_REGADDR(OMAP4430_CM2_RESTORE_MOD, 0x005c)
|
||||
#endif
|
||||
|
@ -43,7 +43,6 @@
|
||||
* using separate functional clock
|
||||
* 0x3 disabled: Module is disabled and cannot be accessed
|
||||
*
|
||||
* TODO: Need to handle module accessible in idle state
|
||||
*/
|
||||
int omap4_cm_wait_module_ready(void __iomem *clkctrl_reg)
|
||||
{
|
||||
@ -52,9 +51,11 @@ int omap4_cm_wait_module_ready(void __iomem *clkctrl_reg)
|
||||
if (!clkctrl_reg)
|
||||
return 0;
|
||||
|
||||
omap_test_timeout(((__raw_readl(clkctrl_reg) &
|
||||
OMAP4430_IDLEST_MASK) == 0),
|
||||
MAX_MODULE_READY_TIME, i);
|
||||
omap_test_timeout((
|
||||
((__raw_readl(clkctrl_reg) & OMAP4430_IDLEST_MASK) == 0) ||
|
||||
(((__raw_readl(clkctrl_reg) & OMAP4430_IDLEST_MASK) >>
|
||||
OMAP4430_IDLEST_SHIFT) == 0x2)),
|
||||
MAX_MODULE_READY_TIME, i);
|
||||
|
||||
return (i < MAX_MODULE_READY_TIME) ? 0 : -EBUSY;
|
||||
}
|
||||
|
135
arch/arm/mach-omap2/common.c
Normal file
135
arch/arm/mach-omap2/common.c
Normal file
@ -0,0 +1,135 @@
|
||||
/*
|
||||
* linux/arch/arm/mach-omap2/common.c
|
||||
*
|
||||
* Code common to all OMAP2+ machines.
|
||||
*
|
||||
* Copyright (C) 2009 Texas Instruments
|
||||
* Copyright (C) 2010 Nokia Corporation
|
||||
* Tony Lindgren <tony@atomide.com>
|
||||
* Added OMAP4 support - Santosh Shilimkar <santosh.shilimkar@ti.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/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/io.h>
|
||||
|
||||
#include <plat/common.h>
|
||||
#include <plat/board.h>
|
||||
#include <plat/mux.h>
|
||||
|
||||
#include <plat/clock.h>
|
||||
|
||||
#include "sdrc.h"
|
||||
#include "control.h"
|
||||
|
||||
/* Global address base setup code */
|
||||
|
||||
#if defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3)
|
||||
|
||||
static void __init __omap2_set_globals(struct omap_globals *omap2_globals)
|
||||
{
|
||||
omap2_set_globals_tap(omap2_globals);
|
||||
omap2_set_globals_sdrc(omap2_globals);
|
||||
omap2_set_globals_control(omap2_globals);
|
||||
omap2_set_globals_prcm(omap2_globals);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_ARCH_OMAP2420)
|
||||
|
||||
static struct omap_globals omap242x_globals = {
|
||||
.class = OMAP242X_CLASS,
|
||||
.tap = OMAP2_L4_IO_ADDRESS(0x48014000),
|
||||
.sdrc = OMAP2420_SDRC_BASE,
|
||||
.sms = OMAP2420_SMS_BASE,
|
||||
.ctrl = OMAP242X_CTRL_BASE,
|
||||
.prm = OMAP2420_PRM_BASE,
|
||||
.cm = OMAP2420_CM_BASE,
|
||||
.uart1_phys = OMAP2_UART1_BASE,
|
||||
.uart2_phys = OMAP2_UART2_BASE,
|
||||
.uart3_phys = OMAP2_UART3_BASE,
|
||||
};
|
||||
|
||||
void __init omap2_set_globals_242x(void)
|
||||
{
|
||||
__omap2_set_globals(&omap242x_globals);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_ARCH_OMAP2430)
|
||||
|
||||
static struct omap_globals omap243x_globals = {
|
||||
.class = OMAP243X_CLASS,
|
||||
.tap = OMAP2_L4_IO_ADDRESS(0x4900a000),
|
||||
.sdrc = OMAP243X_SDRC_BASE,
|
||||
.sms = OMAP243X_SMS_BASE,
|
||||
.ctrl = OMAP243X_CTRL_BASE,
|
||||
.prm = OMAP2430_PRM_BASE,
|
||||
.cm = OMAP2430_CM_BASE,
|
||||
.uart1_phys = OMAP2_UART1_BASE,
|
||||
.uart2_phys = OMAP2_UART2_BASE,
|
||||
.uart3_phys = OMAP2_UART3_BASE,
|
||||
};
|
||||
|
||||
void __init omap2_set_globals_243x(void)
|
||||
{
|
||||
__omap2_set_globals(&omap243x_globals);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_ARCH_OMAP3)
|
||||
|
||||
static struct omap_globals omap3_globals = {
|
||||
.class = OMAP343X_CLASS,
|
||||
.tap = OMAP2_L4_IO_ADDRESS(0x4830A000),
|
||||
.sdrc = OMAP343X_SDRC_BASE,
|
||||
.sms = OMAP343X_SMS_BASE,
|
||||
.ctrl = OMAP343X_CTRL_BASE,
|
||||
.prm = OMAP3430_PRM_BASE,
|
||||
.cm = OMAP3430_CM_BASE,
|
||||
.uart1_phys = OMAP3_UART1_BASE,
|
||||
.uart2_phys = OMAP3_UART2_BASE,
|
||||
.uart3_phys = OMAP3_UART3_BASE,
|
||||
.uart4_phys = OMAP3_UART4_BASE, /* Only on 3630 */
|
||||
};
|
||||
|
||||
void __init omap2_set_globals_3xxx(void)
|
||||
{
|
||||
__omap2_set_globals(&omap3_globals);
|
||||
}
|
||||
|
||||
void __init omap3_map_io(void)
|
||||
{
|
||||
omap2_set_globals_3xxx();
|
||||
omap34xx_map_common_io();
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_ARCH_OMAP4)
|
||||
static struct omap_globals omap4_globals = {
|
||||
.class = OMAP443X_CLASS,
|
||||
.tap = OMAP2_L4_IO_ADDRESS(OMAP443X_SCM_BASE),
|
||||
.ctrl = OMAP443X_SCM_BASE,
|
||||
.ctrl_pad = OMAP443X_CTRL_BASE,
|
||||
.prm = OMAP4430_PRM_BASE,
|
||||
.cm = OMAP4430_CM_BASE,
|
||||
.cm2 = OMAP4430_CM2_BASE,
|
||||
.uart1_phys = OMAP4_UART1_BASE,
|
||||
.uart2_phys = OMAP4_UART2_BASE,
|
||||
.uart3_phys = OMAP4_UART3_BASE,
|
||||
.uart4_phys = OMAP4_UART4_BASE,
|
||||
};
|
||||
|
||||
void __init omap2_set_globals_443x(void)
|
||||
{
|
||||
omap2_set_globals_tap(&omap4_globals);
|
||||
omap2_set_globals_control(&omap4_globals);
|
||||
omap2_set_globals_prcm(&omap4_globals);
|
||||
}
|
||||
#endif
|
||||
|
@ -16,15 +16,18 @@
|
||||
#include <linux/io.h>
|
||||
|
||||
#include <plat/common.h>
|
||||
#include <plat/control.h>
|
||||
#include <plat/sdrc.h>
|
||||
|
||||
#include "cm-regbits-34xx.h"
|
||||
#include "prm-regbits-34xx.h"
|
||||
#include "cm.h"
|
||||
#include "prm.h"
|
||||
#include "sdrc.h"
|
||||
#include "pm.h"
|
||||
#include "control.h"
|
||||
|
||||
static void __iomem *omap2_ctrl_base;
|
||||
static void __iomem *omap4_ctrl_pad_base;
|
||||
|
||||
#if defined(CONFIG_ARCH_OMAP3) && defined(CONFIG_PM)
|
||||
struct omap3_scratchpad {
|
||||
@ -137,6 +140,7 @@ static struct omap3_control_regs control_context;
|
||||
#endif /* CONFIG_ARCH_OMAP3 && CONFIG_PM */
|
||||
|
||||
#define OMAP_CTRL_REGADDR(reg) (omap2_ctrl_base + (reg))
|
||||
#define OMAP4_CTRL_PAD_REGADDR(reg) (omap4_ctrl_pad_base + (reg))
|
||||
|
||||
void __init omap2_set_globals_control(struct omap_globals *omap2_globals)
|
||||
{
|
||||
@ -145,6 +149,12 @@ void __init omap2_set_globals_control(struct omap_globals *omap2_globals)
|
||||
omap2_ctrl_base = ioremap(omap2_globals->ctrl, SZ_4K);
|
||||
WARN_ON(!omap2_ctrl_base);
|
||||
}
|
||||
|
||||
/* Static mapping, never released */
|
||||
if (omap2_globals->ctrl_pad) {
|
||||
omap4_ctrl_pad_base = ioremap(omap2_globals->ctrl_pad, SZ_4K);
|
||||
WARN_ON(!omap4_ctrl_pad_base);
|
||||
}
|
||||
}
|
||||
|
||||
void __iomem *omap_ctrl_base_get(void)
|
||||
@ -182,6 +192,23 @@ void omap_ctrl_writel(u32 val, u16 offset)
|
||||
__raw_writel(val, OMAP_CTRL_REGADDR(offset));
|
||||
}
|
||||
|
||||
/*
|
||||
* On OMAP4 control pad are not addressable from control
|
||||
* core base. So the common omap_ctrl_read/write APIs breaks
|
||||
* Hence export separate APIs to manage the omap4 pad control
|
||||
* registers. This APIs will work only for OMAP4
|
||||
*/
|
||||
|
||||
u32 omap4_ctrl_pad_readl(u16 offset)
|
||||
{
|
||||
return __raw_readl(OMAP4_CTRL_PAD_REGADDR(offset));
|
||||
}
|
||||
|
||||
void omap4_ctrl_pad_writel(u32 val, u16 offset)
|
||||
{
|
||||
__raw_writel(val, OMAP4_CTRL_PAD_REGADDR(offset));
|
||||
}
|
||||
|
||||
#if defined(CONFIG_ARCH_OMAP3) && defined(CONFIG_PM)
|
||||
/*
|
||||
* Clears the scratchpad contents in case of cold boot-
|
||||
@ -190,7 +217,7 @@ void omap_ctrl_writel(u32 val, u16 offset)
|
||||
void omap3_clear_scratchpad_contents(void)
|
||||
{
|
||||
u32 max_offset = OMAP343X_SCRATCHPAD_ROM_OFFSET;
|
||||
u32 *v_addr;
|
||||
void __iomem *v_addr;
|
||||
u32 offset = 0;
|
||||
v_addr = OMAP2_L4_IO_ADDRESS(OMAP343X_SCRATCHPAD_ROM);
|
||||
if (prm_read_mod_reg(OMAP3430_GR_MOD, OMAP3_PRM_RSTST_OFFSET) &
|
||||
@ -206,7 +233,7 @@ void omap3_clear_scratchpad_contents(void)
|
||||
/* Populate the scratchpad structure with restore structure */
|
||||
void omap3_save_scratchpad_contents(void)
|
||||
{
|
||||
void * __iomem scratchpad_address;
|
||||
void __iomem *scratchpad_address;
|
||||
u32 arm_context_addr;
|
||||
struct omap3_scratchpad scratchpad_contents;
|
||||
struct omap3_scratchpad_prcm_block prcm_block_contents;
|
||||
|
@ -1,10 +1,10 @@
|
||||
/*
|
||||
* arch/arm/plat-omap/include/mach/control.h
|
||||
* arch/arm/mach-omap2/control.h
|
||||
*
|
||||
* OMAP2/3/4 System Control Module definitions
|
||||
*
|
||||
* Copyright (C) 2007-2009 Texas Instruments, Inc.
|
||||
* Copyright (C) 2007-2008 Nokia Corporation
|
||||
* Copyright (C) 2007-2010 Texas Instruments, Inc.
|
||||
* Copyright (C) 2007-2008, 2010 Nokia Corporation
|
||||
*
|
||||
* Written by Paul Walmsley
|
||||
*
|
||||
@ -13,10 +13,14 @@
|
||||
* the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#ifndef __ASM_ARCH_CONTROL_H
|
||||
#define __ASM_ARCH_CONTROL_H
|
||||
#ifndef __ARCH_ARM_MACH_OMAP2_CONTROL_H
|
||||
#define __ARCH_ARM_MACH_OMAP2_CONTROL_H
|
||||
|
||||
#include <mach/io.h>
|
||||
#include <mach/ctrl_module_core_44xx.h>
|
||||
#include <mach/ctrl_module_wkup_44xx.h>
|
||||
#include <mach/ctrl_module_pad_core_44xx.h>
|
||||
#include <mach/ctrl_module_pad_wkup_44xx.h>
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
#define OMAP242X_CTRL_REGADDR(reg) \
|
||||
@ -204,12 +208,6 @@
|
||||
#define OMAP3_PADCONF_SAD2D_MSTANDBY 0x250
|
||||
#define OMAP3_PADCONF_SAD2D_IDLEACK 0x254
|
||||
|
||||
/* 44xx control status register offset */
|
||||
#define OMAP44XX_CONTROL_STATUS 0x2c4
|
||||
|
||||
/* 44xx-only CONTROL_GENERAL register offsets */
|
||||
#define OMAP44XX_CONTROL_MMC1 0x628
|
||||
#define OMAP44XX_CONTROL_PBIAS_LITE 0x600
|
||||
/*
|
||||
* REVISIT: This list of registers is not comprehensive - there are more
|
||||
* that should be added.
|
||||
@ -225,6 +223,8 @@
|
||||
#define OMAP2_MMCSDIO1ADPCLKISEL (1 << 24) /* MMC1 loop back clock */
|
||||
#define OMAP24XX_USBSTANDBYCTRL (1 << 15)
|
||||
#define OMAP2_MCBSP2_CLKS_MASK (1 << 6)
|
||||
#define OMAP2_MCBSP1_FSR_MASK (1 << 4)
|
||||
#define OMAP2_MCBSP1_CLKR_MASK (1 << 3)
|
||||
#define OMAP2_MCBSP1_CLKS_MASK (1 << 2)
|
||||
|
||||
/* CONTROL_DEVCONF1 bits */
|
||||
@ -255,23 +255,6 @@
|
||||
#define OMAP2_PBIASLITEPWRDNZ0 (1 << 1)
|
||||
#define OMAP2_PBIASLITEVMODE0 (1 << 0)
|
||||
|
||||
/* CONTROL_PBIAS_LITE bits for OMAP4 */
|
||||
#define OMAP4_MMC1_PWRDNZ (1 << 26)
|
||||
#define OMAP4_MMC1_PBIASLITE_HIZ_MODE (1 << 25)
|
||||
#define OMAP4_MMC1_PBIASLITE_SUPPLY_HI_OUT (1 << 24)
|
||||
#define OMAP4_MMC1_PBIASLITE_VMODE_ERROR (1 << 23)
|
||||
#define OMAP4_MMC1_PBIASLITE_PWRDNZ (1 << 22)
|
||||
#define OMAP4_MMC1_PBIASLITE_VMODE (1 << 21)
|
||||
#define OMAP4_USBC1_ICUSB_PWRDNZ (1 << 20)
|
||||
|
||||
#define OMAP4_CONTROL_SDMMC1_PUSTRENGTHGRP0 (1 << 31)
|
||||
#define OMAP4_CONTROL_SDMMC1_PUSTRENGTHGRP1 (1 << 30)
|
||||
#define OMAP4_CONTROL_SDMMC1_PUSTRENGTHGRP2 (1 << 29)
|
||||
#define OMAP4_CONTROL_SDMMC1_PUSTRENGTHGRP3 (1 << 28)
|
||||
#define OMAP4_CONTROL_SDMMC1_DR0_SPEEDCTRL (1 << 27)
|
||||
#define OMAP4_CONTROL_SDMMC1_DR1_SPEEDCTRL (1 << 26)
|
||||
#define OMAP4_CONTROL_SDMMC1_DR2_SPEEDCTRL (1 << 25)
|
||||
|
||||
/* CONTROL_PROG_IO1 bits */
|
||||
#define OMAP3630_PRG_SDMMC1_SPEEDCTRL (1 << 20)
|
||||
|
||||
@ -338,12 +321,12 @@
|
||||
#define FEAT_L2CACHE_256KB 3
|
||||
|
||||
#define OMAP3_ISP_SHIFT 5
|
||||
#define OMAP3_ISP_MASK (1<< OMAP3_ISP_SHIFT)
|
||||
#define OMAP3_ISP_MASK (1 << OMAP3_ISP_SHIFT)
|
||||
#define FEAT_ISP 0
|
||||
#define FEAT_ISP_NONE 1
|
||||
|
||||
#define OMAP3_NEON_SHIFT 4
|
||||
#define OMAP3_NEON_MASK (1<< OMAP3_NEON_SHIFT)
|
||||
#define OMAP3_NEON_MASK (1 << OMAP3_NEON_SHIFT)
|
||||
#define FEAT_NEON 0
|
||||
#define FEAT_NEON_NONE 1
|
||||
|
||||
@ -354,9 +337,11 @@ extern void __iomem *omap_ctrl_base_get(void);
|
||||
extern u8 omap_ctrl_readb(u16 offset);
|
||||
extern u16 omap_ctrl_readw(u16 offset);
|
||||
extern u32 omap_ctrl_readl(u16 offset);
|
||||
extern u32 omap4_ctrl_pad_readl(u16 offset);
|
||||
extern void omap_ctrl_writeb(u8 val, u16 offset);
|
||||
extern void omap_ctrl_writew(u16 val, u16 offset);
|
||||
extern void omap_ctrl_writel(u32 val, u16 offset);
|
||||
extern void omap4_ctrl_pad_writel(u32 val, u16 offset);
|
||||
|
||||
extern void omap3_save_scratchpad_contents(void);
|
||||
extern void omap3_clear_scratchpad_contents(void);
|
||||
@ -371,11 +356,13 @@ extern void omap3_control_restore_context(void);
|
||||
#define omap_ctrl_readb(x) 0
|
||||
#define omap_ctrl_readw(x) 0
|
||||
#define omap_ctrl_readl(x) 0
|
||||
#define omap4_ctrl_pad_readl(x) 0
|
||||
#define omap_ctrl_writeb(x, y) WARN_ON(1)
|
||||
#define omap_ctrl_writew(x, y) WARN_ON(1)
|
||||
#define omap_ctrl_writel(x, y) WARN_ON(1)
|
||||
#define omap4_ctrl_pad_writel(x, y) WARN_ON(1)
|
||||
#endif
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
||||
#endif /* __ASM_ARCH_CONTROL_H */
|
||||
#endif /* __ARCH_ARM_MACH_OMAP2_CONTROL_H */
|
||||
|
@ -29,10 +29,10 @@
|
||||
#include <plat/irqs.h>
|
||||
#include <plat/powerdomain.h>
|
||||
#include <plat/clockdomain.h>
|
||||
#include <plat/control.h>
|
||||
#include <plat/serial.h>
|
||||
|
||||
#include "pm.h"
|
||||
#include "control.h"
|
||||
|
||||
#ifdef CONFIG_CPU_IDLE
|
||||
|
||||
@ -60,7 +60,8 @@ struct omap3_processor_cx {
|
||||
|
||||
struct omap3_processor_cx omap3_power_states[OMAP3_MAX_STATES];
|
||||
struct omap3_processor_cx current_cx_state;
|
||||
struct powerdomain *mpu_pd, *core_pd;
|
||||
struct powerdomain *mpu_pd, *core_pd, *per_pd;
|
||||
struct powerdomain *cam_pd;
|
||||
|
||||
/*
|
||||
* The latencies/thresholds for various C states have
|
||||
@ -233,14 +234,60 @@ static int omap3_enter_idle_bm(struct cpuidle_device *dev,
|
||||
struct cpuidle_state *state)
|
||||
{
|
||||
struct cpuidle_state *new_state = next_valid_state(dev, state);
|
||||
u32 core_next_state, per_next_state = 0, per_saved_state = 0;
|
||||
u32 cam_state;
|
||||
struct omap3_processor_cx *cx;
|
||||
int ret;
|
||||
|
||||
if ((state->flags & CPUIDLE_FLAG_CHECK_BM) && omap3_idle_bm_check()) {
|
||||
BUG_ON(!dev->safe_state);
|
||||
new_state = dev->safe_state;
|
||||
goto select_state;
|
||||
}
|
||||
|
||||
cx = cpuidle_get_statedata(state);
|
||||
core_next_state = cx->core_state;
|
||||
|
||||
/*
|
||||
* FIXME: we currently manage device-specific idle states
|
||||
* for PER and CORE in combination with CPU-specific
|
||||
* idle states. This is wrong, and device-specific
|
||||
* idle managment needs to be separated out into
|
||||
* its own code.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Prevent idle completely if CAM is active.
|
||||
* CAM does not have wakeup capability in OMAP3.
|
||||
*/
|
||||
cam_state = pwrdm_read_pwrst(cam_pd);
|
||||
if (cam_state == PWRDM_POWER_ON) {
|
||||
new_state = dev->safe_state;
|
||||
goto select_state;
|
||||
}
|
||||
|
||||
/*
|
||||
* Prevent PER off if CORE is not in retention or off as this
|
||||
* would disable PER wakeups completely.
|
||||
*/
|
||||
per_next_state = per_saved_state = pwrdm_read_next_pwrst(per_pd);
|
||||
if ((per_next_state == PWRDM_POWER_OFF) &&
|
||||
(core_next_state > PWRDM_POWER_RET))
|
||||
per_next_state = PWRDM_POWER_RET;
|
||||
|
||||
/* Are we changing PER target state? */
|
||||
if (per_next_state != per_saved_state)
|
||||
pwrdm_set_next_pwrst(per_pd, per_next_state);
|
||||
|
||||
select_state:
|
||||
dev->last_state = new_state;
|
||||
return omap3_enter_idle(dev, new_state);
|
||||
ret = omap3_enter_idle(dev, new_state);
|
||||
|
||||
/* Restore original PER state if it was modified */
|
||||
if (per_next_state != per_saved_state)
|
||||
pwrdm_set_next_pwrst(per_pd, per_saved_state);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
DEFINE_PER_CPU(struct cpuidle_device, omap3_idle_dev);
|
||||
@ -328,7 +375,8 @@ void omap_init_power_states(void)
|
||||
cpuidle_params_table[OMAP3_STATE_C2].threshold;
|
||||
omap3_power_states[OMAP3_STATE_C2].mpu_state = PWRDM_POWER_ON;
|
||||
omap3_power_states[OMAP3_STATE_C2].core_state = PWRDM_POWER_ON;
|
||||
omap3_power_states[OMAP3_STATE_C2].flags = CPUIDLE_FLAG_TIME_VALID;
|
||||
omap3_power_states[OMAP3_STATE_C2].flags = CPUIDLE_FLAG_TIME_VALID |
|
||||
CPUIDLE_FLAG_CHECK_BM;
|
||||
|
||||
/* C3 . MPU CSWR + Core inactive */
|
||||
omap3_power_states[OMAP3_STATE_C3].valid =
|
||||
@ -426,6 +474,8 @@ int __init omap3_idle_init(void)
|
||||
|
||||
mpu_pd = pwrdm_lookup("mpu_pwrdm");
|
||||
core_pd = pwrdm_lookup("core_pwrdm");
|
||||
per_pd = pwrdm_lookup("per_pwrdm");
|
||||
cam_pd = pwrdm_lookup("cam_pwrdm");
|
||||
|
||||
omap_init_power_states();
|
||||
cpuidle_register_driver(&omap3_idle_driver);
|
||||
|
@ -9,12 +9,12 @@
|
||||
* (at your option) any later version.
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/err.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/irqs.h>
|
||||
@ -22,15 +22,17 @@
|
||||
#include <asm/mach/map.h>
|
||||
#include <asm/pmu.h>
|
||||
|
||||
#include <plat/control.h>
|
||||
#include <plat/tc.h>
|
||||
#include <plat/board.h>
|
||||
#include <plat/mcbsp.h>
|
||||
#include <mach/gpio.h>
|
||||
#include <plat/mmc.h>
|
||||
#include <plat/dma.h>
|
||||
#include <plat/omap_hwmod.h>
|
||||
#include <plat/omap_device.h>
|
||||
|
||||
#include "mux.h"
|
||||
#include "control.h"
|
||||
|
||||
#if defined(CONFIG_VIDEO_OMAP2) || defined(CONFIG_VIDEO_OMAP2_MODULE)
|
||||
|
||||
@ -538,7 +540,7 @@ static inline void omap_init_sham(void) { }
|
||||
|
||||
#if defined(CONFIG_CRYPTO_DEV_OMAP_AES) || defined(CONFIG_CRYPTO_DEV_OMAP_AES_MODULE)
|
||||
|
||||
#ifdef CONFIG_ARCH_OMAP24XX
|
||||
#ifdef CONFIG_ARCH_OMAP2
|
||||
static struct resource omap2_aes_resources[] = {
|
||||
{
|
||||
.start = OMAP24XX_SEC_AES_BASE,
|
||||
@ -560,7 +562,7 @@ static int omap2_aes_resources_sz = ARRAY_SIZE(omap2_aes_resources);
|
||||
#define omap2_aes_resources_sz 0
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_ARCH_OMAP34XX
|
||||
#ifdef CONFIG_ARCH_OMAP3
|
||||
static struct resource omap3_aes_resources[] = {
|
||||
{
|
||||
.start = OMAP34XX_SEC_AES_BASE,
|
||||
@ -732,7 +734,7 @@ static inline void omap2_mmc_mux(struct omap_mmc_platform_data *mmc_controller,
|
||||
omap_mux_init_signal("sdmmc_dat0", 0);
|
||||
omap_mux_init_signal("sdmmc_dat_dir0", 0);
|
||||
omap_mux_init_signal("sdmmc_cmd_dir", 0);
|
||||
if (mmc_controller->slots[0].wires == 4) {
|
||||
if (mmc_controller->slots[0].caps & MMC_CAP_4_BIT_DATA) {
|
||||
omap_mux_init_signal("sdmmc_dat1", 0);
|
||||
omap_mux_init_signal("sdmmc_dat2", 0);
|
||||
omap_mux_init_signal("sdmmc_dat3", 0);
|
||||
@ -760,8 +762,8 @@ static inline void omap2_mmc_mux(struct omap_mmc_platform_data *mmc_controller,
|
||||
OMAP_PIN_INPUT_PULLUP);
|
||||
omap_mux_init_signal("sdmmc1_dat0",
|
||||
OMAP_PIN_INPUT_PULLUP);
|
||||
if (mmc_controller->slots[0].wires == 4 ||
|
||||
mmc_controller->slots[0].wires == 8) {
|
||||
if (mmc_controller->slots[0].caps &
|
||||
(MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA)) {
|
||||
omap_mux_init_signal("sdmmc1_dat1",
|
||||
OMAP_PIN_INPUT_PULLUP);
|
||||
omap_mux_init_signal("sdmmc1_dat2",
|
||||
@ -769,7 +771,8 @@ static inline void omap2_mmc_mux(struct omap_mmc_platform_data *mmc_controller,
|
||||
omap_mux_init_signal("sdmmc1_dat3",
|
||||
OMAP_PIN_INPUT_PULLUP);
|
||||
}
|
||||
if (mmc_controller->slots[0].wires == 8) {
|
||||
if (mmc_controller->slots[0].caps &
|
||||
MMC_CAP_8_BIT_DATA) {
|
||||
omap_mux_init_signal("sdmmc1_dat4",
|
||||
OMAP_PIN_INPUT_PULLUP);
|
||||
omap_mux_init_signal("sdmmc1_dat5",
|
||||
@ -793,8 +796,8 @@ static inline void omap2_mmc_mux(struct omap_mmc_platform_data *mmc_controller,
|
||||
* For 8 wire configurations, Lines DAT4, 5, 6 and 7 need to be muxed
|
||||
* in the board-*.c files
|
||||
*/
|
||||
if (mmc_controller->slots[0].wires == 4 ||
|
||||
mmc_controller->slots[0].wires == 8) {
|
||||
if (mmc_controller->slots[0].caps &
|
||||
(MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA)) {
|
||||
omap_mux_init_signal("sdmmc2_dat1",
|
||||
OMAP_PIN_INPUT_PULLUP);
|
||||
omap_mux_init_signal("sdmmc2_dat2",
|
||||
@ -802,7 +805,8 @@ static inline void omap2_mmc_mux(struct omap_mmc_platform_data *mmc_controller,
|
||||
omap_mux_init_signal("sdmmc2_dat3",
|
||||
OMAP_PIN_INPUT_PULLUP);
|
||||
}
|
||||
if (mmc_controller->slots[0].wires == 8) {
|
||||
if (mmc_controller->slots[0].caps &
|
||||
MMC_CAP_8_BIT_DATA) {
|
||||
omap_mux_init_signal("sdmmc2_dat4.sdmmc2_dat4",
|
||||
OMAP_PIN_INPUT_PULLUP);
|
||||
omap_mux_init_signal("sdmmc2_dat5.sdmmc2_dat5",
|
||||
@ -853,13 +857,13 @@ void __init omap2_init_mmc(struct omap_mmc_platform_data **mmc_data,
|
||||
case 3:
|
||||
if (!cpu_is_omap44xx())
|
||||
return;
|
||||
base = OMAP4_MMC4_BASE + OMAP4_MMC_REG_OFFSET;
|
||||
base = OMAP4_MMC4_BASE;
|
||||
irq = OMAP44XX_IRQ_MMC4;
|
||||
break;
|
||||
case 4:
|
||||
if (!cpu_is_omap44xx())
|
||||
return;
|
||||
base = OMAP4_MMC5_BASE + OMAP4_MMC_REG_OFFSET;
|
||||
base = OMAP4_MMC5_BASE;
|
||||
irq = OMAP44XX_IRQ_MMC5;
|
||||
break;
|
||||
default:
|
||||
@ -870,10 +874,8 @@ void __init omap2_init_mmc(struct omap_mmc_platform_data **mmc_data,
|
||||
size = OMAP2420_MMC_SIZE;
|
||||
name = "mmci-omap";
|
||||
} else if (cpu_is_omap44xx()) {
|
||||
if (i < 3) {
|
||||
base += OMAP4_MMC_REG_OFFSET;
|
||||
if (i < 3)
|
||||
irq += OMAP44XX_IRQ_GIC_START;
|
||||
}
|
||||
size = OMAP4_HSMMC_SIZE;
|
||||
name = "mmci-omap-hs";
|
||||
} else {
|
||||
@ -949,11 +951,72 @@ static inline void omap_init_vout(void) {}
|
||||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
|
||||
/*
|
||||
* Inorder to avoid any assumptions from bootloader regarding WDT
|
||||
* settings, WDT module is reset during init. This enables the watchdog
|
||||
* timer. Hence it is required to disable the watchdog after the WDT reset
|
||||
* during init. Otherwise the system would reboot as per the default
|
||||
* watchdog timer registers settings.
|
||||
*/
|
||||
#define OMAP_WDT_WPS (0x34)
|
||||
#define OMAP_WDT_SPR (0x48)
|
||||
|
||||
static int omap2_disable_wdt(struct omap_hwmod *oh, void *unused)
|
||||
{
|
||||
void __iomem *base;
|
||||
int ret;
|
||||
|
||||
if (!oh) {
|
||||
pr_err("%s: Could not look up wdtimer_hwmod\n", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
base = omap_hwmod_get_mpu_rt_va(oh);
|
||||
if (!base) {
|
||||
pr_err("%s: Could not get the base address for %s\n",
|
||||
oh->name, __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* Enable the clocks before accessing the WDT registers */
|
||||
ret = omap_hwmod_enable(oh);
|
||||
if (ret) {
|
||||
pr_err("%s: Could not enable clocks for %s\n",
|
||||
oh->name, __func__);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* sequence required to disable watchdog */
|
||||
__raw_writel(0xAAAA, base + OMAP_WDT_SPR);
|
||||
while (__raw_readl(base + OMAP_WDT_WPS) & 0x10)
|
||||
cpu_relax();
|
||||
|
||||
__raw_writel(0x5555, base + OMAP_WDT_SPR);
|
||||
while (__raw_readl(base + OMAP_WDT_WPS) & 0x10)
|
||||
cpu_relax();
|
||||
|
||||
ret = omap_hwmod_idle(oh);
|
||||
if (ret)
|
||||
pr_err("%s: Could not disable clocks for %s\n",
|
||||
oh->name, __func__);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void __init omap_disable_wdt(void)
|
||||
{
|
||||
if (cpu_class_is_omap2())
|
||||
omap_hwmod_for_each_by_class("wd_timer",
|
||||
omap2_disable_wdt, NULL);
|
||||
return;
|
||||
}
|
||||
|
||||
static int __init omap2_init_devices(void)
|
||||
{
|
||||
/* please keep these calls, and their implementations above,
|
||||
* in alphabetical order so they're easier to sort through.
|
||||
*/
|
||||
omap_disable_wdt();
|
||||
omap_hsmmc_reset();
|
||||
omap_init_audio();
|
||||
omap_init_camera();
|
||||
@ -969,3 +1032,39 @@ static int __init omap2_init_devices(void)
|
||||
return 0;
|
||||
}
|
||||
arch_initcall(omap2_init_devices);
|
||||
|
||||
#if defined(CONFIG_OMAP_WATCHDOG) || defined(CONFIG_OMAP_WATCHDOG_MODULE)
|
||||
struct omap_device_pm_latency omap_wdt_latency[] = {
|
||||
[0] = {
|
||||
.deactivate_func = omap_device_idle_hwmods,
|
||||
.activate_func = omap_device_enable_hwmods,
|
||||
.flags = OMAP_DEVICE_LATENCY_AUTO_ADJUST,
|
||||
},
|
||||
};
|
||||
|
||||
static int __init omap_init_wdt(void)
|
||||
{
|
||||
int id = -1;
|
||||
struct omap_device *od;
|
||||
struct omap_hwmod *oh;
|
||||
char *oh_name = "wd_timer2";
|
||||
char *dev_name = "omap_wdt";
|
||||
|
||||
if (!cpu_class_is_omap2())
|
||||
return 0;
|
||||
|
||||
oh = omap_hwmod_lookup(oh_name);
|
||||
if (!oh) {
|
||||
pr_err("Could not look up wd_timer%d hwmod\n", id);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
od = omap_device_build(dev_name, id, oh, NULL, 0,
|
||||
omap_wdt_latency,
|
||||
ARRAY_SIZE(omap_wdt_latency), 0);
|
||||
WARN(IS_ERR(od), "Cant build omap_device for %s:%s.\n",
|
||||
dev_name, oh->name);
|
||||
return 0;
|
||||
}
|
||||
subsys_initcall(omap_init_wdt);
|
||||
#endif
|
||||
|
113
arch/arm/mach-omap2/gpmc-smsc911x.c
Normal file
113
arch/arm/mach-omap2/gpmc-smsc911x.c
Normal file
@ -0,0 +1,113 @@
|
||||
/*
|
||||
* linux/arch/arm/mach-omap2/gpmc-smsc911x.c
|
||||
*
|
||||
* Copyright (C) 2009 Li-Pro.Net
|
||||
* Stephan Linz <linz@li-pro.net>
|
||||
*
|
||||
* Modified from linux/arch/arm/mach-omap2/gpmc-smc91x.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/platform_device.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/smsc911x.h>
|
||||
|
||||
#include <plat/board.h>
|
||||
#include <plat/gpmc.h>
|
||||
#include <plat/gpmc-smsc911x.h>
|
||||
|
||||
static struct omap_smsc911x_platform_data *gpmc_cfg;
|
||||
|
||||
static struct resource gpmc_smsc911x_resources[] = {
|
||||
[0] = {
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct smsc911x_platform_config gpmc_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_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,
|
||||
* or in the bootloader.
|
||||
*/
|
||||
void __init gpmc_smsc911x_init(struct omap_smsc911x_platform_data *board_data)
|
||||
{
|
||||
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");
|
||||
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);
|
||||
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");
|
||||
if (ret) {
|
||||
printk(KERN_ERR "Failed to request GPIO%d for smsc911x reset\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");
|
||||
gpio_free(gpmc_cfg->gpio_reset);
|
||||
goto free2;
|
||||
}
|
||||
|
||||
return;
|
||||
|
||||
free2:
|
||||
gpio_free(gpmc_cfg->gpio_irq);
|
||||
free1:
|
||||
gpmc_cs_free(gpmc_cfg->cs);
|
||||
|
||||
printk(KERN_ERR "Could not initialize smsc911x\n");
|
||||
}
|
@ -14,11 +14,11 @@
|
||||
#include <linux/string.h>
|
||||
#include <linux/delay.h>
|
||||
#include <mach/hardware.h>
|
||||
#include <plat/control.h>
|
||||
#include <plat/mmc.h>
|
||||
#include <plat/omap-pm.h>
|
||||
|
||||
#include "hsmmc.h"
|
||||
#include "control.h"
|
||||
|
||||
#if defined(CONFIG_MMC_OMAP_HS) || defined(CONFIG_MMC_OMAP_HS_MODULE)
|
||||
|
||||
@ -135,10 +135,11 @@ static void omap4_hsmmc1_before_set_reg(struct device *dev, int slot,
|
||||
*
|
||||
* FIXME handle VMMC1A as needed ...
|
||||
*/
|
||||
reg = omap_ctrl_readl(control_pbias_offset);
|
||||
reg &= ~(OMAP4_MMC1_PBIASLITE_PWRDNZ | OMAP4_MMC1_PWRDNZ |
|
||||
OMAP4_USBC1_ICUSB_PWRDNZ);
|
||||
omap_ctrl_writel(reg, control_pbias_offset);
|
||||
reg = omap4_ctrl_pad_readl(control_pbias_offset);
|
||||
reg &= ~(OMAP4_MMC1_PBIASLITE_PWRDNZ_MASK |
|
||||
OMAP4_MMC1_PWRDNZ_MASK |
|
||||
OMAP4_USBC1_ICUSB_PWRDNZ_MASK);
|
||||
omap4_ctrl_pad_writel(reg, control_pbias_offset);
|
||||
}
|
||||
|
||||
static void omap4_hsmmc1_after_set_reg(struct device *dev, int slot,
|
||||
@ -147,30 +148,33 @@ static void omap4_hsmmc1_after_set_reg(struct device *dev, int slot,
|
||||
u32 reg;
|
||||
|
||||
if (power_on) {
|
||||
reg = omap_ctrl_readl(control_pbias_offset);
|
||||
reg |= OMAP4_MMC1_PBIASLITE_PWRDNZ;
|
||||
reg = omap4_ctrl_pad_readl(control_pbias_offset);
|
||||
reg |= OMAP4_MMC1_PBIASLITE_PWRDNZ_MASK;
|
||||
if ((1 << vdd) <= MMC_VDD_165_195)
|
||||
reg &= ~OMAP4_MMC1_PBIASLITE_VMODE;
|
||||
reg &= ~OMAP4_MMC1_PBIASLITE_VMODE_MASK;
|
||||
else
|
||||
reg |= OMAP4_MMC1_PBIASLITE_VMODE;
|
||||
reg |= (OMAP4_MMC1_PBIASLITE_PWRDNZ | OMAP4_MMC1_PWRDNZ |
|
||||
OMAP4_USBC1_ICUSB_PWRDNZ);
|
||||
omap_ctrl_writel(reg, control_pbias_offset);
|
||||
reg |= OMAP4_MMC1_PBIASLITE_VMODE_MASK;
|
||||
reg |= (OMAP4_MMC1_PBIASLITE_PWRDNZ_MASK |
|
||||
OMAP4_MMC1_PWRDNZ_MASK |
|
||||
OMAP4_USBC1_ICUSB_PWRDNZ_MASK);
|
||||
omap4_ctrl_pad_writel(reg, control_pbias_offset);
|
||||
/* 4 microsec delay for comparator to generate an error*/
|
||||
udelay(4);
|
||||
reg = omap_ctrl_readl(control_pbias_offset);
|
||||
if (reg & OMAP4_MMC1_PBIASLITE_VMODE_ERROR) {
|
||||
reg = omap4_ctrl_pad_readl(control_pbias_offset);
|
||||
if (reg & OMAP4_MMC1_PBIASLITE_VMODE_ERROR_MASK) {
|
||||
pr_err("Pbias Voltage is not same as LDO\n");
|
||||
/* Caution : On VMODE_ERROR Power Down MMC IO */
|
||||
reg &= ~(OMAP4_MMC1_PWRDNZ | OMAP4_USBC1_ICUSB_PWRDNZ);
|
||||
omap_ctrl_writel(reg, control_pbias_offset);
|
||||
reg &= ~(OMAP4_MMC1_PWRDNZ_MASK |
|
||||
OMAP4_USBC1_ICUSB_PWRDNZ_MASK);
|
||||
omap4_ctrl_pad_writel(reg, control_pbias_offset);
|
||||
}
|
||||
} else {
|
||||
reg = omap_ctrl_readl(control_pbias_offset);
|
||||
reg |= (OMAP4_MMC1_PBIASLITE_PWRDNZ |
|
||||
OMAP4_MMC1_PBIASLITE_VMODE | OMAP4_MMC1_PWRDNZ |
|
||||
OMAP4_USBC1_ICUSB_PWRDNZ);
|
||||
omap_ctrl_writel(reg, control_pbias_offset);
|
||||
reg = omap4_ctrl_pad_readl(control_pbias_offset);
|
||||
reg |= (OMAP4_MMC1_PBIASLITE_PWRDNZ_MASK |
|
||||
OMAP4_MMC1_PWRDNZ_MASK |
|
||||
OMAP4_MMC1_PBIASLITE_VMODE_MASK |
|
||||
OMAP4_USBC1_ICUSB_PWRDNZ_MASK);
|
||||
omap4_ctrl_pad_writel(reg, control_pbias_offset);
|
||||
}
|
||||
}
|
||||
|
||||
@ -218,17 +222,18 @@ void __init omap2_hsmmc_init(struct omap2_hsmmc_info *controllers)
|
||||
control_devconf1_offset = OMAP343X_CONTROL_DEVCONF1;
|
||||
}
|
||||
} else {
|
||||
control_pbias_offset = OMAP44XX_CONTROL_PBIAS_LITE;
|
||||
control_mmc1 = OMAP44XX_CONTROL_MMC1;
|
||||
reg = omap_ctrl_readl(control_mmc1);
|
||||
reg |= (OMAP4_CONTROL_SDMMC1_PUSTRENGTHGRP0 |
|
||||
OMAP4_CONTROL_SDMMC1_PUSTRENGTHGRP1);
|
||||
reg &= ~(OMAP4_CONTROL_SDMMC1_PUSTRENGTHGRP2 |
|
||||
OMAP4_CONTROL_SDMMC1_PUSTRENGTHGRP3);
|
||||
reg |= (OMAP4_CONTROL_SDMMC1_DR0_SPEEDCTRL |
|
||||
OMAP4_CONTROL_SDMMC1_DR1_SPEEDCTRL |
|
||||
OMAP4_CONTROL_SDMMC1_DR2_SPEEDCTRL);
|
||||
omap_ctrl_writel(reg, control_mmc1);
|
||||
control_pbias_offset =
|
||||
OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_PBIASLITE;
|
||||
control_mmc1 = OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_MMC1;
|
||||
reg = omap4_ctrl_pad_readl(control_mmc1);
|
||||
reg |= (OMAP4_SDMMC1_PUSTRENGTH_GRP0_MASK |
|
||||
OMAP4_SDMMC1_PUSTRENGTH_GRP1_MASK);
|
||||
reg &= ~(OMAP4_SDMMC1_PUSTRENGTH_GRP2_MASK |
|
||||
OMAP4_SDMMC1_PUSTRENGTH_GRP3_MASK);
|
||||
reg |= (OMAP4_USBC1_DR0_SPEEDCTRL_MASK|
|
||||
OMAP4_SDMMC1_DR1_SPEEDCTRL_MASK |
|
||||
OMAP4_SDMMC1_DR2_SPEEDCTRL_MASK);
|
||||
omap4_ctrl_pad_writel(reg, control_mmc1);
|
||||
}
|
||||
|
||||
for (c = controllers; c->mmc; c++) {
|
||||
@ -258,9 +263,13 @@ void __init omap2_hsmmc_init(struct omap2_hsmmc_info *controllers)
|
||||
"mmc%islot%i", c->mmc, 1);
|
||||
mmc->slots[0].name = hc->name;
|
||||
mmc->nr_slots = 1;
|
||||
mmc->slots[0].wires = c->wires;
|
||||
mmc->slots[0].caps = c->caps;
|
||||
mmc->slots[0].internal_clock = !c->ext_clock;
|
||||
mmc->dma_mask = 0xffffffff;
|
||||
if (cpu_is_omap44xx())
|
||||
mmc->reg_offset = OMAP4_MMC_REG_OFFSET;
|
||||
else
|
||||
mmc->reg_offset = 0;
|
||||
|
||||
mmc->get_context_loss_count = hsmmc_get_context_loss;
|
||||
|
||||
@ -298,6 +307,9 @@ void __init omap2_hsmmc_init(struct omap2_hsmmc_info *controllers)
|
||||
else
|
||||
mmc->slots[0].features |= HSMMC_HAS_PBIAS;
|
||||
|
||||
if (cpu_is_omap44xx() && (omap_rev() > OMAP4430_REV_ES1_0))
|
||||
mmc->slots[0].features |= HSMMC_HAS_UPDATED_RESET;
|
||||
|
||||
switch (c->mmc) {
|
||||
case 1:
|
||||
if (mmc->slots[0].features & HSMMC_HAS_PBIAS) {
|
||||
@ -316,16 +328,20 @@ void __init omap2_hsmmc_init(struct omap2_hsmmc_info *controllers)
|
||||
}
|
||||
|
||||
/* Omap3630 HSMMC1 supports only 4-bit */
|
||||
if (cpu_is_omap3630() && c->wires > 4) {
|
||||
c->wires = 4;
|
||||
mmc->slots[0].wires = c->wires;
|
||||
if (cpu_is_omap3630() &&
|
||||
(c->caps & MMC_CAP_8_BIT_DATA)) {
|
||||
c->caps &= ~MMC_CAP_8_BIT_DATA;
|
||||
c->caps |= MMC_CAP_4_BIT_DATA;
|
||||
mmc->slots[0].caps = c->caps;
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
if (c->ext_clock)
|
||||
c->transceiver = 1;
|
||||
if (c->transceiver && c->wires > 4)
|
||||
c->wires = 4;
|
||||
if (c->transceiver && (c->caps & MMC_CAP_8_BIT_DATA)) {
|
||||
c->caps &= ~MMC_CAP_8_BIT_DATA;
|
||||
c->caps |= MMC_CAP_4_BIT_DATA;
|
||||
}
|
||||
/* FALLTHROUGH */
|
||||
case 3:
|
||||
if (mmc->slots[0].features & HSMMC_HAS_PBIAS) {
|
||||
|
@ -10,7 +10,8 @@ struct mmc_card;
|
||||
|
||||
struct omap2_hsmmc_info {
|
||||
u8 mmc; /* controller 1/2/3 */
|
||||
u8 wires; /* 1/4/8 wires */
|
||||
u32 caps; /* 4/8 wires and any additional host
|
||||
* capabilities OR'd (ref. linux/mmc/host.h) */
|
||||
bool transceiver; /* MMC-2 option */
|
||||
bool ext_clock; /* use external pin for input clock */
|
||||
bool cover_only; /* No card detect - just cover switch */
|
||||
|
@ -22,11 +22,12 @@
|
||||
#include <asm/cputype.h>
|
||||
|
||||
#include <plat/common.h>
|
||||
#include <plat/control.h>
|
||||
#include <plat/cpu.h>
|
||||
|
||||
#include <mach/id.h>
|
||||
|
||||
#include "control.h"
|
||||
|
||||
static struct omap_chip_id omap_chip;
|
||||
static unsigned int omap_revision;
|
||||
|
||||
@ -60,7 +61,7 @@ int omap_type(void)
|
||||
} else if (cpu_is_omap34xx()) {
|
||||
val = omap_ctrl_readl(OMAP343X_CONTROL_STATUS);
|
||||
} else if (cpu_is_omap44xx()) {
|
||||
val = omap_ctrl_readl(OMAP44XX_CONTROL_STATUS);
|
||||
val = omap_ctrl_readl(OMAP4_CTRL_MODULE_CORE_STATUS);
|
||||
} else {
|
||||
pr_err("Cannot detect omap type!\n");
|
||||
goto out;
|
||||
@ -298,7 +299,6 @@ static void __init omap4_check_revision(void)
|
||||
u32 idcode;
|
||||
u16 hawkeye;
|
||||
u8 rev;
|
||||
char *rev_name = "ES1.0";
|
||||
|
||||
/*
|
||||
* The IC rev detection is done with hawkeye and rev.
|
||||
@ -309,14 +309,39 @@ static void __init omap4_check_revision(void)
|
||||
hawkeye = (idcode >> 12) & 0xffff;
|
||||
rev = (idcode >> 28) & 0xff;
|
||||
|
||||
if ((hawkeye == 0xb852) && (rev == 0x0)) {
|
||||
omap_revision = OMAP4430_REV_ES1_0;
|
||||
omap_chip.oc |= CHIP_IS_OMAP4430ES1;
|
||||
pr_info("OMAP%04x %s\n", omap_rev() >> 16, rev_name);
|
||||
return;
|
||||
/*
|
||||
* Few initial ES2.0 samples IDCODE is same as ES1.0
|
||||
* Use ARM register to detect the correct ES version
|
||||
*/
|
||||
if (!rev) {
|
||||
idcode = read_cpuid(CPUID_ID);
|
||||
rev = (idcode & 0xf) - 1;
|
||||
}
|
||||
|
||||
pr_err("Unknown OMAP4 CPU id\n");
|
||||
switch (hawkeye) {
|
||||
case 0xb852:
|
||||
switch (rev) {
|
||||
case 0:
|
||||
omap_revision = OMAP4430_REV_ES1_0;
|
||||
omap_chip.oc |= CHIP_IS_OMAP4430ES1;
|
||||
break;
|
||||
case 1:
|
||||
omap_revision = OMAP4430_REV_ES2_0;
|
||||
omap_chip.oc |= CHIP_IS_OMAP4430ES2;
|
||||
break;
|
||||
default:
|
||||
omap_revision = OMAP4430_REV_ES2_0;
|
||||
omap_chip.oc |= CHIP_IS_OMAP4430ES2;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
/* Unknown default to latest silicon rev as default*/
|
||||
omap_revision = OMAP4430_REV_ES2_0;
|
||||
omap_chip.oc |= CHIP_IS_OMAP4430ES2;
|
||||
}
|
||||
|
||||
pr_info("OMAP%04x ES%d.0\n",
|
||||
omap_rev() >> 16, ((omap_rev() >> 12) & 0xf) + 1);
|
||||
}
|
||||
|
||||
#define OMAP3_SHOW_FEATURE(feat) \
|
||||
@ -361,30 +386,54 @@ static void __init omap3_cpuinfo(void)
|
||||
strcpy(cpu_name, "OMAP3503");
|
||||
}
|
||||
|
||||
switch (rev) {
|
||||
case OMAP_REVBITS_00:
|
||||
strcpy(cpu_rev, "1.0");
|
||||
break;
|
||||
case OMAP_REVBITS_01:
|
||||
strcpy(cpu_rev, "1.1");
|
||||
break;
|
||||
case OMAP_REVBITS_02:
|
||||
strcpy(cpu_rev, "1.2");
|
||||
break;
|
||||
case OMAP_REVBITS_10:
|
||||
strcpy(cpu_rev, "2.0");
|
||||
break;
|
||||
case OMAP_REVBITS_20:
|
||||
strcpy(cpu_rev, "2.1");
|
||||
break;
|
||||
case OMAP_REVBITS_30:
|
||||
strcpy(cpu_rev, "3.0");
|
||||
break;
|
||||
case OMAP_REVBITS_40:
|
||||
/* FALLTHROUGH */
|
||||
default:
|
||||
/* Use the latest known revision as default */
|
||||
strcpy(cpu_rev, "3.1");
|
||||
if (cpu_is_omap3630()) {
|
||||
switch (rev) {
|
||||
case OMAP_REVBITS_00:
|
||||
strcpy(cpu_rev, "1.0");
|
||||
break;
|
||||
case OMAP_REVBITS_01:
|
||||
strcpy(cpu_rev, "1.1");
|
||||
break;
|
||||
case OMAP_REVBITS_02:
|
||||
/* FALLTHROUGH */
|
||||
default:
|
||||
/* Use the latest known revision as default */
|
||||
strcpy(cpu_rev, "1.2");
|
||||
}
|
||||
} else if (cpu_is_omap3505() || cpu_is_omap3517()) {
|
||||
switch (rev) {
|
||||
case OMAP_REVBITS_00:
|
||||
strcpy(cpu_rev, "1.0");
|
||||
break;
|
||||
case OMAP_REVBITS_01:
|
||||
/* FALLTHROUGH */
|
||||
default:
|
||||
/* Use the latest known revision as default */
|
||||
strcpy(cpu_rev, "1.1");
|
||||
}
|
||||
} else {
|
||||
switch (rev) {
|
||||
case OMAP_REVBITS_00:
|
||||
strcpy(cpu_rev, "1.0");
|
||||
break;
|
||||
case OMAP_REVBITS_01:
|
||||
strcpy(cpu_rev, "2.0");
|
||||
break;
|
||||
case OMAP_REVBITS_02:
|
||||
strcpy(cpu_rev, "2.1");
|
||||
break;
|
||||
case OMAP_REVBITS_03:
|
||||
strcpy(cpu_rev, "3.0");
|
||||
break;
|
||||
case OMAP_REVBITS_04:
|
||||
strcpy(cpu_rev, "3.1");
|
||||
break;
|
||||
case OMAP_REVBITS_05:
|
||||
/* FALLTHROUGH */
|
||||
default:
|
||||
/* Use the latest known revision as default */
|
||||
strcpy(cpu_rev, "3.1.2");
|
||||
}
|
||||
}
|
||||
|
||||
/* Print verbose information */
|
||||
|
11
arch/arm/mach-omap2/include/mach/board-rx51.h
Normal file
11
arch/arm/mach-omap2/include/mach/board-rx51.h
Normal file
@ -0,0 +1,11 @@
|
||||
/*
|
||||
* Defines for rx51 boards
|
||||
*/
|
||||
|
||||
#ifndef _OMAP_BOARD_RX51_H
|
||||
#define _OMAP_BOARD_RX51_H
|
||||
|
||||
extern void __init rx51_peripherals_init(void);
|
||||
extern void __init rx51_video_mem_init(void);
|
||||
|
||||
#endif
|
@ -1,12 +1,8 @@
|
||||
/*
|
||||
* Defines for zoom boards
|
||||
*/
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
|
||||
#define ZOOM_NAND_CS 0
|
||||
|
||||
extern void __init board_nand_init(struct mtd_partition *, u8 nr_parts, u8 cs);
|
||||
extern int __init zoom_debugboard_init(void);
|
||||
extern void __init zoom_peripherals_init(void);
|
||||
|
||||
|
391
arch/arm/mach-omap2/include/mach/ctrl_module_core_44xx.h
Normal file
391
arch/arm/mach-omap2/include/mach/ctrl_module_core_44xx.h
Normal file
@ -0,0 +1,391 @@
|
||||
/*
|
||||
* OMAP44xx CTRL_MODULE_CORE registers and bitfields
|
||||
*
|
||||
* Copyright (C) 2009-2010 Texas Instruments, Inc.
|
||||
*
|
||||
* Benoit Cousson (b-cousson@ti.com)
|
||||
* Santosh Shilimkar (santosh.shilimkar@ti.com)
|
||||
*
|
||||
* This file is automatically generated from the OMAP hardware databases.
|
||||
* We respectfully ask that any modifications to this file be coordinated
|
||||
* with the public linux-omap@vger.kernel.org mailing list and the
|
||||
* authors above to ensure that the autogeneration scripts are kept
|
||||
* up-to-date with the file contents.
|
||||
*
|
||||
* 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 __ARCH_ARM_MACH_OMAP2_CTRL_MODULE_CORE_44XX_H
|
||||
#define __ARCH_ARM_MACH_OMAP2_CTRL_MODULE_CORE_44XX_H
|
||||
|
||||
|
||||
/* Base address */
|
||||
#define OMAP4_CTRL_MODULE_CORE 0x4a002000
|
||||
|
||||
/* Registers offset */
|
||||
#define OMAP4_CTRL_MODULE_CORE_IP_REVISION 0x0000
|
||||
#define OMAP4_CTRL_MODULE_CORE_IP_HWINFO 0x0004
|
||||
#define OMAP4_CTRL_MODULE_CORE_IP_SYSCONFIG 0x0010
|
||||
#define OMAP4_CTRL_MODULE_CORE_STD_FUSE_DIE_ID_0 0x0200
|
||||
#define OMAP4_CTRL_MODULE_CORE_ID_CODE 0x0204
|
||||
#define OMAP4_CTRL_MODULE_CORE_STD_FUSE_DIE_ID_1 0x0208
|
||||
#define OMAP4_CTRL_MODULE_CORE_STD_FUSE_DIE_ID_2 0x020c
|
||||
#define OMAP4_CTRL_MODULE_CORE_STD_FUSE_DIE_ID_3 0x0210
|
||||
#define OMAP4_CTRL_MODULE_CORE_STD_FUSE_PROD_ID_0 0x0214
|
||||
#define OMAP4_CTRL_MODULE_CORE_STD_FUSE_PROD_ID_1 0x0218
|
||||
#define OMAP4_CTRL_MODULE_CORE_STD_FUSE_USB_CONF 0x021c
|
||||
#define OMAP4_CTRL_MODULE_CORE_STD_FUSE_OPP_VDD_WKUP 0x0228
|
||||
#define OMAP4_CTRL_MODULE_CORE_STD_FUSE_OPP_BGAP 0x0260
|
||||
#define OMAP4_CTRL_MODULE_CORE_STD_FUSE_OPP_DPLL_0 0x0264
|
||||
#define OMAP4_CTRL_MODULE_CORE_STD_FUSE_OPP_DPLL_1 0x0268
|
||||
#define OMAP4_CTRL_MODULE_CORE_STATUS 0x02c4
|
||||
#define OMAP4_CTRL_MODULE_CORE_DEV_CONF 0x0300
|
||||
#define OMAP4_CTRL_MODULE_CORE_LDOVBB_IVA_VOLTAGE_CTRL 0x0314
|
||||
#define OMAP4_CTRL_MODULE_CORE_LDOVBB_MPU_VOLTAGE_CTRL 0x0318
|
||||
#define OMAP4_CTRL_MODULE_CORE_LDOSRAM_IVA_VOLTAGE_CTRL 0x0320
|
||||
#define OMAP4_CTRL_MODULE_CORE_LDOSRAM_MPU_VOLTAGE_CTRL 0x0324
|
||||
#define OMAP4_CTRL_MODULE_CORE_LDOSRAM_CORE_VOLTAGE_CTRL 0x0328
|
||||
#define OMAP4_CTRL_MODULE_CORE_TEMP_SENSOR 0x032c
|
||||
#define OMAP4_CTRL_MODULE_CORE_DPLL_NWELL_TRIM_0 0x0330
|
||||
#define OMAP4_CTRL_MODULE_CORE_DPLL_NWELL_TRIM_1 0x0334
|
||||
#define OMAP4_CTRL_MODULE_CORE_USBOTGHS_CONTROL 0x033c
|
||||
#define OMAP4_CTRL_MODULE_CORE_DSS_CONTROL 0x0340
|
||||
#define OMAP4_CTRL_MODULE_CORE_HWOBS_CONTROL 0x0350
|
||||
#define OMAP4_CTRL_MODULE_CORE_DEBOBS_FINAL_MUX_SEL 0x0400
|
||||
#define OMAP4_CTRL_MODULE_CORE_DEBOBS_MMR_MPU 0x0408
|
||||
#define OMAP4_CTRL_MODULE_CORE_CONF_SDMA_REQ_SEL0 0x042c
|
||||
#define OMAP4_CTRL_MODULE_CORE_CONF_SDMA_REQ_SEL1 0x0430
|
||||
#define OMAP4_CTRL_MODULE_CORE_CONF_SDMA_REQ_SEL2 0x0434
|
||||
#define OMAP4_CTRL_MODULE_CORE_CONF_SDMA_REQ_SEL3 0x0438
|
||||
#define OMAP4_CTRL_MODULE_CORE_CONF_CLK_SEL0 0x0440
|
||||
#define OMAP4_CTRL_MODULE_CORE_CONF_CLK_SEL1 0x0444
|
||||
#define OMAP4_CTRL_MODULE_CORE_CONF_CLK_SEL2 0x0448
|
||||
#define OMAP4_CTRL_MODULE_CORE_CONF_DPLL_FREQLOCK_SEL 0x044c
|
||||
#define OMAP4_CTRL_MODULE_CORE_CONF_DPLL_TINITZ_SEL 0x0450
|
||||
#define OMAP4_CTRL_MODULE_CORE_CONF_DPLL_PHASELOCK_SEL 0x0454
|
||||
#define OMAP4_CTRL_MODULE_CORE_CONF_DEBUG_SEL_TST_0 0x0480
|
||||
#define OMAP4_CTRL_MODULE_CORE_CONF_DEBUG_SEL_TST_1 0x0484
|
||||
#define OMAP4_CTRL_MODULE_CORE_CONF_DEBUG_SEL_TST_2 0x0488
|
||||
#define OMAP4_CTRL_MODULE_CORE_CONF_DEBUG_SEL_TST_3 0x048c
|
||||
#define OMAP4_CTRL_MODULE_CORE_CONF_DEBUG_SEL_TST_4 0x0490
|
||||
#define OMAP4_CTRL_MODULE_CORE_CONF_DEBUG_SEL_TST_5 0x0494
|
||||
#define OMAP4_CTRL_MODULE_CORE_CONF_DEBUG_SEL_TST_6 0x0498
|
||||
#define OMAP4_CTRL_MODULE_CORE_CONF_DEBUG_SEL_TST_7 0x049c
|
||||
#define OMAP4_CTRL_MODULE_CORE_CONF_DEBUG_SEL_TST_8 0x04a0
|
||||
#define OMAP4_CTRL_MODULE_CORE_CONF_DEBUG_SEL_TST_9 0x04a4
|
||||
#define OMAP4_CTRL_MODULE_CORE_CONF_DEBUG_SEL_TST_10 0x04a8
|
||||
#define OMAP4_CTRL_MODULE_CORE_CONF_DEBUG_SEL_TST_11 0x04ac
|
||||
#define OMAP4_CTRL_MODULE_CORE_CONF_DEBUG_SEL_TST_12 0x04b0
|
||||
#define OMAP4_CTRL_MODULE_CORE_CONF_DEBUG_SEL_TST_13 0x04b4
|
||||
#define OMAP4_CTRL_MODULE_CORE_CONF_DEBUG_SEL_TST_14 0x04b8
|
||||
#define OMAP4_CTRL_MODULE_CORE_CONF_DEBUG_SEL_TST_15 0x04bc
|
||||
#define OMAP4_CTRL_MODULE_CORE_CONF_DEBUG_SEL_TST_16 0x04c0
|
||||
#define OMAP4_CTRL_MODULE_CORE_CONF_DEBUG_SEL_TST_17 0x04c4
|
||||
#define OMAP4_CTRL_MODULE_CORE_CONF_DEBUG_SEL_TST_18 0x04c8
|
||||
#define OMAP4_CTRL_MODULE_CORE_CONF_DEBUG_SEL_TST_19 0x04cc
|
||||
#define OMAP4_CTRL_MODULE_CORE_CONF_DEBUG_SEL_TST_20 0x04d0
|
||||
#define OMAP4_CTRL_MODULE_CORE_CONF_DEBUG_SEL_TST_21 0x04d4
|
||||
#define OMAP4_CTRL_MODULE_CORE_CONF_DEBUG_SEL_TST_22 0x04d8
|
||||
#define OMAP4_CTRL_MODULE_CORE_CONF_DEBUG_SEL_TST_23 0x04dc
|
||||
#define OMAP4_CTRL_MODULE_CORE_CONF_DEBUG_SEL_TST_24 0x04e0
|
||||
#define OMAP4_CTRL_MODULE_CORE_CONF_DEBUG_SEL_TST_25 0x04e4
|
||||
#define OMAP4_CTRL_MODULE_CORE_CONF_DEBUG_SEL_TST_26 0x04e8
|
||||
#define OMAP4_CTRL_MODULE_CORE_CONF_DEBUG_SEL_TST_27 0x04ec
|
||||
#define OMAP4_CTRL_MODULE_CORE_CONF_DEBUG_SEL_TST_28 0x04f0
|
||||
#define OMAP4_CTRL_MODULE_CORE_CONF_DEBUG_SEL_TST_29 0x04f4
|
||||
#define OMAP4_CTRL_MODULE_CORE_CONF_DEBUG_SEL_TST_30 0x04f8
|
||||
#define OMAP4_CTRL_MODULE_CORE_CONF_DEBUG_SEL_TST_31 0x04fc
|
||||
|
||||
/* Registers shifts and masks */
|
||||
|
||||
/* IP_REVISION */
|
||||
#define OMAP4_IP_REV_SCHEME_SHIFT 30
|
||||
#define OMAP4_IP_REV_SCHEME_MASK (0x3 << 30)
|
||||
#define OMAP4_IP_REV_FUNC_SHIFT 16
|
||||
#define OMAP4_IP_REV_FUNC_MASK (0xfff << 16)
|
||||
#define OMAP4_IP_REV_RTL_SHIFT 11
|
||||
#define OMAP4_IP_REV_RTL_MASK (0x1f << 11)
|
||||
#define OMAP4_IP_REV_MAJOR_SHIFT 8
|
||||
#define OMAP4_IP_REV_MAJOR_MASK (0x7 << 8)
|
||||
#define OMAP4_IP_REV_CUSTOM_SHIFT 6
|
||||
#define OMAP4_IP_REV_CUSTOM_MASK (0x3 << 6)
|
||||
#define OMAP4_IP_REV_MINOR_SHIFT 0
|
||||
#define OMAP4_IP_REV_MINOR_MASK (0x3f << 0)
|
||||
|
||||
/* IP_HWINFO */
|
||||
#define OMAP4_IP_HWINFO_SHIFT 0
|
||||
#define OMAP4_IP_HWINFO_MASK (0xffffffff << 0)
|
||||
|
||||
/* IP_SYSCONFIG */
|
||||
#define OMAP4_IP_SYSCONFIG_IDLEMODE_SHIFT 2
|
||||
#define OMAP4_IP_SYSCONFIG_IDLEMODE_MASK (0x3 << 2)
|
||||
|
||||
/* STD_FUSE_DIE_ID_0 */
|
||||
#define OMAP4_STD_FUSE_DIE_ID_0_SHIFT 0
|
||||
#define OMAP4_STD_FUSE_DIE_ID_0_MASK (0xffffffff << 0)
|
||||
|
||||
/* ID_CODE */
|
||||
#define OMAP4_STD_FUSE_IDCODE_SHIFT 0
|
||||
#define OMAP4_STD_FUSE_IDCODE_MASK (0xffffffff << 0)
|
||||
|
||||
/* STD_FUSE_DIE_ID_1 */
|
||||
#define OMAP4_STD_FUSE_DIE_ID_1_SHIFT 0
|
||||
#define OMAP4_STD_FUSE_DIE_ID_1_MASK (0xffffffff << 0)
|
||||
|
||||
/* STD_FUSE_DIE_ID_2 */
|
||||
#define OMAP4_STD_FUSE_DIE_ID_2_SHIFT 0
|
||||
#define OMAP4_STD_FUSE_DIE_ID_2_MASK (0xffffffff << 0)
|
||||
|
||||
/* STD_FUSE_DIE_ID_3 */
|
||||
#define OMAP4_STD_FUSE_DIE_ID_3_SHIFT 0
|
||||
#define OMAP4_STD_FUSE_DIE_ID_3_MASK (0xffffffff << 0)
|
||||
|
||||
/* STD_FUSE_PROD_ID_0 */
|
||||
#define OMAP4_STD_FUSE_PROD_ID_0_SHIFT 0
|
||||
#define OMAP4_STD_FUSE_PROD_ID_0_MASK (0xffffffff << 0)
|
||||
|
||||
/* STD_FUSE_PROD_ID_1 */
|
||||
#define OMAP4_STD_FUSE_PROD_ID_1_SHIFT 0
|
||||
#define OMAP4_STD_FUSE_PROD_ID_1_MASK (0xffffffff << 0)
|
||||
|
||||
/* STD_FUSE_USB_CONF */
|
||||
#define OMAP4_USB_PROD_ID_SHIFT 16
|
||||
#define OMAP4_USB_PROD_ID_MASK (0xffff << 16)
|
||||
#define OMAP4_USB_VENDOR_ID_SHIFT 0
|
||||
#define OMAP4_USB_VENDOR_ID_MASK (0xffff << 0)
|
||||
|
||||
/* STD_FUSE_OPP_VDD_WKUP */
|
||||
#define OMAP4_STD_FUSE_OPP_VDD_WKUP_SHIFT 0
|
||||
#define OMAP4_STD_FUSE_OPP_VDD_WKUP_MASK (0xffffffff << 0)
|
||||
|
||||
/* STD_FUSE_OPP_BGAP */
|
||||
#define OMAP4_STD_FUSE_OPP_BGAP_SHIFT 0
|
||||
#define OMAP4_STD_FUSE_OPP_BGAP_MASK (0xffffffff << 0)
|
||||
|
||||
/* STD_FUSE_OPP_DPLL_0 */
|
||||
#define OMAP4_STD_FUSE_OPP_DPLL_0_SHIFT 0
|
||||
#define OMAP4_STD_FUSE_OPP_DPLL_0_MASK (0xffffffff << 0)
|
||||
|
||||
/* STD_FUSE_OPP_DPLL_1 */
|
||||
#define OMAP4_STD_FUSE_OPP_DPLL_1_SHIFT 0
|
||||
#define OMAP4_STD_FUSE_OPP_DPLL_1_MASK (0xffffffff << 0)
|
||||
|
||||
/* STATUS */
|
||||
#define OMAP4_ATTILA_CONF_SHIFT 11
|
||||
#define OMAP4_ATTILA_CONF_MASK (0x3 << 11)
|
||||
#define OMAP4_DEVICE_TYPE_SHIFT 8
|
||||
#define OMAP4_DEVICE_TYPE_MASK (0x7 << 8)
|
||||
#define OMAP4_SYS_BOOT_SHIFT 0
|
||||
#define OMAP4_SYS_BOOT_MASK (0xff << 0)
|
||||
|
||||
/* DEV_CONF */
|
||||
#define OMAP4_DEV_CONF_SHIFT 1
|
||||
#define OMAP4_DEV_CONF_MASK (0x7fffffff << 1)
|
||||
#define OMAP4_USBPHY_PD_SHIFT 0
|
||||
#define OMAP4_USBPHY_PD_MASK (1 << 0)
|
||||
|
||||
/* LDOVBB_IVA_VOLTAGE_CTRL */
|
||||
#define OMAP4_LDOVBBIVA_RBB_MUX_CTRL_SHIFT 26
|
||||
#define OMAP4_LDOVBBIVA_RBB_MUX_CTRL_MASK (1 << 26)
|
||||
#define OMAP4_LDOVBBIVA_RBB_VSET_IN_SHIFT 21
|
||||
#define OMAP4_LDOVBBIVA_RBB_VSET_IN_MASK (0x1f << 21)
|
||||
#define OMAP4_LDOVBBIVA_RBB_VSET_OUT_SHIFT 16
|
||||
#define OMAP4_LDOVBBIVA_RBB_VSET_OUT_MASK (0x1f << 16)
|
||||
#define OMAP4_LDOVBBIVA_FBB_MUX_CTRL_SHIFT 10
|
||||
#define OMAP4_LDOVBBIVA_FBB_MUX_CTRL_MASK (1 << 10)
|
||||
#define OMAP4_LDOVBBIVA_FBB_VSET_IN_SHIFT 5
|
||||
#define OMAP4_LDOVBBIVA_FBB_VSET_IN_MASK (0x1f << 5)
|
||||
#define OMAP4_LDOVBBIVA_FBB_VSET_OUT_SHIFT 0
|
||||
#define OMAP4_LDOVBBIVA_FBB_VSET_OUT_MASK (0x1f << 0)
|
||||
|
||||
/* LDOVBB_MPU_VOLTAGE_CTRL */
|
||||
#define OMAP4_LDOVBBMPU_RBB_MUX_CTRL_SHIFT 26
|
||||
#define OMAP4_LDOVBBMPU_RBB_MUX_CTRL_MASK (1 << 26)
|
||||
#define OMAP4_LDOVBBMPU_RBB_VSET_IN_SHIFT 21
|
||||
#define OMAP4_LDOVBBMPU_RBB_VSET_IN_MASK (0x1f << 21)
|
||||
#define OMAP4_LDOVBBMPU_RBB_VSET_OUT_SHIFT 16
|
||||
#define OMAP4_LDOVBBMPU_RBB_VSET_OUT_MASK (0x1f << 16)
|
||||
#define OMAP4_LDOVBBMPU_FBB_MUX_CTRL_SHIFT 10
|
||||
#define OMAP4_LDOVBBMPU_FBB_MUX_CTRL_MASK (1 << 10)
|
||||
#define OMAP4_LDOVBBMPU_FBB_VSET_IN_SHIFT 5
|
||||
#define OMAP4_LDOVBBMPU_FBB_VSET_IN_MASK (0x1f << 5)
|
||||
#define OMAP4_LDOVBBMPU_FBB_VSET_OUT_SHIFT 0
|
||||
#define OMAP4_LDOVBBMPU_FBB_VSET_OUT_MASK (0x1f << 0)
|
||||
|
||||
/* LDOSRAM_IVA_VOLTAGE_CTRL */
|
||||
#define OMAP4_LDOSRAMIVA_RETMODE_MUX_CTRL_SHIFT 26
|
||||
#define OMAP4_LDOSRAMIVA_RETMODE_MUX_CTRL_MASK (1 << 26)
|
||||
#define OMAP4_LDOSRAMIVA_RETMODE_VSET_IN_SHIFT 21
|
||||
#define OMAP4_LDOSRAMIVA_RETMODE_VSET_IN_MASK (0x1f << 21)
|
||||
#define OMAP4_LDOSRAMIVA_RETMODE_VSET_OUT_SHIFT 16
|
||||
#define OMAP4_LDOSRAMIVA_RETMODE_VSET_OUT_MASK (0x1f << 16)
|
||||
#define OMAP4_LDOSRAMIVA_ACTMODE_MUX_CTRL_SHIFT 10
|
||||
#define OMAP4_LDOSRAMIVA_ACTMODE_MUX_CTRL_MASK (1 << 10)
|
||||
#define OMAP4_LDOSRAMIVA_ACTMODE_VSET_IN_SHIFT 5
|
||||
#define OMAP4_LDOSRAMIVA_ACTMODE_VSET_IN_MASK (0x1f << 5)
|
||||
#define OMAP4_LDOSRAMIVA_ACTMODE_VSET_OUT_SHIFT 0
|
||||
#define OMAP4_LDOSRAMIVA_ACTMODE_VSET_OUT_MASK (0x1f << 0)
|
||||
|
||||
/* LDOSRAM_MPU_VOLTAGE_CTRL */
|
||||
#define OMAP4_LDOSRAMMPU_RETMODE_MUX_CTRL_SHIFT 26
|
||||
#define OMAP4_LDOSRAMMPU_RETMODE_MUX_CTRL_MASK (1 << 26)
|
||||
#define OMAP4_LDOSRAMMPU_RETMODE_VSET_IN_SHIFT 21
|
||||
#define OMAP4_LDOSRAMMPU_RETMODE_VSET_IN_MASK (0x1f << 21)
|
||||
#define OMAP4_LDOSRAMMPU_RETMODE_VSET_OUT_SHIFT 16
|
||||
#define OMAP4_LDOSRAMMPU_RETMODE_VSET_OUT_MASK (0x1f << 16)
|
||||
#define OMAP4_LDOSRAMMPU_ACTMODE_MUX_CTRL_SHIFT 10
|
||||
#define OMAP4_LDOSRAMMPU_ACTMODE_MUX_CTRL_MASK (1 << 10)
|
||||
#define OMAP4_LDOSRAMMPU_ACTMODE_VSET_IN_SHIFT 5
|
||||
#define OMAP4_LDOSRAMMPU_ACTMODE_VSET_IN_MASK (0x1f << 5)
|
||||
#define OMAP4_LDOSRAMMPU_ACTMODE_VSET_OUT_SHIFT 0
|
||||
#define OMAP4_LDOSRAMMPU_ACTMODE_VSET_OUT_MASK (0x1f << 0)
|
||||
|
||||
/* LDOSRAM_CORE_VOLTAGE_CTRL */
|
||||
#define OMAP4_LDOSRAMCORE_RETMODE_MUX_CTRL_SHIFT 26
|
||||
#define OMAP4_LDOSRAMCORE_RETMODE_MUX_CTRL_MASK (1 << 26)
|
||||
#define OMAP4_LDOSRAMCORE_RETMODE_VSET_IN_SHIFT 21
|
||||
#define OMAP4_LDOSRAMCORE_RETMODE_VSET_IN_MASK (0x1f << 21)
|
||||
#define OMAP4_LDOSRAMCORE_RETMODE_VSET_OUT_SHIFT 16
|
||||
#define OMAP4_LDOSRAMCORE_RETMODE_VSET_OUT_MASK (0x1f << 16)
|
||||
#define OMAP4_LDOSRAMCORE_ACTMODE_MUX_CTRL_SHIFT 10
|
||||
#define OMAP4_LDOSRAMCORE_ACTMODE_MUX_CTRL_MASK (1 << 10)
|
||||
#define OMAP4_LDOSRAMCORE_ACTMODE_VSET_IN_SHIFT 5
|
||||
#define OMAP4_LDOSRAMCORE_ACTMODE_VSET_IN_MASK (0x1f << 5)
|
||||
#define OMAP4_LDOSRAMCORE_ACTMODE_VSET_OUT_SHIFT 0
|
||||
#define OMAP4_LDOSRAMCORE_ACTMODE_VSET_OUT_MASK (0x1f << 0)
|
||||
|
||||
/* TEMP_SENSOR */
|
||||
#define OMAP4_BGAP_TEMPSOFF_SHIFT 12
|
||||
#define OMAP4_BGAP_TEMPSOFF_MASK (1 << 12)
|
||||
#define OMAP4_BGAP_TSHUT_SHIFT 11
|
||||
#define OMAP4_BGAP_TSHUT_MASK (1 << 11)
|
||||
#define OMAP4_BGAP_TEMP_SENSOR_CONTCONV_SHIFT 10
|
||||
#define OMAP4_BGAP_TEMP_SENSOR_CONTCONV_MASK (1 << 10)
|
||||
#define OMAP4_BGAP_TEMP_SENSOR_SOC_SHIFT 9
|
||||
#define OMAP4_BGAP_TEMP_SENSOR_SOC_MASK (1 << 9)
|
||||
#define OMAP4_BGAP_TEMP_SENSOR_EOCZ_SHIFT 8
|
||||
#define OMAP4_BGAP_TEMP_SENSOR_EOCZ_MASK (1 << 8)
|
||||
#define OMAP4_BGAP_TEMP_SENSOR_DTEMP_SHIFT 0
|
||||
#define OMAP4_BGAP_TEMP_SENSOR_DTEMP_MASK (0xff << 0)
|
||||
|
||||
/* DPLL_NWELL_TRIM_0 */
|
||||
#define OMAP4_DPLL_ABE_NWELL_TRIM_MUX_CTRL_SHIFT 29
|
||||
#define OMAP4_DPLL_ABE_NWELL_TRIM_MUX_CTRL_MASK (1 << 29)
|
||||
#define OMAP4_DPLL_ABE_NWELL_TRIM_SHIFT 24
|
||||
#define OMAP4_DPLL_ABE_NWELL_TRIM_MASK (0x1f << 24)
|
||||
#define OMAP4_DPLL_PER_NWELL_TRIM_MUX_CTRL_SHIFT 23
|
||||
#define OMAP4_DPLL_PER_NWELL_TRIM_MUX_CTRL_MASK (1 << 23)
|
||||
#define OMAP4_DPLL_PER_NWELL_TRIM_SHIFT 18
|
||||
#define OMAP4_DPLL_PER_NWELL_TRIM_MASK (0x1f << 18)
|
||||
#define OMAP4_DPLL_CORE_NWELL_TRIM_MUX_CTRL_SHIFT 17
|
||||
#define OMAP4_DPLL_CORE_NWELL_TRIM_MUX_CTRL_MASK (1 << 17)
|
||||
#define OMAP4_DPLL_CORE_NWELL_TRIM_SHIFT 12
|
||||
#define OMAP4_DPLL_CORE_NWELL_TRIM_MASK (0x1f << 12)
|
||||
#define OMAP4_DPLL_IVA_NWELL_TRIM_MUX_CTRL_SHIFT 11
|
||||
#define OMAP4_DPLL_IVA_NWELL_TRIM_MUX_CTRL_MASK (1 << 11)
|
||||
#define OMAP4_DPLL_IVA_NWELL_TRIM_SHIFT 6
|
||||
#define OMAP4_DPLL_IVA_NWELL_TRIM_MASK (0x1f << 6)
|
||||
#define OMAP4_DPLL_MPU_NWELL_TRIM_MUX_CTRL_SHIFT 5
|
||||
#define OMAP4_DPLL_MPU_NWELL_TRIM_MUX_CTRL_MASK (1 << 5)
|
||||
#define OMAP4_DPLL_MPU_NWELL_TRIM_SHIFT 0
|
||||
#define OMAP4_DPLL_MPU_NWELL_TRIM_MASK (0x1f << 0)
|
||||
|
||||
/* DPLL_NWELL_TRIM_1 */
|
||||
#define OMAP4_DPLL_UNIPRO_NWELL_TRIM_MUX_CTRL_SHIFT 29
|
||||
#define OMAP4_DPLL_UNIPRO_NWELL_TRIM_MUX_CTRL_MASK (1 << 29)
|
||||
#define OMAP4_DPLL_UNIPRO_NWELL_TRIM_SHIFT 24
|
||||
#define OMAP4_DPLL_UNIPRO_NWELL_TRIM_MASK (0x1f << 24)
|
||||
#define OMAP4_DPLL_USB_NWELL_TRIM_MUX_CTRL_SHIFT 23
|
||||
#define OMAP4_DPLL_USB_NWELL_TRIM_MUX_CTRL_MASK (1 << 23)
|
||||
#define OMAP4_DPLL_USB_NWELL_TRIM_SHIFT 18
|
||||
#define OMAP4_DPLL_USB_NWELL_TRIM_MASK (0x1f << 18)
|
||||
#define OMAP4_DPLL_HDMI_NWELL_TRIM_MUX_CTRL_SHIFT 17
|
||||
#define OMAP4_DPLL_HDMI_NWELL_TRIM_MUX_CTRL_MASK (1 << 17)
|
||||
#define OMAP4_DPLL_HDMI_NWELL_TRIM_SHIFT 12
|
||||
#define OMAP4_DPLL_HDMI_NWELL_TRIM_MASK (0x1f << 12)
|
||||
#define OMAP4_DPLL_DSI2_NWELL_TRIM_MUX_CTRL_SHIFT 11
|
||||
#define OMAP4_DPLL_DSI2_NWELL_TRIM_MUX_CTRL_MASK (1 << 11)
|
||||
#define OMAP4_DPLL_DSI2_NWELL_TRIM_SHIFT 6
|
||||
#define OMAP4_DPLL_DSI2_NWELL_TRIM_MASK (0x1f << 6)
|
||||
#define OMAP4_DPLL_DSI1_NWELL_TRIM_MUX_CTRL_SHIFT 5
|
||||
#define OMAP4_DPLL_DSI1_NWELL_TRIM_MUX_CTRL_MASK (1 << 5)
|
||||
#define OMAP4_DPLL_DSI1_NWELL_TRIM_SHIFT 0
|
||||
#define OMAP4_DPLL_DSI1_NWELL_TRIM_MASK (0x1f << 0)
|
||||
|
||||
/* USBOTGHS_CONTROL */
|
||||
#define OMAP4_DISCHRGVBUS_SHIFT 8
|
||||
#define OMAP4_DISCHRGVBUS_MASK (1 << 8)
|
||||
#define OMAP4_CHRGVBUS_SHIFT 7
|
||||
#define OMAP4_CHRGVBUS_MASK (1 << 7)
|
||||
#define OMAP4_DRVVBUS_SHIFT 6
|
||||
#define OMAP4_DRVVBUS_MASK (1 << 6)
|
||||
#define OMAP4_IDPULLUP_SHIFT 5
|
||||
#define OMAP4_IDPULLUP_MASK (1 << 5)
|
||||
#define OMAP4_IDDIG_SHIFT 4
|
||||
#define OMAP4_IDDIG_MASK (1 << 4)
|
||||
#define OMAP4_SESSEND_SHIFT 3
|
||||
#define OMAP4_SESSEND_MASK (1 << 3)
|
||||
#define OMAP4_VBUSVALID_SHIFT 2
|
||||
#define OMAP4_VBUSVALID_MASK (1 << 2)
|
||||
#define OMAP4_BVALID_SHIFT 1
|
||||
#define OMAP4_BVALID_MASK (1 << 1)
|
||||
#define OMAP4_AVALID_SHIFT 0
|
||||
#define OMAP4_AVALID_MASK (1 << 0)
|
||||
|
||||
/* DSS_CONTROL */
|
||||
#define OMAP4_DSS_MUX6_SELECT_SHIFT 0
|
||||
#define OMAP4_DSS_MUX6_SELECT_MASK (1 << 0)
|
||||
|
||||
/* HWOBS_CONTROL */
|
||||
#define OMAP4_HWOBS_CLKDIV_SEL_SHIFT 3
|
||||
#define OMAP4_HWOBS_CLKDIV_SEL_MASK (0x1f << 3)
|
||||
#define OMAP4_HWOBS_ALL_ZERO_MODE_SHIFT 2
|
||||
#define OMAP4_HWOBS_ALL_ZERO_MODE_MASK (1 << 2)
|
||||
#define OMAP4_HWOBS_ALL_ONE_MODE_SHIFT 1
|
||||
#define OMAP4_HWOBS_ALL_ONE_MODE_MASK (1 << 1)
|
||||
#define OMAP4_HWOBS_MACRO_ENABLE_SHIFT 0
|
||||
#define OMAP4_HWOBS_MACRO_ENABLE_MASK (1 << 0)
|
||||
|
||||
/* DEBOBS_FINAL_MUX_SEL */
|
||||
#define OMAP4_SELECT_SHIFT 0
|
||||
#define OMAP4_SELECT_MASK (0xffffffff << 0)
|
||||
|
||||
/* DEBOBS_MMR_MPU */
|
||||
#define OMAP4_SELECT_DEBOBS_MMR_MPU_SHIFT 0
|
||||
#define OMAP4_SELECT_DEBOBS_MMR_MPU_MASK (0xf << 0)
|
||||
|
||||
/* CONF_SDMA_REQ_SEL0 */
|
||||
#define OMAP4_MULT_SHIFT 0
|
||||
#define OMAP4_MULT_MASK (0x7f << 0)
|
||||
|
||||
/* CONF_CLK_SEL0 */
|
||||
#define OMAP4_MULT_CONF_CLK_SEL0_SHIFT 0
|
||||
#define OMAP4_MULT_CONF_CLK_SEL0_MASK (0x7 << 0)
|
||||
|
||||
/* CONF_CLK_SEL1 */
|
||||
#define OMAP4_MULT_CONF_CLK_SEL1_SHIFT 0
|
||||
#define OMAP4_MULT_CONF_CLK_SEL1_MASK (0x7 << 0)
|
||||
|
||||
/* CONF_CLK_SEL2 */
|
||||
#define OMAP4_MULT_CONF_CLK_SEL2_SHIFT 0
|
||||
#define OMAP4_MULT_CONF_CLK_SEL2_MASK (0x7 << 0)
|
||||
|
||||
/* CONF_DPLL_FREQLOCK_SEL */
|
||||
#define OMAP4_MULT_CONF_DPLL_FREQLOCK_SEL_SHIFT 0
|
||||
#define OMAP4_MULT_CONF_DPLL_FREQLOCK_SEL_MASK (0x7 << 0)
|
||||
|
||||
/* CONF_DPLL_TINITZ_SEL */
|
||||
#define OMAP4_MULT_CONF_DPLL_TINITZ_SEL_SHIFT 0
|
||||
#define OMAP4_MULT_CONF_DPLL_TINITZ_SEL_MASK (0x7 << 0)
|
||||
|
||||
/* CONF_DPLL_PHASELOCK_SEL */
|
||||
#define OMAP4_MULT_CONF_DPLL_PHASELOCK_SEL_SHIFT 0
|
||||
#define OMAP4_MULT_CONF_DPLL_PHASELOCK_SEL_MASK (0x7 << 0)
|
||||
|
||||
/* CONF_DEBUG_SEL_TST_0 */
|
||||
#define OMAP4_MODE_SHIFT 0
|
||||
#define OMAP4_MODE_MASK (0xf << 0)
|
||||
|
||||
#endif
|
1409
arch/arm/mach-omap2/include/mach/ctrl_module_pad_core_44xx.h
Normal file
1409
arch/arm/mach-omap2/include/mach/ctrl_module_pad_core_44xx.h
Normal file
File diff suppressed because it is too large
Load Diff
236
arch/arm/mach-omap2/include/mach/ctrl_module_pad_wkup_44xx.h
Normal file
236
arch/arm/mach-omap2/include/mach/ctrl_module_pad_wkup_44xx.h
Normal file
@ -0,0 +1,236 @@
|
||||
/*
|
||||
* OMAP44xx CTRL_MODULE_PAD_WKUP registers and bitfields
|
||||
*
|
||||
* Copyright (C) 2009-2010 Texas Instruments, Inc.
|
||||
*
|
||||
* Benoit Cousson (b-cousson@ti.com)
|
||||
* Santosh Shilimkar (santosh.shilimkar@ti.com)
|
||||
*
|
||||
* This file is automatically generated from the OMAP hardware databases.
|
||||
* We respectfully ask that any modifications to this file be coordinated
|
||||
* with the public linux-omap@vger.kernel.org mailing list and the
|
||||
* authors above to ensure that the autogeneration scripts are kept
|
||||
* up-to-date with the file contents.
|
||||
*
|
||||
* 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 __ARCH_ARM_MACH_OMAP2_CTRL_MODULE_PAD_WKUP_44XX_H
|
||||
#define __ARCH_ARM_MACH_OMAP2_CTRL_MODULE_PAD_WKUP_44XX_H
|
||||
|
||||
|
||||
/* Base address */
|
||||
#define OMAP4_CTRL_MODULE_PAD_WKUP 0x4a31e000
|
||||
|
||||
/* Registers offset */
|
||||
#define OMAP4_CTRL_MODULE_PAD_WKUP_IP_REVISION 0x0000
|
||||
#define OMAP4_CTRL_MODULE_PAD_WKUP_IP_HWINFO 0x0004
|
||||
#define OMAP4_CTRL_MODULE_PAD_WKUP_IP_SYSCONFIG 0x0010
|
||||
#define OMAP4_CTRL_MODULE_PAD_WKUP_PADCONF_WAKEUPEVENT_0 0x007c
|
||||
#define OMAP4_CTRL_MODULE_PAD_WKUP_CONTROL_SMART1NOPMIO_PADCONF_0 0x05a0
|
||||
#define OMAP4_CTRL_MODULE_PAD_WKUP_CONTROL_SMART1NOPMIO_PADCONF_1 0x05a4
|
||||
#define OMAP4_CTRL_MODULE_PAD_WKUP_CONTROL_PADCONF_MODE 0x05a8
|
||||
#define OMAP4_CTRL_MODULE_PAD_WKUP_CONTROL_XTAL_OSCILLATOR 0x05ac
|
||||
#define OMAP4_CTRL_MODULE_PAD_WKUP_CONTROL_USIMIO 0x0600
|
||||
#define OMAP4_CTRL_MODULE_PAD_WKUP_CONTROL_I2C_2 0x0604
|
||||
#define OMAP4_CTRL_MODULE_PAD_WKUP_CONTROL_JTAG 0x0608
|
||||
#define OMAP4_CTRL_MODULE_PAD_WKUP_CONTROL_SYS 0x060c
|
||||
#define OMAP4_CTRL_MODULE_PAD_WKUP_WKUP_CONTROL_SPARE_RW 0x0614
|
||||
#define OMAP4_CTRL_MODULE_PAD_WKUP_WKUP_CONTROL_SPARE_R 0x0618
|
||||
#define OMAP4_CTRL_MODULE_PAD_WKUP_WKUP_CONTROL_SPARE_R_C0 0x061c
|
||||
|
||||
/* Registers shifts and masks */
|
||||
|
||||
/* IP_REVISION */
|
||||
#define OMAP4_IP_REV_SCHEME_SHIFT 30
|
||||
#define OMAP4_IP_REV_SCHEME_MASK (0x3 << 30)
|
||||
#define OMAP4_IP_REV_FUNC_SHIFT 16
|
||||
#define OMAP4_IP_REV_FUNC_MASK (0xfff << 16)
|
||||
#define OMAP4_IP_REV_RTL_SHIFT 11
|
||||
#define OMAP4_IP_REV_RTL_MASK (0x1f << 11)
|
||||
#define OMAP4_IP_REV_MAJOR_SHIFT 8
|
||||
#define OMAP4_IP_REV_MAJOR_MASK (0x7 << 8)
|
||||
#define OMAP4_IP_REV_CUSTOM_SHIFT 6
|
||||
#define OMAP4_IP_REV_CUSTOM_MASK (0x3 << 6)
|
||||
#define OMAP4_IP_REV_MINOR_SHIFT 0
|
||||
#define OMAP4_IP_REV_MINOR_MASK (0x3f << 0)
|
||||
|
||||
/* IP_HWINFO */
|
||||
#define OMAP4_IP_HWINFO_SHIFT 0
|
||||
#define OMAP4_IP_HWINFO_MASK (0xffffffff << 0)
|
||||
|
||||
/* IP_SYSCONFIG */
|
||||
#define OMAP4_IP_SYSCONFIG_IDLEMODE_SHIFT 2
|
||||
#define OMAP4_IP_SYSCONFIG_IDLEMODE_MASK (0x3 << 2)
|
||||
|
||||
/* PADCONF_WAKEUPEVENT_0 */
|
||||
#define OMAP4_JTAG_TDO_DUPLICATEWAKEUPEVENT_SHIFT 24
|
||||
#define OMAP4_JTAG_TDO_DUPLICATEWAKEUPEVENT_MASK (1 << 24)
|
||||
#define OMAP4_JTAG_TDI_DUPLICATEWAKEUPEVENT_SHIFT 23
|
||||
#define OMAP4_JTAG_TDI_DUPLICATEWAKEUPEVENT_MASK (1 << 23)
|
||||
#define OMAP4_JTAG_TMS_TMSC_DUPLICATEWAKEUPEVENT_SHIFT 22
|
||||
#define OMAP4_JTAG_TMS_TMSC_DUPLICATEWAKEUPEVENT_MASK (1 << 22)
|
||||
#define OMAP4_JTAG_RTCK_DUPLICATEWAKEUPEVENT_SHIFT 21
|
||||
#define OMAP4_JTAG_RTCK_DUPLICATEWAKEUPEVENT_MASK (1 << 21)
|
||||
#define OMAP4_JTAG_TCK_DUPLICATEWAKEUPEVENT_SHIFT 20
|
||||
#define OMAP4_JTAG_TCK_DUPLICATEWAKEUPEVENT_MASK (1 << 20)
|
||||
#define OMAP4_JTAG_NTRST_DUPLICATEWAKEUPEVENT_SHIFT 19
|
||||
#define OMAP4_JTAG_NTRST_DUPLICATEWAKEUPEVENT_MASK (1 << 19)
|
||||
#define OMAP4_SYS_BOOT7_DUPLICATEWAKEUPEVENT_SHIFT 18
|
||||
#define OMAP4_SYS_BOOT7_DUPLICATEWAKEUPEVENT_MASK (1 << 18)
|
||||
#define OMAP4_SYS_BOOT6_DUPLICATEWAKEUPEVENT_SHIFT 17
|
||||
#define OMAP4_SYS_BOOT6_DUPLICATEWAKEUPEVENT_MASK (1 << 17)
|
||||
#define OMAP4_SYS_PWRON_RESET_OUT_DUPLICATEWAKEUPEVENT_SHIFT 16
|
||||
#define OMAP4_SYS_PWRON_RESET_OUT_DUPLICATEWAKEUPEVENT_MASK (1 << 16)
|
||||
#define OMAP4_SYS_PWR_REQ_DUPLICATEWAKEUPEVENT_SHIFT 15
|
||||
#define OMAP4_SYS_PWR_REQ_DUPLICATEWAKEUPEVENT_MASK (1 << 15)
|
||||
#define OMAP4_SYS_NRESWARM_DUPLICATEWAKEUPEVENT_SHIFT 14
|
||||
#define OMAP4_SYS_NRESWARM_DUPLICATEWAKEUPEVENT_MASK (1 << 14)
|
||||
#define OMAP4_SYS_32K_DUPLICATEWAKEUPEVENT_SHIFT 13
|
||||
#define OMAP4_SYS_32K_DUPLICATEWAKEUPEVENT_MASK (1 << 13)
|
||||
#define OMAP4_FREF_CLK4_OUT_DUPLICATEWAKEUPEVENT_SHIFT 12
|
||||
#define OMAP4_FREF_CLK4_OUT_DUPLICATEWAKEUPEVENT_MASK (1 << 12)
|
||||
#define OMAP4_FREF_CLK4_REQ_DUPLICATEWAKEUPEVENT_SHIFT 11
|
||||
#define OMAP4_FREF_CLK4_REQ_DUPLICATEWAKEUPEVENT_MASK (1 << 11)
|
||||
#define OMAP4_FREF_CLK3_OUT_DUPLICATEWAKEUPEVENT_SHIFT 10
|
||||
#define OMAP4_FREF_CLK3_OUT_DUPLICATEWAKEUPEVENT_MASK (1 << 10)
|
||||
#define OMAP4_FREF_CLK3_REQ_DUPLICATEWAKEUPEVENT_SHIFT 9
|
||||
#define OMAP4_FREF_CLK3_REQ_DUPLICATEWAKEUPEVENT_MASK (1 << 9)
|
||||
#define OMAP4_FREF_CLK0_OUT_DUPLICATEWAKEUPEVENT_SHIFT 8
|
||||
#define OMAP4_FREF_CLK0_OUT_DUPLICATEWAKEUPEVENT_MASK (1 << 8)
|
||||
#define OMAP4_FREF_CLK_IOREQ_DUPLICATEWAKEUPEVENT_SHIFT 7
|
||||
#define OMAP4_FREF_CLK_IOREQ_DUPLICATEWAKEUPEVENT_MASK (1 << 7)
|
||||
#define OMAP4_SR_SDA_DUPLICATEWAKEUPEVENT_SHIFT 6
|
||||
#define OMAP4_SR_SDA_DUPLICATEWAKEUPEVENT_MASK (1 << 6)
|
||||
#define OMAP4_SR_SCL_DUPLICATEWAKEUPEVENT_SHIFT 5
|
||||
#define OMAP4_SR_SCL_DUPLICATEWAKEUPEVENT_MASK (1 << 5)
|
||||
#define OMAP4_SIM_PWRCTRL_DUPLICATEWAKEUPEVENT_SHIFT 4
|
||||
#define OMAP4_SIM_PWRCTRL_DUPLICATEWAKEUPEVENT_MASK (1 << 4)
|
||||
#define OMAP4_SIM_CD_DUPLICATEWAKEUPEVENT_SHIFT 3
|
||||
#define OMAP4_SIM_CD_DUPLICATEWAKEUPEVENT_MASK (1 << 3)
|
||||
#define OMAP4_SIM_RESET_DUPLICATEWAKEUPEVENT_SHIFT 2
|
||||
#define OMAP4_SIM_RESET_DUPLICATEWAKEUPEVENT_MASK (1 << 2)
|
||||
#define OMAP4_SIM_CLK_DUPLICATEWAKEUPEVENT_SHIFT 1
|
||||
#define OMAP4_SIM_CLK_DUPLICATEWAKEUPEVENT_MASK (1 << 1)
|
||||
#define OMAP4_SIM_IO_DUPLICATEWAKEUPEVENT_SHIFT 0
|
||||
#define OMAP4_SIM_IO_DUPLICATEWAKEUPEVENT_MASK (1 << 0)
|
||||
|
||||
/* CONTROL_SMART1NOPMIO_PADCONF_0 */
|
||||
#define OMAP4_FREF_DR0_SC_SHIFT 30
|
||||
#define OMAP4_FREF_DR0_SC_MASK (0x3 << 30)
|
||||
#define OMAP4_FREF_DR1_SC_SHIFT 28
|
||||
#define OMAP4_FREF_DR1_SC_MASK (0x3 << 28)
|
||||
#define OMAP4_FREF_DR4_SC_SHIFT 26
|
||||
#define OMAP4_FREF_DR4_SC_MASK (0x3 << 26)
|
||||
#define OMAP4_FREF_DR5_SC_SHIFT 24
|
||||
#define OMAP4_FREF_DR5_SC_MASK (0x3 << 24)
|
||||
#define OMAP4_FREF_DR6_SC_SHIFT 22
|
||||
#define OMAP4_FREF_DR6_SC_MASK (0x3 << 22)
|
||||
#define OMAP4_FREF_DR7_SC_SHIFT 20
|
||||
#define OMAP4_FREF_DR7_SC_MASK (0x3 << 20)
|
||||
#define OMAP4_GPIO_DR7_SC_SHIFT 18
|
||||
#define OMAP4_GPIO_DR7_SC_MASK (0x3 << 18)
|
||||
#define OMAP4_DPM_DR0_SC_SHIFT 14
|
||||
#define OMAP4_DPM_DR0_SC_MASK (0x3 << 14)
|
||||
#define OMAP4_SIM_DR0_SC_SHIFT 12
|
||||
#define OMAP4_SIM_DR0_SC_MASK (0x3 << 12)
|
||||
|
||||
/* CONTROL_SMART1NOPMIO_PADCONF_1 */
|
||||
#define OMAP4_FREF_DR0_LB_SHIFT 30
|
||||
#define OMAP4_FREF_DR0_LB_MASK (0x3 << 30)
|
||||
#define OMAP4_FREF_DR1_LB_SHIFT 28
|
||||
#define OMAP4_FREF_DR1_LB_MASK (0x3 << 28)
|
||||
#define OMAP4_FREF_DR4_LB_SHIFT 26
|
||||
#define OMAP4_FREF_DR4_LB_MASK (0x3 << 26)
|
||||
#define OMAP4_FREF_DR5_LB_SHIFT 24
|
||||
#define OMAP4_FREF_DR5_LB_MASK (0x3 << 24)
|
||||
#define OMAP4_FREF_DR6_LB_SHIFT 22
|
||||
#define OMAP4_FREF_DR6_LB_MASK (0x3 << 22)
|
||||
#define OMAP4_FREF_DR7_LB_SHIFT 20
|
||||
#define OMAP4_FREF_DR7_LB_MASK (0x3 << 20)
|
||||
#define OMAP4_GPIO_DR7_LB_SHIFT 18
|
||||
#define OMAP4_GPIO_DR7_LB_MASK (0x3 << 18)
|
||||
#define OMAP4_DPM_DR0_LB_SHIFT 14
|
||||
#define OMAP4_DPM_DR0_LB_MASK (0x3 << 14)
|
||||
#define OMAP4_SIM_DR0_LB_SHIFT 12
|
||||
#define OMAP4_SIM_DR0_LB_MASK (0x3 << 12)
|
||||
|
||||
/* CONTROL_PADCONF_MODE */
|
||||
#define OMAP4_VDDS_DV_FREF_SHIFT 31
|
||||
#define OMAP4_VDDS_DV_FREF_MASK (1 << 31)
|
||||
#define OMAP4_VDDS_DV_BANK2_SHIFT 30
|
||||
#define OMAP4_VDDS_DV_BANK2_MASK (1 << 30)
|
||||
|
||||
/* CONTROL_XTAL_OSCILLATOR */
|
||||
#define OMAP4_OSCILLATOR_BOOST_SHIFT 31
|
||||
#define OMAP4_OSCILLATOR_BOOST_MASK (1 << 31)
|
||||
#define OMAP4_OSCILLATOR_OS_OUT_SHIFT 30
|
||||
#define OMAP4_OSCILLATOR_OS_OUT_MASK (1 << 30)
|
||||
|
||||
/* CONTROL_USIMIO */
|
||||
#define OMAP4_PAD_USIM_CLK_LOW_SHIFT 31
|
||||
#define OMAP4_PAD_USIM_CLK_LOW_MASK (1 << 31)
|
||||
#define OMAP4_PAD_USIM_RST_LOW_SHIFT 29
|
||||
#define OMAP4_PAD_USIM_RST_LOW_MASK (1 << 29)
|
||||
#define OMAP4_USIM_PWRDNZ_SHIFT 28
|
||||
#define OMAP4_USIM_PWRDNZ_MASK (1 << 28)
|
||||
|
||||
/* CONTROL_I2C_2 */
|
||||
#define OMAP4_SR_SDA_GLFENB_SHIFT 31
|
||||
#define OMAP4_SR_SDA_GLFENB_MASK (1 << 31)
|
||||
#define OMAP4_SR_SDA_LOAD_BITS_SHIFT 29
|
||||
#define OMAP4_SR_SDA_LOAD_BITS_MASK (0x3 << 29)
|
||||
#define OMAP4_SR_SDA_PULLUPRESX_SHIFT 28
|
||||
#define OMAP4_SR_SDA_PULLUPRESX_MASK (1 << 28)
|
||||
#define OMAP4_SR_SCL_GLFENB_SHIFT 27
|
||||
#define OMAP4_SR_SCL_GLFENB_MASK (1 << 27)
|
||||
#define OMAP4_SR_SCL_LOAD_BITS_SHIFT 25
|
||||
#define OMAP4_SR_SCL_LOAD_BITS_MASK (0x3 << 25)
|
||||
#define OMAP4_SR_SCL_PULLUPRESX_SHIFT 24
|
||||
#define OMAP4_SR_SCL_PULLUPRESX_MASK (1 << 24)
|
||||
|
||||
/* CONTROL_JTAG */
|
||||
#define OMAP4_JTAG_NTRST_EN_SHIFT 31
|
||||
#define OMAP4_JTAG_NTRST_EN_MASK (1 << 31)
|
||||
#define OMAP4_JTAG_TCK_EN_SHIFT 30
|
||||
#define OMAP4_JTAG_TCK_EN_MASK (1 << 30)
|
||||
#define OMAP4_JTAG_RTCK_EN_SHIFT 29
|
||||
#define OMAP4_JTAG_RTCK_EN_MASK (1 << 29)
|
||||
#define OMAP4_JTAG_TDI_EN_SHIFT 28
|
||||
#define OMAP4_JTAG_TDI_EN_MASK (1 << 28)
|
||||
#define OMAP4_JTAG_TDO_EN_SHIFT 27
|
||||
#define OMAP4_JTAG_TDO_EN_MASK (1 << 27)
|
||||
|
||||
/* CONTROL_SYS */
|
||||
#define OMAP4_SYS_NRESWARM_PIPU_SHIFT 31
|
||||
#define OMAP4_SYS_NRESWARM_PIPU_MASK (1 << 31)
|
||||
|
||||
/* WKUP_CONTROL_SPARE_RW */
|
||||
#define OMAP4_WKUP_CONTROL_SPARE_RW_SHIFT 0
|
||||
#define OMAP4_WKUP_CONTROL_SPARE_RW_MASK (0xffffffff << 0)
|
||||
|
||||
/* WKUP_CONTROL_SPARE_R */
|
||||
#define OMAP4_WKUP_CONTROL_SPARE_R_SHIFT 0
|
||||
#define OMAP4_WKUP_CONTROL_SPARE_R_MASK (0xffffffff << 0)
|
||||
|
||||
/* WKUP_CONTROL_SPARE_R_C0 */
|
||||
#define OMAP4_WKUP_CONTROL_SPARE_R_C0_SHIFT 31
|
||||
#define OMAP4_WKUP_CONTROL_SPARE_R_C0_MASK (1 << 31)
|
||||
#define OMAP4_WKUP_CONTROL_SPARE_R_C1_SHIFT 30
|
||||
#define OMAP4_WKUP_CONTROL_SPARE_R_C1_MASK (1 << 30)
|
||||
#define OMAP4_WKUP_CONTROL_SPARE_R_C2_SHIFT 29
|
||||
#define OMAP4_WKUP_CONTROL_SPARE_R_C2_MASK (1 << 29)
|
||||
#define OMAP4_WKUP_CONTROL_SPARE_R_C3_SHIFT 28
|
||||
#define OMAP4_WKUP_CONTROL_SPARE_R_C3_MASK (1 << 28)
|
||||
#define OMAP4_WKUP_CONTROL_SPARE_R_C4_SHIFT 27
|
||||
#define OMAP4_WKUP_CONTROL_SPARE_R_C4_MASK (1 << 27)
|
||||
#define OMAP4_WKUP_CONTROL_SPARE_R_C5_SHIFT 26
|
||||
#define OMAP4_WKUP_CONTROL_SPARE_R_C5_MASK (1 << 26)
|
||||
#define OMAP4_WKUP_CONTROL_SPARE_R_C6_SHIFT 25
|
||||
#define OMAP4_WKUP_CONTROL_SPARE_R_C6_MASK (1 << 25)
|
||||
#define OMAP4_WKUP_CONTROL_SPARE_R_C7_SHIFT 24
|
||||
#define OMAP4_WKUP_CONTROL_SPARE_R_C7_MASK (1 << 24)
|
||||
|
||||
#endif
|
92
arch/arm/mach-omap2/include/mach/ctrl_module_wkup_44xx.h
Normal file
92
arch/arm/mach-omap2/include/mach/ctrl_module_wkup_44xx.h
Normal file
@ -0,0 +1,92 @@
|
||||
/*
|
||||
* OMAP44xx CTRL_MODULE_WKUP registers and bitfields
|
||||
*
|
||||
* Copyright (C) 2009-2010 Texas Instruments, Inc.
|
||||
*
|
||||
* Benoit Cousson (b-cousson@ti.com)
|
||||
* Santosh Shilimkar (santosh.shilimkar@ti.com)
|
||||
*
|
||||
* This file is automatically generated from the OMAP hardware databases.
|
||||
* We respectfully ask that any modifications to this file be coordinated
|
||||
* with the public linux-omap@vger.kernel.org mailing list and the
|
||||
* authors above to ensure that the autogeneration scripts are kept
|
||||
* up-to-date with the file contents.
|
||||
*
|
||||
* 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 __ARCH_ARM_MACH_OMAP2_CTRL_MODULE_WKUP_44XX_H
|
||||
#define __ARCH_ARM_MACH_OMAP2_CTRL_MODULE_WKUP_44XX_H
|
||||
|
||||
|
||||
/* Base address */
|
||||
#define OMAP4_CTRL_MODULE_WKUP 0x4a30c000
|
||||
|
||||
/* Registers offset */
|
||||
#define OMAP4_CTRL_MODULE_WKUP_IP_REVISION 0x0000
|
||||
#define OMAP4_CTRL_MODULE_WKUP_IP_HWINFO 0x0004
|
||||
#define OMAP4_CTRL_MODULE_WKUP_IP_SYSCONFIG 0x0010
|
||||
#define OMAP4_CTRL_MODULE_WKUP_CONF_DEBUG_SEL_TST_0 0x0460
|
||||
#define OMAP4_CTRL_MODULE_WKUP_CONF_DEBUG_SEL_TST_1 0x0464
|
||||
#define OMAP4_CTRL_MODULE_WKUP_CONF_DEBUG_SEL_TST_2 0x0468
|
||||
#define OMAP4_CTRL_MODULE_WKUP_CONF_DEBUG_SEL_TST_3 0x046c
|
||||
#define OMAP4_CTRL_MODULE_WKUP_CONF_DEBUG_SEL_TST_4 0x0470
|
||||
#define OMAP4_CTRL_MODULE_WKUP_CONF_DEBUG_SEL_TST_5 0x0474
|
||||
#define OMAP4_CTRL_MODULE_WKUP_CONF_DEBUG_SEL_TST_6 0x0478
|
||||
#define OMAP4_CTRL_MODULE_WKUP_CONF_DEBUG_SEL_TST_7 0x047c
|
||||
#define OMAP4_CTRL_MODULE_WKUP_CONF_DEBUG_SEL_TST_8 0x0480
|
||||
#define OMAP4_CTRL_MODULE_WKUP_CONF_DEBUG_SEL_TST_9 0x0484
|
||||
#define OMAP4_CTRL_MODULE_WKUP_CONF_DEBUG_SEL_TST_10 0x0488
|
||||
#define OMAP4_CTRL_MODULE_WKUP_CONF_DEBUG_SEL_TST_11 0x048c
|
||||
#define OMAP4_CTRL_MODULE_WKUP_CONF_DEBUG_SEL_TST_12 0x0490
|
||||
#define OMAP4_CTRL_MODULE_WKUP_CONF_DEBUG_SEL_TST_13 0x0494
|
||||
#define OMAP4_CTRL_MODULE_WKUP_CONF_DEBUG_SEL_TST_14 0x0498
|
||||
#define OMAP4_CTRL_MODULE_WKUP_CONF_DEBUG_SEL_TST_15 0x049c
|
||||
#define OMAP4_CTRL_MODULE_WKUP_CONF_DEBUG_SEL_TST_16 0x04a0
|
||||
#define OMAP4_CTRL_MODULE_WKUP_CONF_DEBUG_SEL_TST_17 0x04a4
|
||||
#define OMAP4_CTRL_MODULE_WKUP_CONF_DEBUG_SEL_TST_18 0x04a8
|
||||
#define OMAP4_CTRL_MODULE_WKUP_CONF_DEBUG_SEL_TST_19 0x04ac
|
||||
#define OMAP4_CTRL_MODULE_WKUP_CONF_DEBUG_SEL_TST_20 0x04b0
|
||||
#define OMAP4_CTRL_MODULE_WKUP_CONF_DEBUG_SEL_TST_21 0x04b4
|
||||
#define OMAP4_CTRL_MODULE_WKUP_CONF_DEBUG_SEL_TST_22 0x04b8
|
||||
#define OMAP4_CTRL_MODULE_WKUP_CONF_DEBUG_SEL_TST_23 0x04bc
|
||||
#define OMAP4_CTRL_MODULE_WKUP_CONF_DEBUG_SEL_TST_24 0x04c0
|
||||
#define OMAP4_CTRL_MODULE_WKUP_CONF_DEBUG_SEL_TST_25 0x04c4
|
||||
#define OMAP4_CTRL_MODULE_WKUP_CONF_DEBUG_SEL_TST_26 0x04c8
|
||||
#define OMAP4_CTRL_MODULE_WKUP_CONF_DEBUG_SEL_TST_27 0x04cc
|
||||
#define OMAP4_CTRL_MODULE_WKUP_CONF_DEBUG_SEL_TST_28 0x04d0
|
||||
#define OMAP4_CTRL_MODULE_WKUP_CONF_DEBUG_SEL_TST_29 0x04d4
|
||||
#define OMAP4_CTRL_MODULE_WKUP_CONF_DEBUG_SEL_TST_30 0x04d8
|
||||
#define OMAP4_CTRL_MODULE_WKUP_CONF_DEBUG_SEL_TST_31 0x04dc
|
||||
|
||||
/* Registers shifts and masks */
|
||||
|
||||
/* IP_REVISION */
|
||||
#define OMAP4_IP_REV_SCHEME_SHIFT 30
|
||||
#define OMAP4_IP_REV_SCHEME_MASK (0x3 << 30)
|
||||
#define OMAP4_IP_REV_FUNC_SHIFT 16
|
||||
#define OMAP4_IP_REV_FUNC_MASK (0xfff << 16)
|
||||
#define OMAP4_IP_REV_RTL_SHIFT 11
|
||||
#define OMAP4_IP_REV_RTL_MASK (0x1f << 11)
|
||||
#define OMAP4_IP_REV_MAJOR_SHIFT 8
|
||||
#define OMAP4_IP_REV_MAJOR_MASK (0x7 << 8)
|
||||
#define OMAP4_IP_REV_CUSTOM_SHIFT 6
|
||||
#define OMAP4_IP_REV_CUSTOM_MASK (0x3 << 6)
|
||||
#define OMAP4_IP_REV_MINOR_SHIFT 0
|
||||
#define OMAP4_IP_REV_MINOR_MASK (0x3f << 0)
|
||||
|
||||
/* IP_HWINFO */
|
||||
#define OMAP4_IP_HWINFO_SHIFT 0
|
||||
#define OMAP4_IP_HWINFO_MASK (0xffffffff << 0)
|
||||
|
||||
/* IP_SYSCONFIG */
|
||||
#define OMAP4_IP_SYSCONFIG_IDLEMODE_SHIFT 2
|
||||
#define OMAP4_IP_SYSCONFIG_IDLEMODE_MASK (0x3 << 2)
|
||||
|
||||
/* CONF_DEBUG_SEL_TST_0 */
|
||||
#define OMAP4_WKUP_MODE_SHIFT 0
|
||||
#define OMAP4_WKUP_MODE_MASK (1 << 0)
|
||||
|
||||
#endif
|
@ -36,6 +36,7 @@
|
||||
#include "clock2xxx.h"
|
||||
#include "clock3xxx.h"
|
||||
#include "clock44xx.h"
|
||||
#include "io.h"
|
||||
|
||||
#include <plat/omap-pm.h>
|
||||
#include <plat/powerdomain.h>
|
||||
@ -323,6 +324,9 @@ void __init omap2_init_common_hw(struct omap_sdrc_params *sdrc_cs0,
|
||||
omap2430_hwmod_init();
|
||||
else if (cpu_is_omap34xx())
|
||||
omap3xxx_hwmod_init();
|
||||
else if (cpu_is_omap44xx())
|
||||
omap44xx_hwmod_init();
|
||||
|
||||
/* The OPP tables have to be registered before a clk init */
|
||||
omap_pm_if_early_init(mpu_opps, dsp_opps, l3_opps);
|
||||
|
||||
@ -342,9 +346,7 @@ void __init omap2_init_common_hw(struct omap_sdrc_params *sdrc_cs0,
|
||||
#ifndef CONFIG_PM_RUNTIME
|
||||
skip_setup_idle = 1;
|
||||
#endif
|
||||
if (cpu_is_omap24xx() || cpu_is_omap34xx()) /* FIXME: OMAP4 */
|
||||
omap_hwmod_late_init(skip_setup_idle);
|
||||
|
||||
omap_hwmod_late_init(skip_setup_idle);
|
||||
if (cpu_is_omap24xx() || cpu_is_omap34xx()) {
|
||||
omap2_sdrc_init(sdrc_cs0, sdrc_cs1);
|
||||
_omap2_init_reprogram_sdrc();
|
||||
|
7
arch/arm/mach-omap2/io.h
Normal file
7
arch/arm/mach-omap2/io.h
Normal file
@ -0,0 +1,7 @@
|
||||
|
||||
#ifndef __MACH_OMAP2_IO_H__
|
||||
#define __MACH_OMAP2_IO_H__
|
||||
|
||||
extern int __init omap_sram_init(void);
|
||||
|
||||
#endif /* __MACH_OMAP2_IO_H__ */
|
@ -47,7 +47,6 @@ static struct omap_irq_bank {
|
||||
} __attribute__ ((aligned(4))) irq_banks[] = {
|
||||
{
|
||||
/* MPU INTC */
|
||||
.base_reg = 0,
|
||||
.nr_irqs = 96,
|
||||
},
|
||||
};
|
||||
|
@ -181,7 +181,7 @@ static int omap2_mbox_fifo_full(struct omap_mbox *mbox)
|
||||
static void omap2_mbox_enable_irq(struct omap_mbox *mbox,
|
||||
omap_mbox_type_t irq)
|
||||
{
|
||||
struct omap_mbox2_priv *p = (struct omap_mbox2_priv *)mbox->priv;
|
||||
struct omap_mbox2_priv *p = mbox->priv;
|
||||
u32 l, bit = (irq == IRQ_TX) ? p->notfull_bit : p->newmsg_bit;
|
||||
|
||||
l = mbox_read_reg(p->irqenable);
|
||||
@ -192,7 +192,7 @@ static void omap2_mbox_enable_irq(struct omap_mbox *mbox,
|
||||
static void omap2_mbox_disable_irq(struct omap_mbox *mbox,
|
||||
omap_mbox_type_t irq)
|
||||
{
|
||||
struct omap_mbox2_priv *p = (struct omap_mbox2_priv *)mbox->priv;
|
||||
struct omap_mbox2_priv *p = mbox->priv;
|
||||
u32 l, bit = (irq == IRQ_TX) ? p->notfull_bit : p->newmsg_bit;
|
||||
l = mbox_read_reg(p->irqdisable);
|
||||
l &= ~bit;
|
||||
@ -202,7 +202,7 @@ static void omap2_mbox_disable_irq(struct omap_mbox *mbox,
|
||||
static void omap2_mbox_ack_irq(struct omap_mbox *mbox,
|
||||
omap_mbox_type_t irq)
|
||||
{
|
||||
struct omap_mbox2_priv *p = (struct omap_mbox2_priv *)mbox->priv;
|
||||
struct omap_mbox2_priv *p = mbox->priv;
|
||||
u32 bit = (irq == IRQ_TX) ? p->notfull_bit : p->newmsg_bit;
|
||||
|
||||
mbox_write_reg(bit, p->irqstatus);
|
||||
@ -214,7 +214,7 @@ static void omap2_mbox_ack_irq(struct omap_mbox *mbox,
|
||||
static int omap2_mbox_is_irq(struct omap_mbox *mbox,
|
||||
omap_mbox_type_t irq)
|
||||
{
|
||||
struct omap_mbox2_priv *p = (struct omap_mbox2_priv *)mbox->priv;
|
||||
struct omap_mbox2_priv *p = mbox->priv;
|
||||
u32 bit = (irq == IRQ_TX) ? p->notfull_bit : p->newmsg_bit;
|
||||
u32 enable = mbox_read_reg(p->irqenable);
|
||||
u32 status = mbox_read_reg(p->irqstatus);
|
||||
|
@ -23,29 +23,86 @@
|
||||
#include <plat/cpu.h>
|
||||
#include <plat/mcbsp.h>
|
||||
|
||||
#include "mux.h"
|
||||
#include "control.h"
|
||||
|
||||
static void omap2_mcbsp2_mux_setup(void)
|
||||
|
||||
/* McBSP internal signal muxing functions */
|
||||
|
||||
void omap2_mcbsp1_mux_clkr_src(u8 mux)
|
||||
{
|
||||
omap_mux_init_signal("eac_ac_sclk.mcbsp2_clkx", OMAP_PULL_ENA);
|
||||
omap_mux_init_signal("eac_ac_fs.mcbsp2_fsx", OMAP_PULL_ENA);
|
||||
omap_mux_init_signal("eac_ac_din.mcbsp2_dr", OMAP_PULL_ENA);
|
||||
omap_mux_init_signal("eac_ac_dout.mcbsp2_dx", OMAP_PULL_ENA);
|
||||
omap_mux_init_gpio(117, OMAP_PULL_ENA);
|
||||
/*
|
||||
* TODO: Need to add MUX settings for OMAP 2430 SDP
|
||||
*/
|
||||
}
|
||||
u32 v;
|
||||
|
||||
static void omap2_mcbsp_request(unsigned int id)
|
||||
v = omap_ctrl_readl(OMAP2_CONTROL_DEVCONF0);
|
||||
if (mux == CLKR_SRC_CLKR)
|
||||
v &= ~OMAP2_MCBSP1_CLKR_MASK;
|
||||
else if (mux == CLKR_SRC_CLKX)
|
||||
v |= OMAP2_MCBSP1_CLKR_MASK;
|
||||
omap_ctrl_writel(v, OMAP2_CONTROL_DEVCONF0);
|
||||
}
|
||||
EXPORT_SYMBOL(omap2_mcbsp1_mux_clkr_src);
|
||||
|
||||
void omap2_mcbsp1_mux_fsr_src(u8 mux)
|
||||
{
|
||||
if (cpu_is_omap2420() && (id == OMAP_MCBSP2))
|
||||
omap2_mcbsp2_mux_setup();
|
||||
}
|
||||
u32 v;
|
||||
|
||||
static struct omap_mcbsp_ops omap2_mcbsp_ops = {
|
||||
.request = omap2_mcbsp_request,
|
||||
};
|
||||
v = omap_ctrl_readl(OMAP2_CONTROL_DEVCONF0);
|
||||
if (mux == FSR_SRC_FSR)
|
||||
v &= ~OMAP2_MCBSP1_FSR_MASK;
|
||||
else if (mux == FSR_SRC_FSX)
|
||||
v |= OMAP2_MCBSP1_FSR_MASK;
|
||||
omap_ctrl_writel(v, OMAP2_CONTROL_DEVCONF0);
|
||||
}
|
||||
EXPORT_SYMBOL(omap2_mcbsp1_mux_fsr_src);
|
||||
|
||||
/* McBSP CLKS source switching function */
|
||||
|
||||
int omap2_mcbsp_set_clks_src(u8 id, u8 fck_src_id)
|
||||
{
|
||||
struct omap_mcbsp *mcbsp;
|
||||
struct clk *fck_src;
|
||||
char *fck_src_name;
|
||||
int r;
|
||||
|
||||
if (!omap_mcbsp_check_valid_id(id)) {
|
||||
pr_err("%s: Invalid id (%d)\n", __func__, id + 1);
|
||||
return -EINVAL;
|
||||
}
|
||||
mcbsp = id_to_mcbsp_ptr(id);
|
||||
|
||||
if (fck_src_id == MCBSP_CLKS_PAD_SRC)
|
||||
fck_src_name = "pad_fck";
|
||||
else if (fck_src_id == MCBSP_CLKS_PRCM_SRC)
|
||||
fck_src_name = "prcm_fck";
|
||||
else
|
||||
return -EINVAL;
|
||||
|
||||
fck_src = clk_get(mcbsp->dev, fck_src_name);
|
||||
if (IS_ERR_OR_NULL(fck_src)) {
|
||||
pr_err("omap-mcbsp: %s: could not clk_get() %s\n", "clks",
|
||||
fck_src_name);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
clk_disable(mcbsp->fclk);
|
||||
|
||||
r = clk_set_parent(mcbsp->fclk, fck_src);
|
||||
if (IS_ERR_VALUE(r)) {
|
||||
pr_err("omap-mcbsp: %s: could not clk_set_parent() to %s\n",
|
||||
"clks", fck_src_name);
|
||||
clk_put(fck_src);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
clk_enable(mcbsp->fclk);
|
||||
|
||||
clk_put(fck_src);
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(omap2_mcbsp_set_clks_src);
|
||||
|
||||
|
||||
/* Platform data */
|
||||
|
||||
#ifdef CONFIG_ARCH_OMAP2420
|
||||
static struct omap_mcbsp_platform_data omap2420_mcbsp_pdata[] = {
|
||||
@ -55,7 +112,6 @@ static struct omap_mcbsp_platform_data omap2420_mcbsp_pdata[] = {
|
||||
.dma_tx_sync = OMAP24XX_DMA_MCBSP1_TX,
|
||||
.rx_irq = INT_24XX_MCBSP1_IRQ_RX,
|
||||
.tx_irq = INT_24XX_MCBSP1_IRQ_TX,
|
||||
.ops = &omap2_mcbsp_ops,
|
||||
},
|
||||
{
|
||||
.phys_base = OMAP24XX_MCBSP2_BASE,
|
||||
@ -63,7 +119,6 @@ static struct omap_mcbsp_platform_data omap2420_mcbsp_pdata[] = {
|
||||
.dma_tx_sync = OMAP24XX_DMA_MCBSP2_TX,
|
||||
.rx_irq = INT_24XX_MCBSP2_IRQ_RX,
|
||||
.tx_irq = INT_24XX_MCBSP2_IRQ_TX,
|
||||
.ops = &omap2_mcbsp_ops,
|
||||
},
|
||||
};
|
||||
#define OMAP2420_MCBSP_PDATA_SZ ARRAY_SIZE(omap2420_mcbsp_pdata)
|
||||
@ -82,7 +137,6 @@ static struct omap_mcbsp_platform_data omap2430_mcbsp_pdata[] = {
|
||||
.dma_tx_sync = OMAP24XX_DMA_MCBSP1_TX,
|
||||
.rx_irq = INT_24XX_MCBSP1_IRQ_RX,
|
||||
.tx_irq = INT_24XX_MCBSP1_IRQ_TX,
|
||||
.ops = &omap2_mcbsp_ops,
|
||||
},
|
||||
{
|
||||
.phys_base = OMAP24XX_MCBSP2_BASE,
|
||||
@ -90,7 +144,6 @@ static struct omap_mcbsp_platform_data omap2430_mcbsp_pdata[] = {
|
||||
.dma_tx_sync = OMAP24XX_DMA_MCBSP2_TX,
|
||||
.rx_irq = INT_24XX_MCBSP2_IRQ_RX,
|
||||
.tx_irq = INT_24XX_MCBSP2_IRQ_TX,
|
||||
.ops = &omap2_mcbsp_ops,
|
||||
},
|
||||
{
|
||||
.phys_base = OMAP2430_MCBSP3_BASE,
|
||||
@ -98,7 +151,6 @@ static struct omap_mcbsp_platform_data omap2430_mcbsp_pdata[] = {
|
||||
.dma_tx_sync = OMAP24XX_DMA_MCBSP3_TX,
|
||||
.rx_irq = INT_24XX_MCBSP3_IRQ_RX,
|
||||
.tx_irq = INT_24XX_MCBSP3_IRQ_TX,
|
||||
.ops = &omap2_mcbsp_ops,
|
||||
},
|
||||
{
|
||||
.phys_base = OMAP2430_MCBSP4_BASE,
|
||||
@ -106,7 +158,6 @@ static struct omap_mcbsp_platform_data omap2430_mcbsp_pdata[] = {
|
||||
.dma_tx_sync = OMAP24XX_DMA_MCBSP4_TX,
|
||||
.rx_irq = INT_24XX_MCBSP4_IRQ_RX,
|
||||
.tx_irq = INT_24XX_MCBSP4_IRQ_TX,
|
||||
.ops = &omap2_mcbsp_ops,
|
||||
},
|
||||
{
|
||||
.phys_base = OMAP2430_MCBSP5_BASE,
|
||||
@ -114,7 +165,6 @@ static struct omap_mcbsp_platform_data omap2430_mcbsp_pdata[] = {
|
||||
.dma_tx_sync = OMAP24XX_DMA_MCBSP5_TX,
|
||||
.rx_irq = INT_24XX_MCBSP5_IRQ_RX,
|
||||
.tx_irq = INT_24XX_MCBSP5_IRQ_TX,
|
||||
.ops = &omap2_mcbsp_ops,
|
||||
},
|
||||
};
|
||||
#define OMAP2430_MCBSP_PDATA_SZ ARRAY_SIZE(omap2430_mcbsp_pdata)
|
||||
@ -133,7 +183,6 @@ static struct omap_mcbsp_platform_data omap34xx_mcbsp_pdata[] = {
|
||||
.dma_tx_sync = OMAP24XX_DMA_MCBSP1_TX,
|
||||
.rx_irq = INT_24XX_MCBSP1_IRQ_RX,
|
||||
.tx_irq = INT_24XX_MCBSP1_IRQ_TX,
|
||||
.ops = &omap2_mcbsp_ops,
|
||||
.buffer_size = 0x80, /* The FIFO has 128 locations */
|
||||
},
|
||||
{
|
||||
@ -143,7 +192,6 @@ static struct omap_mcbsp_platform_data omap34xx_mcbsp_pdata[] = {
|
||||
.dma_tx_sync = OMAP24XX_DMA_MCBSP2_TX,
|
||||
.rx_irq = INT_24XX_MCBSP2_IRQ_RX,
|
||||
.tx_irq = INT_24XX_MCBSP2_IRQ_TX,
|
||||
.ops = &omap2_mcbsp_ops,
|
||||
.buffer_size = 0x500, /* The FIFO has 1024 + 256 locations */
|
||||
},
|
||||
{
|
||||
@ -153,7 +201,6 @@ static struct omap_mcbsp_platform_data omap34xx_mcbsp_pdata[] = {
|
||||
.dma_tx_sync = OMAP24XX_DMA_MCBSP3_TX,
|
||||
.rx_irq = INT_24XX_MCBSP3_IRQ_RX,
|
||||
.tx_irq = INT_24XX_MCBSP3_IRQ_TX,
|
||||
.ops = &omap2_mcbsp_ops,
|
||||
.buffer_size = 0x80, /* The FIFO has 128 locations */
|
||||
},
|
||||
{
|
||||
@ -162,7 +209,6 @@ static struct omap_mcbsp_platform_data omap34xx_mcbsp_pdata[] = {
|
||||
.dma_tx_sync = OMAP24XX_DMA_MCBSP4_TX,
|
||||
.rx_irq = INT_24XX_MCBSP4_IRQ_RX,
|
||||
.tx_irq = INT_24XX_MCBSP4_IRQ_TX,
|
||||
.ops = &omap2_mcbsp_ops,
|
||||
.buffer_size = 0x80, /* The FIFO has 128 locations */
|
||||
},
|
||||
{
|
||||
@ -171,7 +217,6 @@ static struct omap_mcbsp_platform_data omap34xx_mcbsp_pdata[] = {
|
||||
.dma_tx_sync = OMAP24XX_DMA_MCBSP5_TX,
|
||||
.rx_irq = INT_24XX_MCBSP5_IRQ_RX,
|
||||
.tx_irq = INT_24XX_MCBSP5_IRQ_TX,
|
||||
.ops = &omap2_mcbsp_ops,
|
||||
.buffer_size = 0x80, /* The FIFO has 128 locations */
|
||||
},
|
||||
};
|
||||
@ -189,28 +234,24 @@ static struct omap_mcbsp_platform_data omap44xx_mcbsp_pdata[] = {
|
||||
.dma_rx_sync = OMAP44XX_DMA_MCBSP1_RX,
|
||||
.dma_tx_sync = OMAP44XX_DMA_MCBSP1_TX,
|
||||
.tx_irq = OMAP44XX_IRQ_MCBSP1,
|
||||
.ops = &omap2_mcbsp_ops,
|
||||
},
|
||||
{
|
||||
.phys_base = OMAP44XX_MCBSP2_BASE,
|
||||
.dma_rx_sync = OMAP44XX_DMA_MCBSP2_RX,
|
||||
.dma_tx_sync = OMAP44XX_DMA_MCBSP2_TX,
|
||||
.tx_irq = OMAP44XX_IRQ_MCBSP2,
|
||||
.ops = &omap2_mcbsp_ops,
|
||||
},
|
||||
{
|
||||
.phys_base = OMAP44XX_MCBSP3_BASE,
|
||||
.dma_rx_sync = OMAP44XX_DMA_MCBSP3_RX,
|
||||
.dma_tx_sync = OMAP44XX_DMA_MCBSP3_TX,
|
||||
.tx_irq = OMAP44XX_IRQ_MCBSP3,
|
||||
.ops = &omap2_mcbsp_ops,
|
||||
},
|
||||
{
|
||||
.phys_base = OMAP44XX_MCBSP4_BASE,
|
||||
.dma_rx_sync = OMAP44XX_DMA_MCBSP4_RX,
|
||||
.dma_tx_sync = OMAP44XX_DMA_MCBSP4_TX,
|
||||
.tx_irq = OMAP44XX_IRQ_MCBSP4,
|
||||
.ops = &omap2_mcbsp_ops,
|
||||
},
|
||||
};
|
||||
#define OMAP44XX_MCBSP_PDATA_SZ ARRAY_SIZE(omap44xx_mcbsp_pdata)
|
||||
|
@ -23,12 +23,11 @@
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
#include <linux/module.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/ctype.h>
|
||||
#include <linux/debugfs.h>
|
||||
#include <linux/seq_file.h>
|
||||
@ -36,8 +35,7 @@
|
||||
|
||||
#include <asm/system.h>
|
||||
|
||||
#include <plat/control.h>
|
||||
|
||||
#include "control.h"
|
||||
#include "mux.h"
|
||||
|
||||
#define OMAP_MUX_BASE_OFFSET 0x30 /* Offset from CTRL_BASE */
|
||||
@ -87,7 +85,7 @@ static char *omap_mux_options;
|
||||
int __init omap_mux_init_gpio(int gpio, int val)
|
||||
{
|
||||
struct omap_mux_entry *e;
|
||||
struct omap_mux *gpio_mux;
|
||||
struct omap_mux *gpio_mux = NULL;
|
||||
u16 old_mode;
|
||||
u16 mux_mode;
|
||||
int found = 0;
|
||||
@ -127,17 +125,16 @@ int __init omap_mux_init_gpio(int gpio, int val)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int __init omap_mux_init_signal(char *muxname, int val)
|
||||
int __init omap_mux_init_signal(const char *muxname, int val)
|
||||
{
|
||||
struct omap_mux_entry *e;
|
||||
char *m0_name = NULL, *mode_name = NULL;
|
||||
int found = 0;
|
||||
const char *mode_name;
|
||||
int found = 0, mode0_len = 0;
|
||||
|
||||
mode_name = strchr(muxname, '.');
|
||||
if (mode_name) {
|
||||
*mode_name = '\0';
|
||||
mode0_len = strlen(muxname) - strlen(mode_name);
|
||||
mode_name++;
|
||||
m0_name = muxname;
|
||||
} else {
|
||||
mode_name = muxname;
|
||||
}
|
||||
@ -147,9 +144,11 @@ int __init omap_mux_init_signal(char *muxname, int val)
|
||||
char *m0_entry = m->muxnames[0];
|
||||
int i;
|
||||
|
||||
if (m0_name && strcmp(m0_name, m0_entry))
|
||||
/* First check for full name in mode0.muxmode format */
|
||||
if (mode0_len && strncmp(muxname, m0_entry, mode0_len))
|
||||
continue;
|
||||
|
||||
/* Then check for muxmode only */
|
||||
for (i = 0; i < OMAP_MUX_NR_MODES; i++) {
|
||||
char *mode_cur = m->muxnames[i];
|
||||
|
||||
|
@ -120,7 +120,7 @@ int omap_mux_init_gpio(int gpio, int val);
|
||||
* @muxname: Mux name in mode0_name.signal_name format
|
||||
* @val: Options for the mux register value
|
||||
*/
|
||||
int omap_mux_init_signal(char *muxname, int val);
|
||||
int omap_mux_init_signal(const char *muxname, int val);
|
||||
|
||||
#else
|
||||
|
||||
|
@ -507,7 +507,7 @@ static struct omap_mux __initdata omap2420_muxmodes[] = {
|
||||
* Balls for 447-pin POP package
|
||||
*/
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
struct omap_ball __initdata omap2420_pop_ball[] = {
|
||||
static struct omap_ball __initdata omap2420_pop_ball[] = {
|
||||
_OMAP2420_BALLENTRY(CAM_D0, "y4", NULL),
|
||||
_OMAP2420_BALLENTRY(CAM_D1, "y3", NULL),
|
||||
_OMAP2420_BALLENTRY(CAM_D2, "u7", NULL),
|
||||
|
@ -586,7 +586,7 @@ static struct omap_mux __initdata omap2430_muxmodes[] = {
|
||||
* 447-pin s-PBGA Package, 0.00mm Ball Pitch (Bottom)
|
||||
*/
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
struct omap_ball __initdata omap2430_pop_ball[] = {
|
||||
static struct omap_ball __initdata omap2430_pop_ball[] = {
|
||||
_OMAP2430_BALLENTRY(CAM_D0, "t8", NULL),
|
||||
_OMAP2430_BALLENTRY(CAM_D1, "t4", NULL),
|
||||
_OMAP2430_BALLENTRY(CAM_D10, "r4", NULL),
|
||||
|
@ -931,7 +931,7 @@ struct omap_ball __initdata omap3_cbc_ball[] = {
|
||||
* Signals different on CUS package compared to superset
|
||||
*/
|
||||
#if defined(CONFIG_OMAP_MUX) && defined(CONFIG_OMAP_PACKAGE_CUS)
|
||||
struct omap_mux __initdata omap3_cus_subset[] = {
|
||||
static struct omap_mux __initdata omap3_cus_subset[] = {
|
||||
_OMAP3_MUXENTRY(CAM_D10, 109,
|
||||
"cam_d10", NULL, NULL, NULL,
|
||||
"gpio_109", NULL, NULL, "safe_mode"),
|
||||
@ -1077,7 +1077,7 @@ struct omap_mux __initdata omap3_cus_subset[] = {
|
||||
*/
|
||||
#if defined(CONFIG_OMAP_MUX) && defined(CONFIG_DEBUG_FS) \
|
||||
&& defined(CONFIG_OMAP_PACKAGE_CUS)
|
||||
struct omap_ball __initdata omap3_cus_ball[] = {
|
||||
static struct omap_ball __initdata omap3_cus_ball[] = {
|
||||
_OMAP3_BALLENTRY(CAM_D0, "ab18", NULL),
|
||||
_OMAP3_BALLENTRY(CAM_D1, "ac18", NULL),
|
||||
_OMAP3_BALLENTRY(CAM_D10, "f21", NULL),
|
||||
@ -1269,7 +1269,7 @@ struct omap_ball __initdata omap3_cus_ball[] = {
|
||||
* Signals different on CBB package comapared to superset
|
||||
*/
|
||||
#if defined(CONFIG_OMAP_MUX) && defined(CONFIG_OMAP_PACKAGE_CBB)
|
||||
struct omap_mux __initdata omap3_cbb_subset[] = {
|
||||
static struct omap_mux __initdata omap3_cbb_subset[] = {
|
||||
_OMAP3_MUXENTRY(CAM_D10, 109,
|
||||
"cam_d10", NULL, NULL, NULL,
|
||||
"gpio_109", NULL, NULL, "safe_mode"),
|
||||
@ -1390,7 +1390,7 @@ struct omap_mux __initdata omap3_cbb_subset[] = {
|
||||
*/
|
||||
#if defined(CONFIG_OMAP_MUX) && defined(CONFIG_DEBUG_FS) \
|
||||
&& defined(CONFIG_OMAP_PACKAGE_CBB)
|
||||
struct omap_ball __initdata omap3_cbb_ball[] = {
|
||||
static struct omap_ball __initdata omap3_cbb_ball[] = {
|
||||
_OMAP3_BALLENTRY(CAM_D0, "ag17", NULL),
|
||||
_OMAP3_BALLENTRY(CAM_D1, "ah17", NULL),
|
||||
_OMAP3_BALLENTRY(CAM_D10, "b25", NULL),
|
||||
@ -1600,7 +1600,7 @@ struct omap_ball __initdata omap3_cbb_ball[] = {
|
||||
* Signals different on 36XX CBP package comapared to 34XX CBC package
|
||||
*/
|
||||
#if defined(CONFIG_OMAP_MUX) && defined(CONFIG_OMAP_PACKAGE_CBP)
|
||||
struct omap_mux __initdata omap36xx_cbp_subset[] = {
|
||||
static struct omap_mux __initdata omap36xx_cbp_subset[] = {
|
||||
_OMAP3_MUXENTRY(CAM_D0, 99,
|
||||
"cam_d0", NULL, "csi2_dx2", NULL,
|
||||
"gpio_99", NULL, NULL, "safe_mode"),
|
||||
@ -1818,7 +1818,7 @@ struct omap_mux __initdata omap36xx_cbp_subset[] = {
|
||||
*/
|
||||
#if defined(CONFIG_OMAP_MUX) && defined(CONFIG_DEBUG_FS) \
|
||||
&& defined (CONFIG_OMAP_PACKAGE_CBP)
|
||||
struct omap_ball __initdata omap36xx_cbp_ball[] = {
|
||||
static struct omap_ball __initdata omap36xx_cbp_ball[] = {
|
||||
_OMAP3_BALLENTRY(CAM_D0, "ag17", NULL),
|
||||
_OMAP3_BALLENTRY(CAM_D1, "ah17", NULL),
|
||||
_OMAP3_BALLENTRY(CAM_D10, "b25", NULL),
|
||||
|
@ -61,10 +61,14 @@ static int __init omap_l2_cache_init(void)
|
||||
omap_smc1(0x102, 0x1);
|
||||
|
||||
/*
|
||||
* 32KB way size, 16-way associativity,
|
||||
* parity disabled
|
||||
* 16-way associativity, parity disabled
|
||||
* Way size - 32KB (es1.0)
|
||||
* Way size - 64KB (es2.0 +)
|
||||
*/
|
||||
l2x0_init(l2cache_base, 0x0e050000, 0xc0000fff);
|
||||
if (omap_rev() == OMAP4430_REV_ES1_0)
|
||||
l2x0_init(l2cache_base, 0x0e050000, 0xc0000fff);
|
||||
else
|
||||
l2x0_init(l2cache_base, 0x0e070000, 0xc0000fff);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -13,10 +13,102 @@
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code manages "OMAP modules" (on-chip devices) and their
|
||||
* integration with Linux device driver and bus code.
|
||||
* Introduction
|
||||
* ------------
|
||||
* One way to view an OMAP SoC is as a collection of largely unrelated
|
||||
* IP blocks connected by interconnects. The IP blocks include
|
||||
* devices such as ARM processors, audio serial interfaces, UARTs,
|
||||
* etc. Some of these devices, like the DSP, are created by TI;
|
||||
* others, like the SGX, largely originate from external vendors. In
|
||||
* TI's documentation, on-chip devices are referred to as "OMAP
|
||||
* modules." Some of these IP blocks are identical across several
|
||||
* OMAP versions. Others are revised frequently.
|
||||
*
|
||||
* References:
|
||||
* These OMAP modules are tied together by various interconnects.
|
||||
* Most of the address and data flow between modules is via OCP-based
|
||||
* interconnects such as the L3 and L4 buses; but there are other
|
||||
* interconnects that distribute the hardware clock tree, handle idle
|
||||
* and reset signaling, supply power, and connect the modules to
|
||||
* various pads or balls on the OMAP package.
|
||||
*
|
||||
* OMAP hwmod provides a consistent way to describe the on-chip
|
||||
* hardware blocks and their integration into the rest of the chip.
|
||||
* This description can be automatically generated from the TI
|
||||
* hardware database. OMAP hwmod provides a standard, consistent API
|
||||
* to reset, enable, idle, and disable these hardware blocks. And
|
||||
* hwmod provides a way for other core code, such as the Linux device
|
||||
* code or the OMAP power management and address space mapping code,
|
||||
* to query the hardware database.
|
||||
*
|
||||
* Using hwmod
|
||||
* -----------
|
||||
* Drivers won't call hwmod functions directly. That is done by the
|
||||
* omap_device code, and in rare occasions, by custom integration code
|
||||
* in arch/arm/ *omap*. The omap_device code includes functions to
|
||||
* build a struct platform_device using omap_hwmod data, and that is
|
||||
* currently how hwmod data is communicated to drivers and to the
|
||||
* Linux driver model. Most drivers will call omap_hwmod functions only
|
||||
* indirectly, via pm_runtime*() functions.
|
||||
*
|
||||
* From a layering perspective, here is where the OMAP hwmod code
|
||||
* fits into the kernel software stack:
|
||||
*
|
||||
* +-------------------------------+
|
||||
* | Device driver code |
|
||||
* | (e.g., drivers/) |
|
||||
* +-------------------------------+
|
||||
* | Linux driver model |
|
||||
* | (platform_device / |
|
||||
* | platform_driver data/code) |
|
||||
* +-------------------------------+
|
||||
* | OMAP core-driver integration |
|
||||
* |(arch/arm/mach-omap2/devices.c)|
|
||||
* +-------------------------------+
|
||||
* | omap_device code |
|
||||
* | (../plat-omap/omap_device.c) |
|
||||
* +-------------------------------+
|
||||
* ----> | omap_hwmod code/data | <-----
|
||||
* | (../mach-omap2/omap_hwmod*) |
|
||||
* +-------------------------------+
|
||||
* | OMAP clock/PRCM/register fns |
|
||||
* | (__raw_{read,write}l, clk*) |
|
||||
* +-------------------------------+
|
||||
*
|
||||
* Device drivers should not contain any OMAP-specific code or data in
|
||||
* them. They should only contain code to operate the IP block that
|
||||
* the driver is responsible for. This is because these IP blocks can
|
||||
* also appear in other SoCs, either from TI (such as DaVinci) or from
|
||||
* other manufacturers; and drivers should be reusable across other
|
||||
* platforms.
|
||||
*
|
||||
* The OMAP hwmod code also will attempt to reset and idle all on-chip
|
||||
* devices upon boot. The goal here is for the kernel to be
|
||||
* completely self-reliant and independent from bootloaders. This is
|
||||
* to ensure a repeatable configuration, both to ensure consistent
|
||||
* runtime behavior, and to make it easier for others to reproduce
|
||||
* bugs.
|
||||
*
|
||||
* OMAP module activity states
|
||||
* ---------------------------
|
||||
* The hwmod code considers modules to be in one of several activity
|
||||
* states. IP blocks start out in an UNKNOWN state, then once they
|
||||
* are registered via the hwmod code, proceed to the REGISTERED state.
|
||||
* Once their clock names are resolved to clock pointers, the module
|
||||
* enters the CLKS_INITED state; and finally, once the module has been
|
||||
* reset and the integration registers programmed, the INITIALIZED state
|
||||
* is entered. The hwmod code will then place the module into either
|
||||
* the IDLE state to save power, or in the case of a critical system
|
||||
* module, the ENABLED state.
|
||||
*
|
||||
* OMAP core integration code can then call omap_hwmod*() functions
|
||||
* directly to move the module between the IDLE, ENABLED, and DISABLED
|
||||
* states, as needed. This is done during both the PM idle loop, and
|
||||
* in the OMAP core integration code's implementation of the PM runtime
|
||||
* functions.
|
||||
*
|
||||
* References
|
||||
* ----------
|
||||
* This is a partial list.
|
||||
* - OMAP2420 Multimedia Processor Silicon Revision 2.1.1, 2.2 (SWPU064)
|
||||
* - OMAP2430 Multimedia Device POP Silicon Revision 2.1 (SWPU090)
|
||||
* - OMAP34xx Multimedia Device Silicon Revision 3.1 (SWPU108)
|
||||
@ -50,11 +142,13 @@
|
||||
#include <plat/powerdomain.h>
|
||||
#include <plat/clock.h>
|
||||
#include <plat/omap_hwmod.h>
|
||||
#include <plat/prcm.h>
|
||||
|
||||
#include "cm.h"
|
||||
#include "prm.h"
|
||||
|
||||
/* Maximum microseconds to wait for OMAP module to reset */
|
||||
#define MAX_MODULE_RESET_WAIT 10000
|
||||
/* Maximum microseconds to wait for OMAP module to softreset */
|
||||
#define MAX_MODULE_SOFTRESET_WAIT 10000
|
||||
|
||||
/* Name of the OMAP hwmod for the MPU */
|
||||
#define MPU_INITIATOR_NAME "mpu"
|
||||
@ -90,7 +184,7 @@ static int _update_sysc_cache(struct omap_hwmod *oh)
|
||||
|
||||
/* XXX ensure module interface clock is up */
|
||||
|
||||
oh->_sysc_cache = omap_hwmod_readl(oh, oh->class->sysc->sysc_offs);
|
||||
oh->_sysc_cache = omap_hwmod_read(oh, oh->class->sysc->sysc_offs);
|
||||
|
||||
if (!(oh->class->sysc->sysc_flags & SYSC_NO_CACHE))
|
||||
oh->_int_flags |= _HWMOD_SYSCONFIG_LOADED;
|
||||
@ -117,7 +211,7 @@ static void _write_sysconfig(u32 v, struct omap_hwmod *oh)
|
||||
|
||||
if (oh->_sysc_cache != v) {
|
||||
oh->_sysc_cache = v;
|
||||
omap_hwmod_writel(v, oh, oh->class->sysc->sysc_offs);
|
||||
omap_hwmod_write(v, oh, oh->class->sysc->sysc_offs);
|
||||
}
|
||||
}
|
||||
|
||||
@ -544,6 +638,36 @@ static int _disable_clocks(struct omap_hwmod *oh)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void _enable_optional_clocks(struct omap_hwmod *oh)
|
||||
{
|
||||
struct omap_hwmod_opt_clk *oc;
|
||||
int i;
|
||||
|
||||
pr_debug("omap_hwmod: %s: enabling optional clocks\n", oh->name);
|
||||
|
||||
for (i = oh->opt_clks_cnt, oc = oh->opt_clks; i > 0; i--, oc++)
|
||||
if (oc->_clk) {
|
||||
pr_debug("omap_hwmod: enable %s:%s\n", oc->role,
|
||||
oc->_clk->name);
|
||||
clk_enable(oc->_clk);
|
||||
}
|
||||
}
|
||||
|
||||
static void _disable_optional_clocks(struct omap_hwmod *oh)
|
||||
{
|
||||
struct omap_hwmod_opt_clk *oc;
|
||||
int i;
|
||||
|
||||
pr_debug("omap_hwmod: %s: disabling optional clocks\n", oh->name);
|
||||
|
||||
for (i = oh->opt_clks_cnt, oc = oh->opt_clks; i > 0; i--, oc++)
|
||||
if (oc->_clk) {
|
||||
pr_debug("omap_hwmod: disable %s:%s\n", oc->role,
|
||||
oc->_clk->name);
|
||||
clk_disable(oc->_clk);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* _find_mpu_port_index - find hwmod OCP slave port ID intended for MPU use
|
||||
* @oh: struct omap_hwmod *
|
||||
@ -622,7 +746,7 @@ static void __iomem *_find_mpu_rt_base(struct omap_hwmod *oh, u8 index)
|
||||
}
|
||||
|
||||
/**
|
||||
* _sysc_enable - try to bring a module out of idle via OCP_SYSCONFIG
|
||||
* _enable_sysc - try to bring a module out of idle via OCP_SYSCONFIG
|
||||
* @oh: struct omap_hwmod *
|
||||
*
|
||||
* If module is marked as SWSUP_SIDLE, force the module out of slave
|
||||
@ -630,7 +754,7 @@ static void __iomem *_find_mpu_rt_base(struct omap_hwmod *oh, u8 index)
|
||||
* as SWSUP_MSUSPEND, force the module out of master standby;
|
||||
* otherwise, configure it for smart-standby. No return value.
|
||||
*/
|
||||
static void _sysc_enable(struct omap_hwmod *oh)
|
||||
static void _enable_sysc(struct omap_hwmod *oh)
|
||||
{
|
||||
u8 idlemode, sf;
|
||||
u32 v;
|
||||
@ -653,14 +777,6 @@ static void _sysc_enable(struct omap_hwmod *oh)
|
||||
_set_master_standbymode(oh, idlemode, &v);
|
||||
}
|
||||
|
||||
if (sf & SYSC_HAS_AUTOIDLE) {
|
||||
idlemode = (oh->flags & HWMOD_NO_OCP_AUTOIDLE) ?
|
||||
0 : 1;
|
||||
_set_module_autoidle(oh, idlemode, &v);
|
||||
}
|
||||
|
||||
/* XXX OCP ENAWAKEUP bit? */
|
||||
|
||||
/*
|
||||
* XXX The clock framework should handle this, by
|
||||
* calling into this code. But this must wait until the
|
||||
@ -671,10 +787,25 @@ static void _sysc_enable(struct omap_hwmod *oh)
|
||||
_set_clockactivity(oh, oh->class->sysc->clockact, &v);
|
||||
|
||||
_write_sysconfig(v, oh);
|
||||
|
||||
/* If slave is in SMARTIDLE, also enable wakeup */
|
||||
if ((sf & SYSC_HAS_SIDLEMODE) && !(oh->flags & HWMOD_SWSUP_SIDLE))
|
||||
_enable_wakeup(oh);
|
||||
|
||||
/*
|
||||
* Set the autoidle bit only after setting the smartidle bit
|
||||
* Setting this will not have any impact on the other modules.
|
||||
*/
|
||||
if (sf & SYSC_HAS_AUTOIDLE) {
|
||||
idlemode = (oh->flags & HWMOD_NO_OCP_AUTOIDLE) ?
|
||||
0 : 1;
|
||||
_set_module_autoidle(oh, idlemode, &v);
|
||||
_write_sysconfig(v, oh);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* _sysc_idle - try to put a module into idle via OCP_SYSCONFIG
|
||||
* _idle_sysc - try to put a module into idle via OCP_SYSCONFIG
|
||||
* @oh: struct omap_hwmod *
|
||||
*
|
||||
* If module is marked as SWSUP_SIDLE, force the module into slave
|
||||
@ -682,7 +813,7 @@ static void _sysc_enable(struct omap_hwmod *oh)
|
||||
* as SWSUP_MSUSPEND, force the module into master standby; otherwise,
|
||||
* configure it for smart-standby. No return value.
|
||||
*/
|
||||
static void _sysc_idle(struct omap_hwmod *oh)
|
||||
static void _idle_sysc(struct omap_hwmod *oh)
|
||||
{
|
||||
u8 idlemode, sf;
|
||||
u32 v;
|
||||
@ -709,13 +840,13 @@ static void _sysc_idle(struct omap_hwmod *oh)
|
||||
}
|
||||
|
||||
/**
|
||||
* _sysc_shutdown - force a module into idle via OCP_SYSCONFIG
|
||||
* _shutdown_sysc - force a module into idle via OCP_SYSCONFIG
|
||||
* @oh: struct omap_hwmod *
|
||||
*
|
||||
* Force the module into slave idle and master suspend. No return
|
||||
* value.
|
||||
*/
|
||||
static void _sysc_shutdown(struct omap_hwmod *oh)
|
||||
static void _shutdown_sysc(struct omap_hwmod *oh)
|
||||
{
|
||||
u32 v;
|
||||
u8 sf;
|
||||
@ -767,10 +898,10 @@ static struct omap_hwmod *_lookup(const char *name)
|
||||
* @data: not used; pass NULL
|
||||
*
|
||||
* Called by omap_hwmod_late_init() (after omap2_clk_init()).
|
||||
* Resolves all clock names embedded in the hwmod. Must be called
|
||||
* with omap_hwmod_mutex held. Returns -EINVAL if the omap_hwmod
|
||||
* has not yet been registered or if the clocks have already been
|
||||
* initialized, 0 on success, or a non-zero error on failure.
|
||||
* Resolves all clock names embedded in the hwmod. Returns -EINVAL if
|
||||
* the omap_hwmod has not yet been registered or if the clocks have
|
||||
* already been initialized, 0 on success, or a non-zero error on
|
||||
* failure.
|
||||
*/
|
||||
static int _init_clocks(struct omap_hwmod *oh, void *data)
|
||||
{
|
||||
@ -833,57 +964,203 @@ static int _wait_target_ready(struct omap_hwmod *oh)
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* _lookup_hardreset - return the register bit shift for this hwmod/reset line
|
||||
* @oh: struct omap_hwmod *
|
||||
* @name: name of the reset line in the context of this hwmod
|
||||
*
|
||||
* Return the bit position of the reset line that match the
|
||||
* input name. Return -ENOENT if not found.
|
||||
*/
|
||||
static u8 _lookup_hardreset(struct omap_hwmod *oh, const char *name)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < oh->rst_lines_cnt; i++) {
|
||||
const char *rst_line = oh->rst_lines[i].name;
|
||||
if (!strcmp(rst_line, name)) {
|
||||
u8 shift = oh->rst_lines[i].rst_shift;
|
||||
pr_debug("omap_hwmod: %s: _lookup_hardreset: %s: %d\n",
|
||||
oh->name, rst_line, shift);
|
||||
|
||||
return shift;
|
||||
}
|
||||
}
|
||||
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
/**
|
||||
* _assert_hardreset - assert the HW reset line of submodules
|
||||
* contained in the hwmod module.
|
||||
* @oh: struct omap_hwmod *
|
||||
* @name: name of the reset line to lookup and assert
|
||||
*
|
||||
* Some IP like dsp, ipu or iva contain processor that require
|
||||
* an HW reset line to be assert / deassert in order to enable fully
|
||||
* the IP.
|
||||
*/
|
||||
static int _assert_hardreset(struct omap_hwmod *oh, const char *name)
|
||||
{
|
||||
u8 shift;
|
||||
|
||||
if (!oh)
|
||||
return -EINVAL;
|
||||
|
||||
shift = _lookup_hardreset(oh, name);
|
||||
if (IS_ERR_VALUE(shift))
|
||||
return shift;
|
||||
|
||||
if (cpu_is_omap24xx() || cpu_is_omap34xx())
|
||||
return omap2_prm_assert_hardreset(oh->prcm.omap2.module_offs,
|
||||
shift);
|
||||
else if (cpu_is_omap44xx())
|
||||
return omap4_prm_assert_hardreset(oh->prcm.omap4.rstctrl_reg,
|
||||
shift);
|
||||
else
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/**
|
||||
* _deassert_hardreset - deassert the HW reset line of submodules contained
|
||||
* in the hwmod module.
|
||||
* @oh: struct omap_hwmod *
|
||||
* @name: name of the reset line to look up and deassert
|
||||
*
|
||||
* Some IP like dsp, ipu or iva contain processor that require
|
||||
* an HW reset line to be assert / deassert in order to enable fully
|
||||
* the IP.
|
||||
*/
|
||||
static int _deassert_hardreset(struct omap_hwmod *oh, const char *name)
|
||||
{
|
||||
u8 shift;
|
||||
int r;
|
||||
|
||||
if (!oh)
|
||||
return -EINVAL;
|
||||
|
||||
shift = _lookup_hardreset(oh, name);
|
||||
if (IS_ERR_VALUE(shift))
|
||||
return shift;
|
||||
|
||||
if (cpu_is_omap24xx() || cpu_is_omap34xx())
|
||||
r = omap2_prm_deassert_hardreset(oh->prcm.omap2.module_offs,
|
||||
shift);
|
||||
else if (cpu_is_omap44xx())
|
||||
r = omap4_prm_deassert_hardreset(oh->prcm.omap4.rstctrl_reg,
|
||||
shift);
|
||||
else
|
||||
return -EINVAL;
|
||||
|
||||
if (r == -EBUSY)
|
||||
pr_warning("omap_hwmod: %s: failed to hardreset\n", oh->name);
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
/**
|
||||
* _read_hardreset - read the HW reset line state of submodules
|
||||
* contained in the hwmod module
|
||||
* @oh: struct omap_hwmod *
|
||||
* @name: name of the reset line to look up and read
|
||||
*
|
||||
* Return the state of the reset line.
|
||||
*/
|
||||
static int _read_hardreset(struct omap_hwmod *oh, const char *name)
|
||||
{
|
||||
u8 shift;
|
||||
|
||||
if (!oh)
|
||||
return -EINVAL;
|
||||
|
||||
shift = _lookup_hardreset(oh, name);
|
||||
if (IS_ERR_VALUE(shift))
|
||||
return shift;
|
||||
|
||||
if (cpu_is_omap24xx() || cpu_is_omap34xx()) {
|
||||
return omap2_prm_is_hardreset_asserted(oh->prcm.omap2.module_offs,
|
||||
shift);
|
||||
} else if (cpu_is_omap44xx()) {
|
||||
return omap4_prm_is_hardreset_asserted(oh->prcm.omap4.rstctrl_reg,
|
||||
shift);
|
||||
} else {
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* _reset - reset an omap_hwmod
|
||||
* @oh: struct omap_hwmod *
|
||||
*
|
||||
* Resets an omap_hwmod @oh via the OCP_SYSCONFIG bit. hwmod must be
|
||||
* enabled for this to work. Must be called with omap_hwmod_mutex
|
||||
* held. Returns -EINVAL if the hwmod cannot be reset this way or if
|
||||
* the hwmod is in the wrong state, -ETIMEDOUT if the module did not
|
||||
* reset in time, or 0 upon success.
|
||||
* enabled for this to work. Returns -EINVAL if the hwmod cannot be
|
||||
* reset this way or if the hwmod is in the wrong state, -ETIMEDOUT if
|
||||
* the module did not reset in time, or 0 upon success.
|
||||
*
|
||||
* In OMAP3 a specific SYSSTATUS register is used to get the reset status.
|
||||
* Starting in OMAP4, some IPs does not have SYSSTATUS register and instead
|
||||
* use the SYSCONFIG softreset bit to provide the status.
|
||||
*
|
||||
* Note that some IP like McBSP does have a reset control but no reset status.
|
||||
*/
|
||||
static int _reset(struct omap_hwmod *oh)
|
||||
{
|
||||
u32 r, v;
|
||||
u32 v;
|
||||
int c = 0;
|
||||
int ret = 0;
|
||||
|
||||
if (!oh->class->sysc ||
|
||||
!(oh->class->sysc->sysc_flags & SYSC_HAS_SOFTRESET) ||
|
||||
(oh->class->sysc->sysc_flags & SYSS_MISSING))
|
||||
!(oh->class->sysc->sysc_flags & SYSC_HAS_SOFTRESET))
|
||||
return -EINVAL;
|
||||
|
||||
/* clocks must be on for this operation */
|
||||
if (oh->_state != _HWMOD_STATE_ENABLED) {
|
||||
WARN(1, "omap_hwmod: %s: reset can only be entered from "
|
||||
"enabled state\n", oh->name);
|
||||
pr_warning("omap_hwmod: %s: reset can only be entered from "
|
||||
"enabled state\n", oh->name);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* For some modules, all optionnal clocks need to be enabled as well */
|
||||
if (oh->flags & HWMOD_CONTROL_OPT_CLKS_IN_RESET)
|
||||
_enable_optional_clocks(oh);
|
||||
|
||||
pr_debug("omap_hwmod: %s: resetting\n", oh->name);
|
||||
|
||||
v = oh->_sysc_cache;
|
||||
r = _set_softreset(oh, &v);
|
||||
if (r)
|
||||
return r;
|
||||
ret = _set_softreset(oh, &v);
|
||||
if (ret)
|
||||
goto dis_opt_clks;
|
||||
_write_sysconfig(v, oh);
|
||||
|
||||
omap_test_timeout((omap_hwmod_readl(oh, oh->class->sysc->syss_offs) &
|
||||
SYSS_RESETDONE_MASK),
|
||||
MAX_MODULE_RESET_WAIT, c);
|
||||
if (oh->class->sysc->sysc_flags & SYSS_HAS_RESET_STATUS)
|
||||
omap_test_timeout((omap_hwmod_read(oh,
|
||||
oh->class->sysc->syss_offs)
|
||||
& SYSS_RESETDONE_MASK),
|
||||
MAX_MODULE_SOFTRESET_WAIT, c);
|
||||
else if (oh->class->sysc->sysc_flags & SYSC_HAS_RESET_STATUS)
|
||||
omap_test_timeout(!(omap_hwmod_read(oh,
|
||||
oh->class->sysc->sysc_offs)
|
||||
& SYSC_TYPE2_SOFTRESET_MASK),
|
||||
MAX_MODULE_SOFTRESET_WAIT, c);
|
||||
|
||||
if (c == MAX_MODULE_RESET_WAIT)
|
||||
WARN(1, "omap_hwmod: %s: failed to reset in %d usec\n",
|
||||
oh->name, MAX_MODULE_RESET_WAIT);
|
||||
if (c == MAX_MODULE_SOFTRESET_WAIT)
|
||||
pr_warning("omap_hwmod: %s: softreset failed (waited %d usec)\n",
|
||||
oh->name, MAX_MODULE_SOFTRESET_WAIT);
|
||||
else
|
||||
pr_debug("omap_hwmod: %s: reset in %d usec\n", oh->name, c);
|
||||
pr_debug("omap_hwmod: %s: softreset in %d usec\n", oh->name, c);
|
||||
|
||||
/*
|
||||
* XXX add _HWMOD_STATE_WEDGED for modules that don't come back from
|
||||
* _wait_target_ready() or _reset()
|
||||
*/
|
||||
|
||||
return (c == MAX_MODULE_RESET_WAIT) ? -ETIMEDOUT : 0;
|
||||
ret = (c == MAX_MODULE_SOFTRESET_WAIT) ? -ETIMEDOUT : 0;
|
||||
|
||||
dis_opt_clks:
|
||||
if (oh->flags & HWMOD_CONTROL_OPT_CLKS_IN_RESET)
|
||||
_disable_optional_clocks(oh);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -891,9 +1168,11 @@ static int _reset(struct omap_hwmod *oh)
|
||||
* @oh: struct omap_hwmod *
|
||||
*
|
||||
* Enables an omap_hwmod @oh such that the MPU can access the hwmod's
|
||||
* register target. Must be called with omap_hwmod_mutex held.
|
||||
* Returns -EINVAL if the hwmod is in the wrong state or passes along
|
||||
* the return value of _wait_target_ready().
|
||||
* register target. (This function has a full name --
|
||||
* _omap_hwmod_enable() rather than simply _enable() -- because it is
|
||||
* currently required by the pm34xx.c idle loop.) Returns -EINVAL if
|
||||
* the hwmod is in the wrong state or passes along the return value of
|
||||
* _wait_target_ready().
|
||||
*/
|
||||
int _omap_hwmod_enable(struct omap_hwmod *oh)
|
||||
{
|
||||
@ -909,6 +1188,15 @@ int _omap_hwmod_enable(struct omap_hwmod *oh)
|
||||
|
||||
pr_debug("omap_hwmod: %s: enabling\n", oh->name);
|
||||
|
||||
/*
|
||||
* If an IP contains only one HW reset line, then de-assert it in order
|
||||
* to allow to enable the clocks. Otherwise the PRCM will return
|
||||
* Intransition status, and the init will failed.
|
||||
*/
|
||||
if ((oh->_state == _HWMOD_STATE_INITIALIZED ||
|
||||
oh->_state == _HWMOD_STATE_DISABLED) && oh->rst_lines_cnt == 1)
|
||||
_deassert_hardreset(oh, oh->rst_lines[0].name);
|
||||
|
||||
/* XXX mux balls */
|
||||
|
||||
_add_initiator_dep(oh, mpu_oh);
|
||||
@ -922,7 +1210,7 @@ int _omap_hwmod_enable(struct omap_hwmod *oh)
|
||||
if (oh->class->sysc) {
|
||||
if (!(oh->_int_flags & _HWMOD_SYSCONFIG_LOADED))
|
||||
_update_sysc_cache(oh);
|
||||
_sysc_enable(oh);
|
||||
_enable_sysc(oh);
|
||||
}
|
||||
} else {
|
||||
pr_debug("omap_hwmod: %s: _wait_target_ready: %d\n",
|
||||
@ -933,12 +1221,14 @@ int _omap_hwmod_enable(struct omap_hwmod *oh)
|
||||
}
|
||||
|
||||
/**
|
||||
* _idle - idle an omap_hwmod
|
||||
* _omap_hwmod_idle - idle an omap_hwmod
|
||||
* @oh: struct omap_hwmod *
|
||||
*
|
||||
* Idles an omap_hwmod @oh. This should be called once the hwmod has
|
||||
* no further work. Returns -EINVAL if the hwmod is in the wrong
|
||||
* state or returns 0.
|
||||
* no further work. (This function has a full name --
|
||||
* _omap_hwmod_idle() rather than simply _idle() -- because it is
|
||||
* currently required by the pm34xx.c idle loop.) Returns -EINVAL if
|
||||
* the hwmod is in the wrong state or returns 0.
|
||||
*/
|
||||
int _omap_hwmod_idle(struct omap_hwmod *oh)
|
||||
{
|
||||
@ -951,7 +1241,7 @@ int _omap_hwmod_idle(struct omap_hwmod *oh)
|
||||
pr_debug("omap_hwmod: %s: idling\n", oh->name);
|
||||
|
||||
if (oh->class->sysc)
|
||||
_sysc_idle(oh);
|
||||
_idle_sysc(oh);
|
||||
_del_initiator_dep(oh, mpu_oh);
|
||||
_disable_clocks(oh);
|
||||
|
||||
@ -981,10 +1271,21 @@ static int _shutdown(struct omap_hwmod *oh)
|
||||
pr_debug("omap_hwmod: %s: disabling\n", oh->name);
|
||||
|
||||
if (oh->class->sysc)
|
||||
_sysc_shutdown(oh);
|
||||
_del_initiator_dep(oh, mpu_oh);
|
||||
/* XXX what about the other system initiators here? DMA, tesla, d2d */
|
||||
_disable_clocks(oh);
|
||||
_shutdown_sysc(oh);
|
||||
|
||||
/*
|
||||
* If an IP contains only one HW reset line, then assert it
|
||||
* before disabling the clocks and shutting down the IP.
|
||||
*/
|
||||
if (oh->rst_lines_cnt == 1)
|
||||
_assert_hardreset(oh, oh->rst_lines[0].name);
|
||||
|
||||
/* clocks and deps are already disabled in idle */
|
||||
if (oh->_state == _HWMOD_STATE_ENABLED) {
|
||||
_del_initiator_dep(oh, mpu_oh);
|
||||
/* XXX what about the other system initiators here? dma, dsp */
|
||||
_disable_clocks(oh);
|
||||
}
|
||||
/* XXX Should this code also force-disable the optional clocks? */
|
||||
|
||||
/* XXX mux any associated balls to safe mode */
|
||||
@ -1000,11 +1301,10 @@ static int _shutdown(struct omap_hwmod *oh)
|
||||
* @skip_setup_idle_p: do not idle hwmods at the end of the fn if 1
|
||||
*
|
||||
* Writes the CLOCKACTIVITY bits @clockact to the hwmod @oh
|
||||
* OCP_SYSCONFIG register. Must be called with omap_hwmod_mutex held.
|
||||
* @skip_setup_idle is intended to be used on a system that will not
|
||||
* call omap_hwmod_enable() to enable devices (e.g., a system without
|
||||
* PM runtime). Returns -EINVAL if the hwmod is in the wrong state or
|
||||
* returns 0.
|
||||
* OCP_SYSCONFIG register. @skip_setup_idle is intended to be used on
|
||||
* a system that will not call omap_hwmod_enable() to enable devices
|
||||
* (e.g., a system without PM runtime). Returns -EINVAL if the hwmod
|
||||
* is in the wrong state or returns 0.
|
||||
*/
|
||||
static int _setup(struct omap_hwmod *oh, void *data)
|
||||
{
|
||||
@ -1034,8 +1334,19 @@ static int _setup(struct omap_hwmod *oh, void *data)
|
||||
}
|
||||
}
|
||||
|
||||
mutex_init(&oh->_mutex);
|
||||
oh->_state = _HWMOD_STATE_INITIALIZED;
|
||||
|
||||
/*
|
||||
* In the case of hwmod with hardreset that should not be
|
||||
* de-assert at boot time, we have to keep the module
|
||||
* initialized, because we cannot enable it properly with the
|
||||
* reset asserted. Exit without warning because that behavior is
|
||||
* expected.
|
||||
*/
|
||||
if ((oh->flags & HWMOD_INIT_NO_RESET) && oh->rst_lines_cnt == 1)
|
||||
return 0;
|
||||
|
||||
r = _omap_hwmod_enable(oh);
|
||||
if (r) {
|
||||
pr_warning("omap_hwmod: %s: cannot be enabled (%d)\n",
|
||||
@ -1044,16 +1355,16 @@ static int _setup(struct omap_hwmod *oh, void *data)
|
||||
}
|
||||
|
||||
if (!(oh->flags & HWMOD_INIT_NO_RESET)) {
|
||||
_reset(oh);
|
||||
|
||||
/*
|
||||
* XXX Do the OCP_SYSCONFIG bits need to be
|
||||
* reprogrammed after a reset? If not, then this can
|
||||
* be removed. If they do, then probably the
|
||||
* _omap_hwmod_enable() function should be split to avoid the
|
||||
* rewrite of the OCP_SYSCONFIG register.
|
||||
* OCP_SYSCONFIG bits need to be reprogrammed after a softreset.
|
||||
* The _omap_hwmod_enable() function should be split to
|
||||
* avoid the rewrite of the OCP_SYSCONFIG register.
|
||||
*/
|
||||
if (oh->class->sysc) {
|
||||
_update_sysc_cache(oh);
|
||||
_sysc_enable(oh);
|
||||
_enable_sysc(oh);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1067,14 +1378,20 @@ static int _setup(struct omap_hwmod *oh, void *data)
|
||||
|
||||
/* Public functions */
|
||||
|
||||
u32 omap_hwmod_readl(struct omap_hwmod *oh, u16 reg_offs)
|
||||
u32 omap_hwmod_read(struct omap_hwmod *oh, u16 reg_offs)
|
||||
{
|
||||
return __raw_readl(oh->_mpu_rt_va + reg_offs);
|
||||
if (oh->flags & HWMOD_16BIT_REG)
|
||||
return __raw_readw(oh->_mpu_rt_va + reg_offs);
|
||||
else
|
||||
return __raw_readl(oh->_mpu_rt_va + reg_offs);
|
||||
}
|
||||
|
||||
void omap_hwmod_writel(u32 v, struct omap_hwmod *oh, u16 reg_offs)
|
||||
void omap_hwmod_write(u32 v, struct omap_hwmod *oh, u16 reg_offs)
|
||||
{
|
||||
__raw_writel(v, oh->_mpu_rt_va + reg_offs);
|
||||
if (oh->flags & HWMOD_16BIT_REG)
|
||||
__raw_writew(v, oh->_mpu_rt_va + reg_offs);
|
||||
else
|
||||
__raw_writel(v, oh->_mpu_rt_va + reg_offs);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1309,7 +1626,7 @@ int omap_hwmod_unregister(struct omap_hwmod *oh)
|
||||
* omap_hwmod_enable - enable an omap_hwmod
|
||||
* @oh: struct omap_hwmod *
|
||||
*
|
||||
* Enable an omap_hwomd @oh. Intended to be called by omap_device_enable().
|
||||
* Enable an omap_hwmod @oh. Intended to be called by omap_device_enable().
|
||||
* Returns -EINVAL on error or passes along the return value from _enable().
|
||||
*/
|
||||
int omap_hwmod_enable(struct omap_hwmod *oh)
|
||||
@ -1319,9 +1636,9 @@ int omap_hwmod_enable(struct omap_hwmod *oh)
|
||||
if (!oh)
|
||||
return -EINVAL;
|
||||
|
||||
mutex_lock(&omap_hwmod_mutex);
|
||||
mutex_lock(&oh->_mutex);
|
||||
r = _omap_hwmod_enable(oh);
|
||||
mutex_unlock(&omap_hwmod_mutex);
|
||||
mutex_unlock(&oh->_mutex);
|
||||
|
||||
return r;
|
||||
}
|
||||
@ -1331,7 +1648,7 @@ int omap_hwmod_enable(struct omap_hwmod *oh)
|
||||
* omap_hwmod_idle - idle an omap_hwmod
|
||||
* @oh: struct omap_hwmod *
|
||||
*
|
||||
* Idle an omap_hwomd @oh. Intended to be called by omap_device_idle().
|
||||
* Idle an omap_hwmod @oh. Intended to be called by omap_device_idle().
|
||||
* Returns -EINVAL on error or passes along the return value from _idle().
|
||||
*/
|
||||
int omap_hwmod_idle(struct omap_hwmod *oh)
|
||||
@ -1339,9 +1656,9 @@ int omap_hwmod_idle(struct omap_hwmod *oh)
|
||||
if (!oh)
|
||||
return -EINVAL;
|
||||
|
||||
mutex_lock(&omap_hwmod_mutex);
|
||||
mutex_lock(&oh->_mutex);
|
||||
_omap_hwmod_idle(oh);
|
||||
mutex_unlock(&omap_hwmod_mutex);
|
||||
mutex_unlock(&oh->_mutex);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -1350,7 +1667,7 @@ int omap_hwmod_idle(struct omap_hwmod *oh)
|
||||
* omap_hwmod_shutdown - shutdown an omap_hwmod
|
||||
* @oh: struct omap_hwmod *
|
||||
*
|
||||
* Shutdown an omap_hwomd @oh. Intended to be called by
|
||||
* Shutdown an omap_hwmod @oh. Intended to be called by
|
||||
* omap_device_shutdown(). Returns -EINVAL on error or passes along
|
||||
* the return value from _shutdown().
|
||||
*/
|
||||
@ -1359,9 +1676,9 @@ int omap_hwmod_shutdown(struct omap_hwmod *oh)
|
||||
if (!oh)
|
||||
return -EINVAL;
|
||||
|
||||
mutex_lock(&omap_hwmod_mutex);
|
||||
mutex_lock(&oh->_mutex);
|
||||
_shutdown(oh);
|
||||
mutex_unlock(&omap_hwmod_mutex);
|
||||
mutex_unlock(&oh->_mutex);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -1374,9 +1691,9 @@ int omap_hwmod_shutdown(struct omap_hwmod *oh)
|
||||
*/
|
||||
int omap_hwmod_enable_clocks(struct omap_hwmod *oh)
|
||||
{
|
||||
mutex_lock(&omap_hwmod_mutex);
|
||||
mutex_lock(&oh->_mutex);
|
||||
_enable_clocks(oh);
|
||||
mutex_unlock(&omap_hwmod_mutex);
|
||||
mutex_unlock(&oh->_mutex);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -1389,9 +1706,9 @@ int omap_hwmod_enable_clocks(struct omap_hwmod *oh)
|
||||
*/
|
||||
int omap_hwmod_disable_clocks(struct omap_hwmod *oh)
|
||||
{
|
||||
mutex_lock(&omap_hwmod_mutex);
|
||||
mutex_lock(&oh->_mutex);
|
||||
_disable_clocks(oh);
|
||||
mutex_unlock(&omap_hwmod_mutex);
|
||||
mutex_unlock(&oh->_mutex);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -1421,7 +1738,7 @@ void omap_hwmod_ocp_barrier(struct omap_hwmod *oh)
|
||||
* Forces posted writes to complete on the OCP thread handling
|
||||
* register writes
|
||||
*/
|
||||
omap_hwmod_readl(oh, oh->class->sysc->sysc_offs);
|
||||
omap_hwmod_read(oh, oh->class->sysc->sysc_offs);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1430,20 +1747,18 @@ void omap_hwmod_ocp_barrier(struct omap_hwmod *oh)
|
||||
*
|
||||
* Under some conditions, a driver may wish to reset the entire device.
|
||||
* Called from omap_device code. Returns -EINVAL on error or passes along
|
||||
* the return value from _reset()/_enable().
|
||||
* the return value from _reset().
|
||||
*/
|
||||
int omap_hwmod_reset(struct omap_hwmod *oh)
|
||||
{
|
||||
int r;
|
||||
|
||||
if (!oh || !(oh->_state & _HWMOD_STATE_ENABLED))
|
||||
if (!oh)
|
||||
return -EINVAL;
|
||||
|
||||
mutex_lock(&omap_hwmod_mutex);
|
||||
mutex_lock(&oh->_mutex);
|
||||
r = _reset(oh);
|
||||
if (!r)
|
||||
r = _omap_hwmod_enable(oh);
|
||||
mutex_unlock(&omap_hwmod_mutex);
|
||||
mutex_unlock(&oh->_mutex);
|
||||
|
||||
return r;
|
||||
}
|
||||
@ -1468,7 +1783,7 @@ int omap_hwmod_count_resources(struct omap_hwmod *oh)
|
||||
{
|
||||
int ret, i;
|
||||
|
||||
ret = oh->mpu_irqs_cnt + oh->sdma_chs_cnt;
|
||||
ret = oh->mpu_irqs_cnt + oh->sdma_reqs_cnt;
|
||||
|
||||
for (i = 0; i < oh->slaves_cnt; i++)
|
||||
ret += oh->slaves[i]->addr_cnt;
|
||||
@ -1501,10 +1816,10 @@ int omap_hwmod_fill_resources(struct omap_hwmod *oh, struct resource *res)
|
||||
r++;
|
||||
}
|
||||
|
||||
for (i = 0; i < oh->sdma_chs_cnt; i++) {
|
||||
(res + r)->name = (oh->sdma_chs + i)->name;
|
||||
(res + r)->start = (oh->sdma_chs + i)->dma_ch;
|
||||
(res + r)->end = (oh->sdma_chs + i)->dma_ch;
|
||||
for (i = 0; i < oh->sdma_reqs_cnt; i++) {
|
||||
(res + r)->name = (oh->sdma_reqs + i)->name;
|
||||
(res + r)->start = (oh->sdma_reqs + i)->dma_req;
|
||||
(res + r)->end = (oh->sdma_reqs + i)->dma_req;
|
||||
(res + r)->flags = IORESOURCE_DMA;
|
||||
r++;
|
||||
}
|
||||
@ -1644,9 +1959,9 @@ int omap_hwmod_enable_wakeup(struct omap_hwmod *oh)
|
||||
!(oh->class->sysc->sysc_flags & SYSC_HAS_ENAWAKEUP))
|
||||
return -EINVAL;
|
||||
|
||||
mutex_lock(&omap_hwmod_mutex);
|
||||
mutex_lock(&oh->_mutex);
|
||||
_enable_wakeup(oh);
|
||||
mutex_unlock(&omap_hwmod_mutex);
|
||||
mutex_unlock(&oh->_mutex);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -1669,13 +1984,91 @@ int omap_hwmod_disable_wakeup(struct omap_hwmod *oh)
|
||||
!(oh->class->sysc->sysc_flags & SYSC_HAS_ENAWAKEUP))
|
||||
return -EINVAL;
|
||||
|
||||
mutex_lock(&omap_hwmod_mutex);
|
||||
mutex_lock(&oh->_mutex);
|
||||
_disable_wakeup(oh);
|
||||
mutex_unlock(&omap_hwmod_mutex);
|
||||
mutex_unlock(&oh->_mutex);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* omap_hwmod_assert_hardreset - assert the HW reset line of submodules
|
||||
* contained in the hwmod module.
|
||||
* @oh: struct omap_hwmod *
|
||||
* @name: name of the reset line to lookup and assert
|
||||
*
|
||||
* Some IP like dsp, ipu or iva contain processor that require
|
||||
* an HW reset line to be assert / deassert in order to enable fully
|
||||
* the IP. Returns -EINVAL if @oh is null or if the operation is not
|
||||
* yet supported on this OMAP; otherwise, passes along the return value
|
||||
* from _assert_hardreset().
|
||||
*/
|
||||
int omap_hwmod_assert_hardreset(struct omap_hwmod *oh, const char *name)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (!oh)
|
||||
return -EINVAL;
|
||||
|
||||
mutex_lock(&oh->_mutex);
|
||||
ret = _assert_hardreset(oh, name);
|
||||
mutex_unlock(&oh->_mutex);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* omap_hwmod_deassert_hardreset - deassert the HW reset line of submodules
|
||||
* contained in the hwmod module.
|
||||
* @oh: struct omap_hwmod *
|
||||
* @name: name of the reset line to look up and deassert
|
||||
*
|
||||
* Some IP like dsp, ipu or iva contain processor that require
|
||||
* an HW reset line to be assert / deassert in order to enable fully
|
||||
* the IP. Returns -EINVAL if @oh is null or if the operation is not
|
||||
* yet supported on this OMAP; otherwise, passes along the return value
|
||||
* from _deassert_hardreset().
|
||||
*/
|
||||
int omap_hwmod_deassert_hardreset(struct omap_hwmod *oh, const char *name)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (!oh)
|
||||
return -EINVAL;
|
||||
|
||||
mutex_lock(&oh->_mutex);
|
||||
ret = _deassert_hardreset(oh, name);
|
||||
mutex_unlock(&oh->_mutex);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* omap_hwmod_read_hardreset - read the HW reset line state of submodules
|
||||
* contained in the hwmod module
|
||||
* @oh: struct omap_hwmod *
|
||||
* @name: name of the reset line to look up and read
|
||||
*
|
||||
* Return the current state of the hwmod @oh's reset line named @name:
|
||||
* returns -EINVAL upon parameter error or if this operation
|
||||
* is unsupported on the current OMAP; otherwise, passes along the return
|
||||
* value from _read_hardreset().
|
||||
*/
|
||||
int omap_hwmod_read_hardreset(struct omap_hwmod *oh, const char *name)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (!oh)
|
||||
return -EINVAL;
|
||||
|
||||
mutex_lock(&oh->_mutex);
|
||||
ret = _read_hardreset(oh, name);
|
||||
mutex_unlock(&oh->_mutex);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* omap_hwmod_for_each_by_class - call @fn for each hwmod of class @classname
|
||||
* @classname: struct omap_hwmod_class name to search for
|
||||
|
@ -15,10 +15,12 @@
|
||||
#include <mach/irqs.h>
|
||||
#include <plat/cpu.h>
|
||||
#include <plat/dma.h>
|
||||
#include <plat/serial.h>
|
||||
|
||||
#include "omap_hwmod_common_data.h"
|
||||
|
||||
#include "prm-regbits-24xx.h"
|
||||
#include "cm-regbits-24xx.h"
|
||||
|
||||
/*
|
||||
* OMAP2420 hardware module integration data
|
||||
@ -33,6 +35,7 @@ static struct omap_hwmod omap2420_mpu_hwmod;
|
||||
static struct omap_hwmod omap2420_iva_hwmod;
|
||||
static struct omap_hwmod omap2420_l3_main_hwmod;
|
||||
static struct omap_hwmod omap2420_l4_core_hwmod;
|
||||
static struct omap_hwmod omap2420_wd_timer2_hwmod;
|
||||
|
||||
/* L3 -> L4_CORE interface */
|
||||
static struct omap_hwmod_ocp_if omap2420_l3_main__l4_core = {
|
||||
@ -71,6 +74,9 @@ static struct omap_hwmod omap2420_l3_main_hwmod = {
|
||||
};
|
||||
|
||||
static struct omap_hwmod omap2420_l4_wkup_hwmod;
|
||||
static struct omap_hwmod omap2420_uart1_hwmod;
|
||||
static struct omap_hwmod omap2420_uart2_hwmod;
|
||||
static struct omap_hwmod omap2420_uart3_hwmod;
|
||||
|
||||
/* L4_CORE -> L4_WKUP interface */
|
||||
static struct omap_hwmod_ocp_if omap2420_l4_core__l4_wkup = {
|
||||
@ -79,6 +85,60 @@ static struct omap_hwmod_ocp_if omap2420_l4_core__l4_wkup = {
|
||||
.user = OCP_USER_MPU | OCP_USER_SDMA,
|
||||
};
|
||||
|
||||
/* L4 CORE -> UART1 interface */
|
||||
static struct omap_hwmod_addr_space omap2420_uart1_addr_space[] = {
|
||||
{
|
||||
.pa_start = OMAP2_UART1_BASE,
|
||||
.pa_end = OMAP2_UART1_BASE + SZ_8K - 1,
|
||||
.flags = ADDR_MAP_ON_INIT | ADDR_TYPE_RT,
|
||||
},
|
||||
};
|
||||
|
||||
static struct omap_hwmod_ocp_if omap2_l4_core__uart1 = {
|
||||
.master = &omap2420_l4_core_hwmod,
|
||||
.slave = &omap2420_uart1_hwmod,
|
||||
.clk = "uart1_ick",
|
||||
.addr = omap2420_uart1_addr_space,
|
||||
.addr_cnt = ARRAY_SIZE(omap2420_uart1_addr_space),
|
||||
.user = OCP_USER_MPU | OCP_USER_SDMA,
|
||||
};
|
||||
|
||||
/* L4 CORE -> UART2 interface */
|
||||
static struct omap_hwmod_addr_space omap2420_uart2_addr_space[] = {
|
||||
{
|
||||
.pa_start = OMAP2_UART2_BASE,
|
||||
.pa_end = OMAP2_UART2_BASE + SZ_1K - 1,
|
||||
.flags = ADDR_MAP_ON_INIT | ADDR_TYPE_RT,
|
||||
},
|
||||
};
|
||||
|
||||
static struct omap_hwmod_ocp_if omap2_l4_core__uart2 = {
|
||||
.master = &omap2420_l4_core_hwmod,
|
||||
.slave = &omap2420_uart2_hwmod,
|
||||
.clk = "uart2_ick",
|
||||
.addr = omap2420_uart2_addr_space,
|
||||
.addr_cnt = ARRAY_SIZE(omap2420_uart2_addr_space),
|
||||
.user = OCP_USER_MPU | OCP_USER_SDMA,
|
||||
};
|
||||
|
||||
/* L4 PER -> UART3 interface */
|
||||
static struct omap_hwmod_addr_space omap2420_uart3_addr_space[] = {
|
||||
{
|
||||
.pa_start = OMAP2_UART3_BASE,
|
||||
.pa_end = OMAP2_UART3_BASE + SZ_1K - 1,
|
||||
.flags = ADDR_MAP_ON_INIT | ADDR_TYPE_RT,
|
||||
},
|
||||
};
|
||||
|
||||
static struct omap_hwmod_ocp_if omap2_l4_core__uart3 = {
|
||||
.master = &omap2420_l4_core_hwmod,
|
||||
.slave = &omap2420_uart3_hwmod,
|
||||
.clk = "uart3_ick",
|
||||
.addr = omap2420_uart3_addr_space,
|
||||
.addr_cnt = ARRAY_SIZE(omap2420_uart3_addr_space),
|
||||
.user = OCP_USER_MPU | OCP_USER_SDMA,
|
||||
};
|
||||
|
||||
/* Slave interfaces on the L4_CORE interconnect */
|
||||
static struct omap_hwmod_ocp_if *omap2420_l4_core_slaves[] = {
|
||||
&omap2420_l3_main__l4_core,
|
||||
@ -87,6 +147,9 @@ static struct omap_hwmod_ocp_if *omap2420_l4_core_slaves[] = {
|
||||
/* Master interfaces on the L4_CORE interconnect */
|
||||
static struct omap_hwmod_ocp_if *omap2420_l4_core_masters[] = {
|
||||
&omap2420_l4_core__l4_wkup,
|
||||
&omap2_l4_core__uart1,
|
||||
&omap2_l4_core__uart2,
|
||||
&omap2_l4_core__uart3,
|
||||
};
|
||||
|
||||
/* L4 CORE */
|
||||
@ -165,12 +228,206 @@ static struct omap_hwmod omap2420_iva_hwmod = {
|
||||
.omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2420)
|
||||
};
|
||||
|
||||
/* l4_wkup -> wd_timer2 */
|
||||
static struct omap_hwmod_addr_space omap2420_wd_timer2_addrs[] = {
|
||||
{
|
||||
.pa_start = 0x48022000,
|
||||
.pa_end = 0x4802207f,
|
||||
.flags = ADDR_TYPE_RT
|
||||
},
|
||||
};
|
||||
|
||||
static struct omap_hwmod_ocp_if omap2420_l4_wkup__wd_timer2 = {
|
||||
.master = &omap2420_l4_wkup_hwmod,
|
||||
.slave = &omap2420_wd_timer2_hwmod,
|
||||
.clk = "mpu_wdt_ick",
|
||||
.addr = omap2420_wd_timer2_addrs,
|
||||
.addr_cnt = ARRAY_SIZE(omap2420_wd_timer2_addrs),
|
||||
.user = OCP_USER_MPU | OCP_USER_SDMA,
|
||||
};
|
||||
|
||||
/*
|
||||
* 'wd_timer' class
|
||||
* 32-bit watchdog upward counter that generates a pulse on the reset pin on
|
||||
* overflow condition
|
||||
*/
|
||||
|
||||
static struct omap_hwmod_class_sysconfig omap2420_wd_timer_sysc = {
|
||||
.rev_offs = 0x0000,
|
||||
.sysc_offs = 0x0010,
|
||||
.syss_offs = 0x0014,
|
||||
.sysc_flags = (SYSC_HAS_EMUFREE | SYSC_HAS_SOFTRESET |
|
||||
SYSC_HAS_AUTOIDLE),
|
||||
.sysc_fields = &omap_hwmod_sysc_type1,
|
||||
};
|
||||
|
||||
static struct omap_hwmod_class omap2420_wd_timer_hwmod_class = {
|
||||
.name = "wd_timer",
|
||||
.sysc = &omap2420_wd_timer_sysc,
|
||||
};
|
||||
|
||||
/* wd_timer2 */
|
||||
static struct omap_hwmod_ocp_if *omap2420_wd_timer2_slaves[] = {
|
||||
&omap2420_l4_wkup__wd_timer2,
|
||||
};
|
||||
|
||||
static struct omap_hwmod omap2420_wd_timer2_hwmod = {
|
||||
.name = "wd_timer2",
|
||||
.class = &omap2420_wd_timer_hwmod_class,
|
||||
.main_clk = "mpu_wdt_fck",
|
||||
.prcm = {
|
||||
.omap2 = {
|
||||
.prcm_reg_id = 1,
|
||||
.module_bit = OMAP24XX_EN_MPU_WDT_SHIFT,
|
||||
.module_offs = WKUP_MOD,
|
||||
.idlest_reg_id = 1,
|
||||
.idlest_idle_bit = OMAP24XX_ST_MPU_WDT_SHIFT,
|
||||
},
|
||||
},
|
||||
.slaves = omap2420_wd_timer2_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap2420_wd_timer2_slaves),
|
||||
.omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2420),
|
||||
};
|
||||
|
||||
/* UART */
|
||||
|
||||
static struct omap_hwmod_class_sysconfig uart_sysc = {
|
||||
.rev_offs = 0x50,
|
||||
.sysc_offs = 0x54,
|
||||
.syss_offs = 0x58,
|
||||
.sysc_flags = (SYSC_HAS_SIDLEMODE |
|
||||
SYSC_HAS_ENAWAKEUP | SYSC_HAS_SOFTRESET |
|
||||
SYSC_HAS_AUTOIDLE),
|
||||
.idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
|
||||
.sysc_fields = &omap_hwmod_sysc_type1,
|
||||
};
|
||||
|
||||
static struct omap_hwmod_class uart_class = {
|
||||
.name = "uart",
|
||||
.sysc = &uart_sysc,
|
||||
};
|
||||
|
||||
/* UART1 */
|
||||
|
||||
static struct omap_hwmod_irq_info uart1_mpu_irqs[] = {
|
||||
{ .irq = INT_24XX_UART1_IRQ, },
|
||||
};
|
||||
|
||||
static struct omap_hwmod_dma_info uart1_sdma_reqs[] = {
|
||||
{ .name = "rx", .dma_req = OMAP24XX_DMA_UART1_RX, },
|
||||
{ .name = "tx", .dma_req = OMAP24XX_DMA_UART1_TX, },
|
||||
};
|
||||
|
||||
static struct omap_hwmod_ocp_if *omap2420_uart1_slaves[] = {
|
||||
&omap2_l4_core__uart1,
|
||||
};
|
||||
|
||||
static struct omap_hwmod omap2420_uart1_hwmod = {
|
||||
.name = "uart1",
|
||||
.mpu_irqs = uart1_mpu_irqs,
|
||||
.mpu_irqs_cnt = ARRAY_SIZE(uart1_mpu_irqs),
|
||||
.sdma_reqs = uart1_sdma_reqs,
|
||||
.sdma_reqs_cnt = ARRAY_SIZE(uart1_sdma_reqs),
|
||||
.main_clk = "uart1_fck",
|
||||
.prcm = {
|
||||
.omap2 = {
|
||||
.module_offs = CORE_MOD,
|
||||
.prcm_reg_id = 1,
|
||||
.module_bit = OMAP24XX_EN_UART1_SHIFT,
|
||||
.idlest_reg_id = 1,
|
||||
.idlest_idle_bit = OMAP24XX_EN_UART1_SHIFT,
|
||||
},
|
||||
},
|
||||
.slaves = omap2420_uart1_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap2420_uart1_slaves),
|
||||
.class = &uart_class,
|
||||
.omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2420),
|
||||
};
|
||||
|
||||
/* UART2 */
|
||||
|
||||
static struct omap_hwmod_irq_info uart2_mpu_irqs[] = {
|
||||
{ .irq = INT_24XX_UART2_IRQ, },
|
||||
};
|
||||
|
||||
static struct omap_hwmod_dma_info uart2_sdma_reqs[] = {
|
||||
{ .name = "rx", .dma_req = OMAP24XX_DMA_UART2_RX, },
|
||||
{ .name = "tx", .dma_req = OMAP24XX_DMA_UART2_TX, },
|
||||
};
|
||||
|
||||
static struct omap_hwmod_ocp_if *omap2420_uart2_slaves[] = {
|
||||
&omap2_l4_core__uart2,
|
||||
};
|
||||
|
||||
static struct omap_hwmod omap2420_uart2_hwmod = {
|
||||
.name = "uart2",
|
||||
.mpu_irqs = uart2_mpu_irqs,
|
||||
.mpu_irqs_cnt = ARRAY_SIZE(uart2_mpu_irqs),
|
||||
.sdma_reqs = uart2_sdma_reqs,
|
||||
.sdma_reqs_cnt = ARRAY_SIZE(uart2_sdma_reqs),
|
||||
.main_clk = "uart2_fck",
|
||||
.prcm = {
|
||||
.omap2 = {
|
||||
.module_offs = CORE_MOD,
|
||||
.prcm_reg_id = 1,
|
||||
.module_bit = OMAP24XX_EN_UART2_SHIFT,
|
||||
.idlest_reg_id = 1,
|
||||
.idlest_idle_bit = OMAP24XX_EN_UART2_SHIFT,
|
||||
},
|
||||
},
|
||||
.slaves = omap2420_uart2_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap2420_uart2_slaves),
|
||||
.class = &uart_class,
|
||||
.omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2420),
|
||||
};
|
||||
|
||||
/* UART3 */
|
||||
|
||||
static struct omap_hwmod_irq_info uart3_mpu_irqs[] = {
|
||||
{ .irq = INT_24XX_UART3_IRQ, },
|
||||
};
|
||||
|
||||
static struct omap_hwmod_dma_info uart3_sdma_reqs[] = {
|
||||
{ .name = "rx", .dma_req = OMAP24XX_DMA_UART3_RX, },
|
||||
{ .name = "tx", .dma_req = OMAP24XX_DMA_UART3_TX, },
|
||||
};
|
||||
|
||||
static struct omap_hwmod_ocp_if *omap2420_uart3_slaves[] = {
|
||||
&omap2_l4_core__uart3,
|
||||
};
|
||||
|
||||
static struct omap_hwmod omap2420_uart3_hwmod = {
|
||||
.name = "uart3",
|
||||
.mpu_irqs = uart3_mpu_irqs,
|
||||
.mpu_irqs_cnt = ARRAY_SIZE(uart3_mpu_irqs),
|
||||
.sdma_reqs = uart3_sdma_reqs,
|
||||
.sdma_reqs_cnt = ARRAY_SIZE(uart3_sdma_reqs),
|
||||
.main_clk = "uart3_fck",
|
||||
.prcm = {
|
||||
.omap2 = {
|
||||
.module_offs = CORE_MOD,
|
||||
.prcm_reg_id = 2,
|
||||
.module_bit = OMAP24XX_EN_UART3_SHIFT,
|
||||
.idlest_reg_id = 2,
|
||||
.idlest_idle_bit = OMAP24XX_EN_UART3_SHIFT,
|
||||
},
|
||||
},
|
||||
.slaves = omap2420_uart3_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap2420_uart3_slaves),
|
||||
.class = &uart_class,
|
||||
.omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2420),
|
||||
};
|
||||
|
||||
static __initdata struct omap_hwmod *omap2420_hwmods[] = {
|
||||
&omap2420_l3_main_hwmod,
|
||||
&omap2420_l4_core_hwmod,
|
||||
&omap2420_l4_wkup_hwmod,
|
||||
&omap2420_mpu_hwmod,
|
||||
&omap2420_iva_hwmod,
|
||||
&omap2420_wd_timer2_hwmod,
|
||||
&omap2420_uart1_hwmod,
|
||||
&omap2420_uart2_hwmod,
|
||||
&omap2420_uart3_hwmod,
|
||||
NULL,
|
||||
};
|
||||
|
||||
|
@ -15,10 +15,12 @@
|
||||
#include <mach/irqs.h>
|
||||
#include <plat/cpu.h>
|
||||
#include <plat/dma.h>
|
||||
#include <plat/serial.h>
|
||||
|
||||
#include "omap_hwmod_common_data.h"
|
||||
|
||||
#include "prm-regbits-24xx.h"
|
||||
#include "cm-regbits-24xx.h"
|
||||
|
||||
/*
|
||||
* OMAP2430 hardware module integration data
|
||||
@ -33,6 +35,7 @@ static struct omap_hwmod omap2430_mpu_hwmod;
|
||||
static struct omap_hwmod omap2430_iva_hwmod;
|
||||
static struct omap_hwmod omap2430_l3_main_hwmod;
|
||||
static struct omap_hwmod omap2430_l4_core_hwmod;
|
||||
static struct omap_hwmod omap2430_wd_timer2_hwmod;
|
||||
|
||||
/* L3 -> L4_CORE interface */
|
||||
static struct omap_hwmod_ocp_if omap2430_l3_main__l4_core = {
|
||||
@ -71,6 +74,9 @@ static struct omap_hwmod omap2430_l3_main_hwmod = {
|
||||
};
|
||||
|
||||
static struct omap_hwmod omap2430_l4_wkup_hwmod;
|
||||
static struct omap_hwmod omap2430_uart1_hwmod;
|
||||
static struct omap_hwmod omap2430_uart2_hwmod;
|
||||
static struct omap_hwmod omap2430_uart3_hwmod;
|
||||
|
||||
/* L4_CORE -> L4_WKUP interface */
|
||||
static struct omap_hwmod_ocp_if omap2430_l4_core__l4_wkup = {
|
||||
@ -79,6 +85,60 @@ static struct omap_hwmod_ocp_if omap2430_l4_core__l4_wkup = {
|
||||
.user = OCP_USER_MPU | OCP_USER_SDMA,
|
||||
};
|
||||
|
||||
/* L4 CORE -> UART1 interface */
|
||||
static struct omap_hwmod_addr_space omap2430_uart1_addr_space[] = {
|
||||
{
|
||||
.pa_start = OMAP2_UART1_BASE,
|
||||
.pa_end = OMAP2_UART1_BASE + SZ_8K - 1,
|
||||
.flags = ADDR_MAP_ON_INIT | ADDR_TYPE_RT,
|
||||
},
|
||||
};
|
||||
|
||||
static struct omap_hwmod_ocp_if omap2_l4_core__uart1 = {
|
||||
.master = &omap2430_l4_core_hwmod,
|
||||
.slave = &omap2430_uart1_hwmod,
|
||||
.clk = "uart1_ick",
|
||||
.addr = omap2430_uart1_addr_space,
|
||||
.addr_cnt = ARRAY_SIZE(omap2430_uart1_addr_space),
|
||||
.user = OCP_USER_MPU | OCP_USER_SDMA,
|
||||
};
|
||||
|
||||
/* L4 CORE -> UART2 interface */
|
||||
static struct omap_hwmod_addr_space omap2430_uart2_addr_space[] = {
|
||||
{
|
||||
.pa_start = OMAP2_UART2_BASE,
|
||||
.pa_end = OMAP2_UART2_BASE + SZ_1K - 1,
|
||||
.flags = ADDR_MAP_ON_INIT | ADDR_TYPE_RT,
|
||||
},
|
||||
};
|
||||
|
||||
static struct omap_hwmod_ocp_if omap2_l4_core__uart2 = {
|
||||
.master = &omap2430_l4_core_hwmod,
|
||||
.slave = &omap2430_uart2_hwmod,
|
||||
.clk = "uart2_ick",
|
||||
.addr = omap2430_uart2_addr_space,
|
||||
.addr_cnt = ARRAY_SIZE(omap2430_uart2_addr_space),
|
||||
.user = OCP_USER_MPU | OCP_USER_SDMA,
|
||||
};
|
||||
|
||||
/* L4 PER -> UART3 interface */
|
||||
static struct omap_hwmod_addr_space omap2430_uart3_addr_space[] = {
|
||||
{
|
||||
.pa_start = OMAP2_UART3_BASE,
|
||||
.pa_end = OMAP2_UART3_BASE + SZ_1K - 1,
|
||||
.flags = ADDR_MAP_ON_INIT | ADDR_TYPE_RT,
|
||||
},
|
||||
};
|
||||
|
||||
static struct omap_hwmod_ocp_if omap2_l4_core__uart3 = {
|
||||
.master = &omap2430_l4_core_hwmod,
|
||||
.slave = &omap2430_uart3_hwmod,
|
||||
.clk = "uart3_ick",
|
||||
.addr = omap2430_uart3_addr_space,
|
||||
.addr_cnt = ARRAY_SIZE(omap2430_uart3_addr_space),
|
||||
.user = OCP_USER_MPU | OCP_USER_SDMA,
|
||||
};
|
||||
|
||||
/* Slave interfaces on the L4_CORE interconnect */
|
||||
static struct omap_hwmod_ocp_if *omap2430_l4_core_slaves[] = {
|
||||
&omap2430_l3_main__l4_core,
|
||||
@ -104,6 +164,9 @@ static struct omap_hwmod omap2430_l4_core_hwmod = {
|
||||
/* Slave interfaces on the L4_WKUP interconnect */
|
||||
static struct omap_hwmod_ocp_if *omap2430_l4_wkup_slaves[] = {
|
||||
&omap2430_l4_core__l4_wkup,
|
||||
&omap2_l4_core__uart1,
|
||||
&omap2_l4_core__uart2,
|
||||
&omap2_l4_core__uart3,
|
||||
};
|
||||
|
||||
/* Master interfaces on the L4_WKUP interconnect */
|
||||
@ -165,12 +228,206 @@ static struct omap_hwmod omap2430_iva_hwmod = {
|
||||
.omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430)
|
||||
};
|
||||
|
||||
/* l4_wkup -> wd_timer2 */
|
||||
static struct omap_hwmod_addr_space omap2430_wd_timer2_addrs[] = {
|
||||
{
|
||||
.pa_start = 0x49016000,
|
||||
.pa_end = 0x4901607f,
|
||||
.flags = ADDR_TYPE_RT
|
||||
},
|
||||
};
|
||||
|
||||
static struct omap_hwmod_ocp_if omap2430_l4_wkup__wd_timer2 = {
|
||||
.master = &omap2430_l4_wkup_hwmod,
|
||||
.slave = &omap2430_wd_timer2_hwmod,
|
||||
.clk = "mpu_wdt_ick",
|
||||
.addr = omap2430_wd_timer2_addrs,
|
||||
.addr_cnt = ARRAY_SIZE(omap2430_wd_timer2_addrs),
|
||||
.user = OCP_USER_MPU | OCP_USER_SDMA,
|
||||
};
|
||||
|
||||
/*
|
||||
* 'wd_timer' class
|
||||
* 32-bit watchdog upward counter that generates a pulse on the reset pin on
|
||||
* overflow condition
|
||||
*/
|
||||
|
||||
static struct omap_hwmod_class_sysconfig omap2430_wd_timer_sysc = {
|
||||
.rev_offs = 0x0,
|
||||
.sysc_offs = 0x0010,
|
||||
.syss_offs = 0x0014,
|
||||
.sysc_flags = (SYSC_HAS_EMUFREE | SYSC_HAS_SOFTRESET |
|
||||
SYSC_HAS_AUTOIDLE),
|
||||
.sysc_fields = &omap_hwmod_sysc_type1,
|
||||
};
|
||||
|
||||
static struct omap_hwmod_class omap2430_wd_timer_hwmod_class = {
|
||||
.name = "wd_timer",
|
||||
.sysc = &omap2430_wd_timer_sysc,
|
||||
};
|
||||
|
||||
/* wd_timer2 */
|
||||
static struct omap_hwmod_ocp_if *omap2430_wd_timer2_slaves[] = {
|
||||
&omap2430_l4_wkup__wd_timer2,
|
||||
};
|
||||
|
||||
static struct omap_hwmod omap2430_wd_timer2_hwmod = {
|
||||
.name = "wd_timer2",
|
||||
.class = &omap2430_wd_timer_hwmod_class,
|
||||
.main_clk = "mpu_wdt_fck",
|
||||
.prcm = {
|
||||
.omap2 = {
|
||||
.prcm_reg_id = 1,
|
||||
.module_bit = OMAP24XX_EN_MPU_WDT_SHIFT,
|
||||
.module_offs = WKUP_MOD,
|
||||
.idlest_reg_id = 1,
|
||||
.idlest_idle_bit = OMAP24XX_ST_MPU_WDT_SHIFT,
|
||||
},
|
||||
},
|
||||
.slaves = omap2430_wd_timer2_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap2430_wd_timer2_slaves),
|
||||
.omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430),
|
||||
};
|
||||
|
||||
/* UART */
|
||||
|
||||
static struct omap_hwmod_class_sysconfig uart_sysc = {
|
||||
.rev_offs = 0x50,
|
||||
.sysc_offs = 0x54,
|
||||
.syss_offs = 0x58,
|
||||
.sysc_flags = (SYSC_HAS_SIDLEMODE |
|
||||
SYSC_HAS_ENAWAKEUP | SYSC_HAS_SOFTRESET |
|
||||
SYSC_HAS_AUTOIDLE),
|
||||
.idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
|
||||
.sysc_fields = &omap_hwmod_sysc_type1,
|
||||
};
|
||||
|
||||
static struct omap_hwmod_class uart_class = {
|
||||
.name = "uart",
|
||||
.sysc = &uart_sysc,
|
||||
};
|
||||
|
||||
/* UART1 */
|
||||
|
||||
static struct omap_hwmod_irq_info uart1_mpu_irqs[] = {
|
||||
{ .irq = INT_24XX_UART1_IRQ, },
|
||||
};
|
||||
|
||||
static struct omap_hwmod_dma_info uart1_sdma_reqs[] = {
|
||||
{ .name = "rx", .dma_req = OMAP24XX_DMA_UART1_RX, },
|
||||
{ .name = "tx", .dma_req = OMAP24XX_DMA_UART1_TX, },
|
||||
};
|
||||
|
||||
static struct omap_hwmod_ocp_if *omap2430_uart1_slaves[] = {
|
||||
&omap2_l4_core__uart1,
|
||||
};
|
||||
|
||||
static struct omap_hwmod omap2430_uart1_hwmod = {
|
||||
.name = "uart1",
|
||||
.mpu_irqs = uart1_mpu_irqs,
|
||||
.mpu_irqs_cnt = ARRAY_SIZE(uart1_mpu_irqs),
|
||||
.sdma_reqs = uart1_sdma_reqs,
|
||||
.sdma_reqs_cnt = ARRAY_SIZE(uart1_sdma_reqs),
|
||||
.main_clk = "uart1_fck",
|
||||
.prcm = {
|
||||
.omap2 = {
|
||||
.module_offs = CORE_MOD,
|
||||
.prcm_reg_id = 1,
|
||||
.module_bit = OMAP24XX_EN_UART1_SHIFT,
|
||||
.idlest_reg_id = 1,
|
||||
.idlest_idle_bit = OMAP24XX_EN_UART1_SHIFT,
|
||||
},
|
||||
},
|
||||
.slaves = omap2430_uart1_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap2430_uart1_slaves),
|
||||
.class = &uart_class,
|
||||
.omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430),
|
||||
};
|
||||
|
||||
/* UART2 */
|
||||
|
||||
static struct omap_hwmod_irq_info uart2_mpu_irqs[] = {
|
||||
{ .irq = INT_24XX_UART2_IRQ, },
|
||||
};
|
||||
|
||||
static struct omap_hwmod_dma_info uart2_sdma_reqs[] = {
|
||||
{ .name = "rx", .dma_req = OMAP24XX_DMA_UART2_RX, },
|
||||
{ .name = "tx", .dma_req = OMAP24XX_DMA_UART2_TX, },
|
||||
};
|
||||
|
||||
static struct omap_hwmod_ocp_if *omap2430_uart2_slaves[] = {
|
||||
&omap2_l4_core__uart2,
|
||||
};
|
||||
|
||||
static struct omap_hwmod omap2430_uart2_hwmod = {
|
||||
.name = "uart2",
|
||||
.mpu_irqs = uart2_mpu_irqs,
|
||||
.mpu_irqs_cnt = ARRAY_SIZE(uart2_mpu_irqs),
|
||||
.sdma_reqs = uart2_sdma_reqs,
|
||||
.sdma_reqs_cnt = ARRAY_SIZE(uart2_sdma_reqs),
|
||||
.main_clk = "uart2_fck",
|
||||
.prcm = {
|
||||
.omap2 = {
|
||||
.module_offs = CORE_MOD,
|
||||
.prcm_reg_id = 1,
|
||||
.module_bit = OMAP24XX_EN_UART2_SHIFT,
|
||||
.idlest_reg_id = 1,
|
||||
.idlest_idle_bit = OMAP24XX_EN_UART2_SHIFT,
|
||||
},
|
||||
},
|
||||
.slaves = omap2430_uart2_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap2430_uart2_slaves),
|
||||
.class = &uart_class,
|
||||
.omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430),
|
||||
};
|
||||
|
||||
/* UART3 */
|
||||
|
||||
static struct omap_hwmod_irq_info uart3_mpu_irqs[] = {
|
||||
{ .irq = INT_24XX_UART3_IRQ, },
|
||||
};
|
||||
|
||||
static struct omap_hwmod_dma_info uart3_sdma_reqs[] = {
|
||||
{ .name = "rx", .dma_req = OMAP24XX_DMA_UART3_RX, },
|
||||
{ .name = "tx", .dma_req = OMAP24XX_DMA_UART3_TX, },
|
||||
};
|
||||
|
||||
static struct omap_hwmod_ocp_if *omap2430_uart3_slaves[] = {
|
||||
&omap2_l4_core__uart3,
|
||||
};
|
||||
|
||||
static struct omap_hwmod omap2430_uart3_hwmod = {
|
||||
.name = "uart3",
|
||||
.mpu_irqs = uart3_mpu_irqs,
|
||||
.mpu_irqs_cnt = ARRAY_SIZE(uart3_mpu_irqs),
|
||||
.sdma_reqs = uart3_sdma_reqs,
|
||||
.sdma_reqs_cnt = ARRAY_SIZE(uart3_sdma_reqs),
|
||||
.main_clk = "uart3_fck",
|
||||
.prcm = {
|
||||
.omap2 = {
|
||||
.module_offs = CORE_MOD,
|
||||
.prcm_reg_id = 2,
|
||||
.module_bit = OMAP24XX_EN_UART3_SHIFT,
|
||||
.idlest_reg_id = 2,
|
||||
.idlest_idle_bit = OMAP24XX_EN_UART3_SHIFT,
|
||||
},
|
||||
},
|
||||
.slaves = omap2430_uart3_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap2430_uart3_slaves),
|
||||
.class = &uart_class,
|
||||
.omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP2430),
|
||||
};
|
||||
|
||||
static __initdata struct omap_hwmod *omap2430_hwmods[] = {
|
||||
&omap2430_l3_main_hwmod,
|
||||
&omap2430_l4_core_hwmod,
|
||||
&omap2430_l4_wkup_hwmod,
|
||||
&omap2430_mpu_hwmod,
|
||||
&omap2430_iva_hwmod,
|
||||
&omap2430_wd_timer2_hwmod,
|
||||
&omap2430_uart1_hwmod,
|
||||
&omap2430_uart2_hwmod,
|
||||
&omap2430_uart3_hwmod,
|
||||
NULL,
|
||||
};
|
||||
|
||||
|
@ -17,10 +17,12 @@
|
||||
#include <mach/irqs.h>
|
||||
#include <plat/cpu.h>
|
||||
#include <plat/dma.h>
|
||||
#include <plat/serial.h>
|
||||
|
||||
#include "omap_hwmod_common_data.h"
|
||||
|
||||
#include "prm-regbits-34xx.h"
|
||||
#include "cm-regbits-34xx.h"
|
||||
|
||||
/*
|
||||
* OMAP3xxx hardware module integration data
|
||||
@ -36,6 +38,7 @@ static struct omap_hwmod omap3xxx_iva_hwmod;
|
||||
static struct omap_hwmod omap3xxx_l3_main_hwmod;
|
||||
static struct omap_hwmod omap3xxx_l4_core_hwmod;
|
||||
static struct omap_hwmod omap3xxx_l4_per_hwmod;
|
||||
static struct omap_hwmod omap3xxx_wd_timer2_hwmod;
|
||||
|
||||
/* L3 -> L4_CORE interface */
|
||||
static struct omap_hwmod_ocp_if omap3xxx_l3_main__l4_core = {
|
||||
@ -82,6 +85,10 @@ static struct omap_hwmod omap3xxx_l3_main_hwmod = {
|
||||
};
|
||||
|
||||
static struct omap_hwmod omap3xxx_l4_wkup_hwmod;
|
||||
static struct omap_hwmod omap3xxx_uart1_hwmod;
|
||||
static struct omap_hwmod omap3xxx_uart2_hwmod;
|
||||
static struct omap_hwmod omap3xxx_uart3_hwmod;
|
||||
static struct omap_hwmod omap3xxx_uart4_hwmod;
|
||||
|
||||
/* L4_CORE -> L4_WKUP interface */
|
||||
static struct omap_hwmod_ocp_if omap3xxx_l4_core__l4_wkup = {
|
||||
@ -90,6 +97,78 @@ static struct omap_hwmod_ocp_if omap3xxx_l4_core__l4_wkup = {
|
||||
.user = OCP_USER_MPU | OCP_USER_SDMA,
|
||||
};
|
||||
|
||||
/* L4 CORE -> UART1 interface */
|
||||
static struct omap_hwmod_addr_space omap3xxx_uart1_addr_space[] = {
|
||||
{
|
||||
.pa_start = OMAP3_UART1_BASE,
|
||||
.pa_end = OMAP3_UART1_BASE + SZ_8K - 1,
|
||||
.flags = ADDR_MAP_ON_INIT | ADDR_TYPE_RT,
|
||||
},
|
||||
};
|
||||
|
||||
static struct omap_hwmod_ocp_if omap3_l4_core__uart1 = {
|
||||
.master = &omap3xxx_l4_core_hwmod,
|
||||
.slave = &omap3xxx_uart1_hwmod,
|
||||
.clk = "uart1_ick",
|
||||
.addr = omap3xxx_uart1_addr_space,
|
||||
.addr_cnt = ARRAY_SIZE(omap3xxx_uart1_addr_space),
|
||||
.user = OCP_USER_MPU | OCP_USER_SDMA,
|
||||
};
|
||||
|
||||
/* L4 CORE -> UART2 interface */
|
||||
static struct omap_hwmod_addr_space omap3xxx_uart2_addr_space[] = {
|
||||
{
|
||||
.pa_start = OMAP3_UART2_BASE,
|
||||
.pa_end = OMAP3_UART2_BASE + SZ_1K - 1,
|
||||
.flags = ADDR_MAP_ON_INIT | ADDR_TYPE_RT,
|
||||
},
|
||||
};
|
||||
|
||||
static struct omap_hwmod_ocp_if omap3_l4_core__uart2 = {
|
||||
.master = &omap3xxx_l4_core_hwmod,
|
||||
.slave = &omap3xxx_uart2_hwmod,
|
||||
.clk = "uart2_ick",
|
||||
.addr = omap3xxx_uart2_addr_space,
|
||||
.addr_cnt = ARRAY_SIZE(omap3xxx_uart2_addr_space),
|
||||
.user = OCP_USER_MPU | OCP_USER_SDMA,
|
||||
};
|
||||
|
||||
/* L4 PER -> UART3 interface */
|
||||
static struct omap_hwmod_addr_space omap3xxx_uart3_addr_space[] = {
|
||||
{
|
||||
.pa_start = OMAP3_UART3_BASE,
|
||||
.pa_end = OMAP3_UART3_BASE + SZ_1K - 1,
|
||||
.flags = ADDR_MAP_ON_INIT | ADDR_TYPE_RT,
|
||||
},
|
||||
};
|
||||
|
||||
static struct omap_hwmod_ocp_if omap3_l4_per__uart3 = {
|
||||
.master = &omap3xxx_l4_per_hwmod,
|
||||
.slave = &omap3xxx_uart3_hwmod,
|
||||
.clk = "uart3_ick",
|
||||
.addr = omap3xxx_uart3_addr_space,
|
||||
.addr_cnt = ARRAY_SIZE(omap3xxx_uart3_addr_space),
|
||||
.user = OCP_USER_MPU | OCP_USER_SDMA,
|
||||
};
|
||||
|
||||
/* L4 PER -> UART4 interface */
|
||||
static struct omap_hwmod_addr_space omap3xxx_uart4_addr_space[] = {
|
||||
{
|
||||
.pa_start = OMAP3_UART4_BASE,
|
||||
.pa_end = OMAP3_UART4_BASE + SZ_1K - 1,
|
||||
.flags = ADDR_MAP_ON_INIT | ADDR_TYPE_RT,
|
||||
},
|
||||
};
|
||||
|
||||
static struct omap_hwmod_ocp_if omap3_l4_per__uart4 = {
|
||||
.master = &omap3xxx_l4_per_hwmod,
|
||||
.slave = &omap3xxx_uart4_hwmod,
|
||||
.clk = "uart4_ick",
|
||||
.addr = omap3xxx_uart4_addr_space,
|
||||
.addr_cnt = ARRAY_SIZE(omap3xxx_uart4_addr_space),
|
||||
.user = OCP_USER_MPU | OCP_USER_SDMA,
|
||||
};
|
||||
|
||||
/* Slave interfaces on the L4_CORE interconnect */
|
||||
static struct omap_hwmod_ocp_if *omap3xxx_l4_core_slaves[] = {
|
||||
&omap3xxx_l3_main__l4_core,
|
||||
@ -98,6 +177,8 @@ static struct omap_hwmod_ocp_if *omap3xxx_l4_core_slaves[] = {
|
||||
/* Master interfaces on the L4_CORE interconnect */
|
||||
static struct omap_hwmod_ocp_if *omap3xxx_l4_core_masters[] = {
|
||||
&omap3xxx_l4_core__l4_wkup,
|
||||
&omap3_l4_core__uart1,
|
||||
&omap3_l4_core__uart2,
|
||||
};
|
||||
|
||||
/* L4 CORE */
|
||||
@ -119,6 +200,8 @@ static struct omap_hwmod_ocp_if *omap3xxx_l4_per_slaves[] = {
|
||||
|
||||
/* Master interfaces on the L4_PER interconnect */
|
||||
static struct omap_hwmod_ocp_if *omap3xxx_l4_per_masters[] = {
|
||||
&omap3_l4_per__uart3,
|
||||
&omap3_l4_per__uart4,
|
||||
};
|
||||
|
||||
/* L4 PER */
|
||||
@ -197,6 +280,235 @@ static struct omap_hwmod omap3xxx_iva_hwmod = {
|
||||
.omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430)
|
||||
};
|
||||
|
||||
/* l4_wkup -> wd_timer2 */
|
||||
static struct omap_hwmod_addr_space omap3xxx_wd_timer2_addrs[] = {
|
||||
{
|
||||
.pa_start = 0x48314000,
|
||||
.pa_end = 0x4831407f,
|
||||
.flags = ADDR_TYPE_RT
|
||||
},
|
||||
};
|
||||
|
||||
static struct omap_hwmod_ocp_if omap3xxx_l4_wkup__wd_timer2 = {
|
||||
.master = &omap3xxx_l4_wkup_hwmod,
|
||||
.slave = &omap3xxx_wd_timer2_hwmod,
|
||||
.clk = "wdt2_ick",
|
||||
.addr = omap3xxx_wd_timer2_addrs,
|
||||
.addr_cnt = ARRAY_SIZE(omap3xxx_wd_timer2_addrs),
|
||||
.user = OCP_USER_MPU | OCP_USER_SDMA,
|
||||
};
|
||||
|
||||
/*
|
||||
* 'wd_timer' class
|
||||
* 32-bit watchdog upward counter that generates a pulse on the reset pin on
|
||||
* overflow condition
|
||||
*/
|
||||
|
||||
static struct omap_hwmod_class_sysconfig omap3xxx_wd_timer_sysc = {
|
||||
.rev_offs = 0x0000,
|
||||
.sysc_offs = 0x0010,
|
||||
.syss_offs = 0x0014,
|
||||
.sysc_flags = (SYSC_HAS_SIDLEMODE | SYSC_HAS_EMUFREE |
|
||||
SYSC_HAS_ENAWAKEUP | SYSC_HAS_SOFTRESET |
|
||||
SYSC_HAS_AUTOIDLE | SYSC_HAS_CLOCKACTIVITY),
|
||||
.idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
|
||||
.sysc_fields = &omap_hwmod_sysc_type1,
|
||||
};
|
||||
|
||||
static struct omap_hwmod_class omap3xxx_wd_timer_hwmod_class = {
|
||||
.name = "wd_timer",
|
||||
.sysc = &omap3xxx_wd_timer_sysc,
|
||||
};
|
||||
|
||||
/* wd_timer2 */
|
||||
static struct omap_hwmod_ocp_if *omap3xxx_wd_timer2_slaves[] = {
|
||||
&omap3xxx_l4_wkup__wd_timer2,
|
||||
};
|
||||
|
||||
static struct omap_hwmod omap3xxx_wd_timer2_hwmod = {
|
||||
.name = "wd_timer2",
|
||||
.class = &omap3xxx_wd_timer_hwmod_class,
|
||||
.main_clk = "wdt2_fck",
|
||||
.prcm = {
|
||||
.omap2 = {
|
||||
.prcm_reg_id = 1,
|
||||
.module_bit = OMAP3430_EN_WDT2_SHIFT,
|
||||
.module_offs = WKUP_MOD,
|
||||
.idlest_reg_id = 1,
|
||||
.idlest_idle_bit = OMAP3430_ST_WDT2_SHIFT,
|
||||
},
|
||||
},
|
||||
.slaves = omap3xxx_wd_timer2_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap3xxx_wd_timer2_slaves),
|
||||
.omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
|
||||
};
|
||||
|
||||
/* UART common */
|
||||
|
||||
static struct omap_hwmod_class_sysconfig uart_sysc = {
|
||||
.rev_offs = 0x50,
|
||||
.sysc_offs = 0x54,
|
||||
.syss_offs = 0x58,
|
||||
.sysc_flags = (SYSC_HAS_SIDLEMODE |
|
||||
SYSC_HAS_ENAWAKEUP | SYSC_HAS_SOFTRESET |
|
||||
SYSC_HAS_AUTOIDLE),
|
||||
.idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
|
||||
.sysc_fields = &omap_hwmod_sysc_type1,
|
||||
};
|
||||
|
||||
static struct omap_hwmod_class uart_class = {
|
||||
.name = "uart",
|
||||
.sysc = &uart_sysc,
|
||||
};
|
||||
|
||||
/* UART1 */
|
||||
|
||||
static struct omap_hwmod_irq_info uart1_mpu_irqs[] = {
|
||||
{ .irq = INT_24XX_UART1_IRQ, },
|
||||
};
|
||||
|
||||
static struct omap_hwmod_dma_info uart1_sdma_reqs[] = {
|
||||
{ .name = "tx", .dma_req = OMAP24XX_DMA_UART1_TX, },
|
||||
{ .name = "rx", .dma_req = OMAP24XX_DMA_UART1_RX, },
|
||||
};
|
||||
|
||||
static struct omap_hwmod_ocp_if *omap3xxx_uart1_slaves[] = {
|
||||
&omap3_l4_core__uart1,
|
||||
};
|
||||
|
||||
static struct omap_hwmod omap3xxx_uart1_hwmod = {
|
||||
.name = "uart1",
|
||||
.mpu_irqs = uart1_mpu_irqs,
|
||||
.mpu_irqs_cnt = ARRAY_SIZE(uart1_mpu_irqs),
|
||||
.sdma_reqs = uart1_sdma_reqs,
|
||||
.sdma_reqs_cnt = ARRAY_SIZE(uart1_sdma_reqs),
|
||||
.main_clk = "uart1_fck",
|
||||
.prcm = {
|
||||
.omap2 = {
|
||||
.module_offs = CORE_MOD,
|
||||
.prcm_reg_id = 1,
|
||||
.module_bit = OMAP3430_EN_UART1_SHIFT,
|
||||
.idlest_reg_id = 1,
|
||||
.idlest_idle_bit = OMAP3430_EN_UART1_SHIFT,
|
||||
},
|
||||
},
|
||||
.slaves = omap3xxx_uart1_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap3xxx_uart1_slaves),
|
||||
.class = &uart_class,
|
||||
.omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
|
||||
};
|
||||
|
||||
/* UART2 */
|
||||
|
||||
static struct omap_hwmod_irq_info uart2_mpu_irqs[] = {
|
||||
{ .irq = INT_24XX_UART2_IRQ, },
|
||||
};
|
||||
|
||||
static struct omap_hwmod_dma_info uart2_sdma_reqs[] = {
|
||||
{ .name = "tx", .dma_req = OMAP24XX_DMA_UART2_TX, },
|
||||
{ .name = "rx", .dma_req = OMAP24XX_DMA_UART2_RX, },
|
||||
};
|
||||
|
||||
static struct omap_hwmod_ocp_if *omap3xxx_uart2_slaves[] = {
|
||||
&omap3_l4_core__uart2,
|
||||
};
|
||||
|
||||
static struct omap_hwmod omap3xxx_uart2_hwmod = {
|
||||
.name = "uart2",
|
||||
.mpu_irqs = uart2_mpu_irqs,
|
||||
.mpu_irqs_cnt = ARRAY_SIZE(uart2_mpu_irqs),
|
||||
.sdma_reqs = uart2_sdma_reqs,
|
||||
.sdma_reqs_cnt = ARRAY_SIZE(uart2_sdma_reqs),
|
||||
.main_clk = "uart2_fck",
|
||||
.prcm = {
|
||||
.omap2 = {
|
||||
.module_offs = CORE_MOD,
|
||||
.prcm_reg_id = 1,
|
||||
.module_bit = OMAP3430_EN_UART2_SHIFT,
|
||||
.idlest_reg_id = 1,
|
||||
.idlest_idle_bit = OMAP3430_EN_UART2_SHIFT,
|
||||
},
|
||||
},
|
||||
.slaves = omap3xxx_uart2_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap3xxx_uart2_slaves),
|
||||
.class = &uart_class,
|
||||
.omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
|
||||
};
|
||||
|
||||
/* UART3 */
|
||||
|
||||
static struct omap_hwmod_irq_info uart3_mpu_irqs[] = {
|
||||
{ .irq = INT_24XX_UART3_IRQ, },
|
||||
};
|
||||
|
||||
static struct omap_hwmod_dma_info uart3_sdma_reqs[] = {
|
||||
{ .name = "tx", .dma_req = OMAP24XX_DMA_UART3_TX, },
|
||||
{ .name = "rx", .dma_req = OMAP24XX_DMA_UART3_RX, },
|
||||
};
|
||||
|
||||
static struct omap_hwmod_ocp_if *omap3xxx_uart3_slaves[] = {
|
||||
&omap3_l4_per__uart3,
|
||||
};
|
||||
|
||||
static struct omap_hwmod omap3xxx_uart3_hwmod = {
|
||||
.name = "uart3",
|
||||
.mpu_irqs = uart3_mpu_irqs,
|
||||
.mpu_irqs_cnt = ARRAY_SIZE(uart3_mpu_irqs),
|
||||
.sdma_reqs = uart3_sdma_reqs,
|
||||
.sdma_reqs_cnt = ARRAY_SIZE(uart3_sdma_reqs),
|
||||
.main_clk = "uart3_fck",
|
||||
.prcm = {
|
||||
.omap2 = {
|
||||
.module_offs = OMAP3430_PER_MOD,
|
||||
.prcm_reg_id = 1,
|
||||
.module_bit = OMAP3430_EN_UART3_SHIFT,
|
||||
.idlest_reg_id = 1,
|
||||
.idlest_idle_bit = OMAP3430_EN_UART3_SHIFT,
|
||||
},
|
||||
},
|
||||
.slaves = omap3xxx_uart3_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap3xxx_uart3_slaves),
|
||||
.class = &uart_class,
|
||||
.omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3430),
|
||||
};
|
||||
|
||||
/* UART4 */
|
||||
|
||||
static struct omap_hwmod_irq_info uart4_mpu_irqs[] = {
|
||||
{ .irq = INT_36XX_UART4_IRQ, },
|
||||
};
|
||||
|
||||
static struct omap_hwmod_dma_info uart4_sdma_reqs[] = {
|
||||
{ .name = "rx", .dma_req = OMAP36XX_DMA_UART4_RX, },
|
||||
{ .name = "tx", .dma_req = OMAP36XX_DMA_UART4_TX, },
|
||||
};
|
||||
|
||||
static struct omap_hwmod_ocp_if *omap3xxx_uart4_slaves[] = {
|
||||
&omap3_l4_per__uart4,
|
||||
};
|
||||
|
||||
static struct omap_hwmod omap3xxx_uart4_hwmod = {
|
||||
.name = "uart4",
|
||||
.mpu_irqs = uart4_mpu_irqs,
|
||||
.mpu_irqs_cnt = ARRAY_SIZE(uart4_mpu_irqs),
|
||||
.sdma_reqs = uart4_sdma_reqs,
|
||||
.sdma_reqs_cnt = ARRAY_SIZE(uart4_sdma_reqs),
|
||||
.main_clk = "uart4_fck",
|
||||
.prcm = {
|
||||
.omap2 = {
|
||||
.module_offs = OMAP3430_PER_MOD,
|
||||
.prcm_reg_id = 1,
|
||||
.module_bit = OMAP3630_EN_UART4_SHIFT,
|
||||
.idlest_reg_id = 1,
|
||||
.idlest_idle_bit = OMAP3630_EN_UART4_SHIFT,
|
||||
},
|
||||
},
|
||||
.slaves = omap3xxx_uart4_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap3xxx_uart4_slaves),
|
||||
.class = &uart_class,
|
||||
.omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP3630ES1),
|
||||
};
|
||||
|
||||
static __initdata struct omap_hwmod *omap3xxx_hwmods[] = {
|
||||
&omap3xxx_l3_main_hwmod,
|
||||
&omap3xxx_l4_core_hwmod,
|
||||
@ -204,6 +516,11 @@ static __initdata struct omap_hwmod *omap3xxx_hwmods[] = {
|
||||
&omap3xxx_l4_wkup_hwmod,
|
||||
&omap3xxx_mpu_hwmod,
|
||||
&omap3xxx_iva_hwmod,
|
||||
&omap3xxx_wd_timer2_hwmod,
|
||||
&omap3xxx_uart1_hwmod,
|
||||
&omap3xxx_uart2_hwmod,
|
||||
&omap3xxx_uart3_hwmod,
|
||||
&omap3xxx_uart4_hwmod,
|
||||
NULL,
|
||||
};
|
||||
|
||||
@ -211,5 +528,3 @@ int __init omap3xxx_hwmod_init(void)
|
||||
{
|
||||
return omap_hwmod_init(omap3xxx_hwmods);
|
||||
}
|
||||
|
||||
|
||||
|
850
arch/arm/mach-omap2/omap_hwmod_44xx_data.c
Normal file
850
arch/arm/mach-omap2/omap_hwmod_44xx_data.c
Normal file
@ -0,0 +1,850 @@
|
||||
/*
|
||||
* Hardware modules present on the OMAP44xx chips
|
||||
*
|
||||
* Copyright (C) 2009-2010 Texas Instruments, Inc.
|
||||
* Copyright (C) 2009-2010 Nokia Corporation
|
||||
*
|
||||
* Paul Walmsley
|
||||
* Benoit Cousson
|
||||
*
|
||||
* This file is automatically generated from the OMAP hardware databases.
|
||||
* We respectfully ask that any modifications to this file be coordinated
|
||||
* with the public linux-omap@vger.kernel.org mailing list and the
|
||||
* authors above to ensure that the autogeneration scripts are kept
|
||||
* up-to-date with the file contents.
|
||||
*
|
||||
* 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/io.h>
|
||||
|
||||
#include <plat/omap_hwmod.h>
|
||||
#include <plat/cpu.h>
|
||||
|
||||
#include "omap_hwmod_common_data.h"
|
||||
|
||||
#include "cm.h"
|
||||
#include "prm-regbits-44xx.h"
|
||||
|
||||
/* Base offset for all OMAP4 interrupts external to MPUSS */
|
||||
#define OMAP44XX_IRQ_GIC_START 32
|
||||
|
||||
/* Base offset for all OMAP4 dma requests */
|
||||
#define OMAP44XX_DMA_REQ_START 1
|
||||
|
||||
/* Backward references (IPs with Bus Master capability) */
|
||||
static struct omap_hwmod omap44xx_dmm_hwmod;
|
||||
static struct omap_hwmod omap44xx_emif_fw_hwmod;
|
||||
static struct omap_hwmod omap44xx_l3_instr_hwmod;
|
||||
static struct omap_hwmod omap44xx_l3_main_1_hwmod;
|
||||
static struct omap_hwmod omap44xx_l3_main_2_hwmod;
|
||||
static struct omap_hwmod omap44xx_l3_main_3_hwmod;
|
||||
static struct omap_hwmod omap44xx_l4_abe_hwmod;
|
||||
static struct omap_hwmod omap44xx_l4_cfg_hwmod;
|
||||
static struct omap_hwmod omap44xx_l4_per_hwmod;
|
||||
static struct omap_hwmod omap44xx_l4_wkup_hwmod;
|
||||
static struct omap_hwmod omap44xx_mpu_hwmod;
|
||||
static struct omap_hwmod omap44xx_mpu_private_hwmod;
|
||||
|
||||
/*
|
||||
* Interconnects omap_hwmod structures
|
||||
* hwmods that compose the global OMAP interconnect
|
||||
*/
|
||||
|
||||
/*
|
||||
* 'dmm' class
|
||||
* instance(s): dmm
|
||||
*/
|
||||
static struct omap_hwmod_class omap44xx_dmm_hwmod_class = {
|
||||
.name = "dmm",
|
||||
};
|
||||
|
||||
/* dmm interface data */
|
||||
/* l3_main_1 -> dmm */
|
||||
static struct omap_hwmod_ocp_if omap44xx_l3_main_1__dmm = {
|
||||
.master = &omap44xx_l3_main_1_hwmod,
|
||||
.slave = &omap44xx_dmm_hwmod,
|
||||
.clk = "l3_div_ck",
|
||||
.user = OCP_USER_MPU | OCP_USER_SDMA,
|
||||
};
|
||||
|
||||
/* mpu -> dmm */
|
||||
static struct omap_hwmod_ocp_if omap44xx_mpu__dmm = {
|
||||
.master = &omap44xx_mpu_hwmod,
|
||||
.slave = &omap44xx_dmm_hwmod,
|
||||
.clk = "l3_div_ck",
|
||||
.user = OCP_USER_MPU | OCP_USER_SDMA,
|
||||
};
|
||||
|
||||
/* dmm slave ports */
|
||||
static struct omap_hwmod_ocp_if *omap44xx_dmm_slaves[] = {
|
||||
&omap44xx_l3_main_1__dmm,
|
||||
&omap44xx_mpu__dmm,
|
||||
};
|
||||
|
||||
static struct omap_hwmod_irq_info omap44xx_dmm_irqs[] = {
|
||||
{ .irq = 113 + OMAP44XX_IRQ_GIC_START },
|
||||
};
|
||||
|
||||
static struct omap_hwmod omap44xx_dmm_hwmod = {
|
||||
.name = "dmm",
|
||||
.class = &omap44xx_dmm_hwmod_class,
|
||||
.slaves = omap44xx_dmm_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap44xx_dmm_slaves),
|
||||
.mpu_irqs = omap44xx_dmm_irqs,
|
||||
.mpu_irqs_cnt = ARRAY_SIZE(omap44xx_dmm_irqs),
|
||||
.omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
|
||||
};
|
||||
|
||||
/*
|
||||
* 'emif_fw' class
|
||||
* instance(s): emif_fw
|
||||
*/
|
||||
static struct omap_hwmod_class omap44xx_emif_fw_hwmod_class = {
|
||||
.name = "emif_fw",
|
||||
};
|
||||
|
||||
/* emif_fw interface data */
|
||||
/* dmm -> emif_fw */
|
||||
static struct omap_hwmod_ocp_if omap44xx_dmm__emif_fw = {
|
||||
.master = &omap44xx_dmm_hwmod,
|
||||
.slave = &omap44xx_emif_fw_hwmod,
|
||||
.clk = "l3_div_ck",
|
||||
.user = OCP_USER_MPU | OCP_USER_SDMA,
|
||||
};
|
||||
|
||||
/* l4_cfg -> emif_fw */
|
||||
static struct omap_hwmod_ocp_if omap44xx_l4_cfg__emif_fw = {
|
||||
.master = &omap44xx_l4_cfg_hwmod,
|
||||
.slave = &omap44xx_emif_fw_hwmod,
|
||||
.clk = "l4_div_ck",
|
||||
.user = OCP_USER_MPU | OCP_USER_SDMA,
|
||||
};
|
||||
|
||||
/* emif_fw slave ports */
|
||||
static struct omap_hwmod_ocp_if *omap44xx_emif_fw_slaves[] = {
|
||||
&omap44xx_dmm__emif_fw,
|
||||
&omap44xx_l4_cfg__emif_fw,
|
||||
};
|
||||
|
||||
static struct omap_hwmod omap44xx_emif_fw_hwmod = {
|
||||
.name = "emif_fw",
|
||||
.class = &omap44xx_emif_fw_hwmod_class,
|
||||
.slaves = omap44xx_emif_fw_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap44xx_emif_fw_slaves),
|
||||
.omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
|
||||
};
|
||||
|
||||
/*
|
||||
* 'l3' class
|
||||
* instance(s): l3_instr, l3_main_1, l3_main_2, l3_main_3
|
||||
*/
|
||||
static struct omap_hwmod_class omap44xx_l3_hwmod_class = {
|
||||
.name = "l3",
|
||||
};
|
||||
|
||||
/* l3_instr interface data */
|
||||
/* l3_main_3 -> l3_instr */
|
||||
static struct omap_hwmod_ocp_if omap44xx_l3_main_3__l3_instr = {
|
||||
.master = &omap44xx_l3_main_3_hwmod,
|
||||
.slave = &omap44xx_l3_instr_hwmod,
|
||||
.clk = "l3_div_ck",
|
||||
.user = OCP_USER_MPU | OCP_USER_SDMA,
|
||||
};
|
||||
|
||||
/* l3_instr slave ports */
|
||||
static struct omap_hwmod_ocp_if *omap44xx_l3_instr_slaves[] = {
|
||||
&omap44xx_l3_main_3__l3_instr,
|
||||
};
|
||||
|
||||
static struct omap_hwmod omap44xx_l3_instr_hwmod = {
|
||||
.name = "l3_instr",
|
||||
.class = &omap44xx_l3_hwmod_class,
|
||||
.slaves = omap44xx_l3_instr_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap44xx_l3_instr_slaves),
|
||||
.omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
|
||||
};
|
||||
|
||||
/* l3_main_2 -> l3_main_1 */
|
||||
static struct omap_hwmod_ocp_if omap44xx_l3_main_2__l3_main_1 = {
|
||||
.master = &omap44xx_l3_main_2_hwmod,
|
||||
.slave = &omap44xx_l3_main_1_hwmod,
|
||||
.clk = "l3_div_ck",
|
||||
.user = OCP_USER_MPU | OCP_USER_SDMA,
|
||||
};
|
||||
|
||||
/* l4_cfg -> l3_main_1 */
|
||||
static struct omap_hwmod_ocp_if omap44xx_l4_cfg__l3_main_1 = {
|
||||
.master = &omap44xx_l4_cfg_hwmod,
|
||||
.slave = &omap44xx_l3_main_1_hwmod,
|
||||
.clk = "l4_div_ck",
|
||||
.user = OCP_USER_MPU | OCP_USER_SDMA,
|
||||
};
|
||||
|
||||
/* mpu -> l3_main_1 */
|
||||
static struct omap_hwmod_ocp_if omap44xx_mpu__l3_main_1 = {
|
||||
.master = &omap44xx_mpu_hwmod,
|
||||
.slave = &omap44xx_l3_main_1_hwmod,
|
||||
.clk = "l3_div_ck",
|
||||
.user = OCP_USER_MPU | OCP_USER_SDMA,
|
||||
};
|
||||
|
||||
/* l3_main_1 slave ports */
|
||||
static struct omap_hwmod_ocp_if *omap44xx_l3_main_1_slaves[] = {
|
||||
&omap44xx_l3_main_2__l3_main_1,
|
||||
&omap44xx_l4_cfg__l3_main_1,
|
||||
&omap44xx_mpu__l3_main_1,
|
||||
};
|
||||
|
||||
static struct omap_hwmod omap44xx_l3_main_1_hwmod = {
|
||||
.name = "l3_main_1",
|
||||
.class = &omap44xx_l3_hwmod_class,
|
||||
.slaves = omap44xx_l3_main_1_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap44xx_l3_main_1_slaves),
|
||||
.omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
|
||||
};
|
||||
|
||||
/* l3_main_2 interface data */
|
||||
/* l3_main_1 -> l3_main_2 */
|
||||
static struct omap_hwmod_ocp_if omap44xx_l3_main_1__l3_main_2 = {
|
||||
.master = &omap44xx_l3_main_1_hwmod,
|
||||
.slave = &omap44xx_l3_main_2_hwmod,
|
||||
.clk = "l3_div_ck",
|
||||
.user = OCP_USER_MPU | OCP_USER_SDMA,
|
||||
};
|
||||
|
||||
/* l4_cfg -> l3_main_2 */
|
||||
static struct omap_hwmod_ocp_if omap44xx_l4_cfg__l3_main_2 = {
|
||||
.master = &omap44xx_l4_cfg_hwmod,
|
||||
.slave = &omap44xx_l3_main_2_hwmod,
|
||||
.clk = "l4_div_ck",
|
||||
.user = OCP_USER_MPU | OCP_USER_SDMA,
|
||||
};
|
||||
|
||||
/* l3_main_2 slave ports */
|
||||
static struct omap_hwmod_ocp_if *omap44xx_l3_main_2_slaves[] = {
|
||||
&omap44xx_l3_main_1__l3_main_2,
|
||||
&omap44xx_l4_cfg__l3_main_2,
|
||||
};
|
||||
|
||||
static struct omap_hwmod omap44xx_l3_main_2_hwmod = {
|
||||
.name = "l3_main_2",
|
||||
.class = &omap44xx_l3_hwmod_class,
|
||||
.slaves = omap44xx_l3_main_2_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap44xx_l3_main_2_slaves),
|
||||
.omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
|
||||
};
|
||||
|
||||
/* l3_main_3 interface data */
|
||||
/* l3_main_1 -> l3_main_3 */
|
||||
static struct omap_hwmod_ocp_if omap44xx_l3_main_1__l3_main_3 = {
|
||||
.master = &omap44xx_l3_main_1_hwmod,
|
||||
.slave = &omap44xx_l3_main_3_hwmod,
|
||||
.clk = "l3_div_ck",
|
||||
.user = OCP_USER_MPU | OCP_USER_SDMA,
|
||||
};
|
||||
|
||||
/* l3_main_2 -> l3_main_3 */
|
||||
static struct omap_hwmod_ocp_if omap44xx_l3_main_2__l3_main_3 = {
|
||||
.master = &omap44xx_l3_main_2_hwmod,
|
||||
.slave = &omap44xx_l3_main_3_hwmod,
|
||||
.clk = "l3_div_ck",
|
||||
.user = OCP_USER_MPU | OCP_USER_SDMA,
|
||||
};
|
||||
|
||||
/* l4_cfg -> l3_main_3 */
|
||||
static struct omap_hwmod_ocp_if omap44xx_l4_cfg__l3_main_3 = {
|
||||
.master = &omap44xx_l4_cfg_hwmod,
|
||||
.slave = &omap44xx_l3_main_3_hwmod,
|
||||
.clk = "l4_div_ck",
|
||||
.user = OCP_USER_MPU | OCP_USER_SDMA,
|
||||
};
|
||||
|
||||
/* l3_main_3 slave ports */
|
||||
static struct omap_hwmod_ocp_if *omap44xx_l3_main_3_slaves[] = {
|
||||
&omap44xx_l3_main_1__l3_main_3,
|
||||
&omap44xx_l3_main_2__l3_main_3,
|
||||
&omap44xx_l4_cfg__l3_main_3,
|
||||
};
|
||||
|
||||
static struct omap_hwmod omap44xx_l3_main_3_hwmod = {
|
||||
.name = "l3_main_3",
|
||||
.class = &omap44xx_l3_hwmod_class,
|
||||
.slaves = omap44xx_l3_main_3_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap44xx_l3_main_3_slaves),
|
||||
.omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
|
||||
};
|
||||
|
||||
/*
|
||||
* 'l4' class
|
||||
* instance(s): l4_abe, l4_cfg, l4_per, l4_wkup
|
||||
*/
|
||||
static struct omap_hwmod_class omap44xx_l4_hwmod_class = {
|
||||
.name = "l4",
|
||||
};
|
||||
|
||||
/* l4_abe interface data */
|
||||
/* l3_main_1 -> l4_abe */
|
||||
static struct omap_hwmod_ocp_if omap44xx_l3_main_1__l4_abe = {
|
||||
.master = &omap44xx_l3_main_1_hwmod,
|
||||
.slave = &omap44xx_l4_abe_hwmod,
|
||||
.clk = "l3_div_ck",
|
||||
.user = OCP_USER_MPU | OCP_USER_SDMA,
|
||||
};
|
||||
|
||||
/* mpu -> l4_abe */
|
||||
static struct omap_hwmod_ocp_if omap44xx_mpu__l4_abe = {
|
||||
.master = &omap44xx_mpu_hwmod,
|
||||
.slave = &omap44xx_l4_abe_hwmod,
|
||||
.clk = "ocp_abe_iclk",
|
||||
.user = OCP_USER_MPU | OCP_USER_SDMA,
|
||||
};
|
||||
|
||||
/* l4_abe slave ports */
|
||||
static struct omap_hwmod_ocp_if *omap44xx_l4_abe_slaves[] = {
|
||||
&omap44xx_l3_main_1__l4_abe,
|
||||
&omap44xx_mpu__l4_abe,
|
||||
};
|
||||
|
||||
static struct omap_hwmod omap44xx_l4_abe_hwmod = {
|
||||
.name = "l4_abe",
|
||||
.class = &omap44xx_l4_hwmod_class,
|
||||
.slaves = omap44xx_l4_abe_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap44xx_l4_abe_slaves),
|
||||
.omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
|
||||
};
|
||||
|
||||
/* l4_cfg interface data */
|
||||
/* l3_main_1 -> l4_cfg */
|
||||
static struct omap_hwmod_ocp_if omap44xx_l3_main_1__l4_cfg = {
|
||||
.master = &omap44xx_l3_main_1_hwmod,
|
||||
.slave = &omap44xx_l4_cfg_hwmod,
|
||||
.clk = "l3_div_ck",
|
||||
.user = OCP_USER_MPU | OCP_USER_SDMA,
|
||||
};
|
||||
|
||||
/* l4_cfg slave ports */
|
||||
static struct omap_hwmod_ocp_if *omap44xx_l4_cfg_slaves[] = {
|
||||
&omap44xx_l3_main_1__l4_cfg,
|
||||
};
|
||||
|
||||
static struct omap_hwmod omap44xx_l4_cfg_hwmod = {
|
||||
.name = "l4_cfg",
|
||||
.class = &omap44xx_l4_hwmod_class,
|
||||
.slaves = omap44xx_l4_cfg_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap44xx_l4_cfg_slaves),
|
||||
.omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
|
||||
};
|
||||
|
||||
/* l4_per interface data */
|
||||
/* l3_main_2 -> l4_per */
|
||||
static struct omap_hwmod_ocp_if omap44xx_l3_main_2__l4_per = {
|
||||
.master = &omap44xx_l3_main_2_hwmod,
|
||||
.slave = &omap44xx_l4_per_hwmod,
|
||||
.clk = "l3_div_ck",
|
||||
.user = OCP_USER_MPU | OCP_USER_SDMA,
|
||||
};
|
||||
|
||||
/* l4_per slave ports */
|
||||
static struct omap_hwmod_ocp_if *omap44xx_l4_per_slaves[] = {
|
||||
&omap44xx_l3_main_2__l4_per,
|
||||
};
|
||||
|
||||
static struct omap_hwmod omap44xx_l4_per_hwmod = {
|
||||
.name = "l4_per",
|
||||
.class = &omap44xx_l4_hwmod_class,
|
||||
.slaves = omap44xx_l4_per_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap44xx_l4_per_slaves),
|
||||
.omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
|
||||
};
|
||||
|
||||
/* l4_wkup interface data */
|
||||
/* l4_cfg -> l4_wkup */
|
||||
static struct omap_hwmod_ocp_if omap44xx_l4_cfg__l4_wkup = {
|
||||
.master = &omap44xx_l4_cfg_hwmod,
|
||||
.slave = &omap44xx_l4_wkup_hwmod,
|
||||
.clk = "l4_div_ck",
|
||||
.user = OCP_USER_MPU | OCP_USER_SDMA,
|
||||
};
|
||||
|
||||
/* l4_wkup slave ports */
|
||||
static struct omap_hwmod_ocp_if *omap44xx_l4_wkup_slaves[] = {
|
||||
&omap44xx_l4_cfg__l4_wkup,
|
||||
};
|
||||
|
||||
static struct omap_hwmod omap44xx_l4_wkup_hwmod = {
|
||||
.name = "l4_wkup",
|
||||
.class = &omap44xx_l4_hwmod_class,
|
||||
.slaves = omap44xx_l4_wkup_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap44xx_l4_wkup_slaves),
|
||||
.omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
|
||||
};
|
||||
|
||||
/*
|
||||
* 'mpu_bus' class
|
||||
* instance(s): mpu_private
|
||||
*/
|
||||
static struct omap_hwmod_class omap44xx_mpu_bus_hwmod_class = {
|
||||
.name = "mpu_bus",
|
||||
};
|
||||
|
||||
/* mpu_private interface data */
|
||||
/* mpu -> mpu_private */
|
||||
static struct omap_hwmod_ocp_if omap44xx_mpu__mpu_private = {
|
||||
.master = &omap44xx_mpu_hwmod,
|
||||
.slave = &omap44xx_mpu_private_hwmod,
|
||||
.clk = "l3_div_ck",
|
||||
.user = OCP_USER_MPU | OCP_USER_SDMA,
|
||||
};
|
||||
|
||||
/* mpu_private slave ports */
|
||||
static struct omap_hwmod_ocp_if *omap44xx_mpu_private_slaves[] = {
|
||||
&omap44xx_mpu__mpu_private,
|
||||
};
|
||||
|
||||
static struct omap_hwmod omap44xx_mpu_private_hwmod = {
|
||||
.name = "mpu_private",
|
||||
.class = &omap44xx_mpu_bus_hwmod_class,
|
||||
.slaves = omap44xx_mpu_private_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap44xx_mpu_private_slaves),
|
||||
.omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
|
||||
};
|
||||
|
||||
/*
|
||||
* 'mpu' class
|
||||
* mpu sub-system
|
||||
*/
|
||||
|
||||
static struct omap_hwmod_class omap44xx_mpu_hwmod_class = {
|
||||
.name = "mpu",
|
||||
};
|
||||
|
||||
/* mpu */
|
||||
static struct omap_hwmod_irq_info omap44xx_mpu_irqs[] = {
|
||||
{ .name = "pl310", .irq = 0 + OMAP44XX_IRQ_GIC_START },
|
||||
{ .name = "cti0", .irq = 1 + OMAP44XX_IRQ_GIC_START },
|
||||
{ .name = "cti1", .irq = 2 + OMAP44XX_IRQ_GIC_START },
|
||||
};
|
||||
|
||||
/* mpu master ports */
|
||||
static struct omap_hwmod_ocp_if *omap44xx_mpu_masters[] = {
|
||||
&omap44xx_mpu__l3_main_1,
|
||||
&omap44xx_mpu__l4_abe,
|
||||
&omap44xx_mpu__dmm,
|
||||
};
|
||||
|
||||
static struct omap_hwmod omap44xx_mpu_hwmod = {
|
||||
.name = "mpu",
|
||||
.class = &omap44xx_mpu_hwmod_class,
|
||||
.flags = (HWMOD_INIT_NO_IDLE | HWMOD_INIT_NO_RESET),
|
||||
.mpu_irqs = omap44xx_mpu_irqs,
|
||||
.mpu_irqs_cnt = ARRAY_SIZE(omap44xx_mpu_irqs),
|
||||
.main_clk = "dpll_mpu_m2_ck",
|
||||
.prcm = {
|
||||
.omap4 = {
|
||||
.clkctrl_reg = OMAP4430_CM_MPU_MPU_CLKCTRL,
|
||||
},
|
||||
},
|
||||
.masters = omap44xx_mpu_masters,
|
||||
.masters_cnt = ARRAY_SIZE(omap44xx_mpu_masters),
|
||||
.omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
|
||||
};
|
||||
|
||||
/*
|
||||
* 'wd_timer' class
|
||||
* 32-bit watchdog upward counter that generates a pulse on the reset pin on
|
||||
* overflow condition
|
||||
*/
|
||||
|
||||
static struct omap_hwmod_class_sysconfig omap44xx_wd_timer_sysc = {
|
||||
.rev_offs = 0x0000,
|
||||
.sysc_offs = 0x0010,
|
||||
.syss_offs = 0x0014,
|
||||
.sysc_flags = (SYSC_HAS_SIDLEMODE | SYSC_HAS_EMUFREE |
|
||||
SYSC_HAS_SOFTRESET),
|
||||
.idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
|
||||
.sysc_fields = &omap_hwmod_sysc_type1,
|
||||
};
|
||||
|
||||
/*
|
||||
* 'uart' class
|
||||
* universal asynchronous receiver/transmitter (uart)
|
||||
*/
|
||||
|
||||
static struct omap_hwmod_class_sysconfig omap44xx_uart_sysc = {
|
||||
.rev_offs = 0x0050,
|
||||
.sysc_offs = 0x0054,
|
||||
.syss_offs = 0x0058,
|
||||
.sysc_flags = (SYSC_HAS_ENAWAKEUP | SYSC_HAS_SIDLEMODE |
|
||||
SYSC_HAS_SOFTRESET | SYSC_HAS_AUTOIDLE),
|
||||
.idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART),
|
||||
.sysc_fields = &omap_hwmod_sysc_type1,
|
||||
};
|
||||
|
||||
static struct omap_hwmod_class omap44xx_wd_timer_hwmod_class = {
|
||||
.name = "wd_timer",
|
||||
.sysc = &omap44xx_wd_timer_sysc,
|
||||
};
|
||||
|
||||
/* wd_timer2 */
|
||||
static struct omap_hwmod omap44xx_wd_timer2_hwmod;
|
||||
static struct omap_hwmod_irq_info omap44xx_wd_timer2_irqs[] = {
|
||||
{ .irq = 80 + OMAP44XX_IRQ_GIC_START },
|
||||
};
|
||||
|
||||
static struct omap_hwmod_addr_space omap44xx_wd_timer2_addrs[] = {
|
||||
{
|
||||
.pa_start = 0x4a314000,
|
||||
.pa_end = 0x4a31407f,
|
||||
.flags = ADDR_TYPE_RT
|
||||
},
|
||||
};
|
||||
|
||||
static struct omap_hwmod_class omap44xx_uart_hwmod_class = {
|
||||
.name = "uart",
|
||||
.sysc = &omap44xx_uart_sysc,
|
||||
};
|
||||
|
||||
/* uart1 */
|
||||
static struct omap_hwmod omap44xx_uart1_hwmod;
|
||||
static struct omap_hwmod_irq_info omap44xx_uart1_irqs[] = {
|
||||
{ .irq = 72 + OMAP44XX_IRQ_GIC_START },
|
||||
};
|
||||
|
||||
static struct omap_hwmod_dma_info omap44xx_uart1_sdma_reqs[] = {
|
||||
{ .name = "tx", .dma_req = 48 + OMAP44XX_DMA_REQ_START },
|
||||
{ .name = "rx", .dma_req = 49 + OMAP44XX_DMA_REQ_START },
|
||||
};
|
||||
|
||||
static struct omap_hwmod_addr_space omap44xx_uart1_addrs[] = {
|
||||
{
|
||||
.pa_start = 0x4806a000,
|
||||
.pa_end = 0x4806a0ff,
|
||||
.flags = ADDR_TYPE_RT
|
||||
},
|
||||
};
|
||||
|
||||
/* l4_per -> uart1 */
|
||||
static struct omap_hwmod_ocp_if omap44xx_l4_per__uart1 = {
|
||||
.master = &omap44xx_l4_per_hwmod,
|
||||
.slave = &omap44xx_uart1_hwmod,
|
||||
.clk = "l4_div_ck",
|
||||
.addr = omap44xx_uart1_addrs,
|
||||
.addr_cnt = ARRAY_SIZE(omap44xx_uart1_addrs),
|
||||
.user = OCP_USER_MPU | OCP_USER_SDMA,
|
||||
};
|
||||
|
||||
/* uart1 slave ports */
|
||||
static struct omap_hwmod_ocp_if *omap44xx_uart1_slaves[] = {
|
||||
&omap44xx_l4_per__uart1,
|
||||
};
|
||||
|
||||
static struct omap_hwmod omap44xx_uart1_hwmod = {
|
||||
.name = "uart1",
|
||||
.class = &omap44xx_uart_hwmod_class,
|
||||
.mpu_irqs = omap44xx_uart1_irqs,
|
||||
.mpu_irqs_cnt = ARRAY_SIZE(omap44xx_uart1_irqs),
|
||||
.sdma_reqs = omap44xx_uart1_sdma_reqs,
|
||||
.sdma_reqs_cnt = ARRAY_SIZE(omap44xx_uart1_sdma_reqs),
|
||||
.main_clk = "uart1_fck",
|
||||
.prcm = {
|
||||
.omap4 = {
|
||||
.clkctrl_reg = OMAP4430_CM_L4PER_UART1_CLKCTRL,
|
||||
},
|
||||
},
|
||||
.slaves = omap44xx_uart1_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap44xx_uart1_slaves),
|
||||
.omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
|
||||
};
|
||||
|
||||
/* uart2 */
|
||||
static struct omap_hwmod omap44xx_uart2_hwmod;
|
||||
static struct omap_hwmod_irq_info omap44xx_uart2_irqs[] = {
|
||||
{ .irq = 73 + OMAP44XX_IRQ_GIC_START },
|
||||
};
|
||||
|
||||
static struct omap_hwmod_dma_info omap44xx_uart2_sdma_reqs[] = {
|
||||
{ .name = "tx", .dma_req = 50 + OMAP44XX_DMA_REQ_START },
|
||||
{ .name = "rx", .dma_req = 51 + OMAP44XX_DMA_REQ_START },
|
||||
};
|
||||
|
||||
static struct omap_hwmod_addr_space omap44xx_uart2_addrs[] = {
|
||||
{
|
||||
.pa_start = 0x4806c000,
|
||||
.pa_end = 0x4806c0ff,
|
||||
.flags = ADDR_TYPE_RT
|
||||
},
|
||||
};
|
||||
|
||||
/* l4_wkup -> wd_timer2 */
|
||||
static struct omap_hwmod_ocp_if omap44xx_l4_wkup__wd_timer2 = {
|
||||
.master = &omap44xx_l4_wkup_hwmod,
|
||||
.slave = &omap44xx_wd_timer2_hwmod,
|
||||
.clk = "l4_wkup_clk_mux_ck",
|
||||
.addr = omap44xx_wd_timer2_addrs,
|
||||
.addr_cnt = ARRAY_SIZE(omap44xx_wd_timer2_addrs),
|
||||
.user = OCP_USER_MPU | OCP_USER_SDMA,
|
||||
};
|
||||
|
||||
/* wd_timer2 slave ports */
|
||||
static struct omap_hwmod_ocp_if *omap44xx_wd_timer2_slaves[] = {
|
||||
&omap44xx_l4_wkup__wd_timer2,
|
||||
};
|
||||
|
||||
static struct omap_hwmod omap44xx_wd_timer2_hwmod = {
|
||||
.name = "wd_timer2",
|
||||
.class = &omap44xx_wd_timer_hwmod_class,
|
||||
.mpu_irqs = omap44xx_wd_timer2_irqs,
|
||||
.mpu_irqs_cnt = ARRAY_SIZE(omap44xx_wd_timer2_irqs),
|
||||
.main_clk = "wd_timer2_fck",
|
||||
.prcm = {
|
||||
.omap4 = {
|
||||
.clkctrl_reg = OMAP4430_CM_WKUP_WDT2_CLKCTRL,
|
||||
},
|
||||
},
|
||||
.slaves = omap44xx_wd_timer2_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap44xx_wd_timer2_slaves),
|
||||
.omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
|
||||
};
|
||||
|
||||
/* wd_timer3 */
|
||||
static struct omap_hwmod omap44xx_wd_timer3_hwmod;
|
||||
static struct omap_hwmod_irq_info omap44xx_wd_timer3_irqs[] = {
|
||||
{ .irq = 36 + OMAP44XX_IRQ_GIC_START },
|
||||
};
|
||||
|
||||
static struct omap_hwmod_addr_space omap44xx_wd_timer3_addrs[] = {
|
||||
{
|
||||
.pa_start = 0x40130000,
|
||||
.pa_end = 0x4013007f,
|
||||
.flags = ADDR_TYPE_RT
|
||||
},
|
||||
};
|
||||
|
||||
/* l4_per -> uart2 */
|
||||
static struct omap_hwmod_ocp_if omap44xx_l4_per__uart2 = {
|
||||
.master = &omap44xx_l4_per_hwmod,
|
||||
.slave = &omap44xx_uart2_hwmod,
|
||||
.clk = "l4_div_ck",
|
||||
.addr = omap44xx_uart2_addrs,
|
||||
.addr_cnt = ARRAY_SIZE(omap44xx_uart2_addrs),
|
||||
.user = OCP_USER_MPU | OCP_USER_SDMA,
|
||||
};
|
||||
|
||||
/* uart2 slave ports */
|
||||
static struct omap_hwmod_ocp_if *omap44xx_uart2_slaves[] = {
|
||||
&omap44xx_l4_per__uart2,
|
||||
};
|
||||
|
||||
static struct omap_hwmod omap44xx_uart2_hwmod = {
|
||||
.name = "uart2",
|
||||
.class = &omap44xx_uart_hwmod_class,
|
||||
.mpu_irqs = omap44xx_uart2_irqs,
|
||||
.mpu_irqs_cnt = ARRAY_SIZE(omap44xx_uart2_irqs),
|
||||
.sdma_reqs = omap44xx_uart2_sdma_reqs,
|
||||
.sdma_reqs_cnt = ARRAY_SIZE(omap44xx_uart2_sdma_reqs),
|
||||
.main_clk = "uart2_fck",
|
||||
.prcm = {
|
||||
.omap4 = {
|
||||
.clkctrl_reg = OMAP4430_CM_L4PER_UART2_CLKCTRL,
|
||||
},
|
||||
},
|
||||
.slaves = omap44xx_uart2_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap44xx_uart2_slaves),
|
||||
.omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
|
||||
};
|
||||
|
||||
/* uart3 */
|
||||
static struct omap_hwmod omap44xx_uart3_hwmod;
|
||||
static struct omap_hwmod_irq_info omap44xx_uart3_irqs[] = {
|
||||
{ .irq = 74 + OMAP44XX_IRQ_GIC_START },
|
||||
};
|
||||
|
||||
static struct omap_hwmod_dma_info omap44xx_uart3_sdma_reqs[] = {
|
||||
{ .name = "tx", .dma_req = 52 + OMAP44XX_DMA_REQ_START },
|
||||
{ .name = "rx", .dma_req = 53 + OMAP44XX_DMA_REQ_START },
|
||||
};
|
||||
|
||||
static struct omap_hwmod_addr_space omap44xx_uart3_addrs[] = {
|
||||
{
|
||||
.pa_start = 0x48020000,
|
||||
.pa_end = 0x480200ff,
|
||||
.flags = ADDR_TYPE_RT
|
||||
},
|
||||
};
|
||||
|
||||
/* l4_abe -> wd_timer3 */
|
||||
static struct omap_hwmod_ocp_if omap44xx_l4_abe__wd_timer3 = {
|
||||
.master = &omap44xx_l4_abe_hwmod,
|
||||
.slave = &omap44xx_wd_timer3_hwmod,
|
||||
.clk = "ocp_abe_iclk",
|
||||
.addr = omap44xx_wd_timer3_addrs,
|
||||
.addr_cnt = ARRAY_SIZE(omap44xx_wd_timer3_addrs),
|
||||
.user = OCP_USER_MPU,
|
||||
};
|
||||
|
||||
/* l4_abe -> wd_timer3 (dma) */
|
||||
static struct omap_hwmod_addr_space omap44xx_wd_timer3_dma_addrs[] = {
|
||||
{
|
||||
.pa_start = 0x49030000,
|
||||
.pa_end = 0x4903007f,
|
||||
.flags = ADDR_TYPE_RT
|
||||
},
|
||||
};
|
||||
|
||||
/* l4_per -> uart3 */
|
||||
static struct omap_hwmod_ocp_if omap44xx_l4_per__uart3 = {
|
||||
.master = &omap44xx_l4_per_hwmod,
|
||||
.slave = &omap44xx_uart3_hwmod,
|
||||
.clk = "l4_div_ck",
|
||||
.addr = omap44xx_uart3_addrs,
|
||||
.addr_cnt = ARRAY_SIZE(omap44xx_uart3_addrs),
|
||||
.user = OCP_USER_MPU | OCP_USER_SDMA,
|
||||
};
|
||||
|
||||
/* uart3 slave ports */
|
||||
static struct omap_hwmod_ocp_if *omap44xx_uart3_slaves[] = {
|
||||
&omap44xx_l4_per__uart3,
|
||||
};
|
||||
|
||||
static struct omap_hwmod omap44xx_uart3_hwmod = {
|
||||
.name = "uart3",
|
||||
.class = &omap44xx_uart_hwmod_class,
|
||||
.flags = (HWMOD_INIT_NO_IDLE | HWMOD_INIT_NO_RESET),
|
||||
.mpu_irqs = omap44xx_uart3_irqs,
|
||||
.mpu_irqs_cnt = ARRAY_SIZE(omap44xx_uart3_irqs),
|
||||
.sdma_reqs = omap44xx_uart3_sdma_reqs,
|
||||
.sdma_reqs_cnt = ARRAY_SIZE(omap44xx_uart3_sdma_reqs),
|
||||
.main_clk = "uart3_fck",
|
||||
.prcm = {
|
||||
.omap4 = {
|
||||
.clkctrl_reg = OMAP4430_CM_L4PER_UART3_CLKCTRL,
|
||||
},
|
||||
},
|
||||
.slaves = omap44xx_uart3_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap44xx_uart3_slaves),
|
||||
.omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
|
||||
};
|
||||
|
||||
/* uart4 */
|
||||
static struct omap_hwmod omap44xx_uart4_hwmod;
|
||||
static struct omap_hwmod_irq_info omap44xx_uart4_irqs[] = {
|
||||
{ .irq = 70 + OMAP44XX_IRQ_GIC_START },
|
||||
};
|
||||
|
||||
static struct omap_hwmod_dma_info omap44xx_uart4_sdma_reqs[] = {
|
||||
{ .name = "tx", .dma_req = 54 + OMAP44XX_DMA_REQ_START },
|
||||
{ .name = "rx", .dma_req = 55 + OMAP44XX_DMA_REQ_START },
|
||||
};
|
||||
|
||||
static struct omap_hwmod_addr_space omap44xx_uart4_addrs[] = {
|
||||
{
|
||||
.pa_start = 0x4806e000,
|
||||
.pa_end = 0x4806e0ff,
|
||||
.flags = ADDR_TYPE_RT
|
||||
},
|
||||
};
|
||||
|
||||
static struct omap_hwmod_ocp_if omap44xx_l4_abe__wd_timer3_dma = {
|
||||
.master = &omap44xx_l4_abe_hwmod,
|
||||
.slave = &omap44xx_wd_timer3_hwmod,
|
||||
.clk = "ocp_abe_iclk",
|
||||
.addr = omap44xx_wd_timer3_dma_addrs,
|
||||
.addr_cnt = ARRAY_SIZE(omap44xx_wd_timer3_dma_addrs),
|
||||
.user = OCP_USER_SDMA,
|
||||
};
|
||||
|
||||
/* wd_timer3 slave ports */
|
||||
static struct omap_hwmod_ocp_if *omap44xx_wd_timer3_slaves[] = {
|
||||
&omap44xx_l4_abe__wd_timer3,
|
||||
&omap44xx_l4_abe__wd_timer3_dma,
|
||||
};
|
||||
|
||||
static struct omap_hwmod omap44xx_wd_timer3_hwmod = {
|
||||
.name = "wd_timer3",
|
||||
.class = &omap44xx_wd_timer_hwmod_class,
|
||||
.mpu_irqs = omap44xx_wd_timer3_irqs,
|
||||
.mpu_irqs_cnt = ARRAY_SIZE(omap44xx_wd_timer3_irqs),
|
||||
.main_clk = "wd_timer3_fck",
|
||||
.prcm = {
|
||||
.omap4 = {
|
||||
.clkctrl_reg = OMAP4430_CM1_ABE_WDT3_CLKCTRL,
|
||||
},
|
||||
},
|
||||
.slaves = omap44xx_wd_timer3_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap44xx_wd_timer3_slaves),
|
||||
.omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
|
||||
};
|
||||
|
||||
/* l4_per -> uart4 */
|
||||
static struct omap_hwmod_ocp_if omap44xx_l4_per__uart4 = {
|
||||
.master = &omap44xx_l4_per_hwmod,
|
||||
.slave = &omap44xx_uart4_hwmod,
|
||||
.clk = "l4_div_ck",
|
||||
.addr = omap44xx_uart4_addrs,
|
||||
.addr_cnt = ARRAY_SIZE(omap44xx_uart4_addrs),
|
||||
.user = OCP_USER_MPU | OCP_USER_SDMA,
|
||||
};
|
||||
|
||||
/* uart4 slave ports */
|
||||
static struct omap_hwmod_ocp_if *omap44xx_uart4_slaves[] = {
|
||||
&omap44xx_l4_per__uart4,
|
||||
};
|
||||
|
||||
static struct omap_hwmod omap44xx_uart4_hwmod = {
|
||||
.name = "uart4",
|
||||
.class = &omap44xx_uart_hwmod_class,
|
||||
.mpu_irqs = omap44xx_uart4_irqs,
|
||||
.mpu_irqs_cnt = ARRAY_SIZE(omap44xx_uart4_irqs),
|
||||
.sdma_reqs = omap44xx_uart4_sdma_reqs,
|
||||
.sdma_reqs_cnt = ARRAY_SIZE(omap44xx_uart4_sdma_reqs),
|
||||
.main_clk = "uart4_fck",
|
||||
.prcm = {
|
||||
.omap4 = {
|
||||
.clkctrl_reg = OMAP4430_CM_L4PER_UART4_CLKCTRL,
|
||||
},
|
||||
},
|
||||
.slaves = omap44xx_uart4_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap44xx_uart4_slaves),
|
||||
.omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
|
||||
};
|
||||
|
||||
static __initdata struct omap_hwmod *omap44xx_hwmods[] = {
|
||||
/* dmm class */
|
||||
&omap44xx_dmm_hwmod,
|
||||
/* emif_fw class */
|
||||
&omap44xx_emif_fw_hwmod,
|
||||
/* l3 class */
|
||||
&omap44xx_l3_instr_hwmod,
|
||||
&omap44xx_l3_main_1_hwmod,
|
||||
&omap44xx_l3_main_2_hwmod,
|
||||
&omap44xx_l3_main_3_hwmod,
|
||||
/* l4 class */
|
||||
&omap44xx_l4_abe_hwmod,
|
||||
&omap44xx_l4_cfg_hwmod,
|
||||
&omap44xx_l4_per_hwmod,
|
||||
&omap44xx_l4_wkup_hwmod,
|
||||
/* mpu_bus class */
|
||||
&omap44xx_mpu_private_hwmod,
|
||||
|
||||
/* mpu class */
|
||||
&omap44xx_mpu_hwmod,
|
||||
/* wd_timer class */
|
||||
&omap44xx_wd_timer2_hwmod,
|
||||
&omap44xx_wd_timer3_hwmod,
|
||||
|
||||
/* uart class */
|
||||
&omap44xx_uart1_hwmod,
|
||||
&omap44xx_uart2_hwmod,
|
||||
&omap44xx_uart3_hwmod,
|
||||
&omap44xx_uart4_hwmod,
|
||||
NULL,
|
||||
};
|
||||
|
||||
int __init omap44xx_hwmod_init(void)
|
||||
{
|
||||
return omap_hwmod_init(omap44xx_hwmods);
|
||||
}
|
||||
|
@ -31,12 +31,17 @@
|
||||
#include <plat/board.h>
|
||||
#include <plat/powerdomain.h>
|
||||
#include <plat/clockdomain.h>
|
||||
#include <plat/dmtimer.h>
|
||||
|
||||
#include "prm.h"
|
||||
#include "cm.h"
|
||||
#include "pm.h"
|
||||
|
||||
int omap2_pm_debug;
|
||||
u32 enable_off_mode;
|
||||
u32 sleep_while_idle;
|
||||
u32 wakeup_timer_seconds;
|
||||
u32 wakeup_timer_milliseconds;
|
||||
|
||||
#define DUMP_PRM_MOD_REG(mod, reg) \
|
||||
regs[reg_count].name = #mod "." #reg; \
|
||||
@ -162,7 +167,7 @@ void omap2_pm_dump(int mode, int resume, unsigned int us)
|
||||
|
||||
static void pm_dbg_regset_store(u32 *ptr);
|
||||
|
||||
struct dentry *pm_dbg_dir;
|
||||
static struct dentry *pm_dbg_dir;
|
||||
|
||||
static int pm_dbg_init_done;
|
||||
|
||||
@ -349,6 +354,23 @@ void pm_dbg_update_time(struct powerdomain *pwrdm, int prev)
|
||||
pwrdm->timer = t;
|
||||
}
|
||||
|
||||
void omap2_pm_wakeup_on_timer(u32 seconds, u32 milliseconds)
|
||||
{
|
||||
u32 tick_rate, cycles;
|
||||
|
||||
if (!seconds && !milliseconds)
|
||||
return;
|
||||
|
||||
tick_rate = clk_get_rate(omap_dm_timer_get_fclk(gptimer_wakeup));
|
||||
cycles = tick_rate * seconds + tick_rate * milliseconds / 1000;
|
||||
omap_dm_timer_stop(gptimer_wakeup);
|
||||
omap_dm_timer_set_load_start(gptimer_wakeup, 0, 0xffffffff - cycles);
|
||||
|
||||
pr_info("PM: Resume timer in %u.%03u secs"
|
||||
" (%d ticks at %d ticks/sec.)\n",
|
||||
seconds, milliseconds, cycles, tick_rate);
|
||||
}
|
||||
|
||||
static int clkdm_dbg_show_counter(struct clockdomain *clkdm, void *user)
|
||||
{
|
||||
struct seq_file *s = (struct seq_file *)user;
|
||||
@ -494,8 +516,10 @@ int pm_dbg_regset_init(int reg_set)
|
||||
|
||||
static int pwrdm_suspend_get(void *data, u64 *val)
|
||||
{
|
||||
int ret;
|
||||
ret = omap3_pm_get_suspend_state((struct powerdomain *)data);
|
||||
int ret = -EINVAL;
|
||||
|
||||
if (cpu_is_omap34xx())
|
||||
ret = omap3_pm_get_suspend_state((struct powerdomain *)data);
|
||||
*val = ret;
|
||||
|
||||
if (ret >= 0)
|
||||
@ -505,7 +529,10 @@ static int pwrdm_suspend_get(void *data, u64 *val)
|
||||
|
||||
static int pwrdm_suspend_set(void *data, u64 val)
|
||||
{
|
||||
return omap3_pm_set_suspend_state((struct powerdomain *)data, (int)val);
|
||||
if (cpu_is_omap34xx())
|
||||
return omap3_pm_set_suspend_state(
|
||||
(struct powerdomain *)data, (int)val);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
DEFINE_SIMPLE_ATTRIBUTE(pwrdm_suspend_fops, pwrdm_suspend_get,
|
||||
@ -553,8 +580,10 @@ static int option_set(void *data, u64 val)
|
||||
|
||||
*option = val;
|
||||
|
||||
if (option == &enable_off_mode)
|
||||
omap3_pm_off_mode_enable(val);
|
||||
if (option == &enable_off_mode) {
|
||||
if (cpu_is_omap34xx())
|
||||
omap3_pm_off_mode_enable(val);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -609,6 +638,9 @@ static int __init pm_dbg_init(void)
|
||||
&sleep_while_idle, &pm_dbg_option_fops);
|
||||
(void) debugfs_create_file("wakeup_timer_seconds", S_IRUGO | S_IWUGO, d,
|
||||
&wakeup_timer_seconds, &pm_dbg_option_fops);
|
||||
(void) debugfs_create_file("wakeup_timer_milliseconds",
|
||||
S_IRUGO | S_IWUGO, d, &wakeup_timer_milliseconds,
|
||||
&pm_dbg_option_fops);
|
||||
pm_dbg_init_done = 1;
|
||||
|
||||
return 0;
|
||||
|
@ -18,11 +18,15 @@
|
||||
#include <plat/omap_device.h>
|
||||
#include <plat/common.h>
|
||||
|
||||
#include <plat/powerdomain.h>
|
||||
#include <plat/clockdomain.h>
|
||||
|
||||
static struct omap_device_pm_latency *pm_lats;
|
||||
|
||||
static struct device *mpu_dev;
|
||||
static struct device *dsp_dev;
|
||||
static struct device *iva_dev;
|
||||
static struct device *l3_dev;
|
||||
static struct device *dsp_dev;
|
||||
|
||||
struct device *omap2_get_mpuss_device(void)
|
||||
{
|
||||
@ -30,10 +34,10 @@ struct device *omap2_get_mpuss_device(void)
|
||||
return mpu_dev;
|
||||
}
|
||||
|
||||
struct device *omap2_get_dsp_device(void)
|
||||
struct device *omap2_get_iva_device(void)
|
||||
{
|
||||
WARN_ON_ONCE(!dsp_dev);
|
||||
return dsp_dev;
|
||||
WARN_ON_ONCE(!iva_dev);
|
||||
return iva_dev;
|
||||
}
|
||||
|
||||
struct device *omap2_get_l3_device(void)
|
||||
@ -42,6 +46,13 @@ struct device *omap2_get_l3_device(void)
|
||||
return l3_dev;
|
||||
}
|
||||
|
||||
struct device *omap4_get_dsp_device(void)
|
||||
{
|
||||
WARN_ON_ONCE(!dsp_dev);
|
||||
return dsp_dev;
|
||||
}
|
||||
EXPORT_SYMBOL(omap4_get_dsp_device);
|
||||
|
||||
/* static int _init_omap_device(struct omap_hwmod *oh, void *user) */
|
||||
static int _init_omap_device(char *name, struct device **new_dev)
|
||||
{
|
||||
@ -69,8 +80,60 @@ static int _init_omap_device(char *name, struct device **new_dev)
|
||||
static void omap2_init_processor_devices(void)
|
||||
{
|
||||
_init_omap_device("mpu", &mpu_dev);
|
||||
_init_omap_device("iva", &dsp_dev);
|
||||
_init_omap_device("l3_main", &l3_dev);
|
||||
_init_omap_device("iva", &iva_dev);
|
||||
if (cpu_is_omap44xx()) {
|
||||
_init_omap_device("l3_main_1", &l3_dev);
|
||||
_init_omap_device("dsp", &dsp_dev);
|
||||
} else {
|
||||
_init_omap_device("l3_main", &l3_dev);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* This sets pwrdm state (other than mpu & core. Currently only ON &
|
||||
* RET are supported. Function is assuming that clkdm doesn't have
|
||||
* hw_sup mode enabled.
|
||||
*/
|
||||
int omap_set_pwrdm_state(struct powerdomain *pwrdm, u32 state)
|
||||
{
|
||||
u32 cur_state;
|
||||
int sleep_switch = 0;
|
||||
int ret = 0;
|
||||
|
||||
if (pwrdm == NULL || IS_ERR(pwrdm))
|
||||
return -EINVAL;
|
||||
|
||||
while (!(pwrdm->pwrsts & (1 << state))) {
|
||||
if (state == PWRDM_POWER_OFF)
|
||||
return ret;
|
||||
state--;
|
||||
}
|
||||
|
||||
cur_state = pwrdm_read_next_pwrst(pwrdm);
|
||||
if (cur_state == state)
|
||||
return ret;
|
||||
|
||||
if (pwrdm_read_pwrst(pwrdm) < PWRDM_POWER_ON) {
|
||||
omap2_clkdm_wakeup(pwrdm->pwrdm_clkdms[0]);
|
||||
sleep_switch = 1;
|
||||
pwrdm_wait_transition(pwrdm);
|
||||
}
|
||||
|
||||
ret = pwrdm_set_next_pwrst(pwrdm, state);
|
||||
if (ret) {
|
||||
printk(KERN_ERR "Unable to set state of powerdomain: %s\n",
|
||||
pwrdm->name);
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (sleep_switch) {
|
||||
omap2_clkdm_allow_idle(pwrdm->pwrdm_clkdms[0]);
|
||||
pwrdm_wait_transition(pwrdm);
|
||||
pwrdm_state_switch(pwrdm);
|
||||
}
|
||||
|
||||
err:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int __init omap2_common_pm_init(void)
|
||||
|
@ -13,14 +13,11 @@
|
||||
|
||||
#include <plat/powerdomain.h>
|
||||
|
||||
extern u32 enable_off_mode;
|
||||
extern u32 sleep_while_idle;
|
||||
|
||||
extern void *omap3_secure_ram_storage;
|
||||
extern void omap3_pm_off_mode_enable(int);
|
||||
extern void omap_sram_idle(void);
|
||||
extern int omap3_can_sleep(void);
|
||||
extern int set_pwrdm_state(struct powerdomain *pwrdm, u32 state);
|
||||
extern int omap_set_pwrdm_state(struct powerdomain *pwrdm, u32 state);
|
||||
extern int omap3_idle_init(void);
|
||||
|
||||
struct cpuidle_params {
|
||||
@ -48,10 +45,16 @@ extern struct omap_dm_timer *gptimer_wakeup;
|
||||
|
||||
#ifdef CONFIG_PM_DEBUG
|
||||
extern void omap2_pm_dump(int mode, int resume, unsigned int us);
|
||||
extern void omap2_pm_wakeup_on_timer(u32 seconds, u32 milliseconds);
|
||||
extern int omap2_pm_debug;
|
||||
extern u32 enable_off_mode;
|
||||
extern u32 sleep_while_idle;
|
||||
#else
|
||||
#define omap2_pm_dump(mode, resume, us) do {} while (0);
|
||||
#define omap2_pm_wakeup_on_timer(seconds, milliseconds) do {} while (0);
|
||||
#define omap2_pm_debug 0
|
||||
#define enable_off_mode 0
|
||||
#define sleep_while_idle 0
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_CPU_IDLE)
|
||||
|
@ -38,7 +38,6 @@
|
||||
#include <mach/irqs.h>
|
||||
#include <plat/clock.h>
|
||||
#include <plat/sram.h>
|
||||
#include <plat/control.h>
|
||||
#include <plat/dma.h>
|
||||
#include <plat/board.h>
|
||||
|
||||
@ -48,6 +47,7 @@
|
||||
#include "cm-regbits-24xx.h"
|
||||
#include "sdrc.h"
|
||||
#include "pm.h"
|
||||
#include "control.h"
|
||||
|
||||
#include <plat/powerdomain.h>
|
||||
#include <plat/clockdomain.h>
|
||||
@ -245,6 +245,8 @@ static int omap2_can_sleep(void)
|
||||
{
|
||||
if (omap2_fclks_active())
|
||||
return 0;
|
||||
if (!omap_uart_can_sleep())
|
||||
return 0;
|
||||
if (osc_ck->usecount > 1)
|
||||
return 0;
|
||||
if (omap_dma_running())
|
||||
|
@ -32,13 +32,11 @@
|
||||
#include <plat/sram.h>
|
||||
#include <plat/clockdomain.h>
|
||||
#include <plat/powerdomain.h>
|
||||
#include <plat/control.h>
|
||||
#include <plat/serial.h>
|
||||
#include <plat/sdrc.h>
|
||||
#include <plat/prcm.h>
|
||||
#include <plat/gpmc.h>
|
||||
#include <plat/dma.h>
|
||||
#include <plat/dmtimer.h>
|
||||
|
||||
#include <asm/tlbflush.h>
|
||||
|
||||
@ -49,16 +47,12 @@
|
||||
#include "prm.h"
|
||||
#include "pm.h"
|
||||
#include "sdrc.h"
|
||||
#include "control.h"
|
||||
|
||||
/* Scratchpad offsets */
|
||||
#define OMAP343X_TABLE_ADDRESS_OFFSET 0x31
|
||||
#define OMAP343X_TABLE_VALUE_OFFSET 0x30
|
||||
#define OMAP343X_CONTROL_REG_VALUE_OFFSET 0x32
|
||||
|
||||
u32 enable_off_mode;
|
||||
u32 sleep_while_idle;
|
||||
u32 wakeup_timer_seconds;
|
||||
u32 wakeup_timer_milliseconds;
|
||||
#define OMAP343X_TABLE_ADDRESS_OFFSET 0xc4
|
||||
#define OMAP343X_TABLE_VALUE_OFFSET 0xc0
|
||||
#define OMAP343X_CONTROL_REG_VALUE_OFFSET 0xc8
|
||||
|
||||
struct power_state {
|
||||
struct powerdomain *pwrdm;
|
||||
@ -316,7 +310,7 @@ static void restore_control_register(u32 val)
|
||||
/* Function to restore the table entry that was modified for enabling MMU */
|
||||
static void restore_table_entry(void)
|
||||
{
|
||||
u32 *scratchpad_address;
|
||||
void __iomem *scratchpad_address;
|
||||
u32 previous_value, control_reg_value;
|
||||
u32 *address;
|
||||
|
||||
@ -351,7 +345,6 @@ void omap_sram_idle(void)
|
||||
int core_next_state = PWRDM_POWER_ON;
|
||||
int core_prev_state, per_prev_state;
|
||||
u32 sdrc_pwr = 0;
|
||||
int per_state_modified = 0;
|
||||
|
||||
if (!_omap_sram_idle)
|
||||
return;
|
||||
@ -385,9 +378,9 @@ void omap_sram_idle(void)
|
||||
/* Enable IO-PAD and IO-CHAIN wakeups */
|
||||
per_next_state = pwrdm_read_next_pwrst(per_pwrdm);
|
||||
core_next_state = pwrdm_read_next_pwrst(core_pwrdm);
|
||||
if (omap3_has_io_wakeup() && \
|
||||
(per_next_state < PWRDM_POWER_ON ||
|
||||
core_next_state < PWRDM_POWER_ON)) {
|
||||
if (omap3_has_io_wakeup() &&
|
||||
(per_next_state < PWRDM_POWER_ON ||
|
||||
core_next_state < PWRDM_POWER_ON)) {
|
||||
prm_set_mod_reg_bits(OMAP3430_EN_IO_MASK, WKUP_MOD, PM_WKEN);
|
||||
omap3_enable_io_chain();
|
||||
}
|
||||
@ -395,20 +388,12 @@ void omap_sram_idle(void)
|
||||
/* PER */
|
||||
if (per_next_state < PWRDM_POWER_ON) {
|
||||
omap_uart_prepare_idle(2);
|
||||
omap_uart_prepare_idle(3);
|
||||
omap2_gpio_prepare_for_idle(per_next_state);
|
||||
if (per_next_state == PWRDM_POWER_OFF) {
|
||||
if (core_next_state == PWRDM_POWER_ON) {
|
||||
per_next_state = PWRDM_POWER_RET;
|
||||
pwrdm_set_next_pwrst(per_pwrdm, per_next_state);
|
||||
per_state_modified = 1;
|
||||
} else
|
||||
if (per_next_state == PWRDM_POWER_OFF)
|
||||
omap3_per_save_context();
|
||||
}
|
||||
}
|
||||
|
||||
if (pwrdm_read_pwrst(cam_pwrdm) == PWRDM_POWER_ON)
|
||||
omap2_clkdm_deny_idle(mpu_pwrdm->pwrdm_clkdms[0]);
|
||||
|
||||
/* CORE */
|
||||
if (core_next_state < PWRDM_POWER_ON) {
|
||||
omap_uart_prepare_idle(0);
|
||||
@ -475,8 +460,7 @@ void omap_sram_idle(void)
|
||||
if (per_prev_state == PWRDM_POWER_OFF)
|
||||
omap3_per_restore_context();
|
||||
omap_uart_resume_idle(2);
|
||||
if (per_state_modified)
|
||||
pwrdm_set_next_pwrst(per_pwrdm, PWRDM_POWER_OFF);
|
||||
omap_uart_resume_idle(3);
|
||||
}
|
||||
|
||||
/* Disable IO-PAD and IO-CHAIN wakeup */
|
||||
@ -501,51 +485,6 @@ int omap3_can_sleep(void)
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* This sets pwrdm state (other than mpu & core. Currently only ON &
|
||||
* RET are supported. Function is assuming that clkdm doesn't have
|
||||
* hw_sup mode enabled. */
|
||||
int set_pwrdm_state(struct powerdomain *pwrdm, u32 state)
|
||||
{
|
||||
u32 cur_state;
|
||||
int sleep_switch = 0;
|
||||
int ret = 0;
|
||||
|
||||
if (pwrdm == NULL || IS_ERR(pwrdm))
|
||||
return -EINVAL;
|
||||
|
||||
while (!(pwrdm->pwrsts & (1 << state))) {
|
||||
if (state == PWRDM_POWER_OFF)
|
||||
return ret;
|
||||
state--;
|
||||
}
|
||||
|
||||
cur_state = pwrdm_read_next_pwrst(pwrdm);
|
||||
if (cur_state == state)
|
||||
return ret;
|
||||
|
||||
if (pwrdm_read_pwrst(pwrdm) < PWRDM_POWER_ON) {
|
||||
omap2_clkdm_wakeup(pwrdm->pwrdm_clkdms[0]);
|
||||
sleep_switch = 1;
|
||||
pwrdm_wait_transition(pwrdm);
|
||||
}
|
||||
|
||||
ret = pwrdm_set_next_pwrst(pwrdm, state);
|
||||
if (ret) {
|
||||
printk(KERN_ERR "Unable to set state of powerdomain: %s\n",
|
||||
pwrdm->name);
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (sleep_switch) {
|
||||
omap2_clkdm_allow_idle(pwrdm->pwrdm_clkdms[0]);
|
||||
pwrdm_wait_transition(pwrdm);
|
||||
pwrdm_state_switch(pwrdm);
|
||||
}
|
||||
|
||||
err:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void omap3_pm_idle(void)
|
||||
{
|
||||
local_irq_disable();
|
||||
@ -567,23 +506,6 @@ out:
|
||||
#ifdef CONFIG_SUSPEND
|
||||
static suspend_state_t suspend_state;
|
||||
|
||||
static void omap2_pm_wakeup_on_timer(u32 seconds, u32 milliseconds)
|
||||
{
|
||||
u32 tick_rate, cycles;
|
||||
|
||||
if (!seconds && !milliseconds)
|
||||
return;
|
||||
|
||||
tick_rate = clk_get_rate(omap_dm_timer_get_fclk(gptimer_wakeup));
|
||||
cycles = tick_rate * seconds + tick_rate * milliseconds / 1000;
|
||||
omap_dm_timer_stop(gptimer_wakeup);
|
||||
omap_dm_timer_set_load_start(gptimer_wakeup, 0, 0xffffffff - cycles);
|
||||
|
||||
pr_info("PM: Resume timer in %u.%03u secs"
|
||||
" (%d ticks at %d ticks/sec.)\n",
|
||||
seconds, milliseconds, cycles, tick_rate);
|
||||
}
|
||||
|
||||
static int omap3_pm_prepare(void)
|
||||
{
|
||||
disable_hlt();
|
||||
@ -604,7 +526,7 @@ static int omap3_pm_suspend(void)
|
||||
pwrst->saved_state = pwrdm_read_next_pwrst(pwrst->pwrdm);
|
||||
/* Set ones wanted by suspend */
|
||||
list_for_each_entry(pwrst, &pwrst_list, node) {
|
||||
if (set_pwrdm_state(pwrst->pwrdm, pwrst->next_state))
|
||||
if (omap_set_pwrdm_state(pwrst->pwrdm, pwrst->next_state))
|
||||
goto restore;
|
||||
if (pwrdm_clear_all_prev_pwrst(pwrst->pwrdm))
|
||||
goto restore;
|
||||
@ -625,7 +547,7 @@ restore:
|
||||
pwrst->pwrdm->name, pwrst->next_state);
|
||||
ret = -1;
|
||||
}
|
||||
set_pwrdm_state(pwrst->pwrdm, pwrst->saved_state);
|
||||
omap_set_pwrdm_state(pwrst->pwrdm, pwrst->saved_state);
|
||||
}
|
||||
if (ret)
|
||||
printk(KERN_ERR "Could not enter target state in pm_suspend\n");
|
||||
@ -756,6 +678,14 @@ static void __init omap3_d2d_idle(void)
|
||||
|
||||
static void __init prcm_setup_regs(void)
|
||||
{
|
||||
u32 omap3630_auto_uart4_mask = cpu_is_omap3630() ?
|
||||
OMAP3630_AUTO_UART4_MASK : 0;
|
||||
u32 omap3630_en_uart4_mask = cpu_is_omap3630() ?
|
||||
OMAP3630_EN_UART4_MASK : 0;
|
||||
u32 omap3630_grpsel_uart4_mask = cpu_is_omap3630() ?
|
||||
OMAP3630_GRPSEL_UART4_MASK : 0;
|
||||
|
||||
|
||||
/* XXX Reset all wkdeps. This should be done when initializing
|
||||
* powerdomains */
|
||||
prm_write_mod_reg(0, OMAP3430_IVA2_MOD, PM_WKDEP);
|
||||
@ -842,6 +772,7 @@ static void __init prcm_setup_regs(void)
|
||||
CM_AUTOIDLE);
|
||||
|
||||
cm_write_mod_reg(
|
||||
omap3630_auto_uart4_mask |
|
||||
OMAP3430_AUTO_GPIO6_MASK |
|
||||
OMAP3430_AUTO_GPIO5_MASK |
|
||||
OMAP3430_AUTO_GPIO4_MASK |
|
||||
@ -918,14 +849,16 @@ static void __init prcm_setup_regs(void)
|
||||
OMAP3430_DSS_MOD, PM_WKEN);
|
||||
|
||||
/* Enable wakeups in PER */
|
||||
prm_write_mod_reg(OMAP3430_EN_GPIO2_MASK | OMAP3430_EN_GPIO3_MASK |
|
||||
prm_write_mod_reg(omap3630_en_uart4_mask |
|
||||
OMAP3430_EN_GPIO2_MASK | OMAP3430_EN_GPIO3_MASK |
|
||||
OMAP3430_EN_GPIO4_MASK | OMAP3430_EN_GPIO5_MASK |
|
||||
OMAP3430_EN_GPIO6_MASK | OMAP3430_EN_UART3_MASK |
|
||||
OMAP3430_EN_MCBSP2_MASK | OMAP3430_EN_MCBSP3_MASK |
|
||||
OMAP3430_EN_MCBSP4_MASK,
|
||||
OMAP3430_PER_MOD, PM_WKEN);
|
||||
/* and allow them to wake up MPU */
|
||||
prm_write_mod_reg(OMAP3430_GRPSEL_GPIO2_MASK |
|
||||
prm_write_mod_reg(omap3630_grpsel_uart4_mask |
|
||||
OMAP3430_GRPSEL_GPIO2_MASK |
|
||||
OMAP3430_GRPSEL_GPIO3_MASK |
|
||||
OMAP3430_GRPSEL_GPIO4_MASK |
|
||||
OMAP3430_GRPSEL_GPIO5_MASK |
|
||||
@ -974,7 +907,7 @@ void omap3_pm_off_mode_enable(int enable)
|
||||
|
||||
list_for_each_entry(pwrst, &pwrst_list, node) {
|
||||
pwrst->next_state = state;
|
||||
set_pwrdm_state(pwrst->pwrdm, state);
|
||||
omap_set_pwrdm_state(pwrst->pwrdm, state);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1019,7 +952,7 @@ static int __init pwrdms_setup(struct powerdomain *pwrdm, void *unused)
|
||||
if (pwrdm_has_hdwr_sar(pwrdm))
|
||||
pwrdm_enable_hdwr_sar(pwrdm);
|
||||
|
||||
return set_pwrdm_state(pwrst->pwrdm, pwrst->next_state);
|
||||
return omap_set_pwrdm_state(pwrst->pwrdm, pwrst->next_state);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -1029,9 +962,6 @@ static int __init pwrdms_setup(struct powerdomain *pwrdm, void *unused)
|
||||
*/
|
||||
static int __init clkdms_setup(struct clockdomain *clkdm, void *unused)
|
||||
{
|
||||
clkdm_clear_all_wkdeps(clkdm);
|
||||
clkdm_clear_all_sleepdeps(clkdm);
|
||||
|
||||
if (clkdm->flags & CLKDM_CAN_ENABLE_AUTO)
|
||||
omap2_clkdm_allow_idle(clkdm);
|
||||
else if (clkdm->flags & CLKDM_CAN_FORCE_SLEEP &&
|
||||
|
85
arch/arm/mach-omap2/pm_bus.c
Normal file
85
arch/arm/mach-omap2/pm_bus.c
Normal file
@ -0,0 +1,85 @@
|
||||
/*
|
||||
* Runtime PM support code for OMAP
|
||||
*
|
||||
* Author: Kevin Hilman, Deep Root Systems, LLC
|
||||
*
|
||||
* Copyright (C) 2010 Texas Instruments, Inc.
|
||||
*
|
||||
* This file is licensed under the terms of the GNU General Public
|
||||
* License version 2. This program is licensed "as is" without any
|
||||
* warranty of any kind, whether express or implied.
|
||||
*/
|
||||
#include <linux/init.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/mutex.h>
|
||||
|
||||
#include <plat/omap_device.h>
|
||||
#include <plat/omap-pm.h>
|
||||
|
||||
#ifdef CONFIG_PM_RUNTIME
|
||||
int omap_pm_runtime_suspend(struct device *dev)
|
||||
{
|
||||
struct platform_device *pdev = to_platform_device(dev);
|
||||
int r, ret = 0;
|
||||
|
||||
dev_dbg(dev, "%s\n", __func__);
|
||||
|
||||
ret = pm_generic_runtime_suspend(dev);
|
||||
|
||||
if (!ret && dev->parent == &omap_device_parent) {
|
||||
r = omap_device_idle(pdev);
|
||||
WARN_ON(r);
|
||||
}
|
||||
|
||||
return ret;
|
||||
};
|
||||
|
||||
int omap_pm_runtime_resume(struct device *dev)
|
||||
{
|
||||
struct platform_device *pdev = to_platform_device(dev);
|
||||
int r;
|
||||
|
||||
dev_dbg(dev, "%s\n", __func__);
|
||||
|
||||
if (dev->parent == &omap_device_parent) {
|
||||
r = omap_device_enable(pdev);
|
||||
WARN_ON(r);
|
||||
}
|
||||
|
||||
return pm_generic_runtime_resume(dev);
|
||||
};
|
||||
#else
|
||||
#define omap_pm_runtime_suspend NULL
|
||||
#define omap_pm_runtime_resume NULL
|
||||
#endif /* CONFIG_PM_RUNTIME */
|
||||
|
||||
static int __init omap_pm_runtime_init(void)
|
||||
{
|
||||
const struct dev_pm_ops *pm;
|
||||
struct dev_pm_ops *omap_pm;
|
||||
|
||||
pm = platform_bus_get_pm_ops();
|
||||
if (!pm) {
|
||||
pr_err("%s: unable to get dev_pm_ops from platform_bus\n",
|
||||
__func__);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
omap_pm = kmemdup(pm, sizeof(struct dev_pm_ops), GFP_KERNEL);
|
||||
if (!omap_pm) {
|
||||
pr_err("%s: unable to alloc memory for new dev_pm_ops\n",
|
||||
__func__);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
omap_pm->runtime_suspend = omap_pm_runtime_suspend;
|
||||
omap_pm->runtime_resume = omap_pm_runtime_resume;
|
||||
|
||||
platform_bus_set_pm_ops(omap_pm);
|
||||
|
||||
return 0;
|
||||
}
|
||||
core_initcall(omap_pm_runtime_init);
|
@ -98,7 +98,7 @@ static struct powerdomain dss_44xx_pwrdm = {
|
||||
.prcm_offs = OMAP4430_PRM_DSS_MOD,
|
||||
.omap_chip = OMAP_CHIP_INIT(CHIP_IS_OMAP4430),
|
||||
.pwrsts = PWRSTS_OFF_RET_ON,
|
||||
.pwrsts_logic_ret = PWRSTS_OFF_RET,
|
||||
.pwrsts_logic_ret = PWRSTS_OFF,
|
||||
.banks = 1,
|
||||
.pwrsts_mem_ret = {
|
||||
[0] = PWRDM_POWER_OFF, /* dss_mem */
|
||||
|
@ -382,6 +382,9 @@
|
||||
#define OMAP3430_EN_MPU_SHIFT 1
|
||||
|
||||
/* CM_FCLKEN_PER, CM_ICLKEN_PER, PM_WKEN_PER shared bits */
|
||||
|
||||
#define OMAP3630_EN_UART4_MASK (1 << 18)
|
||||
#define OMAP3630_EN_UART4_SHIFT 18
|
||||
#define OMAP3430_EN_GPIO6_MASK (1 << 17)
|
||||
#define OMAP3430_EN_GPIO6_SHIFT 17
|
||||
#define OMAP3430_EN_GPIO5_MASK (1 << 16)
|
||||
@ -422,6 +425,8 @@
|
||||
#define OMAP3430_EN_MCBSP2_SHIFT 0
|
||||
|
||||
/* CM_IDLEST_PER, PM_WKST_PER shared bits */
|
||||
#define OMAP3630_ST_UART4_SHIFT 18
|
||||
#define OMAP3630_ST_UART4_MASK (1 << 18)
|
||||
#define OMAP3430_ST_GPIO6_SHIFT 17
|
||||
#define OMAP3430_ST_GPIO6_MASK (1 << 17)
|
||||
#define OMAP3430_ST_GPIO5_SHIFT 16
|
||||
|
@ -26,13 +26,14 @@
|
||||
#include <plat/common.h>
|
||||
#include <plat/prcm.h>
|
||||
#include <plat/irqs.h>
|
||||
#include <plat/control.h>
|
||||
|
||||
#include "clock.h"
|
||||
#include "clock2xxx.h"
|
||||
#include "cm.h"
|
||||
#include "prm.h"
|
||||
#include "prm-regbits-24xx.h"
|
||||
#include "prm-regbits-44xx.h"
|
||||
#include "control.h"
|
||||
|
||||
static void __iomem *prm_base;
|
||||
static void __iomem *cm_base;
|
||||
@ -118,7 +119,7 @@ struct omap3_prcm_regs {
|
||||
u32 wkup_pm_wken;
|
||||
};
|
||||
|
||||
struct omap3_prcm_regs prcm_context;
|
||||
static struct omap3_prcm_regs prcm_context;
|
||||
|
||||
u32 omap_prcm_get_reset_sources(void)
|
||||
{
|
||||
@ -161,8 +162,8 @@ void omap_prcm_arch_reset(char mode, const char *cmd)
|
||||
prm_set_mod_reg_bits(OMAP_RST_DPLL3_MASK, prcm_offs,
|
||||
OMAP2_RM_RSTCTRL);
|
||||
if (cpu_is_omap44xx())
|
||||
prm_set_mod_reg_bits(OMAP_RST_DPLL3_MASK, prcm_offs,
|
||||
OMAP4_RM_RSTCTRL);
|
||||
prm_set_mod_reg_bits(OMAP4430_RST_GLOBAL_WARM_SW_MASK,
|
||||
prcm_offs, OMAP4_RM_RSTCTRL);
|
||||
}
|
||||
|
||||
static inline u32 __omap_prcm_read(void __iomem *base, s16 module, u16 reg)
|
||||
@ -215,6 +216,30 @@ u32 prm_read_mod_bits_shift(s16 domain, s16 idx, u32 mask)
|
||||
return v;
|
||||
}
|
||||
|
||||
/* Read a PRM register, AND it, and shift the result down to bit 0 */
|
||||
u32 omap4_prm_read_bits_shift(void __iomem *reg, u32 mask)
|
||||
{
|
||||
u32 v;
|
||||
|
||||
v = __raw_readl(reg);
|
||||
v &= mask;
|
||||
v >>= __ffs(mask);
|
||||
|
||||
return v;
|
||||
}
|
||||
|
||||
/* Read-modify-write a register in a PRM module. Caller must lock */
|
||||
u32 omap4_prm_rmw_reg_bits(u32 mask, u32 bits, void __iomem *reg)
|
||||
{
|
||||
u32 v;
|
||||
|
||||
v = __raw_readl(reg);
|
||||
v &= ~mask;
|
||||
v |= bits;
|
||||
__raw_writel(v, reg);
|
||||
|
||||
return v;
|
||||
}
|
||||
/* Read a register in a CM module */
|
||||
u32 cm_read_mod_reg(s16 module, u16 idx)
|
||||
{
|
||||
|
@ -122,6 +122,7 @@
|
||||
#define OMAP3430_MEMRETSTATE_MASK (1 << 8)
|
||||
|
||||
/* PM_MPUGRPSEL_PER, PM_IVA2GRPSEL_PER shared bits */
|
||||
#define OMAP3630_GRPSEL_UART4_MASK (1 << 18)
|
||||
#define OMAP3430_GRPSEL_GPIO6_MASK (1 << 17)
|
||||
#define OMAP3430_GRPSEL_GPIO5_MASK (1 << 16)
|
||||
#define OMAP3430_GRPSEL_GPIO4_MASK (1 << 15)
|
||||
|
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user