2019-05-27 08:55:06 +02:00
// SPDX-License-Identifier: GPL-2.0-or-later
2009-05-20 19:54:33 +02:00
/*
* LILLY - 1131 module support
*
* Copyright ( c ) 2009 Daniel Mack < daniel @ caiaq . de >
*
* based on code for other MX31 boards ,
*
* Copyright 2005 - 2007 Freescale Semiconductor
* Copyright ( c ) 2009 Alberto Panizzo < maramaopercheseimorto @ gmail . com >
* Copyright ( C ) 2009 Valentin Longchamp , EPFL Mobots group
*/
# include <linux/types.h>
# include <linux/init.h>
# include <linux/clk.h>
2010-04-13 20:11:37 +02:00
# include <linux/gpio.h>
2011-01-03 11:30:28 +01:00
# include <linux/delay.h>
2009-05-20 19:54:35 +02:00
# include <linux/platform_device.h>
# include <linux/interrupt.h>
2011-07-31 19:01:27 -04:00
# include <linux/moduleparam.h>
2009-05-20 19:54:35 +02:00
# include <linux/smsc911x.h>
2009-05-20 19:54:38 +02:00
# include <linux/mtd/physmap.h>
2009-11-21 18:40:40 +01:00
# include <linux/spi/spi.h>
# include <linux/mfd/mc13783.h>
2010-04-13 20:11:37 +02:00
# include <linux/usb/otg.h>
# include <linux/usb/ulpi.h>
2012-04-02 10:39:45 -03:00
# include <linux/regulator/machine.h>
# include <linux/regulator/fixed.h>
2009-05-20 19:54:33 +02:00
# include <asm/mach-types.h>
# include <asm/mach/arch.h>
# include <asm/mach/time.h>
# include <asm/mach/map.h>
2012-09-13 09:37:49 +08:00
# include "board-mx31lilly.h"
2012-09-13 21:01:00 +08:00
# include "common.h"
2010-06-22 10:09:14 +02:00
# include "devices-imx31.h"
2014-05-19 20:41:52 +08:00
# include "ehci.h"
2012-09-14 14:14:45 +08:00
# include "hardware.h"
2012-09-13 13:26:00 +08:00
# include "iomux-mx3.h"
2012-09-13 21:46:09 +08:00
# include "ulpi.h"
2009-05-20 19:54:33 +02:00
/*
* This file contains module - specific initialization routines for LILLY - 1131.
* Initialization of peripherals found on the baseboard is implemented in the
* appropriate baseboard support code .
*/
2016-09-19 04:37:16 +03:00
static unsigned int mx31lilly_pins [ ] __initdata = {
MX31_PIN_CTS1__CTS1 ,
MX31_PIN_RTS1__RTS1 ,
MX31_PIN_TXD1__TXD1 ,
MX31_PIN_RXD1__RXD1 ,
MX31_PIN_CTS2__CTS2 ,
MX31_PIN_RTS2__RTS2 ,
MX31_PIN_TXD2__TXD2 ,
MX31_PIN_RXD2__RXD2 ,
MX31_PIN_CSPI3_MOSI__RXD3 ,
MX31_PIN_CSPI3_MISO__TXD3 ,
MX31_PIN_CSPI3_SCLK__RTS3 ,
MX31_PIN_CSPI3_SPI_RDY__CTS3 ,
} ;
/* UART */
static const struct imxuart_platform_data uart_pdata __initconst = {
. flags = IMXUART_HAVE_RTSCTS ,
} ;
2009-05-20 19:54:35 +02:00
/* SMSC ethernet support */
static struct resource smsc91x_resources [ ] = {
{
2009-12-09 11:57:21 +01:00
. start = MX31_CS4_BASE_ADDR ,
. end = MX31_CS4_BASE_ADDR + 0xffff ,
2009-05-20 19:54:35 +02:00
. flags = IORESOURCE_MEM ,
} ,
{
2011-12-02 20:00:33 +08:00
/* irq number is run-time assigned */
2009-05-20 19:54:35 +02:00
. flags = IORESOURCE_IRQ | IRQF_TRIGGER_FALLING ,
}
} ;
static struct smsc911x_platform_config smsc911x_config = {
. phy_interface = PHY_INTERFACE_MODE_MII ,
. irq_polarity = SMSC911X_IRQ_POLARITY_ACTIVE_LOW ,
. irq_type = SMSC911X_IRQ_TYPE_OPEN_DRAIN ,
. flags = SMSC911X_USE_32BIT |
SMSC911X_SAVE_MAC_ADDRESS |
SMSC911X_FORCE_INTERNAL_PHY ,
} ;
static struct platform_device smsc91x_device = {
. name = " smsc911x " ,
. id = - 1 ,
. num_resources = ARRAY_SIZE ( smsc91x_resources ) ,
. resource = smsc91x_resources ,
. dev = {
. platform_data = & smsc911x_config ,
}
} ;
2009-05-20 19:54:38 +02:00
/* NOR flash */
static struct physmap_flash_data nor_flash_data = {
. width = 2 ,
} ;
static struct resource nor_flash_resource = {
. start = 0xa0000000 ,
. end = 0xa1ffffff ,
. flags = IORESOURCE_MEM ,
} ;
static struct platform_device physmap_flash_device = {
. name = " physmap-flash " ,
. id = 0 ,
. dev = {
. platform_data = & nor_flash_data ,
} ,
. resource = & nor_flash_resource ,
. num_resources = 1 ,
} ;
2010-04-13 20:11:37 +02:00
/* USB */
# define USB_PAD_CFG (PAD_CTL_DRV_MAX | PAD_CTL_SRE_FAST | PAD_CTL_HYS_CMOS | \
PAD_CTL_ODE_CMOS | PAD_CTL_100K_PU )
static int usbh1_init ( struct platform_device * pdev )
{
int pins [ ] = {
MX31_PIN_CSPI1_MOSI__USBH1_RXDM ,
MX31_PIN_CSPI1_MISO__USBH1_RXDP ,
MX31_PIN_CSPI1_SS0__USBH1_TXDM ,
MX31_PIN_CSPI1_SS1__USBH1_TXDP ,
MX31_PIN_CSPI1_SS2__USBH1_RCV ,
MX31_PIN_CSPI1_SCLK__USBH1_OEB ,
MX31_PIN_CSPI1_SPI_RDY__USBH1_FS ,
} ;
mxc_iomux_setup_multiple_pins ( pins , ARRAY_SIZE ( pins ) , " USB H1 " ) ;
mxc_iomux_set_pad ( MX31_PIN_CSPI1_MOSI , USB_PAD_CFG ) ;
mxc_iomux_set_pad ( MX31_PIN_CSPI1_MISO , USB_PAD_CFG ) ;
mxc_iomux_set_pad ( MX31_PIN_CSPI1_SS0 , USB_PAD_CFG ) ;
mxc_iomux_set_pad ( MX31_PIN_CSPI1_SS1 , USB_PAD_CFG ) ;
mxc_iomux_set_pad ( MX31_PIN_CSPI1_SS2 , USB_PAD_CFG ) ;
mxc_iomux_set_pad ( MX31_PIN_CSPI1_SCLK , USB_PAD_CFG ) ;
mxc_iomux_set_pad ( MX31_PIN_CSPI1_SPI_RDY , USB_PAD_CFG ) ;
mxc_iomux_set_gpr ( MUX_PGP_USB_SUSPEND , true ) ;
2011-01-03 11:30:28 +01:00
mdelay ( 10 ) ;
return mx31_initialize_usb_hw ( pdev - > id , MXC_EHCI_POWER_PINS_ENABLED |
MXC_EHCI_INTERFACE_SINGLE_UNI ) ;
2010-04-13 20:11:37 +02:00
}
static int usbh2_init ( struct platform_device * pdev )
{
int pins [ ] = {
MX31_PIN_USBH2_DATA0__USBH2_DATA0 ,
MX31_PIN_USBH2_DATA1__USBH2_DATA1 ,
MX31_PIN_USBH2_CLK__USBH2_CLK ,
MX31_PIN_USBH2_DIR__USBH2_DIR ,
MX31_PIN_USBH2_NXT__USBH2_NXT ,
MX31_PIN_USBH2_STP__USBH2_STP ,
} ;
mxc_iomux_setup_multiple_pins ( pins , ARRAY_SIZE ( pins ) , " USB H2 " ) ;
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 ) ;
mxc_iomux_set_gpr ( MUX_PGP_UH2 , true ) ;
/* chip select */
mxc_iomux_alloc_pin ( IOMUX_MODE ( MX31_PIN_DTR_DCE1 , IOMUX_CONFIG_GPIO ) ,
" USBH2_CS " ) ;
gpio_request ( IOMUX_TO_GPIO ( MX31_PIN_DTR_DCE1 ) , " USBH2 CS " ) ;
gpio_direction_output ( IOMUX_TO_GPIO ( MX31_PIN_DTR_DCE1 ) , 0 ) ;
2011-01-03 11:30:28 +01:00
mdelay ( 10 ) ;
return mx31_initialize_usb_hw ( pdev - > id , MXC_EHCI_POWER_PINS_ENABLED ) ;
2010-04-13 20:11:37 +02:00
}
2010-11-15 11:57:49 +01:00
static const struct mxc_usbh_platform_data usbh1_pdata __initconst = {
2010-04-13 20:11:37 +02:00
. init = usbh1_init ,
. portsc = MXC_EHCI_MODE_UTMI | MXC_EHCI_SERIAL ,
} ;
2010-11-15 11:57:49 +01:00
static struct mxc_usbh_platform_data usbh2_pdata __initdata = {
2010-04-13 20:11:37 +02:00
. init = usbh2_init ,
. portsc = MXC_EHCI_MODE_ULPI | MXC_EHCI_UTMI_8BIT ,
} ;
2011-06-14 15:42:50 -03:00
static void __init lilly1131_usb_init ( void )
2010-05-25 16:46:55 +02:00
{
2010-11-15 11:57:49 +01:00
imx31_add_mxc_ehci_hs ( 1 , & usbh1_pdata ) ;
2010-05-25 16:46:55 +02:00
2011-03-02 09:27:42 +01:00
usbh2_pdata . otg = imx_otg_ulpi_create ( ULPI_OTG_DRVVBUS |
ULPI_OTG_DRVVBUS_EXT ) ;
if ( usbh2_pdata . otg )
imx31_add_mxc_ehci_hs ( 2 , & usbh2_pdata ) ;
}
2009-05-20 19:54:35 +02:00
2011-02-10 10:59:44 +01:00
static struct mc13xxx_platform_data mc13783_pdata __initdata = {
. flags = MC13XXX_USE_RTC | MC13XXX_USE_TOUCHSCREEN ,
2009-11-21 18:40:40 +01:00
} ;
static struct spi_board_info mc13783_dev __initdata = {
. modalias = " mc13783 " ,
. max_speed_hz = 1000000 ,
. bus_num = 1 ,
. chip_select = 0 ,
. platform_data = & mc13783_pdata ,
2011-12-02 20:00:33 +08:00
/* irq number is run-time assigned */
2009-11-21 18:40:40 +01:00
} ;
2010-05-25 16:46:55 +02:00
static struct platform_device * devices [ ] __initdata = {
& smsc91x_device ,
& physmap_flash_device ,
} ;
2009-05-20 19:54:33 +02:00
static int mx31lilly_baseboard ;
core_param ( mx31lilly_baseboard , mx31lilly_baseboard , int , 0444 ) ;
2012-04-02 10:39:45 -03:00
static struct regulator_consumer_supply dummy_supplies [ ] = {
REGULATOR_SUPPLY ( " vdd33a " , " smsc911x " ) ,
REGULATOR_SUPPLY ( " vddvario " , " smsc911x " ) ,
} ;
2009-05-20 19:54:33 +02:00
static void __init mx31lilly_board_init ( void )
{
2011-06-06 00:07:55 +08:00
imx31_soc_init ( ) ;
2016-09-19 04:37:16 +03:00
mxc_iomux_setup_multiple_pins ( mx31lilly_pins ,
ARRAY_SIZE ( mx31lilly_pins ) , " mx31lily " ) ;
imx31_add_imx_uart0 ( & uart_pdata ) ;
imx31_add_imx_uart1 ( & uart_pdata ) ;
imx31_add_imx_uart2 ( & uart_pdata ) ;
2009-05-20 19:54:35 +02:00
mxc_iomux_alloc_pin ( MX31_PIN_CS4__CS4 , " Ethernet CS " ) ;
2009-10-26 11:55:56 +01:00
/* SPI */
mxc_iomux_alloc_pin ( MX31_PIN_CSPI1_SCLK__SCLK , " SPI1_CLK " ) ;
mxc_iomux_alloc_pin ( MX31_PIN_CSPI1_MOSI__MOSI , " SPI1_TX " ) ;
mxc_iomux_alloc_pin ( MX31_PIN_CSPI1_MISO__MISO , " SPI1_RX " ) ;
mxc_iomux_alloc_pin ( MX31_PIN_CSPI1_SPI_RDY__SPI_RDY , " SPI1_RDY " ) ;
mxc_iomux_alloc_pin ( MX31_PIN_CSPI1_SS0__SS0 , " SPI1_SS0 " ) ;
mxc_iomux_alloc_pin ( MX31_PIN_CSPI1_SS1__SS1 , " SPI1_SS1 " ) ;
mxc_iomux_alloc_pin ( MX31_PIN_CSPI1_SS2__SS2 , " SPI1_SS2 " ) ;
mxc_iomux_alloc_pin ( MX31_PIN_CSPI2_SCLK__SCLK , " SPI2_CLK " ) ;
mxc_iomux_alloc_pin ( MX31_PIN_CSPI2_MOSI__MOSI , " SPI2_TX " ) ;
mxc_iomux_alloc_pin ( MX31_PIN_CSPI2_MISO__MISO , " SPI2_RX " ) ;
mxc_iomux_alloc_pin ( MX31_PIN_CSPI2_SPI_RDY__SPI_RDY , " SPI2_RDY " ) ;
mxc_iomux_alloc_pin ( MX31_PIN_CSPI2_SS0__SS0 , " SPI2_SS0 " ) ;
mxc_iomux_alloc_pin ( MX31_PIN_CSPI2_SS1__SS1 , " SPI2_SS1 " ) ;
mxc_iomux_alloc_pin ( MX31_PIN_CSPI2_SS2__SS2 , " SPI2_SS2 " ) ;
2020-06-25 22:02:52 +02:00
imx31_add_spi_imx0 ( NULL ) ;
imx31_add_spi_imx1 ( NULL ) ;
2009-10-26 11:55:56 +01:00
2012-04-02 10:39:45 -03:00
regulator_register_fixed ( 0 , dummy_supplies , ARRAY_SIZE ( dummy_supplies ) ) ;
2016-09-19 04:37:16 +03:00
}
static void __init mx31lilly_late_init ( void )
{
if ( mx31lilly_baseboard = = MX31LILLY_DB )
mx31lilly_db_init ( ) ;
mc13783_dev . irq = gpio_to_irq ( IOMUX_TO_GPIO ( MX31_PIN_GPIO1_3 ) ) ;
spi_register_board_info ( & mc13783_dev , 1 ) ;
2012-04-02 10:39:45 -03:00
2011-12-02 20:00:33 +08:00
smsc91x_resources [ 1 ] . start =
gpio_to_irq ( IOMUX_TO_GPIO ( MX31_PIN_GPIO1_0 ) ) ;
smsc91x_resources [ 1 ] . end =
gpio_to_irq ( IOMUX_TO_GPIO ( MX31_PIN_GPIO1_0 ) ) ;
2009-05-20 19:54:35 +02:00
platform_add_devices ( devices , ARRAY_SIZE ( devices ) ) ;
2010-04-13 20:11:37 +02:00
/* USB */
2010-05-25 16:46:55 +02:00
lilly1131_usb_init ( ) ;
2009-05-20 19:54:33 +02:00
}
static void __init mx31lilly_timer_init ( void )
{
mx31_clocks_init ( 26000000 ) ;
}
MACHINE_START ( LILLY1131 , " INCO startec LILLY-1131 " )
2011-07-05 22:38:12 -04:00
. atag_offset = 0x100 ,
2011-02-07 16:35:20 +01:00
. map_io = mx31_map_io ,
. init_early = imx31_init_early ,
. init_irq = mx31_init_irq ,
2012-11-08 12:40:59 -07:00
. init_time = mx31lilly_timer_init ,
2016-09-19 04:37:16 +03:00
. init_machine = mx31lilly_board_init ,
. init_late = mx31lilly_late_init ,
2011-11-06 17:12:08 +00:00
. restart = mxc_restart ,
2009-05-20 19:54:33 +02:00
MACHINE_END