2010-06-08 13:03:01 +04:00
/*
* Copyright 2009 Sascha Hauer , < kernel @ pengutronix . de >
* Copyright 2010 Eric Bénard - Eukréa Electromatique , < eric @ eukrea . com >
*
* 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/types.h>
# include <linux/init.h>
# include <linux/delay.h>
# include <linux/clk.h>
# include <linux/irq.h>
# include <linux/gpio.h>
# include <linux/platform_device.h>
# include <linux/usb/otg.h>
# include <linux/usb/ulpi.h>
# include <asm/mach-types.h>
# include <asm/mach/arch.h>
# include <asm/mach/time.h>
# include <asm/memory.h>
# include <asm/mach/map.h>
2012-09-13 17:01:00 +04:00
# include "common.h"
2010-06-30 14:16:24 +04:00
# include "devices-imx25.h"
2012-09-13 05:37:49 +04:00
# include "eukrea-baseboards.h"
2012-09-14 10:14:45 +04:00
# include "hardware.h"
2012-09-13 09:26:00 +04:00
# include "iomux-mx25.h"
2012-09-14 10:14:45 +04:00
# include "mx25.h"
2010-06-08 13:03:01 +04:00
2010-06-30 14:16:24 +04:00
static const struct imxuart_platform_data uart_pdata __initconst = {
2010-06-08 13:03:01 +04:00
. flags = IMXUART_HAVE_RTSCTS ,
} ;
2010-10-26 16:28:31 +04:00
static iomux_v3_cfg_t eukrea_cpuimx25_pads [ ] = {
2010-06-08 13:03:01 +04:00
/* FEC - RMII */
MX25_PAD_FEC_MDC__FEC_MDC ,
MX25_PAD_FEC_MDIO__FEC_MDIO ,
MX25_PAD_FEC_TDATA0__FEC_TDATA0 ,
MX25_PAD_FEC_TDATA1__FEC_TDATA1 ,
MX25_PAD_FEC_TX_EN__FEC_TX_EN ,
MX25_PAD_FEC_RDATA0__FEC_RDATA0 ,
MX25_PAD_FEC_RDATA1__FEC_RDATA1 ,
MX25_PAD_FEC_RX_DV__FEC_RX_DV ,
MX25_PAD_FEC_TX_CLK__FEC_TX_CLK ,
/* I2C1 */
MX25_PAD_I2C1_CLK__I2C1_CLK ,
MX25_PAD_I2C1_DAT__I2C1_DAT ,
} ;
2010-10-06 14:00:18 +04:00
static const struct fec_platform_data mx25_fec_pdata __initconst = {
2010-06-08 13:03:01 +04:00
. phy = PHY_INTERFACE_MODE_RMII ,
} ;
2010-06-30 14:16:24 +04:00
static const struct mxc_nand_platform_data
eukrea_cpuimx25_nand_board_info __initconst = {
2010-06-08 13:03:01 +04:00
. width = 1 ,
. hw_ecc = 1 ,
. flash_bbt = 1 ,
} ;
2010-06-30 14:16:24 +04:00
static const struct imxi2c_platform_data
eukrea_cpuimx25_i2c0_data __initconst = {
2010-06-08 13:03:01 +04:00
. bitrate = 100000 ,
} ;
static struct i2c_board_info eukrea_cpuimx25_i2c_devices [ ] = {
{
I2C_BOARD_INFO ( " pcf8563 " , 0x51 ) ,
} ,
} ;
2011-01-03 13:30:28 +03:00
static int eukrea_cpuimx25_otg_init ( struct platform_device * pdev )
{
return mx25_initialize_usb_hw ( pdev - > id , MXC_EHCI_INTERFACE_DIFF_UNI ) ;
}
2010-11-10 23:27:55 +03:00
static const struct mxc_usbh_platform_data otg_pdata __initconst = {
2011-01-03 13:30:28 +03:00
. init = eukrea_cpuimx25_otg_init ,
2010-06-08 13:03:01 +04:00
. portsc = MXC_EHCI_MODE_UTMI ,
} ;
2011-01-03 13:30:28 +03:00
static int eukrea_cpuimx25_usbh2_init ( struct platform_device * pdev )
{
return mx25_initialize_usb_hw ( pdev - > id , MXC_EHCI_INTERFACE_SINGLE_UNI |
MXC_EHCI_INTERNAL_PHY | MXC_EHCI_IPPUE_DOWN ) ;
}
2010-11-10 23:27:55 +03:00
static const struct mxc_usbh_platform_data usbh2_pdata __initconst = {
2011-01-03 13:30:28 +03:00
. init = eukrea_cpuimx25_usbh2_init ,
2010-06-08 13:03:01 +04:00
. portsc = MXC_EHCI_MODE_SERIAL ,
} ;
2010-11-10 23:50:07 +03:00
static const struct fsl_usb2_platform_data otg_device_pdata __initconst = {
2010-06-08 13:03:01 +04:00
. operating_mode = FSL_USB2_DR_DEVICE ,
. phy_mode = FSL_USB2_PHY_UTMI ,
2012-05-08 11:20:16 +04:00
. workaround = FLS_USB2_WORKAROUND_ENGCM09152 ,
2010-06-08 13:03:01 +04:00
} ;
2012-06-12 21:46:43 +04:00
static bool otg_mode_host __initdata ;
2010-06-08 13:03:01 +04:00
static int __init eukrea_cpuimx25_otg_mode ( char * options )
{
if ( ! strcmp ( options , " host " ) )
2012-06-12 21:46:43 +04:00
otg_mode_host = true ;
2010-06-08 13:03:01 +04:00
else if ( ! strcmp ( options , " device " ) )
2012-06-12 21:46:43 +04:00
otg_mode_host = false ;
2010-06-08 13:03:01 +04:00
else
pr_info ( " otg_mode neither \" host \" nor \" device \" . "
" Defaulting to device \n " ) ;
2012-06-12 21:46:43 +04:00
return 1 ;
2010-06-08 13:03:01 +04:00
}
__setup ( " otg_mode= " , eukrea_cpuimx25_otg_mode ) ;
static void __init eukrea_cpuimx25_init ( void )
{
2011-06-05 20:07:55 +04:00
imx25_soc_init ( ) ;
2010-06-08 13:03:01 +04:00
if ( mxc_iomux_v3_setup_multiple_pads ( eukrea_cpuimx25_pads ,
ARRAY_SIZE ( eukrea_cpuimx25_pads ) ) )
printk ( KERN_ERR " error setting cpuimx25 pads ! \n " ) ;
2010-06-30 14:16:24 +04:00
imx25_add_imx_uart0 ( & uart_pdata ) ;
imx25_add_mxc_nand ( & eukrea_cpuimx25_nand_board_info ) ;
2012-07-04 18:35:54 +04:00
imx25_add_imxdi_rtc ( ) ;
2010-10-06 14:00:18 +04:00
imx25_add_fec ( & mx25_fec_pdata ) ;
2012-07-04 18:35:54 +04:00
imx25_add_imx2_wdt ( ) ;
2010-06-08 13:03:01 +04:00
i2c_register_board_info ( 0 , eukrea_cpuimx25_i2c_devices ,
ARRAY_SIZE ( eukrea_cpuimx25_i2c_devices ) ) ;
2010-06-30 14:16:24 +04:00
imx25_add_imx_i2c0 ( & eukrea_cpuimx25_i2c0_data ) ;
2010-06-08 13:03:01 +04:00
2010-10-05 20:02:30 +04:00
if ( otg_mode_host )
2010-11-10 23:27:55 +03:00
imx25_add_mxc_ehci_otg ( & otg_pdata ) ;
2010-10-05 20:02:30 +04:00
else
2010-11-10 23:50:07 +03:00
imx25_add_fsl_usb2_udc ( & otg_device_pdata ) ;
2010-06-08 13:03:01 +04:00
2010-11-10 23:27:55 +03:00
imx25_add_mxc_ehci_hs ( & usbh2_pdata ) ;
2010-10-05 20:02:30 +04:00
2010-07-31 00:58:40 +04:00
# ifdef CONFIG_MACH_EUKREA_MBIMXSD25_BASEBOARD
eukrea_mbimxsd25_baseboard_init ( ) ;
2010-06-08 13:03:01 +04:00
# endif
}
static void __init eukrea_cpuimx25_timer_init ( void )
{
mx25_clocks_init ( ) ;
}
static struct sys_timer eukrea_cpuimx25_timer = {
. init = eukrea_cpuimx25_timer_init ,
} ;
2011-08-22 18:41:46 +04:00
MACHINE_START ( EUKREA_CPUIMX25SD , " Eukrea CPUIMX25 " )
2010-06-08 13:03:01 +04:00
/* Maintainer: Eukrea Electromatique */
2011-07-06 06:38:12 +04:00
. atag_offset = 0x100 ,
2011-02-07 18:35:19 +03:00
. map_io = mx25_map_io ,
. init_early = imx25_init_early ,
. init_irq = mx25_init_irq ,
2011-09-20 16:31:24 +04:00
. handle_irq = imx25_handle_irq ,
2011-02-07 18:35:19 +03:00
. timer = & eukrea_cpuimx25_timer ,
. init_machine = eukrea_cpuimx25_init ,
2011-11-06 21:12:08 +04:00
. restart = mxc_restart ,
2010-06-08 13:03:01 +04:00
MACHINE_END