1 /* 2 * Copyright (C) 2007 PA Semi, Inc 3 * 4 * Maintained by: Olof Johansson <olof@lixom.net> 5 * 6 * Based on drivers/pcmcia/omap_cf.c 7 * 8 * This program is free software; you can redistribute it and/or modify 9 * it under the terms of the GNU General Public License as published by 10 * the Free Software Foundation; either version 2 of the License, or 11 * (at your option) any later version. 12 * 13 * This program is distributed in the hope that it will be useful, 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 * GNU General Public License for more details. 17 * 18 * You should have received a copy of the GNU General Public License 19 * along with this program; if not, write to the Free Software 20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 21 */ 22 23 #include <linux/module.h> 24 #include <linux/kernel.h> 25 #include <linux/sched.h> 26 #include <linux/platform_device.h> 27 #include <linux/errno.h> 28 #include <linux/init.h> 29 #include <linux/delay.h> 30 #include <linux/interrupt.h> 31 #include <linux/mm.h> 32 #include <linux/vmalloc.h> 33 #include <linux/of_platform.h> 34 #include <linux/slab.h> 35 36 #include <pcmcia/ss.h> 37 38 static const char driver_name[] = "electra-cf"; 39 40 struct electra_cf_socket { 41 struct pcmcia_socket socket; 42 43 struct timer_list timer; 44 unsigned present:1; 45 unsigned active:1; 46 47 struct platform_device *ofdev; 48 unsigned long mem_phys; 49 void __iomem * mem_base; 50 unsigned long mem_size; 51 void __iomem * io_virt; 52 unsigned int io_base; 53 unsigned int io_size; 54 u_int irq; 55 struct resource iomem; 56 void __iomem * gpio_base; 57 int gpio_detect; 58 int gpio_vsense; 59 int gpio_3v; 60 int gpio_5v; 61 }; 62 63 #define POLL_INTERVAL (2 * HZ) 64 65 66 static int electra_cf_present(struct electra_cf_socket *cf) 67 { 68 unsigned int gpio; 69 70 gpio = in_le32(cf->gpio_base+0x40); 71 return !(gpio & (1 << cf->gpio_detect)); 72 } 73 74 static int electra_cf_ss_init(struct pcmcia_socket *s) 75 { 76 return 0; 77 } 78 79 /* the timer is primarily to kick this socket's pccardd */ 80 static void electra_cf_timer(unsigned long _cf) 81 { 82 struct electra_cf_socket *cf = (void *) _cf; 83 int present = electra_cf_present(cf); 84 85 if (present != cf->present) { 86 cf->present = present; 87 pcmcia_parse_events(&cf->socket, SS_DETECT); 88 } 89 90 if (cf->active) 91 mod_timer(&cf->timer, jiffies + POLL_INTERVAL); 92 } 93 94 static irqreturn_t electra_cf_irq(int irq, void *_cf) 95 { 96 electra_cf_timer((unsigned long)_cf); 97 return IRQ_HANDLED; 98 } 99 100 static int electra_cf_get_status(struct pcmcia_socket *s, u_int *sp) 101 { 102 struct electra_cf_socket *cf; 103 104 if (!sp) 105 return -EINVAL; 106 107 cf = container_of(s, struct electra_cf_socket, socket); 108 109 /* NOTE CF is always 3VCARD */ 110 if (electra_cf_present(cf)) { 111 *sp = SS_READY | SS_DETECT | SS_POWERON | SS_3VCARD; 112 113 s->pci_irq = cf->irq; 114 } else 115 *sp = 0; 116 return 0; 117 } 118 119 static int electra_cf_set_socket(struct pcmcia_socket *sock, 120 struct socket_state_t *s) 121 { 122 unsigned int gpio; 123 unsigned int vcc; 124 struct electra_cf_socket *cf; 125 126 cf = container_of(sock, struct electra_cf_socket, socket); 127 128 /* "reset" means no power in our case */ 129 vcc = (s->flags & SS_RESET) ? 0 : s->Vcc; 130 131 switch (vcc) { 132 case 0: 133 gpio = 0; 134 break; 135 case 33: 136 gpio = (1 << cf->gpio_3v); 137 break; 138 case 5: 139 gpio = (1 << cf->gpio_5v); 140 break; 141 default: 142 return -EINVAL; 143 } 144 145 gpio |= 1 << (cf->gpio_3v + 16); /* enwr */ 146 gpio |= 1 << (cf->gpio_5v + 16); /* enwr */ 147 out_le32(cf->gpio_base+0x90, gpio); 148 149 pr_debug("%s: Vcc %d, io_irq %d, flags %04x csc %04x\n", 150 driver_name, s->Vcc, s->io_irq, s->flags, s->csc_mask); 151 152 return 0; 153 } 154 155 static int electra_cf_set_io_map(struct pcmcia_socket *s, 156 struct pccard_io_map *io) 157 { 158 return 0; 159 } 160 161 static int electra_cf_set_mem_map(struct pcmcia_socket *s, 162 struct pccard_mem_map *map) 163 { 164 struct electra_cf_socket *cf; 165 166 if (map->card_start) 167 return -EINVAL; 168 cf = container_of(s, struct electra_cf_socket, socket); 169 map->static_start = cf->mem_phys; 170 map->flags &= MAP_ACTIVE|MAP_ATTRIB; 171 if (!(map->flags & MAP_ATTRIB)) 172 map->static_start += 0x800; 173 return 0; 174 } 175 176 static struct pccard_operations electra_cf_ops = { 177 .init = electra_cf_ss_init, 178 .get_status = electra_cf_get_status, 179 .set_socket = electra_cf_set_socket, 180 .set_io_map = electra_cf_set_io_map, 181 .set_mem_map = electra_cf_set_mem_map, 182 }; 183 184 static int __devinit electra_cf_probe(struct platform_device *ofdev) 185 { 186 struct device *device = &ofdev->dev; 187 struct device_node *np = ofdev->dev.of_node; 188 struct electra_cf_socket *cf; 189 struct resource mem, io; 190 int status; 191 const unsigned int *prop; 192 int err; 193 struct vm_struct *area; 194 195 err = of_address_to_resource(np, 0, &mem); 196 if (err) 197 return -EINVAL; 198 199 err = of_address_to_resource(np, 1, &io); 200 if (err) 201 return -EINVAL; 202 203 cf = kzalloc(sizeof *cf, GFP_KERNEL); 204 if (!cf) 205 return -ENOMEM; 206 207 setup_timer(&cf->timer, electra_cf_timer, (unsigned long)cf); 208 cf->irq = NO_IRQ; 209 210 cf->ofdev = ofdev; 211 cf->mem_phys = mem.start; 212 cf->mem_size = PAGE_ALIGN(mem.end - mem.start); 213 cf->mem_base = ioremap(cf->mem_phys, cf->mem_size); 214 cf->io_size = PAGE_ALIGN(io.end - io.start); 215 216 area = __get_vm_area(cf->io_size, 0, PHB_IO_BASE, PHB_IO_END); 217 if (area == NULL) 218 return -ENOMEM; 219 220 cf->io_virt = (void __iomem *)(area->addr); 221 222 cf->gpio_base = ioremap(0xfc103000, 0x1000); 223 dev_set_drvdata(device, cf); 224 225 if (!cf->mem_base || !cf->io_virt || !cf->gpio_base || 226 (__ioremap_at(io.start, cf->io_virt, cf->io_size, 227 _PAGE_NO_CACHE | _PAGE_GUARDED) == NULL)) { 228 dev_err(device, "can't ioremap ranges\n"); 229 status = -ENOMEM; 230 goto fail1; 231 } 232 233 234 cf->io_base = (unsigned long)cf->io_virt - VMALLOC_END; 235 236 cf->iomem.start = (unsigned long)cf->mem_base; 237 cf->iomem.end = (unsigned long)cf->mem_base + (mem.end - mem.start); 238 cf->iomem.flags = IORESOURCE_MEM; 239 240 cf->irq = irq_of_parse_and_map(np, 0); 241 242 status = request_irq(cf->irq, electra_cf_irq, IRQF_SHARED, 243 driver_name, cf); 244 if (status < 0) { 245 dev_err(device, "request_irq failed\n"); 246 goto fail1; 247 } 248 249 cf->socket.pci_irq = cf->irq; 250 251 prop = of_get_property(np, "card-detect-gpio", NULL); 252 if (!prop) 253 goto fail1; 254 cf->gpio_detect = *prop; 255 256 prop = of_get_property(np, "card-vsense-gpio", NULL); 257 if (!prop) 258 goto fail1; 259 cf->gpio_vsense = *prop; 260 261 prop = of_get_property(np, "card-3v-gpio", NULL); 262 if (!prop) 263 goto fail1; 264 cf->gpio_3v = *prop; 265 266 prop = of_get_property(np, "card-5v-gpio", NULL); 267 if (!prop) 268 goto fail1; 269 cf->gpio_5v = *prop; 270 271 cf->socket.io_offset = cf->io_base; 272 273 /* reserve chip-select regions */ 274 if (!request_mem_region(cf->mem_phys, cf->mem_size, driver_name)) { 275 status = -ENXIO; 276 dev_err(device, "Can't claim memory region\n"); 277 goto fail1; 278 } 279 280 if (!request_region(cf->io_base, cf->io_size, driver_name)) { 281 status = -ENXIO; 282 dev_err(device, "Can't claim I/O region\n"); 283 goto fail2; 284 } 285 286 cf->socket.owner = THIS_MODULE; 287 cf->socket.dev.parent = &ofdev->dev; 288 cf->socket.ops = &electra_cf_ops; 289 cf->socket.resource_ops = &pccard_static_ops; 290 cf->socket.features = SS_CAP_PCCARD | SS_CAP_STATIC_MAP | 291 SS_CAP_MEM_ALIGN; 292 cf->socket.map_size = 0x800; 293 294 status = pcmcia_register_socket(&cf->socket); 295 if (status < 0) { 296 dev_err(device, "pcmcia_register_socket failed\n"); 297 goto fail3; 298 } 299 300 dev_info(device, "at mem 0x%lx io 0x%llx irq %d\n", 301 cf->mem_phys, io.start, cf->irq); 302 303 cf->active = 1; 304 electra_cf_timer((unsigned long)cf); 305 return 0; 306 307 fail3: 308 release_region(cf->io_base, cf->io_size); 309 fail2: 310 release_mem_region(cf->mem_phys, cf->mem_size); 311 fail1: 312 if (cf->irq != NO_IRQ) 313 free_irq(cf->irq, cf); 314 315 if (cf->io_virt) 316 __iounmap_at(cf->io_virt, cf->io_size); 317 if (cf->mem_base) 318 iounmap(cf->mem_base); 319 if (cf->gpio_base) 320 iounmap(cf->gpio_base); 321 device_init_wakeup(&ofdev->dev, 0); 322 kfree(cf); 323 return status; 324 325 } 326 327 static int __devexit electra_cf_remove(struct platform_device *ofdev) 328 { 329 struct device *device = &ofdev->dev; 330 struct electra_cf_socket *cf; 331 332 cf = dev_get_drvdata(device); 333 334 cf->active = 0; 335 pcmcia_unregister_socket(&cf->socket); 336 free_irq(cf->irq, cf); 337 del_timer_sync(&cf->timer); 338 339 __iounmap_at(cf->io_virt, cf->io_size); 340 iounmap(cf->mem_base); 341 iounmap(cf->gpio_base); 342 release_mem_region(cf->mem_phys, cf->mem_size); 343 release_region(cf->io_base, cf->io_size); 344 345 kfree(cf); 346 347 return 0; 348 } 349 350 static const struct of_device_id electra_cf_match[] = { 351 { 352 .compatible = "electra-cf", 353 }, 354 {}, 355 }; 356 MODULE_DEVICE_TABLE(of, electra_cf_match); 357 358 static struct platform_driver electra_cf_driver = { 359 .driver = { 360 .name = (char *)driver_name, 361 .owner = THIS_MODULE, 362 .of_match_table = electra_cf_match, 363 }, 364 .probe = electra_cf_probe, 365 .remove = electra_cf_remove, 366 }; 367 368 static int __init electra_cf_init(void) 369 { 370 return platform_driver_register(&electra_cf_driver); 371 } 372 module_init(electra_cf_init); 373 374 static void __exit electra_cf_exit(void) 375 { 376 platform_driver_unregister(&electra_cf_driver); 377 } 378 module_exit(electra_cf_exit); 379 380 MODULE_LICENSE("GPL"); 381 MODULE_AUTHOR ("Olof Johansson <olof@lixom.net>"); 382 MODULE_DESCRIPTION("PA Semi Electra CF driver"); 383