2005-11-10 14:26:51 +00: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 10:53:52 +01:00
# include <linux/gpio.h>
2005-11-10 14:26:51 +00:00
# include <linux/kernel.h>
# include <linux/init.h>
# include <linux/platform_device.h>
2008-09-06 12:10:45 +01:00
# include <linux/io.h>
2008-12-10 17:37:17 -08:00
# include <linux/clk.h>
2010-09-23 20:02:42 +05:30
# include <linux/err.h>
2011-02-02 17:52:14 +05:30
# include <linux/slab.h>
2011-08-12 13:48:47 +02:00
# include <linux/of.h>
2012-09-17 16:26:11 -07:00
# include <linux/pinctrl/machine.h>
2012-03-16 22:47:48 -07:00
# include <linux/platform_data/omap4-keypad.h>
2012-10-27 19:05:56 +05:30
# include <linux/platform_data/omap_ocp2scp.h>
2013-01-28 17:21:58 -06:00
# include <linux/platform_data/mailbox-omap.h>
2013-02-06 18:58:48 +05:30
# include <linux/usb/omap_control_usb.h>
2005-11-10 14:26:51 +00:00
# include <asm/mach-types.h>
# include <asm/mach/map.h>
2012-11-30 08:41:50 -08:00
# include <linux/omap-dma.h>
2012-10-02 17:41:35 -07:00
2012-02-24 10:34:35 -08:00
# include "iomap.h"
2012-10-02 17:41:35 -07:00
# include "omap_hwmod.h"
2012-10-02 17:25:48 -07:00
# include "omap_device.h"
2012-09-20 11:42:20 -07:00
# include "omap4-keypad.h"
2005-11-10 14:26:51 +00:00
2012-08-27 17:43:01 -07:00
# include "soc.h"
# include "common.h"
2009-12-11 16:16:32 -08:00
# include "mux.h"
2010-10-08 11:40:20 -06:00
# include "control.h"
2009-12-14 08:09:07 -03:00
# include "devices.h"
2012-10-15 14:03:51 -07:00
# include "dma.h"
2009-12-11 16:16:32 -08:00
2011-02-08 14:10:45 +05:30
# define L3_MODULES_MAX_LEN 12
2011-03-09 16:00:29 +05:30
# define L3_MODULES 3
2011-02-08 14:10:45 +05:30
static int __init omap3_l3_init ( void )
{
struct omap_hwmod * oh ;
2011-07-21 13:48:45 -07:00
struct platform_device * pdev ;
2011-02-08 14:10:45 +05:30
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 06:34:32 -06:00
snprintf ( oh_name , L3_MODULES_MAX_LEN , " l3_main " ) ;
2011-02-08 14:10:45 +05:30
oh = omap_hwmod_lookup ( oh_name ) ;
if ( ! oh )
pr_err ( " could not look up %s \n " , oh_name ) ;
2013-01-26 00:48:53 -07:00
pdev = omap_device_build ( " omap_l3_smx " , 0 , oh , NULL , 0 ) ;
2011-02-08 14:10:45 +05:30
2011-07-21 13:48:45 -07:00
WARN ( IS_ERR ( pdev ) , " could not build omap_device for %s \n " , oh_name ) ;
2011-02-08 14:10:45 +05:30
2011-07-21 13:48:45 -07:00
return IS_ERR ( pdev ) ? PTR_ERR ( pdev ) : 0 ;
2011-02-08 14:10:45 +05:30
}
2013-01-11 11:24:18 -08:00
omap_postcore_initcall ( omap3_l3_init ) ;
2011-02-08 14:10:45 +05:30
2011-03-09 16:00:29 +05:30
static int __init omap4_l3_init ( void )
{
2012-04-13 06:34:32 -06:00
int i ;
2011-03-09 16:00:29 +05:30
struct omap_hwmod * oh [ 3 ] ;
2011-07-21 13:48:45 -07:00
struct platform_device * pdev ;
2011-03-09 16:00:29 +05:30
char oh_name [ L3_MODULES_MAX_LEN ] ;
2011-08-12 13:48:47 +02:00
/* If dtb is there, the devices will be created dynamically */
if ( of_have_populated_dt ( ) )
return - ENODEV ;
2011-03-09 16:00:29 +05:30
/*
* To avoid code running on other OMAPs in
* multi - omap builds
*/
2011-11-04 15:52:59 +05:30
if ( ! cpu_is_omap44xx ( ) & & ! soc_is_omap54xx ( ) )
2011-03-09 16:00:29 +05:30
return - ENODEV ;
for ( i = 0 ; i < L3_MODULES ; i + + ) {
2012-04-13 06:34:32 -06:00
snprintf ( oh_name , L3_MODULES_MAX_LEN , " l3_main_%d " , i + 1 ) ;
2011-03-09 16:00:29 +05:30
oh [ i ] = omap_hwmod_lookup ( oh_name ) ;
if ( ! ( oh [ i ] ) )
pr_err ( " could not look up %s \n " , oh_name ) ;
}
2013-01-26 00:48:53 -07:00
pdev = omap_device_build_ss ( " omap_l3_noc " , 0 , oh , 3 , NULL , 0 ) ;
2011-03-09 16:00:29 +05:30
2011-07-21 13:48:45 -07:00
WARN ( IS_ERR ( pdev ) , " could not build omap_device for %s \n " , oh_name ) ;
2011-03-09 16:00:29 +05:30
2011-07-21 13:48:45 -07:00
return IS_ERR ( pdev ) ? PTR_ERR ( pdev ) : 0 ;
2011-03-09 16:00:29 +05:30
}
2013-01-11 11:24:18 -08:00
omap_postcore_initcall ( omap4_l3_init ) ;
2011-03-09 16:00:29 +05:30
2009-03-23 18:23:49 -07:00
# if defined(CONFIG_VIDEO_OMAP2) || defined(CONFIG_VIDEO_OMAP2_MODULE)
2006-12-07 13:58:10 -08:00
2010-11-15 11:29:54 -03:00
static struct resource omap2cam_resources [ ] = {
2006-12-07 13:58:10 -08:00
{
2009-03-23 18:23:49 -07:00
. start = OMAP24XX_CAMERA_BASE ,
. end = OMAP24XX_CAMERA_BASE + 0xfff ,
. flags = IORESOURCE_MEM ,
} ,
{
2012-08-27 17:43:01 -07:00
. start = 24 + OMAP_INTC_START ,
2009-03-23 18:23:49 -07:00
. flags = IORESOURCE_IRQ ,
}
} ;
2010-11-15 11:29:54 -03:00
static struct platform_device omap2cam_device = {
2009-03-23 18:23:49 -07:00
. name = " omap24xxcam " ,
. id = - 1 ,
2010-11-15 11:29:54 -03:00
. num_resources = ARRAY_SIZE ( omap2cam_resources ) ,
. resource = omap2cam_resources ,
2009-03-23 18:23:49 -07:00
} ;
2009-12-14 08:09:07 -03:00
# endif
2009-03-23 18:23:49 -07:00
2012-01-11 15:28:11 +02:00
# if defined(CONFIG_IOMMU_API)
2012-11-02 12:24:14 -07:00
# include <linux/platform_data/iommu-omap.h>
2012-01-11 15:28:11 +02:00
2009-03-23 18:23:49 -07: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 11:17:33 -03:00
. start = OMAP3430_ISP_CSI2A_REGS1_BASE ,
. end = OMAP3430_ISP_CSI2A_REGS1_END ,
2009-03-23 18:23:49 -07:00
. flags = IORESOURCE_MEM ,
} ,
{
2010-02-02 11: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-23 18:23:49 -07:00
. flags = IORESOURCE_MEM ,
} ,
{
2010-02-02 11: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-23 18:23:49 -07:00
. flags = IORESOURCE_MEM ,
} ,
2012-10-14 07:31:48 -03: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-23 18:23:49 -07:00
{
2012-08-27 17:43:01 -07:00
. start = 24 + OMAP_INTC_START ,
2009-03-23 18:23:49 -07: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 16:44:57 +03:00
static struct omap_iommu_arch_data omap3_isp_iommu = {
2012-11-19 19:05:50 -06:00
. name = " mmu_isp " ,
2011-09-23 16:44:57 +03:00
} ;
2009-12-14 08:09:07 -03:00
int omap3_init_camera ( struct isp_platform_data * pdata )
2009-03-23 18:23:49 -07:00
{
2009-12-14 08:09:07 -03:00
omap3isp_device . dev . platform_data = pdata ;
2011-09-23 16:44:57 +03:00
omap3isp_device . dev . archdata . iommu = & omap3_isp_iommu ;
2009-12-14 08:09:07 -03:00
return platform_device_register ( & omap3isp_device ) ;
2009-03-23 18:23:49 -07:00
}
2012-01-11 15:28:11 +02:00
# else /* !CONFIG_IOMMU_API */
int omap3_init_camera ( struct isp_platform_data * pdata )
{
return 0 ;
}
# endif
2009-03-23 18:23:49 -07:00
static inline void omap_init_camera ( void )
{
2010-11-15 11: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-23 18:23:49 -07:00
# endif
2010-11-15 11:29:54 -03:00
}
2009-03-23 18:23:49 -07:00
2013-02-06 18:58:48 +05:30
# 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 05:51:45 +00:00
int __init omap4_keyboard_init ( struct omap4_keypad_platform_data
2011-07-05 03:38:24 -07:00
* sdp4430_keypad_data , struct omap_board_data * bdata )
2010-12-27 05:51:45 +00:00
{
2011-07-21 13:48:45 -07:00
struct platform_device * pdev ;
2010-12-27 05:51:45 +00: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-21 13:48:45 -07:00
pdev = omap_device_build ( name , id , oh , keypad_data ,
2013-01-26 00:48:53 -07:00
sizeof ( struct omap4_keypad_platform_data ) ) ;
2010-12-27 05:51:45 +00:00
2011-07-21 13:48:45 -07:00
if ( IS_ERR ( pdev ) ) {
2011-03-30 22:57:33 -03:00
WARN ( 1 , " Can't build omap_device for %s:%s. \n " ,
2010-12-27 05:51:45 +00:00
name , oh - > name ) ;
2011-07-21 13:48:45 -07:00
return PTR_ERR ( pdev ) ;
2010-12-27 05:51:45 +00:00
}
2011-07-05 03:38:24 -07:00
oh - > mux = omap_hwmod_mux_init ( bdata - > pads , bdata - > pads_cnt ) ;
2010-12-27 05:51:45 +00:00
return 0 ;
}
2009-03-23 18:07:23 -07:00
# if defined(CONFIG_OMAP_MBOX_FWK) || defined(CONFIG_OMAP_MBOX_FWK_MODULE)
2012-02-20 09:43:30 -08:00
static inline void __init omap_init_mbox ( void )
2006-12-07 13:58:10 -08:00
{
2011-02-24 12:51:33 -08:00
struct omap_hwmod * oh ;
2011-07-21 13:48:45 -07:00
struct platform_device * pdev ;
2013-01-28 17:21:58 -06:00
struct omap_mbox_pdata * pdata ;
2011-02-24 12:51:33 -08:00
oh = omap_hwmod_lookup ( " mailbox " ) ;
if ( ! oh ) {
pr_err ( " %s: unable to find hwmod \n " , __func__ ) ;
2009-03-23 18:07:23 -07:00
return ;
}
2013-01-28 17:21:58 -06:00
if ( ! oh - > dev_attr ) {
pr_err ( " %s: hwmod doesn't have valid attrs \n " , __func__ ) ;
return ;
}
2011-02-24 12:51:33 -08:00
2013-01-28 17:21:58 -06:00
pdata = ( struct omap_mbox_pdata * ) oh - > dev_attr ;
pdev = omap_device_build ( " omap-mailbox " , - 1 , oh , pdata , sizeof ( * pdata ) ) ;
2011-07-21 13:48:45 -07:00
WARN ( IS_ERR ( pdev ) , " %s: could not build device, err %ld \n " ,
__func__ , PTR_ERR ( pdev ) ) ;
2006-12-07 13:58:10 -08:00
}
# else
static inline void omap_init_mbox ( void ) { }
2009-03-23 18:07:23 -07:00
# endif /* CONFIG_OMAP_MBOX_FWK */
2006-12-07 13:58:10 -08:00
2006-04-02 17:46:30 +01:00
static inline void omap_init_sti ( void ) { }
2010-03-17 20:15:21 +00: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-12 22:28:56 -06:00
# if defined(CONFIG_SND_OMAP_SOC_MCPDM) || \
defined ( CONFIG_SND_OMAP_SOC_MCPDM_MODULE )
2012-02-20 09:43:30 -08:00
static void __init omap_init_mcpdm ( void )
2011-02-12 22:28:56 -06:00
{
struct omap_hwmod * oh ;
2011-11-03 10:41:22 +02:00
struct platform_device * pdev ;
2011-02-12 22:28:56 -06:00
oh = omap_hwmod_lookup ( " mcpdm " ) ;
if ( ! oh ) {
printk ( KERN_ERR " Could not look up mcpdm hw_mod \n " ) ;
return ;
}
2013-01-26 00:48:53 -07:00
pdev = omap_device_build ( " omap-mcpdm " , - 1 , oh , NULL , 0 ) ;
2011-11-03 10:41:22 +02:00
WARN ( IS_ERR ( pdev ) , " Can't build omap_device for omap-mcpdm. \n " ) ;
2011-02-12 22:28:56 -06:00
}
# else
static inline void omap_init_mcpdm ( void ) { }
# endif
2011-12-13 10:48:54 -08:00
# if defined(CONFIG_SND_OMAP_SOC_DMIC) || \
defined ( CONFIG_SND_OMAP_SOC_DMIC_MODULE )
2012-02-20 09:43:30 -08:00
static void __init omap_init_dmic ( void )
2011-12-13 10:48:54 -08:00
{
struct omap_hwmod * oh ;
struct platform_device * pdev ;
oh = omap_hwmod_lookup ( " dmic " ) ;
if ( ! oh ) {
2012-10-16 11:19:17 -07:00
pr_err ( " Could not look up dmic hw_mod \n " ) ;
2011-12-13 10:48:54 -08:00
return ;
}
2013-01-26 00:48:53 -07:00
pdev = omap_device_build ( " omap-dmic " , - 1 , oh , NULL , 0 ) ;
2011-12-13 10:48:54 -08:00
WARN ( IS_ERR ( pdev ) , " Can't build omap_device for omap-dmic. \n " ) ;
}
# else
static inline void omap_init_dmic ( void ) { }
# endif
2012-05-09 14:19:14 -07: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 ;
}
2013-02-12 03:58:35 +00:00
pdev = omap_device_build ( " omap-hdmi-audio-dai " , - 1 , oh , NULL , 0 ) ;
2012-05-09 14:19:14 -07:00
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 15:49:36 +03:00
# if defined(CONFIG_SPI_OMAP24XX) || defined(CONFIG_SPI_OMAP24XX_MODULE)
2006-06-26 16:16:10 -07:00
2012-08-24 15:21:06 +02:00
# include <linux/platform_data/spi-omap2-mcspi.h>
2006-06-26 16:16:10 -07:00
2012-02-20 09:43:30 -08:00
static int __init omap_mcspi_init ( struct omap_hwmod * oh , void * unused )
2009-09-24 16:23:05 -07:00
{
2011-07-21 13:48:45 -07:00
struct platform_device * pdev ;
2011-02-02 17:52:14 +05:30
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-24 16:23:05 -07:00
2011-02-02 17:52:14 +05:30
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 18:39:31 +01:00
kfree ( pdata ) ;
2011-02-02 17:52:14 +05:30
return - EINVAL ;
}
2009-09-24 16:23:05 -07:00
2011-02-02 17:52:14 +05:30
spi_num + + ;
2013-01-26 00:48:53 -07:00
pdev = omap_device_build ( name , spi_num , oh , pdata , sizeof ( * pdata ) ) ;
2011-07-21 13:48:45 -07:00
WARN ( IS_ERR ( pdev ) , " Can't build omap_device for %s:%s \n " ,
2011-02-02 17:52:14 +05:30
name , oh - > name ) ;
kfree ( pdata ) ;
return 0 ;
2009-09-24 16:23:05 -07:00
}
static void omap_init_mcspi ( void )
{
2011-02-02 17:52:14 +05:30
omap_hwmod_for_each_by_class ( " mcspi " , omap_mcspi_init , NULL ) ;
2006-06-26 16:16:10 -07:00
}
# else
static inline void omap_init_mcspi ( void ) { }
# endif
2012-09-23 17:28:27 -06: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 ;
2013-01-26 00:48:53 -07:00
pdev = omap_device_build ( " omap_rng " , - 1 , oh , NULL , 0 ) ;
2012-09-23 17:28:27 -06:00
WARN ( IS_ERR ( pdev ) , " Can't build omap_device for omap_rng \n " ) ;
}
2010-04-09 13:54:43 +01:00
2013-03-18 10:06:32 -06:00
static void __init omap_init_sham ( void )
2008-10-06 15:49:36 +03:00
{
2013-03-18 10:06:33 -06:00
struct omap_hwmod * oh ;
struct platform_device * pdev ;
oh = omap_hwmod_lookup ( " sham " ) ;
if ( ! oh )
return ;
pdev = omap_device_build ( " omap-sham " , - 1 , oh , NULL , 0 ) ;
WARN ( IS_ERR ( pdev ) , " Can't build omap_device for omap-sham \n " ) ;
2008-10-06 15:49:36 +03:00
}
2012-12-21 09:28:10 -07:00
static void __init omap_init_aes ( void )
2010-09-03 19:13:55 +08:00
{
2012-12-21 09:28:11 -07:00
struct omap_hwmod * oh ;
struct platform_device * pdev ;
oh = omap_hwmod_lookup ( " aes " ) ;
if ( ! oh )
return ;
pdev = omap_device_build ( " omap-aes " , - 1 , oh , NULL , 0 ) ;
WARN ( IS_ERR ( pdev ) , " Can't build omap_device for omap-aes \n " ) ;
2010-09-03 19:13:55 +08:00
}
2008-12-10 17:37:16 -08:00
/*-------------------------------------------------------------------------*/
2010-05-10 14:29:14 -07: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 19:05:56 +05:30
# 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 10:17:03 -08:00
static void __init omap_init_ocp2scp ( void )
2012-10-27 19:05:56 +05:30
{
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 ;
2013-01-26 00:48:53 -07:00
pdev = omap_device_build ( name , bus_id , oh , pdata , sizeof ( * pdata ) ) ;
2012-10-27 19:05:56 +05:30
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 14:26:51 +00:00
/*-------------------------------------------------------------------------*/
static int __init omap2_init_devices ( void )
{
2012-09-17 16:26:11 -07:00
/* Enable dummy states for those platforms without pinctrl support */
if ( ! of_have_populated_dt ( ) )
pinctrl_provide_dummies ( ) ;
2010-12-21 19:56:17 -07:00
/*
* please keep these calls , and their implementations above ,
2005-11-10 14:26:51 +00:00
* in alphabetical order so they ' re easier to sort through .
*/
2010-03-17 20:15:21 +00:00
omap_init_audio ( ) ;
2009-03-23 18:23:49 -07:00
omap_init_camera ( ) ;
2012-05-09 14:19:14 -07:00
omap_init_hdmi_audio ( ) ;
2006-12-07 13:58:10 -08:00
omap_init_mbox ( ) ;
2012-01-20 14:15:58 +01:00
/* If dtb is there, the devices will be created dynamically */
2012-05-02 15:23:18 +03:00
if ( ! of_have_populated_dt ( ) ) {
2013-02-06 18:58:48 +05:30
omap_init_control_usb ( ) ;
2012-05-02 15:23:18 +03:00
omap_init_dmic ( ) ;
2012-05-02 15:23:19 +03:00
omap_init_mcpdm ( ) ;
2012-01-20 14:15:58 +01:00
omap_init_mcspi ( ) ;
2013-03-18 10:06:33 -06:00
omap_init_sham ( ) ;
2012-12-21 09:28:12 -07:00
omap_init_aes ( ) ;
2012-05-02 15:23:18 +03:00
}
2006-04-02 17:46:30 +01:00
omap_init_sti ( ) ;
2012-09-23 17:28:27 -06:00
omap_init_rng ( ) ;
2010-05-10 14:29:14 -07:00
omap_init_vout ( ) ;
2012-10-27 19:05:56 +05:30
omap_init_ocp2scp ( ) ;
2005-11-10 14:26:51 +00:00
return 0 ;
}
2013-01-11 11:24:18 -08:00
omap_arch_initcall ( omap2_init_devices ) ;