2008-07-05 12:03:00 +04:00
/*
* Copyright 2007 Robert Schwebel < r . schwebel @ pengutronix . de > , Pengutronix
* Copyright ( C ) 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 .
*/
2009-01-28 15:07:11 +03:00
# include <linux/i2c.h>
2013-09-27 23:06:28 +04:00
# include <linux/platform_data/at24.h>
2009-04-29 11:17:03 +04:00
# include <linux/io.h>
# include <linux/mtd/plat-ram.h>
# include <linux/mtd/physmap.h>
# include <linux/platform_device.h>
2009-09-24 12:01:53 +04:00
# include <linux/regulator/machine.h>
# include <linux/mfd/mc13783.h>
# include <linux/spi/spi.h>
# include <linux/irq.h>
2011-12-05 06:12:28 +04:00
# include <linux/gpio.h>
2009-01-28 15:07:11 +03:00
2008-07-05 12:03:00 +04:00
# include <asm/mach-types.h>
2009-04-29 11:17:03 +04:00
# include <asm/mach/arch.h>
# include <asm/mach/time.h>
2012-09-13 05:37:49 +04:00
# include "board-pcm038.h"
2012-09-13 17:01:00 +04:00
# include "common.h"
2010-06-16 09:35:31 +04:00
# include "devices-imx27.h"
2012-09-14 10:14:45 +04:00
# include "hardware.h"
2012-09-13 09:26:00 +04:00
# include "iomux-mx27.h"
2012-09-13 17:46:09 +04:00
# include "ulpi.h"
2008-09-09 12:19:41 +04:00
2010-09-28 23:53:31 +04:00
static const int pcm038_pins [ ] __initconst = {
2009-04-16 17:45:45 +04:00
/* UART1 */
PE12_PF_UART1_TXD ,
PE13_PF_UART1_RXD ,
PE14_PF_UART1_CTS ,
PE15_PF_UART1_RTS ,
/* UART2 */
PE3_PF_UART2_CTS ,
PE4_PF_UART2_RTS ,
PE6_PF_UART2_TXD ,
PE7_PF_UART2_RXD ,
/* UART3 */
PE8_PF_UART3_TXD ,
PE9_PF_UART3_RXD ,
PE10_PF_UART3_CTS ,
PE11_PF_UART3_RTS ,
/* FEC */
PD0_AIN_FEC_TXD0 ,
PD1_AIN_FEC_TXD1 ,
PD2_AIN_FEC_TXD2 ,
PD3_AIN_FEC_TXD3 ,
PD4_AOUT_FEC_RX_ER ,
PD5_AOUT_FEC_RXD1 ,
PD6_AOUT_FEC_RXD2 ,
PD7_AOUT_FEC_RXD3 ,
PD8_AF_FEC_MDIO ,
PD9_AIN_FEC_MDC ,
PD10_AOUT_FEC_CRS ,
PD11_AOUT_FEC_TX_CLK ,
PD12_AOUT_FEC_RXD0 ,
PD13_AOUT_FEC_RX_DV ,
PD14_AOUT_FEC_RX_CLK ,
PD15_AOUT_FEC_COL ,
PD16_AIN_FEC_TX_ER ,
PF23_AIN_FEC_TX_EN ,
/* I2C2 */
PC5_PF_I2C2_SDA ,
PC6_PF_I2C2_SCL ,
/* SPI1 */
PD25_PF_CSPI1_RDY ,
PD29_PF_CSPI1_SCLK ,
PD30_PF_CSPI1_MISO ,
PD31_PF_CSPI1_MOSI ,
/* SSI1 */
PC20_PF_SSI1_FS ,
PC21_PF_SSI1_RXD ,
PC22_PF_SSI1_TXD ,
PC23_PF_SSI1_CLK ,
/* SSI4 */
PC16_PF_SSI4_FS ,
PC17_PF_SSI4_RXD ,
PC18_PF_SSI4_TXD ,
PC19_PF_SSI4_CLK ,
2010-02-03 19:13:41 +03:00
/* USB host */
PA0_PF_USBH2_CLK ,
PA1_PF_USBH2_DIR ,
PA2_PF_USBH2_DATA7 ,
PA3_PF_USBH2_NXT ,
PA4_PF_USBH2_STP ,
PD19_AF_USBH2_DATA4 ,
PD20_AF_USBH2_DATA3 ,
PD21_AF_USBH2_DATA6 ,
PD22_AF_USBH2_DATA0 ,
PD23_AF_USBH2_DATA2 ,
PD24_AF_USBH2_DATA1 ,
PD26_AF_USBH2_DATA5 ,
2009-04-16 17:45:45 +04:00
} ;
2008-11-23 19:31:46 +03:00
/*
* Phytec ' s PCM038 comes with 2 MiB battery buffered SRAM ,
* 16 bit width
*/
static struct platdata_mtd_ram pcm038_sram_data = {
. bankwidth = 2 ,
} ;
static struct resource pcm038_sram_resource = {
2009-12-09 13:32:11 +03:00
. start = MX27_CS1_BASE_ADDR ,
. end = MX27_CS1_BASE_ADDR + 512 * 1024 - 1 ,
2008-11-23 19:31:46 +03:00
. flags = IORESOURCE_MEM ,
} ;
static struct platform_device pcm038_sram_mtd_device = {
. name = " mtd-ram " ,
. id = 0 ,
. dev = {
. platform_data = & pcm038_sram_data ,
} ,
. num_resources = 1 ,
. resource = & pcm038_sram_resource ,
} ;
2008-07-05 12:03:00 +04:00
/*
* Phytec ' s phyCORE - i . MX27 comes with 32 MiB flash ,
* 16 bit width
*/
static struct physmap_flash_data pcm038_flash_data = {
. width = 2 ,
} ;
static struct resource pcm038_flash_resource = {
. start = 0xc0000000 ,
. end = 0xc1ffffff ,
. flags = IORESOURCE_MEM ,
} ;
static struct platform_device pcm038_nor_mtd_device = {
. name = " physmap-flash " ,
. id = 0 ,
. dev = {
. platform_data = & pcm038_flash_data ,
} ,
. num_resources = 1 ,
. resource = & pcm038_flash_resource ,
} ;
2010-06-23 11:36:01 +04:00
static const struct imxuart_platform_data uart_pdata __initconst = {
. flags = IMXUART_HAVE_RTSCTS ,
2008-07-05 12:03:00 +04:00
} ;
2010-06-16 09:35:31 +04:00
static const struct mxc_nand_platform_data
pcm038_nand_board_info __initconst = {
2008-09-09 13:30:58 +04:00
. width = 1 ,
. hw_ecc = 1 ,
} ;
2008-07-05 12:03:00 +04:00
static struct platform_device * platform_devices [ ] __initdata = {
& pcm038_nor_mtd_device ,
2008-11-23 19:31:46 +03:00
& pcm038_sram_mtd_device ,
2008-07-05 12:03:00 +04:00
} ;
2008-11-23 19:31:46 +03:00
/* On pcm038 there's a sram attached to CS1, we enable the chipselect here and
* setup other stuffs to access the sram . */
static void __init pcm038_init_sram ( void )
{
2011-10-17 10:15:08 +04:00
__raw_writel ( 0x0000d843 , MX27_IO_ADDRESS ( MX27_WEIM_CSCRxU ( 1 ) ) ) ;
__raw_writel ( 0x22252521 , MX27_IO_ADDRESS ( MX27_WEIM_CSCRxL ( 1 ) ) ) ;
__raw_writel ( 0x22220a00 , MX27_IO_ADDRESS ( MX27_WEIM_CSCRxA ( 1 ) ) ) ;
2008-11-23 19:31:46 +03:00
}
2010-06-16 19:25:40 +04:00
static const struct imxi2c_platform_data pcm038_i2c1_data __initconst = {
2009-01-28 15:07:11 +03:00
. bitrate = 100000 ,
} ;
static struct at24_platform_data board_eeprom = {
. byte_len = 4096 ,
. page_size = 32 ,
. flags = AT24_FLAG_ADDR16 ,
} ;
static struct i2c_board_info pcm038_i2c_devices [ ] = {
2009-07-20 10:18:47 +04:00
{
2009-01-28 15:07:11 +03:00
I2C_BOARD_INFO ( " at24 " , 0x52 ) , /* E0=0, E1=1, E2=0 */
. platform_data = & board_eeprom ,
2009-07-20 10:18:47 +04:00
} , {
I2C_BOARD_INFO ( " pcf8563 " , 0x51 ) ,
} , {
2009-01-28 15:07:11 +03:00
I2C_BOARD_INFO ( " lm75 " , 0x4a ) ,
}
} ;
2009-09-24 12:01:53 +04:00
static int pcm038_spi_cs [ ] = { GPIO_PORTD + 28 } ;
2010-06-22 11:00:22 +04:00
static const struct spi_imx_master pcm038_spi0_data __initconst = {
2009-09-24 12:01:53 +04:00
. chipselect = pcm038_spi_cs ,
. num_chipselect = ARRAY_SIZE ( pcm038_spi_cs ) ,
} ;
static struct regulator_consumer_supply sdhc1_consumers [ ] = {
{
2012-09-16 12:54:30 +04:00
. dev_name = " imx21-mmc.1 " ,
2009-09-24 12:01:53 +04:00
. supply = " sdhc_vcc " ,
} ,
} ;
static struct regulator_init_data sdhc1_data = {
. constraints = {
. min_uV = 3000000 ,
. max_uV = 3400000 ,
. 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 = 0 ,
} ,
. num_consumer_supplies = ARRAY_SIZE ( sdhc1_consumers ) ,
. consumer_supplies = sdhc1_consumers ,
} ;
static struct regulator_consumer_supply cam_consumers [ ] = {
{
2012-02-15 03:48:33 +04:00
. dev_name = NULL ,
2009-09-24 12:01:53 +04:00
. supply = " imx_cam_vcc " ,
} ,
} ;
static struct regulator_init_data cam_data = {
. constraints = {
. min_uV = 3000000 ,
. max_uV = 3400000 ,
. 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 = 0 ,
} ,
. num_consumer_supplies = ARRAY_SIZE ( cam_consumers ) ,
. consumer_supplies = cam_consumers ,
} ;
2011-02-10 12:59:44 +03:00
static struct mc13xxx_regulator_init_data pcm038_regulators [ ] = {
2009-09-24 12:01:53 +04:00
{
2010-12-14 09:00:53 +03:00
. id = MC13783_REG_VCAM ,
2009-09-24 12:01:53 +04:00
. init_data = & cam_data ,
} , {
2010-12-14 09:00:53 +03:00
. id = MC13783_REG_VMMC1 ,
2009-09-24 12:01:53 +04:00
. init_data = & sdhc1_data ,
} ,
} ;
2011-02-10 12:59:44 +03:00
static struct mc13xxx_platform_data pcm038_pmic = {
2011-02-18 06:07:23 +03:00
. regulators = {
. regulators = pcm038_regulators ,
. num_regulators = ARRAY_SIZE ( pcm038_regulators ) ,
} ,
2011-09-18 19:52:33 +04:00
. flags = MC13XXX_USE_ADC | MC13XXX_USE_TOUCHSCREEN ,
2009-09-24 12:01:53 +04:00
} ;
static struct spi_board_info pcm038_spi_board_info [ ] __initdata = {
{
. modalias = " mc13783 " ,
2011-12-05 06:12:28 +04:00
/* irq number is run-time assigned */
2009-09-24 12:01:53 +04:00
. max_speed_hz = 300000 ,
. bus_num = 0 ,
. chip_select = 0 ,
. platform_data = & pcm038_pmic ,
. mode = SPI_CS_HIGH ,
}
} ;
2011-01-03 13:30:28 +03:00
static int pcm038_usbh2_init ( struct platform_device * pdev )
{
return mx27_initialize_usb_hw ( pdev - > id , MXC_EHCI_POWER_PINS_ENABLED |
MXC_EHCI_INTERFACE_DIFF_UNI ) ;
}
2010-11-05 20:52:09 +03:00
static const struct mxc_usbh_platform_data usbh2_pdata __initconst = {
2011-01-03 13:30:28 +03:00
. init = pcm038_usbh2_init ,
2010-02-03 19:13:41 +03:00
. portsc = MXC_EHCI_MODE_ULPI ,
} ;
2008-07-05 12:03:00 +04:00
static void __init pcm038_init ( void )
{
2011-06-05 20:07:55 +04:00
imx27_soc_init ( ) ;
2009-04-16 17:45:45 +04:00
mxc_gpio_setup_multiple_pins ( pcm038_pins , ARRAY_SIZE ( pcm038_pins ) ,
" PCM038 " ) ;
2008-11-23 19:31:46 +03:00
pcm038_init_sram ( ) ;
2008-07-05 12:03:00 +04:00
2010-06-23 11:36:01 +04:00
imx27_add_imx_uart0 ( & uart_pdata ) ;
imx27_add_imx_uart1 ( & uart_pdata ) ;
imx27_add_imx_uart2 ( & uart_pdata ) ;
2008-09-09 13:30:58 +04:00
2009-01-29 12:07:50 +03:00
mxc_gpio_mode ( PE16_AF_OWIRE ) ;
2010-06-16 09:35:31 +04:00
imx27_add_mxc_nand ( & pcm038_nand_board_info ) ;
2008-07-05 12:03:00 +04:00
2009-01-28 15:07:11 +03:00
/* only the i2c master 1 is used on this CPU card */
i2c_register_board_info ( 1 , pcm038_i2c_devices ,
ARRAY_SIZE ( pcm038_i2c_devices ) ) ;
2010-08-25 14:19:50 +04:00
imx27_add_imx_i2c ( 1 , & pcm038_i2c1_data ) ;
2009-01-28 15:07:11 +03:00
2009-06-18 14:21:51 +04:00
/* PE18 for user-LED D40 */
mxc_gpio_mode ( GPIO_PORTE | 18 | GPIO_GPIO | GPIO_OUT ) ;
2009-09-24 12:01:53 +04:00
mxc_gpio_mode ( GPIO_PORTD | 28 | GPIO_GPIO | GPIO_OUT ) ;
/* MC13783 IRQ */
mxc_gpio_mode ( GPIO_PORTB | 23 | GPIO_GPIO | GPIO_IN ) ;
2010-06-22 11:00:22 +04:00
imx27_add_spi_imx0 ( & pcm038_spi0_data ) ;
2011-12-05 06:12:28 +04:00
pcm038_spi_board_info [ 0 ] . irq = gpio_to_irq ( IMX_GPIO_NR ( 2 , 23 ) ) ;
2009-09-24 12:01:53 +04:00
spi_register_board_info ( pcm038_spi_board_info ,
ARRAY_SIZE ( pcm038_spi_board_info ) ) ;
2010-11-05 20:52:09 +03:00
imx27_add_mxc_ehci_hs ( 2 , & usbh2_pdata ) ;
2010-02-03 19:13:41 +03:00
2010-10-06 14:00:18 +04:00
imx27_add_fec ( NULL ) ;
2008-07-05 12:03:00 +04:00
platform_add_devices ( platform_devices , ARRAY_SIZE ( platform_devices ) ) ;
2012-07-04 18:35:54 +04:00
imx27_add_imx2_wdt ( ) ;
imx27_add_mxc_w1 ( ) ;
2008-07-05 12:03:01 +04:00
# ifdef CONFIG_MACH_PCM970_BASEBOARD
pcm970_baseboard_init ( ) ;
# endif
2008-07-05 12:03:00 +04:00
}
static void __init pcm038_timer_init ( void )
{
2009-02-16 16:36:49 +03:00
mx27_clocks_init ( 26000000 ) ;
2008-07-05 12:03:00 +04:00
}
MACHINE_START ( PCM038 , " phyCORE-i.MX27 " )
2011-07-06 06:38:12 +04:00
. atag_offset = 0x100 ,
2011-02-07 18:35:19 +03:00
. map_io = mx27_map_io ,
. init_early = imx27_init_early ,
. init_irq = mx27_init_irq ,
2011-09-20 16:31:24 +04:00
. handle_irq = imx27_handle_irq ,
2012-11-08 23:40:59 +04:00
. init_time = pcm038_timer_init ,
2011-02-07 18:35:19 +03:00
. init_machine = pcm038_init ,
2011-11-06 21:12:08 +04:00
. restart = mxc_restart ,
2008-07-05 12:03:00 +04:00
MACHINE_END