2008-11-23 17:35:08 +01:00
/*
* Copyright ( C ) 2008 Valentin Longchamp , EPFL Mobots group
*
* 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 . , 59 Temple Place , Suite 330 , Boston , MA 02111 - 1307 USA
*/
2009-08-10 18:33:11 +02:00
# include <linux/delay.h>
2009-11-03 18:09:51 +01:00
# include <linux/dma-mapping.h>
2009-08-10 18:33:12 +02:00
# include <linux/fsl_devices.h>
2009-04-21 10:24:56 +02:00
# include <linux/gpio.h>
2008-11-23 17:35:08 +01:00
# include <linux/init.h>
2009-04-21 10:24:56 +02:00
# include <linux/interrupt.h>
2009-08-12 11:29:19 +02:00
# include <linux/leds.h>
2009-04-17 15:20:25 +02:00
# include <linux/memory.h>
2008-11-23 17:35:08 +01:00
# include <linux/mtd/physmap.h>
# include <linux/mtd/partitions.h>
2009-04-17 15:20:25 +02:00
# include <linux/platform_device.h>
2009-11-03 18:09:49 +01:00
# include <linux/regulator/machine.h>
# include <linux/mfd/mc13783.h>
# include <linux/spi/spi.h>
2009-04-17 15:20:25 +02:00
# include <linux/types.h>
2008-11-23 17:35:08 +01:00
2009-11-23 19:16:37 +01:00
# include <linux/usb/otg.h>
# include <linux/usb/ulpi.h>
2008-11-23 17:35:08 +01:00
# include <asm/mach-types.h>
# include <asm/mach/arch.h>
# include <asm/mach/time.h>
# include <asm/mach/map.h>
2009-04-17 15:20:25 +02:00
# include <mach/board-mx31moboard.h>
2008-11-23 17:35:08 +01:00
# include <mach/common.h>
2009-04-17 15:20:25 +02:00
# include <mach/hardware.h>
2008-11-23 17:35:08 +01:00
# include <mach/imx-uart.h>
# include <mach/iomux-mx3.h>
2009-11-03 18:09:50 +01:00
# include <mach/ipu.h>
2009-04-21 10:24:22 +02:00
# include <mach/i2c.h>
2009-04-21 10:24:56 +02:00
# include <mach/mmc.h>
2009-11-23 19:16:37 +01:00
# include <mach/mxc_ehci.h>
2009-11-03 18:09:49 +01:00
# include <mach/mx3_camera.h>
# include <mach/spi.h>
2009-11-23 19:16:37 +01:00
# include <mach/ulpi.h>
2008-11-23 17:35:08 +01:00
# include "devices.h"
2009-04-17 15:20:25 +02:00
static unsigned int moboard_pins [ ] = {
/* UART0 */
MX31_PIN_TXD1__TXD1 , MX31_PIN_RXD1__RXD1 ,
2009-11-03 18:09:47 +01:00
MX31_PIN_CTS1__GPIO2_7 ,
2009-04-17 15:20:25 +02:00
/* UART4 */
MX31_PIN_PC_RST__CTS5 , MX31_PIN_PC_VS2__RTS5 ,
MX31_PIN_PC_BVD2__TXD5 , MX31_PIN_PC_BVD1__RXD5 ,
2009-04-22 10:55:50 +02:00
/* I2C0 */
MX31_PIN_I2C_DAT__I2C1_SDA , MX31_PIN_I2C_CLK__I2C1_SCL ,
/* I2C1 */
MX31_PIN_DCD_DTE1__I2C2_SDA , MX31_PIN_RI_DTE1__I2C2_SCL ,
/* SDHC1 */
MX31_PIN_SD1_DATA3__SD1_DATA3 , MX31_PIN_SD1_DATA2__SD1_DATA2 ,
MX31_PIN_SD1_DATA1__SD1_DATA1 , MX31_PIN_SD1_DATA0__SD1_DATA0 ,
MX31_PIN_SD1_CLK__SD1_CLK , MX31_PIN_SD1_CMD__SD1_CMD ,
MX31_PIN_ATA_CS0__GPIO3_26 , MX31_PIN_ATA_CS1__GPIO3_27 ,
2009-08-10 18:33:11 +02:00
/* USB reset */
MX31_PIN_GPIO1_0__GPIO1_0 ,
2009-08-10 18:33:12 +02:00
/* USB OTG */
MX31_PIN_USBOTG_DATA0__USBOTG_DATA0 ,
MX31_PIN_USBOTG_DATA1__USBOTG_DATA1 ,
MX31_PIN_USBOTG_DATA2__USBOTG_DATA2 ,
MX31_PIN_USBOTG_DATA3__USBOTG_DATA3 ,
MX31_PIN_USBOTG_DATA4__USBOTG_DATA4 ,
MX31_PIN_USBOTG_DATA5__USBOTG_DATA5 ,
MX31_PIN_USBOTG_DATA6__USBOTG_DATA6 ,
MX31_PIN_USBOTG_DATA7__USBOTG_DATA7 ,
MX31_PIN_USBOTG_CLK__USBOTG_CLK , MX31_PIN_USBOTG_DIR__USBOTG_DIR ,
MX31_PIN_USBOTG_NXT__USBOTG_NXT , MX31_PIN_USBOTG_STP__USBOTG_STP ,
MX31_PIN_USB_OC__GPIO1_30 ,
2009-11-23 19:16:37 +01:00
/* USB H2 */
MX31_PIN_USBH2_DATA0__USBH2_DATA0 ,
MX31_PIN_USBH2_DATA1__USBH2_DATA1 ,
MX31_PIN_STXD3__USBH2_DATA2 , MX31_PIN_SRXD3__USBH2_DATA3 ,
MX31_PIN_SCK3__USBH2_DATA4 , MX31_PIN_SFS3__USBH2_DATA5 ,
MX31_PIN_STXD6__USBH2_DATA6 , MX31_PIN_SRXD6__USBH2_DATA7 ,
MX31_PIN_USBH2_CLK__USBH2_CLK , MX31_PIN_USBH2_DIR__USBH2_DIR ,
MX31_PIN_USBH2_NXT__USBH2_NXT , MX31_PIN_USBH2_STP__USBH2_STP ,
MX31_PIN_SCK6__GPIO1_25 ,
2009-08-12 11:29:19 +02:00
/* LEDs */
MX31_PIN_SVEN0__GPIO2_0 , MX31_PIN_STX0__GPIO2_1 ,
MX31_PIN_SRX0__GPIO2_2 , MX31_PIN_SIMPD0__GPIO2_3 ,
2009-08-12 11:29:20 +02:00
/* SEL */
MX31_PIN_DTR_DCE1__GPIO2_8 , MX31_PIN_DSR_DCE1__GPIO2_9 ,
MX31_PIN_RI_DCE1__GPIO2_10 , MX31_PIN_DCD_DCE1__GPIO2_11 ,
2009-11-03 18:09:49 +01:00
/* SPI1 */
MX31_PIN_CSPI2_MOSI__MOSI , MX31_PIN_CSPI2_MISO__MISO ,
MX31_PIN_CSPI2_SCLK__SCLK , MX31_PIN_CSPI2_SPI_RDY__SPI_RDY ,
MX31_PIN_CSPI2_SS0__SS0 , MX31_PIN_CSPI2_SS2__SS2 ,
/* Atlas IRQ */
MX31_PIN_GPIO1_3__GPIO1_3 ,
/* SPI2 */
MX31_PIN_CSPI3_MOSI__MOSI , MX31_PIN_CSPI3_MISO__MISO ,
MX31_PIN_CSPI3_SCLK__SCLK , MX31_PIN_CSPI3_SPI_RDY__SPI_RDY ,
MX31_PIN_CSPI2_SS1__CSPI3_SS1 ,
2009-04-17 15:20:25 +02:00
} ;
2008-11-23 17:35:08 +01:00
static struct physmap_flash_data mx31moboard_flash_data = {
. width = 2 ,
} ;
static struct resource mx31moboard_flash_resource = {
. start = 0xa0000000 ,
. end = 0xa1ffffff ,
. flags = IORESOURCE_MEM ,
} ;
static struct platform_device mx31moboard_flash = {
. name = " physmap-flash " ,
. id = 0 ,
. dev = {
. platform_data = & mx31moboard_flash_data ,
} ,
. resource = & mx31moboard_flash_resource ,
. num_resources = 1 ,
} ;
2009-11-03 18:09:47 +01:00
static int moboard_uart0_init ( struct platform_device * pdev )
{
gpio_request ( IOMUX_TO_GPIO ( MX31_PIN_CTS1 ) , " uart0-cts-hack " ) ;
gpio_direction_output ( IOMUX_TO_GPIO ( MX31_PIN_CTS1 ) , 0 ) ;
return 0 ;
}
static struct imxuart_platform_data uart0_pdata = {
. init = moboard_uart0_init ,
} ;
static struct imxuart_platform_data uart4_pdata = {
2008-11-23 17:35:08 +01:00
. flags = IMXUART_HAVE_RTSCTS ,
} ;
2009-04-21 10:24:22 +02:00
static struct imxi2c_platform_data moboard_i2c0_pdata = {
. bitrate = 400000 ,
} ;
static struct imxi2c_platform_data moboard_i2c1_pdata = {
. bitrate = 100000 ,
} ;
2009-11-03 18:09:49 +01:00
static int moboard_spi1_cs [ ] = {
MXC_SPI_CS ( 0 ) ,
MXC_SPI_CS ( 2 ) ,
} ;
static struct spi_imx_master moboard_spi1_master = {
. chipselect = moboard_spi1_cs ,
. num_chipselect = ARRAY_SIZE ( moboard_spi1_cs ) ,
} ;
static struct regulator_consumer_supply sdhc_consumers [ ] = {
{
. dev = & mxcsdhc_device0 . dev ,
. supply = " sdhc0_vcc " ,
} ,
{
. dev = & mxcsdhc_device1 . dev ,
. supply = " sdhc1_vcc " ,
} ,
} ;
static struct regulator_init_data sdhc_vreg_data = {
. constraints = {
. min_uV = 2700000 ,
. max_uV = 3000000 ,
. valid_ops_mask = REGULATOR_CHANGE_VOLTAGE |
REGULATOR_CHANGE_MODE | REGULATOR_CHANGE_STATUS ,
. valid_modes_mask = REGULATOR_MODE_NORMAL |
REGULATOR_MODE_FAST ,
. always_on = 0 ,
. boot_on = 1 ,
} ,
. num_consumer_supplies = ARRAY_SIZE ( sdhc_consumers ) ,
. consumer_supplies = sdhc_consumers ,
} ;
static struct regulator_consumer_supply cam_consumers [ ] = {
{
. dev = & mx3_camera . dev ,
. supply = " cam_vcc " ,
} ,
} ;
static struct regulator_init_data cam_vreg_data = {
. constraints = {
. min_uV = 2700000 ,
. max_uV = 3000000 ,
. valid_ops_mask = REGULATOR_CHANGE_VOLTAGE |
REGULATOR_CHANGE_MODE | REGULATOR_CHANGE_STATUS ,
. valid_modes_mask = REGULATOR_MODE_NORMAL |
REGULATOR_MODE_FAST ,
. always_on = 0 ,
. boot_on = 1 ,
} ,
. num_consumer_supplies = ARRAY_SIZE ( cam_consumers ) ,
. consumer_supplies = cam_consumers ,
} ;
static struct mc13783_regulator_init_data moboard_regulators [ ] = {
{
. id = MC13783_REGU_VMMC1 ,
. init_data = & sdhc_vreg_data ,
} ,
{
. id = MC13783_REGU_VCAM ,
. init_data = & cam_vreg_data ,
} ,
} ;
static struct mc13783_platform_data moboard_pmic = {
. regulators = moboard_regulators ,
. num_regulators = ARRAY_SIZE ( moboard_regulators ) ,
2009-12-03 20:30:34 +01:00
. flags = MC13783_USE_REGULATOR | MC13783_USE_RTC |
2009-11-23 19:16:36 +01:00
MC13783_USE_ADC ,
2009-11-03 18:09:49 +01:00
} ;
static struct spi_board_info moboard_spi_board_info [ ] __initdata = {
{
. modalias = " mc13783 " ,
. irq = IOMUX_TO_IRQ ( MX31_PIN_GPIO1_3 ) ,
. max_speed_hz = 300000 ,
. bus_num = 1 ,
. chip_select = 0 ,
. platform_data = & moboard_pmic ,
. mode = SPI_CS_HIGH ,
} ,
} ;
static int moboard_spi2_cs [ ] = {
MXC_SPI_CS ( 1 ) ,
} ;
static struct spi_imx_master moboard_spi2_master = {
. chipselect = moboard_spi2_cs ,
. num_chipselect = ARRAY_SIZE ( moboard_spi2_cs ) ,
} ;
2009-04-21 10:24:56 +02:00
# define SDHC1_CD IOMUX_TO_GPIO(MX31_PIN_ATA_CS0)
# define SDHC1_WP IOMUX_TO_GPIO(MX31_PIN_ATA_CS1)
static int moboard_sdhc1_get_ro ( struct device * dev )
{
2009-08-11 17:29:21 +02:00
return ! gpio_get_value ( SDHC1_WP ) ;
2009-04-21 10:24:56 +02:00
}
static int moboard_sdhc1_init ( struct device * dev , irq_handler_t detect_irq ,
void * data )
{
2009-05-06 12:55:50 +02:00
int ret ;
ret = gpio_request ( SDHC1_CD , " sdhc-detect " ) ;
if ( ret )
return ret ;
gpio_direction_input ( SDHC1_CD ) ;
ret = gpio_request ( SDHC1_WP , " sdhc-wp " ) ;
if ( ret )
goto err_gpio_free ;
gpio_direction_input ( SDHC1_WP ) ;
ret = request_irq ( gpio_to_irq ( SDHC1_CD ) , detect_irq ,
2009-04-21 10:24:56 +02:00
IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING ,
" sdhc1-card-detect " , data ) ;
2009-05-06 12:55:50 +02:00
if ( ret )
goto err_gpio_free_2 ;
return 0 ;
err_gpio_free_2 :
gpio_free ( SDHC1_WP ) ;
err_gpio_free :
gpio_free ( SDHC1_CD ) ;
return ret ;
2009-04-21 10:24:56 +02:00
}
static void moboard_sdhc1_exit ( struct device * dev , void * data )
{
free_irq ( gpio_to_irq ( SDHC1_CD ) , data ) ;
2009-05-06 12:55:50 +02:00
gpio_free ( SDHC1_WP ) ;
gpio_free ( SDHC1_CD ) ;
2009-04-21 10:24:56 +02:00
}
static struct imxmmc_platform_data sdhc1_pdata = {
. get_ro = moboard_sdhc1_get_ro ,
. init = moboard_sdhc1_init ,
. exit = moboard_sdhc1_exit ,
} ;
2009-08-10 18:33:11 +02:00
/*
* this pin is dedicated for all mx31moboard systems , so we do it here
*/
# define USB_RESET_B IOMUX_TO_GPIO(MX31_PIN_GPIO1_0)
static void usb_xcvr_reset ( void )
{
gpio_request ( USB_RESET_B , " usb-reset " ) ;
gpio_direction_output ( USB_RESET_B , 0 ) ;
mdelay ( 1 ) ;
gpio_set_value ( USB_RESET_B , 1 ) ;
}
2009-08-10 18:33:12 +02:00
# define USB_PAD_CFG (PAD_CTL_DRV_MAX | PAD_CTL_SRE_FAST | PAD_CTL_HYS_CMOS | \
PAD_CTL_ODE_CMOS | PAD_CTL_100K_PU )
# define OTG_EN_B IOMUX_TO_GPIO(MX31_PIN_USB_OC)
static void moboard_usbotg_init ( void )
{
mxc_iomux_set_pad ( MX31_PIN_USBOTG_DATA0 , USB_PAD_CFG ) ;
mxc_iomux_set_pad ( MX31_PIN_USBOTG_DATA1 , USB_PAD_CFG ) ;
mxc_iomux_set_pad ( MX31_PIN_USBOTG_DATA2 , USB_PAD_CFG ) ;
mxc_iomux_set_pad ( MX31_PIN_USBOTG_DATA3 , USB_PAD_CFG ) ;
mxc_iomux_set_pad ( MX31_PIN_USBOTG_DATA4 , USB_PAD_CFG ) ;
mxc_iomux_set_pad ( MX31_PIN_USBOTG_DATA5 , USB_PAD_CFG ) ;
mxc_iomux_set_pad ( MX31_PIN_USBOTG_DATA6 , USB_PAD_CFG ) ;
mxc_iomux_set_pad ( MX31_PIN_USBOTG_DATA7 , USB_PAD_CFG ) ;
mxc_iomux_set_pad ( MX31_PIN_USBOTG_CLK , USB_PAD_CFG ) ;
mxc_iomux_set_pad ( MX31_PIN_USBOTG_DIR , USB_PAD_CFG ) ;
mxc_iomux_set_pad ( MX31_PIN_USBOTG_NXT , USB_PAD_CFG ) ;
mxc_iomux_set_pad ( MX31_PIN_USBOTG_STP , USB_PAD_CFG ) ;
gpio_request ( OTG_EN_B , " usb-udc-en " ) ;
gpio_direction_output ( OTG_EN_B , 0 ) ;
}
static struct fsl_usb2_platform_data usb_pdata = {
. operating_mode = FSL_USB2_DR_DEVICE ,
. phy_mode = FSL_USB2_PHY_ULPI ,
} ;
2009-12-22 17:31:05 +01:00
# if defined(CONFIG_USB_ULPI)
2009-11-23 19:16:37 +01:00
# define USBH2_EN_B IOMUX_TO_GPIO(MX31_PIN_SCK6)
static int moboard_usbh2_hw_init ( struct platform_device * pdev )
{
2010-02-09 18:13:35 +01:00
int ret ;
2009-11-23 19:16:37 +01:00
mxc_iomux_set_gpr ( MUX_PGP_UH2 , true ) ;
mxc_iomux_set_pad ( MX31_PIN_USBH2_CLK , USB_PAD_CFG ) ;
mxc_iomux_set_pad ( MX31_PIN_USBH2_DIR , USB_PAD_CFG ) ;
mxc_iomux_set_pad ( MX31_PIN_USBH2_NXT , USB_PAD_CFG ) ;
mxc_iomux_set_pad ( MX31_PIN_USBH2_STP , USB_PAD_CFG ) ;
mxc_iomux_set_pad ( MX31_PIN_USBH2_DATA0 , USB_PAD_CFG ) ;
mxc_iomux_set_pad ( MX31_PIN_USBH2_DATA1 , USB_PAD_CFG ) ;
mxc_iomux_set_pad ( MX31_PIN_SRXD6 , USB_PAD_CFG ) ;
mxc_iomux_set_pad ( MX31_PIN_STXD6 , USB_PAD_CFG ) ;
mxc_iomux_set_pad ( MX31_PIN_SFS3 , USB_PAD_CFG ) ;
mxc_iomux_set_pad ( MX31_PIN_SCK3 , USB_PAD_CFG ) ;
mxc_iomux_set_pad ( MX31_PIN_SRXD3 , USB_PAD_CFG ) ;
mxc_iomux_set_pad ( MX31_PIN_STXD3 , USB_PAD_CFG ) ;
2010-02-09 18:13:35 +01:00
ret = gpio_request ( USBH2_EN_B , " usbh2-en " ) ;
if ( ret )
return ret ;
2009-11-23 19:16:37 +01:00
gpio_direction_output ( USBH2_EN_B , 0 ) ;
return 0 ;
}
static int moboard_usbh2_hw_exit ( struct platform_device * pdev )
{
gpio_free ( USBH2_EN_B ) ;
return 0 ;
}
static struct mxc_usbh_platform_data usbh2_pdata = {
. init = moboard_usbh2_hw_init ,
. exit = moboard_usbh2_hw_exit ,
. portsc = MXC_EHCI_MODE_ULPI | MXC_EHCI_UTMI_8BIT ,
. flags = MXC_EHCI_POWER_PINS_ENABLED ,
} ;
static int __init moboard_usbh2_init ( void )
{
usbh2_pdata . otg = otg_ulpi_create ( & mxc_ulpi_access_ops ,
USB_OTG_DRV_VBUS | USB_OTG_DRV_VBUS_EXT ) ;
2009-12-04 16:50:29 +01:00
return mxc_register_device ( & mxc_usbh2 , & usbh2_pdata ) ;
2009-11-23 19:16:37 +01:00
}
2009-12-22 17:31:05 +01:00
# else
static inline int moboard_usbh2_init ( void ) { return 0 ; }
# endif
2009-11-23 19:16:37 +01:00
2009-08-12 11:29:19 +02:00
static struct gpio_led mx31moboard_leds [ ] = {
{
. name = " coreboard-led-0:red:running " ,
. default_trigger = " heartbeat " ,
. gpio = IOMUX_TO_GPIO ( MX31_PIN_SVEN0 ) ,
} , {
. name = " coreboard-led-1:red " ,
. gpio = IOMUX_TO_GPIO ( MX31_PIN_STX0 ) ,
} , {
. name = " coreboard-led-2:red " ,
. gpio = IOMUX_TO_GPIO ( MX31_PIN_SRX0 ) ,
} , {
. name = " coreboard-led-3:red " ,
. gpio = IOMUX_TO_GPIO ( MX31_PIN_SIMPD0 ) ,
} ,
} ;
static struct gpio_led_platform_data mx31moboard_led_pdata = {
. num_leds = ARRAY_SIZE ( mx31moboard_leds ) ,
. leds = mx31moboard_leds ,
} ;
static struct platform_device mx31moboard_leds_device = {
. name = " leds-gpio " ,
. id = - 1 ,
. dev = {
. platform_data = & mx31moboard_led_pdata ,
} ,
} ;
2009-08-12 11:29:20 +02:00
# define SEL0 IOMUX_TO_GPIO(MX31_PIN_DTR_DCE1)
# define SEL1 IOMUX_TO_GPIO(MX31_PIN_DSR_DCE1)
# define SEL2 IOMUX_TO_GPIO(MX31_PIN_RI_DCE1)
# define SEL3 IOMUX_TO_GPIO(MX31_PIN_DCD_DCE1)
static void mx31moboard_init_sel_gpios ( void )
{
if ( ! gpio_request ( SEL0 , " sel0 " ) ) {
gpio_direction_input ( SEL0 ) ;
gpio_export ( SEL0 , true ) ;
}
if ( ! gpio_request ( SEL1 , " sel1 " ) ) {
gpio_direction_input ( SEL1 ) ;
gpio_export ( SEL1 , true ) ;
}
if ( ! gpio_request ( SEL2 , " sel2 " ) ) {
gpio_direction_input ( SEL2 ) ;
gpio_export ( SEL2 , true ) ;
}
if ( ! gpio_request ( SEL3 , " sel3 " ) ) {
gpio_direction_input ( SEL3 ) ;
gpio_export ( SEL3 , true ) ;
}
}
2009-11-03 18:09:50 +01:00
static struct ipu_platform_data mx3_ipu_data = {
. irq_base = MXC_IPU_IRQ_START ,
} ;
2008-11-23 17:35:08 +01:00
static struct platform_device * devices [ ] __initdata = {
& mx31moboard_flash ,
2009-08-12 11:29:19 +02:00
& mx31moboard_leds_device ,
2008-11-23 17:35:08 +01:00
} ;
2009-11-03 18:09:51 +01:00
static struct mx3_camera_pdata camera_pdata = {
. dma_dev = & mx3_ipu . dev ,
. flags = MX3_CAMERA_DATAWIDTH_8 | MX3_CAMERA_DATAWIDTH_10 ,
. mclk_10khz = 4800 ,
} ;
# define CAMERA_BUF_SIZE (4*1024*1024)
static int __init mx31moboard_cam_alloc_dma ( const size_t buf_size )
{
dma_addr_t dma_handle ;
void * buf ;
int dma ;
if ( buf_size < 2 * 1024 * 1024 )
return - EINVAL ;
buf = dma_alloc_coherent ( NULL , buf_size , & dma_handle , GFP_KERNEL ) ;
if ( ! buf ) {
pr_err ( " %s: cannot allocate camera buffer-memory \n " , __func__ ) ;
return - ENOMEM ;
}
memset ( buf , 0 , buf_size ) ;
dma = dma_declare_coherent_memory ( & mx3_camera . dev ,
dma_handle , dma_handle , buf_size ,
DMA_MEMORY_MAP | DMA_MEMORY_EXCLUSIVE ) ;
/* The way we call dma_declare_coherent_memory only a malloc can fail */
return dma & DMA_MEMORY_MAP ? 0 : - ENOMEM ;
}
2009-02-16 12:47:51 +01:00
static int mx31moboard_baseboard ;
core_param ( mx31moboard_baseboard , mx31moboard_baseboard , int , 0444 ) ;
2008-11-23 17:35:08 +01:00
/*
* Board specific initialization .
*/
static void __init mxc_board_init ( void )
{
2009-04-17 15:20:25 +02:00
mxc_iomux_setup_multiple_pins ( moboard_pins , ARRAY_SIZE ( moboard_pins ) ,
" moboard " ) ;
2008-11-23 17:35:08 +01:00
platform_add_devices ( devices , ARRAY_SIZE ( devices ) ) ;
2009-11-03 18:09:47 +01:00
mxc_register_device ( & mxc_uart_device0 , & uart0_pdata ) ;
mxc_register_device ( & mxc_uart_device4 , & uart4_pdata ) ;
2009-02-16 12:47:51 +01:00
2009-08-12 11:29:20 +02:00
mx31moboard_init_sel_gpios ( ) ;
2009-04-21 10:24:22 +02:00
mxc_register_device ( & mxc_i2c_device0 , & moboard_i2c0_pdata ) ;
mxc_register_device ( & mxc_i2c_device1 , & moboard_i2c1_pdata ) ;
2009-11-03 18:09:49 +01:00
mxc_register_device ( & mxc_spi_device1 , & moboard_spi1_master ) ;
mxc_register_device ( & mxc_spi_device2 , & moboard_spi2_master ) ;
gpio_request ( IOMUX_TO_GPIO ( MX31_PIN_GPIO1_3 ) , " pmic-irq " ) ;
gpio_direction_input ( IOMUX_TO_GPIO ( MX31_PIN_GPIO1_3 ) ) ;
spi_register_board_info ( moboard_spi_board_info ,
ARRAY_SIZE ( moboard_spi_board_info ) ) ;
2009-04-21 10:24:56 +02:00
mxc_register_device ( & mxcsdhc_device0 , & sdhc1_pdata ) ;
2009-11-03 18:09:50 +01:00
mxc_register_device ( & mx3_ipu , & mx3_ipu_data ) ;
2009-11-03 18:09:51 +01:00
if ( ! mx31moboard_cam_alloc_dma ( CAMERA_BUF_SIZE ) )
mxc_register_device ( & mx3_camera , & camera_pdata ) ;
2009-11-03 18:09:50 +01:00
2009-08-10 18:33:11 +02:00
usb_xcvr_reset ( ) ;
2009-08-10 18:33:12 +02:00
moboard_usbotg_init ( ) ;
mxc_register_device ( & mxc_otg_udc_device , & usb_pdata ) ;
2009-11-23 19:16:37 +01:00
moboard_usbh2_init ( ) ;
2009-08-10 18:33:12 +02:00
2009-02-16 12:47:51 +01:00
switch ( mx31moboard_baseboard ) {
case MX31NOBOARD :
break ;
case MX31DEVBOARD :
mx31moboard_devboard_init ( ) ;
break ;
case MX31MARXBOT :
mx31moboard_marxbot_init ( ) ;
break ;
default :
2009-04-17 15:20:25 +02:00
printk ( KERN_ERR " Illegal mx31moboard_baseboard type %d \n " ,
mx31moboard_baseboard ) ;
2009-02-16 12:47:51 +01:00
}
2008-11-23 17:35:08 +01:00
}
static void __init mx31moboard_timer_init ( void )
{
2009-02-16 14:36:49 +01:00
mx31_clocks_init ( 26000000 ) ;
2008-11-23 17:35:08 +01:00
}
struct sys_timer mx31moboard_timer = {
. init = mx31moboard_timer_init ,
} ;
MACHINE_START ( MX31MOBOARD , " EPFL Mobots mx31moboard " )
/* Maintainer: Valentin Longchamp, EPFL Mobots group */
2009-12-09 11:57:21 +01:00
. phys_io = MX31_AIPS1_BASE_ADDR ,
2009-12-10 10:41:26 +01:00
. io_pg_offst = ( MX31_AIPS1_BASE_ADDR_VIRT > > 18 ) & 0xfffc ,
2010-01-29 17:36:05 +01:00
. boot_params = MX3x_PHYS_OFFSET + 0x100 ,
2009-04-02 22:32:10 +02:00
. map_io = mx31_map_io ,
2009-05-25 17:36:19 +02:00
. init_irq = mx31_init_irq ,
2008-11-23 17:35:08 +01:00
. init_machine = mxc_board_init ,
. timer = & mx31moboard_timer ,
MACHINE_END