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>
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"
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"
2013-09-16 11:18:31 +04:00
# include "display.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
*/
2014-11-05 20:21:23 +03:00
if ( ! ( cpu_is_omap34xx ( ) ) | | of_have_populated_dt ( ) )
2011-02-08 11:40:45 +03:00
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 ) ;
2013-01-26 11:48:53 +04:00
pdev = omap_device_build ( " omap_l3_smx " , 0 , oh , NULL , 0 ) ;
2011-02-08 11:40:45 +03:00
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
2015-05-20 22:32:26 +03:00
return PTR_ERR_OR_ZERO ( pdev ) ;
2011-02-08 11:40:45 +03:00
}
2013-01-11 23:24:18 +04:00
omap_postcore_initcall ( omap3_l3_init ) ;
2011-02-08 11:40:45 +03:00
2006-04-02 20:46:30 +04:00
static inline void omap_init_sti ( void ) { }
2016-08-11 22:29:45 +03:00
# if IS_ENABLED(CONFIG_SPI_OMAP24XX)
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 + + ;
2013-01-26 11:48:53 +04:00
pdev = omap_device_build ( name , spi_num , oh , pdata , sizeof ( * pdata ) ) ;
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 ;
2013-01-26 11:48:53 +04:00
pdev = omap_device_build ( " omap_rng " , - 1 , oh , NULL , 0 ) ;
2012-09-24 03:28:27 +04:00
WARN ( IS_ERR ( pdev ) , " Can't build omap_device for omap_rng \n " ) ;
}
2010-04-09 16:54:43 +04:00
2013-03-18 20:06:32 +04:00
static void __init omap_init_sham ( void )
2008-10-06 16:49:36 +04:00
{
2013-03-18 20:06:33 +04: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 16:49:36 +04:00
}
2012-12-21 20:28:10 +04:00
static void __init omap_init_aes ( void )
2010-09-03 15:13:55 +04:00
{
2012-12-21 20:28:11 +04: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 15:13:55 +04:00
}
2008-12-11 04:37:16 +03:00
/*-------------------------------------------------------------------------*/
2016-08-11 22:29:45 +03:00
# if IS_ENABLED(CONFIG_VIDEO_OMAP2_VOUT)
# if IS_ENABLED(CONFIG_FB_OMAP2)
2010-05-11 01:29:14 +04:00
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 ,
} ;
2013-09-16 11:18:31 +04:00
int __init omap_init_vout ( void )
2010-05-11 01:29:14 +04:00
{
2013-09-16 11:18:31 +04:00
return platform_device_register ( & omap_vout_device ) ;
2010-05-11 01:29:14 +04:00
}
# else
2013-09-16 11:18:31 +04:00
int __init omap_init_vout ( void ) { return 0 ; }
2010-05-11 01:29:14 +04:00
# 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 ( ) ;
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 ( ) ) {
2015-12-11 15:50:20 +03:00
/*
* please keep these calls , and their implementations above ,
* in alphabetical order so they ' re easier to sort through .
*/
2012-01-20 17:15:58 +04:00
omap_init_mcspi ( ) ;
2013-03-18 20:06:33 +04:00
omap_init_sham ( ) ;
2012-12-21 20:28:12 +04:00
omap_init_aes ( ) ;
2013-08-05 18:47:22 +04:00
omap_init_rng ( ) ;
2012-05-02 16:23:18 +04:00
}
2006-04-02 20:46:30 +04:00
omap_init_sti ( ) ;
2005-11-10 17:26:51 +03:00
return 0 ;
}
2013-01-11 23:24:18 +04:00
omap_arch_initcall ( omap2_init_devices ) ;
2014-11-20 23:45:43 +03:00
static int __init omap_gpmc_init ( void )
{
struct omap_hwmod * oh ;
struct platform_device * pdev ;
char * oh_name = " gpmc " ;
/*
* if the board boots up with a populated DT , do not
* manually add the device from this initcall
*/
if ( of_have_populated_dt ( ) )
return - ENODEV ;
oh = omap_hwmod_lookup ( oh_name ) ;
if ( ! oh ) {
pr_err ( " Could not look up %s \n " , oh_name ) ;
return - ENODEV ;
}
pdev = omap_device_build ( " omap-gpmc " , - 1 , oh , NULL , 0 ) ;
WARN ( IS_ERR ( pdev ) , " could not build omap_device for %s \n " , oh_name ) ;
2015-05-20 22:32:26 +03:00
return PTR_ERR_OR_ZERO ( pdev ) ;
2014-11-20 23:45:43 +03:00
}
omap_postcore_initcall ( omap_gpmc_init ) ;