2018-12-28 00:32:03 -08:00
// SPDX-License-Identifier: GPL-2.0
2007-07-25 17:50:01 +09:00
/*
* SH3 Setup code for SH7706 , SH7707 , SH7708 , SH7709
*
* Copyright ( C ) 2007 Magnus Damm
2009-03-06 19:20:14 +09:00
* Copyright ( C ) 2009 Paul Mundt
2007-07-25 17:50:01 +09:00
*
* Based on setup - sh7709 . c
*
* Copyright ( C ) 2006 Paul Mundt
*/
# include <linux/init.h>
# include <linux/io.h>
# include <linux/irq.h>
# include <linux/platform_device.h>
# include <linux/serial.h>
2008-02-26 14:52:45 +09:00
# include <linux/serial_sci.h>
2009-05-12 10:04:49 +00:00
# include <linux/sh_timer.h>
2012-05-18 14:34:48 +09:00
# include <linux/sh_intc.h>
2011-06-14 12:40:19 +09:00
# include <cpu/serial.h>
2019-10-03 11:29:12 +02:00
# include <asm/platform_early.h>
2007-07-25 17:50:01 +09:00
enum {
UNUSED = 0 ,
/* interrupt sources */
IRQ0 , IRQ1 , IRQ2 , IRQ3 , IRQ4 , IRQ5 ,
PINT07 , PINT815 ,
2009-03-06 19:20:14 +09:00
DMAC , SCIF0 , SCIF2 , SCI , ADC_ADI ,
2007-07-26 10:12:50 +09:00
LCDC , PCC0 , PCC1 ,
2009-03-06 19:20:14 +09:00
TMU0 , TMU1 , TMU2 ,
RTC , WDT , REF ,
2007-07-25 17:50:01 +09:00
} ;
2007-08-17 00:45:35 +09:00
static struct intc_vect vectors [ ] __initdata = {
2007-07-25 17:50:01 +09:00
INTC_VECT ( TMU0 , 0x400 ) , INTC_VECT ( TMU1 , 0x420 ) ,
2009-03-06 19:20:14 +09:00
INTC_VECT ( TMU2 , 0x440 ) , INTC_VECT ( TMU2 , 0x460 ) ,
INTC_VECT ( RTC , 0x480 ) , INTC_VECT ( RTC , 0x4a0 ) ,
INTC_VECT ( RTC , 0x4c0 ) ,
INTC_VECT ( SCI , 0x4e0 ) , INTC_VECT ( SCI , 0x500 ) ,
INTC_VECT ( SCI , 0x520 ) , INTC_VECT ( SCI , 0x540 ) ,
2007-07-25 17:50:01 +09:00
INTC_VECT ( WDT , 0x560 ) ,
2009-03-06 19:20:14 +09:00
INTC_VECT ( REF , 0x580 ) ,
INTC_VECT ( REF , 0x5a0 ) ,
2007-07-25 17:50:01 +09:00
# if defined(CONFIG_CPU_SUBTYPE_SH7706) || \
defined ( CONFIG_CPU_SUBTYPE_SH7707 ) | | \
defined ( CONFIG_CPU_SUBTYPE_SH7709 )
2008-04-24 21:30:09 +09:00
/* IRQ0->5 are handled in setup-sh3.c */
2009-03-06 19:20:14 +09:00
INTC_VECT ( DMAC , 0x800 ) , INTC_VECT ( DMAC , 0x820 ) ,
INTC_VECT ( DMAC , 0x840 ) , INTC_VECT ( DMAC , 0x860 ) ,
2007-07-25 17:50:01 +09:00
INTC_VECT ( ADC_ADI , 0x980 ) ,
2009-03-06 19:20:14 +09:00
INTC_VECT ( SCIF2 , 0x900 ) , INTC_VECT ( SCIF2 , 0x920 ) ,
INTC_VECT ( SCIF2 , 0x940 ) , INTC_VECT ( SCIF2 , 0x960 ) ,
2007-07-25 17:50:01 +09:00
# endif
# if defined(CONFIG_CPU_SUBTYPE_SH7707) || \
defined ( CONFIG_CPU_SUBTYPE_SH7709 )
INTC_VECT ( PINT07 , 0x700 ) , INTC_VECT ( PINT815 , 0x720 ) ,
2009-03-06 19:20:14 +09:00
INTC_VECT ( SCIF0 , 0x880 ) , INTC_VECT ( SCIF0 , 0x8a0 ) ,
INTC_VECT ( SCIF0 , 0x8c0 ) , INTC_VECT ( SCIF0 , 0x8e0 ) ,
2007-07-25 17:50:01 +09:00
# endif
2007-07-26 10:12:50 +09:00
# if defined(CONFIG_CPU_SUBTYPE_SH7707)
INTC_VECT ( LCDC , 0x9a0 ) ,
INTC_VECT ( PCC0 , 0x9c0 ) , INTC_VECT ( PCC1 , 0x9e0 ) ,
# endif
2007-07-25 17:50:01 +09:00
} ;
2007-08-17 00:45:35 +09:00
static struct intc_prio_reg prio_registers [ ] __initdata = {
2007-08-12 15:22:02 +09:00
{ 0xfffffee2 , 0 , 16 , 4 , /* IPRA */ { TMU0 , TMU1 , TMU2 , RTC } } ,
{ 0xfffffee4 , 0 , 16 , 4 , /* IPRB */ { WDT , REF , SCI , 0 } } ,
2007-07-25 17:50:01 +09:00
# if defined(CONFIG_CPU_SUBTYPE_SH7706) || \
defined ( CONFIG_CPU_SUBTYPE_SH7707 ) | | \
defined ( CONFIG_CPU_SUBTYPE_SH7709 )
2007-08-12 15:22:02 +09:00
{ 0xa4000016 , 0 , 16 , 4 , /* IPRC */ { IRQ3 , IRQ2 , IRQ1 , IRQ0 } } ,
{ 0xa4000018 , 0 , 16 , 4 , /* IPRD */ { 0 , 0 , IRQ5 , IRQ4 } } ,
{ 0xa400001a , 0 , 16 , 4 , /* IPRE */ { DMAC , 0 , SCIF2 , ADC_ADI } } ,
2007-07-25 17:50:01 +09:00
# endif
# if defined(CONFIG_CPU_SUBTYPE_SH7707) || \
defined ( CONFIG_CPU_SUBTYPE_SH7709 )
2007-08-12 15:22:02 +09:00
{ 0xa4000018 , 0 , 16 , 4 , /* IPRD */ { PINT07 , PINT815 , } } ,
{ 0xa400001a , 0 , 16 , 4 , /* IPRE */ { 0 , SCIF0 } } ,
2007-07-25 17:50:01 +09:00
# endif
2007-07-26 10:12:50 +09:00
# if defined(CONFIG_CPU_SUBTYPE_SH7707)
2007-08-12 15:22:02 +09:00
{ 0xa400001c , 0 , 16 , 4 , /* IPRF */ { 0 , LCDC , PCC0 , PCC1 , } } ,
2007-07-26 10:12:50 +09:00
# endif
2007-07-25 17:50:01 +09:00
} ;
2009-03-06 19:20:14 +09:00
static DECLARE_INTC_DESC ( intc_desc , " sh770x " , vectors , NULL ,
2008-01-10 14:08:55 +09:00
NULL , prio_registers , NULL ) ;
2007-07-25 17:50:01 +09:00
static struct resource rtc_resources [ ] = {
[ 0 ] = {
. start = 0xfffffec0 ,
. end = 0xfffffec0 + 0x1e ,
. flags = IORESOURCE_IO ,
} ,
[ 1 ] = {
2012-05-18 14:34:48 +09:00
. start = evt2irq ( 0x480 ) ,
2007-07-25 17:50:01 +09:00
. flags = IORESOURCE_IRQ ,
} ,
} ;
static struct platform_device rtc_device = {
. name = " sh-rtc " ,
. id = - 1 ,
. num_resources = ARRAY_SIZE ( rtc_resources ) ,
. resource = rtc_resources ,
} ;
2009-12-14 12:30:05 +00:00
static struct plat_sci_port scif0_platform_data = {
. type = PORT_SCI ,
2011-06-14 12:40:19 +09:00
. ops = & sh770x_sci_port_ops ,
2009-12-14 12:30:05 +00:00
} ;
2013-12-06 10:59:48 +01:00
static struct resource scif0_resources [ ] = {
2014-10-29 14:50:59 -07:00
DEFINE_RES_MEM ( 0xfffffe80 , 0x10 ) ,
2013-12-06 10:59:48 +01:00
DEFINE_RES_IRQ ( evt2irq ( 0x4e0 ) ) ,
} ;
2009-12-14 12:30:05 +00:00
static struct platform_device scif0_device = {
. name = " sh-sci " ,
. id = 0 ,
2013-12-06 10:59:48 +01:00
. resource = scif0_resources ,
. num_resources = ARRAY_SIZE ( scif0_resources ) ,
2009-12-14 12:30:05 +00:00
. dev = {
. platform_data = & scif0_platform_data ,
2007-07-25 17:50:01 +09:00
} ,
2009-12-14 12:30:05 +00:00
} ;
2007-07-25 17:50:01 +09:00
# if defined(CONFIG_CPU_SUBTYPE_SH7706) || \
defined ( CONFIG_CPU_SUBTYPE_SH7707 ) | | \
defined ( CONFIG_CPU_SUBTYPE_SH7709 )
2009-12-14 12:30:05 +00:00
static struct plat_sci_port scif1_platform_data = {
. type = PORT_SCIF ,
2011-06-14 12:40:19 +09:00
. ops = & sh770x_sci_port_ops ,
. regtype = SCIx_SH3_SCIF_REGTYPE ,
2009-12-14 12:30:05 +00:00
} ;
2013-12-06 10:59:48 +01:00
static struct resource scif1_resources [ ] = {
2014-10-29 14:50:59 -07:00
DEFINE_RES_MEM ( 0xa4000150 , 0x10 ) ,
2013-12-06 10:59:48 +01:00
DEFINE_RES_IRQ ( evt2irq ( 0x900 ) ) ,
} ;
2009-12-14 12:30:05 +00:00
static struct platform_device scif1_device = {
. name = " sh-sci " ,
. id = 1 ,
2013-12-06 10:59:48 +01:00
. resource = scif1_resources ,
. num_resources = ARRAY_SIZE ( scif1_resources ) ,
2009-12-14 12:30:05 +00:00
. dev = {
. platform_data = & scif1_platform_data ,
2007-07-25 17:50:01 +09:00
} ,
2009-12-14 12:30:05 +00:00
} ;
2007-07-25 17:50:01 +09:00
# endif
# if defined(CONFIG_CPU_SUBTYPE_SH7707) || \
defined ( CONFIG_CPU_SUBTYPE_SH7709 )
2009-12-14 12:30:05 +00:00
static struct plat_sci_port scif2_platform_data = {
. type = PORT_IRDA ,
2011-06-14 12:40:19 +09:00
. ops = & sh770x_sci_port_ops ,
2007-07-25 17:50:01 +09:00
} ;
2013-12-06 10:59:48 +01:00
static struct resource scif2_resources [ ] = {
2014-10-29 14:50:59 -07:00
DEFINE_RES_MEM ( 0xa4000140 , 0x10 ) ,
2013-12-06 10:59:48 +01:00
DEFINE_RES_IRQ ( evt2irq ( 0x880 ) ) ,
} ;
2009-12-14 12:30:05 +00:00
static struct platform_device scif2_device = {
2007-07-25 17:50:01 +09:00
. name = " sh-sci " ,
2009-12-14 12:30:05 +00:00
. id = 2 ,
2013-12-06 10:59:48 +01:00
. resource = scif2_resources ,
. num_resources = ARRAY_SIZE ( scif2_resources ) ,
2007-07-25 17:50:01 +09:00
. dev = {
2009-12-14 12:30:05 +00:00
. platform_data = & scif2_platform_data ,
2007-07-25 17:50:01 +09:00
} ,
} ;
2009-12-14 12:30:05 +00:00
# endif
2007-07-25 17:50:01 +09:00
2009-05-12 10:04:49 +00:00
static struct sh_timer_config tmu0_platform_data = {
2014-04-23 13:15:15 +02:00
. channels_mask = 7 ,
2009-05-12 10:04:49 +00:00
} ;
static struct resource tmu0_resources [ ] = {
2014-04-23 13:15:15 +02:00
DEFINE_RES_MEM ( 0xfffffe90 , 0x2c ) ,
DEFINE_RES_IRQ ( evt2irq ( 0x400 ) ) ,
DEFINE_RES_IRQ ( evt2irq ( 0x420 ) ) ,
DEFINE_RES_IRQ ( evt2irq ( 0x440 ) ) ,
2009-05-12 10:04:49 +00:00
} ;
static struct platform_device tmu0_device = {
2014-04-23 13:15:15 +02:00
. name = " sh-tmu-sh3 " ,
2009-05-12 10:04:49 +00:00
. id = 0 ,
. dev = {
. platform_data = & tmu0_platform_data ,
} ,
. resource = tmu0_resources ,
. num_resources = ARRAY_SIZE ( tmu0_resources ) ,
} ;
2007-07-25 17:50:01 +09:00
static struct platform_device * sh770x_devices [ ] __initdata = {
2009-12-14 12:30:05 +00:00
& scif0_device ,
# if defined(CONFIG_CPU_SUBTYPE_SH7706) || \
defined ( CONFIG_CPU_SUBTYPE_SH7707 ) | | \
defined ( CONFIG_CPU_SUBTYPE_SH7709 )
& scif1_device ,
# endif
# if defined(CONFIG_CPU_SUBTYPE_SH7707) || \
defined ( CONFIG_CPU_SUBTYPE_SH7709 )
& scif2_device ,
# endif
2009-05-12 10:04:49 +00:00
& tmu0_device ,
2007-07-25 17:50:01 +09:00
& rtc_device ,
} ;
static int __init sh770x_devices_setup ( void )
{
return platform_add_devices ( sh770x_devices ,
ARRAY_SIZE ( sh770x_devices ) ) ;
}
2009-07-22 15:14:29 +00:00
arch_initcall ( sh770x_devices_setup ) ;
2007-07-25 17:50:01 +09:00
2009-05-12 10:04:49 +00:00
static struct platform_device * sh770x_early_devices [ ] __initdata = {
2009-12-14 12:30:05 +00:00
& scif0_device ,
# if defined(CONFIG_CPU_SUBTYPE_SH7706) || \
defined ( CONFIG_CPU_SUBTYPE_SH7707 ) | | \
defined ( CONFIG_CPU_SUBTYPE_SH7709 )
& scif1_device ,
# endif
# if defined(CONFIG_CPU_SUBTYPE_SH7707) || \
defined ( CONFIG_CPU_SUBTYPE_SH7709 )
& scif2_device ,
# endif
2009-05-12 10:04:49 +00:00
& tmu0_device ,
} ;
void __init plat_early_device_setup ( void )
{
2019-10-03 11:29:13 +02:00
sh_early_platform_add_devices ( sh770x_early_devices ,
2009-05-12 10:04:49 +00:00
ARRAY_SIZE ( sh770x_early_devices ) ) ;
}
2008-04-24 21:30:09 +09:00
void __init plat_irq_setup ( void )
2007-07-25 17:50:01 +09:00
{
2008-04-24 21:30:09 +09:00
register_intc_controller ( & intc_desc ) ;
2007-07-25 17:50:01 +09:00
# if defined(CONFIG_CPU_SUBTYPE_SH7706) || \
defined ( CONFIG_CPU_SUBTYPE_SH7707 ) | | \
defined ( CONFIG_CPU_SUBTYPE_SH7709 )
2008-04-24 21:30:09 +09:00
plat_irq_setup_sh3 ( ) ;
2007-07-25 17:50:01 +09:00
# endif
}