2007-09-12 06:54:58 +04:00
/*
* linux / arch / sh / boards / magicpanel / setup . c
*
* Copyright ( C ) 2007 Markus Brunner , Mark Jonas
*
* Magic Panel Release 2 board setup
*
* This file is subject to the terms and conditions of the GNU General Public
* License . See the file " COPYING " in the main directory of this archive
* for more details .
*/
# include <linux/init.h>
# include <linux/irq.h>
# include <linux/platform_device.h>
# include <linux/delay.h>
2008-10-08 15:42:56 +04:00
# include <linux/gpio.h>
2012-06-27 02:50:00 +04:00
# include <linux/regulator/fixed.h>
# include <linux/regulator/machine.h>
2009-01-07 11:21:29 +03:00
# include <linux/smsc911x.h>
2007-09-21 10:27:35 +04:00
# include <linux/mtd/mtd.h>
# include <linux/mtd/partitions.h>
# include <linux/mtd/physmap.h>
# include <linux/mtd/map.h>
2012-05-18 09:58:03 +04:00
# include <linux/sh_intc.h>
2008-10-20 08:02:48 +04:00
# include <mach/magicpanelr2.h>
2007-09-12 06:54:58 +04:00
# include <asm/heartbeat.h>
2008-10-20 07:04:53 +04:00
# include <cpu/sh7720.h>
2007-09-12 06:54:58 +04:00
2012-06-27 02:50:00 +04:00
/* Dummy supplies, where voltage doesn't matter */
static struct regulator_consumer_supply dummy_supplies [ ] = {
REGULATOR_SUPPLY ( " vddvario " , " smsc911x " ) ,
REGULATOR_SUPPLY ( " vdd33a " , " smsc911x " ) ,
} ;
2010-01-26 06:58:40 +03:00
# define LAN9115_READY (__raw_readl(0xA8000084UL) & 0x00000001UL)
2007-09-12 06:54:58 +04:00
/* Wait until reset finished. Timeout is 100ms. */
static int __init ethernet_reset_finished ( void )
{
int i ;
if ( LAN9115_READY )
return 1 ;
for ( i = 0 ; i < 10 ; + + i ) {
mdelay ( 10 ) ;
if ( LAN9115_READY )
return 1 ;
}
return 0 ;
}
static void __init reset_ethernet ( void )
{
/* PMDR: LAN_RESET=on */
CLRBITS_OUTB ( 0x10 , PORT_PMDR ) ;
udelay ( 200 ) ;
/* PMDR: LAN_RESET=off */
SETBITS_OUTB ( 0x10 , PORT_PMDR ) ;
}
static void __init setup_chip_select ( void )
{
/* CS2: LAN (0x08000000 - 0x0bffffff) */
/* no idle cycles, normal space, 8 bit data bus */
2010-01-26 06:58:40 +03:00
__raw_writel ( 0x36db0400 , CS2BCR ) ;
2007-09-12 06:54:58 +04:00
/* (SW:1.5 WR:3 HW:1.5), ext. wait */
2010-01-26 06:58:40 +03:00
__raw_writel ( 0x000003c0 , CS2WCR ) ;
2007-09-12 06:54:58 +04:00
/* CS4: CAN1 (0xb0000000 - 0xb3ffffff) */
/* no idle cycles, normal space, 8 bit data bus */
2010-01-26 06:58:40 +03:00
__raw_writel ( 0x00000200 , CS4BCR ) ;
2007-09-12 06:54:58 +04:00
/* (SW:1.5 WR:3 HW:1.5), ext. wait */
2010-01-26 06:58:40 +03:00
__raw_writel ( 0x00100981 , CS4WCR ) ;
2007-09-12 06:54:58 +04:00
/* CS5a: CAN2 (0xb4000000 - 0xb5ffffff) */
/* no idle cycles, normal space, 8 bit data bus */
2010-01-26 06:58:40 +03:00
__raw_writel ( 0x00000200 , CS5ABCR ) ;
2007-09-12 06:54:58 +04:00
/* (SW:1.5 WR:3 HW:1.5), ext. wait */
2010-01-26 06:58:40 +03:00
__raw_writel ( 0x00100981 , CS5AWCR ) ;
2007-09-12 06:54:58 +04:00
/* CS5b: CAN3 (0xb6000000 - 0xb7ffffff) */
/* no idle cycles, normal space, 8 bit data bus */
2010-01-26 06:58:40 +03:00
__raw_writel ( 0x00000200 , CS5BBCR ) ;
2007-09-12 06:54:58 +04:00
/* (SW:1.5 WR:3 HW:1.5), ext. wait */
2010-01-26 06:58:40 +03:00
__raw_writel ( 0x00100981 , CS5BWCR ) ;
2007-09-12 06:54:58 +04:00
/* CS6a: Rotary (0xb8000000 - 0xb9ffffff) */
/* no idle cycles, normal space, 8 bit data bus */
2010-01-26 06:58:40 +03:00
__raw_writel ( 0x00000200 , CS6ABCR ) ;
2007-09-12 06:54:58 +04:00
/* (SW:1.5 WR:3 HW:1.5), no ext. wait */
2010-01-26 06:58:40 +03:00
__raw_writel ( 0x001009C1 , CS6AWCR ) ;
2007-09-12 06:54:58 +04:00
}
static void __init setup_port_multiplexing ( void )
{
/* A7 GPO(LED8); A6 GPO(LED7); A5 GPO(LED6); A4 GPO(LED5);
* A3 GPO ( LED4 ) ; A2 GPO ( LED3 ) ; A1 GPO ( LED2 ) ; A0 GPO ( LED1 ) ;
*/
2010-01-26 06:58:40 +03:00
__raw_writew ( 0x5555 , PORT_PACR ) ; /* 01 01 01 01 01 01 01 01 */
2007-09-12 06:54:58 +04:00
/* B7 GPO(RST4); B6 GPO(RST3); B5 GPO(RST2); B4 GPO(RST1);
* B3 GPO ( PB3 ) ; B2 GPO ( PB2 ) ; B1 GPO ( PB1 ) ; B0 GPO ( PB0 ) ;
*/
2010-01-26 06:58:40 +03:00
__raw_writew ( 0x5555 , PORT_PBCR ) ; /* 01 01 01 01 01 01 01 01 */
2007-09-12 06:54:58 +04:00
/* C7 GPO(PC7); C6 GPO(PC6); C5 GPO(PC5); C4 GPO(PC4);
* C3 LCD_DATA3 ; C2 LCD_DATA2 ; C1 LCD_DATA1 ; C0 LCD_DATA0 ;
*/
2010-01-26 06:58:40 +03:00
__raw_writew ( 0x5500 , PORT_PCCR ) ; /* 01 01 01 01 00 00 00 00 */
2007-09-12 06:54:58 +04:00
/* D7 GPO(PD7); D6 GPO(PD6); D5 GPO(PD5); D4 GPO(PD4);
* D3 GPO ( PD3 ) ; D2 GPO ( PD2 ) ; D1 GPO ( PD1 ) ; D0 GPO ( PD0 ) ;
*/
2010-01-26 06:58:40 +03:00
__raw_writew ( 0x5555 , PORT_PDCR ) ; /* 01 01 01 01 01 01 01 01 */
2007-09-12 06:54:58 +04:00
/* E7 (x); E6 GPI(nu); E5 GPI(nu); E4 LCD_M_DISP;
* E3 LCD_CL1 ; E2 LCD_CL2 ; E1 LCD_DON ; E0 LCD_FLM ;
*/
2010-01-26 06:58:40 +03:00
__raw_writew ( 0x3C00 , PORT_PECR ) ; /* 00 11 11 00 00 00 00 00 */
2007-09-12 06:54:58 +04:00
/* F7 (x); F6 DA1(VLCD); F5 DA0(nc); F4 AN3;
* F3 AN2 ( MID_AD ) ; F2 AN1 ( EARTH_AD ) ; F1 AN0 ( TEMP ) ; F0 GPI + ( nc ) ;
*/
2010-01-26 06:58:40 +03:00
__raw_writew ( 0x0002 , PORT_PFCR ) ; /* 00 00 00 00 00 00 00 10 */
2007-09-12 06:54:58 +04:00
/* G7 (x); G6 IRQ5(TOUCH_BUSY); G5 IRQ4(TOUCH_IRQ); G4 GPI(KEY2);
* G3 GPI ( KEY1 ) ; G2 GPO ( LED11 ) ; G1 GPO ( LED10 ) ; G0 GPO ( LED9 ) ;
*/
2010-01-26 06:58:40 +03:00
__raw_writew ( 0x03D5 , PORT_PGCR ) ; /* 00 00 00 11 11 01 01 01 */
2007-09-12 06:54:58 +04:00
/* H7 (x); H6 /RAS(BRAS); H5 /CAS(BCAS); H4 CKE(BCKE);
* H3 GPO ( EARTH_OFF ) ; H2 GPO ( EARTH_TEST ) ; H1 USB2_PWR ; H0 USB1_PWR ;
*/
2010-01-26 06:58:40 +03:00
__raw_writew ( 0x0050 , PORT_PHCR ) ; /* 00 00 00 00 01 01 00 00 */
2007-09-12 06:54:58 +04:00
/* J7 (x); J6 AUDCK; J5 ASEBRKAK; J4 AUDATA3;
* J3 AUDATA2 ; J2 AUDATA1 ; J1 AUDATA0 ; J0 AUDSYNC ;
*/
2010-01-26 06:58:40 +03:00
__raw_writew ( 0x0000 , PORT_PJCR ) ; /* 00 00 00 00 00 00 00 00 */
2007-09-12 06:54:58 +04:00
/* K7 (x); K6 (x); K5 (x); K4 (x);
* K3 PINT7 ( / PWR2 ) ; K2 PINT6 ( / PWR1 ) ; K1 PINT5 ( nu ) ; K0 PINT4 ( FLASH_READY )
*/
2010-01-26 06:58:40 +03:00
__raw_writew ( 0x00FF , PORT_PKCR ) ; /* 00 00 00 00 11 11 11 11 */
2007-09-12 06:54:58 +04:00
/* L7 TRST; L6 TMS; L5 TDO; L4 TDI;
* L3 TCK ; L2 ( x ) ; L1 ( x ) ; L0 ( x ) ;
*/
2010-01-26 06:58:40 +03:00
__raw_writew ( 0x0000 , PORT_PLCR ) ; /* 00 00 00 00 00 00 00 00 */
2007-09-12 06:54:58 +04:00
/* M7 GPO(CURRENT_SINK); M6 GPO(PWR_SWITCH); M5 GPO(LAN_SPEED);
* M4 GPO ( LAN_RESET ) ; M3 GPO ( BUZZER ) ; M2 GPO ( LCD_BL ) ;
* M1 CS5B ( CAN3_CS ) ; M0 GPI + ( nc ) ;
*/
2010-01-26 06:58:40 +03:00
__raw_writew ( 0x5552 , PORT_PMCR ) ; /* 01 01 01 01 01 01 00 10 */
2007-09-12 06:54:58 +04:00
/* CURRENT_SINK=off, PWR_SWITCH=off, LAN_SPEED=100MBit,
* LAN_RESET = off , BUZZER = off , LCD_BL = off
*/
# if CONFIG_SH_MAGIC_PANEL_R2_VERSION == 2
2010-01-26 06:58:40 +03:00
__raw_writeb ( 0x30 , PORT_PMDR ) ;
2007-09-12 06:54:58 +04:00
# elif CONFIG_SH_MAGIC_PANEL_R2_VERSION == 3
2010-01-26 06:58:40 +03:00
__raw_writeb ( 0xF0 , PORT_PMDR ) ;
2007-09-12 06:54:58 +04:00
# else
# error Unknown revision of PLATFORM_MP_R2
# endif
/* P7 (x); P6 (x); P5 (x);
* P4 GPO ( nu ) ; P3 IRQ3 ( LAN_IRQ ) ; P2 IRQ2 ( CAN3_IRQ ) ;
* P1 IRQ1 ( CAN2_IRQ ) ; P0 IRQ0 ( CAN1_IRQ )
*/
2010-01-26 06:58:40 +03:00
__raw_writew ( 0x0100 , PORT_PPCR ) ; /* 00 00 00 01 00 00 00 00 */
__raw_writeb ( 0x10 , PORT_PPDR ) ;
2007-09-12 06:54:58 +04:00
/* R7 A25; R6 A24; R5 A23; R4 A22;
* R3 A21 ; R2 A20 ; R1 A19 ; R0 A0 ;
*/
2008-10-08 15:42:56 +04:00
gpio_request ( GPIO_FN_A25 , NULL ) ;
gpio_request ( GPIO_FN_A24 , NULL ) ;
gpio_request ( GPIO_FN_A23 , NULL ) ;
gpio_request ( GPIO_FN_A22 , NULL ) ;
gpio_request ( GPIO_FN_A21 , NULL ) ;
gpio_request ( GPIO_FN_A20 , NULL ) ;
gpio_request ( GPIO_FN_A19 , NULL ) ;
gpio_request ( GPIO_FN_A0 , NULL ) ;
2007-09-12 06:54:58 +04:00
/* S7 (x); S6 (x); S5 (x); S4 GPO(EEPROM_CS2);
* S3 GPO ( EEPROM_CS1 ) ; S2 SIOF0_TXD ; S1 SIOF0_RXD ; S0 SIOF0_SCK ;
*/
2010-01-26 06:58:40 +03:00
__raw_writew ( 0x0140 , PORT_PSCR ) ; /* 00 00 00 01 01 00 00 00 */
2007-09-12 06:54:58 +04:00
/* T7 (x); T6 (x); T5 (x); T4 COM1_CTS;
* T3 COM1_RTS ; T2 COM1_TXD ; T1 COM1_RXD ; T0 GPO ( WDOG )
*/
2010-01-26 06:58:40 +03:00
__raw_writew ( 0x0001 , PORT_PTCR ) ; /* 00 00 00 00 00 00 00 01 */
2007-09-12 06:54:58 +04:00
/* U7 (x); U6 (x); U5 (x); U4 GPI+(/AC_FAULT);
* U3 GPO ( TOUCH_CS ) ; U2 TOUCH_TXD ; U1 TOUCH_RXD ; U0 TOUCH_SCK ;
*/
2010-01-26 06:58:40 +03:00
__raw_writew ( 0x0240 , PORT_PUCR ) ; /* 00 00 00 10 01 00 00 00 */
2007-09-12 06:54:58 +04:00
/* V7 (x); V6 (x); V5 (x); V4 GPO(MID2);
* V3 GPO ( MID1 ) ; V2 CARD_TxD ; V1 CARD_RxD ; V0 GPI + ( / BAT_FAULT ) ;
*/
2010-01-26 06:58:40 +03:00
__raw_writew ( 0x0142 , PORT_PVCR ) ; /* 00 00 00 01 01 00 00 10 */
2007-09-12 06:54:58 +04:00
}
static void __init mpr2_setup ( char * * cmdline_p )
{
/* set Pin Select Register A:
* / PCC_CD1 , / PCC_CD2 , PCC_BVD1 , PCC_BVD2 ,
* / IOIS16 , IRQ4 , IRQ5 , USB1d_SUSPEND
*/
2010-01-26 06:58:40 +03:00
__raw_writew ( 0xAABC , PORT_PSELA ) ;
2007-09-12 06:54:58 +04:00
/* set Pin Select Register B:
* / SCIF0_RTS , / SCIF0_CTS , LCD_VCPWC ,
* LCD_VEPWC , IIC_SDA , IIC_SCL , Reserved
*/
2010-01-26 06:58:40 +03:00
__raw_writew ( 0x3C00 , PORT_PSELB ) ;
2007-09-12 06:54:58 +04:00
/* set Pin Select Register C:
* SIOF1_SCK , SIOF1_RxD , SCIF1_RxD , SCIF1_TxD , Reserved
*/
2010-01-26 06:58:40 +03:00
__raw_writew ( 0x0000 , PORT_PSELC ) ;
2007-09-12 06:54:58 +04:00
/* set Pin Select Register D: Reserved, SIOF1_TxD, Reserved, SIOF1_MCLK,
* Reserved , SIOF1_SYNC , Reserved , SCIF1_SCK , Reserved
*/
2010-01-26 06:58:40 +03:00
__raw_writew ( 0x0000 , PORT_PSELD ) ;
2007-09-12 06:54:58 +04:00
/* set USB TxRx Control: Reserved, DRV, Reserved, USB_TRANS, USB_SEL */
2010-01-26 06:58:40 +03:00
__raw_writew ( 0x0101 , PORT_UTRCTL ) ;
2007-09-12 06:54:58 +04:00
/* set USB Clock Control: USSCS, USSTB, Reserved (HighByte always A5) */
2010-01-26 06:58:40 +03:00
__raw_writew ( 0xA5C0 , PORT_UCLKCR_W ) ;
2007-09-12 06:54:58 +04:00
setup_chip_select ( ) ;
setup_port_multiplexing ( ) ;
reset_ethernet ( ) ;
printk ( KERN_INFO " Magic Panel Release 2 A.%i \n " ,
CONFIG_SH_MAGIC_PANEL_R2_VERSION ) ;
if ( ethernet_reset_finished ( ) = = 0 )
printk ( KERN_WARNING " Ethernet not ready \n " ) ;
}
2009-01-07 11:21:29 +03:00
static struct resource smsc911x_resources [ ] = {
2007-09-12 06:54:58 +04:00
[ 0 ] = {
. start = 0xa8000000 ,
. end = 0xabffffff ,
. flags = IORESOURCE_MEM ,
} ,
[ 1 ] = {
2012-05-18 09:58:03 +04:00
. start = evt2irq ( 0x660 ) ,
. end = evt2irq ( 0x660 ) ,
2007-09-12 06:54:58 +04:00
. flags = IORESOURCE_IRQ ,
} ,
} ;
2009-01-07 11:21:29 +03:00
static struct smsc911x_platform_config smsc911x_config = {
. phy_interface = PHY_INTERFACE_MODE_MII ,
. irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_LOW ,
. irq_type = SMSC911X_IRQ_TYPE_OPEN_DRAIN ,
. flags = SMSC911X_USE_32BIT ,
} ;
static struct platform_device smsc911x_device = {
. name = " smsc911x " ,
2007-09-12 06:54:58 +04:00
. id = - 1 ,
2009-01-07 11:21:29 +03:00
. num_resources = ARRAY_SIZE ( smsc911x_resources ) ,
. resource = smsc911x_resources ,
. dev = {
. platform_data = & smsc911x_config ,
} ,
2007-09-12 06:54:58 +04:00
} ;
static struct resource heartbeat_resources [ ] = {
[ 0 ] = {
. start = PA_LED ,
. end = PA_LED ,
. flags = IORESOURCE_MEM ,
} ,
} ;
static struct heartbeat_data heartbeat_data = {
. flags = HEARTBEAT_INVERTED ,
} ;
static struct platform_device heartbeat_device = {
. name = " heartbeat " ,
. id = - 1 ,
. dev = {
. platform_data = & heartbeat_data ,
} ,
. num_resources = ARRAY_SIZE ( heartbeat_resources ) ,
. resource = heartbeat_resources ,
} ;
2007-09-21 10:27:35 +04:00
static struct mtd_partition mpr2_partitions [ ] = {
/* Reserved for bootloader, read-only */
{
. name = " Bootloader " ,
. offset = 0x00000000UL ,
. size = MPR2_MTD_BOOTLOADER_SIZE ,
. mask_flags = MTD_WRITEABLE ,
} ,
/* Reserved for kernel image */
{
. name = " Kernel " ,
. offset = MTDPART_OFS_NXTBLK ,
. size = MPR2_MTD_KERNEL_SIZE ,
} ,
/* Rest is used for Flash FS */
{
. name = " Flash_FS " ,
. offset = MTDPART_OFS_NXTBLK ,
. size = MTDPART_SIZ_FULL ,
}
} ;
static struct physmap_flash_data flash_data = {
2012-01-12 08:49:05 +04:00
. parts = mpr2_partitions ,
. nr_parts = ARRAY_SIZE ( mpr2_partitions ) ,
2007-09-21 10:27:35 +04:00
. width = 2 ,
} ;
static struct resource flash_resource = {
. start = 0x00000000 ,
. end = 0x2000000UL ,
. flags = IORESOURCE_MEM ,
} ;
static struct platform_device flash_device = {
. name = " physmap-flash " ,
. id = - 1 ,
. resource = & flash_resource ,
. num_resources = 1 ,
. dev = {
. platform_data = & flash_data ,
} ,
} ;
/*
* Add all resources to the platform_device
*/
2007-09-12 06:54:58 +04:00
static struct platform_device * mpr2_devices [ ] __initdata = {
& heartbeat_device ,
2009-01-07 11:21:29 +03:00
& smsc911x_device ,
2007-09-21 10:27:35 +04:00
& flash_device ,
2007-09-12 06:54:58 +04:00
} ;
2007-09-21 10:27:35 +04:00
2007-09-12 06:54:58 +04:00
static int __init mpr2_devices_setup ( void )
{
2012-06-27 02:50:00 +04:00
regulator_register_fixed ( 0 , dummy_supplies , ARRAY_SIZE ( dummy_supplies ) ) ;
2007-09-12 06:54:58 +04:00
return platform_add_devices ( mpr2_devices , ARRAY_SIZE ( mpr2_devices ) ) ;
}
device_initcall ( mpr2_devices_setup ) ;
/*
* Initialize IRQ setting
*/
static void __init init_mpr2_IRQ ( void )
{
plat_irq_setup_pins ( IRQ_MODE_IRQ ) ; /* install handlers for IRQ0-5 */
2012-05-18 09:58:03 +04:00
irq_set_irq_type ( evt2irq ( 0x600 ) , IRQ_TYPE_LEVEL_LOW ) ; /* IRQ0 CAN1 */
irq_set_irq_type ( evt2irq ( 0x620 ) , IRQ_TYPE_LEVEL_LOW ) ; /* IRQ1 CAN2 */
irq_set_irq_type ( evt2irq ( 0x640 ) , IRQ_TYPE_LEVEL_LOW ) ; /* IRQ2 CAN3 */
irq_set_irq_type ( evt2irq ( 0x660 ) , IRQ_TYPE_LEVEL_LOW ) ; /* IRQ3 SMSC9115 */
irq_set_irq_type ( evt2irq ( 0x680 ) , IRQ_TYPE_EDGE_RISING ) ; /* IRQ4 touchscreen */
irq_set_irq_type ( evt2irq ( 0x6a0 ) , IRQ_TYPE_EDGE_FALLING ) ; /* IRQ5 touchscreen */
intc_set_priority ( evt2irq ( 0x600 ) , 13 ) ; /* IRQ0 CAN1 */
intc_set_priority ( evt2irq ( 0x620 ) , 13 ) ; /* IRQ0 CAN2 */
intc_set_priority ( evt2irq ( 0x640 ) , 13 ) ; /* IRQ0 CAN3 */
intc_set_priority ( evt2irq ( 0x660 ) , 6 ) ; /* IRQ3 SMSC9115 */
2007-09-12 06:54:58 +04:00
}
/*
* The Machine Vector
*/
static struct sh_machine_vector mv_mpr2 __initmv = {
. mv_name = " mpr2 " ,
. mv_setup = mpr2_setup ,
2007-09-21 10:27:35 +04:00
. mv_init_irq = init_mpr2_IRQ ,
2007-09-12 06:54:58 +04:00
} ;