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 --- |