Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

spi: dw: use managed resources

Migrate mmio code and core driver to managed resources to reduce boilerplate
error handling code. Also, handle clk_enable() failure while at it, and drop
unused dw_spi iolen field.

Signed-off-by: Baruch Siach <baruch@tkos.co.il>
Signed-off-by: Mark Brown <broonie@linaro.org>

authored by

Baruch Siach and committed by
Mark Brown
04f421e7 0a47d3c4

+37 -97
+20 -50
drivers/spi/spi-dw-mmio.c
··· 30 30 { 31 31 struct dw_spi_mmio *dwsmmio; 32 32 struct dw_spi *dws; 33 - struct resource *mem, *ioarea; 33 + struct resource *mem; 34 34 int ret; 35 35 36 - dwsmmio = kzalloc(sizeof(struct dw_spi_mmio), GFP_KERNEL); 37 - if (!dwsmmio) { 38 - ret = -ENOMEM; 39 - goto err_end; 40 - } 36 + dwsmmio = devm_kzalloc(&pdev->dev, sizeof(struct dw_spi_mmio), 37 + GFP_KERNEL); 38 + if (!dwsmmio) 39 + return -ENOMEM; 41 40 42 41 dws = &dwsmmio->dws; 43 42 ··· 44 45 mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); 45 46 if (!mem) { 46 47 dev_err(&pdev->dev, "no mem resource?\n"); 47 - ret = -EINVAL; 48 - goto err_kfree; 48 + return -EINVAL; 49 49 } 50 50 51 - ioarea = request_mem_region(mem->start, resource_size(mem), 52 - pdev->name); 53 - if (!ioarea) { 54 - dev_err(&pdev->dev, "SPI region already claimed\n"); 55 - ret = -EBUSY; 56 - goto err_kfree; 57 - } 58 - 59 - dws->regs = ioremap_nocache(mem->start, resource_size(mem)); 60 - if (!dws->regs) { 61 - dev_err(&pdev->dev, "SPI region already mapped\n"); 62 - ret = -ENOMEM; 63 - goto err_release_reg; 51 + dws->regs = devm_ioremap_resource(&pdev->dev, mem); 52 + if (IS_ERR(dws->regs)) { 53 + dev_err(&pdev->dev, "SPI region map failed\n"); 54 + return PTR_ERR(dws->regs); 64 55 } 65 56 66 57 dws->irq = platform_get_irq(pdev, 0); 67 58 if (dws->irq < 0) { 68 59 dev_err(&pdev->dev, "no irq resource?\n"); 69 - ret = dws->irq; /* -ENXIO */ 70 - goto err_unmap; 60 + return dws->irq; /* -ENXIO */ 71 61 } 72 62 73 - dwsmmio->clk = clk_get(&pdev->dev, NULL); 74 - if (IS_ERR(dwsmmio->clk)) { 75 - ret = PTR_ERR(dwsmmio->clk); 76 - goto err_unmap; 77 - } 78 - clk_enable(dwsmmio->clk); 63 + dwsmmio->clk = devm_clk_get(&pdev->dev, NULL); 64 + if (IS_ERR(dwsmmio->clk)) 65 + return PTR_ERR(dwsmmio->clk); 66 + ret = clk_enable(dwsmmio->clk); 67 + if (ret) 68 + return ret; 79 69 80 - dws->parent_dev = &pdev->dev; 81 70 dws->bus_num = 0; 82 71 dws->num_cs = 4; 83 72 dws->max_freq = clk_get_rate(dwsmmio->clk); 84 73 85 - ret = dw_spi_add_host(dws); 74 + ret = dw_spi_add_host(&pdev->dev, dws); 86 75 if (ret) 87 - goto err_clk; 76 + goto out; 88 77 89 78 platform_set_drvdata(pdev, dwsmmio); 90 79 return 0; 91 80 92 - err_clk: 81 + out: 93 82 clk_disable(dwsmmio->clk); 94 - clk_put(dwsmmio->clk); 95 - dwsmmio->clk = NULL; 96 - err_unmap: 97 - iounmap(dws->regs); 98 - err_release_reg: 99 - release_mem_region(mem->start, resource_size(mem)); 100 - err_kfree: 101 - kfree(dwsmmio); 102 - err_end: 103 83 return ret; 104 84 } 105 85 106 86 static int dw_spi_mmio_remove(struct platform_device *pdev) 107 87 { 108 88 struct dw_spi_mmio *dwsmmio = platform_get_drvdata(pdev); 109 - struct resource *mem; 110 89 111 90 clk_disable(dwsmmio->clk); 112 - clk_put(dwsmmio->clk); 113 - dwsmmio->clk = NULL; 114 - 115 91 dw_spi_remove_host(&dwsmmio->dws); 116 - iounmap(dwsmmio->dws.regs); 117 - kfree(dwsmmio); 118 92 119 - mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); 120 - release_mem_region(mem->start, resource_size(mem)); 121 93 return 0; 122 94 } 123 95
+10 -30
drivers/spi/spi-dw-pci.c
··· 43 43 dev_info(&pdev->dev, "found PCI SPI controller(ID: %04x:%04x)\n", 44 44 pdev->vendor, pdev->device); 45 45 46 - ret = pci_enable_device(pdev); 46 + ret = pcim_enable_device(pdev); 47 47 if (ret) 48 48 return ret; 49 49 50 - dwpci = kzalloc(sizeof(struct dw_spi_pci), GFP_KERNEL); 51 - if (!dwpci) { 52 - ret = -ENOMEM; 53 - goto err_disable; 54 - } 50 + dwpci = devm_kzalloc(&pdev-dev, sizeof(struct dw_spi_pci), GFP_KERNEL); 51 + if (!dwpci) 52 + return -ENOMEM; 55 53 56 54 dwpci->pdev = pdev; 57 55 dws = &dwpci->dws; 58 56 59 57 /* Get basic io resource and map it */ 60 58 dws->paddr = pci_resource_start(pdev, pci_bar); 61 - dws->iolen = pci_resource_len(pdev, pci_bar); 62 59 63 - ret = pci_request_region(pdev, pci_bar, dev_name(&pdev->dev)); 60 + ret = pcim_iomap_regions(pdev, 1, dev_name(&pdev->dev)); 64 61 if (ret) 65 - goto err_kfree; 62 + return ret; 66 63 67 - dws->regs = ioremap_nocache((unsigned long)dws->paddr, 68 - pci_resource_len(pdev, pci_bar)); 69 - if (!dws->regs) { 70 - ret = -ENOMEM; 71 - goto err_release_reg; 72 - } 73 - 74 - dws->parent_dev = &pdev->dev; 75 64 dws->bus_num = 0; 76 65 dws->num_cs = 4; 77 66 dws->irq = pdev->irq; ··· 72 83 if (pdev->device == 0x0800) { 73 84 ret = dw_spi_mid_init(dws); 74 85 if (ret) 75 - goto err_unmap; 86 + return ret; 76 87 } 77 88 78 - ret = dw_spi_add_host(dws); 89 + ret = dw_spi_add_host(&pdev->dev, dws); 79 90 if (ret) 80 - goto err_unmap; 91 + return ret; 81 92 82 93 /* PCI hook and SPI hook use the same drv data */ 83 94 pci_set_drvdata(pdev, dwpci); 84 - return 0; 85 95 86 - err_unmap: 87 - iounmap(dws->regs); 88 - err_release_reg: 89 - pci_release_region(pdev, pci_bar); 90 - err_kfree: 91 - kfree(dwpci); 92 - err_disable: 93 - pci_disable_device(pdev); 94 - return ret; 96 + return 0; 95 97 } 96 98 97 99 static void spi_pci_remove(struct pci_dev *pdev)
+6 -14
drivers/spi/spi-dw.c
··· 775 775 } 776 776 } 777 777 778 - int dw_spi_add_host(struct dw_spi *dws) 778 + int dw_spi_add_host(struct device *dev, struct dw_spi *dws) 779 779 { 780 780 struct spi_master *master; 781 781 int ret; 782 782 783 783 BUG_ON(dws == NULL); 784 784 785 - master = spi_alloc_master(dws->parent_dev, 0); 786 - if (!master) { 787 - ret = -ENOMEM; 788 - goto exit; 789 - } 785 + master = spi_alloc_master(dev, 0); 786 + if (!master) 787 + return -ENOMEM; 790 788 791 789 dws->master = master; 792 790 dws->type = SSI_MOTO_SPI; ··· 794 796 snprintf(dws->name, sizeof(dws->name), "dw_spi%d", 795 797 dws->bus_num); 796 798 797 - ret = request_irq(dws->irq, dw_spi_irq, IRQF_SHARED, 799 + ret = devm_request_irq(dev, dws->irq, dw_spi_irq, IRQF_SHARED, 798 800 dws->name, dws); 799 801 if (ret < 0) { 800 802 dev_err(&master->dev, "can not get IRQ\n"); ··· 833 835 } 834 836 835 837 spi_master_set_devdata(master, dws); 836 - ret = spi_register_master(master); 838 + ret = devm_spi_register_master(dev, master); 837 839 if (ret) { 838 840 dev_err(&master->dev, "problem registering spi master\n"); 839 841 goto err_queue_alloc; ··· 848 850 dws->dma_ops->dma_exit(dws); 849 851 err_diable_hw: 850 852 spi_enable_chip(dws, 0); 851 - free_irq(dws->irq, dws); 852 853 err_free_master: 853 854 spi_master_put(master); 854 - exit: 855 855 return ret; 856 856 } 857 857 EXPORT_SYMBOL_GPL(dw_spi_add_host); ··· 873 877 spi_enable_chip(dws, 0); 874 878 /* Disable clk */ 875 879 spi_set_clk(dws, 0); 876 - free_irq(dws->irq, dws); 877 - 878 - /* Disconnect from the SPI framework */ 879 - spi_unregister_master(dws->master); 880 880 } 881 881 EXPORT_SYMBOL_GPL(dw_spi_remove_host); 882 882
+1 -3
drivers/spi/spi-dw.h
··· 92 92 struct dw_spi { 93 93 struct spi_master *master; 94 94 struct spi_device *cur_dev; 95 - struct device *parent_dev; 96 95 enum dw_ssi_type type; 97 96 char name[16]; 98 97 99 98 void __iomem *regs; 100 99 unsigned long paddr; 101 - u32 iolen; 102 100 int irq; 103 101 u32 fifo_len; /* depth of the FIFO buffer */ 104 102 u32 max_freq; /* max bus freq supported */ ··· 228 230 void (*cs_control)(u32 command); 229 231 }; 230 232 231 - extern int dw_spi_add_host(struct dw_spi *dws); 233 + extern int dw_spi_add_host(struct device *dev, struct dw_spi *dws); 232 234 extern void dw_spi_remove_host(struct dw_spi *dws); 233 235 extern int dw_spi_suspend_host(struct dw_spi *dws); 234 236 extern int dw_spi_resume_host(struct dw_spi *dws);