cregit-Linux how code gets into the kernel

Release 4.11 drivers/mtd/maps/sun_uflash.c

Directory: drivers/mtd/maps
/* sun_uflash.c - Driver for user-programmable flash on
 *                Sun Microsystems SME boardsets.
 *
 * This driver does NOT provide access to the OBP-flash for
 * safety reasons-- use <linux>/drivers/sbus/char/flash.c instead.
 *
 * Copyright (c) 2001 Eric Brower (ebrower@usa.net)
 */

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/errno.h>
#include <linux/ioport.h>
#include <linux/of.h>
#include <linux/of_device.h>
#include <linux/slab.h>
#include <asm/prom.h>
#include <linux/uaccess.h>
#include <asm/io.h>

#include <linux/mtd/mtd.h>
#include <linux/mtd/map.h>


#define UFLASH_OBPNAME	"flashprom"

#define DRIVER_NAME	"sun_uflash"

#define PFX		DRIVER_NAME ": "


#define UFLASH_WINDOW_SIZE	0x200000

#define UFLASH_BUSWIDTH		1			
/* EBus is 8-bit */

MODULE_AUTHOR("Eric Brower <ebrower@usa.net>");
MODULE_DESCRIPTION("User-programmable flash device on Sun Microsystems boardsets");

MODULE_SUPPORTED_DEVICE(DRIVER_NAME);
MODULE_LICENSE("GPL");
MODULE_VERSION("2.1");


struct uflash_dev {
	
const char		*name;	/* device name */
	
struct map_info 	map;	/* mtd map info */
	
struct mtd_info		*mtd;	/* mtd info */
};


struct map_info uflash_map_templ = {
	.name =		"SUNW,???-????",
	.size =		UFLASH_WINDOW_SIZE,
	.bankwidth =	UFLASH_BUSWIDTH,
};


int uflash_devinit(struct platform_device *op, struct device_node *dp) { struct uflash_dev *up; if (op->resource[1].flags) { /* Non-CFI userflash device-- once I find one we * can work on supporting it. */ printk(KERN_ERR PFX "Unsupported device at %s, 0x%llx\n", dp->full_name, (unsigned long long)op->resource[0].start); return -ENODEV; } up = kzalloc(sizeof(struct uflash_dev), GFP_KERNEL); if (!up) { printk(KERN_ERR PFX "Cannot allocate struct uflash_dev\n"); return -ENOMEM; } /* copy defaults and tweak parameters */ memcpy(&up->map, &uflash_map_templ, sizeof(uflash_map_templ)); up->map.size = resource_size(&op->resource[0]); up->name = of_get_property(dp, "model", NULL); if (up->name && 0 < strlen(up->name)) up->map.name = up->name; up->map.phys = op->resource[0].start; up->map.virt = of_ioremap(&op->resource[0], 0, up->map.size, DRIVER_NAME); if (!up->map.virt) { printk(KERN_ERR PFX "Failed to map device.\n"); kfree(up); return -EINVAL; } simple_map_init(&up->map); /* MTD registration */ up->mtd = do_map_probe("cfi_probe", &up->map); if (!up->mtd) { of_iounmap(&op->resource[0], up->map.virt, up->map.size); kfree(up); return -ENXIO; } up->mtd->owner = THIS_MODULE; mtd_device_register(up->mtd, NULL, 0); dev_set_drvdata(&op->dev, up); return 0; }

Contributors

PersonTokensPropCommitsCommitProp
David S. Miller11937.66%222.22%
Linus Torvalds10332.59%222.22%
Linus Torvalds (pre-git)6721.20%111.11%
David Woodhouse175.38%111.11%
Jamie Iles51.58%111.11%
Tom 'spot' Callaway41.27%111.11%
Grant C. Likely10.32%111.11%
Total316100.00%9100.00%


static int uflash_probe(struct platform_device *op) { struct device_node *dp = op->dev.of_node; /* Flashprom must have the "user" property in order to * be used by this driver. */ if (!of_find_property(dp, "user", NULL)) return -ENODEV; return uflash_devinit(op, dp); }

Contributors

PersonTokensPropCommitsCommitProp
David S. Miller2246.81%233.33%
Linus Torvalds1736.17%116.67%
Linus Torvalds (pre-git)48.51%116.67%
Grant C. Likely48.51%233.33%
Total47100.00%6100.00%


static int uflash_remove(struct platform_device *op) { struct uflash_dev *up = dev_get_drvdata(&op->dev); if (up->mtd) { mtd_device_unregister(up->mtd); map_destroy(up->mtd); } if (up->map.virt) { of_iounmap(&op->resource[0], up->map.virt, up->map.size); up->map.virt = NULL; } kfree(up); return 0; }

Contributors

PersonTokensPropCommitsCommitProp
David S. Miller3840.00%225.00%
Linus Torvalds3334.74%112.50%
Linus Torvalds (pre-git)1818.95%112.50%
David Woodhouse33.16%112.50%
Jamie Iles11.05%112.50%
Al Viro11.05%112.50%
Grant C. Likely11.05%112.50%
Total95100.00%8100.00%

static const struct of_device_id uflash_match[] = { { .name = UFLASH_OBPNAME, }, {}, }; MODULE_DEVICE_TABLE(of, uflash_match); static struct platform_driver uflash_driver = { .driver = { .name = DRIVER_NAME, .of_match_table = uflash_match, }, .probe = uflash_probe, .remove = uflash_remove, }; module_platform_driver(uflash_driver);

Overall Contributors

PersonTokensPropCommitsCommitProp
David S. Miller24237.29%315.00%
Linus Torvalds21933.74%315.00%
Linus Torvalds (pre-git)13020.03%15.00%
David Woodhouse223.39%210.00%
Grant C. Likely132.00%420.00%
Art Haas60.92%15.00%
Jamie Iles60.92%15.00%
Tom 'spot' Callaway40.62%15.00%
Tejun Heo30.46%15.00%
Axel Lin20.31%15.00%
Al Viro10.15%15.00%
Stephen Rothwell10.15%15.00%
Total649100.00%20100.00%
Directory: drivers/mtd/maps
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.