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