0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #include <linux/module.h>
0011 #include <linux/kernel.h>
0012 #include <linux/sched.h>
0013 #include <linux/platform_device.h>
0014 #include <linux/errno.h>
0015 #include <linux/init.h>
0016 #include <linux/delay.h>
0017 #include <linux/interrupt.h>
0018 #include <linux/mm.h>
0019 #include <linux/vmalloc.h>
0020 #include <linux/of_address.h>
0021 #include <linux/of_irq.h>
0022 #include <linux/of_platform.h>
0023 #include <linux/slab.h>
0024
0025 #include <pcmcia/ss.h>
0026
0027 static const char driver_name[] = "electra-cf";
0028
0029 struct electra_cf_socket {
0030 struct pcmcia_socket socket;
0031
0032 struct timer_list timer;
0033 unsigned present:1;
0034 unsigned active:1;
0035
0036 struct platform_device *ofdev;
0037 unsigned long mem_phys;
0038 void __iomem *mem_base;
0039 unsigned long mem_size;
0040 void __iomem *io_virt;
0041 unsigned int io_base;
0042 unsigned int io_size;
0043 u_int irq;
0044 struct resource iomem;
0045 void __iomem *gpio_base;
0046 int gpio_detect;
0047 int gpio_vsense;
0048 int gpio_3v;
0049 int gpio_5v;
0050 };
0051
0052 #define POLL_INTERVAL (2 * HZ)
0053
0054
0055 static int electra_cf_present(struct electra_cf_socket *cf)
0056 {
0057 unsigned int gpio;
0058
0059 gpio = in_le32(cf->gpio_base+0x40);
0060 return !(gpio & (1 << cf->gpio_detect));
0061 }
0062
0063 static int electra_cf_ss_init(struct pcmcia_socket *s)
0064 {
0065 return 0;
0066 }
0067
0068
0069 static void electra_cf_timer(struct timer_list *t)
0070 {
0071 struct electra_cf_socket *cf = from_timer(cf, t, timer);
0072 int present = electra_cf_present(cf);
0073
0074 if (present != cf->present) {
0075 cf->present = present;
0076 pcmcia_parse_events(&cf->socket, SS_DETECT);
0077 }
0078
0079 if (cf->active)
0080 mod_timer(&cf->timer, jiffies + POLL_INTERVAL);
0081 }
0082
0083 static irqreturn_t electra_cf_irq(int irq, void *_cf)
0084 {
0085 struct electra_cf_socket *cf = _cf;
0086
0087 electra_cf_timer(&cf->timer);
0088 return IRQ_HANDLED;
0089 }
0090
0091 static int electra_cf_get_status(struct pcmcia_socket *s, u_int *sp)
0092 {
0093 struct electra_cf_socket *cf;
0094
0095 if (!sp)
0096 return -EINVAL;
0097
0098 cf = container_of(s, struct electra_cf_socket, socket);
0099
0100
0101 if (electra_cf_present(cf)) {
0102 *sp = SS_READY | SS_DETECT | SS_POWERON | SS_3VCARD;
0103
0104 s->pci_irq = cf->irq;
0105 } else
0106 *sp = 0;
0107 return 0;
0108 }
0109
0110 static int electra_cf_set_socket(struct pcmcia_socket *sock,
0111 struct socket_state_t *s)
0112 {
0113 unsigned int gpio;
0114 unsigned int vcc;
0115 struct electra_cf_socket *cf;
0116
0117 cf = container_of(sock, struct electra_cf_socket, socket);
0118
0119
0120 vcc = (s->flags & SS_RESET) ? 0 : s->Vcc;
0121
0122 switch (vcc) {
0123 case 0:
0124 gpio = 0;
0125 break;
0126 case 33:
0127 gpio = (1 << cf->gpio_3v);
0128 break;
0129 case 5:
0130 gpio = (1 << cf->gpio_5v);
0131 break;
0132 default:
0133 return -EINVAL;
0134 }
0135
0136 gpio |= 1 << (cf->gpio_3v + 16);
0137 gpio |= 1 << (cf->gpio_5v + 16);
0138 out_le32(cf->gpio_base+0x90, gpio);
0139
0140 pr_debug("%s: Vcc %d, io_irq %d, flags %04x csc %04x\n",
0141 driver_name, s->Vcc, s->io_irq, s->flags, s->csc_mask);
0142
0143 return 0;
0144 }
0145
0146 static int electra_cf_set_io_map(struct pcmcia_socket *s,
0147 struct pccard_io_map *io)
0148 {
0149 return 0;
0150 }
0151
0152 static int electra_cf_set_mem_map(struct pcmcia_socket *s,
0153 struct pccard_mem_map *map)
0154 {
0155 struct electra_cf_socket *cf;
0156
0157 if (map->card_start)
0158 return -EINVAL;
0159 cf = container_of(s, struct electra_cf_socket, socket);
0160 map->static_start = cf->mem_phys;
0161 map->flags &= MAP_ACTIVE|MAP_ATTRIB;
0162 if (!(map->flags & MAP_ATTRIB))
0163 map->static_start += 0x800;
0164 return 0;
0165 }
0166
0167 static struct pccard_operations electra_cf_ops = {
0168 .init = electra_cf_ss_init,
0169 .get_status = electra_cf_get_status,
0170 .set_socket = electra_cf_set_socket,
0171 .set_io_map = electra_cf_set_io_map,
0172 .set_mem_map = electra_cf_set_mem_map,
0173 };
0174
0175 static int electra_cf_probe(struct platform_device *ofdev)
0176 {
0177 struct device *device = &ofdev->dev;
0178 struct device_node *np = ofdev->dev.of_node;
0179 struct electra_cf_socket *cf;
0180 struct resource mem, io;
0181 int status = -ENOMEM;
0182 const unsigned int *prop;
0183 int err;
0184
0185 err = of_address_to_resource(np, 0, &mem);
0186 if (err)
0187 return -EINVAL;
0188
0189 err = of_address_to_resource(np, 1, &io);
0190 if (err)
0191 return -EINVAL;
0192
0193 cf = kzalloc(sizeof(*cf), GFP_KERNEL);
0194 if (!cf)
0195 return -ENOMEM;
0196
0197 timer_setup(&cf->timer, electra_cf_timer, 0);
0198 cf->irq = 0;
0199
0200 cf->ofdev = ofdev;
0201 cf->mem_phys = mem.start;
0202 cf->mem_size = PAGE_ALIGN(resource_size(&mem));
0203 cf->mem_base = ioremap(cf->mem_phys, cf->mem_size);
0204 if (!cf->mem_base)
0205 goto out_free_cf;
0206 cf->io_size = PAGE_ALIGN(resource_size(&io));
0207 cf->io_virt = ioremap_phb(io.start, cf->io_size);
0208 if (!cf->io_virt)
0209 goto out_unmap_mem;
0210
0211 cf->gpio_base = ioremap(0xfc103000, 0x1000);
0212 if (!cf->gpio_base)
0213 goto out_unmap_virt;
0214 dev_set_drvdata(device, cf);
0215
0216 cf->io_base = (unsigned long)cf->io_virt - VMALLOC_END;
0217 cf->iomem.start = (unsigned long)cf->mem_base;
0218 cf->iomem.end = (unsigned long)cf->mem_base + (mem.end - mem.start);
0219 cf->iomem.flags = IORESOURCE_MEM;
0220
0221 cf->irq = irq_of_parse_and_map(np, 0);
0222
0223 status = request_irq(cf->irq, electra_cf_irq, IRQF_SHARED,
0224 driver_name, cf);
0225 if (status < 0) {
0226 dev_err(device, "request_irq failed\n");
0227 goto fail1;
0228 }
0229
0230 cf->socket.pci_irq = cf->irq;
0231
0232 status = -EINVAL;
0233
0234 prop = of_get_property(np, "card-detect-gpio", NULL);
0235 if (!prop)
0236 goto fail1;
0237 cf->gpio_detect = *prop;
0238
0239 prop = of_get_property(np, "card-vsense-gpio", NULL);
0240 if (!prop)
0241 goto fail1;
0242 cf->gpio_vsense = *prop;
0243
0244 prop = of_get_property(np, "card-3v-gpio", NULL);
0245 if (!prop)
0246 goto fail1;
0247 cf->gpio_3v = *prop;
0248
0249 prop = of_get_property(np, "card-5v-gpio", NULL);
0250 if (!prop)
0251 goto fail1;
0252 cf->gpio_5v = *prop;
0253
0254 cf->socket.io_offset = cf->io_base;
0255
0256
0257 if (!request_mem_region(cf->mem_phys, cf->mem_size, driver_name)) {
0258 status = -ENXIO;
0259 dev_err(device, "Can't claim memory region\n");
0260 goto fail1;
0261 }
0262
0263 if (!request_region(cf->io_base, cf->io_size, driver_name)) {
0264 status = -ENXIO;
0265 dev_err(device, "Can't claim I/O region\n");
0266 goto fail2;
0267 }
0268
0269 cf->socket.owner = THIS_MODULE;
0270 cf->socket.dev.parent = &ofdev->dev;
0271 cf->socket.ops = &electra_cf_ops;
0272 cf->socket.resource_ops = &pccard_static_ops;
0273 cf->socket.features = SS_CAP_PCCARD | SS_CAP_STATIC_MAP |
0274 SS_CAP_MEM_ALIGN;
0275 cf->socket.map_size = 0x800;
0276
0277 status = pcmcia_register_socket(&cf->socket);
0278 if (status < 0) {
0279 dev_err(device, "pcmcia_register_socket failed\n");
0280 goto fail3;
0281 }
0282
0283 dev_info(device, "at mem 0x%lx io 0x%llx irq %d\n",
0284 cf->mem_phys, io.start, cf->irq);
0285
0286 cf->active = 1;
0287 electra_cf_timer(&cf->timer);
0288 return 0;
0289
0290 fail3:
0291 release_region(cf->io_base, cf->io_size);
0292 fail2:
0293 release_mem_region(cf->mem_phys, cf->mem_size);
0294 fail1:
0295 if (cf->irq)
0296 free_irq(cf->irq, cf);
0297
0298 iounmap(cf->gpio_base);
0299 out_unmap_virt:
0300 device_init_wakeup(&ofdev->dev, 0);
0301 iounmap(cf->io_virt);
0302 out_unmap_mem:
0303 iounmap(cf->mem_base);
0304 out_free_cf:
0305 kfree(cf);
0306 return status;
0307
0308 }
0309
0310 static int electra_cf_remove(struct platform_device *ofdev)
0311 {
0312 struct device *device = &ofdev->dev;
0313 struct electra_cf_socket *cf;
0314
0315 cf = dev_get_drvdata(device);
0316
0317 cf->active = 0;
0318 pcmcia_unregister_socket(&cf->socket);
0319 free_irq(cf->irq, cf);
0320 del_timer_sync(&cf->timer);
0321
0322 iounmap(cf->io_virt);
0323 iounmap(cf->mem_base);
0324 iounmap(cf->gpio_base);
0325 release_mem_region(cf->mem_phys, cf->mem_size);
0326 release_region(cf->io_base, cf->io_size);
0327
0328 kfree(cf);
0329
0330 return 0;
0331 }
0332
0333 static const struct of_device_id electra_cf_match[] = {
0334 {
0335 .compatible = "electra-cf",
0336 },
0337 {},
0338 };
0339 MODULE_DEVICE_TABLE(of, electra_cf_match);
0340
0341 static struct platform_driver electra_cf_driver = {
0342 .driver = {
0343 .name = driver_name,
0344 .of_match_table = electra_cf_match,
0345 },
0346 .probe = electra_cf_probe,
0347 .remove = electra_cf_remove,
0348 };
0349
0350 module_platform_driver(electra_cf_driver);
0351
0352 MODULE_LICENSE("GPL");
0353 MODULE_AUTHOR("Olof Johansson <olof@lixom.net>");
0354 MODULE_DESCRIPTION("PA Semi Electra CF driver");