1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23#include <linux/irq.h>
24#include <linux/platform_device.h>
25#include <linux/i2c.h>
26#include <linux/i2c/pxa-i2c.h>
27#include <linux/pwm_backlight.h>
28
29#include <media/soc_camera.h>
30
31#include <asm/gpio.h>
32#include <mach/camera.h>
33#include <asm/mach/map.h>
34#include <mach/pxa27x.h>
35#include <mach/audio.h>
36#include <mach/mmc.h>
37#include <mach/ohci.h>
38#include <mach/pcm990_baseboard.h>
39#include <mach/pxafb.h>
40
41#include "devices.h"
42#include "generic.h"
43
44static unsigned long pcm990_pin_config[] __initdata = {
45
46 GPIO32_MMC_CLK,
47 GPIO112_MMC_CMD,
48 GPIO92_MMC_DAT_0,
49 GPIO109_MMC_DAT_1,
50 GPIO110_MMC_DAT_2,
51 GPIO111_MMC_DAT_3,
52
53 GPIO88_USBH1_PWR,
54 GPIO89_USBH1_PEN,
55
56 GPIO16_PWM0_OUT,
57
58
59 GPIO117_I2C_SCL,
60 GPIO118_I2C_SDA,
61
62
63 GPIO28_AC97_BITCLK,
64 GPIO29_AC97_SDATA_IN_0,
65 GPIO30_AC97_SDATA_OUT,
66 GPIO31_AC97_SYNC,
67};
68
69
70
71
72
73
74
75#ifndef CONFIG_PCM990_DISPLAY_NONE
76static void pcm990_lcd_power(int on, struct fb_var_screeninfo *var)
77{
78 if (on) {
79
80
81
82 __PCM990_CTRL_REG(PCM990_CTRL_PHYS + PCM990_CTRL_REG3) =
83 PCM990_CTRL_LCDPWR + PCM990_CTRL_LCDON;
84 } else {
85
86
87
88 __PCM990_CTRL_REG(PCM990_CTRL_PHYS + PCM990_CTRL_REG3) = 0x00;
89 }
90}
91#endif
92
93#if defined(CONFIG_PCM990_DISPLAY_SHARP)
94static struct pxafb_mode_info fb_info_sharp_lq084v1dg21 = {
95 .pixclock = 28000,
96 .xres = 640,
97 .yres = 480,
98 .bpp = 16,
99 .hsync_len = 20,
100 .left_margin = 103,
101 .right_margin = 47,
102 .vsync_len = 6,
103 .upper_margin = 28,
104 .lower_margin = 5,
105 .sync = 0,
106 .cmap_greyscale = 0,
107};
108
109static struct pxafb_mach_info pcm990_fbinfo __initdata = {
110 .modes = &fb_info_sharp_lq084v1dg21,
111 .num_modes = 1,
112 .lcd_conn = LCD_COLOR_TFT_16BPP | LCD_PCLK_EDGE_FALL,
113 .pxafb_lcd_power = pcm990_lcd_power,
114};
115#elif defined(CONFIG_PCM990_DISPLAY_NEC)
116struct pxafb_mode_info fb_info_nec_nl6448bc20_18d = {
117 .pixclock = 39720,
118 .xres = 640,
119 .yres = 480,
120 .bpp = 16,
121 .hsync_len = 32,
122 .left_margin = 16,
123 .right_margin = 48,
124 .vsync_len = 2,
125 .upper_margin = 12,
126 .lower_margin = 17,
127 .sync = 0,
128 .cmap_greyscale = 0,
129};
130
131static struct pxafb_mach_info pcm990_fbinfo __initdata = {
132 .modes = &fb_info_nec_nl6448bc20_18d,
133 .num_modes = 1,
134 .lcd_conn = LCD_COLOR_TFT_16BPP | LCD_PCLK_EDGE_FALL,
135 .pxafb_lcd_power = pcm990_lcd_power,
136};
137#endif
138
139static struct platform_pwm_backlight_data pcm990_backlight_data = {
140 .pwm_id = 0,
141 .max_brightness = 1023,
142 .dft_brightness = 1023,
143 .pwm_period_ns = 78770,
144};
145
146static struct platform_device pcm990_backlight_device = {
147 .name = "pwm-backlight",
148 .dev = {
149 .parent = &pxa27x_device_pwm0.dev,
150 .platform_data = &pcm990_backlight_data,
151 },
152};
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242static unsigned long pcm990_irq_enabled;
243
244static void pcm990_mask_ack_irq(struct irq_data *d)
245{
246 int pcm990_irq = (d->irq - PCM027_IRQ(0));
247 PCM990_INTMSKENA = (pcm990_irq_enabled &= ~(1 << pcm990_irq));
248}
249
250static void pcm990_unmask_irq(struct irq_data *d)
251{
252 int pcm990_irq = (d->irq - PCM027_IRQ(0));
253
254 PCM990_INTSETCLR |= 1 << pcm990_irq;
255 PCM990_INTMSKENA = (pcm990_irq_enabled |= (1 << pcm990_irq));
256}
257
258static struct irq_chip pcm990_irq_chip = {
259 .irq_mask_ack = pcm990_mask_ack_irq,
260 .irq_unmask = pcm990_unmask_irq,
261};
262
263static void pcm990_irq_handler(unsigned int irq, struct irq_desc *desc)
264{
265 unsigned long pending = (~PCM990_INTSETCLR) & pcm990_irq_enabled;
266
267 do {
268
269 desc->irq_data.chip->irq_ack(&desc->irq_data);
270 if (likely(pending)) {
271 irq = PCM027_IRQ(0) + __ffs(pending);
272 generic_handle_irq(irq);
273 }
274 pending = (~PCM990_INTSETCLR) & pcm990_irq_enabled;
275 } while (pending);
276}
277
278static void __init pcm990_init_irq(void)
279{
280 int irq;
281
282
283 for (irq = PCM027_IRQ(0); irq <= PCM027_IRQ(3); irq++) {
284 irq_set_chip_and_handler(irq, &pcm990_irq_chip,
285 handle_level_irq);
286 set_irq_flags(irq, IRQF_VALID | IRQF_PROBE);
287 }
288
289 PCM990_INTMSKENA = 0x00;
290 PCM990_INTSETCLR = 0xFF;
291
292 irq_set_chained_handler(PCM990_CTRL_INT_IRQ, pcm990_irq_handler);
293 irq_set_irq_type(PCM990_CTRL_INT_IRQ, PCM990_CTRL_INT_IRQ_EDGE);
294}
295
296static int pcm990_mci_init(struct device *dev, irq_handler_t mci_detect_int,
297 void *data)
298{
299 int err;
300
301 err = request_irq(PCM027_MMCDET_IRQ, mci_detect_int, IRQF_DISABLED,
302 "MMC card detect", data);
303 if (err)
304 printk(KERN_ERR "pcm990_mci_init: MMC/SD: can't request MMC "
305 "card detect IRQ\n");
306
307 return err;
308}
309
310static void pcm990_mci_setpower(struct device *dev, unsigned int vdd)
311{
312 struct pxamci_platform_data *p_d = dev->platform_data;
313
314 if ((1 << vdd) & p_d->ocr_mask)
315 __PCM990_CTRL_REG(PCM990_CTRL_PHYS + PCM990_CTRL_REG5) =
316 PCM990_CTRL_MMC2PWR;
317 else
318 __PCM990_CTRL_REG(PCM990_CTRL_PHYS + PCM990_CTRL_REG5) =
319 ~PCM990_CTRL_MMC2PWR;
320}
321
322static void pcm990_mci_exit(struct device *dev, void *data)
323{
324 free_irq(PCM027_MMCDET_IRQ, data);
325}
326
327#define MSECS_PER_JIFFY (1000/HZ)
328
329static struct pxamci_platform_data pcm990_mci_platform_data = {
330 .detect_delay_ms = 250,
331 .ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34,
332 .init = pcm990_mci_init,
333 .setpower = pcm990_mci_setpower,
334 .exit = pcm990_mci_exit,
335 .gpio_card_detect = -1,
336 .gpio_card_ro = -1,
337 .gpio_power = -1,
338};
339
340static struct pxaohci_platform_data pcm990_ohci_platform_data = {
341 .port_mode = PMM_PERPORT_MODE,
342 .flags = ENABLE_PORT1 | POWER_CONTROL_LOW | POWER_SENSE_LOW,
343 .power_on_delay = 10,
344};
345
346
347
348
349#if defined(CONFIG_VIDEO_PXA27x) || defined(CONFIG_VIDEO_PXA27x_MODULE)
350static unsigned long pcm990_camera_pin_config[] = {
351
352 GPIO98_CIF_DD_0,
353 GPIO105_CIF_DD_1,
354 GPIO104_CIF_DD_2,
355 GPIO103_CIF_DD_3,
356 GPIO95_CIF_DD_4,
357 GPIO94_CIF_DD_5,
358 GPIO93_CIF_DD_6,
359 GPIO108_CIF_DD_7,
360 GPIO107_CIF_DD_8,
361 GPIO106_CIF_DD_9,
362 GPIO42_CIF_MCLK,
363 GPIO45_CIF_PCLK,
364 GPIO43_CIF_FV,
365 GPIO44_CIF_LV,
366};
367
368
369
370
371
372
373struct pxacamera_platform_data pcm990_pxacamera_platform_data = {
374 .flags = PXA_CAMERA_MASTER | PXA_CAMERA_DATAWIDTH_8 | PXA_CAMERA_DATAWIDTH_10 |
375 PXA_CAMERA_PCLK_EN | PXA_CAMERA_MCLK_EN,
376 .mclk_10khz = 1000,
377};
378
379#include <linux/i2c/pca953x.h>
380
381static struct pca953x_platform_data pca9536_data = {
382 .gpio_base = NR_BUILTIN_GPIO,
383};
384
385static int gpio_bus_switch = -EINVAL;
386
387static int pcm990_camera_set_bus_param(struct soc_camera_link *link,
388 unsigned long flags)
389{
390 if (gpio_bus_switch < 0) {
391 if (flags == SOCAM_DATAWIDTH_10)
392 return 0;
393 else
394 return -EINVAL;
395 }
396
397 if (flags & SOCAM_DATAWIDTH_8)
398 gpio_set_value(gpio_bus_switch, 1);
399 else
400 gpio_set_value(gpio_bus_switch, 0);
401
402 return 0;
403}
404
405static unsigned long pcm990_camera_query_bus_param(struct soc_camera_link *link)
406{
407 int ret;
408
409 if (gpio_bus_switch < 0) {
410 ret = gpio_request(NR_BUILTIN_GPIO, "camera");
411 if (!ret) {
412 gpio_bus_switch = NR_BUILTIN_GPIO;
413 gpio_direction_output(gpio_bus_switch, 0);
414 }
415 }
416
417 if (gpio_bus_switch >= 0)
418 return SOCAM_DATAWIDTH_8 | SOCAM_DATAWIDTH_10;
419 else
420 return SOCAM_DATAWIDTH_10;
421}
422
423static void pcm990_camera_free_bus(struct soc_camera_link *link)
424{
425 if (gpio_bus_switch < 0)
426 return;
427
428 gpio_free(gpio_bus_switch);
429 gpio_bus_switch = -EINVAL;
430}
431
432
433static struct i2c_board_info __initdata pcm990_i2c_devices[] = {
434 {
435
436 I2C_BOARD_INFO("pca9536", 0x41),
437 .platform_data = &pca9536_data,
438 },
439};
440
441static struct i2c_board_info pcm990_camera_i2c[] = {
442 {
443 I2C_BOARD_INFO("mt9v022", 0x48),
444 }, {
445 I2C_BOARD_INFO("mt9m001", 0x5d),
446 },
447};
448
449static struct soc_camera_link iclink[] = {
450 {
451 .bus_id = 0,
452 .board_info = &pcm990_camera_i2c[0],
453 .i2c_adapter_id = 0,
454 .query_bus_param = pcm990_camera_query_bus_param,
455 .set_bus_param = pcm990_camera_set_bus_param,
456 .free_bus = pcm990_camera_free_bus,
457 }, {
458 .bus_id = 0,
459 .board_info = &pcm990_camera_i2c[1],
460 .i2c_adapter_id = 0,
461 .query_bus_param = pcm990_camera_query_bus_param,
462 .set_bus_param = pcm990_camera_set_bus_param,
463 .free_bus = pcm990_camera_free_bus,
464 },
465};
466
467static struct platform_device pcm990_camera[] = {
468 {
469 .name = "soc-camera-pdrv",
470 .id = 0,
471 .dev = {
472 .platform_data = &iclink[0],
473 },
474 }, {
475 .name = "soc-camera-pdrv",
476 .id = 1,
477 .dev = {
478 .platform_data = &iclink[1],
479 },
480 },
481};
482#endif
483
484
485
486
487static struct map_desc pcm990_io_desc[] __initdata = {
488 {
489 .virtual = PCM990_CTRL_BASE,
490 .pfn = __phys_to_pfn(PCM990_CTRL_PHYS),
491 .length = PCM990_CTRL_SIZE,
492 .type = MT_DEVICE
493 }, {
494 .virtual = PCM990_CF_PLD_BASE,
495 .pfn = __phys_to_pfn(PCM990_CF_PLD_PHYS),
496 .length = PCM990_CF_PLD_SIZE,
497 .type = MT_DEVICE
498 }
499};
500
501
502
503
504
505
506
507void __init pcm990_baseboard_init(void)
508{
509 pxa2xx_mfp_config(ARRAY_AND_SIZE(pcm990_pin_config));
510
511
512 iotable_init(ARRAY_AND_SIZE(pcm990_io_desc));
513
514
515 pcm990_init_irq();
516
517#ifndef CONFIG_PCM990_DISPLAY_NONE
518 pxa_set_fb_info(NULL, &pcm990_fbinfo);
519#endif
520 platform_device_register(&pcm990_backlight_device);
521
522
523 pxa_set_mci_info(&pcm990_mci_platform_data);
524
525
526 pxa_set_ohci_info(&pcm990_ohci_platform_data);
527
528 pxa_set_i2c_info(NULL);
529 pxa_set_ac97_info(NULL);
530
531#if defined(CONFIG_VIDEO_PXA27x) || defined(CONFIG_VIDEO_PXA27x_MODULE)
532 pxa2xx_mfp_config(ARRAY_AND_SIZE(pcm990_camera_pin_config));
533 pxa_set_camera_info(&pcm990_pxacamera_platform_data);
534
535 i2c_register_board_info(0, ARRAY_AND_SIZE(pcm990_i2c_devices));
536
537 platform_device_register(&pcm990_camera[0]);
538 platform_device_register(&pcm990_camera[1]);
539#endif
540
541 printk(KERN_INFO "PCM-990 Evaluation baseboard initialized\n");
542}
543