Linux kernel & device driver programming

Cross-Referenced Linux and Device Driver Code

[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ]
Version: [ 2.6.11.8 ] [ 2.6.25 ] [ 2.6.25.8 ] [ 2.6.31.13 ] Architecture: [ i386 ]
  1 /*
  2  * drivers/pcmcia/sa1100_cerf.c
  3  *
  4  * PCMCIA implementation routines for CerfBoard
  5  * Based off the Assabet.
  6  *
  7  */
  8 #include <linux/config.h>
  9 #include <linux/module.h>
 10 #include <linux/kernel.h>
 11 #include <linux/sched.h>
 12 #include <linux/device.h>
 13 #include <linux/init.h>
 14 #include <linux/delay.h>
 15 
 16 #include <asm/hardware.h>
 17 #include <asm/mach-types.h>
 18 #include <asm/irq.h>
 19 #include <asm/arch/cerf.h>
 20 #include "sa1100_generic.h"
 21 
 22 #define CERF_SOCKET     1
 23 
 24 static struct pcmcia_irqs irqs[] = {
 25         { CERF_SOCKET, CERF_IRQ_GPIO_CF_CD,   "CF_CD"   },
 26         { CERF_SOCKET, CERF_IRQ_GPIO_CF_BVD2, "CF_BVD2" },
 27         { CERF_SOCKET, CERF_IRQ_GPIO_CF_BVD1, "CF_BVD1" }
 28 };
 29 
 30 static int cerf_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
 31 {
 32         skt->irq = CERF_IRQ_GPIO_CF_IRQ;
 33 
 34         return soc_pcmcia_request_irqs(skt, irqs, ARRAY_SIZE(irqs));
 35 }
 36 
 37 static void cerf_pcmcia_hw_shutdown(struct soc_pcmcia_socket *skt)
 38 {
 39         soc_pcmcia_free_irqs(skt, irqs, ARRAY_SIZE(irqs));
 40 }
 41 
 42 static void
 43 cerf_pcmcia_socket_state(struct soc_pcmcia_socket *skt, struct pcmcia_state *state)
 44 {
 45         unsigned long levels = GPLR;
 46 
 47         state->detect   = (levels & CERF_GPIO_CF_CD)  ?0:1;
 48         state->ready    = (levels & CERF_GPIO_CF_IRQ) ?1:0;
 49         state->bvd1     = (levels & CERF_GPIO_CF_BVD1)?1:0;
 50         state->bvd2     = (levels & CERF_GPIO_CF_BVD2)?1:0;
 51         state->wrprot   = 0;
 52         state->vs_3v    = 1;
 53         state->vs_Xv    = 0;
 54 }
 55 
 56 static int
 57 cerf_pcmcia_configure_socket(struct soc_pcmcia_socket *skt,
 58                              const socket_state_t *state)
 59 {
 60         switch (state->Vcc) {
 61         case 0:
 62         case 50:
 63         case 33:
 64                 break;
 65 
 66         default:
 67                 printk(KERN_ERR "%s(): unrecognized Vcc %u\n",
 68                         __FUNCTION__, state->Vcc);
 69                 return -1;
 70         }
 71 
 72         if (state->flags & SS_RESET) {
 73                 GPSR = CERF_GPIO_CF_RESET;
 74         } else {
 75                 GPCR = CERF_GPIO_CF_RESET;
 76         }
 77 
 78         return 0;
 79 }
 80 
 81 static void cerf_pcmcia_socket_init(struct soc_pcmcia_socket *skt)
 82 {
 83         soc_pcmcia_enable_irqs(skt, irqs, ARRAY_SIZE(irqs));
 84 }
 85 
 86 static void cerf_pcmcia_socket_suspend(struct soc_pcmcia_socket *skt)
 87 {
 88         soc_pcmcia_disable_irqs(skt, irqs, ARRAY_SIZE(irqs));
 89 }
 90 
 91 static struct pcmcia_low_level cerf_pcmcia_ops = { 
 92         .owner                  = THIS_MODULE,
 93         .hw_init                = cerf_pcmcia_hw_init,
 94         .hw_shutdown            = cerf_pcmcia_hw_shutdown,
 95         .socket_state           = cerf_pcmcia_socket_state,
 96         .configure_socket       = cerf_pcmcia_configure_socket,
 97 
 98         .socket_init            = cerf_pcmcia_socket_init,
 99         .socket_suspend         = cerf_pcmcia_socket_suspend,
100 };
101 
102 int __init pcmcia_cerf_init(struct device *dev)
103 {
104         int ret = -ENODEV;
105 
106         if (machine_is_cerf())
107                 ret = sa11xx_drv_pcmcia_probe(dev, &cerf_pcmcia_ops, CERF_SOCKET, 1);
108 
109         return ret;
110 }
111 
  This page was automatically generated by the LXR engine.