MIPS: Alchemy: devboards: wire up new PCMCIA driver.
[linux-2.6.git] / arch / mips / alchemy / devboards / platform.c
blob48c537cc8efbb96c903c75c0dd3f02f7494825aa
1 /*
2 * devoard misc stuff.
3 */
5 #include <linux/init.h>
6 #include <linux/slab.h>
7 #include <linux/platform_device.h>
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)
22 int cnt, i, ret;
23 struct resource *sr;
24 struct platform_device *pd;
26 cnt = 5;
27 if (eject_irq)
28 cnt++;
29 if (stschg_irq)
30 cnt++;
32 sr = kzalloc(sizeof(struct resource) * cnt, GFP_KERNEL);
33 if (!sr)
34 return -ENOMEM;
36 pd = platform_device_alloc("db1xxx_pcmcia", id);
37 if (!pd) {
38 ret = -ENOMEM;
39 goto out;
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;
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;
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;
57 sr[3].name = "insert";
58 sr[3].flags = IORESOURCE_IRQ;
59 sr[3].start = sr[3].end = cd_irq;
61 sr[4].name = "card";
62 sr[4].flags = IORESOURCE_IRQ;
63 sr[4].start = sr[4].end = card_irq;
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++;
72 if (eject_irq) {
73 sr[i].name = "eject";
74 sr[i].flags = IORESOURCE_IRQ;
75 sr[i].start = sr[i].end = eject_irq;
78 pd->resource = sr;
79 pd->num_resources = cnt;
81 ret = platform_device_add(pd);
82 if (!ret)
83 return 0;
85 platform_device_put(pd);
86 out:
87 kfree(sr);
88 return ret;