Merge tag 'char-misc-3.13-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc
Pull char/misc patches from Greg KH: "Here's the big char/misc driver patchset for 3.13-rc1. Lots of stuff in here, including some new drivers for Intel's "MIC" co-processor devices, and a new eeprom driver. Other things include the driver attribute cleanups, extcon driver updates, hyperv updates, and a raft of other miscellaneous driver fixes. All of these have been in linux-next for a while" * tag 'char-misc-3.13-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc: (121 commits) misc: mic: Fixes for randconfig build errors and warnings. tifm: fix error return code in tifm_7xx1_probe() w1-gpio: Use devm_* functions w1-gpio: Detect of_gpio_error for first gpio uio: Pass pointers to virt_to_page(), not integers uio: fix memory leak misc/at24: avoid infinite loop on write() misc/93xx46: avoid infinite loop on write() misc: atmel_pwm: add deferred-probing support mei: wd: host_init propagate error codes from called functions mei: replace stray pr_debug with dev_dbg mei: bus: propagate error code returned by mei_me_cl_by_id mei: mei_cl_link remove duplicated check for open_handle_count mei: print correct device state during unexpected reset mei: nfc: fix memory leak in error path lkdtm: add tests for additional page permissions lkdtm: adjust recursion size to avoid warnings lkdtm: isolate stack corruption test mei: move host_clients_map cleanup to device init mei: me: downgrade two errors to debug level ...
This commit is contained in:
@@ -288,13 +288,13 @@ static int uio_dev_add_attributes(struct uio_device *idev)
|
||||
}
|
||||
map = kzalloc(sizeof(*map), GFP_KERNEL);
|
||||
if (!map)
|
||||
goto err_map;
|
||||
goto err_map_kobj;
|
||||
kobject_init(&map->kobj, &map_attr_type);
|
||||
map->mem = mem;
|
||||
mem->map = map;
|
||||
ret = kobject_add(&map->kobj, idev->map_dir, "map%d", mi);
|
||||
if (ret)
|
||||
goto err_map;
|
||||
goto err_map_kobj;
|
||||
ret = kobject_uevent(&map->kobj, KOBJ_ADD);
|
||||
if (ret)
|
||||
goto err_map;
|
||||
@@ -313,14 +313,14 @@ static int uio_dev_add_attributes(struct uio_device *idev)
|
||||
}
|
||||
portio = kzalloc(sizeof(*portio), GFP_KERNEL);
|
||||
if (!portio)
|
||||
goto err_portio;
|
||||
goto err_portio_kobj;
|
||||
kobject_init(&portio->kobj, &portio_attr_type);
|
||||
portio->port = port;
|
||||
port->portio = portio;
|
||||
ret = kobject_add(&portio->kobj, idev->portio_dir,
|
||||
"port%d", pi);
|
||||
if (ret)
|
||||
goto err_portio;
|
||||
goto err_portio_kobj;
|
||||
ret = kobject_uevent(&portio->kobj, KOBJ_ADD);
|
||||
if (ret)
|
||||
goto err_portio;
|
||||
@@ -329,14 +329,18 @@ static int uio_dev_add_attributes(struct uio_device *idev)
|
||||
return 0;
|
||||
|
||||
err_portio:
|
||||
for (pi--; pi >= 0; pi--) {
|
||||
pi--;
|
||||
err_portio_kobj:
|
||||
for (; pi >= 0; pi--) {
|
||||
port = &idev->info->port[pi];
|
||||
portio = port->portio;
|
||||
kobject_put(&portio->kobj);
|
||||
}
|
||||
kobject_put(idev->portio_dir);
|
||||
err_map:
|
||||
for (mi--; mi>=0; mi--) {
|
||||
mi--;
|
||||
err_map_kobj:
|
||||
for (; mi >= 0; mi--) {
|
||||
mem = &idev->info->mem[mi];
|
||||
map = mem->map;
|
||||
kobject_put(&map->kobj);
|
||||
@@ -601,6 +605,7 @@ static int uio_vma_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
|
||||
struct uio_device *idev = vma->vm_private_data;
|
||||
struct page *page;
|
||||
unsigned long offset;
|
||||
void *addr;
|
||||
|
||||
int mi = uio_find_mem_index(vma);
|
||||
if (mi < 0)
|
||||
@@ -612,10 +617,11 @@ static int uio_vma_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
|
||||
*/
|
||||
offset = (vmf->pgoff - mi) << PAGE_SHIFT;
|
||||
|
||||
addr = (void *)(unsigned long)idev->info->mem[mi].addr + offset;
|
||||
if (idev->info->mem[mi].memtype == UIO_MEM_LOGICAL)
|
||||
page = virt_to_page(idev->info->mem[mi].addr + offset);
|
||||
page = virt_to_page(addr);
|
||||
else
|
||||
page = vmalloc_to_page((void *)(unsigned long)idev->info->mem[mi].addr + offset);
|
||||
page = vmalloc_to_page(addr);
|
||||
get_page(page);
|
||||
vmf->page = page;
|
||||
return 0;
|
||||
@@ -809,10 +815,9 @@ int __uio_register_device(struct module *owner,
|
||||
|
||||
info->uio_dev = NULL;
|
||||
|
||||
idev = kzalloc(sizeof(*idev), GFP_KERNEL);
|
||||
idev = devm_kzalloc(parent, sizeof(*idev), GFP_KERNEL);
|
||||
if (!idev) {
|
||||
ret = -ENOMEM;
|
||||
goto err_kzalloc;
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
idev->owner = owner;
|
||||
@@ -822,7 +827,7 @@ int __uio_register_device(struct module *owner,
|
||||
|
||||
ret = uio_get_minor(idev);
|
||||
if (ret)
|
||||
goto err_get_minor;
|
||||
return ret;
|
||||
|
||||
idev->dev = device_create(&uio_class, parent,
|
||||
MKDEV(uio_major, idev->minor), idev,
|
||||
@@ -840,7 +845,7 @@ int __uio_register_device(struct module *owner,
|
||||
info->uio_dev = idev;
|
||||
|
||||
if (info->irq && (info->irq != UIO_IRQ_CUSTOM)) {
|
||||
ret = request_irq(info->irq, uio_interrupt,
|
||||
ret = devm_request_irq(parent, info->irq, uio_interrupt,
|
||||
info->irq_flags, info->name, idev);
|
||||
if (ret)
|
||||
goto err_request_irq;
|
||||
@@ -854,9 +859,6 @@ err_uio_dev_add_attributes:
|
||||
device_destroy(&uio_class, MKDEV(uio_major, idev->minor));
|
||||
err_device_create:
|
||||
uio_free_minor(idev);
|
||||
err_get_minor:
|
||||
kfree(idev);
|
||||
err_kzalloc:
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(__uio_register_device);
|
||||
@@ -877,13 +879,9 @@ void uio_unregister_device(struct uio_info *info)
|
||||
|
||||
uio_free_minor(idev);
|
||||
|
||||
if (info->irq && (info->irq != UIO_IRQ_CUSTOM))
|
||||
free_irq(info->irq, idev);
|
||||
|
||||
uio_dev_del_attributes(idev);
|
||||
|
||||
device_destroy(&uio_class, MKDEV(uio_major, idev->minor));
|
||||
kfree(idev);
|
||||
|
||||
return;
|
||||
}
|
||||
|
@@ -147,7 +147,6 @@ static void remove(struct pci_dev *pdev)
|
||||
uio_unregister_device(info);
|
||||
pci_release_regions(pdev);
|
||||
pci_disable_device(pdev);
|
||||
pci_set_drvdata(pdev, NULL);
|
||||
iounmap(info->priv);
|
||||
|
||||
kfree(info);
|
||||
|
@@ -106,7 +106,6 @@ static void hilscher_pci_remove(struct pci_dev *dev)
|
||||
uio_unregister_device(info);
|
||||
pci_release_regions(dev);
|
||||
pci_disable_device(dev);
|
||||
pci_set_drvdata(dev, NULL);
|
||||
iounmap(info->mem[0].internal_addr);
|
||||
|
||||
kfree (info);
|
||||
|
@@ -42,7 +42,7 @@
|
||||
|
||||
enum mf624_interrupt_source {ADC, CTR4, ALL};
|
||||
|
||||
void mf624_disable_interrupt(enum mf624_interrupt_source source,
|
||||
static void mf624_disable_interrupt(enum mf624_interrupt_source source,
|
||||
struct uio_info *info)
|
||||
{
|
||||
void __iomem *INTCSR_reg = info->mem[0].internal_addr + INTCSR;
|
||||
@@ -70,7 +70,7 @@ void mf624_disable_interrupt(enum mf624_interrupt_source source,
|
||||
}
|
||||
}
|
||||
|
||||
void mf624_enable_interrupt(enum mf624_interrupt_source source,
|
||||
static void mf624_enable_interrupt(enum mf624_interrupt_source source,
|
||||
struct uio_info *info)
|
||||
{
|
||||
void __iomem *INTCSR_reg = info->mem[0].internal_addr + INTCSR;
|
||||
@@ -220,7 +220,6 @@ static void mf624_pci_remove(struct pci_dev *dev)
|
||||
uio_unregister_device(info);
|
||||
pci_release_regions(dev);
|
||||
pci_disable_device(dev);
|
||||
pci_set_drvdata(dev, NULL);
|
||||
|
||||
iounmap(info->mem[0].internal_addr);
|
||||
iounmap(info->mem[1].internal_addr);
|
||||
|
@@ -127,7 +127,6 @@ static void netx_pci_remove(struct pci_dev *dev)
|
||||
uio_unregister_device(info);
|
||||
pci_release_regions(dev);
|
||||
pci_disable_device(dev);
|
||||
pci_set_drvdata(dev, NULL);
|
||||
iounmap(info->mem[0].internal_addr);
|
||||
|
||||
kfree(info);
|
||||
|
@@ -112,11 +112,11 @@ static int uio_pdrv_genirq_probe(struct platform_device *pdev)
|
||||
|
||||
if (pdev->dev.of_node) {
|
||||
/* alloc uioinfo for one device */
|
||||
uioinfo = kzalloc(sizeof(*uioinfo), GFP_KERNEL);
|
||||
uioinfo = devm_kzalloc(&pdev->dev, sizeof(*uioinfo),
|
||||
GFP_KERNEL);
|
||||
if (!uioinfo) {
|
||||
ret = -ENOMEM;
|
||||
dev_err(&pdev->dev, "unable to kmalloc\n");
|
||||
return ret;
|
||||
return -ENOMEM;
|
||||
}
|
||||
uioinfo->name = pdev->dev.of_node->name;
|
||||
uioinfo->version = "devicetree";
|
||||
@@ -125,20 +125,19 @@ static int uio_pdrv_genirq_probe(struct platform_device *pdev)
|
||||
|
||||
if (!uioinfo || !uioinfo->name || !uioinfo->version) {
|
||||
dev_err(&pdev->dev, "missing platform_data\n");
|
||||
goto bad0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (uioinfo->handler || uioinfo->irqcontrol ||
|
||||
uioinfo->irq_flags & IRQF_SHARED) {
|
||||
dev_err(&pdev->dev, "interrupt configuration error\n");
|
||||
goto bad0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
priv = kzalloc(sizeof(*priv), GFP_KERNEL);
|
||||
priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
|
||||
if (!priv) {
|
||||
ret = -ENOMEM;
|
||||
dev_err(&pdev->dev, "unable to kmalloc\n");
|
||||
goto bad0;
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
priv->uioinfo = uioinfo;
|
||||
@@ -153,7 +152,7 @@ static int uio_pdrv_genirq_probe(struct platform_device *pdev)
|
||||
uioinfo->irq = UIO_IRQ_NONE;
|
||||
else if (ret < 0) {
|
||||
dev_err(&pdev->dev, "failed to get IRQ\n");
|
||||
goto bad1;
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -209,20 +208,12 @@ static int uio_pdrv_genirq_probe(struct platform_device *pdev)
|
||||
ret = uio_register_device(&pdev->dev, priv->uioinfo);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "unable to register uio device\n");
|
||||
goto bad2;
|
||||
pm_runtime_disable(&pdev->dev);
|
||||
return ret;
|
||||
}
|
||||
|
||||
platform_set_drvdata(pdev, priv);
|
||||
return 0;
|
||||
bad2:
|
||||
pm_runtime_disable(&pdev->dev);
|
||||
bad1:
|
||||
kfree(priv);
|
||||
bad0:
|
||||
/* kfree uioinfo for OF */
|
||||
if (pdev->dev.of_node)
|
||||
kfree(uioinfo);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int uio_pdrv_genirq_remove(struct platform_device *pdev)
|
||||
@@ -235,11 +226,6 @@ static int uio_pdrv_genirq_remove(struct platform_device *pdev)
|
||||
priv->uioinfo->handler = NULL;
|
||||
priv->uioinfo->irqcontrol = NULL;
|
||||
|
||||
/* kfree uioinfo for OF */
|
||||
if (pdev->dev.of_node)
|
||||
kfree(priv->uioinfo);
|
||||
|
||||
kfree(priv);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@@ -188,7 +188,6 @@ static void sercos3_pci_remove(struct pci_dev *dev)
|
||||
uio_unregister_device(info);
|
||||
pci_release_regions(dev);
|
||||
pci_disable_device(dev);
|
||||
pci_set_drvdata(dev, NULL);
|
||||
for (i = 0; i < 5; i++) {
|
||||
if (info->mem[i].internal_addr)
|
||||
iounmap(info->mem[i].internal_addr);
|
||||
|
Reference in New Issue
Block a user