Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6
[pandora-kernel.git] / drivers / pcmcia / db1xxx_ss.c
1 /*
2  * PCMCIA socket code for the Alchemy Db1xxx/Pb1xxx boards.
3  *
4  * Copyright (c) 2009 Manuel Lauss <manuel.lauss@gmail.com>
5  *
6  */
7
8 /* This is a fairly generic PCMCIA socket driver suitable for the
9  * following Alchemy Development boards:
10  *  Db1000, Db/Pb1500, Db/Pb1100, Db/Pb1550, Db/Pb1200.
11  *
12  * The Db1000 is used as a reference:  Per-socket card-, carddetect- and
13  *  statuschange IRQs connected to SoC GPIOs, control and status register
14  *  bits arranged in per-socket groups in an external PLD.  All boards
15  *  listed here use this layout, including bit positions and meanings.
16  *  Of course there are exceptions in later boards:
17  *
18  *      - Pb1100/Pb1500:  single socket only; voltage key bits VS are
19  *                        at STATUS[5:4] (instead of STATUS[1:0]).
20  *      - Au1200-based:   additional card-eject irqs, irqs not gpios!
21  */
22
23 #include <linux/delay.h>
24 #include <linux/gpio.h>
25 #include <linux/interrupt.h>
26 #include <linux/pm.h>
27 #include <linux/platform_device.h>
28 #include <linux/resource.h>
29 #include <linux/slab.h>
30 #include <linux/spinlock.h>
31
32 #include <pcmcia/cs_types.h>
33 #include <pcmcia/ss.h>
34
35 #include <asm/mach-au1x00/au1000.h>
36 #include <asm/mach-db1x00/bcsr.h>
37
38 #define MEM_MAP_SIZE    0x400000
39 #define IO_MAP_SIZE     0x1000
40
41 struct db1x_pcmcia_sock {
42         struct pcmcia_socket    socket;
43         int             nr;             /* socket number */
44         void            *virt_io;
45
46         phys_addr_t     phys_io;
47         phys_addr_t     phys_attr;
48         phys_addr_t     phys_mem;
49
50         /* previous flags for set_socket() */
51         unsigned int old_flags;
52
53         /* interrupt sources: linux irq numbers! */
54         int     insert_irq;     /* default carddetect irq */
55         int     stschg_irq;     /* card-status-change irq */
56         int     card_irq;       /* card irq */
57         int     eject_irq;      /* db1200/pb1200 have these */
58
59 #define BOARD_TYPE_DEFAULT      0       /* most boards */
60 #define BOARD_TYPE_DB1200       1       /* IRQs aren't gpios */
61 #define BOARD_TYPE_PB1100       2       /* VS bits slightly different */
62         int     board_type;
63 };
64
65 #define to_db1x_socket(x) container_of(x, struct db1x_pcmcia_sock, socket)
66
67 /* DB/PB1200: check CPLD SIGSTATUS register bit 10/12 */
68 static int db1200_card_inserted(struct db1x_pcmcia_sock *sock)
69 {
70         unsigned short sigstat;
71
72         sigstat = bcsr_read(BCSR_SIGSTAT);
73         return sigstat & 1 << (8 + 2 * sock->nr);
74 }
75
76 /* carddetect gpio: low-active */
77 static int db1000_card_inserted(struct db1x_pcmcia_sock *sock)
78 {
79         return !gpio_get_value(irq_to_gpio(sock->insert_irq));
80 }
81
82 static int db1x_card_inserted(struct db1x_pcmcia_sock *sock)
83 {
84         switch (sock->board_type) {
85         case BOARD_TYPE_DB1200:
86                 return db1200_card_inserted(sock);
87         default:
88                 return db1000_card_inserted(sock);
89         }
90 }
91
92 /* STSCHG tends to bounce heavily when cards are inserted/ejected.
93  * To avoid this, the interrupt is normally disabled and only enabled
94  * after reset to a card has been de-asserted.
95  */
96 static inline void set_stschg(struct db1x_pcmcia_sock *sock, int en)
97 {
98         if (sock->stschg_irq != -1) {
99                 if (en)
100                         enable_irq(sock->stschg_irq);
101                 else
102                         disable_irq(sock->stschg_irq);
103         }
104 }
105
106 static irqreturn_t db1000_pcmcia_cdirq(int irq, void *data)
107 {
108         struct db1x_pcmcia_sock *sock = data;
109
110         pcmcia_parse_events(&sock->socket, SS_DETECT);
111
112         return IRQ_HANDLED;
113 }
114
115 static irqreturn_t db1000_pcmcia_stschgirq(int irq, void *data)
116 {
117         struct db1x_pcmcia_sock *sock = data;
118
119         pcmcia_parse_events(&sock->socket, SS_STSCHG);
120
121         return IRQ_HANDLED;
122 }
123
124 static irqreturn_t db1200_pcmcia_cdirq(int irq, void *data)
125 {
126         struct db1x_pcmcia_sock *sock = data;
127
128         /* Db/Pb1200 have separate per-socket insertion and ejection
129          * interrupts which stay asserted as long as the card is
130          * inserted/missing.  The one which caused us to be called
131          * needs to be disabled and the other one enabled.
132          */
133         if (irq == sock->insert_irq) {
134                 disable_irq_nosync(sock->insert_irq);
135                 enable_irq(sock->eject_irq);
136         } else {
137                 disable_irq_nosync(sock->eject_irq);
138                 enable_irq(sock->insert_irq);
139         }
140
141         pcmcia_parse_events(&sock->socket, SS_DETECT);
142
143         return IRQ_HANDLED;
144 }
145
146 static int db1x_pcmcia_setup_irqs(struct db1x_pcmcia_sock *sock)
147 {
148         int ret;
149         unsigned long flags;
150
151         if (sock->stschg_irq != -1) {
152                 ret = request_irq(sock->stschg_irq, db1000_pcmcia_stschgirq,
153                                   0, "pcmcia_stschg", sock);
154                 if (ret)
155                         return ret;
156         }
157
158         /* Db/Pb1200 have separate per-socket insertion and ejection
159          * interrupts, which should show edge behaviour but don't.
160          * So interrupts are disabled until both insertion and
161          * ejection handler have been registered and the currently
162          * active one disabled.
163          */
164         if (sock->board_type == BOARD_TYPE_DB1200) {
165                 local_irq_save(flags);
166
167                 ret = request_irq(sock->insert_irq, db1200_pcmcia_cdirq,
168                                   IRQF_DISABLED, "pcmcia_insert", sock);
169                 if (ret) {
170                         local_irq_restore(flags);
171                         goto out1;
172                 }
173
174                 ret = request_irq(sock->eject_irq, db1200_pcmcia_cdirq,
175                                   IRQF_DISABLED, "pcmcia_eject", sock);
176                 if (ret) {
177                         free_irq(sock->insert_irq, sock);
178                         local_irq_restore(flags);
179                         goto out1;
180                 }
181
182                 /* disable the currently active one */
183                 if (db1200_card_inserted(sock))
184                         disable_irq_nosync(sock->insert_irq);
185                 else
186                         disable_irq_nosync(sock->eject_irq);
187
188                 local_irq_restore(flags);
189         } else {
190                 /* all other (older) Db1x00 boards use a GPIO to show
191                  * card detection status:  use both-edge triggers.
192                  */
193                 set_irq_type(sock->insert_irq, IRQ_TYPE_EDGE_BOTH);
194                 ret = request_irq(sock->insert_irq, db1000_pcmcia_cdirq,
195                                   0, "pcmcia_carddetect", sock);
196
197                 if (ret)
198                         goto out1;
199         }
200
201         return 0;       /* all done */
202
203 out1:
204         if (sock->stschg_irq != -1)
205                 free_irq(sock->stschg_irq, sock);
206
207         return ret;
208 }
209
210 static void db1x_pcmcia_free_irqs(struct db1x_pcmcia_sock *sock)
211 {
212         if (sock->stschg_irq != -1)
213                 free_irq(sock->stschg_irq, sock);
214
215         free_irq(sock->insert_irq, sock);
216         if (sock->eject_irq != -1)
217                 free_irq(sock->eject_irq, sock);
218 }
219
220 /*
221  * configure a PCMCIA socket on the Db1x00 series of boards (and
222  * compatibles).
223  *
224  * 2 external registers are involved:
225  *   pcmcia_status (offset 0x04): bits [0:1/2:3]: read card voltage id
226  *   pcmcia_control(offset 0x10):
227  *      bits[0:1] set vcc for card
228  *      bits[2:3] set vpp for card
229  *      bit 4:  enable data buffers
230  *      bit 7:  reset# for card
231  *      add 8 for second socket.
232  */
233 static int db1x_pcmcia_configure(struct pcmcia_socket *skt,
234                                  struct socket_state_t *state)
235 {
236         struct db1x_pcmcia_sock *sock = to_db1x_socket(skt);
237         unsigned short cr_clr, cr_set;
238         unsigned int changed;
239         int v, p, ret;
240
241         /* card voltage setup */
242         cr_clr = (0xf << (sock->nr * 8)); /* clear voltage settings */
243         cr_set = 0;
244         v = p = ret = 0;
245
246         switch (state->Vcc) {
247         case 50:
248                 ++v;
249         case 33:
250                 ++v;
251         case 0:
252                 break;
253         default:
254                 printk(KERN_INFO "pcmcia%d unsupported Vcc %d\n",
255                         sock->nr, state->Vcc);
256         }
257
258         switch (state->Vpp) {
259         case 12:
260                 ++p;
261         case 33:
262         case 50:
263                 ++p;
264         case 0:
265                 break;
266         default:
267                 printk(KERN_INFO "pcmcia%d unsupported Vpp %d\n",
268                         sock->nr, state->Vpp);
269         }
270
271         /* sanity check: Vpp must be 0, 12, or Vcc */
272         if (((state->Vcc == 33) && (state->Vpp == 50)) ||
273             ((state->Vcc == 50) && (state->Vpp == 33))) {
274                 printk(KERN_INFO "pcmcia%d bad Vcc/Vpp combo (%d %d)\n",
275                         sock->nr, state->Vcc, state->Vpp);
276                 v = p = 0;
277                 ret = -EINVAL;
278         }
279
280         /* create new voltage code */
281         cr_set |= ((v << 2) | p) << (sock->nr * 8);
282
283         changed = state->flags ^ sock->old_flags;
284
285         if (changed & SS_RESET) {
286                 if (state->flags & SS_RESET) {
287                         set_stschg(sock, 0);
288                         /* assert reset, disable io buffers */
289                         cr_clr |= (1 << (7 + (sock->nr * 8)));
290                         cr_clr |= (1 << (4 + (sock->nr * 8)));
291                 } else {
292                         /* de-assert reset, enable io buffers */
293                         cr_set |= 1 << (7 + (sock->nr * 8));
294                         cr_set |= 1 << (4 + (sock->nr * 8));
295                 }
296         }
297
298         /* update PCMCIA configuration */
299         bcsr_mod(BCSR_PCMCIA, cr_clr, cr_set);
300
301         sock->old_flags = state->flags;
302
303         /* reset was taken away: give card time to initialize properly */
304         if ((changed & SS_RESET) && !(state->flags & SS_RESET)) {
305                 msleep(500);
306                 set_stschg(sock, 1);
307         }
308
309         return ret;
310 }
311
312 /* VCC bits at [3:2]/[11:10] */
313 #define GET_VCC(cr, socknr)             \
314         ((((cr) >> 2) >> ((socknr) * 8)) & 3)
315
316 /* VS bits at [0:1]/[3:2] */
317 #define GET_VS(sr, socknr)              \
318         (((sr) >> (2 * (socknr))) & 3)
319
320 /* reset bits at [7]/[15] */
321 #define GET_RESET(cr, socknr)           \
322         ((cr) & (1 << (7 + (8 * (socknr)))))
323
324 static int db1x_pcmcia_get_status(struct pcmcia_socket *skt,
325                                   unsigned int *value)
326 {
327         struct db1x_pcmcia_sock *sock = to_db1x_socket(skt);
328         unsigned short cr, sr;
329         unsigned int status;
330
331         status = db1x_card_inserted(sock) ? SS_DETECT : 0;
332
333         cr = bcsr_read(BCSR_PCMCIA);
334         sr = bcsr_read(BCSR_STATUS);
335
336         /* PB1100/PB1500: voltage key bits are at [5:4] */
337         if (sock->board_type == BOARD_TYPE_PB1100)
338                 sr >>= 4;
339
340         /* determine card type */
341         switch (GET_VS(sr, sock->nr)) {
342         case 0:
343         case 2:
344                 status |= SS_3VCARD;    /* 3V card */
345         case 3:
346                 break;                  /* 5V card: set nothing */
347         default:
348                 status |= SS_XVCARD;    /* treated as unsupported in core */
349         }
350
351         /* if Vcc is not zero, we have applied power to a card */
352         status |= GET_VCC(cr, sock->nr) ? SS_POWERON : 0;
353
354         /* reset de-asserted? then we're ready */
355         status |= (GET_RESET(cr, sock->nr)) ? SS_READY : SS_RESET;
356
357         *value = status;
358
359         return 0;
360 }
361
362 static int db1x_pcmcia_sock_init(struct pcmcia_socket *skt)
363 {
364         return 0;
365 }
366
367 static int db1x_pcmcia_sock_suspend(struct pcmcia_socket *skt)
368 {
369         return 0;
370 }
371
372 static int au1x00_pcmcia_set_io_map(struct pcmcia_socket *skt,
373                                     struct pccard_io_map *map)
374 {
375         struct db1x_pcmcia_sock *sock = to_db1x_socket(skt);
376
377         map->start = (u32)sock->virt_io;
378         map->stop = map->start + IO_MAP_SIZE;
379
380         return 0;
381 }
382
383 static int au1x00_pcmcia_set_mem_map(struct pcmcia_socket *skt,
384                                      struct pccard_mem_map *map)
385 {
386         struct db1x_pcmcia_sock *sock = to_db1x_socket(skt);
387
388         if (map->flags & MAP_ATTRIB)
389                 map->static_start = sock->phys_attr + map->card_start;
390         else
391                 map->static_start = sock->phys_mem + map->card_start;
392
393         return 0;
394 }
395
396 static struct pccard_operations db1x_pcmcia_operations = {
397         .init                   = db1x_pcmcia_sock_init,
398         .suspend                = db1x_pcmcia_sock_suspend,
399         .get_status             = db1x_pcmcia_get_status,
400         .set_socket             = db1x_pcmcia_configure,
401         .set_io_map             = au1x00_pcmcia_set_io_map,
402         .set_mem_map            = au1x00_pcmcia_set_mem_map,
403 };
404
405 static int __devinit db1x_pcmcia_socket_probe(struct platform_device *pdev)
406 {
407         struct db1x_pcmcia_sock *sock;
408         struct resource *r;
409         int ret, bid;
410
411         sock = kzalloc(sizeof(struct db1x_pcmcia_sock), GFP_KERNEL);
412         if (!sock)
413                 return -ENOMEM;
414
415         sock->nr = pdev->id;
416
417         bid = BCSR_WHOAMI_BOARD(bcsr_read(BCSR_WHOAMI));
418         switch (bid) {
419         case BCSR_WHOAMI_PB1500:
420         case BCSR_WHOAMI_PB1500R2:
421         case BCSR_WHOAMI_PB1100:
422                 sock->board_type = BOARD_TYPE_PB1100;
423                 break;
424         case BCSR_WHOAMI_DB1000 ... BCSR_WHOAMI_PB1550_SDR:
425                 sock->board_type = BOARD_TYPE_DEFAULT;
426                 break;
427         case BCSR_WHOAMI_PB1200 ... BCSR_WHOAMI_DB1200:
428                 sock->board_type = BOARD_TYPE_DB1200;
429                 break;
430         default:
431                 printk(KERN_INFO "db1xxx-ss: unknown board %d!\n", bid);
432                 ret = -ENODEV;
433                 goto out0;
434         };
435
436         /*
437          * gather resources necessary and optional nice-to-haves to
438          * operate a socket:
439          * This includes IRQs for Carddetection/ejection, the card
440          *  itself and optional status change detection.
441          * Also, the memory areas covered by a socket.  For these
442          *  we require the real 36bit addresses (see the au1000.h
443          *  header for more information).
444          */
445
446         /* card: irq assigned to the card itself. */
447         r = platform_get_resource_byname(pdev, IORESOURCE_IRQ, "card");
448         sock->card_irq = r ? r->start : 0;
449
450         /* insert: irq which triggers on card insertion/ejection */
451         r = platform_get_resource_byname(pdev, IORESOURCE_IRQ, "insert");
452         sock->insert_irq = r ? r->start : -1;
453
454         /* stschg: irq which trigger on card status change (optional) */
455         r = platform_get_resource_byname(pdev, IORESOURCE_IRQ, "stschg");
456         sock->stschg_irq = r ? r->start : -1;
457
458         /* eject: irq which triggers on ejection (DB1200/PB1200 only) */
459         r = platform_get_resource_byname(pdev, IORESOURCE_IRQ, "eject");
460         sock->eject_irq = r ? r->start : -1;
461
462         ret = -ENODEV;
463
464         /* 36bit PCMCIA Attribute area address */
465         r = platform_get_resource_byname(pdev, IORESOURCE_MEM, "pcmcia-attr");
466         if (!r) {
467                 printk(KERN_ERR "pcmcia%d has no 'pseudo-attr' resource!\n",
468                         sock->nr);
469                 goto out0;
470         }
471         sock->phys_attr = r->start;
472
473         /* 36bit PCMCIA Memory area address */
474         r = platform_get_resource_byname(pdev, IORESOURCE_MEM, "pcmcia-mem");
475         if (!r) {
476                 printk(KERN_ERR "pcmcia%d has no 'pseudo-mem' resource!\n",
477                         sock->nr);
478                 goto out0;
479         }
480         sock->phys_mem = r->start;
481
482         /* 36bit PCMCIA IO area address */
483         r = platform_get_resource_byname(pdev, IORESOURCE_MEM, "pcmcia-io");
484         if (!r) {
485                 printk(KERN_ERR "pcmcia%d has no 'pseudo-io' resource!\n",
486                         sock->nr);
487                 goto out0;
488         }
489         sock->phys_io = r->start;
490
491         /*
492          * PCMCIA client drivers use the inb/outb macros to access
493          * the IO registers.  Since mips_io_port_base is added
494          * to the access address of the mips implementation of
495          * inb/outb, we need to subtract it here because we want
496          * to access the I/O or MEM address directly, without
497          * going through this "mips_io_port_base" mechanism.
498          */
499         sock->virt_io = (void *)(ioremap(sock->phys_io, IO_MAP_SIZE) -
500                                  mips_io_port_base);
501
502         if (!sock->virt_io) {
503                 printk(KERN_ERR "pcmcia%d: cannot remap IO area\n",
504                         sock->nr);
505                 ret = -ENOMEM;
506                 goto out0;
507         }
508
509         sock->socket.ops        = &db1x_pcmcia_operations;
510         sock->socket.owner      = THIS_MODULE;
511         sock->socket.pci_irq    = sock->card_irq;
512         sock->socket.features   = SS_CAP_STATIC_MAP | SS_CAP_PCCARD;
513         sock->socket.map_size   = MEM_MAP_SIZE;
514         sock->socket.io_offset  = (unsigned long)sock->virt_io;
515         sock->socket.dev.parent = &pdev->dev;
516         sock->socket.resource_ops = &pccard_static_ops;
517
518         platform_set_drvdata(pdev, sock);
519
520         ret = db1x_pcmcia_setup_irqs(sock);
521         if (ret) {
522                 printk(KERN_ERR "pcmcia%d cannot setup interrupts\n",
523                         sock->nr);
524                 goto out1;
525         }
526
527         set_stschg(sock, 0);
528
529         ret = pcmcia_register_socket(&sock->socket);
530         if (ret) {
531                 printk(KERN_ERR "pcmcia%d failed to register\n", sock->nr);
532                 goto out2;
533         }
534
535         printk(KERN_INFO "Alchemy Db/Pb1xxx pcmcia%d @ io/attr/mem %09llx"
536                 "(%p) %09llx %09llx  card/insert/stschg/eject irqs @ %d "
537                 "%d %d %d\n", sock->nr, sock->phys_io, sock->virt_io,
538                 sock->phys_attr, sock->phys_mem, sock->card_irq,
539                 sock->insert_irq, sock->stschg_irq, sock->eject_irq);
540
541         return 0;
542
543 out2:
544         db1x_pcmcia_free_irqs(sock);
545 out1:
546         iounmap((void *)(sock->virt_io + (u32)mips_io_port_base));
547 out0:
548         kfree(sock);
549         return ret;
550 }
551
552 static int __devexit db1x_pcmcia_socket_remove(struct platform_device *pdev)
553 {
554         struct db1x_pcmcia_sock *sock = platform_get_drvdata(pdev);
555
556         db1x_pcmcia_free_irqs(sock);
557         pcmcia_unregister_socket(&sock->socket);
558         iounmap((void *)(sock->virt_io + (u32)mips_io_port_base));
559         kfree(sock);
560
561         return 0;
562 }
563
564 static struct platform_driver db1x_pcmcia_socket_driver = {
565         .driver = {
566                 .name   = "db1xxx_pcmcia",
567                 .owner  = THIS_MODULE,
568         },
569         .probe          = db1x_pcmcia_socket_probe,
570         .remove         = __devexit_p(db1x_pcmcia_socket_remove),
571 };
572
573 int __init db1x_pcmcia_socket_load(void)
574 {
575         return platform_driver_register(&db1x_pcmcia_socket_driver);
576 }
577
578 void  __exit db1x_pcmcia_socket_unload(void)
579 {
580         platform_driver_unregister(&db1x_pcmcia_socket_driver);
581 }
582
583 module_init(db1x_pcmcia_socket_load);
584 module_exit(db1x_pcmcia_socket_unload);
585
586 MODULE_LICENSE("GPL");
587 MODULE_DESCRIPTION("PCMCIA Socket Services for Alchemy Db/Pb1x00 boards");
588 MODULE_AUTHOR("Manuel Lauss");