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