2009-01-20 09:15:18 +03:00
/*
* linux / arch / arm / mach - mmp / pxa168 . c
*
* Code specific to PXA168
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation .
*/
# include <linux/module.h>
# include <linux/kernel.h>
# include <linux/init.h>
# include <linux/list.h>
2009-01-20 09:38:24 +03:00
# include <linux/io.h>
2009-01-20 09:15:18 +03:00
# include <linux/clk.h>
2014-04-15 17:20:50 +04:00
# include <linux/clk/mmp.h>
2011-10-17 16:37:52 +04:00
# include <linux/platform_device.h>
2012-05-03 10:19:15 +04:00
# include <linux/platform_data/mv_usb.h>
2014-04-15 22:38:32 +04:00
# include <linux/dma-mapping.h>
2009-01-20 09:15:18 +03:00
# include <asm/mach/time.h>
2012-03-28 21:30:01 +04:00
# include <asm/system_misc.h>
2009-01-20 09:15:18 +03:00
2014-04-15 22:38:32 +04:00
# include "addr-map.h"
2009-01-20 09:15:18 +03:00
# include "clock.h"
2014-04-15 22:38:32 +04:00
# include "common.h"
# include "cputype.h"
# include "devices.h"
# include "irqs.h"
# include "mfp.h"
# include "pxa168.h"
# include "regs-apbc.h"
# include "regs-apmu.h"
# include "regs-usb.h"
2009-01-20 09:15:18 +03:00
2009-01-20 12:20:56 +03:00
# define MFPR_VIRT_BASE (APB_VIRT_BASE + 0x1e000)
static struct mfp_addr_map pxa168_mfp_addr_map [ ] __initdata =
{
MFP_ADDR_X ( GPIO0 , GPIO36 , 0x04c ) ,
MFP_ADDR_X ( GPIO37 , GPIO55 , 0x000 ) ,
MFP_ADDR_X ( GPIO56 , GPIO123 , 0x0e0 ) ,
MFP_ADDR_X ( GPIO124 , GPIO127 , 0x0f4 ) ,
MFP_ADDR_END ,
} ;
2009-01-20 09:15:18 +03:00
void __init pxa168_init_irq ( void )
{
icu_init_irq ( ) ;
}
static int __init pxa168_init ( void )
{
if ( cpu_is_pxa168 ( ) ) {
2009-01-20 12:20:56 +03:00
mfp_init_base ( MFPR_VIRT_BASE ) ;
mfp_init_addr ( pxa168_mfp_addr_map ) ;
2014-04-15 17:20:50 +04:00
pxa168_clk_init ( APB_PHYS_BASE + 0x50000 ,
AXI_PHYS_BASE + 0x82800 ,
APB_PHYS_BASE + 0x15000 ) ;
2009-01-20 09:15:18 +03:00
}
return 0 ;
}
postcore_initcall ( pxa168_init ) ;
/* system timer - clock enabled, 3.25MHz */
# define TIMER_CLK_RST (APBC_APBCLK | APBC_FNCLK | APBC_FNCLKSEL(3))
2012-08-27 06:54:00 +04:00
# define APBC_TIMERS APBC_REG(0x34)
2009-01-20 09:15:18 +03:00
2012-11-08 23:40:59 +04:00
void __init pxa168_timer_init ( void )
2009-01-20 09:15:18 +03:00
{
/* this is early, we have to initialize the CCU registers by
* ourselves instead of using clk_ * API . Clock rate is defined
* by APBC_TIMERS_CLK_RST ( 3.25 MHz ) and enabled free - running
*/
2012-08-27 06:54:00 +04:00
__raw_writel ( APBC_APBCLK | APBC_RST , APBC_TIMERS ) ;
2009-01-20 09:15:18 +03:00
/* 3.25MHz, bus/functional clock enabled, release reset */
2012-08-27 06:54:00 +04:00
__raw_writel ( TIMER_CLK_RST , APBC_TIMERS ) ;
2009-01-20 09:15:18 +03:00
timer_init ( IRQ_PXA168_TIMER1 ) ;
}
2010-09-04 02:28:10 +04:00
void pxa168_clear_keypad_wakeup ( void )
{
uint32_t val ;
uint32_t mask = APMU_PXA168_KP_WAKE_CLR ;
/* wake event clear is needed in order to clear keypad interrupt */
val = __raw_readl ( APMU_WAKE_CLR ) ;
__raw_writel ( val | mask , APMU_WAKE_CLR ) ;
}
2009-01-20 09:15:18 +03:00
/* on-chip devices */
PXA168_DEVICE ( uart1 , " pxa2xx-uart " , 0 , UART1 , 0xd4017000 , 0x30 , 21 , 22 ) ;
PXA168_DEVICE ( uart2 , " pxa2xx-uart " , 1 , UART2 , 0xd4018000 , 0x30 , 23 , 24 ) ;
2011-05-02 09:59:58 +04:00
PXA168_DEVICE ( uart3 , " pxa2xx-uart " , 2 , UART3 , 0xd4026000 , 0x30 , 23 , 24 ) ;
2009-04-13 11:34:54 +04:00
PXA168_DEVICE ( twsi0 , " pxa2xx-i2c " , 0 , TWSI0 , 0xd4011000 , 0x28 ) ;
PXA168_DEVICE ( twsi1 , " pxa2xx-i2c " , 1 , TWSI1 , 0xd4025000 , 0x28 ) ;
2009-04-13 14:29:52 +04:00
PXA168_DEVICE ( pwm1 , " pxa168-pwm " , 0 , NONE , 0xd401a000 , 0x10 ) ;
PXA168_DEVICE ( pwm2 , " pxa168-pwm " , 1 , NONE , 0xd401a400 , 0x10 ) ;
PXA168_DEVICE ( pwm3 , " pxa168-pwm " , 2 , NONE , 0xd401a800 , 0x10 ) ;
PXA168_DEVICE ( pwm4 , " pxa168-pwm " , 3 , NONE , 0xd401ac00 , 0x10 ) ;
2009-10-13 11:24:55 +04:00
PXA168_DEVICE ( nand , " pxa3xx-nand " , - 1 , NAND , 0xd4283000 , 0x80 , 97 , 99 ) ;
2010-03-19 18:53:17 +03:00
PXA168_DEVICE ( ssp1 , " pxa168-ssp " , 0 , SSP1 , 0xd401b000 , 0x40 , 52 , 53 ) ;
PXA168_DEVICE ( ssp2 , " pxa168-ssp " , 1 , SSP2 , 0xd401c000 , 0x40 , 54 , 55 ) ;
PXA168_DEVICE ( ssp3 , " pxa168-ssp " , 2 , SSP3 , 0xd401f000 , 0x40 , 56 , 57 ) ;
PXA168_DEVICE ( ssp4 , " pxa168-ssp " , 3 , SSP4 , 0xd4020000 , 0x40 , 58 , 59 ) ;
PXA168_DEVICE ( ssp5 , " pxa168-ssp " , 4 , SSP5 , 0xd4021000 , 0x40 , 60 , 61 ) ;
2010-08-26 07:51:54 +04:00
PXA168_DEVICE ( fb , " pxa168-fb " , - 1 , LCD , 0xd420b000 , 0x1c8 ) ;
2010-09-04 02:28:07 +04:00
PXA168_DEVICE ( keypad , " pxa27x-keypad " , - 1 , KEYPAD , 0xd4012000 , 0x4c ) ;
2011-05-02 09:59:59 +04:00
PXA168_DEVICE ( eth , " pxa168-eth " , - 1 , MFU , 0xc0800000 , 0x0fff ) ;
2011-07-20 08:30:58 +04:00
2011-10-17 16:37:52 +04:00
struct resource pxa168_resource_gpio [ ] = {
{
. start = 0xd4019000 ,
. end = 0xd4019fff ,
. flags = IORESOURCE_MEM ,
} , {
. start = IRQ_PXA168_GPIOX ,
. end = IRQ_PXA168_GPIOX ,
2012-02-27 06:37:02 +04:00
. name = " gpio_mux " ,
2011-10-17 16:37:52 +04:00
. flags = IORESOURCE_IRQ ,
} ,
} ;
struct platform_device pxa168_device_gpio = {
2013-04-07 12:44:33 +04:00
. name = " mmp-gpio " ,
2011-10-17 16:37:52 +04:00
. id = - 1 ,
. num_resources = ARRAY_SIZE ( pxa168_resource_gpio ) ,
. resource = pxa168_resource_gpio ,
} ;
2011-07-20 08:30:58 +04:00
struct resource pxa168_usb_host_resources [ ] = {
/* USB Host conroller register base */
[ 0 ] = {
2012-05-03 10:19:15 +04:00
. start = PXA168_U2H_REGBASE + U2x_CAPREGS_OFFSET ,
. end = PXA168_U2H_REGBASE + USB_REG_RANGE ,
2011-07-20 08:30:58 +04:00
. flags = IORESOURCE_MEM ,
2012-05-03 10:19:15 +04:00
. name = " capregs " ,
2011-07-20 08:30:58 +04:00
} ,
/* USB PHY register base */
[ 1 ] = {
2012-05-03 10:19:15 +04:00
. start = PXA168_U2H_PHYBASE ,
. end = PXA168_U2H_PHYBASE + USB_PHY_RANGE ,
2011-07-20 08:30:58 +04:00
. flags = IORESOURCE_MEM ,
2012-05-03 10:19:15 +04:00
. name = " phyregs " ,
2011-07-20 08:30:58 +04:00
} ,
[ 2 ] = {
. start = IRQ_PXA168_USB2 ,
. end = IRQ_PXA168_USB2 ,
. flags = IORESOURCE_IRQ ,
} ,
} ;
static u64 pxa168_usb_host_dmamask = DMA_BIT_MASK ( 32 ) ;
struct platform_device pxa168_device_usb_host = {
2012-05-03 10:19:15 +04:00
. name = " pxa-sph " ,
2011-07-20 08:30:58 +04:00
. id = - 1 ,
. dev = {
. dma_mask = & pxa168_usb_host_dmamask ,
. coherent_dma_mask = DMA_BIT_MASK ( 32 ) ,
} ,
. num_resources = ARRAY_SIZE ( pxa168_usb_host_resources ) ,
. resource = pxa168_usb_host_resources ,
} ;
2012-05-03 10:19:15 +04:00
int __init pxa168_add_usb_host ( struct mv_usb_platform_data * pdata )
2011-07-20 08:30:58 +04:00
{
pxa168_device_usb_host . dev . platform_data = pdata ;
return platform_device_register ( & pxa168_device_usb_host ) ;
}
2011-11-05 19:40:09 +04:00
2013-07-09 03:01:40 +04:00
void pxa168_restart ( enum reboot_mode mode , const char * cmd )
2011-11-05 19:40:09 +04:00
{
soft_restart ( 0xffff0000 ) ;
}