2008-07-05 10:02:57 +02:00
/*
* Author : MontaVista Software , Inc .
* < source @ mvista . com >
*
* Based on the OMAP devices . c
*
* 2005 ( c ) MontaVista Software , Inc . This file is licensed under the
* terms of the GNU General Public License version 2. This program is
* licensed " as is " without any warranty of any kind , whether express
* or implied .
*
* Copyright 2006 - 2007 Freescale Semiconductor , Inc . All Rights Reserved .
* Copyright 2008 Juergen Beisert , kernel @ pengutronix . de
*
* 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 .
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
* Foundation , Inc . , 51 Franklin Street , Fifth Floor , Boston ,
* MA 02110 - 1301 , USA .
*/
# include <linux/module.h>
# include <linux/kernel.h>
# include <linux/init.h>
# include <linux/platform_device.h>
# include <linux/gpio.h>
[ARM] fix AT91, davinci, h720x, ks8695, msm, mx2, mx3, netx, omap1, omap2, pxa, s3c
arch/arm/mach-at91/at91cap9.c:337: error: 'NR_AIC_IRQS' undeclared here (not in a function)
arch/arm/mach-at91/at91rm9200.c:301: error: 'NR_AIC_IRQS' undeclared here (not in a function)
arch/arm/mach-at91/at91sam9260.c:351: error: 'NR_AIC_IRQS' undeclared here (not in a function)
arch/arm/mach-at91/at91sam9261.c:287: error: 'NR_AIC_IRQS' undeclared here (not in a function)
arch/arm/mach-at91/at91sam9263.c:312: error: 'NR_AIC_IRQS' undeclared here (not in a function)
arch/arm/mach-at91/at91sam9rl.c:304: error: 'NR_AIC_IRQS' undeclared here (not in a function)
arch/arm/mach-h720x/h7202-eval.c:38: error: implicit declaration of function 'IRQ_CHAINED_GPIOB'
arch/arm/mach-ks8695/devices.c:46: error: 'KS8695_IRQ_WAN_RX_STATUS' undeclared here (not in a function)
arch/arm/mach-msm/devices.c:28: error: 'INT_UART1' undeclared here (not in a function)
arch/arm/mach-mx2/devices.c:233: error: 'MXC_GPIO_IRQ_START' undeclared here (not in a function)
arch/arm/mach-mx3/devices.c:128: error: 'MXC_GPIO_IRQ_START' undeclared here (not in a function)
arch/arm/mach-omap1/mcbsp.c:140: error: 'INT_730_McBSP1RX' undeclared here (not in a function)
arch/arm/mach-omap1/mcbsp.c:165: error: 'INT_McBSP1RX' undeclared here (not in a function)
arch/arm/mach-omap1/mcbsp.c:200: error: 'INT_McBSP1RX' undeclared here (not in a function)
arch/arm/mach-omap2/board-apollon.c:286: error: implicit declaration of function 'omap_set_gpio_direction'
arch/arm/mach-omap2/mcbsp.c:154: error: 'INT_24XX_MCBSP1_IRQ_RX' undeclared here (not in a function)
arch/arm/mach-omap2/mcbsp.c:181: error: 'INT_24XX_MCBSP1_IRQ_RX' undeclared here (not in a function)
arch/arm/mach-pxa/e350.c:36: error: 'IRQ_BOARD_START' undeclared here (not in a function)
arch/arm/plat-s3c/dev-i2c0.c:32: error: 'IRQ_IIC' undeclared here (not in a function)
...
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
2009-01-08 10:01:47 +00:00
# include <mach/irqs.h>
2008-08-05 16:14:15 +01:00
# include <mach/hardware.h>
2009-01-26 16:34:51 +01:00
# include <mach/common.h>
# include "devices.h"
2008-07-05 10:02:57 +02:00
/*
* Resource definition for the MXC IrDA
*/
static struct resource mxc_irda_resources [ ] = {
[ 0 ] = {
. start = UART3_BASE_ADDR ,
. end = UART3_BASE_ADDR + SZ_4K - 1 ,
. flags = IORESOURCE_MEM ,
} ,
[ 1 ] = {
. start = MXC_INT_UART3 ,
. end = MXC_INT_UART3 ,
. flags = IORESOURCE_IRQ ,
} ,
} ;
/* Platform Data for MXC IrDA */
struct platform_device mxc_irda_device = {
. name = " mxc_irda " ,
. id = 0 ,
. num_resources = ARRAY_SIZE ( mxc_irda_resources ) ,
. resource = mxc_irda_resources ,
} ;
/*
* General Purpose Timer
* - i . MX1 : 2 timer ( slighly different register handling )
* - i . MX21 : 3 timer
* - i . MX27 : 6 timer
*/
/* We use gpt0 as system timer, so do not add a device for this one */
static struct resource timer1_resources [ ] = {
[ 0 ] = {
. start = GPT2_BASE_ADDR ,
. end = GPT2_BASE_ADDR + 0x17 ,
. flags = IORESOURCE_MEM
} ,
[ 1 ] = {
. start = MXC_INT_GPT2 ,
. end = MXC_INT_GPT2 ,
. flags = IORESOURCE_IRQ ,
}
} ;
struct platform_device mxc_gpt1 = {
. name = " imx_gpt " ,
. id = 1 ,
. num_resources = ARRAY_SIZE ( timer1_resources ) ,
. resource = timer1_resources
} ;
static struct resource timer2_resources [ ] = {
[ 0 ] = {
. start = GPT3_BASE_ADDR ,
. end = GPT3_BASE_ADDR + 0x17 ,
. flags = IORESOURCE_MEM
} ,
[ 1 ] = {
. start = MXC_INT_GPT3 ,
. end = MXC_INT_GPT3 ,
. flags = IORESOURCE_IRQ ,
}
} ;
struct platform_device mxc_gpt2 = {
. name = " imx_gpt " ,
. id = 2 ,
. num_resources = ARRAY_SIZE ( timer2_resources ) ,
. resource = timer2_resources
} ;
# ifdef CONFIG_MACH_MX27
static struct resource timer3_resources [ ] = {
[ 0 ] = {
. start = GPT4_BASE_ADDR ,
. end = GPT4_BASE_ADDR + 0x17 ,
. flags = IORESOURCE_MEM
} ,
[ 1 ] = {
. start = MXC_INT_GPT4 ,
. end = MXC_INT_GPT4 ,
. flags = IORESOURCE_IRQ ,
}
} ;
struct platform_device mxc_gpt3 = {
. name = " imx_gpt " ,
. id = 3 ,
. num_resources = ARRAY_SIZE ( timer3_resources ) ,
. resource = timer3_resources
} ;
static struct resource timer4_resources [ ] = {
[ 0 ] = {
. start = GPT5_BASE_ADDR ,
. end = GPT5_BASE_ADDR + 0x17 ,
. flags = IORESOURCE_MEM
} ,
[ 1 ] = {
. start = MXC_INT_GPT5 ,
. end = MXC_INT_GPT5 ,
. flags = IORESOURCE_IRQ ,
}
} ;
struct platform_device mxc_gpt4 = {
. name = " imx_gpt " ,
. id = 4 ,
. num_resources = ARRAY_SIZE ( timer4_resources ) ,
. resource = timer4_resources
} ;
static struct resource timer5_resources [ ] = {
[ 0 ] = {
. start = GPT6_BASE_ADDR ,
. end = GPT6_BASE_ADDR + 0x17 ,
. flags = IORESOURCE_MEM
} ,
[ 1 ] = {
. start = MXC_INT_GPT6 ,
. end = MXC_INT_GPT6 ,
. flags = IORESOURCE_IRQ ,
}
} ;
struct platform_device mxc_gpt5 = {
. name = " imx_gpt " ,
. id = 5 ,
. num_resources = ARRAY_SIZE ( timer5_resources ) ,
. resource = timer5_resources
} ;
# endif
/*
* Watchdog :
* - i . MX1
* - i . MX21
* - i . MX27
*/
static struct resource mxc_wdt_resources [ ] = {
{
. start = WDOG_BASE_ADDR ,
. end = WDOG_BASE_ADDR + 0x30 ,
. flags = IORESOURCE_MEM ,
} ,
} ;
struct platform_device mxc_wdt = {
. name = " mxc_wdt " ,
. id = 0 ,
. num_resources = ARRAY_SIZE ( mxc_wdt_resources ) ,
. resource = mxc_wdt_resources ,
} ;
2008-12-01 14:15:38 -08:00
static struct resource mxc_w1_master_resources [ ] = {
{
. start = OWIRE_BASE_ADDR ,
. end = OWIRE_BASE_ADDR + SZ_4K - 1 ,
. flags = IORESOURCE_MEM ,
} ,
} ;
struct platform_device mxc_w1_master_device = {
. name = " mxc_w1 " ,
. id = 0 ,
. num_resources = ARRAY_SIZE ( mxc_w1_master_resources ) ,
. resource = mxc_w1_master_resources ,
} ;
2008-09-09 11:30:58 +02:00
static struct resource mxc_nand_resources [ ] = {
{
. start = NFC_BASE_ADDR ,
. end = NFC_BASE_ADDR + 0xfff ,
. flags = IORESOURCE_MEM
} , {
. start = MXC_INT_NANDFC ,
. end = MXC_INT_NANDFC ,
. flags = IORESOURCE_IRQ
} ,
} ;
struct platform_device mxc_nand_device = {
. name = " mxc_nand " ,
. id = 0 ,
. num_resources = ARRAY_SIZE ( mxc_nand_resources ) ,
. resource = mxc_nand_resources ,
} ;
2009-01-26 16:34:56 +01:00
# ifdef CONFIG_FB_IMX
/*
* lcdc :
* - i . MX1 : the basic controller
* - i . MX21 : to be checked
* - i . MX27 : like i . MX1 , with slightly variations
*/
static struct resource mxc_fb [ ] = {
{
. start = LCDC_BASE_ADDR ,
. end = LCDC_BASE_ADDR + 0xFFF ,
. flags = IORESOURCE_MEM ,
} ,
{
. start = MXC_INT_LCDC ,
. end = MXC_INT_LCDC ,
. flags = IORESOURCE_IRQ ,
}
} ;
/* mxc lcd driver */
struct platform_device mxc_fb_device = {
. name = " imx-fb " ,
. id = 0 ,
. num_resources = ARRAY_SIZE ( mxc_fb ) ,
. resource = mxc_fb ,
. dev = {
. coherent_dma_mask = 0xFFFFFFFF ,
} ,
} ;
2009-01-26 17:26:02 +01:00
# endif
2009-01-26 16:34:56 +01:00
2009-01-26 17:26:02 +01:00
# ifdef CONFIG_MACH_MX27
static struct resource mxc_fec_resources [ ] = {
{
. start = FEC_BASE_ADDR ,
. end = FEC_BASE_ADDR + 0xfff ,
. flags = IORESOURCE_MEM
} , {
. start = MXC_INT_FEC ,
. end = MXC_INT_FEC ,
. flags = IORESOURCE_IRQ
} ,
} ;
struct platform_device mxc_fec_device = {
. name = " fec " ,
. id = 0 ,
. num_resources = ARRAY_SIZE ( mxc_fec_resources ) ,
. resource = mxc_fec_resources ,
} ;
2009-01-26 16:34:56 +01:00
# endif
2008-07-05 10:02:57 +02:00
/* GPIO port description */
static struct mxc_gpio_port imx_gpio_ports [ ] = {
[ 0 ] = {
. chip . label = " gpio-0 " ,
. irq = MXC_INT_GPIO ,
2009-01-26 16:34:51 +01:00
. base = IO_ADDRESS ( GPIO_BASE_ADDR ) ,
2008-12-18 11:08:55 +01:00
. virtual_irq_start = MXC_GPIO_IRQ_START ,
2008-07-05 10:02:57 +02:00
} ,
[ 1 ] = {
. chip . label = " gpio-1 " ,
2009-01-26 16:34:51 +01:00
. base = IO_ADDRESS ( GPIO_BASE_ADDR + 0x100 ) ,
2008-12-18 11:08:55 +01:00
. virtual_irq_start = MXC_GPIO_IRQ_START + 32 ,
2008-07-05 10:02:57 +02:00
} ,
[ 2 ] = {
. chip . label = " gpio-2 " ,
2009-01-26 16:34:51 +01:00
. base = IO_ADDRESS ( GPIO_BASE_ADDR + 0x200 ) ,
2008-12-18 11:08:55 +01:00
. virtual_irq_start = MXC_GPIO_IRQ_START + 64 ,
2008-07-05 10:02:57 +02:00
} ,
[ 3 ] = {
. chip . label = " gpio-3 " ,
2009-01-26 16:34:51 +01:00
. base = IO_ADDRESS ( GPIO_BASE_ADDR + 0x300 ) ,
2008-12-18 11:08:55 +01:00
. virtual_irq_start = MXC_GPIO_IRQ_START + 96 ,
2008-07-05 10:02:57 +02:00
} ,
[ 4 ] = {
. chip . label = " gpio-4 " ,
2009-01-26 16:34:51 +01:00
. base = IO_ADDRESS ( GPIO_BASE_ADDR + 0x400 ) ,
2008-12-18 11:08:55 +01:00
. virtual_irq_start = MXC_GPIO_IRQ_START + 128 ,
2008-07-05 10:02:57 +02:00
} ,
[ 5 ] = {
. chip . label = " gpio-5 " ,
2009-01-26 16:34:51 +01:00
. base = IO_ADDRESS ( GPIO_BASE_ADDR + 0x500 ) ,
2008-12-18 11:08:55 +01:00
. virtual_irq_start = MXC_GPIO_IRQ_START + 160 ,
2008-07-05 10:02:57 +02:00
}
} ;
int __init mxc_register_gpios ( void )
{
return mxc_gpio_init ( imx_gpio_ports , ARRAY_SIZE ( imx_gpio_ports ) ) ;
}