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 .
*/
2011-07-26 13:53:52 +04:00
# include <linux/gpio.h>
2005-11-10 17:26:51 +03:00
# 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>
2010-09-23 18:32:42 +04:00
# include <linux/err.h>
2011-02-02 15:22:14 +03:00
# include <linux/slab.h>
2011-08-12 15:48:47 +04:00
# include <linux/of.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/tc.h>
# include <plat/board.h>
2010-10-04 16:04:53 +04:00
# include <plat/mcbsp.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>
2010-09-23 18:32:42 +04:00
# include <plat/omap_hwmod.h>
# include <plat/omap_device.h>
2010-12-27 08:51:45 +03:00
# include <plat/omap4-keypad.h>
2005-11-10 17:26:51 +03:00
2009-12-12 03:16:32 +03:00
# include "mux.h"
2010-10-08 21:40:20 +04:00
# include "control.h"
2009-12-14 14:09:07 +03:00
# include "devices.h"
2009-12-12 03:16:32 +03:00
2011-02-08 11:40:45 +03:00
# define L3_MODULES_MAX_LEN 12
2011-03-09 13:30:29 +03:00
# define L3_MODULES 3
2011-02-08 11:40:45 +03:00
static int __init omap3_l3_init ( void )
{
int l ;
struct omap_hwmod * oh ;
2011-07-22 00:48:45 +04:00
struct platform_device * pdev ;
2011-02-08 11:40:45 +03:00
char oh_name [ L3_MODULES_MAX_LEN ] ;
/*
* To avoid code running on other OMAPs in
* multi - omap builds
*/
if ( ! ( cpu_is_omap34xx ( ) ) )
return - ENODEV ;
l = snprintf ( oh_name , L3_MODULES_MAX_LEN , " l3_main " ) ;
oh = omap_hwmod_lookup ( oh_name ) ;
if ( ! oh )
pr_err ( " could not look up %s \n " , oh_name ) ;
2011-07-22 00:48:45 +04:00
pdev = omap_device_build ( " omap_l3_smx " , 0 , oh , NULL , 0 ,
2011-02-08 11:40:45 +03:00
NULL , 0 , 0 ) ;
2011-07-22 00:48:45 +04:00
WARN ( IS_ERR ( pdev ) , " could not build omap_device for %s \n " , oh_name ) ;
2011-02-08 11:40:45 +03:00
2011-07-22 00:48:45 +04:00
return IS_ERR ( pdev ) ? PTR_ERR ( pdev ) : 0 ;
2011-02-08 11:40:45 +03:00
}
postcore_initcall ( omap3_l3_init ) ;
2011-03-09 13:30:29 +03:00
static int __init omap4_l3_init ( void )
{
int l , i ;
struct omap_hwmod * oh [ 3 ] ;
2011-07-22 00:48:45 +04:00
struct platform_device * pdev ;
2011-03-09 13:30:29 +03:00
char oh_name [ L3_MODULES_MAX_LEN ] ;
2011-08-12 15:48:47 +04:00
/* If dtb is there, the devices will be created dynamically */
if ( of_have_populated_dt ( ) )
return - ENODEV ;
2011-03-09 13:30:29 +03:00
/*
* To avoid code running on other OMAPs in
* multi - omap builds
*/
if ( ! ( cpu_is_omap44xx ( ) ) )
return - ENODEV ;
for ( i = 0 ; i < L3_MODULES ; i + + ) {
l = snprintf ( oh_name , L3_MODULES_MAX_LEN , " l3_main_%d " , i + 1 ) ;
oh [ i ] = omap_hwmod_lookup ( oh_name ) ;
if ( ! ( oh [ i ] ) )
pr_err ( " could not look up %s \n " , oh_name ) ;
}
2011-07-22 00:48:45 +04:00
pdev = omap_device_build_ss ( " omap_l3_noc " , 0 , oh , 3 , NULL ,
2011-03-09 13:30:29 +03:00
0 , NULL , 0 , 0 ) ;
2011-07-22 00:48:45 +04:00
WARN ( IS_ERR ( pdev ) , " could not build omap_device for %s \n " , oh_name ) ;
2011-03-09 13:30:29 +03:00
2011-07-22 00:48:45 +04:00
return IS_ERR ( pdev ) ? PTR_ERR ( pdev ) : 0 ;
2011-03-09 13:30:29 +03:00
}
postcore_initcall ( omap4_l3_init ) ;
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
2010-11-15 17:29:54 +03:00
static struct resource omap2cam_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 ,
}
} ;
2010-11-15 17:29:54 +03:00
static struct platform_device omap2cam_device = {
2009-03-24 04:23:49 +03:00
. name = " omap24xxcam " ,
. id = - 1 ,
2010-11-15 17:29:54 +03:00
. num_resources = ARRAY_SIZE ( omap2cam_resources ) ,
. resource = omap2cam_resources ,
2009-03-24 04:23:49 +03:00
} ;
2009-12-14 14:09:07 +03:00
# endif
2009-03-24 04:23:49 +03:00
2012-01-11 17:28:11 +04:00
# if defined(CONFIG_IOMMU_API)
# include <plat/iommu.h>
2009-03-24 04:23:49 +03:00
static struct resource omap3isp_resources [ ] = {
{
. start = OMAP3430_ISP_BASE ,
. end = OMAP3430_ISP_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 ,
} ,
{
2010-02-02 17:17:33 +03:00
. start = OMAP3430_ISP_CSI2A_REGS1_BASE ,
. end = OMAP3430_ISP_CSI2A_REGS1_END ,
2009-03-24 04:23:49 +03:00
. flags = IORESOURCE_MEM ,
} ,
{
2010-02-02 17:17:33 +03:00
. start = OMAP3430_ISP_CSIPHY2_BASE ,
. end = OMAP3430_ISP_CSIPHY2_END ,
. flags = IORESOURCE_MEM ,
} ,
{
. start = OMAP3630_ISP_CSI2A_REGS2_BASE ,
. end = OMAP3630_ISP_CSI2A_REGS2_END ,
2009-03-24 04:23:49 +03:00
. flags = IORESOURCE_MEM ,
} ,
{
2010-02-02 17:17:33 +03:00
. start = OMAP3630_ISP_CSI2C_REGS1_BASE ,
. end = OMAP3630_ISP_CSI2C_REGS1_END ,
. flags = IORESOURCE_MEM ,
} ,
{
. start = OMAP3630_ISP_CSIPHY1_BASE ,
. end = OMAP3630_ISP_CSIPHY1_END ,
. flags = IORESOURCE_MEM ,
} ,
{
. start = OMAP3630_ISP_CSI2C_REGS2_BASE ,
. end = OMAP3630_ISP_CSI2C_REGS2_END ,
2009-03-24 04:23:49 +03:00
. 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 ,
} ;
2011-09-23 17:44:57 +04:00
static struct omap_iommu_arch_data omap3_isp_iommu = {
. name = " isp " ,
} ;
2009-12-14 14:09:07 +03:00
int omap3_init_camera ( struct isp_platform_data * pdata )
2009-03-24 04:23:49 +03:00
{
2009-12-14 14:09:07 +03:00
omap3isp_device . dev . platform_data = pdata ;
2011-09-23 17:44:57 +04:00
omap3isp_device . dev . archdata . iommu = & omap3_isp_iommu ;
2009-12-14 14:09:07 +03:00
return platform_device_register ( & omap3isp_device ) ;
2009-03-24 04:23:49 +03:00
}
2012-01-11 17:28:11 +04:00
# else /* !CONFIG_IOMMU_API */
int omap3_init_camera ( struct isp_platform_data * pdata )
{
return 0 ;
}
# endif
2009-03-24 04:23:49 +03:00
static inline void omap_init_camera ( void )
{
2010-11-15 17:29:54 +03:00
# if defined(CONFIG_VIDEO_OMAP2) || defined(CONFIG_VIDEO_OMAP2_MODULE)
if ( cpu_is_omap24xx ( ) )
platform_device_register ( & omap2cam_device ) ;
2009-03-24 04:23:49 +03:00
# endif
2010-11-15 17:29:54 +03:00
}
2009-03-24 04:23:49 +03:00
2010-12-27 08:51:45 +03:00
int __init omap4_keyboard_init ( struct omap4_keypad_platform_data
2011-07-05 14:38:24 +04:00
* sdp4430_keypad_data , struct omap_board_data * bdata )
2010-12-27 08:51:45 +03:00
{
2011-07-22 00:48:45 +04:00
struct platform_device * pdev ;
2010-12-27 08:51:45 +03:00
struct omap_hwmod * oh ;
struct omap4_keypad_platform_data * keypad_data ;
unsigned int id = - 1 ;
char * oh_name = " kbd " ;
char * name = " omap4-keypad " ;
oh = omap_hwmod_lookup ( oh_name ) ;
if ( ! oh ) {
pr_err ( " Could not look up %s \n " , oh_name ) ;
return - ENODEV ;
}
keypad_data = sdp4430_keypad_data ;
2011-07-22 00:48:45 +04:00
pdev = omap_device_build ( name , id , oh , keypad_data ,
2011-08-10 17:30:09 +04:00
sizeof ( struct omap4_keypad_platform_data ) , NULL , 0 , 0 ) ;
2010-12-27 08:51:45 +03:00
2011-07-22 00:48:45 +04:00
if ( IS_ERR ( pdev ) ) {
2011-03-31 05:57:33 +04:00
WARN ( 1 , " Can't build omap_device for %s:%s. \n " ,
2010-12-27 08:51:45 +03:00
name , oh - > name ) ;
2011-07-22 00:48:45 +04:00
return PTR_ERR ( pdev ) ;
2010-12-27 08:51:45 +03:00
}
2011-07-05 14:38:24 +04:00
oh - > mux = omap_hwmod_mux_init ( bdata - > pads , bdata - > pads_cnt ) ;
2010-12-27 08:51:45 +03:00
return 0 ;
}
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
static inline void omap_init_mbox ( void )
{
2011-02-24 23:51:33 +03:00
struct omap_hwmod * oh ;
2011-07-22 00:48:45 +04:00
struct platform_device * pdev ;
2011-02-24 23:51:33 +03:00
oh = omap_hwmod_lookup ( " mailbox " ) ;
if ( ! oh ) {
pr_err ( " %s: unable to find hwmod \n " , __func__ ) ;
2009-03-24 04:07:23 +03:00
return ;
}
2011-02-24 23:51:33 +03:00
2011-08-10 17:30:09 +04:00
pdev = omap_device_build ( " omap-mailbox " , - 1 , oh , NULL , 0 , NULL , 0 , 0 ) ;
2011-07-22 00:48:45 +04:00
WARN ( IS_ERR ( pdev ) , " %s: could not build device, err %ld \n " ,
__func__ , PTR_ERR ( pdev ) ) ;
2006-12-08 00:58:10 +03:00
}
# 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 ) { }
2010-03-17 23:15:21 +03:00
# if defined(CONFIG_SND_SOC) || defined(CONFIG_SND_SOC_MODULE)
static struct platform_device omap_pcm = {
. name = " omap-pcm-audio " ,
. id = - 1 ,
} ;
/*
* OMAP2420 has 2 McBSP ports
* OMAP2430 has 5 McBSP ports
* OMAP3 has 5 McBSP ports
* OMAP4 has 4 McBSP ports
*/
OMAP_MCBSP_PLATFORM_DEVICE ( 1 ) ;
OMAP_MCBSP_PLATFORM_DEVICE ( 2 ) ;
OMAP_MCBSP_PLATFORM_DEVICE ( 3 ) ;
OMAP_MCBSP_PLATFORM_DEVICE ( 4 ) ;
OMAP_MCBSP_PLATFORM_DEVICE ( 5 ) ;
static void omap_init_audio ( void )
{
platform_device_register ( & omap_mcbsp1 ) ;
platform_device_register ( & omap_mcbsp2 ) ;
if ( cpu_is_omap243x ( ) | | cpu_is_omap34xx ( ) | | cpu_is_omap44xx ( ) ) {
platform_device_register ( & omap_mcbsp3 ) ;
platform_device_register ( & omap_mcbsp4 ) ;
}
if ( cpu_is_omap243x ( ) | | cpu_is_omap34xx ( ) )
platform_device_register ( & omap_mcbsp5 ) ;
platform_device_register ( & omap_pcm ) ;
}
# else
static inline void omap_init_audio ( void ) { }
# endif
2011-02-13 07:28:56 +03:00
# if defined(CONFIG_SND_OMAP_SOC_MCPDM) || \
defined ( CONFIG_SND_OMAP_SOC_MCPDM_MODULE )
static void omap_init_mcpdm ( void )
{
struct omap_hwmod * oh ;
2011-11-03 12:41:22 +04:00
struct platform_device * pdev ;
2011-02-13 07:28:56 +03:00
oh = omap_hwmod_lookup ( " mcpdm " ) ;
if ( ! oh ) {
printk ( KERN_ERR " Could not look up mcpdm hw_mod \n " ) ;
return ;
}
2011-11-03 12:41:22 +04:00
pdev = omap_device_build ( " omap-mcpdm " , - 1 , oh , NULL , 0 , NULL , 0 , 0 ) ;
WARN ( IS_ERR ( pdev ) , " Can't build omap_device for omap-mcpdm. \n " ) ;
2011-02-13 07:28:56 +03:00
}
# else
static inline void omap_init_mcpdm ( void ) { }
# endif
2011-12-13 22:48:54 +04:00
# if defined(CONFIG_SND_OMAP_SOC_DMIC) || \
defined ( CONFIG_SND_OMAP_SOC_DMIC_MODULE )
static void omap_init_dmic ( void )
{
struct omap_hwmod * oh ;
struct platform_device * pdev ;
oh = omap_hwmod_lookup ( " dmic " ) ;
if ( ! oh ) {
printk ( KERN_ERR " Could not look up mcpdm hw_mod \n " ) ;
return ;
}
pdev = omap_device_build ( " omap-dmic " , - 1 , oh , NULL , 0 , NULL , 0 , 0 ) ;
WARN ( IS_ERR ( pdev ) , " Can't build omap_device for omap-dmic. \n " ) ;
}
# else
static inline void omap_init_dmic ( void ) { }
# endif
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
2011-02-02 15:22:14 +03:00
static int omap_mcspi_init ( struct omap_hwmod * oh , void * unused )
2009-09-25 03:23:05 +04:00
{
2011-07-22 00:48:45 +04:00
struct platform_device * pdev ;
2011-02-02 15:22:14 +03:00
char * name = " omap2_mcspi " ;
struct omap2_mcspi_platform_config * pdata ;
static int spi_num ;
struct omap2_mcspi_dev_attr * mcspi_attrib = oh - > dev_attr ;
pdata = kzalloc ( sizeof ( * pdata ) , GFP_KERNEL ) ;
if ( ! pdata ) {
pr_err ( " Memory allocation for McSPI device failed \n " ) ;
return - ENOMEM ;
}
2009-09-25 03:23:05 +04:00
2011-02-02 15:22:14 +03:00
pdata - > num_cs = mcspi_attrib - > num_chipselect ;
switch ( oh - > class - > rev ) {
case OMAP2_MCSPI_REV :
case OMAP3_MCSPI_REV :
pdata - > regs_offset = 0 ;
break ;
case OMAP4_MCSPI_REV :
pdata - > regs_offset = OMAP4_MCSPI_REG_OFFSET ;
break ;
default :
pr_err ( " Invalid McSPI Revision value \n " ) ;
2011-12-23 21:39:31 +04:00
kfree ( pdata ) ;
2011-02-02 15:22:14 +03:00
return - EINVAL ;
}
2009-09-25 03:23:05 +04:00
2011-02-02 15:22:14 +03:00
spi_num + + ;
2011-07-22 00:48:45 +04:00
pdev = omap_device_build ( name , spi_num , oh , pdata ,
2011-08-10 17:30:09 +04:00
sizeof ( * pdata ) , NULL , 0 , 0 ) ;
2011-07-22 00:48:45 +04:00
WARN ( IS_ERR ( pdev ) , " Can't build omap_device for %s:%s \n " ,
2011-02-02 15:22:14 +03:00
name , oh - > name ) ;
kfree ( pdata ) ;
return 0 ;
2009-09-25 03:23:05 +04:00
}
static void omap_init_mcspi ( void )
{
2011-02-02 15:22:14 +03:00
omap_hwmod_for_each_by_class ( " mcspi " , omap_mcspi_init , NULL ) ;
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
2010-09-03 15:13:55 +04:00
# if defined(CONFIG_CRYPTO_DEV_OMAP_AES) || defined(CONFIG_CRYPTO_DEV_OMAP_AES_MODULE)
2010-08-20 17:44:46 +04:00
# ifdef CONFIG_ARCH_OMAP2
2010-09-03 15:13:55 +04:00
static struct resource omap2_aes_resources [ ] = {
{
. start = OMAP24XX_SEC_AES_BASE ,
. end = OMAP24XX_SEC_AES_BASE + 0x4C ,
. flags = IORESOURCE_MEM ,
} ,
{
. start = OMAP24XX_DMA_AES_TX ,
. flags = IORESOURCE_DMA ,
} ,
{
. start = OMAP24XX_DMA_AES_RX ,
. flags = IORESOURCE_DMA ,
}
} ;
static int omap2_aes_resources_sz = ARRAY_SIZE ( omap2_aes_resources ) ;
# else
# define omap2_aes_resources NULL
# define omap2_aes_resources_sz 0
# endif
2010-08-20 17:44:46 +04:00
# ifdef CONFIG_ARCH_OMAP3
2010-09-03 15:13:55 +04:00
static struct resource omap3_aes_resources [ ] = {
{
. start = OMAP34XX_SEC_AES_BASE ,
. end = OMAP34XX_SEC_AES_BASE + 0x4C ,
. flags = IORESOURCE_MEM ,
} ,
{
. start = OMAP34XX_DMA_AES2_TX ,
. flags = IORESOURCE_DMA ,
} ,
{
. start = OMAP34XX_DMA_AES2_RX ,
. flags = IORESOURCE_DMA ,
}
} ;
static int omap3_aes_resources_sz = ARRAY_SIZE ( omap3_aes_resources ) ;
# else
# define omap3_aes_resources NULL
# define omap3_aes_resources_sz 0
# endif
static struct platform_device aes_device = {
. name = " omap-aes " ,
. id = - 1 ,
} ;
static void omap_init_aes ( void )
{
if ( cpu_is_omap24xx ( ) ) {
aes_device . resource = omap2_aes_resources ;
aes_device . num_resources = omap2_aes_resources_sz ;
} else if ( cpu_is_omap34xx ( ) ) {
aes_device . resource = omap3_aes_resources ;
aes_device . num_resources = omap3_aes_resources_sz ;
} else {
pr_err ( " %s: platform not supported \n " , __func__ ) ;
return ;
}
platform_device_register ( & aes_device ) ;
}
# else
static inline void omap_init_aes ( void ) { }
# endif
2008-12-11 04:37:16 +03:00
/*-------------------------------------------------------------------------*/
2011-03-02 00:12:55 +03:00
# if defined(CONFIG_MMC_OMAP) || defined(CONFIG_MMC_OMAP_MODULE)
2008-12-11 04:37:17 +03:00
2011-03-02 00:12:55 +03:00
static inline void omap242x_mmc_mux ( struct omap_mmc_platform_data
* mmc_controller )
2008-12-11 04:37:16 +03:00
{
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 ) ;
2011-03-02 00:12:55 +03: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 ) ;
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 ) ;
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
}
2009-08-28 22:24:11 +04:00
2011-03-02 00:12:55 +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
}
2008-12-11 04:37:16 +03:00
}
2011-03-02 00:12:55 +03:00
void __init omap242x_init_mmc ( struct omap_mmc_platform_data * * mmc_data )
2008-12-11 04:37:16 +03:00
{
2011-03-02 00:12:55 +03:00
char * name = " mmci-omap " ;
2008-12-11 04:37:16 +03:00
2011-03-02 00:12:55 +03:00
if ( ! mmc_data [ 0 ] ) {
pr_err ( " %s fails: Incomplete platform data \n " , __func__ ) ;
return ;
}
2008-12-11 04:37:16 +03:00
2011-03-02 00:12:55 +03:00
omap242x_mmc_mux ( mmc_data [ 0 ] ) ;
omap_mmc_add ( name , 0 , OMAP2_MMC1_BASE , OMAP2420_MMC_SIZE ,
INT_24XX_MMC_IRQ , mmc_data [ 0 ] ) ;
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)
2011-01-28 03:39:40 +03:00
# if defined(CONFIG_SOC_OMAP2430) || defined(CONFIG_SOC_OMAP3430)
2008-10-06 16:49:36 +04:00
# 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 )
{
2010-12-22 05:56:17 +03:00
/*
* please keep these calls , and their implementations above ,
2005-11-10 17:26:51 +03:00
* in alphabetical order so they ' re easier to sort through .
*/
2010-03-17 23:15:21 +03:00
omap_init_audio ( ) ;
2011-02-13 07:28:56 +03:00
omap_init_mcpdm ( ) ;
2011-12-13 22:48:54 +04:00
omap_init_dmic ( ) ;
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-09-03 15:13:55 +04:00
omap_init_aes ( ) ;
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 ) ;
2010-09-23 18:32:42 +04:00
# if defined(CONFIG_OMAP_WATCHDOG) || defined(CONFIG_OMAP_WATCHDOG_MODULE)
static int __init omap_init_wdt ( void )
{
int id = - 1 ;
2011-07-22 00:48:45 +04:00
struct platform_device * pdev ;
2010-09-23 18:32:42 +04:00
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 ;
}
2011-08-10 17:30:09 +04:00
pdev = omap_device_build ( dev_name , id , oh , NULL , 0 , NULL , 0 , 0 ) ;
2011-07-22 00:48:45 +04:00
WARN ( IS_ERR ( pdev ) , " Can't build omap_device for %s:%s. \n " ,
2010-09-23 18:32:42 +04:00
dev_name , oh - > name ) ;
return 0 ;
}
subsys_initcall ( omap_init_wdt ) ;
# endif