mach-pcm038.c revision ae71a5622253708aa08df231e6415fe7a1e96b10
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>
3901f71a371969c753add171991d8f5ecce3b368d4Sascha Hauer#include <mach/mxc_nand.h>
40773f206b2f3745bde8ee17ec0f884c19db3917a5Sascha Hauer#include <mach/mxc_ehci.h>
41773f206b2f3745bde8ee17ec0f884c19db3917a5Sascha Hauer#include <mach/ulpi.h>
427e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert
430e7a29a8d97c4ea86b9975e65f554c0398a8fdbfUwe Kleine-König#include "devices-imx27.h"
447e90534a8fde3a528606ada5dedfa244d8e0452dSascha Hauer#include "devices.h"
457e90534a8fde3a528606ada5dedfa244d8e0452dSascha Hauer
466c80ee51707ec9fcf137bc7b511d2853b772eae6Uwe Kleine-Königstatic const int pcm038_pins[] __initconst = {
47f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	/* UART1 */
48f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PE12_PF_UART1_TXD,
49f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PE13_PF_UART1_RXD,
50f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PE14_PF_UART1_CTS,
51f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PE15_PF_UART1_RTS,
52f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	/* UART2 */
53f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PE3_PF_UART2_CTS,
54f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PE4_PF_UART2_RTS,
55f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PE6_PF_UART2_TXD,
56f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PE7_PF_UART2_RXD,
57f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	/* UART3 */
58f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PE8_PF_UART3_TXD,
59f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PE9_PF_UART3_RXD,
60f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PE10_PF_UART3_CTS,
61f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PE11_PF_UART3_RTS,
62f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	/* FEC */
63f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PD0_AIN_FEC_TXD0,
64f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PD1_AIN_FEC_TXD1,
65f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PD2_AIN_FEC_TXD2,
66f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PD3_AIN_FEC_TXD3,
67f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PD4_AOUT_FEC_RX_ER,
68f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PD5_AOUT_FEC_RXD1,
69f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PD6_AOUT_FEC_RXD2,
70f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PD7_AOUT_FEC_RXD3,
71f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PD8_AF_FEC_MDIO,
72f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PD9_AIN_FEC_MDC,
73f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PD10_AOUT_FEC_CRS,
74f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PD11_AOUT_FEC_TX_CLK,
75f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PD12_AOUT_FEC_RXD0,
76f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PD13_AOUT_FEC_RX_DV,
77f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PD14_AOUT_FEC_RX_CLK,
78f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PD15_AOUT_FEC_COL,
79f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PD16_AIN_FEC_TX_ER,
80f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PF23_AIN_FEC_TX_EN,
81f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	/* I2C2 */
82f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PC5_PF_I2C2_SDA,
83f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PC6_PF_I2C2_SCL,
84f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	/* SPI1 */
85f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PD25_PF_CSPI1_RDY,
86f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PD29_PF_CSPI1_SCLK,
87f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PD30_PF_CSPI1_MISO,
88f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PD31_PF_CSPI1_MOSI,
89f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	/* SSI1 */
90f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PC20_PF_SSI1_FS,
91f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PC21_PF_SSI1_RXD,
92f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PC22_PF_SSI1_TXD,
93f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PC23_PF_SSI1_CLK,
94f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	/* SSI4 */
95f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PC16_PF_SSI4_FS,
96f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PC17_PF_SSI4_RXD,
97f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PC18_PF_SSI4_TXD,
98f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	PC19_PF_SSI4_CLK,
99773f206b2f3745bde8ee17ec0f884c19db3917a5Sascha Hauer	/* USB host */
100773f206b2f3745bde8ee17ec0f884c19db3917a5Sascha Hauer	PA0_PF_USBH2_CLK,
101773f206b2f3745bde8ee17ec0f884c19db3917a5Sascha Hauer	PA1_PF_USBH2_DIR,
102773f206b2f3745bde8ee17ec0f884c19db3917a5Sascha Hauer	PA2_PF_USBH2_DATA7,
103773f206b2f3745bde8ee17ec0f884c19db3917a5Sascha Hauer	PA3_PF_USBH2_NXT,
104773f206b2f3745bde8ee17ec0f884c19db3917a5Sascha Hauer	PA4_PF_USBH2_STP,
105773f206b2f3745bde8ee17ec0f884c19db3917a5Sascha Hauer	PD19_AF_USBH2_DATA4,
106773f206b2f3745bde8ee17ec0f884c19db3917a5Sascha Hauer	PD20_AF_USBH2_DATA3,
107773f206b2f3745bde8ee17ec0f884c19db3917a5Sascha Hauer	PD21_AF_USBH2_DATA6,
108773f206b2f3745bde8ee17ec0f884c19db3917a5Sascha Hauer	PD22_AF_USBH2_DATA0,
109773f206b2f3745bde8ee17ec0f884c19db3917a5Sascha Hauer	PD23_AF_USBH2_DATA2,
110773f206b2f3745bde8ee17ec0f884c19db3917a5Sascha Hauer	PD24_AF_USBH2_DATA1,
111773f206b2f3745bde8ee17ec0f884c19db3917a5Sascha Hauer	PD26_AF_USBH2_DATA5,
112f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer};
113f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer
1147e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert/*
1153620c0dccfd35cd39324508d8c962d10f9a44eadSascha Hauer * Phytec's PCM038 comes with 2MiB battery buffered SRAM,
1163620c0dccfd35cd39324508d8c962d10f9a44eadSascha Hauer * 16 bit width
1173620c0dccfd35cd39324508d8c962d10f9a44eadSascha Hauer */
1183620c0dccfd35cd39324508d8c962d10f9a44eadSascha Hauer
1193620c0dccfd35cd39324508d8c962d10f9a44eadSascha Hauerstatic struct platdata_mtd_ram pcm038_sram_data = {
1203620c0dccfd35cd39324508d8c962d10f9a44eadSascha Hauer	.bankwidth = 2,
1213620c0dccfd35cd39324508d8c962d10f9a44eadSascha Hauer};
1223620c0dccfd35cd39324508d8c962d10f9a44eadSascha Hauer
1233620c0dccfd35cd39324508d8c962d10f9a44eadSascha Hauerstatic struct resource pcm038_sram_resource = {
1243f35d1f5e4507ea4eb7ff5feaf624737c1b47631Uwe Kleine-König	.start = MX27_CS1_BASE_ADDR,
1253f35d1f5e4507ea4eb7ff5feaf624737c1b47631Uwe Kleine-König	.end   = MX27_CS1_BASE_ADDR + 512 * 1024 - 1,
1263620c0dccfd35cd39324508d8c962d10f9a44eadSascha Hauer	.flags = IORESOURCE_MEM,
1273620c0dccfd35cd39324508d8c962d10f9a44eadSascha Hauer};
1283620c0dccfd35cd39324508d8c962d10f9a44eadSascha Hauer
1293620c0dccfd35cd39324508d8c962d10f9a44eadSascha Hauerstatic struct platform_device pcm038_sram_mtd_device = {
1303620c0dccfd35cd39324508d8c962d10f9a44eadSascha Hauer	.name = "mtd-ram",
1313620c0dccfd35cd39324508d8c962d10f9a44eadSascha Hauer	.id = 0,
1323620c0dccfd35cd39324508d8c962d10f9a44eadSascha Hauer	.dev = {
1333620c0dccfd35cd39324508d8c962d10f9a44eadSascha Hauer		.platform_data = &pcm038_sram_data,
1343620c0dccfd35cd39324508d8c962d10f9a44eadSascha Hauer	},
1353620c0dccfd35cd39324508d8c962d10f9a44eadSascha Hauer	.num_resources = 1,
1363620c0dccfd35cd39324508d8c962d10f9a44eadSascha Hauer	.resource = &pcm038_sram_resource,
1373620c0dccfd35cd39324508d8c962d10f9a44eadSascha Hauer};
1383620c0dccfd35cd39324508d8c962d10f9a44eadSascha Hauer
1393620c0dccfd35cd39324508d8c962d10f9a44eadSascha Hauer/*
1407e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert * Phytec's phyCORE-i.MX27 comes with 32MiB flash,
1417e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert * 16 bit width
1427e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert */
1437e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisertstatic struct physmap_flash_data pcm038_flash_data = {
1447e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert	.width = 2,
1457e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert};
1467e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert
1477e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisertstatic struct resource pcm038_flash_resource = {
1487e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert	.start = 0xc0000000,
1497e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert	.end   = 0xc1ffffff,
1507e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert	.flags = IORESOURCE_MEM,
1517e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert};
1527e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert
1537e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisertstatic struct platform_device pcm038_nor_mtd_device = {
1547e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert	.name = "physmap-flash",
1557e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert	.id = 0,
1567e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert	.dev = {
1577e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert		.platform_data = &pcm038_flash_data,
1587e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert	},
1597e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert	.num_resources = 1,
1607e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert	.resource = &pcm038_flash_resource,
1617e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert};
1627e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert
163d5dac4a69fe571ec12d999174e0425f2641325d4Uwe Kleine-Königstatic const struct imxuart_platform_data uart_pdata __initconst = {
164d5dac4a69fe571ec12d999174e0425f2641325d4Uwe Kleine-König	.flags = IMXUART_HAVE_RTSCTS,
1657e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert};
1667e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert
1670e7a29a8d97c4ea86b9975e65f554c0398a8fdbfUwe Kleine-Königstatic const struct mxc_nand_platform_data
1680e7a29a8d97c4ea86b9975e65f554c0398a8fdbfUwe Kleine-Königpcm038_nand_board_info __initconst = {
16901f71a371969c753add171991d8f5ecce3b368d4Sascha Hauer	.width = 1,
17001f71a371969c753add171991d8f5ecce3b368d4Sascha Hauer	.hw_ecc = 1,
17101f71a371969c753add171991d8f5ecce3b368d4Sascha Hauer};
17201f71a371969c753add171991d8f5ecce3b368d4Sascha Hauer
1737e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisertstatic struct platform_device *platform_devices[] __initdata = {
1747e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert	&pcm038_nor_mtd_device,
1753620c0dccfd35cd39324508d8c962d10f9a44eadSascha Hauer	&pcm038_sram_mtd_device,
176f13899da00e1b815211cf246c7d2704db3c18e37Wolfram Sang	&mxc_wdt,
1777e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert};
1787e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert
1793620c0dccfd35cd39324508d8c962d10f9a44eadSascha Hauer/* On pcm038 there's a sram attached to CS1, we enable the chipselect here and
1803620c0dccfd35cd39324508d8c962d10f9a44eadSascha Hauer * setup other stuffs to access the sram. */
1813620c0dccfd35cd39324508d8c962d10f9a44eadSascha Hauerstatic void __init pcm038_init_sram(void)
1823620c0dccfd35cd39324508d8c962d10f9a44eadSascha Hauer{
183a8dfb6462a033984b99fee4122fe0799a31f5bb4Uwe Kleine-König	mx27_setup_weimcs(1, 0x0000d843, 0x22252521, 0x22220a00);
1843620c0dccfd35cd39324508d8c962d10f9a44eadSascha Hauer}
1853620c0dccfd35cd39324508d8c962d10f9a44eadSascha Hauer
186c69871597dd173af2d7615429c0ee6aa10fae42bUwe Kleine-Königstatic const struct imxi2c_platform_data pcm038_i2c1_data __initconst = {
187a4e9a65a1f90e94eca3af1a69b42d039054ef9deSascha Hauer	.bitrate = 100000,
188a4e9a65a1f90e94eca3af1a69b42d039054ef9deSascha Hauer};
189a4e9a65a1f90e94eca3af1a69b42d039054ef9deSascha Hauer
190a4e9a65a1f90e94eca3af1a69b42d039054ef9deSascha Hauerstatic struct at24_platform_data board_eeprom = {
191a4e9a65a1f90e94eca3af1a69b42d039054ef9deSascha Hauer	.byte_len = 4096,
192a4e9a65a1f90e94eca3af1a69b42d039054ef9deSascha Hauer	.page_size = 32,
193a4e9a65a1f90e94eca3af1a69b42d039054ef9deSascha Hauer	.flags = AT24_FLAG_ADDR16,
194a4e9a65a1f90e94eca3af1a69b42d039054ef9deSascha Hauer};
195a4e9a65a1f90e94eca3af1a69b42d039054ef9deSascha Hauer
196a4e9a65a1f90e94eca3af1a69b42d039054ef9deSascha Hauerstatic struct i2c_board_info pcm038_i2c_devices[] = {
197cf87a6e2fe95891575c45ba1a0ecb8cf53c09732Sascha Hauer	{
198a4e9a65a1f90e94eca3af1a69b42d039054ef9deSascha Hauer		I2C_BOARD_INFO("at24", 0x52), /* E0=0, E1=1, E2=0 */
199a4e9a65a1f90e94eca3af1a69b42d039054ef9deSascha Hauer		.platform_data = &board_eeprom,
200cf87a6e2fe95891575c45ba1a0ecb8cf53c09732Sascha Hauer	}, {
201cf87a6e2fe95891575c45ba1a0ecb8cf53c09732Sascha Hauer		I2C_BOARD_INFO("pcf8563", 0x51),
202cf87a6e2fe95891575c45ba1a0ecb8cf53c09732Sascha Hauer	}, {
203a4e9a65a1f90e94eca3af1a69b42d039054ef9deSascha Hauer		I2C_BOARD_INFO("lm75", 0x4a),
204a4e9a65a1f90e94eca3af1a69b42d039054ef9deSascha Hauer	}
205a4e9a65a1f90e94eca3af1a69b42d039054ef9deSascha Hauer};
206a4e9a65a1f90e94eca3af1a69b42d039054ef9deSascha Hauer
2076153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauerstatic int pcm038_spi_cs[] = {GPIO_PORTD + 28};
2086153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer
2097536cf992f395cb431f723041183d14a91d89c84Uwe Kleine-Königstatic const struct spi_imx_master pcm038_spi0_data __initconst = {
2106153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer	.chipselect = pcm038_spi_cs,
2116153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer	.num_chipselect = ARRAY_SIZE(pcm038_spi_cs),
2126153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer};
2136153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer
2146153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauerstatic struct regulator_consumer_supply sdhc1_consumers[] = {
2156153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer	{
2166153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer		.dev	= &mxc_sdhc_device1.dev,
2176153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer		.supply	= "sdhc_vcc",
2186153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer	},
2196153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer};
2206153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer
2216153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauerstatic struct regulator_init_data sdhc1_data = {
2226153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer	.constraints = {
2236153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer		.min_uV = 3000000,
2246153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer		.max_uV = 3400000,
2256153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer		.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE |
2266153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer			REGULATOR_CHANGE_MODE | REGULATOR_CHANGE_STATUS,
2276153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer		.valid_modes_mask = REGULATOR_MODE_NORMAL |
2286153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer			REGULATOR_MODE_FAST,
2296153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer		.always_on = 0,
2306153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer		.boot_on = 0,
2316153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer	},
2326153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer	.num_consumer_supplies = ARRAY_SIZE(sdhc1_consumers),
2336153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer	.consumer_supplies = sdhc1_consumers,
2346153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer};
2356153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer
2366153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauerstatic struct regulator_consumer_supply cam_consumers[] = {
2376153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer	{
2386153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer		.dev	= NULL,
2396153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer		.supply	= "imx_cam_vcc",
2406153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer	},
2416153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer};
2426153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer
2436153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauerstatic struct regulator_init_data cam_data = {
2446153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer	.constraints = {
2456153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer		.min_uV = 3000000,
2466153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer		.max_uV = 3400000,
2476153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer		.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE |
2486153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer			REGULATOR_CHANGE_MODE | REGULATOR_CHANGE_STATUS,
2496153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer		.valid_modes_mask = REGULATOR_MODE_NORMAL |
2506153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer			REGULATOR_MODE_FAST,
2516153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer		.always_on = 0,
2526153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer		.boot_on = 0,
2536153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer	},
2546153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer	.num_consumer_supplies = ARRAY_SIZE(cam_consumers),
2556153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer	.consumer_supplies = cam_consumers,
2566153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer};
2576153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer
2587ad211e35b41166ccf8448345726f324f26260f7Uwe Kleine-Königstatic struct mc13783_regulator_init_data pcm038_regulators[] = {
2596153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer	{
2606153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer		.id = MC13783_REGU_VCAM,
2616153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer		.init_data = &cam_data,
2626153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer	}, {
2636153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer		.id = MC13783_REGU_VMMC1,
2646153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer		.init_data = &sdhc1_data,
2656153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer	},
2666153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer};
2676153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer
2686153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauerstatic struct mc13783_platform_data pcm038_pmic = {
2696153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer	.regulators = pcm038_regulators,
2706153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer	.num_regulators = ARRAY_SIZE(pcm038_regulators),
2716153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer	.flags = MC13783_USE_ADC | MC13783_USE_REGULATOR |
2726153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer		 MC13783_USE_TOUCHSCREEN,
2736153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer};
2746153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer
2756153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauerstatic struct spi_board_info pcm038_spi_board_info[] __initdata = {
2766153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer	{
2776153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer		.modalias = "mc13783",
2786153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer		.irq = IRQ_GPIOB(23),
2796153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer		.max_speed_hz = 300000,
2806153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer		.bus_num = 0,
2816153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer		.chip_select = 0,
2826153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer		.platform_data = &pcm038_pmic,
2836153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer		.mode = SPI_CS_HIGH,
2846153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer	}
2856153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer};
2866153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer
287773f206b2f3745bde8ee17ec0f884c19db3917a5Sascha Hauerstatic struct mxc_usbh_platform_data usbh2_pdata = {
288773f206b2f3745bde8ee17ec0f884c19db3917a5Sascha Hauer	.portsc	= MXC_EHCI_MODE_ULPI,
289773f206b2f3745bde8ee17ec0f884c19db3917a5Sascha Hauer	.flags	= MXC_EHCI_POWER_PINS_ENABLED | MXC_EHCI_INTERFACE_DIFF_UNI,
290773f206b2f3745bde8ee17ec0f884c19db3917a5Sascha Hauer};
291773f206b2f3745bde8ee17ec0f884c19db3917a5Sascha Hauer
2927e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisertstatic void __init pcm038_init(void)
2937e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert{
294f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer	mxc_gpio_setup_multiple_pins(pcm038_pins, ARRAY_SIZE(pcm038_pins),
295f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer			"PCM038");
296f231ea441a6e4b025d971b023ff010094626fdb0Sascha Hauer
2973620c0dccfd35cd39324508d8c962d10f9a44eadSascha Hauer	pcm038_init_sram();
2987e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert
299d5dac4a69fe571ec12d999174e0425f2641325d4Uwe Kleine-König	imx27_add_imx_uart0(&uart_pdata);
300d5dac4a69fe571ec12d999174e0425f2641325d4Uwe Kleine-König	imx27_add_imx_uart1(&uart_pdata);
301d5dac4a69fe571ec12d999174e0425f2641325d4Uwe Kleine-König	imx27_add_imx_uart2(&uart_pdata);
30201f71a371969c753add171991d8f5ecce3b368d4Sascha Hauer
303ccfe30a7c8329e85ae426813a1060e27e2547dd1Holger Schurig	mxc_gpio_mode(PE16_AF_OWIRE);
3040e7a29a8d97c4ea86b9975e65f554c0398a8fdbfUwe Kleine-König	imx27_add_mxc_nand(&pcm038_nand_board_info);
3057e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert
306a4e9a65a1f90e94eca3af1a69b42d039054ef9deSascha Hauer	/* only the i2c master 1 is used on this CPU card */
307a4e9a65a1f90e94eca3af1a69b42d039054ef9deSascha Hauer	i2c_register_board_info(1, pcm038_i2c_devices,
308a4e9a65a1f90e94eca3af1a69b42d039054ef9deSascha Hauer				ARRAY_SIZE(pcm038_i2c_devices));
309a4e9a65a1f90e94eca3af1a69b42d039054ef9deSascha Hauer
31077a406da5a5b76445a816d5f043fc9aef4026ff1Uwe Kleine-König	imx27_add_imx_i2c(1, &pcm038_i2c1_data);
311a4e9a65a1f90e94eca3af1a69b42d039054ef9deSascha Hauer
3120160651a65d091f9fb3b7955347e04c1125765f8Luotao Fu	/* PE18 for user-LED D40 */
3130160651a65d091f9fb3b7955347e04c1125765f8Luotao Fu	mxc_gpio_mode(GPIO_PORTE | 18 | GPIO_GPIO | GPIO_OUT);
3140160651a65d091f9fb3b7955347e04c1125765f8Luotao Fu
3156153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer	mxc_gpio_mode(GPIO_PORTD | 28 | GPIO_GPIO | GPIO_OUT);
3166153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer
3176153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer	/* MC13783 IRQ */
3186153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer	mxc_gpio_mode(GPIO_PORTB | 23 | GPIO_GPIO | GPIO_IN);
3196153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer
3207536cf992f395cb431f723041183d14a91d89c84Uwe Kleine-König	imx27_add_spi_imx0(&pcm038_spi0_data);
3216153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer	spi_register_board_info(pcm038_spi_board_info,
3226153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer				ARRAY_SIZE(pcm038_spi_board_info));
3236153384161222c855bb95ca3eee3b3d89ae2c9ddSascha Hauer
324773f206b2f3745bde8ee17ec0f884c19db3917a5Sascha Hauer	mxc_register_device(&mxc_usbh2, &usbh2_pdata);
325773f206b2f3745bde8ee17ec0f884c19db3917a5Sascha Hauer
3266bd96f3c332d422c0dda302f1b32c8e21dd75ee3Uwe Kleine-König	imx27_add_fec(NULL);
3277e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert	platform_add_devices(platform_devices, ARRAY_SIZE(platform_devices));
328ae71a5622253708aa08df231e6415fe7a1e96b10Uwe Kleine-König	imx27_add_mxc_w1(NULL);
329ff6552e4f3505da9c2886098773146be71c872e3Juergen Beisert
330ff6552e4f3505da9c2886098773146be71c872e3Juergen Beisert#ifdef CONFIG_MACH_PCM970_BASEBOARD
331ff6552e4f3505da9c2886098773146be71c872e3Juergen Beisert	pcm970_baseboard_init();
332ff6552e4f3505da9c2886098773146be71c872e3Juergen Beisert#endif
3337e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert}
3347e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert
3357e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisertstatic void __init pcm038_timer_init(void)
3367e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert{
33730c730f8f90b08d77a73998d2ee34cf1f56e95ccSascha Hauer	mx27_clocks_init(26000000);
3387e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert}
3397e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert
340058b7a6f465bebd87c1f295afdd56cc6a33dffbdHolger Schurigstatic struct sys_timer pcm038_timer = {
3417e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert	.init = pcm038_timer_init,
3427e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert};
3437e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert
3447e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen BeisertMACHINE_START(PCM038, "phyCORE-i.MX27")
34534101237d975ba37d19cbfe9318984af78332816Uwe Kleine-König	.boot_params    = MX27_PHYS_OFFSET + 0x100,
346cd4a05f9df859e7cd2efa96e035444a3decb427aSascha Hauer	.map_io         = mx27_map_io,
347c5aa0ad0c557c63dcaf8c8d75a3dd4c5e90724b3Sascha Hauer	.init_irq       = mx27_init_irq,
3487e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert	.init_machine   = pcm038_init,
3497e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen Beisert	.timer          = &pcm038_timer,
3507e5e9f5457f5cd019fd7e2f3da94e9fc72cc9ff6Juergen BeisertMACHINE_END
351