Lines Matching +full:d +full:- +full:link

2  * pcmciamtd.c - MTD driver for PCMCIA flash memory cards
45 /* 2 = do 16-bit transfers, 1 = do 8-bit transfers */
71 MODULE_PARM_DESC(force_size, "Force size of card in MiB (1-64)");
85 struct pcmciamtd_dev *dev = (struct pcmciamtd_dev *)map->map_priv_1; in remap_window()
86 struct resource *win = (struct resource *) map->map_priv_2; in remap_window()
90 if (!pcmcia_dev_present(dev->p_dev)) { in remap_window()
95 offset = to & ~(dev->win_size-1); in remap_window()
96 if (offset != dev->offset) { in remap_window()
98 dev->offset, offset); in remap_window()
99 ret = pcmcia_map_mem_page(dev->p_dev, win, offset); in remap_window()
102 dev->offset = offset; in remap_window()
104 return dev->win_base + (to & (dev->win_size-1)); in remap_window()
111 map_word d = {{0}}; in pcmcia_read8_remap() local
115 return d; in pcmcia_read8_remap()
117 d.x[0] = readb(addr); in pcmcia_read8_remap()
118 pr_debug("ofs = 0x%08lx (%p) data = 0x%02lx\n", ofs, addr, d.x[0]); in pcmcia_read8_remap()
119 return d; in pcmcia_read8_remap()
126 map_word d = {{0}}; in pcmcia_read16_remap() local
130 return d; in pcmcia_read16_remap()
132 d.x[0] = readw(addr); in pcmcia_read16_remap()
133 pr_debug("ofs = 0x%08lx (%p) data = 0x%04lx\n", ofs, addr, d.x[0]); in pcmcia_read16_remap()
134 return d; in pcmcia_read16_remap()
140 struct pcmciamtd_dev *dev = (struct pcmciamtd_dev *)map->map_priv_1; in pcmcia_copy_from_remap()
141 unsigned long win_size = dev->win_size; in pcmcia_copy_from_remap()
145 int toread = win_size - (from & (win_size-1)); in pcmcia_copy_from_remap()
155 pr_debug("memcpy from %p to %p len = %d\n", addr, to, toread); in pcmcia_copy_from_remap()
157 len -= toread; in pcmcia_copy_from_remap()
164 static void pcmcia_write8_remap(struct map_info *map, map_word d, unsigned long adr) in pcmcia_write8_remap() argument
171 pr_debug("adr = 0x%08lx (%p) data = 0x%02lx\n", adr, addr, d.x[0]); in pcmcia_write8_remap()
172 writeb(d.x[0], addr); in pcmcia_write8_remap()
176 static void pcmcia_write16_remap(struct map_info *map, map_word d, unsigned long adr) in pcmcia_write16_remap() argument
182 pr_debug("adr = 0x%08lx (%p) data = 0x%04lx\n", adr, addr, d.x[0]); in pcmcia_write16_remap()
183 writew(d.x[0], addr); in pcmcia_write16_remap()
189 struct pcmciamtd_dev *dev = (struct pcmciamtd_dev *)map->map_priv_1; in pcmcia_copy_to_remap()
190 unsigned long win_size = dev->win_size; in pcmcia_copy_to_remap()
194 int towrite = win_size - (to & (win_size-1)); in pcmcia_copy_to_remap()
204 pr_debug("memcpy from %p to %p len = %d\n", from, addr, towrite); in pcmcia_copy_to_remap()
206 len -= towrite; in pcmcia_copy_to_remap()
215 #define DEV_REMOVED(x) (!(pcmcia_dev_present(((struct pcmciamtd_dev *)map->map_priv_1)->p_dev)))
219 void __iomem *win_base = (void __iomem *)map->map_priv_2; in pcmcia_read8()
220 map_word d = {{0}}; in pcmcia_read8() local
223 return d; in pcmcia_read8()
225 d.x[0] = readb(win_base + ofs); in pcmcia_read8()
227 ofs, win_base + ofs, d.x[0]); in pcmcia_read8()
228 return d; in pcmcia_read8()
234 void __iomem *win_base = (void __iomem *)map->map_priv_2; in pcmcia_read16()
235 map_word d = {{0}}; in pcmcia_read16() local
238 return d; in pcmcia_read16()
240 d.x[0] = readw(win_base + ofs); in pcmcia_read16()
242 ofs, win_base + ofs, d.x[0]); in pcmcia_read16()
243 return d; in pcmcia_read16()
249 void __iomem *win_base = (void __iomem *)map->map_priv_2; in pcmcia_copy_from()
259 static void pcmcia_write8(struct map_info *map, map_word d, unsigned long adr) in pcmcia_write8() argument
261 void __iomem *win_base = (void __iomem *)map->map_priv_2; in pcmcia_write8()
267 adr, win_base + adr, d.x[0]); in pcmcia_write8()
268 writeb(d.x[0], win_base + adr); in pcmcia_write8()
272 static void pcmcia_write16(struct map_info *map, map_word d, unsigned long adr) in pcmcia_write16() argument
274 void __iomem *win_base = (void __iomem *)map->map_priv_2; in pcmcia_write16()
280 adr, win_base + adr, d.x[0]); in pcmcia_write16()
281 writew(d.x[0], win_base + adr); in pcmcia_write16()
287 void __iomem *win_base = (void __iomem *)map->map_priv_2; in pcmcia_copy_to()
301 struct pcmciamtd_dev *dev = (struct pcmciamtd_dev *)map->map_priv_1; in pcmciamtd_set_vpp()
302 struct pcmcia_device *link = dev->p_dev; in pcmciamtd_set_vpp() local
304 pr_debug("dev = %p on = %d vpp = %d\n\n", dev, on, dev->vpp); in pcmciamtd_set_vpp()
308 pcmcia_fixup_vpp(link, dev->vpp); in pcmciamtd_set_vpp()
310 if (--pcmcia_vpp_refcnt == 0) /* last nested 'off' */ in pcmciamtd_set_vpp()
311 pcmcia_fixup_vpp(link, 0); in pcmciamtd_set_vpp()
317 static void pcmciamtd_release(struct pcmcia_device *link) in pcmciamtd_release() argument
319 struct pcmciamtd_dev *dev = link->priv; in pcmciamtd_release()
321 pr_debug("link = 0x%p\n", link); in pcmciamtd_release()
323 if (link->resource[2]->end) { in pcmciamtd_release()
324 if(dev->win_base) { in pcmciamtd_release()
325 iounmap(dev->win_base); in pcmciamtd_release()
326 dev->win_base = NULL; in pcmciamtd_release()
329 pcmcia_disable_device(link); in pcmciamtd_release()
343 t->type, t->edc, t->offset, t->length); in pcmciamtd_cistpl_format()
345 return -ENOSPC; in pcmciamtd_cistpl_format()
357 for (i = 0; i < t->nid; i++) in pcmciamtd_cistpl_jedec()
359 t->id[i].mfr, t->id[i].info); in pcmciamtd_cistpl_jedec()
361 return -ENOSPC; in pcmciamtd_cistpl_jedec()
374 return -EINVAL; in pcmciamtd_cistpl_device()
377 dev->pcmcia_map.size = t->dev[0].size; in pcmciamtd_cistpl_device()
379 for (i = 0; i < t->ndev; i++) { in pcmciamtd_cistpl_device()
380 pr_debug("Region %d, type = %u\n", i, t->dev[i].type); in pcmciamtd_cistpl_device()
381 pr_debug("Region %d, wp = %u\n", i, t->dev[i].wp); in pcmciamtd_cistpl_device()
382 pr_debug("Region %d, speed = %u ns\n", i, t->dev[i].speed); in pcmciamtd_cistpl_device()
383 pr_debug("Region %d, size = %u bytes\n", i, t->dev[i].size); in pcmciamtd_cistpl_device()
398 return -EINVAL; in pcmciamtd_cistpl_geo()
400 dev->pcmcia_map.bankwidth = t->geo[0].buswidth; in pcmciamtd_cistpl_geo()
402 for (i = 0; i < t->ngeo; i++) { in pcmciamtd_cistpl_geo()
403 pr_debug("region: %d bankwidth = %u\n", i, t->geo[i].buswidth); in pcmciamtd_cistpl_geo()
404 pr_debug("region: %d erase_block = %u\n", i, t->geo[i].erase_block); in pcmciamtd_cistpl_geo()
405 pr_debug("region: %d read_block = %u\n", i, t->geo[i].read_block); in pcmciamtd_cistpl_geo()
406 pr_debug("region: %d write_block = %u\n", i, t->geo[i].write_block); in pcmciamtd_cistpl_geo()
407 pr_debug("region: %d partition = %u\n", i, t->geo[i].partition); in pcmciamtd_cistpl_geo()
408 pr_debug("region: %d interleave = %u\n", i, t->geo[i].interleave); in pcmciamtd_cistpl_geo()
418 if (p_dev->prod_id[0]) { in card_settings()
419 dev->mtd_name[0] = '\0'; in card_settings()
422 strcat(dev->mtd_name, " "); in card_settings()
423 if (p_dev->prod_id[i]) in card_settings()
424 strcat(dev->mtd_name, p_dev->prod_id[i]); in card_settings()
426 pr_debug("Found name: %s\n", dev->mtd_name); in card_settings()
434 if(!dev->pcmcia_map.size) in card_settings()
435 dev->pcmcia_map.size = MAX_PCMCIA_ADDR; in card_settings()
437 if(!dev->pcmcia_map.bankwidth) in card_settings()
438 dev->pcmcia_map.bankwidth = 2; in card_settings()
441 dev->pcmcia_map.size = force_size << 20; in card_settings()
446 dev->pcmcia_map.bankwidth = bankwidth; in card_settings()
447 pr_debug("bankwidth forced to %d\n", bankwidth); in card_settings()
450 dev->pcmcia_map.name = dev->mtd_name; in card_settings()
451 if(!dev->mtd_name[0]) { in card_settings()
452 strcpy(dev->mtd_name, "PCMCIA Memory card"); in card_settings()
456 pr_debug("Device: Size: %lu Width:%d Name: %s\n", in card_settings()
457 dev->pcmcia_map.size, in card_settings()
458 dev->pcmcia_map.bankwidth << 3, dev->mtd_name); in card_settings()
462 static int pcmciamtd_config(struct pcmcia_device *link) in pcmciamtd_config() argument
464 struct pcmciamtd_dev *dev = link->priv; in pcmciamtd_config()
471 pr_debug("link=0x%p\n", link); in pcmciamtd_config()
473 card_settings(dev, link, &new_name); in pcmciamtd_config()
475 dev->pcmcia_map.phys = NO_XIP; in pcmciamtd_config()
476 dev->pcmcia_map.copy_from = pcmcia_copy_from_remap; in pcmciamtd_config()
477 dev->pcmcia_map.copy_to = pcmcia_copy_to_remap; in pcmciamtd_config()
478 if (dev->pcmcia_map.bankwidth == 1) { in pcmciamtd_config()
479 dev->pcmcia_map.read = pcmcia_read8_remap; in pcmciamtd_config()
480 dev->pcmcia_map.write = pcmcia_write8_remap; in pcmciamtd_config()
482 dev->pcmcia_map.read = pcmcia_read16_remap; in pcmciamtd_config()
483 dev->pcmcia_map.write = pcmcia_write16_remap; in pcmciamtd_config()
486 dev->pcmcia_map.set_vpp = pcmciamtd_set_vpp; in pcmciamtd_config()
489 * up to the maximum that PCMCIA can support (64MiB) - this is ideal and in pcmciamtd_config()
490 * we aim for a window the size of the whole card - otherwise we try in pcmciamtd_config()
494 link->resource[2]->flags |= WIN_MEMORY_TYPE_CM | WIN_ENABLE; in pcmciamtd_config()
495 link->resource[2]->flags |= (dev->pcmcia_map.bankwidth == 1) ? in pcmciamtd_config()
497 link->resource[2]->start = 0; in pcmciamtd_config()
498 link->resource[2]->end = (force_size) ? force_size << 20 : in pcmciamtd_config()
500 dev->win_size = 0; in pcmciamtd_config()
504 pr_debug("requesting window with size = %luKiB memspeed = %d\n", in pcmciamtd_config()
505 (unsigned long) resource_size(link->resource[2]) >> 10, in pcmciamtd_config()
507 ret = pcmcia_request_window(link, link->resource[2], mem_speed); in pcmciamtd_config()
508 pr_debug("ret = %d dev->win_size = %d\n", ret, dev->win_size); in pcmciamtd_config()
511 link->resource[2]->start = 0; in pcmciamtd_config()
512 link->resource[2]->end = (force_size) ? in pcmciamtd_config()
514 link->resource[2]->end >>= j; in pcmciamtd_config()
517 resource_size(link->resource[2]) >> 10); in pcmciamtd_config()
518 dev->win_size = resource_size(link->resource[2]); in pcmciamtd_config()
521 } while (link->resource[2]->end >= 0x1000); in pcmciamtd_config()
523 pr_debug("dev->win_size = %d\n", dev->win_size); in pcmciamtd_config()
525 if(!dev->win_size) { in pcmciamtd_config()
526 dev_err(&dev->p_dev->dev, "Cannot allocate memory window\n"); in pcmciamtd_config()
527 pcmciamtd_release(link); in pcmciamtd_config()
528 return -ENODEV; in pcmciamtd_config()
530 pr_debug("Allocated a window of %dKiB\n", dev->win_size >> 10); in pcmciamtd_config()
533 dev->win_base = ioremap(link->resource[2]->start, in pcmciamtd_config()
534 resource_size(link->resource[2])); in pcmciamtd_config()
535 if(!dev->win_base) { in pcmciamtd_config()
536 dev_err(&dev->p_dev->dev, "ioremap(%pR) failed\n", in pcmciamtd_config()
537 link->resource[2]); in pcmciamtd_config()
538 pcmciamtd_release(link); in pcmciamtd_config()
539 return -ENODEV; in pcmciamtd_config()
542 dev, link->resource[2], dev->win_base); in pcmciamtd_config()
544 dev->offset = 0; in pcmciamtd_config()
545 dev->pcmcia_map.map_priv_1 = (unsigned long)dev; in pcmciamtd_config()
546 dev->pcmcia_map.map_priv_2 = (unsigned long)link->resource[2]; in pcmciamtd_config()
548 dev->vpp = (vpp) ? vpp : link->socket->socket.Vpp; in pcmciamtd_config()
550 link->vpp = dev->vpp; in pcmciamtd_config()
552 link->vpp = 0; in pcmciamtd_config()
555 link->config_index = 0; in pcmciamtd_config()
557 ret = pcmcia_enable_device(link); in pcmciamtd_config()
559 if (dev->win_base) { in pcmciamtd_config()
560 iounmap(dev->win_base); in pcmciamtd_config()
561 dev->win_base = NULL; in pcmciamtd_config()
563 return -ENODEV; in pcmciamtd_config()
567 mtd = do_map_probe("map_ram", &dev->pcmcia_map); in pcmciamtd_config()
569 mtd = do_map_probe("map_rom", &dev->pcmcia_map); in pcmciamtd_config()
573 mtd = do_map_probe(probes[i], &dev->pcmcia_map); in pcmciamtd_config()
583 pcmciamtd_release(link); in pcmciamtd_config()
584 return -ENODEV; in pcmciamtd_config()
587 dev->mtd_info = mtd; in pcmciamtd_config()
588 mtd->owner = THIS_MODULE; in pcmciamtd_config()
596 if(mtd->size < 1048576) { /* <1MiB in size, show size in KiB */ in pcmciamtd_config()
597 size = mtd->size >> 10; in pcmciamtd_config()
600 size = mtd->size >> 20; in pcmciamtd_config()
603 snprintf(dev->mtd_name, sizeof(dev->mtd_name), "%d%ciB %s", size, unit, "PCMCIA Memory card"); in pcmciamtd_config()
607 use the faster non-remapping read/write functions */ in pcmciamtd_config()
608 if(mtd->size <= dev->win_size) { in pcmciamtd_config()
610 dev->pcmcia_map.map_priv_2 = (unsigned long)dev->win_base; in pcmciamtd_config()
611 if (dev->pcmcia_map.bankwidth == 1) { in pcmciamtd_config()
612 dev->pcmcia_map.read = pcmcia_read8; in pcmciamtd_config()
613 dev->pcmcia_map.write = pcmcia_write8; in pcmciamtd_config()
615 dev->pcmcia_map.read = pcmcia_read16; in pcmciamtd_config()
616 dev->pcmcia_map.write = pcmcia_write16; in pcmciamtd_config()
618 dev->pcmcia_map.copy_from = pcmcia_copy_from; in pcmciamtd_config()
619 dev->pcmcia_map.copy_to = pcmcia_copy_to; in pcmciamtd_config()
624 dev->mtd_info = NULL; in pcmciamtd_config()
625 dev_err(&dev->p_dev->dev, in pcmciamtd_config()
627 pcmciamtd_release(link); in pcmciamtd_config()
628 return -ENODEV; in pcmciamtd_config()
630 dev_info(&dev->p_dev->dev, "mtd%d: %s\n", mtd->index, mtd->name); in pcmciamtd_config()
639 /* get_lock(link); */ in pcmciamtd_suspend()
648 /* free_lock(link); */ in pcmciamtd_resume()
654 static void pcmciamtd_detach(struct pcmcia_device *link) in pcmciamtd_detach() argument
656 struct pcmciamtd_dev *dev = link->priv; in pcmciamtd_detach()
658 pr_debug("link=0x%p\n", link); in pcmciamtd_detach()
660 if(dev->mtd_info) { in pcmciamtd_detach()
661 mtd_device_unregister(dev->mtd_info); in pcmciamtd_detach()
662 dev_info(&dev->p_dev->dev, "mtd%d: Removing\n", in pcmciamtd_detach()
663 dev->mtd_info->index); in pcmciamtd_detach()
664 map_destroy(dev->mtd_info); in pcmciamtd_detach()
667 pcmciamtd_release(link); in pcmciamtd_detach()
671 static int pcmciamtd_probe(struct pcmcia_device *link) in pcmciamtd_probe() argument
677 if (!dev) return -ENOMEM; in pcmciamtd_probe()
680 dev->p_dev = link; in pcmciamtd_probe()
681 link->priv = dev; in pcmciamtd_probe()
683 return pcmciamtd_config(link); in pcmciamtd_probe()
688 PCMCIA_DEVICE_PROD_ID123("IO DATA", "PCS-2M", "2MB SRAM", 0x547e66dc, 0x1fed36cd, 0x36eadd21),
694 PCMCIA_DEVICE_PROD_ID12("intel", "SERIES2-02 ", 0x40ade711, 0x145cea5c),
695 PCMCIA_DEVICE_PROD_ID12("intel", "SERIES2-04 ", 0x40ade711, 0x42064dda),
696 PCMCIA_DEVICE_PROD_ID12("intel", "SERIES2-20 ", 0x40ade711, 0x25ee5cb0),
700 …PCMCIA_DEVICE_PROD_ID123("M-Systems", "M-SYS Flash Memory Card", "(c) M-Systems", 0x7ed2ad87, 0x67…
706 PCMCIA_DEVICE_PROD_ID12("Starfish, Inc.", "REX-3000", 0x05ddca47, 0xe7d67bca),
707 PCMCIA_DEVICE_PROD_ID12("Starfish, Inc.", "REX-4100", 0x05ddca47, 0x7bc32944),
708 /* the following was commented out in pcmcia-cs-3.2.7 */
731 info("bad bankwidth (%d), using default", bankwidth); in init_pcmciamtd()
735 info("bad force_size (%d), using default", force_size); in init_pcmciamtd()
739 info("bad mem_type (%d), using default", mem_type); in init_pcmciamtd()