pcmciamtd.c (e199e6136ce6b151e6638ae93dca60748424d900) | pcmciamtd.c (cdb138080b78146d1cdadba9f5dadbeb97445b91) |
---|---|
1/* 2 * pcmciamtd.c - MTD driver for PCMCIA flash memory cards 3 * 4 * Author: Simon Evans <spse@secret.org.uk> 5 * 6 * Copyright (C) 2002 Simon Evans 7 * 8 * Licence: GPL --- 87 unchanged lines hidden (view full) --- 96 97 98/* read/write{8,16} copy_{from,to} routines with window remapping 99 * to access whole card 100 */ 101static caddr_t remap_window(struct map_info *map, unsigned long to) 102{ 103 struct pcmciamtd_dev *dev = (struct pcmciamtd_dev *)map->map_priv_1; | 1/* 2 * pcmciamtd.c - MTD driver for PCMCIA flash memory cards 3 * 4 * Author: Simon Evans <spse@secret.org.uk> 5 * 6 * Copyright (C) 2002 Simon Evans 7 * 8 * Licence: GPL --- 87 unchanged lines hidden (view full) --- 96 97 98/* read/write{8,16} copy_{from,to} routines with window remapping 99 * to access whole card 100 */ 101static caddr_t remap_window(struct map_info *map, unsigned long to) 102{ 103 struct pcmciamtd_dev *dev = (struct pcmciamtd_dev *)map->map_priv_1; |
104 window_handle_t win = (window_handle_t)map->map_priv_2; | 104 struct resource *win = (struct resource *) map->map_priv_2; |
105 unsigned int offset; 106 int ret; 107 108 if (!pcmcia_dev_present(dev->p_dev)) { 109 DEBUG(1, "device removed"); 110 return 0; 111 } 112 --- 221 unchanged lines hidden (view full) --- 334 */ 335 336static void pcmciamtd_release(struct pcmcia_device *link) 337{ 338 struct pcmciamtd_dev *dev = link->priv; 339 340 DEBUG(3, "link = 0x%p", link); 341 | 105 unsigned int offset; 106 int ret; 107 108 if (!pcmcia_dev_present(dev->p_dev)) { 109 DEBUG(1, "device removed"); 110 return 0; 111 } 112 --- 221 unchanged lines hidden (view full) --- 334 */ 335 336static void pcmciamtd_release(struct pcmcia_device *link) 337{ 338 struct pcmciamtd_dev *dev = link->priv; 339 340 DEBUG(3, "link = 0x%p", link); 341 |
342 if (link->win) { | 342 if (link->resource[2]->end) { |
343 if(dev->win_base) { 344 iounmap(dev->win_base); 345 dev->win_base = NULL; 346 } 347 } 348 pcmcia_disable_device(link); 349} 350 --- 135 unchanged lines hidden (view full) --- 486 * is received, to configure the PCMCIA socket, and to make the 487 * MTD device available to the system. 488 */ 489 490static int pcmciamtd_config(struct pcmcia_device *link) 491{ 492 struct pcmciamtd_dev *dev = link->priv; 493 struct mtd_info *mtd = NULL; | 343 if(dev->win_base) { 344 iounmap(dev->win_base); 345 dev->win_base = NULL; 346 } 347 } 348 pcmcia_disable_device(link); 349} 350 --- 135 unchanged lines hidden (view full) --- 486 * is received, to configure the PCMCIA socket, and to make the 487 * MTD device available to the system. 488 */ 489 490static int pcmciamtd_config(struct pcmcia_device *link) 491{ 492 struct pcmciamtd_dev *dev = link->priv; 493 struct mtd_info *mtd = NULL; |
494 win_req_t req; | |
495 int ret; | 494 int ret; |
496 int i; | 495 int i, j = 0; |
497 static char *probes[] = { "jedec_probe", "cfi_probe" }; 498 int new_name = 0; 499 500 DEBUG(3, "link=0x%p", link); 501 502 card_settings(dev, link, &new_name); 503 504 dev->pcmcia_map.phys = NO_XIP; --- 10 unchanged lines hidden (view full) --- 515 dev->pcmcia_map.set_vpp = pcmciamtd_set_vpp; 516 517 /* Request a memory window for PCMCIA. Some architeures can map windows 518 * upto the maximum that PCMCIA can support (64MiB) - this is ideal and 519 * we aim for a window the size of the whole card - otherwise we try 520 * smaller windows until we succeed 521 */ 522 | 496 static char *probes[] = { "jedec_probe", "cfi_probe" }; 497 int new_name = 0; 498 499 DEBUG(3, "link=0x%p", link); 500 501 card_settings(dev, link, &new_name); 502 503 dev->pcmcia_map.phys = NO_XIP; --- 10 unchanged lines hidden (view full) --- 514 dev->pcmcia_map.set_vpp = pcmciamtd_set_vpp; 515 516 /* Request a memory window for PCMCIA. Some architeures can map windows 517 * upto the maximum that PCMCIA can support (64MiB) - this is ideal and 518 * we aim for a window the size of the whole card - otherwise we try 519 * smaller windows until we succeed 520 */ 521 |
523 req.Attributes = WIN_MEMORY_TYPE_CM | WIN_ENABLE; 524 req.Attributes |= (dev->pcmcia_map.bankwidth == 1) ? WIN_DATA_WIDTH_8 : WIN_DATA_WIDTH_16; 525 req.Base = 0; 526 req.AccessSpeed = mem_speed; 527 link->win = (window_handle_t)link; 528 req.Size = (force_size) ? force_size << 20 : MAX_PCMCIA_ADDR; | 522 link->resource[2]->flags |= WIN_MEMORY_TYPE_CM | WIN_ENABLE; 523 link->resource[2]->flags |= (dev->pcmcia_map.bankwidth == 1) ? 524 WIN_DATA_WIDTH_8 : WIN_DATA_WIDTH_16; 525 link->resource[2]->start = 0; 526 link->resource[2]->end = (force_size) ? force_size << 20 : 527 MAX_PCMCIA_ADDR; |
529 dev->win_size = 0; 530 531 do { 532 int ret; | 528 dev->win_size = 0; 529 530 do { 531 int ret; |
533 DEBUG(2, "requesting window with size = %dKiB memspeed = %d", 534 req.Size >> 10, req.AccessSpeed); 535 ret = pcmcia_request_window(link, &req, &link->win); | 532 DEBUG(2, "requesting window with size = %luKiB memspeed = %d", 533 (unsigned long) resource_size(link->resource[2]) >> 10, 534 mem_speed); 535 ret = pcmcia_request_window(link, link->resource[2], mem_speed); |
536 DEBUG(2, "ret = %d dev->win_size = %d", ret, dev->win_size); 537 if(ret) { | 536 DEBUG(2, "ret = %d dev->win_size = %d", ret, dev->win_size); 537 if(ret) { |
538 req.Size >>= 1; | 538 j++; 539 link->resource[2]->start = 0; 540 link->resource[2]->end = (force_size) ? 541 force_size << 20 : MAX_PCMCIA_ADDR; 542 link->resource[2]->end >>= j; |
539 } else { | 543 } else { |
540 DEBUG(2, "Got window of size %dKiB", req.Size >> 10); 541 dev->win_size = req.Size; | 544 DEBUG(2, "Got window of size %luKiB", (unsigned long) 545 resource_size(link->resource[2]) >> 10); 546 dev->win_size = resource_size(link->resource[2]); |
542 break; 543 } | 547 break; 548 } |
544 } while(req.Size >= 0x1000); | 549 } while (link->resource[2]->end >= 0x1000); |
545 546 DEBUG(2, "dev->win_size = %d", dev->win_size); 547 548 if(!dev->win_size) { 549 dev_err(&dev->p_dev->dev, "Cannot allocate memory window\n"); 550 pcmciamtd_release(link); 551 return -ENODEV; 552 } 553 DEBUG(1, "Allocated a window of %dKiB", dev->win_size >> 10); 554 555 /* Get write protect status */ | 550 551 DEBUG(2, "dev->win_size = %d", dev->win_size); 552 553 if(!dev->win_size) { 554 dev_err(&dev->p_dev->dev, "Cannot allocate memory window\n"); 555 pcmciamtd_release(link); 556 return -ENODEV; 557 } 558 DEBUG(1, "Allocated a window of %dKiB", dev->win_size >> 10); 559 560 /* Get write protect status */ |
556 DEBUG(2, "window handle = 0x%8.8lx", (unsigned long)link->win); 557 dev->win_base = ioremap(req.Base, req.Size); | 561 dev->win_base = ioremap(link->resource[2]->start, 562 resource_size(link->resource[2])); |
558 if(!dev->win_base) { | 563 if(!dev->win_base) { |
559 dev_err(&dev->p_dev->dev, "ioremap(%lu, %u) failed\n", 560 req.Base, req.Size); | 564 dev_err(&dev->p_dev->dev, "ioremap(%pR) failed\n", 565 link->resource[2]); |
561 pcmciamtd_release(link); 562 return -ENODEV; 563 } | 566 pcmciamtd_release(link); 567 return -ENODEV; 568 } |
564 DEBUG(1, "mapped window dev = %p req.base = 0x%lx base = %p size = 0x%x", 565 dev, req.Base, dev->win_base, req.Size); | 569 DEBUG(1, "mapped window dev = %p @ %pR, base = %p", 570 dev, link->resource[2], dev->win_base); |
566 567 dev->offset = 0; 568 dev->pcmcia_map.map_priv_1 = (unsigned long)dev; | 571 572 dev->offset = 0; 573 dev->pcmcia_map.map_priv_1 = (unsigned long)dev; |
569 dev->pcmcia_map.map_priv_2 = (unsigned long)link->win; | 574 dev->pcmcia_map.map_priv_2 = (unsigned long)link->resource[2]; |
570 571 dev->vpp = (vpp) ? vpp : link->socket->socket.Vpp; 572 link->conf.Attributes = 0; 573 if(setvpp == 2) { 574 link->conf.Vpp = dev->vpp; 575 } else { 576 link->conf.Vpp = 0; 577 } --- 222 unchanged lines hidden --- | 575 576 dev->vpp = (vpp) ? vpp : link->socket->socket.Vpp; 577 link->conf.Attributes = 0; 578 if(setvpp == 2) { 579 link->conf.Vpp = dev->vpp; 580 } else { 581 link->conf.Vpp = 0; 582 } --- 222 unchanged lines hidden --- |