2005-11-10 17:26:51 +03:00
/*
* linux / arch / arm / mach - omap2 / devices . c
*
* OMAP2 platform device setup / initialization
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; either version 2 of the License , or
* ( at your option ) any later version .
*/
# include <linux/module.h>
# include <linux/kernel.h>
# include <linux/init.h>
# include <linux/platform_device.h>
2008-09-06 15:10:45 +04:00
# include <linux/io.h>
2008-12-11 04:37:17 +03:00
# include <linux/clk.h>
2005-11-10 17:26:51 +03:00
2008-08-05 19:14:15 +04:00
# include <mach/hardware.h>
2010-04-09 16:54:43 +04:00
# include <mach/irqs.h>
2005-11-10 17:26:51 +03:00
# include <asm/mach-types.h>
# include <asm/mach/map.h>
2010-04-09 16:54:43 +04:00
# include <asm/pmu.h>
2005-11-10 17:26:51 +03:00
2009-10-20 20:40:47 +04:00
# include <plat/control.h>
# include <plat/tc.h>
# include <plat/board.h>
2008-08-05 19:14:15 +04:00
# include <mach/gpio.h>
2009-10-20 20:40:47 +04:00
# include <plat/mmc.h>
2010-05-03 07:10:03 +04:00
# include <plat/dma.h>
2005-11-10 17:26:51 +03:00
2009-12-12 03:16:32 +03:00
# include "mux.h"
2009-03-24 04:23:49 +03:00
# if defined(CONFIG_VIDEO_OMAP2) || defined(CONFIG_VIDEO_OMAP2_MODULE)
2006-12-08 00:58:10 +03:00
2009-03-24 04:23:49 +03:00
static struct resource cam_resources [ ] = {
2006-12-08 00:58:10 +03:00
{
2009-03-24 04:23:49 +03:00
. start = OMAP24XX_CAMERA_BASE ,
. end = OMAP24XX_CAMERA_BASE + 0xfff ,
. flags = IORESOURCE_MEM ,
} ,
{
. start = INT_24XX_CAM_IRQ ,
. flags = IORESOURCE_IRQ ,
}
} ;
static struct platform_device omap_cam_device = {
. name = " omap24xxcam " ,
. id = - 1 ,
. num_resources = ARRAY_SIZE ( cam_resources ) ,
. resource = cam_resources ,
} ;
static inline void omap_init_camera ( void )
{
platform_device_register ( & omap_cam_device ) ;
}
# elif defined(CONFIG_VIDEO_OMAP3) || defined(CONFIG_VIDEO_OMAP3_MODULE)
static struct resource omap3isp_resources [ ] = {
{
. start = OMAP3430_ISP_BASE ,
. end = OMAP3430_ISP_END ,
. flags = IORESOURCE_MEM ,
} ,
{
. start = OMAP3430_ISP_CBUFF_BASE ,
. end = OMAP3430_ISP_CBUFF_END ,
. flags = IORESOURCE_MEM ,
} ,
{
. start = OMAP3430_ISP_CCP2_BASE ,
. end = OMAP3430_ISP_CCP2_END ,
. flags = IORESOURCE_MEM ,
} ,
{
. start = OMAP3430_ISP_CCDC_BASE ,
. end = OMAP3430_ISP_CCDC_END ,
. flags = IORESOURCE_MEM ,
} ,
{
. start = OMAP3430_ISP_HIST_BASE ,
. end = OMAP3430_ISP_HIST_END ,
. flags = IORESOURCE_MEM ,
} ,
{
. start = OMAP3430_ISP_H3A_BASE ,
. end = OMAP3430_ISP_H3A_END ,
. flags = IORESOURCE_MEM ,
} ,
{
. start = OMAP3430_ISP_PREV_BASE ,
. end = OMAP3430_ISP_PREV_END ,
. flags = IORESOURCE_MEM ,
} ,
{
. start = OMAP3430_ISP_RESZ_BASE ,
. end = OMAP3430_ISP_RESZ_END ,
. flags = IORESOURCE_MEM ,
} ,
{
. start = OMAP3430_ISP_SBL_BASE ,
. end = OMAP3430_ISP_SBL_END ,
. flags = IORESOURCE_MEM ,
} ,
{
. start = OMAP3430_ISP_CSI2A_BASE ,
. end = OMAP3430_ISP_CSI2A_END ,
. flags = IORESOURCE_MEM ,
} ,
{
. start = OMAP3430_ISP_CSI2PHY_BASE ,
. end = OMAP3430_ISP_CSI2PHY_END ,
. flags = IORESOURCE_MEM ,
} ,
{
. start = INT_34XX_CAM_IRQ ,
. flags = IORESOURCE_IRQ ,
}
} ;
static struct platform_device omap3isp_device = {
. name = " omap3isp " ,
. id = - 1 ,
. num_resources = ARRAY_SIZE ( omap3isp_resources ) ,
. resource = omap3isp_resources ,
} ;
static inline void omap_init_camera ( void )
{
platform_device_register ( & omap3isp_device ) ;
}
# else
static inline void omap_init_camera ( void )
{
}
# endif
2009-03-24 04:07:23 +03:00
# if defined(CONFIG_OMAP_MBOX_FWK) || defined(CONFIG_OMAP_MBOX_FWK_MODULE)
2006-12-08 00:58:10 +03:00
2009-11-22 21:11:18 +03:00
# define MBOX_REG_SIZE 0x120
2009-03-24 04:07:23 +03:00
2009-11-22 21:11:18 +03:00
# ifdef CONFIG_ARCH_OMAP2
2010-02-12 23:26:47 +03:00
static struct resource omap2_mbox_resources [ ] = {
2006-12-08 00:58:10 +03:00
{
2009-03-24 04:07:23 +03:00
. start = OMAP24XX_MAILBOX_BASE ,
. end = OMAP24XX_MAILBOX_BASE + MBOX_REG_SIZE - 1 ,
2006-12-08 00:58:10 +03:00
. flags = IORESOURCE_MEM ,
} ,
{
. start = INT_24XX_MAIL_U0_MPU ,
. flags = IORESOURCE_IRQ ,
2010-06-11 19:51:44 +04:00
. name = " dsp " ,
2006-12-08 00:58:10 +03:00
} ,
{
. start = INT_24XX_MAIL_U3_MPU ,
. flags = IORESOURCE_IRQ ,
2010-06-11 19:51:44 +04:00
. name = " iva " ,
2006-12-08 00:58:10 +03:00
} ,
} ;
2010-02-12 23:26:47 +03:00
static int omap2_mbox_resources_sz = ARRAY_SIZE ( omap2_mbox_resources ) ;
# else
# define omap2_mbox_resources NULL
# define omap2_mbox_resources_sz 0
2009-11-22 21:11:18 +03:00
# endif
2006-12-08 00:58:10 +03:00
2009-11-22 21:11:18 +03:00
# ifdef CONFIG_ARCH_OMAP3
2010-02-12 23:26:47 +03:00
static struct resource omap3_mbox_resources [ ] = {
2009-03-24 04:07:23 +03:00
{
. start = OMAP34XX_MAILBOX_BASE ,
. end = OMAP34XX_MAILBOX_BASE + MBOX_REG_SIZE - 1 ,
. flags = IORESOURCE_MEM ,
} ,
{
. start = INT_24XX_MAIL_U0_MPU ,
. flags = IORESOURCE_IRQ ,
2010-06-11 19:51:44 +04:00
. name = " dsp " ,
2009-03-24 04:07:23 +03:00
} ,
} ;
2010-02-12 23:26:47 +03:00
static int omap3_mbox_resources_sz = ARRAY_SIZE ( omap3_mbox_resources ) ;
# else
# define omap3_mbox_resources NULL
# define omap3_mbox_resources_sz 0
2009-11-22 21:11:18 +03:00
# endif
# ifdef CONFIG_ARCH_OMAP4
# define OMAP4_MBOX_REG_SIZE 0x130
2010-02-12 23:26:47 +03:00
static struct resource omap4_mbox_resources [ ] = {
2009-11-22 21:11:18 +03:00
{
. start = OMAP44XX_MAILBOX_BASE ,
. end = OMAP44XX_MAILBOX_BASE +
OMAP4_MBOX_REG_SIZE - 1 ,
. flags = IORESOURCE_MEM ,
} ,
{
2010-02-18 00:44:12 +03:00
. start = OMAP44XX_IRQ_MAIL_U0 ,
2009-11-22 21:11:18 +03:00
. flags = IORESOURCE_IRQ ,
2010-06-11 19:51:44 +04:00
. name = " mbox " ,
2009-11-22 21:11:18 +03:00
} ,
} ;
2010-02-12 23:26:47 +03:00
static int omap4_mbox_resources_sz = ARRAY_SIZE ( omap4_mbox_resources ) ;
# else
# define omap4_mbox_resources NULL
# define omap4_mbox_resources_sz 0
2009-11-22 21:11:18 +03:00
# endif
2009-03-24 04:07:23 +03:00
2006-12-08 00:58:10 +03:00
static struct platform_device mbox_device = {
2010-06-11 19:51:48 +04:00
. name = " omap-mailbox " ,
2006-12-08 00:58:10 +03:00
. id = - 1 ,
} ;
static inline void omap_init_mbox ( void )
{
2010-02-12 23:26:47 +03:00
if ( cpu_is_omap24xx ( ) ) {
mbox_device . resource = omap2_mbox_resources ;
mbox_device . num_resources = omap2_mbox_resources_sz ;
} else if ( cpu_is_omap34xx ( ) ) {
mbox_device . resource = omap3_mbox_resources ;
mbox_device . num_resources = omap3_mbox_resources_sz ;
} else if ( cpu_is_omap44xx ( ) ) {
mbox_device . resource = omap4_mbox_resources ;
mbox_device . num_resources = omap4_mbox_resources_sz ;
2009-03-24 04:07:23 +03:00
} else {
pr_err ( " %s: platform not supported \n " , __func__ ) ;
return ;
}
2006-12-08 00:58:10 +03:00
platform_device_register ( & mbox_device ) ;
}
# else
static inline void omap_init_mbox ( void ) { }
2009-03-24 04:07:23 +03:00
# endif /* CONFIG_OMAP_MBOX_FWK */
2006-12-08 00:58:10 +03:00
2006-04-02 20:46:30 +04:00
static inline void omap_init_sti ( void ) { }
2008-10-06 16:49:36 +04:00
# if defined(CONFIG_SPI_OMAP24XX) || defined(CONFIG_SPI_OMAP24XX_MODULE)
2006-06-27 03:16:10 +04:00
2009-10-20 20:40:47 +04:00
# include <plat/mcspi.h>
2006-06-27 03:16:10 +04:00
# define OMAP2_MCSPI1_BASE 0x48098000
# define OMAP2_MCSPI2_BASE 0x4809a000
2008-10-06 16:49:36 +04:00
# define OMAP2_MCSPI3_BASE 0x480b8000
# define OMAP2_MCSPI4_BASE 0x480ba000
2006-06-27 03:16:10 +04:00
2009-09-23 03:46:18 +04:00
# define OMAP4_MCSPI1_BASE 0x48098100
# define OMAP4_MCSPI2_BASE 0x4809a100
# define OMAP4_MCSPI3_BASE 0x480b8100
# define OMAP4_MCSPI4_BASE 0x480ba100
2006-06-27 03:16:10 +04:00
static struct omap2_mcspi_platform_config omap2_mcspi1_config = {
. num_cs = 4 ,
} ;
2006-12-08 00:58:10 +03:00
static struct resource omap2_mcspi1_resources [ ] = {
{
. start = OMAP2_MCSPI1_BASE ,
. end = OMAP2_MCSPI1_BASE + 0xff ,
. flags = IORESOURCE_MEM ,
} ,
} ;
2008-10-06 16:49:36 +04:00
static struct platform_device omap2_mcspi1 = {
2006-06-27 03:16:10 +04:00
. name = " omap2_mcspi " ,
. id = 1 ,
2006-12-08 00:58:10 +03:00
. num_resources = ARRAY_SIZE ( omap2_mcspi1_resources ) ,
. resource = omap2_mcspi1_resources ,
2006-06-27 03:16:10 +04:00
. dev = {
. platform_data = & omap2_mcspi1_config ,
} ,
} ;
static struct omap2_mcspi_platform_config omap2_mcspi2_config = {
. num_cs = 2 ,
} ;
2006-12-08 00:58:10 +03:00
static struct resource omap2_mcspi2_resources [ ] = {
{
. start = OMAP2_MCSPI2_BASE ,
. end = OMAP2_MCSPI2_BASE + 0xff ,
. flags = IORESOURCE_MEM ,
} ,
} ;
2008-10-06 16:49:36 +04:00
static struct platform_device omap2_mcspi2 = {
2006-06-27 03:16:10 +04:00
. name = " omap2_mcspi " ,
. id = 2 ,
2006-12-08 00:58:10 +03:00
. num_resources = ARRAY_SIZE ( omap2_mcspi2_resources ) ,
. resource = omap2_mcspi2_resources ,
2006-06-27 03:16:10 +04:00
. dev = {
. platform_data = & omap2_mcspi2_config ,
} ,
} ;
2009-09-23 03:46:18 +04:00
# if defined(CONFIG_ARCH_OMAP2430) || defined(CONFIG_ARCH_OMAP3) || \
defined ( CONFIG_ARCH_OMAP4 )
2008-10-06 16:49:36 +04:00
static struct omap2_mcspi_platform_config omap2_mcspi3_config = {
. num_cs = 2 ,
} ;
static struct resource omap2_mcspi3_resources [ ] = {
{
. start = OMAP2_MCSPI3_BASE ,
. end = OMAP2_MCSPI3_BASE + 0xff ,
. flags = IORESOURCE_MEM ,
} ,
} ;
static struct platform_device omap2_mcspi3 = {
. name = " omap2_mcspi " ,
. id = 3 ,
. num_resources = ARRAY_SIZE ( omap2_mcspi3_resources ) ,
. resource = omap2_mcspi3_resources ,
. dev = {
. platform_data = & omap2_mcspi3_config ,
} ,
} ;
# endif
2009-09-23 03:46:18 +04:00
# if defined(CONFIG_ARCH_OMAP3) || defined(CONFIG_ARCH_OMAP4)
2008-10-06 16:49:36 +04:00
static struct omap2_mcspi_platform_config omap2_mcspi4_config = {
. num_cs = 1 ,
} ;
static struct resource omap2_mcspi4_resources [ ] = {
{
. start = OMAP2_MCSPI4_BASE ,
. end = OMAP2_MCSPI4_BASE + 0xff ,
. flags = IORESOURCE_MEM ,
} ,
} ;
static struct platform_device omap2_mcspi4 = {
. name = " omap2_mcspi " ,
. id = 4 ,
. num_resources = ARRAY_SIZE ( omap2_mcspi4_resources ) ,
. resource = omap2_mcspi4_resources ,
. dev = {
. platform_data = & omap2_mcspi4_config ,
} ,
} ;
# endif
2009-09-25 03:23:05 +04:00
# ifdef CONFIG_ARCH_OMAP4
static inline void omap4_mcspi_fixup ( void )
2006-06-27 03:16:10 +04:00
{
2009-09-25 03:23:05 +04:00
omap2_mcspi1_resources [ 0 ] . start = OMAP4_MCSPI1_BASE ;
omap2_mcspi1_resources [ 0 ] . end = OMAP4_MCSPI1_BASE + 0xff ;
omap2_mcspi2_resources [ 0 ] . start = OMAP4_MCSPI2_BASE ;
omap2_mcspi2_resources [ 0 ] . end = OMAP4_MCSPI2_BASE + 0xff ;
omap2_mcspi3_resources [ 0 ] . start = OMAP4_MCSPI3_BASE ;
omap2_mcspi3_resources [ 0 ] . end = OMAP4_MCSPI3_BASE + 0xff ;
omap2_mcspi4_resources [ 0 ] . start = OMAP4_MCSPI4_BASE ;
omap2_mcspi4_resources [ 0 ] . end = OMAP4_MCSPI4_BASE + 0xff ;
}
# else
static inline void omap4_mcspi_fixup ( void )
{
}
# endif
2009-09-23 03:46:18 +04:00
# if defined(CONFIG_ARCH_OMAP2430) || defined(CONFIG_ARCH_OMAP3) || \
defined ( CONFIG_ARCH_OMAP4 )
2009-09-25 03:23:05 +04:00
static inline void omap2_mcspi3_init ( void )
{
platform_device_register ( & omap2_mcspi3 ) ;
}
# else
static inline void omap2_mcspi3_init ( void )
{
}
2008-10-06 16:49:36 +04:00
# endif
2009-09-25 03:23:05 +04:00
2009-09-23 03:46:18 +04:00
# if defined(CONFIG_ARCH_OMAP3) || defined(CONFIG_ARCH_OMAP4)
2009-09-25 03:23:05 +04:00
static inline void omap2_mcspi4_init ( void )
{
platform_device_register ( & omap2_mcspi4 ) ;
}
# else
static inline void omap2_mcspi4_init ( void )
{
}
2008-10-06 16:49:36 +04:00
# endif
2009-09-25 03:23:05 +04:00
static void omap_init_mcspi ( void )
{
if ( cpu_is_omap44xx ( ) )
omap4_mcspi_fixup ( ) ;
platform_device_register ( & omap2_mcspi1 ) ;
platform_device_register ( & omap2_mcspi2 ) ;
if ( cpu_is_omap2430 ( ) | | cpu_is_omap343x ( ) | | cpu_is_omap44xx ( ) )
omap2_mcspi3_init ( ) ;
if ( cpu_is_omap343x ( ) | | cpu_is_omap44xx ( ) )
omap2_mcspi4_init ( ) ;
2006-06-27 03:16:10 +04:00
}
# else
static inline void omap_init_mcspi ( void ) { }
# endif
2010-04-09 16:54:43 +04:00
static struct resource omap2_pmu_resource = {
. start = 3 ,
. end = 3 ,
. flags = IORESOURCE_IRQ ,
} ;
static struct resource omap3_pmu_resource = {
. start = INT_34XX_BENCH_MPU_EMUL ,
. end = INT_34XX_BENCH_MPU_EMUL ,
. flags = IORESOURCE_IRQ ,
} ;
static struct platform_device omap_pmu_device = {
. name = " arm-pmu " ,
. id = ARM_PMU_DEVICE_CPU ,
. num_resources = 1 ,
} ;
static void omap_init_pmu ( void )
{
if ( cpu_is_omap24xx ( ) )
omap_pmu_device . resource = & omap2_pmu_resource ;
else if ( cpu_is_omap34xx ( ) )
omap_pmu_device . resource = & omap3_pmu_resource ;
else
return ;
platform_device_register ( & omap_pmu_device ) ;
}
2010-05-03 07:10:03 +04:00
# if defined(CONFIG_CRYPTO_DEV_OMAP_SHAM) || defined(CONFIG_CRYPTO_DEV_OMAP_SHAM_MODULE)
2010-05-14 08:45:08 +04:00
# ifdef CONFIG_ARCH_OMAP2
2010-05-03 07:10:03 +04:00
static struct resource omap2_sham_resources [ ] = {
2008-10-06 16:49:36 +04:00
{
. start = OMAP24XX_SEC_SHA1MD5_BASE ,
. end = OMAP24XX_SEC_SHA1MD5_BASE + 0x64 ,
. flags = IORESOURCE_MEM ,
} ,
{
. start = INT_24XX_SHA1MD5 ,
. flags = IORESOURCE_IRQ ,
}
} ;
2010-05-03 07:10:03 +04:00
static int omap2_sham_resources_sz = ARRAY_SIZE ( omap2_sham_resources ) ;
# else
# define omap2_sham_resources NULL
# define omap2_sham_resources_sz 0
# endif
2008-10-06 16:49:36 +04:00
2010-05-14 08:45:08 +04:00
# ifdef CONFIG_ARCH_OMAP3
2010-05-03 07:10:03 +04:00
static struct resource omap3_sham_resources [ ] = {
{
. start = OMAP34XX_SEC_SHA1MD5_BASE ,
. end = OMAP34XX_SEC_SHA1MD5_BASE + 0x64 ,
. flags = IORESOURCE_MEM ,
} ,
{
. start = INT_34XX_SHA1MD52_IRQ ,
. flags = IORESOURCE_IRQ ,
} ,
{
. start = OMAP34XX_DMA_SHA1MD5_RX ,
. flags = IORESOURCE_DMA ,
}
} ;
static int omap3_sham_resources_sz = ARRAY_SIZE ( omap3_sham_resources ) ;
# else
# define omap3_sham_resources NULL
# define omap3_sham_resources_sz 0
# endif
static struct platform_device sham_device = {
. name = " omap-sham " ,
2008-10-06 16:49:36 +04:00
. id = - 1 ,
} ;
2010-05-03 07:10:03 +04:00
static void omap_init_sham ( void )
2008-10-06 16:49:36 +04:00
{
2010-05-03 07:10:03 +04:00
if ( cpu_is_omap24xx ( ) ) {
sham_device . resource = omap2_sham_resources ;
sham_device . num_resources = omap2_sham_resources_sz ;
} else if ( cpu_is_omap34xx ( ) ) {
sham_device . resource = omap3_sham_resources ;
sham_device . num_resources = omap3_sham_resources_sz ;
} else {
pr_err ( " %s: platform not supported \n " , __func__ ) ;
return ;
}
platform_device_register ( & sham_device ) ;
2008-10-06 16:49:36 +04:00
}
# else
2010-05-03 07:10:03 +04:00
static inline void omap_init_sham ( void ) { }
2008-10-06 16:49:36 +04:00
# endif
2008-12-11 04:37:16 +03:00
/*-------------------------------------------------------------------------*/
2009-09-23 03:45:25 +04:00
# if defined(CONFIG_ARCH_OMAP3) || defined(CONFIG_ARCH_OMAP4)
2008-12-11 04:37:17 +03:00
# define MMCHS_SYSCONFIG 0x0010
# define MMCHS_SYSCONFIG_SWRESET (1 << 1)
# define MMCHS_SYSSTATUS 0x0014
# define MMCHS_SYSSTATUS_RESETDONE (1 << 0)
static struct platform_device dummy_pdev = {
. dev = {
. bus = & platform_bus_type ,
} ,
} ;
/**
* omap_hsmmc_reset ( ) - Full reset of each HS - MMC controller
*
* Ensure that each MMC controller is fully reset . Controllers
* left in an unknown state ( by bootloader ) may prevent retention
* or OFF - mode . This is especially important in cases where the
* MMC driver is not enabled , _or_ built as a module .
*
* In order for reset to work , interface , functional and debounce
* clocks must be enabled . The debounce clock comes from func_32k_clk
* and is not under SW control , so we only enable i - and f - clocks .
* */
static void __init omap_hsmmc_reset ( void )
{
2010-02-12 23:26:48 +03:00
u32 i , nr_controllers ;
if ( cpu_is_omap242x ( ) )
return ;
nr_controllers = cpu_is_omap44xx ( ) ? OMAP44XX_NR_MMC :
2009-09-23 03:45:25 +04:00
( cpu_is_omap34xx ( ) ? OMAP34XX_NR_MMC : OMAP24XX_NR_MMC ) ;
2008-12-11 04:37:17 +03:00
for ( i = 0 ; i < nr_controllers ; i + + ) {
u32 v , base = 0 ;
struct clk * iclk , * fclk ;
struct device * dev = & dummy_pdev . dev ;
switch ( i ) {
case 0 :
base = OMAP2_MMC1_BASE ;
break ;
case 1 :
base = OMAP2_MMC2_BASE ;
break ;
case 2 :
base = OMAP3_MMC3_BASE ;
break ;
2009-09-23 03:45:25 +04:00
case 3 :
if ( ! cpu_is_omap44xx ( ) )
return ;
base = OMAP4_MMC4_BASE ;
break ;
case 4 :
if ( ! cpu_is_omap44xx ( ) )
return ;
base = OMAP4_MMC5_BASE ;
break ;
2008-12-11 04:37:17 +03:00
}
2009-09-23 03:45:25 +04:00
if ( cpu_is_omap44xx ( ) )
base + = OMAP4_MMC_REG_OFFSET ;
2008-12-11 04:37:17 +03:00
dummy_pdev . id = i ;
2009-01-19 21:56:17 +03:00
dev_set_name ( & dummy_pdev . dev , " mmci-omap-hs.%d " , i ) ;
2009-01-28 13:22:50 +03:00
iclk = clk_get ( dev , " ick " ) ;
2008-12-11 04:37:17 +03:00
if ( iclk & & clk_enable ( iclk ) )
iclk = NULL ;
2009-01-28 13:22:50 +03:00
fclk = clk_get ( dev , " fck " ) ;
2008-12-11 04:37:17 +03:00
if ( fclk & & clk_enable ( fclk ) )
fclk = NULL ;
if ( ! iclk | | ! fclk ) {
printk ( KERN_WARNING
" %s: Unable to enable clocks for MMC%d, "
" cannot reset. \n " , __func__ , i ) ;
break ;
}
omap_writel ( MMCHS_SYSCONFIG_SWRESET , base + MMCHS_SYSCONFIG ) ;
v = omap_readl ( base + MMCHS_SYSSTATUS ) ;
while ( ! ( omap_readl ( base + MMCHS_SYSSTATUS ) &
MMCHS_SYSSTATUS_RESETDONE ) )
cpu_relax ( ) ;
if ( fclk ) {
clk_disable ( fclk ) ;
clk_put ( fclk ) ;
}
if ( iclk ) {
clk_disable ( iclk ) ;
clk_put ( iclk ) ;
}
}
}
# else
static inline void omap_hsmmc_reset ( void ) { }
# endif
2008-12-11 04:37:16 +03:00
# if defined(CONFIG_MMC_OMAP) || defined(CONFIG_MMC_OMAP_MODULE) || \
defined ( CONFIG_MMC_OMAP_HS ) | | defined ( CONFIG_MMC_OMAP_HS_MODULE )
static inline void omap2_mmc_mux ( struct omap_mmc_platform_data * mmc_controller ,
int controller_nr )
{
2010-05-13 16:39:30 +04:00
if ( ( mmc_controller - > slots [ 0 ] . switch_pin > 0 ) & & \
( mmc_controller - > slots [ 0 ] . switch_pin < OMAP_MAX_GPIO_LINES ) )
omap_mux_init_gpio ( mmc_controller - > slots [ 0 ] . switch_pin ,
OMAP_PIN_INPUT_PULLUP ) ;
if ( ( mmc_controller - > slots [ 0 ] . gpio_wp > 0 ) & & \
( mmc_controller - > slots [ 0 ] . gpio_wp < OMAP_MAX_GPIO_LINES ) )
omap_mux_init_gpio ( mmc_controller - > slots [ 0 ] . gpio_wp ,
OMAP_PIN_INPUT_PULLUP ) ;
2008-12-11 04:37:16 +03:00
if ( cpu_is_omap2420 ( ) & & controller_nr = = 0 ) {
2010-07-05 17:31:40 +04:00
omap_mux_init_signal ( " sdmmc_cmd " , 0 ) ;
omap_mux_init_signal ( " sdmmc_clki " , 0 ) ;
omap_mux_init_signal ( " sdmmc_clko " , 0 ) ;
omap_mux_init_signal ( " sdmmc_dat0 " , 0 ) ;
omap_mux_init_signal ( " sdmmc_dat_dir0 " , 0 ) ;
omap_mux_init_signal ( " sdmmc_cmd_dir " , 0 ) ;
2008-12-11 04:37:17 +03:00
if ( mmc_controller - > slots [ 0 ] . wires = = 4 ) {
2010-07-05 17:31:40 +04:00
omap_mux_init_signal ( " sdmmc_dat1 " , 0 ) ;
omap_mux_init_signal ( " sdmmc_dat2 " , 0 ) ;
omap_mux_init_signal ( " sdmmc_dat3 " , 0 ) ;
omap_mux_init_signal ( " sdmmc_dat_dir1 " , 0 ) ;
omap_mux_init_signal ( " sdmmc_dat_dir2 " , 0 ) ;
omap_mux_init_signal ( " sdmmc_dat_dir3 " , 0 ) ;
2008-12-11 04:37:16 +03:00
}
/*
* Use internal loop - back in MMC / SDIO Module Input Clock
* selection
*/
if ( mmc_controller - > slots [ 0 ] . internal_clock ) {
u32 v = omap_ctrl_readl ( OMAP2_CONTROL_DEVCONF0 ) ;
v | = ( 1 < < 24 ) ;
omap_ctrl_writel ( v , OMAP2_CONTROL_DEVCONF0 ) ;
}
}
2009-08-28 22:24:11 +04:00
2009-11-22 21:11:06 +03:00
if ( cpu_is_omap34xx ( ) ) {
2009-08-28 22:24:11 +04:00
if ( controller_nr = = 0 ) {
2009-12-12 03:16:32 +03:00
omap_mux_init_signal ( " sdmmc1_clk " ,
OMAP_PIN_INPUT_PULLUP ) ;
omap_mux_init_signal ( " sdmmc1_cmd " ,
OMAP_PIN_INPUT_PULLUP ) ;
omap_mux_init_signal ( " sdmmc1_dat0 " ,
OMAP_PIN_INPUT_PULLUP ) ;
2009-08-28 22:24:11 +04:00
if ( mmc_controller - > slots [ 0 ] . wires = = 4 | |
mmc_controller - > slots [ 0 ] . wires = = 8 ) {
2009-12-12 03:16:32 +03:00
omap_mux_init_signal ( " sdmmc1_dat1 " ,
OMAP_PIN_INPUT_PULLUP ) ;
omap_mux_init_signal ( " sdmmc1_dat2 " ,
OMAP_PIN_INPUT_PULLUP ) ;
omap_mux_init_signal ( " sdmmc1_dat3 " ,
OMAP_PIN_INPUT_PULLUP ) ;
2009-08-28 22:24:11 +04:00
}
if ( mmc_controller - > slots [ 0 ] . wires = = 8 ) {
2009-12-12 03:16:32 +03:00
omap_mux_init_signal ( " sdmmc1_dat4 " ,
OMAP_PIN_INPUT_PULLUP ) ;
omap_mux_init_signal ( " sdmmc1_dat5 " ,
OMAP_PIN_INPUT_PULLUP ) ;
omap_mux_init_signal ( " sdmmc1_dat6 " ,
OMAP_PIN_INPUT_PULLUP ) ;
omap_mux_init_signal ( " sdmmc1_dat7 " ,
OMAP_PIN_INPUT_PULLUP ) ;
2009-08-28 22:24:11 +04:00
}
}
if ( controller_nr = = 1 ) {
/* MMC2 */
2009-12-12 03:16:32 +03:00
omap_mux_init_signal ( " sdmmc2_clk " ,
OMAP_PIN_INPUT_PULLUP ) ;
omap_mux_init_signal ( " sdmmc2_cmd " ,
OMAP_PIN_INPUT_PULLUP ) ;
omap_mux_init_signal ( " sdmmc2_dat0 " ,
OMAP_PIN_INPUT_PULLUP ) ;
2009-08-28 22:24:11 +04:00
/*
* 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 ) {
2009-12-12 03:16:32 +03:00
omap_mux_init_signal ( " sdmmc2_dat1 " ,
OMAP_PIN_INPUT_PULLUP ) ;
omap_mux_init_signal ( " sdmmc2_dat2 " ,
OMAP_PIN_INPUT_PULLUP ) ;
omap_mux_init_signal ( " sdmmc2_dat3 " ,
OMAP_PIN_INPUT_PULLUP ) ;
2009-08-28 22:24:11 +04:00
}
2009-11-22 21:11:08 +03:00
if ( mmc_controller - > slots [ 0 ] . wires = = 8 ) {
2009-12-12 03:16:32 +03:00
omap_mux_init_signal ( " sdmmc2_dat4.sdmmc2_dat4 " ,
OMAP_PIN_INPUT_PULLUP ) ;
omap_mux_init_signal ( " sdmmc2_dat5.sdmmc2_dat5 " ,
OMAP_PIN_INPUT_PULLUP ) ;
omap_mux_init_signal ( " sdmmc2_dat6.sdmmc2_dat6 " ,
OMAP_PIN_INPUT_PULLUP ) ;
omap_mux_init_signal ( " sdmmc2_dat7.sdmmc2_dat7 " ,
OMAP_PIN_INPUT_PULLUP ) ;
2009-11-22 21:11:08 +03:00
}
2009-08-28 22:24:11 +04:00
}
/*
* For MMC3 the pins need to be muxed in the board - * . c files
*/
}
2008-12-11 04:37:16 +03:00
}
void __init omap2_init_mmc ( struct omap_mmc_platform_data * * mmc_data ,
int nr_controllers )
{
int i ;
2009-01-29 19:57:16 +03:00
char * name ;
2008-12-11 04:37:16 +03:00
for ( i = 0 ; i < nr_controllers ; i + + ) {
unsigned long base , size ;
unsigned int irq = 0 ;
if ( ! mmc_data [ i ] )
continue ;
omap2_mmc_mux ( mmc_data [ i ] , i ) ;
switch ( i ) {
case 0 :
base = OMAP2_MMC1_BASE ;
irq = INT_24XX_MMC_IRQ ;
break ;
case 1 :
base = OMAP2_MMC2_BASE ;
irq = INT_24XX_MMC2_IRQ ;
break ;
case 2 :
2009-09-23 03:45:25 +04:00
if ( ! cpu_is_omap44xx ( ) & & ! cpu_is_omap34xx ( ) )
2008-12-11 04:37:16 +03:00
return ;
base = OMAP3_MMC3_BASE ;
irq = INT_34XX_MMC3_IRQ ;
break ;
2009-09-23 03:45:25 +04:00
case 3 :
if ( ! cpu_is_omap44xx ( ) )
return ;
base = OMAP4_MMC4_BASE + OMAP4_MMC_REG_OFFSET ;
2010-02-18 00:44:12 +03:00
irq = OMAP44XX_IRQ_MMC4 ;
2009-09-23 03:45:25 +04:00
break ;
case 4 :
if ( ! cpu_is_omap44xx ( ) )
return ;
base = OMAP4_MMC5_BASE + OMAP4_MMC_REG_OFFSET ;
2010-04-21 22:19:37 +04:00
irq = OMAP44XX_IRQ_MMC5 ;
2009-09-23 03:45:25 +04:00
break ;
2008-12-11 04:37:16 +03:00
default :
continue ;
}
2009-01-29 19:57:16 +03:00
if ( cpu_is_omap2420 ( ) ) {
2008-12-11 04:37:16 +03:00
size = OMAP2420_MMC_SIZE ;
2009-01-29 19:57:16 +03:00
name = " mmci-omap " ;
2009-09-23 03:45:25 +04:00
} else if ( cpu_is_omap44xx ( ) ) {
if ( i < 3 ) {
base + = OMAP4_MMC_REG_OFFSET ;
2010-02-18 00:44:12 +03:00
irq + = OMAP44XX_IRQ_GIC_START ;
2009-09-23 03:45:25 +04:00
}
size = OMAP4_HSMMC_SIZE ;
name = " mmci-omap-hs " ;
2009-01-29 19:57:16 +03:00
} else {
2009-09-23 03:45:25 +04:00
size = OMAP3_HSMMC_SIZE ;
2009-01-29 19:57:16 +03:00
name = " mmci-omap-hs " ;
}
omap_mmc_add ( name , i , base , size , irq , mmc_data [ i ] ) ;
2008-12-11 04:37:16 +03:00
} ;
}
# endif
/*-------------------------------------------------------------------------*/
2008-10-06 16:49:36 +04:00
# if defined(CONFIG_HDQ_MASTER_OMAP) || defined(CONFIG_HDQ_MASTER_OMAP_MODULE)
# if defined(CONFIG_ARCH_OMAP2430) || defined(CONFIG_ARCH_OMAP3430)
# define OMAP_HDQ_BASE 0x480B2000
# endif
static struct resource omap_hdq_resources [ ] = {
{
. start = OMAP_HDQ_BASE ,
. end = OMAP_HDQ_BASE + 0x1C ,
. flags = IORESOURCE_MEM ,
} ,
{
. start = INT_24XX_HDQ_IRQ ,
. flags = IORESOURCE_IRQ ,
} ,
} ;
static struct platform_device omap_hdq_dev = {
. name = " omap_hdq " ,
. id = 0 ,
. dev = {
. platform_data = NULL ,
} ,
. num_resources = ARRAY_SIZE ( omap_hdq_resources ) ,
. resource = omap_hdq_resources ,
} ;
static inline void omap_hdq_init ( void )
{
( void ) platform_device_register ( & omap_hdq_dev ) ;
}
# else
static inline void omap_hdq_init ( void ) { }
# endif
2010-05-11 01:29:14 +04:00
/*---------------------------------------------------------------------------*/
# if defined(CONFIG_VIDEO_OMAP2_VOUT) || \
defined ( CONFIG_VIDEO_OMAP2_VOUT_MODULE )
# if defined(CONFIG_FB_OMAP2) || defined(CONFIG_FB_OMAP2_MODULE)
static struct resource omap_vout_resource [ 3 - CONFIG_FB_OMAP2_NUM_FBS ] = {
} ;
# else
static struct resource omap_vout_resource [ 2 ] = {
} ;
# endif
static struct platform_device omap_vout_device = {
. name = " omap_vout " ,
. num_resources = ARRAY_SIZE ( omap_vout_resource ) ,
. resource = & omap_vout_resource [ 0 ] ,
. id = - 1 ,
} ;
static void omap_init_vout ( void )
{
if ( platform_device_register ( & omap_vout_device ) < 0 )
printk ( KERN_ERR " Unable to register OMAP-VOUT device \n " ) ;
}
# else
static inline void omap_init_vout ( void ) { }
# endif
2005-11-10 17:26:51 +03:00
/*-------------------------------------------------------------------------*/
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 .
*/
2008-12-11 04:37:17 +03:00
omap_hsmmc_reset ( ) ;
2009-03-24 04:23:49 +03:00
omap_init_camera ( ) ;
2006-12-08 00:58:10 +03:00
omap_init_mbox ( ) ;
2006-06-27 03:16:10 +04:00
omap_init_mcspi ( ) ;
2010-04-09 16:54:43 +04:00
omap_init_pmu ( ) ;
2008-10-06 16:49:36 +04:00
omap_hdq_init ( ) ;
2006-04-02 20:46:30 +04:00
omap_init_sti ( ) ;
2010-05-03 07:10:03 +04:00
omap_init_sham ( ) ;
2010-05-11 01:29:14 +04:00
omap_init_vout ( ) ;
2005-11-10 17:26:51 +03:00
return 0 ;
}
arch_initcall ( omap2_init_devices ) ;