1 /*
2  * Copyright (C) 2008 Juergen Beisert (kernel@pengutronix.de)
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  * This program is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11  * GNU General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public License
14  * along with this program; if not, write to the Free Software
15  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
16  * MA 02110-1301, USA.
17  */
18 
19 #include <linux/gpio.h>
20 #include <linux/irq.h>
21 #include <linux/platform_device.h>
22 #include <linux/can/platform/sja1000.h>
23 
24 #include <asm/mach/arch.h>
25 
26 #include <mach/common.h>
27 #include <mach/iomux-mx27.h>
28 #include <mach/hardware.h>
29 
30 #include "devices-imx27.h"
31 
32 static const int pcm970_pins[] __initconst = {
33 	/* SDHC */
34 	PB4_PF_SD2_D0,
35 	PB5_PF_SD2_D1,
36 	PB6_PF_SD2_D2,
37 	PB7_PF_SD2_D3,
38 	PB8_PF_SD2_CMD,
39 	PB9_PF_SD2_CLK,
40 	/* display */
41 	PA5_PF_LSCLK,
42 	PA6_PF_LD0,
43 	PA7_PF_LD1,
44 	PA8_PF_LD2,
45 	PA9_PF_LD3,
46 	PA10_PF_LD4,
47 	PA11_PF_LD5,
48 	PA12_PF_LD6,
49 	PA13_PF_LD7,
50 	PA14_PF_LD8,
51 	PA15_PF_LD9,
52 	PA16_PF_LD10,
53 	PA17_PF_LD11,
54 	PA18_PF_LD12,
55 	PA19_PF_LD13,
56 	PA20_PF_LD14,
57 	PA21_PF_LD15,
58 	PA22_PF_LD16,
59 	PA23_PF_LD17,
60 	PA24_PF_REV,
61 	PA25_PF_CLS,
62 	PA26_PF_PS,
63 	PA27_PF_SPL_SPR,
64 	PA28_PF_HSYNC,
65 	PA29_PF_VSYNC,
66 	PA30_PF_CONTRAST,
67 	PA31_PF_OE_ACD,
68 	/*
69 	 * it seems the data line misses a pullup, so we must enable
70 	 * the internal pullup as a local workaround
71 	 */
72 	PD17_PF_I2C_DATA | GPIO_PUEN,
73 	PD18_PF_I2C_CLK,
74 	/* Camera */
75 	PB10_PF_CSI_D0,
76 	PB11_PF_CSI_D1,
77 	PB12_PF_CSI_D2,
78 	PB13_PF_CSI_D3,
79 	PB14_PF_CSI_D4,
80 	PB15_PF_CSI_MCLK,
81 	PB16_PF_CSI_PIXCLK,
82 	PB17_PF_CSI_D5,
83 	PB18_PF_CSI_D6,
84 	PB19_PF_CSI_D7,
85 	PB20_PF_CSI_VSYNC,
86 	PB21_PF_CSI_HSYNC,
87 };
88 
pcm970_sdhc2_get_ro(struct device * dev)89 static int pcm970_sdhc2_get_ro(struct device *dev)
90 {
91 	return gpio_get_value(GPIO_PORTC + 28);
92 }
93 
pcm970_sdhc2_init(struct device * dev,irq_handler_t detect_irq,void * data)94 static int pcm970_sdhc2_init(struct device *dev, irq_handler_t detect_irq, void *data)
95 {
96 	int ret;
97 
98 	ret = request_irq(IRQ_GPIOC(29), detect_irq, IRQF_TRIGGER_FALLING,
99 				"imx-mmc-detect", data);
100 	if (ret)
101 		return ret;
102 
103 	ret = gpio_request(GPIO_PORTC + 28, "imx-mmc-ro");
104 	if (ret) {
105 		free_irq(IRQ_GPIOC(29), data);
106 		return ret;
107 	}
108 
109 	gpio_direction_input(GPIO_PORTC + 28);
110 
111 	return 0;
112 }
113 
pcm970_sdhc2_exit(struct device * dev,void * data)114 static void pcm970_sdhc2_exit(struct device *dev, void *data)
115 {
116 	free_irq(IRQ_GPIOC(29), data);
117 	gpio_free(GPIO_PORTC + 28);
118 }
119 
120 static const struct imxmmc_platform_data sdhc_pdata __initconst = {
121 	.get_ro = pcm970_sdhc2_get_ro,
122 	.init = pcm970_sdhc2_init,
123 	.exit = pcm970_sdhc2_exit,
124 };
125 
126 static struct imx_fb_videomode pcm970_modes[] = {
127 	{
128 		.mode = {
129 			.name		= "Sharp-LQ035Q7",
130 			.refresh	= 60,
131 			.xres		= 240,
132 			.yres		= 320,
133 			.pixclock	= 188679, /* in ps (5.3MHz) */
134 			.hsync_len	= 7,
135 			.left_margin	= 5,
136 			.right_margin	= 16,
137 			.vsync_len	= 1,
138 			.upper_margin	= 7,
139 			.lower_margin	= 9,
140 		},
141 		/*
142 		 * - HSYNC active high
143 		 * - VSYNC active high
144 		 * - clk notenabled while idle
145 		 * - clock not inverted
146 		 * - data not inverted
147 		 * - data enable low active
148 		 * - enable sharp mode
149 		 */
150 		.pcr		= 0xF00080C0,
151 		.bpp		= 16,
152 	}, {
153 		.mode = {
154 			.name		= "TX090",
155 			.refresh	= 60,
156 			.xres		= 240,
157 			.yres		= 320,
158 			.pixclock	= 38255,
159 			.left_margin	= 144,
160 			.right_margin	= 0,
161 			.upper_margin	= 7,
162 			.lower_margin	= 40,
163 			.hsync_len	= 96,
164 			.vsync_len	= 1,
165 		},
166 		/*
167 		 * - HSYNC active low (1 << 22)
168 		 * - VSYNC active low (1 << 23)
169 		 * - clk notenabled while idle
170 		 * - clock not inverted
171 		 * - data not inverted
172 		 * - data enable low active
173 		 * - enable sharp mode
174 		 */
175 		.pcr = 0xF0008080 | (1<<22) | (1<<23) | (1<<19),
176 		.bpp = 32,
177 	},
178 };
179 
180 static const struct imx_fb_platform_data pcm038_fb_data __initconst = {
181 	.mode = pcm970_modes,
182 	.num_modes = ARRAY_SIZE(pcm970_modes),
183 
184 	.pwmr		= 0x00A903FF,
185 	.lscr1		= 0x00120300,
186 	.dmacr		= 0x00020010,
187 };
188 
189 static struct resource pcm970_sja1000_resources[] = {
190 	{
191 		.start   = MX27_CS4_BASE_ADDR,
192 		.end     = MX27_CS4_BASE_ADDR + 0x100 - 1,
193 		.flags   = IORESOURCE_MEM,
194 	}, {
195 		.start   = IRQ_GPIOE(19),
196 		.end     = IRQ_GPIOE(19),
197 		.flags   = IORESOURCE_IRQ | IORESOURCE_IRQ_LOWEDGE,
198 	},
199 };
200 
201 static struct sja1000_platform_data pcm970_sja1000_platform_data = {
202 	.osc_freq	= 16000000,
203 	.ocr		= OCR_TX1_PULLDOWN | OCR_TX0_PUSHPULL,
204 	.cdr		= CDR_CBP,
205 };
206 
207 static struct platform_device pcm970_sja1000 = {
208 	.name = "sja1000_platform",
209 	.dev = {
210 		.platform_data = &pcm970_sja1000_platform_data,
211 	},
212 	.resource = pcm970_sja1000_resources,
213 	.num_resources = ARRAY_SIZE(pcm970_sja1000_resources),
214 };
215 
216 /*
217  * system init for baseboard usage. Will be called by pcm038 init.
218  *
219  * Add platform devices present on this baseboard and init
220  * them from CPU side as far as required to use them later on
221  */
pcm970_baseboard_init(void)222 void __init pcm970_baseboard_init(void)
223 {
224 	mxc_gpio_setup_multiple_pins(pcm970_pins, ARRAY_SIZE(pcm970_pins),
225 			"PCM970");
226 
227 	imx27_add_imx_fb(&pcm038_fb_data);
228 	mxc_gpio_mode(GPIO_PORTC | 28 | GPIO_GPIO | GPIO_IN);
229 	imx27_add_mxc_mmc(1, &sdhc_pdata);
230 	platform_device_register(&pcm970_sja1000);
231 }
232