Root/target/linux/ubicom32/files/arch/ubicom32/mach-ip7k/board-ip7500media.c

1/*
2 * arch/ubicom32/mach-ip7k/board-ip7500media.c
3 * Board file for IP7500 media board.
4 *
5 * Supports the following configuration
6 * CPU Module:
7 * P/N 8007-0510 rev 1.0 NOPHY
8 * P/N 8007-0511 rev 1.1 NOPHY
9 * DIP Switch SW2 configuration:
10 * POS 1: on = PCI enabled
11 * POS 2: off = TTYX => PF12
12 * POS 3: off = TTYY => PF15
13 * POS 4: unused
14 * Media Board:
15 * P/N 8007-0610 rev 1.0
16 *
17 * LCD Adapter Board: (optional)
18 * P/N 8007-0920 rev 2.0
19 * P/N 8007-0921 rev 2.1
20 *
21 * (C) Copyright 2009, Ubicom, Inc.
22 *
23 * This file is part of the Ubicom32 Linux Kernel Port.
24 *
25 * The Ubicom32 Linux Kernel Port is free software: you can redistribute
26 * it and/or modify it under the terms of the GNU General Public License
27 * as published by the Free Software Foundation, either version 2 of the
28 * License, or (at your option) any later version.
29 *
30 * The Ubicom32 Linux Kernel Port is distributed in the hope that it
31 * will be useful, but WITHOUT ANY WARRANTY; without even the implied
32 * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
33 * the GNU General Public License for more details.
34 *
35 * You should have received a copy of the GNU General Public License
36 * along with the Ubicom32 Linux Kernel Port. If not,
37 * see <http://www.gnu.org/licenses/>.
38 *
39 * Ubicom32 implementation derived from (with many thanks):
40 * arch/m68knommu
41 * arch/blackfin
42 * arch/parisc
43 */
44#include <linux/device.h>
45#include <linux/platform_device.h>
46#include <linux/gpio.h>
47
48#include <linux/input.h>
49
50#include <linux/i2c.h>
51#include <linux/i2c-gpio.h>
52#include <linux/i2c/pca953x.h>
53
54#include <asm/board.h>
55#include <asm/machdep.h>
56#include <asm/ubicom32input_i2c.h>
57#include <asm/ubicom32bl.h>
58#include <asm/ubicom32lcdpower.h>
59#include <asm/vdc_tio.h>
60
61#include <asm/ubicom32sd.h>
62#include <asm/sd_tio.h>
63#include <asm/devtree.h>
64#include <asm/audio.h>
65
66#include <asm/ring_tio.h>
67
68/******************************************************************************
69 * SD/IO Port F (Slot 1) platform data
70 */
71static struct resource ip7500media_portf_sd_resources[] = {
72    /*
73     * Send IRQ
74     */
75    [0] = {
76        /*
77         * The init routine will query the devtree and fill this in
78         */
79        .flags = IORESOURCE_IRQ,
80    },
81
82    /*
83     * Receive IRQ
84     */
85    [1] = {
86        /*
87         * The init routine will query the devtree and fill this in
88         */
89        .flags = IORESOURCE_IRQ,
90    },
91
92    /*
93     * Memory Mapped Registers
94     */
95    [2] = {
96        /*
97         * The init routine will query the devtree and fill this in
98         */
99        .flags = IORESOURCE_MEM,
100    },
101};
102
103static struct ubicom32sd_card ip7500media_portf_sd_cards[] = {
104    [0] = {
105        .pin_wp = IP7500MEDIA_IO16,
106        .wp_polarity = 1,
107        .pin_pwr = IP7500MEDIA_IO20,
108        .pin_cd = IP7500MEDIA_IO23,
109    },
110    [1] = {
111        .pin_wp = IP7500MEDIA_IO17,
112        .wp_polarity = 1,
113        .pin_pwr = IP7500MEDIA_IO21,
114        .pin_cd = IP7500MEDIA_IO24,
115    },
116};
117
118static struct ubicom32sd_platform_data ip7500media_portf_sd_platform_data = {
119    .ncards = 2,
120    .cards = ip7500media_portf_sd_cards,
121};
122
123static struct platform_device ip7500media_portf_sd_device = {
124    .name = "ubicom32sd",
125    .id = 0,
126    .resource = ip7500media_portf_sd_resources,
127    .num_resources = ARRAY_SIZE(ip7500media_portf_sd_resources),
128    .dev = {
129            .platform_data = &ip7500media_portf_sd_platform_data,
130    },
131
132};
133
134/*
135 * ip7500media_portf_sd_init
136 */
137static void ip7500media_portf_sd_init(void)
138{
139    /*
140     * Check the device tree for the sd_tio
141     */
142    struct sd_tio_node *sd_node = (struct sd_tio_node *)devtree_find_node("portf_sd");
143    if (!sd_node) {
144        printk(KERN_INFO "PortF SDTIO not found\n");
145        return;
146    }
147
148    /*
149     * Fill in the resources and platform data from devtree information
150     */
151    ip7500media_portf_sd_resources[0].start = sd_node->dn.sendirq;
152    ip7500media_portf_sd_resources[1].start = sd_node->dn.recvirq;
153    ip7500media_portf_sd_resources[2].start = (u32_t)&(sd_node->regs);
154    ip7500media_portf_sd_resources[2].end = (u32_t)&(sd_node->regs) + sizeof(sd_node->regs);
155
156    platform_device_register(&ip7500media_portf_sd_device);
157}
158
159/******************************************************************************
160 * SD/IO Port B (Slot 2) platform data
161 */
162static struct resource ip7500media_portb_sd_resources[] = {
163    /*
164     * Send IRQ
165     */
166    [0] = {
167        /*
168         * The init routine will query the devtree and fill this in
169         */
170        .flags = IORESOURCE_IRQ,
171    },
172
173    /*
174     * Receive IRQ
175     */
176    [1] = {
177        /*
178         * The init routine will query the devtree and fill this in
179         */
180        .flags = IORESOURCE_IRQ,
181    },
182
183    /*
184     * Memory Mapped Registers
185     */
186    [2] = {
187        /*
188         * The init routine will query the devtree and fill this in
189         */
190        .flags = IORESOURCE_MEM,
191    },
192};
193
194static struct ubicom32sd_card ip7500media_portb_sd_cards[] = {
195    [0] = {
196        .pin_wp = IP7500MEDIA_IO19,
197        .wp_polarity = 1,
198        .pin_pwr = IP7500MEDIA_IO22,
199        .pin_cd = IP7500MEDIA_IO18,
200    },
201};
202
203static struct ubicom32sd_platform_data ip7500media_portb_sd_platform_data = {
204    .ncards = 1,
205    .cards = ip7500media_portb_sd_cards,
206};
207
208static struct platform_device ip7500media_portb_sd_device = {
209    .name = "ubicom32sd",
210    .id = 1,
211    .resource = ip7500media_portb_sd_resources,
212    .num_resources = ARRAY_SIZE(ip7500media_portb_sd_resources),
213    .dev = {
214            .platform_data = &ip7500media_portb_sd_platform_data,
215    },
216
217};
218
219/*
220 * ip7500media_portb_sd_init
221 */
222static void ip7500media_portb_sd_init(void)
223{
224    /*
225     * Check the device tree for the sd_tio
226     */
227    struct sd_tio_node *sd_node = (struct sd_tio_node *)devtree_find_node("portb_sd");
228    if (!sd_node) {
229        printk(KERN_INFO "PortB SDTIO not found\n");
230        return;
231    }
232
233    /*
234     * Fill in the resources and platform data from devtree information
235     */
236    ip7500media_portb_sd_resources[0].start = sd_node->dn.sendirq;
237    ip7500media_portb_sd_resources[1].start = sd_node->dn.recvirq;
238    ip7500media_portb_sd_resources[2].start = (u32_t)&(sd_node->regs);
239    ip7500media_portb_sd_resources[2].end = (u32_t)&(sd_node->regs) + sizeof(sd_node->regs);
240
241    platform_device_register(&ip7500media_portb_sd_device);
242}
243
244/*
245 * ip7500media_u17_setup
246 * Called by I2C to tell us that u17 is setup.
247 *
248 * This function is called by I2C to tell us that u17 has been setup. All
249 * devices which rely on this chip being initialized (or even present) need to
250 * be initialized in this function otherwise they may get initialized too early.
251 *
252 * Currently the only device depending on u17 is the SDIO
253 */
254static int __init ip7500media_u17_setup(struct i2c_client *client, unsigned gpio, unsigned ngpio, void *context)
255{
256    /*
257     * Initialize the Port F/Port B SD slots (only the enabled ports will init)
258     */
259    ip7500media_portf_sd_init();
260    ip7500media_portb_sd_init();
261
262    return 0;
263}
264
265/******************************************************************************
266 * LCD VGH on the board at PE6
267 */
268static struct ubicom32lcdpower_platform_data ip7500media_lcdpower_data = {
269    .vgh_gpio = GPIO_RE_7,
270    .vgh_polarity = true,
271};
272
273static struct platform_device ip7500media_lcdpower_device = {
274    .name = "ubicom32lcdpower",
275    .id = -1,
276    .dev = {
277        .platform_data = &ip7500media_lcdpower_data,
278    },
279};
280
281/******************************************************************************
282 * Backlight on the board PD0, hardware PWM
283 */
284static struct ubicom32bl_platform_data ip7500media_backlight_data = {
285    .type = UBICOM32BL_TYPE_PWM,
286    .pwm_channel = 2,
287    .pwm_prescale = 15,
288    .pwm_period = 60,
289    .default_intensity = 0x80,
290};
291
292static struct platform_device ip7500media_backlight_device = {
293    .name = "ubicom32bl",
294    .id = -1,
295    .dev = {
296        .platform_data = &ip7500media_backlight_data,
297    },
298};
299
300/******************************************************************************
301 * Ubicom32Input on I2C, U15 MAX7310, address 0x18, 8 bits
302 */
303static struct ubicom32input_i2c_button ip7500media_ubicom32input_i2c_u15_buttons[] = {
304    {
305        .type = EV_KEY,
306        .code = KEY_LEFT,
307        .bit = 0,
308        .active_low = 1,
309    },
310    {
311        .type = EV_KEY,
312        .code = KEY_RIGHT,
313        .bit = 1,
314        .active_low = 1,
315    },
316    {
317        .type = EV_KEY,
318        .code = KEY_UP,
319        .bit = 2,
320        .active_low = 1,
321    },
322    {
323        .type = EV_KEY,
324        .code = KEY_DOWN,
325        .bit = 3,
326        .active_low = 1,
327    },
328    {
329        .type = EV_KEY,
330        .code = KEY_ENTER,
331        .bit = 4,
332        .active_low = 1,
333    },
334    {
335        .type = EV_KEY,
336        .code = KEY_MENU,
337        .bit = 5,
338        .active_low = 1,
339    },
340    {
341        .type = EV_KEY,
342        .code = KEY_ESC,
343        .bit = 6,
344        .active_low = 1,
345    },
346};
347
348static struct ubicom32input_i2c_platform_data ip7500media_ubicom32input_i2c_u15_platform_data = {
349    .buttons = ip7500media_ubicom32input_i2c_u15_buttons,
350    .nbuttons = ARRAY_SIZE(ip7500media_ubicom32input_i2c_u15_buttons),
351    .name = "Ubicom32 Input I2C U15",
352};
353
354/******************************************************************************
355 * Additional GPIO chips
356 */
357static struct pca953x_platform_data ip7500media_gpio_u16_platform_data = {
358    .gpio_base = IP7500MEDIA_U16_BASE,
359};
360
361static struct pca953x_platform_data ip7500media_gpio_u17_platform_data = {
362    .gpio_base = IP7500MEDIA_U17_BASE,
363    .setup = ip7500media_u17_setup,
364};
365
366static struct pca953x_platform_data ip7500media_gpio_u18_platform_data = {
367    .gpio_base = IP7500MEDIA_U18_BASE,
368};
369
370
371/******************************************************************************
372 * Touch controller present on LCD Adapter board
373 *
374 * Connected via I2C bus, interrupt on PD1
375 */
376#include <linux/i2c/tsc2007.h>
377
378/*
379 * ip7500media_tsc2007_exit_platform_hw
380 */
381static void ip7500media_tsc2007_exit_platform_hw(void)
382{
383    UBICOM32_IO_PORT(RD)->int_mask &= ~(1 << 11);
384    UBICOM32_IO_PORT(RD)->ctl2 &= ~(0x03 << 16);
385    gpio_free(GPIO_RD_1);
386}
387
388/*
389 * ip7500media_tsc2007_init_platform_hw
390 */
391static int ip7500media_tsc2007_init_platform_hw(void)
392{
393    int res = gpio_request(GPIO_RD_1, "TSC2007_IRQ");
394    if (res) {
395        return res;
396    }
397    UBICOM32_IO_PORT(RD)->function = 0;
398    UBICOM32_IO_PORT(RD)->int_mask = (1 << 11);
399    UBICOM32_IO_PORT(RD)->ctl2 &= ~(0x03 << 16);
400    UBICOM32_IO_PORT(RD)->ctl2 |= (0x02 << 16);
401
402    return 0;
403}
404
405/*
406 * ip7500media_tsc2007_clear_penirq
407 */
408static void ip7500media_tsc2007_clear_penirq(void)
409{
410    UBICOM32_IO_PORT(RD)->int_clr = (1 << 11);
411}
412
413/*
414 * ip7500media_tsc2007_get_pendown_state
415 */
416static int ip7500media_tsc2007_get_pendown_state(void)
417{
418    return !gpio_get_value(GPIO_RD_1);
419}
420
421static struct tsc2007_platform_data ip7500media_tsc2007_data = {
422    .model = 2007,
423    .x_plate_ohms = 350,
424    .get_pendown_state = ip7500media_tsc2007_get_pendown_state,
425    .init_platform_hw = ip7500media_tsc2007_init_platform_hw,
426    .exit_platform_hw = ip7500media_tsc2007_exit_platform_hw,
427    .clear_penirq = ip7500media_tsc2007_clear_penirq,
428};
429
430/******************************************************************************
431 * Devices on the I2C bus
432 *
433 * BEWARE of changing the order of things in this array as we depend on
434 * certain things to be in certain places.
435 */
436static struct i2c_board_info __initdata ip7500media_i2c_board_info[] = {
437    /*
438     * U6, CS4350 DAC, address 0x4B
439     */
440    {
441        .type = "cs4350",
442        .addr = 0x4B,
443    },
444
445    /*
446     * U14, S35390A RTC, address 0x30
447     */
448    {
449        .type = "s35390a",
450        .addr = 0x30,
451    },
452
453    /*
454     * U15, MAX7310 IO expander, 8 bits, address 0x18
455     * IO0: User I/O (J16-1) (Left) IO4: User I/O (J16-5) (Enter)
456     * IO1: User I/O (J16-2) (Right) IO5: User I/O (J16-6) (Menu)
457     * IO2: User I/O (J16-3) (Up) IO6: User I/O (J16-7) (Back)
458     * IO3: User I/O (J16-4) (Down) IO7: User I/O (J16-8)
459     */
460    {
461        .type = "ubicom32in_max7310",
462        .addr = 0x18,
463        .platform_data = &ip7500media_ubicom32input_i2c_u15_platform_data,
464    },
465
466    /*
467     * U16, MAX7310 IO expander, 8 bits, address 0x1C
468     * IO8 : User I/O (J16-9) IO12: User I/O (J16-17)
469     * IO9 : User I/O (J16-10) IO13: User I/O (J16-18)
470     * IO10: User I/O (J16-15) IO14: User I/O (J16-19)
471     * IO11: User I/O (J16-16) IO15: User I/O (J16-20)
472     */
473    {
474        .type = "max7310",
475        .addr = 0x1C,
476        .platform_data = &ip7500media_gpio_u16_platform_data,
477    },
478
479    /*
480     * U17, MAX7310 IO expander, 8 bits, address 0x1A
481     * IO16: SDIO1A_WP IO20: SD1A_PWREN
482     * IO17: SDIO1B_WP IO21: SD1B_PWREN
483     * IO18: SDIO2_CD IO22: SD2_PWREN
484     * IO19: SDIO2_WP IO23: SDIO1A_CD
485     *
486     */
487    {
488        .type = "max7310",
489        .addr = 0x1A,
490        .platform_data = &ip7500media_gpio_u17_platform_data,
491    },
492
493    /*
494     * U18, MAX7310 IOB expander, 8 bits, address 0x1E
495     * IO24: SDIO1B_CD IO28: User I/O TP6
496     * IO25: User I/O TP9 IO29: User I/O TP5
497     * IO26: User I/O TP8 IO30: User I/O TP4
498     * IO27: User I/O TP7 IO31: User I/O TP3
499     */
500    {
501        .type = "max7310",
502        .addr = 0x1E,
503        .platform_data = &ip7500media_gpio_u18_platform_data,
504    },
505};
506
507/*
508 * Additional I2C devices to add when a LCD adapter board is present
509 */
510static struct i2c_board_info __initdata ip7500media_lcd_adapter_i2c_board_info[] = {
511    {
512        I2C_BOARD_INFO("tsc2007", 0x48),
513        .irq = PORT_OTHER_INT(RD),
514        .platform_data = &ip7500media_tsc2007_data,
515    },
516};
517
518/*
519 * I2C bus on the board, SDA PE4, SCL PE5
520 */
521static struct i2c_gpio_platform_data ip7500media_i2c_data = {
522    .sda_pin = GPIO_RE_4,
523    .scl_pin = GPIO_RE_5,
524    .sda_is_open_drain = 0,
525    .scl_is_open_drain = 0,
526    .udelay = 50,
527};
528
529static struct platform_device ip7500media_i2c_device = {
530    .name = "i2c-gpio",
531    .id = 0,
532    .dev = {
533        .platform_data = &ip7500media_i2c_data,
534    },
535};
536
537/*
538 * Virtual Frame Buffer device for use with LCD Adapter
539 */
540static struct platform_device ip7500media_vfb_device = {
541    .name = "ubicom32vfb",
542    .id = -1,
543};
544
545/*
546 * vdc_override:
547 * 0: no override (auto-detect)
548 * 1: force vdc usage
549 * 2: force lcd adapter usage
550 */
551static int __initdata vdc_override = 0;
552
553/*
554 * ip7500media_set_forcevdc
555 * Called when forcevdc is present on the kernel boot line
556 */
557static int __init ip7500media_set_forcevdc(char *str)
558{
559    if (str[0] == '1') {
560        vdc_override = 1;
561    } else {
562        vdc_override = 2;
563    }
564    return 1;
565}
566
567/*
568 * ip7500media_video_init
569 * Called late to determine what kind of video we have on this board
570 */
571static int __init ip7500media_video_init(void)
572{
573    struct i2c_adapter *adap;
574    struct i2c_msg msg[1];
575    unsigned char *data;
576    unsigned char checksum;
577    int err;
578    int i;
579
580    if (vdc_override == 1) {
581        printk(KERN_INFO "Force VDCTIO mode\n");
582        goto no_adapter;
583    }
584    if (vdc_override == 2) {
585        printk(KERN_INFO "Force LCD Adapter Board mode\n");
586        return 0;
587    }
588
589    /*
590     * Check to see if there is an EEPROM out there. If we see an
591     * EEPROM then we will assume a LCD Adapter Board (8007-092x)
592     * exists.
593     */
594    data = kmalloc(256, GFP_KERNEL);
595    if (!data) {
596        printk(KERN_WARNING "%s: Failed to allocate memory\n", __FUNCTION__);
597        return -ENOMEM;
598    }
599
600    adap = i2c_get_adapter(0);
601    if (!adap) {
602        printk(KERN_WARNING "%s: Failed to get i2c adapter\n", __FUNCTION__);
603        kfree(data);
604        return -ENODEV;
605    }
606    data[0] = 0;
607    msg->addr = 0x50;
608    msg->flags = 0;
609    msg->len = 1;
610    msg->buf = data;
611    err = i2c_transfer(adap, msg, 1);
612    if (err < 0) {
613        goto no_adapter;
614    }
615
616    msg->addr = 0x50;
617    msg->flags = I2C_M_RD;
618    msg->len = 256;
619    msg->buf = data;
620    err = i2c_transfer(adap, msg, 1);
621    if (err < 0) {
622        goto no_adapter;
623    }
624
625    i2c_put_adapter(adap);
626
627    /*
628     * Verify the checksum
629     */
630    checksum = 0xff;
631    for (i = 0; i < 255; i++) {
632        checksum ^= data[i];
633    }
634    if (checksum != data[255]) {
635        printk(KERN_WARNING "%s: Checksum mismatch\n", __FUNCTION__);
636    }
637
638    kfree(data);
639
640    /*
641     * Bring up VFB
642     */
643    platform_device_register(&ip7500media_vfb_device);
644
645    /*
646     * Add the i2c devices on the LCD Adapter board. (We have to use i2c_new_device
647     * since it's late in the boot process.)
648     */
649    printk(KERN_INFO "%s: registering LCD Adapter board i2c resources\n", __FUNCTION__);
650    for (i = 0; i < ARRAY_SIZE(ip7500media_lcd_adapter_i2c_board_info); i++) {
651        i2c_new_device(adap, &ip7500media_lcd_adapter_i2c_board_info[i]);
652    }
653
654    i2c_put_adapter(adap);
655
656    return 0;
657
658    /*
659     * No LCD Adapter board, bring up VDC
660     */
661no_adapter:
662    vdc_tio_init();
663    return 0;
664}
665late_initcall(ip7500media_video_init);
666__setup("forcevdc=", ip7500media_set_forcevdc);
667
668/*
669 * ip7500media_init
670 * Called to add the devices which we have on this board
671 */
672static int __init ip7500media_init(void)
673{
674    struct platform_device *audio_dev;
675    int have_ethernet = (devtree_find_node("eth_lan") != 0);
676
677    board_init();
678
679    ubi_gpio_init();
680
681#ifdef CONFIG_UIO_UBICOM32RING
682    ring_tio_init("decoder_ring");
683#endif
684
685    /*
686     * Register all of the devices we have on this board
687     */
688    printk(KERN_INFO "%s: registering device resources\n", __FUNCTION__);
689    platform_device_register(&ip7500media_i2c_device);
690    platform_device_register(&ip7500media_backlight_device);
691
692    /*
693     * If ethernet doesn't exist then we can init the lcdpower
694     */
695    if (!have_ethernet) {
696        platform_device_register(&ip7500media_lcdpower_device);
697    }
698
699    /*
700     * Allocate the audio drivers. SPDIF not supported on boards with ethernet.
701     */
702    audio_dev = audio_device_alloc("snd-ubi32-cs4350", "audio", "audio-i2sout", 0);
703    if (audio_dev) {
704        ip7500media_i2c_board_info[0].platform_data = audio_dev;
705    }
706
707    if (!have_ethernet) {
708        struct platform_device *audio_dev2;
709
710        audio_dev2 = audio_device_alloc("snd-ubi32-generic", "audio", "audio-spdifout", 0);
711        if (audio_dev2) {
712            platform_device_register(audio_dev2);
713        }
714    }
715
716    /*
717     * Register all of the devices which sit on the I2C bus
718     */
719    printk(KERN_INFO "%s: registering i2c resources\n", __FUNCTION__);
720    i2c_register_board_info(0, ip7500media_i2c_board_info, ARRAY_SIZE(ip7500media_i2c_board_info));
721
722    /*
723     * We have to initialize the SDIO after the I2C IOB gets setup. SDIO is initialized in
724     * ip7500media_u17_setup
725     */
726
727    printk("IP7500 Media Board\n");
728
729    return 0;
730}
731
732arch_initcall(ip7500media_init);
733

Archive Download this file



interactive