Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v3.9-rc4 129 lines 3.5 kB view raw
1/* 2 * NV-RAM memory access on autcpu12 3 * (C) 2002 Thomas Gleixner (gleixner@autronix.de) 4 * 5 * This program is free software; you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License as published by 7 * the Free Software Foundation; either version 2 of the License, or 8 * (at your option) any later version. 9 * 10 * This program is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * GNU General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License 16 * along with this program; if not, write to the Free Software 17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 18 */ 19#include <linux/err.h> 20#include <linux/sizes.h> 21 22#include <linux/types.h> 23#include <linux/kernel.h> 24#include <linux/init.h> 25#include <linux/device.h> 26#include <linux/module.h> 27#include <linux/platform_device.h> 28 29#include <linux/mtd/mtd.h> 30#include <linux/mtd/map.h> 31 32struct autcpu12_nvram_priv { 33 struct mtd_info *mtd; 34 struct map_info map; 35}; 36 37static int autcpu12_nvram_probe(struct platform_device *pdev) 38{ 39 map_word tmp, save0, save1; 40 struct resource *res; 41 struct autcpu12_nvram_priv *priv; 42 43 priv = devm_kzalloc(&pdev->dev, 44 sizeof(struct autcpu12_nvram_priv), GFP_KERNEL); 45 if (!priv) 46 return -ENOMEM; 47 48 platform_set_drvdata(pdev, priv); 49 50 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 51 if (!res) { 52 dev_err(&pdev->dev, "failed to get memory resource\n"); 53 return -ENOENT; 54 } 55 56 priv->map.bankwidth = 4; 57 priv->map.phys = res->start; 58 priv->map.size = resource_size(res); 59 priv->map.virt = devm_ioremap_resource(&pdev->dev, res); 60 strcpy((char *)priv->map.name, res->name); 61 if (IS_ERR(priv->map.virt)) 62 return PTR_ERR(priv->map.virt); 63 64 simple_map_init(&priv->map); 65 66 /* 67 * Check for 32K/128K 68 * read ofs 0 69 * read ofs 0x10000 70 * Write complement to ofs 0x100000 71 * Read and check result on ofs 0x0 72 * Restore contents 73 */ 74 save0 = map_read(&priv->map, 0); 75 save1 = map_read(&priv->map, 0x10000); 76 tmp.x[0] = ~save0.x[0]; 77 map_write(&priv->map, tmp, 0x10000); 78 tmp = map_read(&priv->map, 0); 79 /* if we find this pattern on 0x0, we have 32K size */ 80 if (!map_word_equal(&priv->map, tmp, save0)) { 81 map_write(&priv->map, save0, 0x0); 82 priv->map.size = SZ_32K; 83 } else 84 map_write(&priv->map, save1, 0x10000); 85 86 priv->mtd = do_map_probe("map_ram", &priv->map); 87 if (!priv->mtd) { 88 dev_err(&pdev->dev, "probing failed\n"); 89 return -ENXIO; 90 } 91 92 priv->mtd->owner = THIS_MODULE; 93 priv->mtd->erasesize = 16; 94 priv->mtd->dev.parent = &pdev->dev; 95 if (!mtd_device_register(priv->mtd, NULL, 0)) { 96 dev_info(&pdev->dev, 97 "NV-RAM device size %ldKiB registered on AUTCPU12\n", 98 priv->map.size / SZ_1K); 99 return 0; 100 } 101 102 map_destroy(priv->mtd); 103 dev_err(&pdev->dev, "NV-RAM device addition failed\n"); 104 return -ENOMEM; 105} 106 107static int autcpu12_nvram_remove(struct platform_device *pdev) 108{ 109 struct autcpu12_nvram_priv *priv = platform_get_drvdata(pdev); 110 111 mtd_device_unregister(priv->mtd); 112 map_destroy(priv->mtd); 113 114 return 0; 115} 116 117static struct platform_driver autcpu12_nvram_driver = { 118 .driver = { 119 .name = "autcpu12_nvram", 120 .owner = THIS_MODULE, 121 }, 122 .probe = autcpu12_nvram_probe, 123 .remove = autcpu12_nvram_remove, 124}; 125module_platform_driver(autcpu12_nvram_driver); 126 127MODULE_AUTHOR("Thomas Gleixner"); 128MODULE_DESCRIPTION("autcpu12 NVRAM map driver"); 129MODULE_LICENSE("GPL");