2019-05-27 08:55:01 +02:00
// SPDX-License-Identifier: GPL-2.0-or-later
2008-09-07 23:41:28 -07:00
/*
* mach - davinci / devices . c
*
* DaVinci platform device setup / initialization
*/
# include <linux/init.h>
# include <linux/platform_device.h>
2019-02-14 15:52:03 +01:00
# include <linux/platform_data/i2c-davinci.h>
# include <linux/platform_data/mmc-davinci.h>
# include <linux/platform_data/edma.h>
2008-09-07 23:41:28 -07:00
# include <linux/dma-mapping.h>
# include <linux/io.h>
2013-07-08 16:01:40 -07:00
# include <linux/reboot.h>
2008-09-07 23:41:28 -07:00
2022-04-28 09:32:09 +02:00
# include "hardware.h"
# include "cputype.h"
# include "mux.h"
2011-12-21 19:13:36 +05:30
# include "davinci.h"
2019-02-14 15:52:03 +01:00
# include "irqs.h"
2010-02-25 15:36:38 -08:00
2009-04-14 07:04:16 -05:00
# define DAVINCI_I2C_BASE 0x01C21000
2010-04-21 18:11:33 +04:00
# define DAVINCI_ATA_BASE 0x01C66000
2009-05-11 15:55:03 -07:00
# define DAVINCI_MMCSD0_BASE 0x01E10000
# define DM355_MMCSD0_BASE 0x01E11000
# define DM355_MMCSD1_BASE 0x01E00000
2009-06-20 13:58:32 -04:00
# define DM365_MMCSD0_BASE 0x01D11000
# define DM365_MMCSD1_BASE 0x01D00000
2009-04-14 07:04:16 -05:00
2011-12-21 19:13:36 +05:30
void __iomem * davinci_sysmod_base ;
void davinci_map_sysmod ( void )
{
2020-01-06 09:43:50 +01:00
davinci_sysmod_base = ioremap ( DAVINCI_SYSTEM_MODULE_BASE ,
2011-12-21 19:13:36 +05:30
0x800 ) ;
/*
* Throw a bug since a lot of board initialization code depends
* on system module availability . ioremap ( ) failing this early
* need careful looking into anyway .
*/
BUG_ON ( ! davinci_sysmod_base ) ;
}
2011-05-23 21:05:48 +05:30
2008-09-07 23:41:28 -07:00
static struct resource i2c_resources [ ] = {
{
. start = DAVINCI_I2C_BASE ,
. end = DAVINCI_I2C_BASE + 0x40 ,
. flags = IORESOURCE_MEM ,
} ,
{
2019-02-14 15:52:01 +01:00
. start = DAVINCI_INTC_IRQ ( IRQ_I2C ) ,
2008-09-07 23:41:28 -07:00
. flags = IORESOURCE_IRQ ,
} ,
} ;
static struct platform_device davinci_i2c_device = {
. name = " i2c_davinci " ,
. id = 1 ,
. num_resources = ARRAY_SIZE ( i2c_resources ) ,
. resource = i2c_resources ,
} ;
void __init davinci_init_i2c ( struct davinci_i2c_platform_data * pdata )
{
2009-04-14 09:50:37 -05:00
if ( cpu_is_davinci_dm644x ( ) )
davinci_cfg_reg ( DM644X_I2C ) ;
2008-09-07 23:41:28 -07:00
davinci_i2c_device . dev . platform_data = pdata ;
( void ) platform_device_register ( & davinci_i2c_device ) ;
}
2010-04-21 18:11:33 +04:00
static struct resource ide_resources [ ] = {
{
. start = DAVINCI_ATA_BASE ,
. end = DAVINCI_ATA_BASE + 0x7ff ,
. flags = IORESOURCE_MEM ,
} ,
{
2019-02-14 15:52:01 +01:00
. start = DAVINCI_INTC_IRQ ( IRQ_IDE ) ,
. end = DAVINCI_INTC_IRQ ( IRQ_IDE ) ,
2010-04-21 18:11:33 +04:00
. flags = IORESOURCE_IRQ ,
} ,
} ;
static u64 ide_dma_mask = DMA_BIT_MASK ( 32 ) ;
static struct platform_device ide_device = {
. name = " palm_bk3710 " ,
. id = - 1 ,
. resource = ide_resources ,
. num_resources = ARRAY_SIZE ( ide_resources ) ,
. dev = {
. dma_mask = & ide_dma_mask ,
. coherent_dma_mask = DMA_BIT_MASK ( 32 ) ,
} ,
} ;
void __init davinci_init_ide ( void )
{
if ( cpu_is_davinci_dm644x ( ) ) {
davinci_cfg_reg ( DM644X_HPIEN_DISABLE ) ;
davinci_cfg_reg ( DM644X_ATAEN ) ;
davinci_cfg_reg ( DM644X_HDIREN ) ;
} else if ( cpu_is_davinci_dm646x ( ) ) {
/* IRQ_DM646X_IDE is the same as IRQ_IDE */
davinci_cfg_reg ( DM646X_ATAEN ) ;
} else {
WARN_ON ( 1 ) ;
return ;
}
platform_device_register ( & ide_device ) ;
}
2013-04-01 12:43:44 +05:30
# if IS_ENABLED(CONFIG_MMC_DAVINCI)
2009-05-11 15:55:03 -07:00
2009-05-29 18:54:14 +01:00
static u64 mmcsd0_dma_mask = DMA_BIT_MASK ( 32 ) ;
2009-05-11 15:55:03 -07:00
static struct resource mmcsd0_resources [ ] = {
{
/* different on dm355 */
. start = DAVINCI_MMCSD0_BASE ,
. end = DAVINCI_MMCSD0_BASE + SZ_4K - 1 ,
. flags = IORESOURCE_MEM ,
} ,
/* IRQs: MMC/SD, then SDIO */
{
2019-02-14 15:52:01 +01:00
. start = DAVINCI_INTC_IRQ ( IRQ_MMCINT ) ,
2009-05-11 15:55:03 -07:00
. flags = IORESOURCE_IRQ ,
} , {
/* different on dm355 */
2019-02-14 15:52:01 +01:00
. start = DAVINCI_INTC_IRQ ( IRQ_SDIOINT ) ,
2009-05-11 15:55:03 -07:00
. flags = IORESOURCE_IRQ ,
} ,
} ;
static struct platform_device davinci_mmcsd0_device = {
2013-03-28 18:41:59 +05:30
. name = " dm6441-mmc " ,
2009-05-11 15:55:03 -07:00
. id = 0 ,
. dev = {
. dma_mask = & mmcsd0_dma_mask ,
2009-05-29 18:54:14 +01:00
. coherent_dma_mask = DMA_BIT_MASK ( 32 ) ,
2009-05-11 15:55:03 -07:00
} ,
. num_resources = ARRAY_SIZE ( mmcsd0_resources ) ,
. resource = mmcsd0_resources ,
} ;
2009-05-29 18:54:14 +01:00
static u64 mmcsd1_dma_mask = DMA_BIT_MASK ( 32 ) ;
2009-05-11 15:55:03 -07:00
static struct resource mmcsd1_resources [ ] = {
{
. start = DM355_MMCSD1_BASE ,
. end = DM355_MMCSD1_BASE + SZ_4K - 1 ,
. flags = IORESOURCE_MEM ,
} ,
/* IRQs: MMC/SD, then SDIO */
{
2019-02-14 15:52:01 +01:00
. start = DAVINCI_INTC_IRQ ( IRQ_DM355_MMCINT1 ) ,
2009-05-11 15:55:03 -07:00
. flags = IORESOURCE_IRQ ,
} , {
2019-02-14 15:52:01 +01:00
. start = DAVINCI_INTC_IRQ ( IRQ_DM355_SDIOINT1 ) ,
2009-05-11 15:55:03 -07:00
. flags = IORESOURCE_IRQ ,
} ,
} ;
static struct platform_device davinci_mmcsd1_device = {
2013-03-28 18:41:59 +05:30
. name = " dm6441-mmc " ,
2009-05-11 15:55:03 -07:00
. id = 1 ,
. dev = {
. dma_mask = & mmcsd1_dma_mask ,
2009-05-29 18:54:14 +01:00
. coherent_dma_mask = DMA_BIT_MASK ( 32 ) ,
2009-05-11 15:55:03 -07:00
} ,
. num_resources = ARRAY_SIZE ( mmcsd1_resources ) ,
. resource = mmcsd1_resources ,
} ;
void __init davinci_setup_mmc ( int module , struct davinci_mmc_config * config )
{
struct platform_device * pdev = NULL ;
if ( WARN_ON ( cpu_is_davinci_dm646x ( ) ) )
return ;
/* REVISIT: update PINMUX, ARM_IRQMUX, and EDMA_EVTMUX here too;
* for example if MMCSD1 is used for SDIO , maybe DAT2 is unused .
*
* FIXME dm6441 ( no MMC / SD ) , dm357 ( one ) , and dm335 ( two ) are
* not handled right here . . .
*/
switch ( module ) {
case 1 :
2009-06-20 13:58:32 -04:00
if ( cpu_is_davinci_dm355 ( ) ) {
/* REVISIT we may not need all these pins if e.g. this
* is a hard - wired SDIO device . . .
*/
davinci_cfg_reg ( DM355_SD1_CMD ) ;
davinci_cfg_reg ( DM355_SD1_CLK ) ;
davinci_cfg_reg ( DM355_SD1_DATA0 ) ;
davinci_cfg_reg ( DM355_SD1_DATA1 ) ;
davinci_cfg_reg ( DM355_SD1_DATA2 ) ;
davinci_cfg_reg ( DM355_SD1_DATA3 ) ;
} else if ( cpu_is_davinci_dm365 ( ) ) {
/* Configure pull down control */
2011-12-21 19:13:36 +05:30
unsigned v ;
v = __raw_readl ( DAVINCI_SYSMOD_VIRT ( SYSMOD_PUPDCTL1 ) ) ;
__raw_writel ( v & ~ 0xfc0 ,
DAVINCI_SYSMOD_VIRT ( SYSMOD_PUPDCTL1 ) ) ;
2009-06-20 13:58:32 -04:00
mmcsd1_resources [ 0 ] . start = DM365_MMCSD1_BASE ;
mmcsd1_resources [ 0 ] . end = DM365_MMCSD1_BASE +
SZ_4K - 1 ;
2019-02-14 15:52:01 +01:00
mmcsd1_resources [ 2 ] . start = DAVINCI_INTC_IRQ (
IRQ_DM365_SDIOINT1 ) ;
2013-03-28 18:41:59 +05:30
davinci_mmcsd1_device . name = " da830-mmc " ;
2009-06-20 13:58:32 -04:00
} else
2009-05-11 15:55:03 -07:00
break ;
pdev = & davinci_mmcsd1_device ;
break ;
case 0 :
if ( cpu_is_davinci_dm355 ( ) ) {
mmcsd0_resources [ 0 ] . start = DM355_MMCSD0_BASE ;
mmcsd0_resources [ 0 ] . end = DM355_MMCSD0_BASE + SZ_4K - 1 ;
2019-02-14 15:52:01 +01:00
mmcsd0_resources [ 2 ] . start = DAVINCI_INTC_IRQ (
IRQ_DM355_SDIOINT0 ) ;
2009-05-11 15:55:03 -07:00
/* expose all 6 MMC0 signals: CLK, CMD, DATA[0..3] */
davinci_cfg_reg ( DM355_MMCSD0 ) ;
/* enable RX EDMA */
davinci_cfg_reg ( DM355_EVT26_MMC0_RX ) ;
2009-06-20 13:58:32 -04:00
} else if ( cpu_is_davinci_dm365 ( ) ) {
mmcsd0_resources [ 0 ] . start = DM365_MMCSD0_BASE ;
mmcsd0_resources [ 0 ] . end = DM365_MMCSD0_BASE +
SZ_4K - 1 ;
2019-02-14 15:52:01 +01:00
mmcsd0_resources [ 2 ] . start = DAVINCI_INTC_IRQ (
IRQ_DM365_SDIOINT0 ) ;
2013-03-28 18:41:59 +05:30
davinci_mmcsd0_device . name = " da830-mmc " ;
2009-06-20 13:58:32 -04:00
} else if ( cpu_is_davinci_dm644x ( ) ) {
2009-05-11 15:55:03 -07:00
/* REVISIT: should this be in board-init code? */
/* Power-on 3.3V IO cells */
2011-12-21 19:13:36 +05:30
__raw_writel ( 0 ,
DAVINCI_SYSMOD_VIRT ( SYSMOD_VDD3P3VPWDN ) ) ;
2009-05-11 15:55:03 -07:00
/*Set up the pull regiter for MMC */
davinci_cfg_reg ( DM644X_MSTK ) ;
}
pdev = & davinci_mmcsd0_device ;
break ;
}
if ( WARN_ON ( ! pdev ) )
return ;
pdev - > dev . platform_data = config ;
platform_device_register ( pdev ) ;
}
# else
void __init davinci_setup_mmc ( int module , struct davinci_mmc_config * config )
{
}
# endif
2009-04-29 16:23:59 -07:00
/*-------------------------------------------------------------------------*/
static struct resource wdt_resources [ ] = {
{
2009-06-03 12:24:50 -07:00
. start = DAVINCI_WDOG_BASE ,
. end = DAVINCI_WDOG_BASE + SZ_1K - 1 ,
2009-04-29 16:23:59 -07:00
. flags = IORESOURCE_MEM ,
} ,
} ;
2018-01-06 21:10:15 -06:00
static struct platform_device davinci_wdt_device = {
2013-11-27 15:31:53 +02:00
. name = " davinci-wdt " ,
2009-04-29 16:23:59 -07:00
. id = - 1 ,
. num_resources = ARRAY_SIZE ( wdt_resources ) ,
. resource = wdt_resources ,
} ;
2014-02-26 10:29:43 +05:30
int davinci_init_wdt ( void )
2009-04-29 16:23:59 -07:00
{
2014-02-26 10:29:43 +05:30
return platform_device_register ( & davinci_wdt_device ) ;
2009-04-29 16:23:59 -07:00
}
2013-08-18 10:49:00 +05:30
static struct platform_device davinci_gpio_device = {
. name = " davinci_gpio " ,
. id = - 1 ,
} ;
int davinci_gpio_register ( struct resource * res , int size , void * pdata )
{
davinci_gpio_device . resource = res ;
davinci_gpio_device . num_resources = size ;
davinci_gpio_device . dev . platform_data = pdata ;
return platform_device_register ( & davinci_gpio_device ) ;
}