2009-10-02 09:14:18 +02:00
/*
* Copyright 2009 Sascha Hauer , < 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 .
*/
2010-03-04 16:43:31 +01:00
/*
* This machine is known as :
* - i . MX25 3 - Stack Development System
* - i . MX25 Platform Development Kit ( i . MX25 PDK )
*/
2009-06-04 11:32:46 +02:00
# include <linux/types.h>
# include <linux/init.h>
2009-12-21 13:44:32 +02:00
# include <linux/delay.h>
2009-06-04 11:32:46 +02:00
# include <linux/clk.h>
# include <linux/irq.h>
# include <linux/gpio.h>
# include <linux/platform_device.h>
2010-05-26 15:12:11 +03:00
# include <linux/input/matrix_keypad.h>
2010-12-22 12:25:32 -02:00
# include <linux/usb/otg.h>
2009-06-04 11:32:46 +02:00
# include <mach/hardware.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>
# include <mach/common.h>
# include <mach/mx25.h>
2010-02-15 21:18:43 +01:00
# include <mach/iomux-mx25.h>
2009-06-04 11:32:46 +02:00
2010-06-16 12:34:56 +02:00
# include "devices-imx25.h"
2010-06-24 15:20:44 +02:00
static const struct imxuart_platform_data uart_pdata __initconst = {
2009-06-04 11:32:46 +02:00
. flags = IMXUART_HAVE_RTSCTS ,
} ;
2010-10-26 14:28:31 +02:00
static iomux_v3_cfg_t mx25pdk_pads [ ] = {
2009-12-21 13:44:32 +02:00
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 ,
MX25_PAD_A17__GPIO_2_3 , /* FEC_EN, GPIO 35 */
MX25_PAD_D12__GPIO_4_8 , /* FEC_RESET_B, GPIO 104 */
2010-02-17 12:33:25 +02:00
/* LCD */
MX25_PAD_LD0__LD0 ,
MX25_PAD_LD1__LD1 ,
MX25_PAD_LD2__LD2 ,
MX25_PAD_LD3__LD3 ,
MX25_PAD_LD4__LD4 ,
MX25_PAD_LD5__LD5 ,
MX25_PAD_LD6__LD6 ,
MX25_PAD_LD7__LD7 ,
MX25_PAD_LD8__LD8 ,
MX25_PAD_LD9__LD9 ,
MX25_PAD_LD10__LD10 ,
MX25_PAD_LD11__LD11 ,
MX25_PAD_LD12__LD12 ,
MX25_PAD_LD13__LD13 ,
MX25_PAD_LD14__LD14 ,
MX25_PAD_LD15__LD15 ,
MX25_PAD_GPIO_E__LD16 ,
MX25_PAD_GPIO_F__LD17 ,
MX25_PAD_HSYNC__HSYNC ,
MX25_PAD_VSYNC__VSYNC ,
MX25_PAD_LSCLK__LSCLK ,
MX25_PAD_OE_ACD__OE_ACD ,
MX25_PAD_CONTRAST__CONTRAST ,
2010-05-26 15:12:11 +03:00
/* Keypad */
MX25_PAD_KPP_ROW0__KPP_ROW0 ,
MX25_PAD_KPP_ROW1__KPP_ROW1 ,
MX25_PAD_KPP_ROW2__KPP_ROW2 ,
MX25_PAD_KPP_ROW3__KPP_ROW3 ,
MX25_PAD_KPP_COL0__KPP_COL0 ,
MX25_PAD_KPP_COL1__KPP_COL1 ,
MX25_PAD_KPP_COL2__KPP_COL2 ,
MX25_PAD_KPP_COL3__KPP_COL3 ,
2010-10-22 00:23:45 +08:00
/* SD1 */
MX25_PAD_SD1_CMD__SD1_CMD ,
MX25_PAD_SD1_CLK__SD1_CLK ,
MX25_PAD_SD1_DATA0__SD1_DATA0 ,
MX25_PAD_SD1_DATA1__SD1_DATA1 ,
MX25_PAD_SD1_DATA2__SD1_DATA2 ,
MX25_PAD_SD1_DATA3__SD1_DATA3 ,
2009-12-21 13:44:32 +02:00
} ;
2010-10-06 12:00:18 +02:00
static const struct fec_platform_data mx25_fec_pdata __initconst = {
2010-11-11 18:06:17 +01:00
. phy = PHY_INTERFACE_MODE_RMII ,
2009-12-21 13:44:32 +02:00
} ;
# define FEC_ENABLE_GPIO 35
# define FEC_RESET_B_GPIO 104
static void __init mx25pdk_fec_reset ( void )
{
gpio_request ( FEC_ENABLE_GPIO , " FEC PHY enable " ) ;
gpio_request ( FEC_RESET_B_GPIO , " FEC PHY reset " ) ;
gpio_direction_output ( FEC_ENABLE_GPIO , 0 ) ; /* drop PHY power */
gpio_direction_output ( FEC_RESET_B_GPIO , 0 ) ; /* assert reset */
udelay ( 2 ) ;
/* turn on PHY power and lift reset */
gpio_set_value ( FEC_ENABLE_GPIO , 1 ) ;
gpio_set_value ( FEC_RESET_B_GPIO , 1 ) ;
}
2010-06-16 12:34:56 +02:00
static const struct mxc_nand_platform_data
mx25pdk_nand_board_info __initconst = {
2010-01-14 11:24:15 +02:00
. width = 1 ,
. hw_ecc = 1 ,
. flash_bbt = 1 ,
} ;
2010-02-17 12:33:25 +02:00
static struct imx_fb_videomode mx25pdk_modes [ ] = {
{
. mode = {
. name = " CRT-VGA " ,
. refresh = 60 ,
. xres = 640 ,
. yres = 480 ,
. pixclock = 39683 ,
. left_margin = 45 ,
. right_margin = 114 ,
. upper_margin = 33 ,
. lower_margin = 11 ,
. hsync_len = 1 ,
. vsync_len = 1 ,
} ,
. bpp = 16 ,
. pcr = 0xFA208B80 ,
} ,
} ;
2010-11-11 15:32:21 +01:00
static const struct imx_fb_platform_data mx25pdk_fb_pdata __initconst = {
2010-02-17 12:33:25 +02:00
. mode = mx25pdk_modes ,
. num_modes = ARRAY_SIZE ( mx25pdk_modes ) ,
. pwmr = 0x00A903FF ,
. lscr1 = 0x00120300 ,
. dmacr = 0x00020010 ,
} ;
2010-05-26 15:12:11 +03:00
static const uint32_t mx25pdk_keymap [ ] = {
KEY ( 0 , 0 , KEY_UP ) ,
KEY ( 0 , 1 , KEY_DOWN ) ,
KEY ( 0 , 2 , KEY_VOLUMEDOWN ) ,
KEY ( 0 , 3 , KEY_HOME ) ,
KEY ( 1 , 0 , KEY_RIGHT ) ,
KEY ( 1 , 1 , KEY_LEFT ) ,
KEY ( 1 , 2 , KEY_ENTER ) ,
KEY ( 1 , 3 , KEY_VOLUMEUP ) ,
KEY ( 2 , 0 , KEY_F6 ) ,
KEY ( 2 , 1 , KEY_F8 ) ,
KEY ( 2 , 2 , KEY_F9 ) ,
KEY ( 2 , 3 , KEY_F10 ) ,
KEY ( 3 , 0 , KEY_F1 ) ,
KEY ( 3 , 1 , KEY_F2 ) ,
KEY ( 3 , 2 , KEY_F3 ) ,
KEY ( 3 , 3 , KEY_POWER ) ,
} ;
2010-11-11 11:35:33 +01:00
static const struct matrix_keymap_data mx25pdk_keymap_data __initdata = {
2010-05-26 15:12:11 +03:00
. keymap = mx25pdk_keymap ,
. keymap_size = ARRAY_SIZE ( mx25pdk_keymap ) ,
} ;
2010-12-22 12:25:32 -02:00
static const struct mxc_usbh_platform_data usbh2_pdata __initconst = {
. portsc = MXC_EHCI_MODE_SERIAL ,
. flags = MXC_EHCI_INTERNAL_PHY ,
} ;
static const struct fsl_usb2_platform_data otg_device_pdata __initconst = {
. operating_mode = FSL_USB2_DR_DEVICE ,
. phy_mode = FSL_USB2_PHY_UTMI ,
} ;
2009-06-04 11:32:46 +02:00
static void __init mx25pdk_init ( void )
{
2009-12-21 13:44:32 +02:00
mxc_iomux_v3_setup_multiple_pads ( mx25pdk_pads ,
ARRAY_SIZE ( mx25pdk_pads ) ) ;
2010-06-24 15:20:44 +02:00
imx25_add_imx_uart0 ( & uart_pdata ) ;
2010-12-22 12:25:32 -02:00
imx25_add_fsl_usb2_udc ( & otg_device_pdata ) ;
imx25_add_mxc_ehci_hs ( & usbh2_pdata ) ;
2010-06-16 12:34:56 +02:00
imx25_add_mxc_nand ( & mx25pdk_nand_board_info ) ;
2010-11-11 11:57:21 +01:00
imx25_add_imxdi_rtc ( NULL ) ;
2010-11-11 15:32:21 +01:00
imx25_add_imx_fb ( & mx25pdk_fb_pdata ) ;
2010-11-11 16:58:50 +01:00
imx25_add_imx2_wdt ( NULL ) ;
2009-12-21 13:44:32 +02:00
mx25pdk_fec_reset ( ) ;
2010-10-06 12:00:18 +02:00
imx25_add_fec ( & mx25_fec_pdata ) ;
2010-11-11 11:35:33 +01:00
imx25_add_imx_keypad ( & mx25pdk_keymap_data ) ;
2010-10-22 00:23:45 +08:00
2010-11-19 21:03:33 +01:00
imx25_add_sdhci_esdhc_imx ( 0 , NULL ) ;
2009-06-04 11:32:46 +02:00
}
static void __init mx25pdk_timer_init ( void )
{
2010-01-25 12:58:19 +02:00
mx25_clocks_init ( ) ;
2009-06-04 11:32:46 +02:00
}
static struct sys_timer mx25pdk_timer = {
. init = mx25pdk_timer_init ,
} ;
MACHINE_START ( MX25_3DS , " Freescale MX25PDK (3DS) " )
/* Maintainer: Freescale Semiconductor, Inc. */
2010-01-29 17:36:05 +01:00
. boot_params = MX25_PHYS_OFFSET + 0x100 ,
2009-06-04 11:32:46 +02:00
. map_io = mx25_map_io ,
. init_irq = mx25_init_irq ,
. init_machine = mx25pdk_init ,
. timer = & mx25pdk_timer ,
MACHINE_END