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-rc1 113 lines 2.4 kB view raw
1/* 2 * drivers/uio/uio_pdrv.c 3 * 4 * Copyright (C) 2008 by Digi International Inc. 5 * All rights reserved. 6 * 7 * This program is free software; you can redistribute it and/or modify it 8 * under the terms of the GNU General Public License version 2 as published by 9 * the Free Software Foundation. 10 */ 11#include <linux/platform_device.h> 12#include <linux/uio_driver.h> 13#include <linux/stringify.h> 14#include <linux/module.h> 15#include <linux/slab.h> 16 17#define DRIVER_NAME "uio_pdrv" 18 19struct uio_platdata { 20 struct uio_info *uioinfo; 21}; 22 23static int uio_pdrv_probe(struct platform_device *pdev) 24{ 25 struct uio_info *uioinfo = pdev->dev.platform_data; 26 struct uio_platdata *pdata; 27 struct uio_mem *uiomem; 28 int ret = -ENODEV; 29 int i; 30 31 if (!uioinfo || !uioinfo->name || !uioinfo->version) { 32 dev_dbg(&pdev->dev, "%s: err_uioinfo\n", __func__); 33 goto err_uioinfo; 34 } 35 36 pdata = kzalloc(sizeof(*pdata), GFP_KERNEL); 37 if (!pdata) { 38 ret = -ENOMEM; 39 dev_dbg(&pdev->dev, "%s: err_alloc_pdata\n", __func__); 40 goto err_alloc_pdata; 41 } 42 43 pdata->uioinfo = uioinfo; 44 45 uiomem = &uioinfo->mem[0]; 46 47 for (i = 0; i < pdev->num_resources; ++i) { 48 struct resource *r = &pdev->resource[i]; 49 50 if (r->flags != IORESOURCE_MEM) 51 continue; 52 53 if (uiomem >= &uioinfo->mem[MAX_UIO_MAPS]) { 54 dev_warn(&pdev->dev, "device has more than " 55 __stringify(MAX_UIO_MAPS) 56 " I/O memory resources.\n"); 57 break; 58 } 59 60 uiomem->memtype = UIO_MEM_PHYS; 61 uiomem->addr = r->start; 62 uiomem->size = resource_size(r); 63 uiomem->name = r->name; 64 ++uiomem; 65 } 66 67 while (uiomem < &uioinfo->mem[MAX_UIO_MAPS]) { 68 uiomem->size = 0; 69 ++uiomem; 70 } 71 72 pdata->uioinfo->priv = pdata; 73 74 ret = uio_register_device(&pdev->dev, pdata->uioinfo); 75 76 if (ret) { 77 kfree(pdata); 78err_alloc_pdata: 79err_uioinfo: 80 return ret; 81 } 82 83 platform_set_drvdata(pdev, pdata); 84 85 return 0; 86} 87 88static int uio_pdrv_remove(struct platform_device *pdev) 89{ 90 struct uio_platdata *pdata = platform_get_drvdata(pdev); 91 92 uio_unregister_device(pdata->uioinfo); 93 94 kfree(pdata); 95 96 return 0; 97} 98 99static struct platform_driver uio_pdrv = { 100 .probe = uio_pdrv_probe, 101 .remove = uio_pdrv_remove, 102 .driver = { 103 .name = DRIVER_NAME, 104 .owner = THIS_MODULE, 105 }, 106}; 107 108module_platform_driver(uio_pdrv); 109 110MODULE_AUTHOR("Uwe Kleine-Koenig"); 111MODULE_DESCRIPTION("Userspace I/O platform driver"); 112MODULE_LICENSE("GPL v2"); 113MODULE_ALIAS("platform:" DRIVER_NAME);