root/drivers/mtd/maps/sun_uflash.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. uflash_devinit
  2. uflash_probe
  3. uflash_remove

   1 // SPDX-License-Identifier: GPL-2.0-only
   2 /* sun_uflash.c - Driver for user-programmable flash on
   3  *                Sun Microsystems SME boardsets.
   4  *
   5  * This driver does NOT provide access to the OBP-flash for
   6  * safety reasons-- use <linux>/drivers/sbus/char/flash.c instead.
   7  *
   8  * Copyright (c) 2001 Eric Brower (ebrower@usa.net)
   9  */
  10 
  11 #include <linux/kernel.h>
  12 #include <linux/module.h>
  13 #include <linux/fs.h>
  14 #include <linux/errno.h>
  15 #include <linux/ioport.h>
  16 #include <linux/of.h>
  17 #include <linux/of_device.h>
  18 #include <linux/slab.h>
  19 #include <asm/prom.h>
  20 #include <linux/uaccess.h>
  21 #include <asm/io.h>
  22 
  23 #include <linux/mtd/mtd.h>
  24 #include <linux/mtd/map.h>
  25 
  26 #define UFLASH_OBPNAME  "flashprom"
  27 #define DRIVER_NAME     "sun_uflash"
  28 #define PFX             DRIVER_NAME ": "
  29 
  30 #define UFLASH_WINDOW_SIZE      0x200000
  31 #define UFLASH_BUSWIDTH         1                       /* EBus is 8-bit */
  32 
  33 MODULE_AUTHOR("Eric Brower <ebrower@usa.net>");
  34 MODULE_DESCRIPTION("User-programmable flash device on Sun Microsystems boardsets");
  35 MODULE_SUPPORTED_DEVICE(DRIVER_NAME);
  36 MODULE_LICENSE("GPL");
  37 MODULE_VERSION("2.1");
  38 
  39 struct uflash_dev {
  40         const char              *name;  /* device name */
  41         struct map_info         map;    /* mtd map info */
  42         struct mtd_info         *mtd;   /* mtd info */
  43 };
  44 
  45 struct map_info uflash_map_templ = {
  46         .name =         "SUNW,???-????",
  47         .size =         UFLASH_WINDOW_SIZE,
  48         .bankwidth =    UFLASH_BUSWIDTH,
  49 };
  50 
  51 int uflash_devinit(struct platform_device *op, struct device_node *dp)
  52 {
  53         struct uflash_dev *up;
  54 
  55         if (op->resource[1].flags) {
  56                 /* Non-CFI userflash device-- once I find one we
  57                  * can work on supporting it.
  58                  */
  59                 printk(KERN_ERR PFX "Unsupported device at %pOF, 0x%llx\n",
  60                        dp, (unsigned long long)op->resource[0].start);
  61 
  62                 return -ENODEV;
  63         }
  64 
  65         up = kzalloc(sizeof(struct uflash_dev), GFP_KERNEL);
  66         if (!up) {
  67                 printk(KERN_ERR PFX "Cannot allocate struct uflash_dev\n");
  68                 return -ENOMEM;
  69         }
  70 
  71         /* copy defaults and tweak parameters */
  72         memcpy(&up->map, &uflash_map_templ, sizeof(uflash_map_templ));
  73 
  74         up->map.size = resource_size(&op->resource[0]);
  75 
  76         up->name = of_get_property(dp, "model", NULL);
  77         if (up->name && 0 < strlen(up->name))
  78                 up->map.name = up->name;
  79 
  80         up->map.phys = op->resource[0].start;
  81 
  82         up->map.virt = of_ioremap(&op->resource[0], 0, up->map.size,
  83                                   DRIVER_NAME);
  84         if (!up->map.virt) {
  85                 printk(KERN_ERR PFX "Failed to map device.\n");
  86                 kfree(up);
  87 
  88                 return -EINVAL;
  89         }
  90 
  91         simple_map_init(&up->map);
  92 
  93         /* MTD registration */
  94         up->mtd = do_map_probe("cfi_probe", &up->map);
  95         if (!up->mtd) {
  96                 of_iounmap(&op->resource[0], up->map.virt, up->map.size);
  97                 kfree(up);
  98 
  99                 return -ENXIO;
 100         }
 101 
 102         up->mtd->owner = THIS_MODULE;
 103 
 104         mtd_device_register(up->mtd, NULL, 0);
 105 
 106         dev_set_drvdata(&op->dev, up);
 107 
 108         return 0;
 109 }
 110 
 111 static int uflash_probe(struct platform_device *op)
 112 {
 113         struct device_node *dp = op->dev.of_node;
 114 
 115         /* Flashprom must have the "user" property in order to
 116          * be used by this driver.
 117          */
 118         if (!of_find_property(dp, "user", NULL))
 119                 return -ENODEV;
 120 
 121         return uflash_devinit(op, dp);
 122 }
 123 
 124 static int uflash_remove(struct platform_device *op)
 125 {
 126         struct uflash_dev *up = dev_get_drvdata(&op->dev);
 127 
 128         if (up->mtd) {
 129                 mtd_device_unregister(up->mtd);
 130                 map_destroy(up->mtd);
 131         }
 132         if (up->map.virt) {
 133                 of_iounmap(&op->resource[0], up->map.virt, up->map.size);
 134                 up->map.virt = NULL;
 135         }
 136 
 137         kfree(up);
 138 
 139         return 0;
 140 }
 141 
 142 static const struct of_device_id uflash_match[] = {
 143         {
 144                 .name = UFLASH_OBPNAME,
 145         },
 146         {},
 147 };
 148 
 149 MODULE_DEVICE_TABLE(of, uflash_match);
 150 
 151 static struct platform_driver uflash_driver = {
 152         .driver = {
 153                 .name = DRIVER_NAME,
 154                 .of_match_table = uflash_match,
 155         },
 156         .probe          = uflash_probe,
 157         .remove         = uflash_remove,
 158 };
 159 
 160 module_platform_driver(uflash_driver);

/* [<][>][^][v][top][bottom][index][help] */