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 ]

Diff markup

Differences between /linux/drivers/pcmcia/pxa2xx_cm_x270.c (Version 2.6.25.8) and /linux/drivers/pcmcia/pxa2xx_cm_x270.c (Version 2.6.25)


  1 /*                                                  1 /*
  2  * linux/drivers/pcmcia/pxa/pxa_cm_x270.c           2  * linux/drivers/pcmcia/pxa/pxa_cm_x270.c
  3  *                                                  3  *
  4  * This program is free software; you can redi      4  * This program is free software; you can redistribute it and/or modify
  5  * it under the terms of the GNU General Publi      5  * it under the terms of the GNU General Public License version 2 as
  6  * published by the Free Software Foundation.       6  * published by the Free Software Foundation.
  7  *                                                  7  *
  8  * Compulab Ltd., 2003, 2007                        8  * Compulab Ltd., 2003, 2007
  9  * Mike Rapoport <mike@compulab.co.il>              9  * Mike Rapoport <mike@compulab.co.il>
 10  *                                                 10  *
 11  */                                                11  */
 12                                                    12 
 13 #include <linux/kernel.h>                          13 #include <linux/kernel.h>
 14 #include <linux/sched.h>                           14 #include <linux/sched.h>
 15 #include <linux/platform_device.h>                 15 #include <linux/platform_device.h>
 16 #include <linux/irq.h>                             16 #include <linux/irq.h>
 17 #include <linux/delay.h>                           17 #include <linux/delay.h>
 18                                                    18 
 19 #include <pcmcia/ss.h>                             19 #include <pcmcia/ss.h>
 20 #include <asm/hardware.h>                          20 #include <asm/hardware.h>
 21                                                    21 
 22 #include <asm/arch/pxa-regs.h>                     22 #include <asm/arch/pxa-regs.h>
 23 #include <asm/arch/cm-x270.h>                      23 #include <asm/arch/cm-x270.h>
 24                                                    24 
 25 #include "soc_common.h"                            25 #include "soc_common.h"
 26                                                    26 
 27 static struct pcmcia_irqs irqs[] = {               27 static struct pcmcia_irqs irqs[] = {
 28         { 0, PCMCIA_S0_CD_VALID, "PCMCIA0 CD"      28         { 0, PCMCIA_S0_CD_VALID, "PCMCIA0 CD" },
 29         { 1, PCMCIA_S1_CD_VALID, "PCMCIA1 CD"      29         { 1, PCMCIA_S1_CD_VALID, "PCMCIA1 CD" },
 30 };                                                 30 };
 31                                                    31 
 32 static int cmx270_pcmcia_hw_init(struct soc_pc     32 static int cmx270_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
 33 {                                                  33 {
 34         GPSR(GPIO48_nPOE) = GPIO_bit(GPIO48_nP     34         GPSR(GPIO48_nPOE) = GPIO_bit(GPIO48_nPOE) |
 35                 GPIO_bit(GPIO49_nPWE) |            35                 GPIO_bit(GPIO49_nPWE) |
 36                 GPIO_bit(GPIO50_nPIOR) |           36                 GPIO_bit(GPIO50_nPIOR) |
 37                 GPIO_bit(GPIO51_nPIOW) |           37                 GPIO_bit(GPIO51_nPIOW) |
 38                 GPIO_bit(GPIO85_nPCE_1) |          38                 GPIO_bit(GPIO85_nPCE_1) |
 39                 GPIO_bit(GPIO54_nPCE_2);           39                 GPIO_bit(GPIO54_nPCE_2);
 40                                                    40 
 41         pxa_gpio_mode(GPIO48_nPOE_MD);             41         pxa_gpio_mode(GPIO48_nPOE_MD);
 42         pxa_gpio_mode(GPIO49_nPWE_MD);             42         pxa_gpio_mode(GPIO49_nPWE_MD);
 43         pxa_gpio_mode(GPIO50_nPIOR_MD);            43         pxa_gpio_mode(GPIO50_nPIOR_MD);
 44         pxa_gpio_mode(GPIO51_nPIOW_MD);            44         pxa_gpio_mode(GPIO51_nPIOW_MD);
 45         pxa_gpio_mode(GPIO85_nPCE_1_MD);           45         pxa_gpio_mode(GPIO85_nPCE_1_MD);
 46         pxa_gpio_mode(GPIO54_nPCE_2_MD);           46         pxa_gpio_mode(GPIO54_nPCE_2_MD);
 47         pxa_gpio_mode(GPIO55_nPREG_MD);            47         pxa_gpio_mode(GPIO55_nPREG_MD);
 48         pxa_gpio_mode(GPIO56_nPWAIT_MD);           48         pxa_gpio_mode(GPIO56_nPWAIT_MD);
 49         pxa_gpio_mode(GPIO57_nIOIS16_MD);          49         pxa_gpio_mode(GPIO57_nIOIS16_MD);
 50                                                    50 
 51         /* Reset signal */                         51         /* Reset signal */
 52         pxa_gpio_mode(GPIO53_nPCE_2 | GPIO_OUT     52         pxa_gpio_mode(GPIO53_nPCE_2 | GPIO_OUT);
 53         GPCR(GPIO53_nPCE_2) = GPIO_bit(GPIO53_     53         GPCR(GPIO53_nPCE_2) = GPIO_bit(GPIO53_nPCE_2);
 54                                                    54 
 55         set_irq_type(PCMCIA_S0_CD_VALID, IRQ_T     55         set_irq_type(PCMCIA_S0_CD_VALID, IRQ_TYPE_EDGE_BOTH);
 56         set_irq_type(PCMCIA_S1_CD_VALID, IRQ_T     56         set_irq_type(PCMCIA_S1_CD_VALID, IRQ_TYPE_EDGE_BOTH);
 57                                                    57 
 58         /* irq's for slots: */                     58         /* irq's for slots: */
 59         set_irq_type(PCMCIA_S0_RDYINT, IRQ_TYP     59         set_irq_type(PCMCIA_S0_RDYINT, IRQ_TYPE_EDGE_FALLING);
 60         set_irq_type(PCMCIA_S1_RDYINT, IRQ_TYP     60         set_irq_type(PCMCIA_S1_RDYINT, IRQ_TYPE_EDGE_FALLING);
 61                                                    61 
 62         skt->irq = (skt->nr == 0) ? PCMCIA_S0_     62         skt->irq = (skt->nr == 0) ? PCMCIA_S0_RDYINT : PCMCIA_S1_RDYINT;
 63         return soc_pcmcia_request_irqs(skt, ir     63         return soc_pcmcia_request_irqs(skt, irqs, ARRAY_SIZE(irqs));
 64 }                                                  64 }
 65                                                    65 
 66 static void cmx270_pcmcia_shutdown(struct soc_     66 static void cmx270_pcmcia_shutdown(struct soc_pcmcia_socket *skt)
 67 {                                                  67 {
 68         soc_pcmcia_free_irqs(skt, irqs, ARRAY_     68         soc_pcmcia_free_irqs(skt, irqs, ARRAY_SIZE(irqs));
 69                                                    69 
 70         set_irq_type(IRQ_TO_GPIO(PCMCIA_S0_CD_     70         set_irq_type(IRQ_TO_GPIO(PCMCIA_S0_CD_VALID), IRQ_TYPE_NONE);
 71         set_irq_type(IRQ_TO_GPIO(PCMCIA_S1_CD_     71         set_irq_type(IRQ_TO_GPIO(PCMCIA_S1_CD_VALID), IRQ_TYPE_NONE);
 72                                                    72 
 73         set_irq_type(IRQ_TO_GPIO(PCMCIA_S0_RDY     73         set_irq_type(IRQ_TO_GPIO(PCMCIA_S0_RDYINT), IRQ_TYPE_NONE);
 74         set_irq_type(IRQ_TO_GPIO(PCMCIA_S1_RDY     74         set_irq_type(IRQ_TO_GPIO(PCMCIA_S1_RDYINT), IRQ_TYPE_NONE);
 75 }                                                  75 }
 76                                                    76 
 77                                                    77 
 78 static void cmx270_pcmcia_socket_state(struct      78 static void cmx270_pcmcia_socket_state(struct soc_pcmcia_socket *skt,
 79                                        struct      79                                        struct pcmcia_state *state)
 80 {                                                  80 {
 81         state->detect = (PCC_DETECT(skt->nr) =     81         state->detect = (PCC_DETECT(skt->nr) == 0) ? 1 : 0;
 82         state->ready  = (PCC_READY(skt->nr) ==     82         state->ready  = (PCC_READY(skt->nr) == 0) ? 0 : 1;
 83         state->bvd1   = 1;                         83         state->bvd1   = 1;
 84         state->bvd2   = 1;                         84         state->bvd2   = 1;
 85         state->vs_3v  = 0;                         85         state->vs_3v  = 0;
 86         state->vs_Xv  = 0;                         86         state->vs_Xv  = 0;
 87         state->wrprot = 0;  /* not available *     87         state->wrprot = 0;  /* not available */
 88 }                                                  88 }
 89                                                    89 
 90                                                    90 
 91 static int cmx270_pcmcia_configure_socket(stru     91 static int cmx270_pcmcia_configure_socket(struct soc_pcmcia_socket *skt,
 92                                           cons     92                                           const socket_state_t *state)
 93 {                                                  93 {
 94         GPSR(GPIO49_nPWE) = GPIO_bit(GPIO49_nP     94         GPSR(GPIO49_nPWE) = GPIO_bit(GPIO49_nPWE);
 95         pxa_gpio_mode(GPIO49_nPWE | GPIO_OUT);     95         pxa_gpio_mode(GPIO49_nPWE | GPIO_OUT);
 96                                                    96 
 97         switch (skt->nr) {                         97         switch (skt->nr) {
 98         case 0:                                    98         case 0:
 99                 if (state->flags & SS_RESET) {     99                 if (state->flags & SS_RESET) {
100                         GPCR(GPIO49_nPWE) = GP    100                         GPCR(GPIO49_nPWE) = GPIO_bit(GPIO49_nPWE);
101                         GPSR(GPIO53_nPCE_2) =     101                         GPSR(GPIO53_nPCE_2) = GPIO_bit(GPIO53_nPCE_2);
102                         udelay(10);               102                         udelay(10);
103                         GPCR(GPIO53_nPCE_2) =     103                         GPCR(GPIO53_nPCE_2) = GPIO_bit(GPIO53_nPCE_2);
104                         GPSR(GPIO49_nPWE) = GP    104                         GPSR(GPIO49_nPWE) = GPIO_bit(GPIO49_nPWE);
105                 }                                 105                 }
106                 break;                            106                 break;
107         case 1:                                   107         case 1:
108                 if (state->flags & SS_RESET) {    108                 if (state->flags & SS_RESET) {
109                         GPCR(GPIO49_nPWE) = GP    109                         GPCR(GPIO49_nPWE) = GPIO_bit(GPIO49_nPWE);
110                         GPSR(GPIO53_nPCE_2) =     110                         GPSR(GPIO53_nPCE_2) = GPIO_bit(GPIO53_nPCE_2);
111                         udelay(10);               111                         udelay(10);
112                         GPCR(GPIO53_nPCE_2) =     112                         GPCR(GPIO53_nPCE_2) = GPIO_bit(GPIO53_nPCE_2);
113                         GPSR(GPIO49_nPWE) = GP    113                         GPSR(GPIO49_nPWE) = GPIO_bit(GPIO49_nPWE);
114                 }                                 114                 }
115                 break;                            115                 break;
116         }                                         116         }
117                                                   117 
118         pxa_gpio_mode(GPIO49_nPWE_MD);            118         pxa_gpio_mode(GPIO49_nPWE_MD);
119                                                   119 
120         return 0;                                 120         return 0;
121 }                                                 121 }
122                                                   122 
123 static void cmx270_pcmcia_socket_init(struct s    123 static void cmx270_pcmcia_socket_init(struct soc_pcmcia_socket *skt)
124 {                                                 124 {
125 }                                                 125 }
126                                                   126 
127 static void cmx270_pcmcia_socket_suspend(struc    127 static void cmx270_pcmcia_socket_suspend(struct soc_pcmcia_socket *skt)
128 {                                                 128 {
129 }                                                 129 }
130                                                   130 
131                                                   131 
132 static struct pcmcia_low_level cmx270_pcmcia_o    132 static struct pcmcia_low_level cmx270_pcmcia_ops = {
133         .owner                  = THIS_MODULE,    133         .owner                  = THIS_MODULE,
134         .hw_init                = cmx270_pcmci    134         .hw_init                = cmx270_pcmcia_hw_init,
135         .hw_shutdown            = cmx270_pcmci    135         .hw_shutdown            = cmx270_pcmcia_shutdown,
136         .socket_state           = cmx270_pcmci    136         .socket_state           = cmx270_pcmcia_socket_state,
137         .configure_socket       = cmx270_pcmci    137         .configure_socket       = cmx270_pcmcia_configure_socket,
138         .socket_init            = cmx270_pcmci    138         .socket_init            = cmx270_pcmcia_socket_init,
139         .socket_suspend         = cmx270_pcmci    139         .socket_suspend         = cmx270_pcmcia_socket_suspend,
140         .nr                     = 2,              140         .nr                     = 2,
141 };                                                141 };
142                                                   142 
143 static struct platform_device *cmx270_pcmcia_d    143 static struct platform_device *cmx270_pcmcia_device;
144                                                   144 
145 static int __init cmx270_pcmcia_init(void)        145 static int __init cmx270_pcmcia_init(void)
146 {                                                 146 {
147         int ret;                                  147         int ret;
148                                                   148 
149         cmx270_pcmcia_device = platform_device    149         cmx270_pcmcia_device = platform_device_alloc("pxa2xx-pcmcia", -1);
150                                                   150 
151         if (!cmx270_pcmcia_device)                151         if (!cmx270_pcmcia_device)
152                 return -ENOMEM;                   152                 return -ENOMEM;
153                                                   153 
154         cmx270_pcmcia_device->dev.platform_dat    154         cmx270_pcmcia_device->dev.platform_data = &cmx270_pcmcia_ops;
155                                                   155 
156         printk(KERN_INFO "Registering cm-x270     156         printk(KERN_INFO "Registering cm-x270 PCMCIA interface.\n");
157         ret = platform_device_add(cmx270_pcmci    157         ret = platform_device_add(cmx270_pcmcia_device);
158                                                   158 
159         if (ret)                                  159         if (ret)
160                 platform_device_put(cmx270_pcm    160                 platform_device_put(cmx270_pcmcia_device);
161                                                   161 
162         return ret;                               162         return ret;
163 }                                                 163 }
164                                                   164 
165 static void __exit cmx270_pcmcia_exit(void)       165 static void __exit cmx270_pcmcia_exit(void)
166 {                                                 166 {
167         platform_device_unregister(cmx270_pcmc    167         platform_device_unregister(cmx270_pcmcia_device);
168 }                                                 168 }
169                                                   169 
170 module_init(cmx270_pcmcia_init);                  170 module_init(cmx270_pcmcia_init);
171 module_exit(cmx270_pcmcia_exit);                  171 module_exit(cmx270_pcmcia_exit);
172                                                   172 
173 MODULE_LICENSE("GPL");                            173 MODULE_LICENSE("GPL");
174 MODULE_AUTHOR("Mike Rapoport <mike@compulab.co    174 MODULE_AUTHOR("Mike Rapoport <mike@compulab.co.il>");
175 MODULE_DESCRIPTION("CM-x270 PCMCIA driver");      175 MODULE_DESCRIPTION("CM-x270 PCMCIA driver");
176                                                   176 
  This page was automatically generated by the LXR engine.