Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
eukrea_mbimx27-baseboard.c
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2009-2010 Eric Benard - [email protected]
3  *
4  * Based on pcm970-baseboard.c which is :
5  * Copyright (C) 2008 Juergen Beisert ([email protected])
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License
9  * as published by the Free Software Foundation; either version 2
10  * of the License, or (at your option) any later version.
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19  * MA 02110-1301, USA.
20  */
21 
22 #include <linux/gpio.h>
23 #include <linux/irq.h>
24 #include <linux/platform_device.h>
25 #include <linux/spi/spi.h>
26 #include <linux/spi/ads7846.h>
27 #include <linux/backlight.h>
28 #include <video/platform_lcd.h>
29 
30 #include <asm/mach/arch.h>
31 
32 #include <mach/common.h>
33 #include <mach/iomux-mx27.h>
34 #include <mach/hardware.h>
35 
36 #include "devices-imx27.h"
37 
38 static const int eukrea_mbimx27_pins[] __initconst = {
39  /* UART2 */
44  /* UART3 */
49  /* UART4 */
50 #if !defined(MACH_EUKREA_CPUIMX27_USEUART4)
55 #endif
56  /* SDHC1*/
63  /* display */
65  PA6_PF_LD0,
66  PA7_PF_LD1,
67  PA8_PF_LD2,
68  PA9_PF_LD3,
87  /* SPI1 */
91  /* SSI4 */
92 #if defined(CONFIG_SND_SOC_EUKREA_TLV320) \
93  || defined(CONFIG_SND_SOC_EUKREA_TLV320_MODULE)
98 #endif
99 };
100 
101 static const uint32_t eukrea_mbimx27_keymap[] = {
102  KEY(0, 0, KEY_UP),
103  KEY(0, 1, KEY_DOWN),
104  KEY(1, 0, KEY_RIGHT),
105  KEY(1, 1, KEY_LEFT),
106 };
107 
108 static const struct matrix_keymap_data
109 eukrea_mbimx27_keymap_data __initconst = {
110  .keymap = eukrea_mbimx27_keymap,
111  .keymap_size = ARRAY_SIZE(eukrea_mbimx27_keymap),
112 };
113 
114 static const struct gpio_led eukrea_mbimx27_gpio_leds[] __initconst = {
115  {
116  .name = "led1",
117  .default_trigger = "heartbeat",
118  .active_low = 1,
119  .gpio = GPIO_PORTF | 16,
120  },
121  {
122  .name = "led2",
123  .default_trigger = "none",
124  .active_low = 1,
125  .gpio = GPIO_PORTF | 19,
126  },
127 };
128 
129 static const struct gpio_led_platform_data
130  eukrea_mbimx27_gpio_led_info __initconst = {
131  .leds = eukrea_mbimx27_gpio_leds,
132  .num_leds = ARRAY_SIZE(eukrea_mbimx27_gpio_leds),
133 };
134 
135 static struct imx_fb_videomode eukrea_mbimx27_modes[] = {
136  {
137  .mode = {
138  .name = "CMO-QVGA",
139  .refresh = 60,
140  .xres = 320,
141  .yres = 240,
142  .pixclock = 156000,
143  .hsync_len = 30,
144  .left_margin = 38,
145  .right_margin = 20,
146  .vsync_len = 3,
147  .upper_margin = 15,
148  .lower_margin = 4,
149  },
150  .pcr = 0xFAD08B80,
151  .bpp = 16,
152  }, {
153  .mode = {
154  .name = "DVI-VGA",
155  .refresh = 60,
156  .xres = 640,
157  .yres = 480,
158  .pixclock = 32000,
159  .hsync_len = 1,
160  .left_margin = 35,
161  .right_margin = 0,
162  .vsync_len = 1,
163  .upper_margin = 7,
164  .lower_margin = 0,
165  },
166  .pcr = 0xFA208B80,
167  .bpp = 16,
168  }, {
169  .mode = {
170  .name = "DVI-SVGA",
171  .refresh = 60,
172  .xres = 800,
173  .yres = 600,
174  .pixclock = 25000,
175  .hsync_len = 1,
176  .left_margin = 35,
177  .right_margin = 0,
178  .vsync_len = 1,
179  .upper_margin = 7,
180  .lower_margin = 0,
181  },
182  .pcr = 0xFA208B80,
183  .bpp = 16,
184  },
185 };
186 
187 static const struct imx_fb_platform_data eukrea_mbimx27_fb_data __initconst = {
188  .mode = eukrea_mbimx27_modes,
189  .num_modes = ARRAY_SIZE(eukrea_mbimx27_modes),
190 
191  .pwmr = 0x00A903FF,
192  .lscr1 = 0x00120300,
193  .dmacr = 0x00040060,
194 };
195 
196 static void eukrea_mbimx27_bl_set_intensity(int intensity)
197 {
198  if (intensity)
200  else
202 }
203 
204 static struct generic_bl_info eukrea_mbimx27_bl_info = {
205  .name = "eukrea_mbimx27-bl",
206  .max_intensity = 0xff,
207  .default_intensity = 0xff,
208  .set_bl_intensity = eukrea_mbimx27_bl_set_intensity,
209 };
210 
211 static struct platform_device eukrea_mbimx27_bl_dev = {
212  .name = "generic-bl",
213  .id = 1,
214  .dev = {
215  .platform_data = &eukrea_mbimx27_bl_info,
216  },
217 };
218 
219 static void eukrea_mbimx27_lcd_power_set(struct plat_lcd_data *pd,
220  unsigned int power)
221 {
222  if (power)
224  else
226 }
227 
228 static struct plat_lcd_data eukrea_mbimx27_lcd_power_data = {
229  .set_power = eukrea_mbimx27_lcd_power_set,
230 };
231 
232 static struct platform_device eukrea_mbimx27_lcd_powerdev = {
233  .name = "platform-lcd",
234  .dev.platform_data = &eukrea_mbimx27_lcd_power_data,
235 };
236 
237 static const struct imxuart_platform_data uart_pdata __initconst = {
238  .flags = IMXUART_HAVE_RTSCTS,
239 };
240 
241 #define ADS7846_PENDOWN (GPIO_PORTD | 25)
242 
243 static void __maybe_unused ads7846_dev_init(void)
244 {
245  if (gpio_request(ADS7846_PENDOWN, "ADS7846 pendown") < 0) {
246  printk(KERN_ERR "can't get ads7846 pen down GPIO\n");
247  return;
248  }
250 }
251 
252 static int ads7846_get_pendown_state(void)
253 {
255 }
256 
257 static struct ads7846_platform_data ads7846_config __initdata = {
258  .get_pendown_state = ads7846_get_pendown_state,
259  .keep_vref_on = 1,
260 };
261 
262 static struct spi_board_info __maybe_unused
263  eukrea_mbimx27_spi_board_info[] __initdata = {
264  [0] = {
265  .modalias = "ads7846",
266  .bus_num = 0,
267  .chip_select = 0,
268  .max_speed_hz = 1500000,
269  /* irq number is run-time assigned */
270  .platform_data = &ads7846_config,
271  .mode = SPI_MODE_2,
272  },
273 };
274 
275 static int eukrea_mbimx27_spi_cs[] = {GPIO_PORTD | 28};
276 
277 static const struct spi_imx_master eukrea_mbimx27_spi0_data __initconst = {
278  .chipselect = eukrea_mbimx27_spi_cs,
279  .num_chipselect = ARRAY_SIZE(eukrea_mbimx27_spi_cs),
280 };
281 
282 static struct i2c_board_info eukrea_mbimx27_i2c_devices[] = {
283  {
284  I2C_BOARD_INFO("tlv320aic23", 0x1a),
285  },
286 };
287 
288 static const struct imxmmc_platform_data sdhc_pdata __initconst = {
289  .dat3_card_detect = 1,
290 };
291 
292 static const
293 struct imx_ssi_platform_data eukrea_mbimx27_ssi_pdata __initconst = {
295 };
296 
297 /*
298  * system init for baseboard usage. Will be called by cpuimx27 init.
299  *
300  * Add platform devices present on this baseboard and init
301  * them from CPU side as far as required to use them later on
302  */
304 {
305  mxc_gpio_setup_multiple_pins(eukrea_mbimx27_pins,
306  ARRAY_SIZE(eukrea_mbimx27_pins), "MBIMX27");
307 
308  imx27_add_imx_uart1(&uart_pdata);
309  imx27_add_imx_uart2(&uart_pdata);
310 #if !defined(MACH_EUKREA_CPUIMX27_USEUART4)
311  imx27_add_imx_uart3(&uart_pdata);
312 #endif
313 
314  imx27_add_imx_fb(&eukrea_mbimx27_fb_data);
315  imx27_add_mxc_mmc(0, &sdhc_pdata);
316 
317  i2c_register_board_info(0, eukrea_mbimx27_i2c_devices,
318  ARRAY_SIZE(eukrea_mbimx27_i2c_devices));
319 
320  imx27_add_imx_ssi(0, &eukrea_mbimx27_ssi_pdata);
321 
322 #if defined(CONFIG_TOUCHSCREEN_ADS7846) \
323  || defined(CONFIG_TOUCHSCREEN_ADS7846_MODULE)
324  /* ADS7846 Touchscreen controller init */
326  ads7846_dev_init();
327 #endif
328 
329  /* SPI_CS0 init */
331  imx27_add_spi_imx0(&eukrea_mbimx27_spi0_data);
332  eukrea_mbimx27_spi_board_info[0].irq = gpio_to_irq(IMX_GPIO_NR(4, 25));
333  spi_register_board_info(eukrea_mbimx27_spi_board_info,
334  ARRAY_SIZE(eukrea_mbimx27_spi_board_info));
335 
336  /* Leds configuration */
339  /* Backlight */
341  gpio_request(GPIO_PORTE | 5, "backlight");
342  platform_device_register(&eukrea_mbimx27_bl_dev);
343  /* LCD Reset */
345  gpio_request(GPIO_PORTA | 25, "lcd_enable");
346  platform_device_register(&eukrea_mbimx27_lcd_powerdev);
347 
348  imx27_add_imx_keypad(&eukrea_mbimx27_keymap_data);
349 
350  gpio_led_register_device(-1, &eukrea_mbimx27_gpio_led_info);
351  imx_add_platform_device("eukrea_tlv320", 0, NULL, 0, NULL, 0);
352 }