48c537cc8efbb96c903c75c0dd3f02f7494825aa
[safe/jmp/linux-2.6] / arch / mips / alchemy / devboards / platform.c
1 /*
2  * devoard misc stuff.
3  */
4
5 #include <linux/init.h>
6 #include <linux/slab.h>
7 #include <linux/platform_device.h>
8
9 /* register a pcmcia socket */
10 int __init db1x_register_pcmcia_socket(unsigned long pseudo_attr_start,
11                                        unsigned long pseudo_attr_end,
12                                        unsigned long pseudo_mem_start,
13                                        unsigned long pseudo_mem_end,
14                                        unsigned long pseudo_io_start,
15                                        unsigned long pseudo_io_end,
16                                        int card_irq,
17                                        int cd_irq,
18                                        int stschg_irq,
19                                        int eject_irq,
20                                        int id)
21 {
22         int cnt, i, ret;
23         struct resource *sr;
24         struct platform_device *pd;
25
26         cnt = 5;
27         if (eject_irq)
28                 cnt++;
29         if (stschg_irq)
30                 cnt++;
31
32         sr = kzalloc(sizeof(struct resource) * cnt, GFP_KERNEL);
33         if (!sr)
34                 return -ENOMEM;
35
36         pd = platform_device_alloc("db1xxx_pcmcia", id);
37         if (!pd) {
38                 ret = -ENOMEM;
39                 goto out;
40         }
41
42         sr[0].name      = "pseudo-attr";
43         sr[0].flags     = IORESOURCE_MEM;
44         sr[0].start     = pseudo_attr_start;
45         sr[0].end       = pseudo_attr_end;
46
47         sr[1].name      = "pseudo-mem";
48         sr[1].flags     = IORESOURCE_MEM;
49         sr[1].start     = pseudo_mem_start;
50         sr[1].end       = pseudo_mem_end;
51
52         sr[2].name      = "pseudo-io";
53         sr[2].flags     = IORESOURCE_MEM;
54         sr[2].start     = pseudo_io_start;
55         sr[2].end       = pseudo_io_end;
56
57         sr[3].name      = "insert";
58         sr[3].flags     = IORESOURCE_IRQ;
59         sr[3].start = sr[3].end = cd_irq;
60
61         sr[4].name      = "card";
62         sr[4].flags     = IORESOURCE_IRQ;
63         sr[4].start = sr[4].end = card_irq;
64
65         i = 5;
66         if (stschg_irq) {
67                 sr[i].name      = "insert";
68                 sr[i].flags     = IORESOURCE_IRQ;
69                 sr[i].start = sr[i].end = cd_irq;
70                 i++;
71         }
72         if (eject_irq) {
73                 sr[i].name      = "eject";
74                 sr[i].flags     = IORESOURCE_IRQ;
75                 sr[i].start = sr[i].end = eject_irq;
76         }
77
78         pd->resource = sr;
79         pd->num_resources = cnt;
80
81         ret = platform_device_add(pd);
82         if (!ret)
83                 return 0;
84
85         platform_device_put(pd);
86 out:
87         kfree(sr);
88         return ret;
89 }