Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
poodle.c
Go to the documentation of this file.
1 /*
2  * linux/arch/arm/mach-pxa/poodle.c
3  *
4  * Support for the SHARP Poodle Board.
5  *
6  * Based on:
7  * linux/arch/arm/mach-pxa/lubbock.c Author: Nicolas Pitre
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License version 2 as
11  * published by the Free Software Foundation.
12  *
13  * Change Log
14  * 12-Dec-2002 Sharp Corporation for Poodle
15  * John Lenz <[email protected]> updates to 2.6
16  */
17 #include <linux/kernel.h>
18 #include <linux/init.h>
19 #include <linux/export.h>
20 #include <linux/platform_device.h>
21 #include <linux/fb.h>
22 #include <linux/pm.h>
23 #include <linux/delay.h>
24 #include <linux/mtd/physmap.h>
25 #include <linux/gpio.h>
26 #include <linux/i2c.h>
27 #include <linux/i2c/pxa-i2c.h>
28 #include <linux/spi/spi.h>
29 #include <linux/spi/ads7846.h>
30 #include <linux/spi/pxa2xx_spi.h>
31 #include <linux/mtd/sharpsl.h>
32 
33 #include <mach/hardware.h>
34 #include <asm/mach-types.h>
35 #include <asm/irq.h>
36 #include <asm/setup.h>
37 
38 #include <asm/mach/arch.h>
39 #include <asm/mach/map.h>
40 #include <asm/mach/irq.h>
41 
42 #include <mach/pxa25x.h>
44 #include <mach/udc.h>
46 #include <mach/poodle.h>
48 
49 #include <asm/hardware/scoop.h>
50 #include <asm/hardware/locomo.h>
51 #include <asm/mach/sharpsl_param.h>
52 
53 #include "generic.h"
54 #include "devices.h"
55 
56 static unsigned long poodle_pin_config[] __initdata = {
57  /* I/O */
60  GPIO18_RDY,
61 
62  /* Clock */
64 
65  /* SSP1 */
69  GPIO24_GPIO, /* POODLE_GPIO_TP_CS - SFRM as chip select */
70 
71  /* I2S */
77 
78  /* Infra-Red */
81 
82  /* FFUART */
89 
90  /* LCD */
92 
93  /* PC Card */
101  GPIO55_nPREG,
104 
105  /* MMC */
108 
109  /* GPIO */
110  GPIO9_GPIO, /* POODLE_GPIO_nSD_DETECT */
111  GPIO7_GPIO, /* POODLE_GPIO_nSD_WP */
112  GPIO3_GPIO, /* POODLE_GPIO_SD_PWR */
113  GPIO33_GPIO, /* POODLE_GPIO_SD_PWR1 */
114 
115  GPIO20_GPIO, /* POODLE_GPIO_USB_PULLUP */
116  GPIO22_GPIO, /* POODLE_GPIO_IR_ON */
117 };
118 
119 static struct resource poodle_scoop_resources[] = {
120  [0] = {
121  .start = 0x10800000,
122  .end = 0x10800fff,
123  .flags = IORESOURCE_MEM,
124  },
125 };
126 
127 static struct scoop_config poodle_scoop_setup = {
128  .io_dir = POODLE_SCOOP_IO_DIR,
129  .io_out = POODLE_SCOOP_IO_OUT,
130  .gpio_base = POODLE_SCOOP_GPIO_BASE,
131 };
132 
134  .name = "sharp-scoop",
135  .id = -1,
136  .dev = {
137  .platform_data = &poodle_scoop_setup,
138  },
139  .num_resources = ARRAY_SIZE(poodle_scoop_resources),
140  .resource = poodle_scoop_resources,
141 };
142 
143 static struct scoop_pcmcia_dev poodle_pcmcia_scoop[] = {
144 {
145  .dev = &poodle_scoop_device.dev,
146  .irq = POODLE_IRQ_GPIO_CF_IRQ,
147  .cd_irq = POODLE_IRQ_GPIO_CF_CD,
148  .cd_irq_str = "PCMCIA0 CD",
149 },
150 };
151 
152 static struct scoop_pcmcia_config poodle_pcmcia_config = {
153  .devs = &poodle_pcmcia_scoop[0],
154  .num_devs = 1,
155 };
156 
157 EXPORT_SYMBOL(poodle_scoop_device);
158 
159 
160 static struct platform_device poodle_audio_device = {
161  .name = "poodle-audio",
162  .id = -1,
163 };
164 
165 /* LoCoMo device */
166 static struct resource locomo_resources[] = {
167  [0] = {
168  .start = 0x10000000,
169  .end = 0x10001fff,
170  .flags = IORESOURCE_MEM,
171  },
172  [1] = {
173  .start = PXA_GPIO_TO_IRQ(10),
174  .end = PXA_GPIO_TO_IRQ(10),
175  .flags = IORESOURCE_IRQ,
176  },
177 };
178 
179 static struct locomo_platform_data locomo_info = {
180  .irq_base = IRQ_BOARD_START,
181 };
182 
184  .name = "locomo",
185  .id = 0,
186  .num_resources = ARRAY_SIZE(locomo_resources),
187  .resource = locomo_resources,
188  .dev = {
189  .platform_data = &locomo_info,
190  },
191 };
192 
193 EXPORT_SYMBOL(poodle_locomo_device);
194 
195 #if defined(CONFIG_SPI_PXA2XX) || defined(CONFIG_SPI_PXA2XX_MODULE)
196 static struct pxa2xx_spi_master poodle_spi_info = {
197  .num_chipselect = 1,
198 };
199 
200 static struct ads7846_platform_data poodle_ads7846_info = {
201  .model = 7846,
202  .vref_delay_usecs = 100,
203  .x_plate_ohms = 419,
204  .y_plate_ohms = 486,
205  .gpio_pendown = POODLE_GPIO_TP_INT,
206 };
207 
208 static struct pxa2xx_spi_chip poodle_ads7846_chip = {
210 };
211 
212 static struct spi_board_info poodle_spi_devices[] = {
213  {
214  .modalias = "ads7846",
215  .max_speed_hz = 10000,
216  .bus_num = 1,
217  .platform_data = &poodle_ads7846_info,
218  .controller_data= &poodle_ads7846_chip,
220  },
221 };
222 
223 static void __init poodle_init_spi(void)
224 {
225  pxa2xx_set_spi_info(1, &poodle_spi_info);
226  spi_register_board_info(ARRAY_AND_SIZE(poodle_spi_devices));
227 }
228 #else
229 static inline void poodle_init_spi(void) {}
230 #endif
231 
232 /*
233  * MMC/SD Device
234  *
235  * The card detect interrupt isn't debounced so we delay it by 250ms
236  * to give the card a chance to fully insert/eject.
237  */
238 static int poodle_mci_init(struct device *dev, irq_handler_t poodle_detect_int, void *data)
239 {
240  int err;
241 
242  err = gpio_request(POODLE_GPIO_SD_PWR, "SD_PWR");
243  if (err)
244  goto err_free_2;
245 
246  err = gpio_request(POODLE_GPIO_SD_PWR1, "SD_PWR1");
247  if (err)
248  goto err_free_3;
249 
252 
253  return 0;
254 
255 err_free_3:
257 err_free_2:
258  return err;
259 }
260 
261 static void poodle_mci_setpower(struct device *dev, unsigned int vdd)
262 {
263  struct pxamci_platform_data* p_d = dev->platform_data;
264 
265  if ((1 << vdd) & p_d->ocr_mask) {
267  mdelay(2);
269  } else {
272  }
273 }
274 
275 static void poodle_mci_exit(struct device *dev, void *data)
276 {
279 }
280 
281 static struct pxamci_platform_data poodle_mci_platform_data = {
282  .detect_delay_ms = 250,
283  .ocr_mask = MMC_VDD_32_33|MMC_VDD_33_34,
284  .init = poodle_mci_init,
285  .setpower = poodle_mci_setpower,
286  .exit = poodle_mci_exit,
287  .gpio_card_detect = POODLE_GPIO_nSD_DETECT,
288  .gpio_card_ro = POODLE_GPIO_nSD_WP,
289  .gpio_power = -1,
290 };
291 
292 
293 /*
294  * Irda
295  */
296 static struct pxaficp_platform_data poodle_ficp_platform_data = {
297  .gpio_pwdown = POODLE_GPIO_IR_ON,
298  .transceiver_cap = IR_SIRMODE | IR_OFF,
299 };
300 
301 
302 /*
303  * USB Device Controller
304  */
305 static struct pxa2xx_udc_mach_info udc_info __initdata = {
306  /* no connect GPIO; poodle can't tell connection status */
307  .gpio_pullup = POODLE_GPIO_USB_PULLUP,
308 };
309 
310 
311 /* PXAFB device */
312 static struct pxafb_mode_info poodle_fb_mode = {
313  .pixclock = 144700,
314  .xres = 320,
315  .yres = 240,
316  .bpp = 16,
317  .hsync_len = 7,
318  .left_margin = 11,
319  .right_margin = 30,
320  .vsync_len = 2,
321  .upper_margin = 2,
322  .lower_margin = 0,
324 };
325 
326 static struct pxafb_mach_info poodle_fb_info = {
327  .modes = &poodle_fb_mode,
328  .num_modes = 1,
329  .lcd_conn = LCD_COLOR_TFT_16BPP,
330 };
331 
332 static struct mtd_partition sharpsl_nand_partitions[] = {
333  {
334  .name = "System Area",
335  .offset = 0,
336  .size = 7 * 1024 * 1024,
337  },
338  {
339  .name = "Root Filesystem",
340  .offset = 7 * 1024 * 1024,
341  .size = 22 * 1024 * 1024,
342  },
343  {
344  .name = "Home Filesystem",
345  .offset = MTDPART_OFS_APPEND,
346  .size = MTDPART_SIZ_FULL,
347  },
348 };
349 
350 static uint8_t scan_ff_pattern[] = { 0xff, 0xff };
351 
352 static struct nand_bbt_descr sharpsl_bbt = {
353  .options = 0,
354  .offs = 4,
355  .len = 2,
356  .pattern = scan_ff_pattern
357 };
358 
360  .badblock_pattern = &sharpsl_bbt,
361  .partitions = sharpsl_nand_partitions,
362  .nr_partitions = ARRAY_SIZE(sharpsl_nand_partitions),
363 };
364 
365 static struct resource sharpsl_nand_resources[] = {
366  {
367  .start = 0x0C000000,
368  .end = 0x0C000FFF,
369  .flags = IORESOURCE_MEM,
370  },
371 };
372 
373 static struct platform_device sharpsl_nand_device = {
374  .name = "sharpsl-nand",
375  .id = -1,
376  .resource = sharpsl_nand_resources,
377  .num_resources = ARRAY_SIZE(sharpsl_nand_resources),
378  .dev.platform_data = &sharpsl_nand_platform_data,
379 };
380 
381 static struct mtd_partition sharpsl_rom_parts[] = {
382  {
383  .name ="Boot PROM Filesystem",
384  .offset = 0x00120000,
385  .size = MTDPART_SIZ_FULL,
386  },
387 };
388 
389 static struct physmap_flash_data sharpsl_rom_data = {
390  .width = 2,
391  .nr_parts = ARRAY_SIZE(sharpsl_rom_parts),
392  .parts = sharpsl_rom_parts,
393 };
394 
395 static struct resource sharpsl_rom_resources[] = {
396  {
397  .start = 0x00000000,
398  .end = 0x007fffff,
399  .flags = IORESOURCE_MEM,
400  },
401 };
402 
403 static struct platform_device sharpsl_rom_device = {
404  .name = "physmap-flash",
405  .id = -1,
406  .resource = sharpsl_rom_resources,
407  .num_resources = ARRAY_SIZE(sharpsl_rom_resources),
408  .dev.platform_data = &sharpsl_rom_data,
409 };
410 
411 static struct platform_device *devices[] __initdata = {
414  &poodle_audio_device,
415  &sharpsl_nand_device,
416  &sharpsl_rom_device,
417 };
418 
419 static struct i2c_board_info __initdata poodle_i2c_devices[] = {
420  { I2C_BOARD_INFO("wm8731", 0x1b) },
421 };
422 
423 static void poodle_poweroff(void)
424 {
425  pxa_restart('h', NULL);
426 }
427 
428 static void __init poodle_init(void)
429 {
430  int ret = 0;
431 
432  pm_power_off = poodle_poweroff;
433 
434  PCFR |= PCFR_OPDE;
435 
436  pxa2xx_mfp_config(ARRAY_AND_SIZE(poodle_pin_config));
437 
441 
442  platform_scoop_config = &poodle_pcmcia_config;
443 
444  ret = platform_add_devices(devices, ARRAY_SIZE(devices));
445  if (ret)
446  pr_warning("poodle: Unable to register LoCoMo device\n");
447 
448  pxa_set_fb_info(&poodle_locomo_device.dev, &poodle_fb_info);
449  pxa_set_udc_info(&udc_info);
450  pxa_set_mci_info(&poodle_mci_platform_data);
451  pxa_set_ficp_info(&poodle_ficp_platform_data);
453  i2c_register_board_info(0, ARRAY_AND_SIZE(poodle_i2c_devices));
454  poodle_init_spi();
455 }
456 
457 static void __init fixup_poodle(struct tag *tags, char **cmdline,
458  struct meminfo *mi)
459 {
461  mi->nr_banks=1;
462  mi->bank[0].start = 0xa0000000;
463  mi->bank[0].size = (32*1024*1024);
464 }
465 
466 MACHINE_START(POODLE, "SHARP Poodle")
467  .fixup = fixup_poodle,
468  .map_io = pxa25x_map_io,
469  .nr_irqs = POODLE_NR_IRQS, /* 4 for LoCoMo */
470  .init_irq = pxa25x_init_irq,
471  .handle_irq = pxa25x_handle_irq,
472  .timer = &pxa_timer,
473  .init_machine = poodle_init,
474  .restart = pxa_restart,