17e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert/*
27e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert * Copyright 2007 Robert Schwebel <r.schwebel@pengutronix.de>, Pengutronix
37e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert * Copyright (C) 2008 Juergen Beisert (kernel@pengutronix.de)
47e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert *
57e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert * This program is free software; you can redistribute it and/or
67e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert * modify it under the terms of the GNU General Public License
77e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert * as published by the Free Software Foundation; either version 2
87e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert * of the License, or (at your option) any later version.
97e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert * This program is distributed in the hope that it will be useful,
107e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert * but WITHOUT ANY WARRANTY; without even the implied warranty of
117e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
127e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert * GNU General Public License for more details.
137e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert *
147e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert * You should have received a copy of the GNU General Public License
157e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert * along with this program; if not, write to the Free Software
167e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
177e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert * MA 02110-1301, USA.
187e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert */
197e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert
20a4e9a65a1f90e94eca3af1a69b42d039054ef9deSascha Hauer#include <linux/i2c.h>
21a4e9a65a1f90e94eca3af1a69b42d039054ef9deSascha Hauer#include <linux/i2c/at24.h>
22bff0b53bd77df7e44a1d6b1a13162e26def5d17aSascha Hauer#include <linux/io.h>
23bff0b53bd77df7e44a1d6b1a13162e26def5d17aSascha Hauer#include <linux/mtd/plat-ram.h>
24bff0b53bd77df7e44a1d6b1a13162e26def5d17aSascha Hauer#include <linux/mtd/physmap.h>
25bff0b53bd77df7e44a1d6b1a13162e26def5d17aSascha Hauer#include <linux/platform_device.h>
266153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer#include <linux/regulator/machine.h>
276153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer#include <linux/mfd/mc13783.h>
286153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer#include <linux/spi/spi.h>
296153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer#include <linux/irq.h>
30a4e9a65a1f90e94eca3af1a69b42d039054ef9deSascha Hauer
317e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert#include <asm/mach-types.h>
32bff0b53bd77df7e44a1d6b1a13162e26def5d17aSascha Hauer#include <asm/mach/arch.h>
33bff0b53bd77df7e44a1d6b1a13162e26def5d17aSascha Hauer#include <asm/mach/time.h>
34bff0b53bd77df7e44a1d6b1a13162e26def5d17aSascha Hauer
35bff0b53bd77df7e44a1d6b1a13162e26def5d17aSascha Hauer#include <mach/board-pcm038.h>
36a09e64fbc0094e3073dbb09c3b4bfe4ab669244bRussell King#include <mach/common.h>
37a09e64fbc0094e3073dbb09c3b4bfe4ab669244bRussell King#include <mach/hardware.h>
38e835d88e71f54c048a8cc907cc34084f1dd5846bUwe Kleine-König#include <mach/iomux-mx27.h>
39773f206b2f3745bde8ee17ec0f884c19db3917a5Sascha Hauer#include <mach/ulpi.h>
407e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert
410e7a29a8d97c4ea86b9975e65f554c0398a8fdbfUwe Kleine-König#include "devices-imx27.h"
427e90534a8fde3a528606ada5dedfa244d8e0452dSascha Hauer
436c80ee51707ec9fcf137bc7b511d2853b772eae6Uwe Kleine-Königstatic const int pcm038_pins[] __initconst = {
44f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	/* UART1 */
45f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PE12_PF_UART1_TXD,
46f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PE13_PF_UART1_RXD,
47f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PE14_PF_UART1_CTS,
48f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PE15_PF_UART1_RTS,
49f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	/* UART2 */
50f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PE3_PF_UART2_CTS,
51f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PE4_PF_UART2_RTS,
52f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PE6_PF_UART2_TXD,
53f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PE7_PF_UART2_RXD,
54f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	/* UART3 */
55f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PE8_PF_UART3_TXD,
56f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PE9_PF_UART3_RXD,
57f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PE10_PF_UART3_CTS,
58f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PE11_PF_UART3_RTS,
59f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	/* FEC */
60f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PD0_AIN_FEC_TXD0,
61f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PD1_AIN_FEC_TXD1,
62f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PD2_AIN_FEC_TXD2,
63f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PD3_AIN_FEC_TXD3,
64f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PD4_AOUT_FEC_RX_ER,
65f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PD5_AOUT_FEC_RXD1,
66f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PD6_AOUT_FEC_RXD2,
67f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PD7_AOUT_FEC_RXD3,
68f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PD8_AF_FEC_MDIO,
69f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PD9_AIN_FEC_MDC,
70f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PD10_AOUT_FEC_CRS,
71f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PD11_AOUT_FEC_TX_CLK,
72f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PD12_AOUT_FEC_RXD0,
73f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PD13_AOUT_FEC_RX_DV,
74f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PD14_AOUT_FEC_RX_CLK,
75f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PD15_AOUT_FEC_COL,
76f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PD16_AIN_FEC_TX_ER,
77f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PF23_AIN_FEC_TX_EN,
78f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	/* I2C2 */
79f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PC5_PF_I2C2_SDA,
80f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PC6_PF_I2C2_SCL,
81f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	/* SPI1 */
82f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PD25_PF_CSPI1_RDY,
83f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PD29_PF_CSPI1_SCLK,
84f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PD30_PF_CSPI1_MISO,
85f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PD31_PF_CSPI1_MOSI,
86f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	/* SSI1 */
87f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PC20_PF_SSI1_FS,
88f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PC21_PF_SSI1_RXD,
89f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PC22_PF_SSI1_TXD,
90f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PC23_PF_SSI1_CLK,
91f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	/* SSI4 */
92f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PC16_PF_SSI4_FS,
93f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PC17_PF_SSI4_RXD,
94f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PC18_PF_SSI4_TXD,
95f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PC19_PF_SSI4_CLK,
96773f206b2f3745bde8ee17ec0f884c19db3917a5Sascha Hauer	/* USB host */
97773f206b2f3745bde8ee17ec0f884c19db3917a5Sascha Hauer	PA0_PF_USBH2_CLK,
98773f206b2f3745bde8ee17ec0f884c19db3917a5Sascha Hauer	PA1_PF_USBH2_DIR,
99773f206b2f3745bde8ee17ec0f884c19db3917a5Sascha Hauer	PA2_PF_USBH2_DATA7,
100773f206b2f3745bde8ee17ec0f884c19db3917a5Sascha Hauer	PA3_PF_USBH2_NXT,
101773f206b2f3745bde8ee17ec0f884c19db3917a5Sascha Hauer	PA4_PF_USBH2_STP,
102773f206b2f3745bde8ee17ec0f884c19db3917a5Sascha Hauer	PD19_AF_USBH2_DATA4,
103773f206b2f3745bde8ee17ec0f884c19db3917a5Sascha Hauer	PD20_AF_USBH2_DATA3,
104773f206b2f3745bde8ee17ec0f884c19db3917a5Sascha Hauer	PD21_AF_USBH2_DATA6,
105773f206b2f3745bde8ee17ec0f884c19db3917a5Sascha Hauer	PD22_AF_USBH2_DATA0,
106773f206b2f3745bde8ee17ec0f884c19db3917a5Sascha Hauer	PD23_AF_USBH2_DATA2,
107773f206b2f3745bde8ee17ec0f884c19db3917a5Sascha Hauer	PD24_AF_USBH2_DATA1,
108773f206b2f3745bde8ee17ec0f884c19db3917a5Sascha Hauer	PD26_AF_USBH2_DATA5,
109f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer};
110f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer
1117e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert/*
1123620c0dccfd35cd39324508d8c962d10f9a44eadSascha Hauer * Phytec's PCM038 comes with 2MiB battery buffered SRAM,
1133620c0dccfd35cd39324508d8c962d10f9a44eadSascha Hauer * 16 bit width
1143620c0dccfd35cd39324508d8c962d10f9a44eadSascha Hauer */
1153620c0dccfd35cd39324508d8c962d10f9a44eadSascha Hauer
1163620c0dccfd35cd39324508d8c962d10f9a44eadSascha Hauerstatic struct platdata_mtd_ram pcm038_sram_data = {
1173620c0dccfd35cd39324508d8c962d10f9a44eadSascha Hauer	.bankwidth = 2,
1183620c0dccfd35cd39324508d8c962d10f9a44eadSascha Hauer};
1193620c0dccfd35cd39324508d8c962d10f9a44eadSascha Hauer
1203620c0dccfd35cd39324508d8c962d10f9a44eadSascha Hauerstatic struct resource pcm038_sram_resource = {
1213f35d1f5e4507ea4eb7ff5feaf624737c1b47631Uwe Kleine-König	.start = MX27_CS1_BASE_ADDR,
1223f35d1f5e4507ea4eb7ff5feaf624737c1b47631Uwe Kleine-König	.end   = MX27_CS1_BASE_ADDR + 512 * 1024 - 1,
1233620c0dccfd35cd39324508d8c962d10f9a44eadSascha Hauer	.flags = IORESOURCE_MEM,
1243620c0dccfd35cd39324508d8c962d10f9a44eadSascha Hauer};
1253620c0dccfd35cd39324508d8c962d10f9a44eadSascha Hauer
1263620c0dccfd35cd39324508d8c962d10f9a44eadSascha Hauerstatic struct platform_device pcm038_sram_mtd_device = {
1273620c0dccfd35cd39324508d8c962d10f9a44eadSascha Hauer	.name = "mtd-ram",
1283620c0dccfd35cd39324508d8c962d10f9a44eadSascha Hauer	.id = 0,
1293620c0dccfd35cd39324508d8c962d10f9a44eadSascha Hauer	.dev = {
1303620c0dccfd35cd39324508d8c962d10f9a44eadSascha Hauer		.platform_data = &pcm038_sram_data,
1313620c0dccfd35cd39324508d8c962d10f9a44eadSascha Hauer	},
1323620c0dccfd35cd39324508d8c962d10f9a44eadSascha Hauer	.num_resources = 1,
1333620c0dccfd35cd39324508d8c962d10f9a44eadSascha Hauer	.resource = &pcm038_sram_resource,
1343620c0dccfd35cd39324508d8c962d10f9a44eadSascha Hauer};
1353620c0dccfd35cd39324508d8c962d10f9a44eadSascha Hauer
1363620c0dccfd35cd39324508d8c962d10f9a44eadSascha Hauer/*
1377e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert * Phytec's phyCORE-i.MX27 comes with 32MiB flash,
1387e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert * 16 bit width
1397e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert */
1407e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisertstatic struct physmap_flash_data pcm038_flash_data = {
1417e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert	.width = 2,
1427e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert};
1437e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert
1447e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisertstatic struct resource pcm038_flash_resource = {
1457e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert	.start = 0xc0000000,
1467e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert	.end   = 0xc1ffffff,
1477e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert	.flags = IORESOURCE_MEM,
1487e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert};
1497e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert
1507e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisertstatic struct platform_device pcm038_nor_mtd_device = {
1517e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert	.name = "physmap-flash",
1527e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert	.id = 0,
1537e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert	.dev = {
1547e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert		.platform_data = &pcm038_flash_data,
1557e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert	},
1567e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert	.num_resources = 1,
1577e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert	.resource = &pcm038_flash_resource,
1587e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert};
1597e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert
160d5dac4a69fe571ec12d999174e0425f2641325d4Uwe Kleine-Königstatic const struct imxuart_platform_data uart_pdata __initconst = {
161d5dac4a69fe571ec12d999174e0425f2641325d4Uwe Kleine-König	.flags = IMXUART_HAVE_RTSCTS,
1627e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert};
1637e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert
1640e7a29a8d97c4ea86b9975e65f554c0398a8fdbfUwe Kleine-Königstatic const struct mxc_nand_platform_data
1650e7a29a8d97c4ea86b9975e65f554c0398a8fdbfUwe Kleine-Königpcm038_nand_board_info __initconst = {
16601f71a371969c753add171991d8f5ecce3b368d4Sascha Hauer	.width = 1,
16701f71a371969c753add171991d8f5ecce3b368d4Sascha Hauer	.hw_ecc = 1,
16801f71a371969c753add171991d8f5ecce3b368d4Sascha Hauer};
16901f71a371969c753add171991d8f5ecce3b368d4Sascha Hauer
1707e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisertstatic struct platform_device *platform_devices[] __initdata = {
1717e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert	&pcm038_nor_mtd_device,
1723620c0dccfd35cd39324508d8c962d10f9a44eadSascha Hauer	&pcm038_sram_mtd_device,
1737e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert};
1747e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert
1753620c0dccfd35cd39324508d8c962d10f9a44eadSascha Hauer/* On pcm038 there's a sram attached to CS1, we enable the chipselect here and
1763620c0dccfd35cd39324508d8c962d10f9a44eadSascha Hauer * setup other stuffs to access the sram. */
1773620c0dccfd35cd39324508d8c962d10f9a44eadSascha Hauerstatic void __init pcm038_init_sram(void)
1783620c0dccfd35cd39324508d8c962d10f9a44eadSascha Hauer{
17925971426532f04e9da5b2bca841bd5247138067fShawn Guo	__raw_writel(0x0000d843, MX27_IO_ADDRESS(MX27_WEIM_CSCRxU(1)));
18025971426532f04e9da5b2bca841bd5247138067fShawn Guo	__raw_writel(0x22252521, MX27_IO_ADDRESS(MX27_WEIM_CSCRxL(1)));
18125971426532f04e9da5b2bca841bd5247138067fShawn Guo	__raw_writel(0x22220a00, MX27_IO_ADDRESS(MX27_WEIM_CSCRxA(1)));
1823620c0dccfd35cd39324508d8c962d10f9a44eadSascha Hauer}
1833620c0dccfd35cd39324508d8c962d10f9a44eadSascha Hauer
184c69871597dd173af2d7615429c0ee6aa10fae42bUwe Kleine-Königstatic const struct imxi2c_platform_data pcm038_i2c1_data __initconst = {
185a4e9a65a1f90e94eca3af1a69b42d039054ef9deSascha Hauer	.bitrate = 100000,
186a4e9a65a1f90e94eca3af1a69b42d039054ef9deSascha Hauer};
187a4e9a65a1f90e94eca3af1a69b42d039054ef9deSascha Hauer
188a4e9a65a1f90e94eca3af1a69b42d039054ef9deSascha Hauerstatic struct at24_platform_data board_eeprom = {
189a4e9a65a1f90e94eca3af1a69b42d039054ef9deSascha Hauer	.byte_len = 4096,
190a4e9a65a1f90e94eca3af1a69b42d039054ef9deSascha Hauer	.page_size = 32,
191a4e9a65a1f90e94eca3af1a69b42d039054ef9deSascha Hauer	.flags = AT24_FLAG_ADDR16,
192a4e9a65a1f90e94eca3af1a69b42d039054ef9deSascha Hauer};
193a4e9a65a1f90e94eca3af1a69b42d039054ef9deSascha Hauer
194a4e9a65a1f90e94eca3af1a69b42d039054ef9deSascha Hauerstatic struct i2c_board_info pcm038_i2c_devices[] = {
195cf87a6e2fe95891575c45ba1a0ecb8cf53c09732Sascha Hauer	{
196a4e9a65a1f90e94eca3af1a69b42d039054ef9deSascha Hauer		I2C_BOARD_INFO("at24", 0x52), /* E0=0, E1=1, E2=0 */
197a4e9a65a1f90e94eca3af1a69b42d039054ef9deSascha Hauer		.platform_data = &board_eeprom,
198cf87a6e2fe95891575c45ba1a0ecb8cf53c09732Sascha Hauer	}, {
199cf87a6e2fe95891575c45ba1a0ecb8cf53c09732Sascha Hauer		I2C_BOARD_INFO("pcf8563", 0x51),
200cf87a6e2fe95891575c45ba1a0ecb8cf53c09732Sascha Hauer	}, {
201a4e9a65a1f90e94eca3af1a69b42d039054ef9deSascha Hauer		I2C_BOARD_INFO("lm75", 0x4a),
202a4e9a65a1f90e94eca3af1a69b42d039054ef9deSascha Hauer	}
203a4e9a65a1f90e94eca3af1a69b42d039054ef9deSascha Hauer};
204a4e9a65a1f90e94eca3af1a69b42d039054ef9deSascha Hauer
2056153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauerstatic int pcm038_spi_cs[] = {GPIO_PORTD + 28};
2066153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer
2077536cf992f395cb431f723041183d14a91d89c84Uwe Kleine-Königstatic const struct spi_imx_master pcm038_spi0_data __initconst = {
2086153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer	.chipselect = pcm038_spi_cs,
2096153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer	.num_chipselect = ARRAY_SIZE(pcm038_spi_cs),
2106153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer};
2116153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer
2126153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauerstatic struct regulator_consumer_supply sdhc1_consumers[] = {
2136153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer	{
2149d3d945a8d5be2c915f646e8dff8422486a77030Uwe Kleine-König		.dev_name = "mxc-mmc.1",
2156153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer		.supply	= "sdhc_vcc",
2166153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer	},
2176153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer};
2186153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer
2196153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauerstatic struct regulator_init_data sdhc1_data = {
2206153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer	.constraints = {
2216153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer		.min_uV = 3000000,
2226153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer		.max_uV = 3400000,
2236153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer		.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE |
2246153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer			REGULATOR_CHANGE_MODE | REGULATOR_CHANGE_STATUS,
2256153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer		.valid_modes_mask = REGULATOR_MODE_NORMAL |
2266153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer			REGULATOR_MODE_FAST,
2276153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer		.always_on = 0,
2286153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer		.boot_on = 0,
2296153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer	},
2306153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer	.num_consumer_supplies = ARRAY_SIZE(sdhc1_consumers),
2316153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer	.consumer_supplies = sdhc1_consumers,
2326153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer};
2336153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer
2346153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauerstatic struct regulator_consumer_supply cam_consumers[] = {
2356153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer	{
236dcc5abf08a1b783020cb11f37e645177f76e5705Fabio Estevam		.dev_name = NULL,
2376153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer		.supply	= "imx_cam_vcc",
2386153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer	},
2396153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer};
2406153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer
2416153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauerstatic struct regulator_init_data cam_data = {
2426153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer	.constraints = {
2436153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer		.min_uV = 3000000,
2446153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer		.max_uV = 3400000,
2456153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer		.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE |
2466153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer			REGULATOR_CHANGE_MODE | REGULATOR_CHANGE_STATUS,
2476153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer		.valid_modes_mask = REGULATOR_MODE_NORMAL |
2486153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer			REGULATOR_MODE_FAST,
2496153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer		.always_on = 0,
2506153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer		.boot_on = 0,
2516153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer	},
2526153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer	.num_consumer_supplies = ARRAY_SIZE(cam_consumers),
2536153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer	.consumer_supplies = cam_consumers,
2546153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer};
2556153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer
2565836372e8a0ba5cc633f61bc0484ee20c86f4b36David Janderstatic struct mc13xxx_regulator_init_data pcm038_regulators[] = {
2576153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer	{
25857c78e359a35c69eca4c88f107500f74ef7f0acfYong Shen		.id = MC13783_REG_VCAM,
2596153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer		.init_data = &cam_data,
2606153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer	}, {
26157c78e359a35c69eca4c88f107500f74ef7f0acfYong Shen		.id = MC13783_REG_VMMC1,
2626153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer		.init_data = &sdhc1_data,
2636153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer	},
2646153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer};
2656153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer
2665836372e8a0ba5cc633f61bc0484ee20c86f4b36David Janderstatic struct mc13xxx_platform_data pcm038_pmic = {
2674ec1b54c4d082d4bad19b55ca709da7e7138d542Andres Salomon	.regulators = {
2684ec1b54c4d082d4bad19b55ca709da7e7138d542Andres Salomon		.regulators = pcm038_regulators,
2694ec1b54c4d082d4bad19b55ca709da7e7138d542Andres Salomon		.num_regulators = ARRAY_SIZE(pcm038_regulators),
2704ec1b54c4d082d4bad19b55ca709da7e7138d542Andres Salomon	},
27146621ebbf5859375dc1fd4dc21d400224032fbf9Philippe Rétornaz	.flags = MC13XXX_USE_ADC | MC13XXX_USE_TOUCHSCREEN,
2726153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer};
2736153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer
2746153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauerstatic struct spi_board_info pcm038_spi_board_info[] __initdata = {
2756153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer	{
2766153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer		.modalias = "mc13783",
2776153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer		.irq = IRQ_GPIOB(23),
2786153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer		.max_speed_hz = 300000,
2796153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer		.bus_num = 0,
2806153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer		.chip_select = 0,
2816153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer		.platform_data = &pcm038_pmic,
2826153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer		.mode = SPI_CS_HIGH,
2836153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer	}
2846153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer};
2856153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer
2864bd597b633ae630e09d58957bd99870eac35fcb4Sascha Hauerstatic int pcm038_usbh2_init(struct platform_device *pdev)
2874bd597b633ae630e09d58957bd99870eac35fcb4Sascha Hauer{
2884bd597b633ae630e09d58957bd99870eac35fcb4Sascha Hauer	return mx27_initialize_usb_hw(pdev->id, MXC_EHCI_POWER_PINS_ENABLED |
2894bd597b633ae630e09d58957bd99870eac35fcb4Sascha Hauer			MXC_EHCI_INTERFACE_DIFF_UNI);
2904bd597b633ae630e09d58957bd99870eac35fcb4Sascha Hauer}
2914bd597b633ae630e09d58957bd99870eac35fcb4Sascha Hauer
2922eb42d5c287f5e883a4b3ebe668ba880caa351e5Uwe Kleine-Königstatic const struct mxc_usbh_platform_data usbh2_pdata __initconst = {
2934bd597b633ae630e09d58957bd99870eac35fcb4Sascha Hauer	.init	= pcm038_usbh2_init,
294773f206b2f3745bde8ee17ec0f884c19db3917a5Sascha Hauer	.portsc	= MXC_EHCI_MODE_ULPI,
295773f206b2f3745bde8ee17ec0f884c19db3917a5Sascha Hauer};
296773f206b2f3745bde8ee17ec0f884c19db3917a5Sascha Hauer
2977e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisertstatic void __init pcm038_init(void)
2987e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert{
299b78d8e59a6f611e229fab8ec3014c58eba975000Shawn Guo	imx27_soc_init();
300b78d8e59a6f611e229fab8ec3014c58eba975000Shawn Guo
301f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	mxc_gpio_setup_multiple_pins(pcm038_pins, ARRAY_SIZE(pcm038_pins),
302f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer			"PCM038");
303f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer
3043620c0dccfd35cd39324508d8c962d10f9a44eadSascha Hauer	pcm038_init_sram();
3057e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert
306d5dac4a69fe571ec12d999174e0425f2641325d4Uwe Kleine-König	imx27_add_imx_uart0(&uart_pdata);
307d5dac4a69fe571ec12d999174e0425f2641325d4Uwe Kleine-König	imx27_add_imx_uart1(&uart_pdata);
308d5dac4a69fe571ec12d999174e0425f2641325d4Uwe Kleine-König	imx27_add_imx_uart2(&uart_pdata);
30901f71a371969c753add171991d8f5ecce3b368d4Sascha Hauer
310ccfe30a7c8329e85ae426813a1060e27e2547dd1Holger Schurig	mxc_gpio_mode(PE16_AF_OWIRE);
3110e7a29a8d97c4ea86b9975e65f554c0398a8fdbfUwe Kleine-König	imx27_add_mxc_nand(&pcm038_nand_board_info);
3127e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert
313a4e9a65a1f90e94eca3af1a69b42d039054ef9deSascha Hauer	/* only the i2c master 1 is used on this CPU card */
314a4e9a65a1f90e94eca3af1a69b42d039054ef9deSascha Hauer	i2c_register_board_info(1, pcm038_i2c_devices,
315a4e9a65a1f90e94eca3af1a69b42d039054ef9deSascha Hauer				ARRAY_SIZE(pcm038_i2c_devices));
316a4e9a65a1f90e94eca3af1a69b42d039054ef9deSascha Hauer
31777a406da5a5b76445a816d5f043fc9aef4026ff1Uwe Kleine-König	imx27_add_imx_i2c(1, &pcm038_i2c1_data);
318a4e9a65a1f90e94eca3af1a69b42d039054ef9deSascha Hauer
3190160651a65d091f9fb3b7955347e04c1125765f8Luotao Fu	/* PE18 for user-LED D40 */
3200160651a65d091f9fb3b7955347e04c1125765f8Luotao Fu	mxc_gpio_mode(GPIO_PORTE | 18 | GPIO_GPIO | GPIO_OUT);
3210160651a65d091f9fb3b7955347e04c1125765f8Luotao Fu
3226153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer	mxc_gpio_mode(GPIO_PORTD | 28 | GPIO_GPIO | GPIO_OUT);
3236153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer
3246153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer	/* MC13783 IRQ */
3256153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer	mxc_gpio_mode(GPIO_PORTB | 23 | GPIO_GPIO | GPIO_IN);
3266153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer
3277536cf992f395cb431f723041183d14a91d89c84Uwe Kleine-König	imx27_add_spi_imx0(&pcm038_spi0_data);
3286153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer	spi_register_board_info(pcm038_spi_board_info,
3296153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer				ARRAY_SIZE(pcm038_spi_board_info));
3306153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer
3312eb42d5c287f5e883a4b3ebe668ba880caa351e5Uwe Kleine-König	imx27_add_mxc_ehci_hs(2, &usbh2_pdata);
332773f206b2f3745bde8ee17ec0f884c19db3917a5Sascha Hauer
3336bd96f3c332d422c0dda302f1b32c8e21dd75ee3Uwe Kleine-König	imx27_add_fec(NULL);
3347e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert	platform_add_devices(platform_devices, ARRAY_SIZE(platform_devices));
335e0a1961df8ad898b661cf0adcf3519254f135a44Uwe Kleine-König	imx27_add_imx2_wdt(NULL);
336ae71a5622253708aa08df231e6415fe7a1e96b10Uwe Kleine-König	imx27_add_mxc_w1(NULL);
337ff6552e4f3505da9c2886098773146be71c872e3Juergen Beisert
338ff6552e4f3505da9c2886098773146be71c872e3Juergen Beisert#ifdef CONFIG_MACH_PCM970_BASEBOARD
339ff6552e4f3505da9c2886098773146be71c872e3Juergen Beisert	pcm970_baseboard_init();
340ff6552e4f3505da9c2886098773146be71c872e3Juergen Beisert#endif
3417e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert}
3427e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert
3437e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisertstatic void __init pcm038_timer_init(void)
3447e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert{
34530c730f8f90b08d77a73998d2ee34cf1f56e95ccSascha Hauer	mx27_clocks_init(26000000);
3467e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert}
3477e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert
348058b7a6f465bebd87c1f295afdd56cc6a33dffbdHolger Schurigstatic struct sys_timer pcm038_timer = {
3497e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert	.init = pcm038_timer_init,
3507e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert};
3517e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert
3527e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen BeisertMACHINE_START(PCM038, "phyCORE-i.MX27")
353dc8f1907663e9d8f3f118e23c459f7707a7f7554Nicolas Pitre	.atag_offset = 0x100,
3543dac219615b88010601ee52e7b5fd1c32ef789eaUwe Kleine-König	.map_io = mx27_map_io,
3553dac219615b88010601ee52e7b5fd1c32ef789eaUwe Kleine-König	.init_early = imx27_init_early,
3563dac219615b88010601ee52e7b5fd1c32ef789eaUwe Kleine-König	.init_irq = mx27_init_irq,
357ffa2ea3f5d32b21cba80e9274a0c5bcd766987efSascha Hauer	.handle_irq = imx27_handle_irq,
3583dac219615b88010601ee52e7b5fd1c32ef789eaUwe Kleine-König	.timer = &pcm038_timer,
3593dac219615b88010601ee52e7b5fd1c32ef789eaUwe Kleine-König	.init_machine = pcm038_init,
36065ea7884bc12c45bc19424b0287aa3b24b022721Russell King	.restart	= mxc_restart,
3617e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen BeisertMACHINE_END
362