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>
2012-09-18 03:26:11 +04:00
# include <linux/pinctrl/machine.h>
2012-03-17 09:47:48 +04:00
# include <linux/platform_data/omap4-keypad.h>
2012-10-27 17:35:56 +04:00
# include <linux/platform_data/omap_ocp2scp.h>
2013-02-06 17:28:48 +04:00
# include <linux/usb/omap_control_usb.h>
2005-11-10 17:26:51 +03:00
# include <asm/mach-types.h>
# include <asm/mach/map.h>
2012-11-30 20:41:50 +04:00
# include <linux/omap-dma.h>
2012-10-03 04:41:35 +04:00
2012-02-24 22:34:35 +04:00
# include "iomap.h"
2012-10-03 04:41:35 +04:00
# include "omap_hwmod.h"
2012-10-03 04:25:48 +04:00
# include "omap_device.h"
2012-09-20 22:42:20 +04:00
# include "omap4-keypad.h"
2005-11-10 17:26:51 +03:00
2012-08-28 04:43:01 +04:00
# include "soc.h"
# include "common.h"
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"
2012-10-16 01:03:51 +04:00
# include "dma.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 )
{
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 ;
2012-04-13 16:34:32 +04:00
snprintf ( oh_name , L3_MODULES_MAX_LEN , " l3_main " ) ;
2011-02-08 11:40:45 +03:00
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 )
{
2012-04-13 16:34:32 +04:00
int i ;
2011-03-09 13:30:29 +03:00
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
*/
2011-11-04 14:22:59 +04:00
if ( ! cpu_is_omap44xx ( ) & & ! soc_is_omap54xx ( ) )
2011-03-09 13:30:29 +03:00
return - ENODEV ;
for ( i = 0 ; i < L3_MODULES ; i + + ) {
2012-04-13 16:34:32 +04:00
snprintf ( oh_name , L3_MODULES_MAX_LEN , " l3_main_%d " , i + 1 ) ;
2011-03-09 13:30:29 +03:00
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 ,
} ,
{
2012-08-28 04:43:01 +04:00
. start = 24 + OMAP_INTC_START ,
2009-03-24 04:23:49 +03:00
. 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)
2012-11-02 23:24:14 +04:00
# include <linux/platform_data/iommu-omap.h>
2012-01-11 17:28:11 +04:00
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 ,
} ,
2012-10-14 14:31:48 +04:00
{
. start = OMAP343X_CTRL_BASE + OMAP343X_CONTROL_CSIRXFE ,
. end = OMAP343X_CTRL_BASE + OMAP343X_CONTROL_CSIRXFE + 3 ,
. flags = IORESOURCE_MEM ,
} ,
{
. start = OMAP343X_CTRL_BASE + OMAP3630_CONTROL_CAMERA_PHY_CTRL ,
. end = OMAP343X_CTRL_BASE + OMAP3630_CONTROL_CAMERA_PHY_CTRL + 3 ,
. flags = IORESOURCE_MEM ,
} ,
2009-03-24 04:23:49 +03:00
{
2012-08-28 04:43:01 +04:00
. start = 24 + OMAP_INTC_START ,
2009-03-24 04:23:49 +03:00
. 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 = {
2012-11-20 05:05:50 +04:00
. name = " mmu_isp " ,
2011-09-23 17:44:57 +04:00
} ;
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
2013-02-06 17:28:48 +04:00
# if IS_ENABLED(CONFIG_OMAP_CONTROL_USB)
static struct omap_control_usb_platform_data omap4_control_usb_pdata = {
. type = 1 ,
} ;
struct resource omap4_control_usb_res [ ] = {
{
. name = " control_dev_conf " ,
. start = 0x4a002300 ,
. end = 0x4a002303 ,
. flags = IORESOURCE_MEM ,
} ,
{
. name = " otghs_control " ,
. start = 0x4a00233c ,
. end = 0x4a00233f ,
. flags = IORESOURCE_MEM ,
} ,
} ;
static struct platform_device omap4_control_usb = {
. name = " omap-control-usb " ,
. id = - 1 ,
. dev = {
. platform_data = & omap4_control_usb_pdata ,
} ,
. num_resources = 2 ,
. resource = omap4_control_usb_res ,
} ;
static inline void __init omap_init_control_usb ( void )
{
if ( ! cpu_is_omap44xx ( ) )
return ;
if ( platform_device_register ( & omap4_control_usb ) )
pr_err ( " Error registering omap_control_usb device \n " ) ;
}
# else
static inline void omap_init_control_usb ( void ) { }
# endif /* CONFIG_OMAP_CONTROL_USB */
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)
2012-02-20 21:43:30 +04:00
static inline void __init omap_init_mbox ( void )
2006-12-08 00:58:10 +03:00
{
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 ,
} ;
static void omap_init_audio ( void )
{
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 )
2012-02-20 21:43:30 +04:00
static void __init omap_init_mcpdm ( void )
2011-02-13 07:28:56 +03:00
{
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 )
2012-02-20 21:43:30 +04:00
static void __init omap_init_dmic ( void )
2011-12-13 22:48:54 +04:00
{
struct omap_hwmod * oh ;
struct platform_device * pdev ;
oh = omap_hwmod_lookup ( " dmic " ) ;
if ( ! oh ) {
2012-10-16 22:19:17 +04:00
pr_err ( " Could not look up dmic hw_mod \n " ) ;
2011-12-13 22:48:54 +04:00
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
2012-05-10 01:19:14 +04:00
# if defined(CONFIG_SND_OMAP_SOC_OMAP_HDMI) || \
defined ( CONFIG_SND_OMAP_SOC_OMAP_HDMI_MODULE )
static struct platform_device omap_hdmi_audio = {
. name = " omap-hdmi-audio " ,
. id = - 1 ,
} ;
static void __init omap_init_hdmi_audio ( void )
{
struct omap_hwmod * oh ;
struct platform_device * pdev ;
oh = omap_hwmod_lookup ( " dss_hdmi " ) ;
if ( ! oh ) {
printk ( KERN_ERR " Could not look up dss_hdmi hw_mod \n " ) ;
return ;
}
pdev = omap_device_build ( " omap-hdmi-audio-dai " ,
- 1 , oh , NULL , 0 , NULL , 0 , 0 ) ;
WARN ( IS_ERR ( pdev ) ,
" Can't build omap_device for omap-hdmi-audio-dai. \n " ) ;
platform_device_register ( & omap_hdmi_audio ) ;
}
# else
static inline void omap_init_hdmi_audio ( 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
2012-08-24 17:21:06 +04:00
# include <linux/platform_data/spi-omap2-mcspi.h>
2006-06-27 03:16:10 +04:00
2012-02-20 21:43:30 +04:00
static int __init 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
2012-09-24 03:28:27 +04:00
/**
* omap_init_rng - bind the RNG hwmod to the RNG omap_device
*
* Bind the RNG hwmod to the RNG omap_device . No return value .
*/
static void omap_init_rng ( void )
{
struct omap_hwmod * oh ;
struct platform_device * pdev ;
oh = omap_hwmod_lookup ( " rng " ) ;
if ( ! oh )
return ;
pdev = omap_device_build ( " omap_rng " , - 1 , oh , NULL , 0 , NULL , 0 , 0 ) ;
WARN ( IS_ERR ( pdev ) , " Can't build omap_device for omap_rng \n " ) ;
}
2010-04-09 16:54:43 +04:00
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 ,
} ,
{
2012-08-28 04:43:01 +04:00
. start = 51 + OMAP_INTC_START ,
2008-10-06 16:49:36 +04:00
. 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 ,
} ,
{
2012-08-28 04:43:01 +04:00
. start = 49 + OMAP_INTC_START ,
2010-05-03 07:10:03 +04:00
. 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
/*-------------------------------------------------------------------------*/
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
2012-10-27 17:35:56 +04:00
# if defined(CONFIG_OMAP_OCP2SCP) || defined(CONFIG_OMAP_OCP2SCP_MODULE)
static int count_ocp2scp_devices ( struct omap_ocp2scp_dev * ocp2scp_dev )
{
int cnt = 0 ;
while ( ocp2scp_dev - > drv_name ! = NULL ) {
cnt + + ;
ocp2scp_dev + + ;
}
return cnt ;
}
2013-01-21 22:17:03 +04:00
static void __init omap_init_ocp2scp ( void )
2012-10-27 17:35:56 +04:00
{
struct omap_hwmod * oh ;
struct platform_device * pdev ;
int bus_id = - 1 , dev_cnt = 0 , i ;
struct omap_ocp2scp_dev * ocp2scp_dev ;
const char * oh_name , * name ;
struct omap_ocp2scp_platform_data * pdata ;
if ( ! cpu_is_omap44xx ( ) )
return ;
oh_name = " ocp2scp_usb_phy " ;
name = " omap-ocp2scp " ;
oh = omap_hwmod_lookup ( oh_name ) ;
if ( ! oh ) {
pr_err ( " %s: could not find omap_hwmod for %s \n " , __func__ ,
oh_name ) ;
return ;
}
pdata = kzalloc ( sizeof ( * pdata ) , GFP_KERNEL ) ;
if ( ! pdata ) {
pr_err ( " %s: No memory for ocp2scp pdata \n " , __func__ ) ;
return ;
}
ocp2scp_dev = oh - > dev_attr ;
dev_cnt = count_ocp2scp_devices ( ocp2scp_dev ) ;
if ( ! dev_cnt ) {
pr_err ( " %s: No devices connected to ocp2scp \n " , __func__ ) ;
kfree ( pdata ) ;
return ;
}
pdata - > devices = kzalloc ( sizeof ( struct omap_ocp2scp_dev * )
* dev_cnt , GFP_KERNEL ) ;
if ( ! pdata - > devices ) {
pr_err ( " %s: No memory for ocp2scp pdata devices \n " , __func__ ) ;
kfree ( pdata ) ;
return ;
}
for ( i = 0 ; i < dev_cnt ; i + + , ocp2scp_dev + + )
pdata - > devices [ i ] = ocp2scp_dev ;
pdata - > dev_cnt = dev_cnt ;
pdev = omap_device_build ( name , bus_id , oh , pdata , sizeof ( * pdata ) , NULL ,
0 , false ) ;
if ( IS_ERR ( pdev ) ) {
pr_err ( " Could not build omap_device for %s %s \n " ,
name , oh_name ) ;
kfree ( pdata - > devices ) ;
kfree ( pdata ) ;
return ;
}
}
# else
static inline void omap_init_ocp2scp ( void ) { }
# endif
2005-11-10 17:26:51 +03:00
/*-------------------------------------------------------------------------*/
static int __init omap2_init_devices ( void )
{
2012-09-18 03:26:11 +04:00
/* Enable dummy states for those platforms without pinctrl support */
if ( ! of_have_populated_dt ( ) )
pinctrl_provide_dummies ( ) ;
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 ( ) ;
2009-03-24 04:23:49 +03:00
omap_init_camera ( ) ;
2012-05-10 01:19:14 +04:00
omap_init_hdmi_audio ( ) ;
2006-12-08 00:58:10 +03:00
omap_init_mbox ( ) ;
2012-01-20 17:15:58 +04:00
/* If dtb is there, the devices will be created dynamically */
2012-05-02 16:23:18 +04:00
if ( ! of_have_populated_dt ( ) ) {
2013-02-06 17:28:48 +04:00
omap_init_control_usb ( ) ;
2012-05-02 16:23:18 +04:00
omap_init_dmic ( ) ;
2012-05-02 16:23:19 +04:00
omap_init_mcpdm ( ) ;
2012-01-20 17:15:58 +04:00
omap_init_mcspi ( ) ;
2012-05-02 16:23:18 +04:00
}
2006-04-02 20:46:30 +04:00
omap_init_sti ( ) ;
2012-09-24 03:28:27 +04:00
omap_init_rng ( ) ;
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 ( ) ;
2012-10-27 17:35:56 +04:00
omap_init_ocp2scp ( ) ;
2005-11-10 17:26:51 +03:00
return 0 ;
}
arch_initcall ( omap2_init_devices ) ;