diff options
Diffstat (limited to 'drivers/uio')
| -rw-r--r-- | drivers/uio/uio.c | 57 | ||||
| -rw-r--r-- | drivers/uio/uio_aec.c | 1 | ||||
| -rw-r--r-- | drivers/uio/uio_cif.c | 1 | ||||
| -rw-r--r-- | drivers/uio/uio_dmem_genirq.c | 4 | ||||
| -rw-r--r-- | drivers/uio/uio_mf624.c | 7 | ||||
| -rw-r--r-- | drivers/uio/uio_netx.c | 1 | ||||
| -rw-r--r-- | drivers/uio/uio_pdrv_genirq.c | 34 | ||||
| -rw-r--r-- | drivers/uio/uio_pruss.c | 6 | ||||
| -rw-r--r-- | drivers/uio/uio_sercos3.c | 1 | 
9 files changed, 52 insertions, 60 deletions
diff --git a/drivers/uio/uio.c b/drivers/uio/uio.c index ba475632c5f..a673e5b6a2e 100644 --- a/drivers/uio/uio.c +++ b/drivers/uio/uio.c @@ -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; @@ -642,16 +648,31 @@ static int uio_mmap_physical(struct vm_area_struct *vma)  {  	struct uio_device *idev = vma->vm_private_data;  	int mi = uio_find_mem_index(vma); +	struct uio_mem *mem;  	if (mi < 0)  		return -EINVAL; +	mem = idev->info->mem + mi; -	vma->vm_ops = &uio_physical_vm_ops; +	if (mem->addr & ~PAGE_MASK) +		return -ENODEV; +	if (vma->vm_end - vma->vm_start > mem->size) +		return -EINVAL; +	vma->vm_ops = &uio_physical_vm_ops;  	vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot); +	/* +	 * We cannot use the vm_iomap_memory() helper here, +	 * because vma->vm_pgoff is the map index we looked +	 * up above in uio_find_mem_index(), rather than an +	 * actual page offset into the mmap. +	 * +	 * So we just do the physical mmap without a page +	 * offset. +	 */  	return remap_pfn_range(vma,  			       vma->vm_start, -			       idev->info->mem[mi].addr >> PAGE_SHIFT, +			       mem->addr >> PAGE_SHIFT,  			       vma->vm_end - vma->vm_start,  			       vma->vm_page_prot);  } @@ -796,10 +817,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; @@ -809,7 +829,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, @@ -827,7 +847,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(idev->dev, info->irq, uio_interrupt,  				  info->irq_flags, info->name, idev);  		if (ret)  			goto err_request_irq; @@ -841,9 +861,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); @@ -864,13 +881,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;  } diff --git a/drivers/uio/uio_aec.c b/drivers/uio/uio_aec.c index f3611c2d83b..1549fab633c 100644 --- a/drivers/uio/uio_aec.c +++ b/drivers/uio/uio_aec.c @@ -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); diff --git a/drivers/uio/uio_cif.c b/drivers/uio/uio_cif.c index 22cdf385ab3..30f533ce375 100644 --- a/drivers/uio/uio_cif.c +++ b/drivers/uio/uio_cif.c @@ -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); diff --git a/drivers/uio/uio_dmem_genirq.c b/drivers/uio/uio_dmem_genirq.c index 1270f3b2613..8d0bba46956 100644 --- a/drivers/uio/uio_dmem_genirq.c +++ b/drivers/uio/uio_dmem_genirq.c @@ -204,7 +204,7 @@ static int uio_dmem_genirq_probe(struct platform_device *pdev)  		ret = platform_get_irq(pdev, 0);  		if (ret < 0) {  			dev_err(&pdev->dev, "failed to get IRQ\n"); -			goto bad0; +			goto bad1;  		}  		uioinfo->irq = ret;  	} @@ -275,6 +275,7 @@ static int uio_dmem_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"); +		pm_runtime_disable(&pdev->dev);  		goto bad1;  	} @@ -282,7 +283,6 @@ static int uio_dmem_genirq_probe(struct platform_device *pdev)  	return 0;   bad1:  	kfree(priv); -	pm_runtime_disable(&pdev->dev);   bad0:  	/* kfree uioinfo for OF */  	if (pdev->dev.of_node) diff --git a/drivers/uio/uio_mf624.c b/drivers/uio/uio_mf624.c index a1768b2f449..d1f95a1567b 100644 --- a/drivers/uio/uio_mf624.c +++ b/drivers/uio/uio_mf624.c @@ -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); @@ -229,7 +228,7 @@ static void mf624_pci_remove(struct pci_dev *dev)  	kfree(info);  } -static DEFINE_PCI_DEVICE_TABLE(mf624_pci_id) = { +static const struct pci_device_id mf624_pci_id[] = {  	{ PCI_DEVICE(PCI_VENDOR_ID_HUMUSOFT, PCI_DEVICE_ID_MF624) },  	{ 0, }  }; diff --git a/drivers/uio/uio_netx.c b/drivers/uio/uio_netx.c index 28a766b9e19..4c345db8b01 100644 --- a/drivers/uio/uio_netx.c +++ b/drivers/uio/uio_netx.c @@ -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); diff --git a/drivers/uio/uio_pdrv_genirq.c b/drivers/uio/uio_pdrv_genirq.c index 90ff17a0202..76669313e9a 100644 --- a/drivers/uio/uio_pdrv_genirq.c +++ b/drivers/uio/uio_pdrv_genirq.c @@ -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;  } diff --git a/drivers/uio/uio_pruss.c b/drivers/uio/uio_pruss.c index f519da9034b..96c4a19b191 100644 --- a/drivers/uio/uio_pruss.c +++ b/drivers/uio/uio_pruss.c @@ -158,14 +158,12 @@ static int pruss_probe(struct platform_device *dev)  	if (pdata->sram_pool) {  		gdev->sram_pool = pdata->sram_pool;  		gdev->sram_vaddr = -			gen_pool_alloc(gdev->sram_pool, sram_pool_sz); +			(unsigned long)gen_pool_dma_alloc(gdev->sram_pool, +					sram_pool_sz, &gdev->sram_paddr);  		if (!gdev->sram_vaddr) {  			dev_err(&dev->dev, "Could not allocate SRAM pool\n");  			goto out_free;  		} -		gdev->sram_paddr = -			gen_pool_virt_to_phys(gdev->sram_pool, -					      gdev->sram_vaddr);  	}  	gdev->ddr_vaddr = dma_alloc_coherent(&dev->dev, extram_pool_sz, diff --git a/drivers/uio/uio_sercos3.c b/drivers/uio/uio_sercos3.c index 54198321708..9cfdfcafa26 100644 --- a/drivers/uio/uio_sercos3.c +++ b/drivers/uio/uio_sercos3.c @@ -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);  | 
