int __xipram cfi_qry_present(struct map_info *map, __u32 base, struct cfi_private *cfi) { int osf = cfi->interleave * cfi->device_type; /* scale factor */ map_word val[3]; map_word qry[3]; qry[0] = cfi_build_cmd('Q', map, cfi); qry[1] = cfi_build_cmd('R', map, cfi); qry[2] = cfi_build_cmd('Y', map, cfi); val[0] = map_read(map, base + osf*0x10); val[1] = map_read(map, base + osf*0x11); val[2] = map_read(map, base + osf*0x12); if (!map_word_equal(map, qry[0], val[0])) return 0; if (!map_word_equal(map, qry[1], val[1])) return 0; if (!map_word_equal(map, qry[2], val[2])) return 0; return 1; /* "QRY" found */ }
static int autcpu12_nvram_probe(struct platform_device *pdev) { map_word tmp, save0, save1; struct resource *res; struct autcpu12_nvram_priv *priv; priv = devm_kzalloc(&pdev->dev, sizeof(struct autcpu12_nvram_priv), GFP_KERNEL); if (!priv) return -ENOMEM; platform_set_drvdata(pdev, priv); res = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (!res) { dev_err(&pdev->dev, "failed to get memory resource\n"); return -ENOENT; } priv->map.bankwidth = 4; priv->map.phys = res->start; priv->map.size = resource_size(res); priv->map.virt = devm_ioremap_resource(&pdev->dev, res); strcpy((char *)priv->map.name, res->name); if (IS_ERR(priv->map.virt)) return PTR_ERR(priv->map.virt); simple_map_init(&priv->map); /* * Check for 32K/128K * read ofs 0 * read ofs 0x10000 * Write complement to ofs 0x100000 * Read and check result on ofs 0x0 * Restore contents */ save0 = map_read(&priv->map, 0); save1 = map_read(&priv->map, 0x10000); tmp.x[0] = ~save0.x[0]; map_write(&priv->map, tmp, 0x10000); tmp = map_read(&priv->map, 0); /* if we find this pattern on 0x0, we have 32K size */ if (!map_word_equal(&priv->map, tmp, save0)) { map_write(&priv->map, save0, 0x0); priv->map.size = SZ_32K; } else map_write(&priv->map, save1, 0x10000); priv->mtd = do_map_probe("map_ram", &priv->map); if (!priv->mtd) { dev_err(&pdev->dev, "probing failed\n"); return -ENXIO; } priv->mtd->owner = THIS_MODULE; priv->mtd->erasesize = 16; priv->mtd->dev.parent = &pdev->dev; if (!mtd_device_register(priv->mtd, NULL, 0)) { dev_info(&pdev->dev, "NV-RAM device size %ldKiB registered on AUTCPU12\n", priv->map.size / SZ_1K); return 0; } map_destroy(priv->mtd); dev_err(&pdev->dev, "NV-RAM device addition failed\n"); return -ENOMEM; }
static int __init init_autcpu12_sram (void) { map_word tmp, save0, save1; int err; autcpu12_sram_map.virt = ioremap(0x12000000, SZ_128K); if (!autcpu12_sram_map.virt) { printk("Failed to ioremap autcpu12 NV-RAM space\n"); err = -EIO; goto out; } simple_map_init(&autcpu12_sram_map); /* * Check for 32K/128K * read ofs 0 * read ofs 0x10000 * Write complement to ofs 0x100000 * Read and check result on ofs 0x0 * Restore contents */ save0 = map_read(&autcpu12_sram_map, 0); save1 = map_read(&autcpu12_sram_map, 0x10000); tmp.x[0] = ~save0.x[0]; map_write(&autcpu12_sram_map, tmp, 0x10000); /* if we find this pattern on 0x0, we have 32K size * restore contents and exit */ tmp = map_read(&autcpu12_sram_map, 0); if (!map_word_equal(&autcpu12_sram_map, tmp, save0)) { map_write(&autcpu12_sram_map, save0, 0x0); goto map; } /* We have a 128K found, restore 0x10000 and set size * to 128K */ map_write(&autcpu12_sram_map, save1, 0x10000); autcpu12_sram_map.size = SZ_128K; map: sram_mtd = do_map_probe("map_ram", &autcpu12_sram_map); if (!sram_mtd) { printk("NV-RAM probe failed\n"); err = -ENXIO; goto out_ioremap; } sram_mtd->owner = THIS_MODULE; sram_mtd->erasesize = 16; if (mtd_device_register(sram_mtd, NULL, 0)) { printk("NV-RAM device addition failed\n"); err = -ENOMEM; goto out_probe; } printk("NV-RAM device size %ldKiB registered on AUTCPU12\n",autcpu12_sram_map.size/SZ_1K); return 0; out_probe: map_destroy(sram_mtd); sram_mtd = 0; out_ioremap: iounmap((void *)autcpu12_sram_map.virt); out: return err; }