pcmciamtd.c (c1b054d03f5b31c33eaa0b267c629b118eaf3790) pcmciamtd.c (69f34c98c1416eb74c55e38a21dbf3e294966514)
1/*
1/*
2 * $Id: pcmciamtd.c,v 1.51 2004/07/12 22:38:29 dwmw2 Exp $
2 * $Id: pcmciamtd.c,v 1.55 2005/11/07 11:14:28 gleixner Exp $
3 *
4 * pcmciamtd.c - MTD driver for PCMCIA flash memory cards
5 *
6 * Author: Simon Evans <spse@secret.org.uk>
7 *
8 * Copyright (C) 2002 Simon Evans
9 *
10 * Licence: GPL

--- 32 unchanged lines hidden (view full) ---

43#endif
44
45#define err(format, arg...) printk(KERN_ERR "pcmciamtd: " format "\n" , ## arg)
46#define info(format, arg...) printk(KERN_INFO "pcmciamtd: " format "\n" , ## arg)
47#define warn(format, arg...) printk(KERN_WARNING "pcmciamtd: " format "\n" , ## arg)
48
49
50#define DRIVER_DESC "PCMCIA Flash memory card driver"
3 *
4 * pcmciamtd.c - MTD driver for PCMCIA flash memory cards
5 *
6 * Author: Simon Evans <spse@secret.org.uk>
7 *
8 * Copyright (C) 2002 Simon Evans
9 *
10 * Licence: GPL

--- 32 unchanged lines hidden (view full) ---

43#endif
44
45#define err(format, arg...) printk(KERN_ERR "pcmciamtd: " format "\n" , ## arg)
46#define info(format, arg...) printk(KERN_INFO "pcmciamtd: " format "\n" , ## arg)
47#define warn(format, arg...) printk(KERN_WARNING "pcmciamtd: " format "\n" , ## arg)
48
49
50#define DRIVER_DESC "PCMCIA Flash memory card driver"
51#define DRIVER_VERSION "$Revision: 1.51 $"
51#define DRIVER_VERSION "$Revision: 1.55 $"
52
53/* Size of the PCMCIA address space: 26 bits = 64 MB */
54#define MAX_PCMCIA_ADDR 0x4000000
55
56struct pcmciamtd_dev {
57 dev_link_t link; /* PCMCIA link */
58 dev_node_t node; /* device node */
59 caddr_t win_base; /* ioremapped address of PCMCIA window */

--- 111 unchanged lines hidden (view full) ---

171
172 DEBUG(3, "to = %p from = %lu len = %u", to, from, len);
173 while(len) {
174 int toread = win_size - (from & (win_size-1));
175 caddr_t addr;
176
177 if(toread > len)
178 toread = len;
52
53/* Size of the PCMCIA address space: 26 bits = 64 MB */
54#define MAX_PCMCIA_ADDR 0x4000000
55
56struct pcmciamtd_dev {
57 dev_link_t link; /* PCMCIA link */
58 dev_node_t node; /* device node */
59 caddr_t win_base; /* ioremapped address of PCMCIA window */

--- 111 unchanged lines hidden (view full) ---

171
172 DEBUG(3, "to = %p from = %lu len = %u", to, from, len);
173 while(len) {
174 int toread = win_size - (from & (win_size-1));
175 caddr_t addr;
176
177 if(toread > len)
178 toread = len;
179
179
180 addr = remap_window(map, from);
181 if(!addr)
182 return;
183
184 DEBUG(4, "memcpy from %p to %p len = %d", addr, to, toread);
185 memcpy_fromio(to, addr, toread);
186 len -= toread;
187 to += toread;

--- 193 unchanged lines hidden (view full) ---

381 cs_error(link->handle, GetTupleData, rc);
382 break;
383 }
384 rc = pcmcia_parse_tuple(link->handle, &tuple, &parse);
385 if(rc != CS_SUCCESS) {
386 cs_error(link->handle, ParseTuple, rc);
387 break;
388 }
180 addr = remap_window(map, from);
181 if(!addr)
182 return;
183
184 DEBUG(4, "memcpy from %p to %p len = %d", addr, to, toread);
185 memcpy_fromio(to, addr, toread);
186 len -= toread;
187 to += toread;

--- 193 unchanged lines hidden (view full) ---

381 cs_error(link->handle, GetTupleData, rc);
382 break;
383 }
384 rc = pcmcia_parse_tuple(link->handle, &tuple, &parse);
385 if(rc != CS_SUCCESS) {
386 cs_error(link->handle, ParseTuple, rc);
387 break;
388 }
389
389
390 switch(tuple.TupleCode) {
391 case CISTPL_FORMAT: {
392 cistpl_format_t *t = &parse.format;
393 (void)t; /* Shut up, gcc */
394 DEBUG(2, "Format type: %u, Error Detection: %u, offset = %u, length =%u",
395 t->type, t->edc, t->offset, t->length);
396 break;
390 switch(tuple.TupleCode) {
391 case CISTPL_FORMAT: {
392 cistpl_format_t *t = &parse.format;
393 (void)t; /* Shut up, gcc */
394 DEBUG(2, "Format type: %u, Error Detection: %u, offset = %u, length =%u",
395 t->type, t->edc, t->offset, t->length);
396 break;
397
397
398 }
398 }
399
399
400 case CISTPL_DEVICE: {
401 cistpl_device_t *t = &parse.device;
402 int i;
403 DEBUG(2, "Common memory:");
404 dev->pcmcia_map.size = t->dev[0].size;
405 for(i = 0; i < t->ndev; i++) {
406 DEBUG(2, "Region %d, type = %u", i, t->dev[i].type);
407 DEBUG(2, "Region %d, wp = %u", i, t->dev[i].wp);
408 DEBUG(2, "Region %d, speed = %u ns", i, t->dev[i].speed);
409 DEBUG(2, "Region %d, size = %u bytes", i, t->dev[i].size);
410 }
411 break;
412 }
400 case CISTPL_DEVICE: {
401 cistpl_device_t *t = &parse.device;
402 int i;
403 DEBUG(2, "Common memory:");
404 dev->pcmcia_map.size = t->dev[0].size;
405 for(i = 0; i < t->ndev; i++) {
406 DEBUG(2, "Region %d, type = %u", i, t->dev[i].type);
407 DEBUG(2, "Region %d, wp = %u", i, t->dev[i].wp);
408 DEBUG(2, "Region %d, speed = %u ns", i, t->dev[i].speed);
409 DEBUG(2, "Region %d, size = %u bytes", i, t->dev[i].size);
410 }
411 break;
412 }
413
413
414 case CISTPL_VERS_1: {
415 cistpl_vers_1_t *t = &parse.version_1;
416 int i;
417 if(t->ns) {
418 dev->mtd_name[0] = '\0';
419 for(i = 0; i < t->ns; i++) {
420 if(i)
421 strcat(dev->mtd_name, " ");
422 strcat(dev->mtd_name, t->str+t->ofs[i]);
423 }
424 }
425 DEBUG(2, "Found name: %s", dev->mtd_name);
426 break;
427 }
414 case CISTPL_VERS_1: {
415 cistpl_vers_1_t *t = &parse.version_1;
416 int i;
417 if(t->ns) {
418 dev->mtd_name[0] = '\0';
419 for(i = 0; i < t->ns; i++) {
420 if(i)
421 strcat(dev->mtd_name, " ");
422 strcat(dev->mtd_name, t->str+t->ofs[i]);
423 }
424 }
425 DEBUG(2, "Found name: %s", dev->mtd_name);
426 break;
427 }
428
428
429 case CISTPL_JEDEC_C: {
430 cistpl_jedec_t *t = &parse.jedec;
431 int i;
432 for(i = 0; i < t->nid; i++) {
433 DEBUG(2, "JEDEC: 0x%02x 0x%02x", t->id[i].mfr, t->id[i].info);
434 }
435 break;
436 }
429 case CISTPL_JEDEC_C: {
430 cistpl_jedec_t *t = &parse.jedec;
431 int i;
432 for(i = 0; i < t->nid; i++) {
433 DEBUG(2, "JEDEC: 0x%02x 0x%02x", t->id[i].mfr, t->id[i].info);
434 }
435 break;
436 }
437
437
438 case CISTPL_DEVICE_GEO: {
439 cistpl_device_geo_t *t = &parse.device_geo;
440 int i;
441 dev->pcmcia_map.bankwidth = t->geo[0].buswidth;
442 for(i = 0; i < t->ngeo; i++) {
443 DEBUG(2, "region: %d bankwidth = %u", i, t->geo[i].buswidth);
444 DEBUG(2, "region: %d erase_block = %u", i, t->geo[i].erase_block);
445 DEBUG(2, "region: %d read_block = %u", i, t->geo[i].read_block);
446 DEBUG(2, "region: %d write_block = %u", i, t->geo[i].write_block);
447 DEBUG(2, "region: %d partition = %u", i, t->geo[i].partition);
448 DEBUG(2, "region: %d interleave = %u", i, t->geo[i].interleave);
449 }
450 break;
451 }
438 case CISTPL_DEVICE_GEO: {
439 cistpl_device_geo_t *t = &parse.device_geo;
440 int i;
441 dev->pcmcia_map.bankwidth = t->geo[0].buswidth;
442 for(i = 0; i < t->ngeo; i++) {
443 DEBUG(2, "region: %d bankwidth = %u", i, t->geo[i].buswidth);
444 DEBUG(2, "region: %d erase_block = %u", i, t->geo[i].erase_block);
445 DEBUG(2, "region: %d read_block = %u", i, t->geo[i].read_block);
446 DEBUG(2, "region: %d write_block = %u", i, t->geo[i].write_block);
447 DEBUG(2, "region: %d partition = %u", i, t->geo[i].partition);
448 DEBUG(2, "region: %d interleave = %u", i, t->geo[i].interleave);
449 }
450 break;
451 }
452
452
453 default:
454 DEBUG(2, "Unknown tuple code %d", tuple.TupleCode);
455 }
453 default:
454 DEBUG(2, "Unknown tuple code %d", tuple.TupleCode);
455 }
456
456
457 rc = pcmcia_get_next_tuple(link->handle, &tuple);
458 }
459 if(!dev->pcmcia_map.size)
460 dev->pcmcia_map.size = MAX_PCMCIA_ADDR;
461
462 if(!dev->pcmcia_map.bankwidth)
463 dev->pcmcia_map.bankwidth = 2;
464
465 if(force_size) {
466 dev->pcmcia_map.size = force_size << 20;
467 DEBUG(2, "size forced to %dM", force_size);
468 }
469
470 if(bankwidth) {
471 dev->pcmcia_map.bankwidth = bankwidth;
472 DEBUG(2, "bankwidth forced to %d", bankwidth);
457 rc = pcmcia_get_next_tuple(link->handle, &tuple);
458 }
459 if(!dev->pcmcia_map.size)
460 dev->pcmcia_map.size = MAX_PCMCIA_ADDR;
461
462 if(!dev->pcmcia_map.bankwidth)
463 dev->pcmcia_map.bankwidth = 2;
464
465 if(force_size) {
466 dev->pcmcia_map.size = force_size << 20;
467 DEBUG(2, "size forced to %dM", force_size);
468 }
469
470 if(bankwidth) {
471 dev->pcmcia_map.bankwidth = bankwidth;
472 DEBUG(2, "bankwidth forced to %d", bankwidth);
473 }
473 }
474
475 dev->pcmcia_map.name = dev->mtd_name;
476 if(!dev->mtd_name[0]) {
477 strcpy(dev->mtd_name, "PCMCIA Memory card");
478 *new_name = 1;
479 }
480
481 DEBUG(1, "Device: Size: %lu Width:%d Name: %s",

--- 81 unchanged lines hidden (view full) ---

563 DEBUG(2, "dev->win_size = %d", dev->win_size);
564
565 if(!dev->win_size) {
566 err("Cant allocate memory window");
567 pcmciamtd_release(link);
568 return;
569 }
570 DEBUG(1, "Allocated a window of %dKiB", dev->win_size >> 10);
474
475 dev->pcmcia_map.name = dev->mtd_name;
476 if(!dev->mtd_name[0]) {
477 strcpy(dev->mtd_name, "PCMCIA Memory card");
478 *new_name = 1;
479 }
480
481 DEBUG(1, "Device: Size: %lu Width:%d Name: %s",

--- 81 unchanged lines hidden (view full) ---

563 DEBUG(2, "dev->win_size = %d", dev->win_size);
564
565 if(!dev->win_size) {
566 err("Cant allocate memory window");
567 pcmciamtd_release(link);
568 return;
569 }
570 DEBUG(1, "Allocated a window of %dKiB", dev->win_size >> 10);
571
571
572 /* Get write protect status */
573 CS_CHECK(GetStatus, pcmcia_get_status(link->handle, &status));
574 DEBUG(2, "status value: 0x%x window handle = 0x%8.8lx",
575 status.CardState, (unsigned long)link->win);
576 dev->win_base = ioremap(req.Base, req.Size);
577 if(!dev->win_base) {
578 err("ioremap(%lu, %u) failed", req.Base, req.Size);
579 pcmciamtd_release(link);

--- 39 unchanged lines hidden (view full) ---

619 } else if(mem_type == 2) {
620 mtd = do_map_probe("map_rom", &dev->pcmcia_map);
621 } else {
622 for(i = 0; i < sizeof(probes) / sizeof(char *); i++) {
623 DEBUG(1, "Trying %s", probes[i]);
624 mtd = do_map_probe(probes[i], &dev->pcmcia_map);
625 if(mtd)
626 break;
572 /* Get write protect status */
573 CS_CHECK(GetStatus, pcmcia_get_status(link->handle, &status));
574 DEBUG(2, "status value: 0x%x window handle = 0x%8.8lx",
575 status.CardState, (unsigned long)link->win);
576 dev->win_base = ioremap(req.Base, req.Size);
577 if(!dev->win_base) {
578 err("ioremap(%lu, %u) failed", req.Base, req.Size);
579 pcmciamtd_release(link);

--- 39 unchanged lines hidden (view full) ---

619 } else if(mem_type == 2) {
620 mtd = do_map_probe("map_rom", &dev->pcmcia_map);
621 } else {
622 for(i = 0; i < sizeof(probes) / sizeof(char *); i++) {
623 DEBUG(1, "Trying %s", probes[i]);
624 mtd = do_map_probe(probes[i], &dev->pcmcia_map);
625 if(mtd)
626 break;
627
627
628 DEBUG(1, "FAILED: %s", probes[i]);
629 }
630 }
628 DEBUG(1, "FAILED: %s", probes[i]);
629 }
630 }
631
631
632 if(!mtd) {
633 DEBUG(1, "Cant find an MTD");
634 pcmciamtd_release(link);
635 return;
636 }
637
638 dev->mtd_info = mtd;
639 mtd->owner = THIS_MODULE;

--- 243 unchanged lines hidden ---
632 if(!mtd) {
633 DEBUG(1, "Cant find an MTD");
634 pcmciamtd_release(link);
635 return;
636 }
637
638 dev->mtd_info = mtd;
639 mtd->owner = THIS_MODULE;

--- 243 unchanged lines hidden ---