summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>2018-11-07 14:18:04 -0500
committerAndy Shevchenko <andriy.shevchenko@linux.intel.com>2018-12-02 08:40:21 -0500
commit9381fc5d655d172af737b5f16749a63e4b931040 (patch)
tree7d87139a8a0e62c85c9326de51ae234ed0ed8c93
parent6ad02b29b836b6180263f14cc41147f4cb6d6a70 (diff)
gpio: sodaville: Convert to use managed functions pcim_* and devm_*
This makes the error handling much more simpler than open-coding everything and in addition makes the probe function smaller an tidier. Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
-rw-r--r--drivers/gpio/gpio-sodaville.c52
1 files changed, 18 insertions, 34 deletions
diff --git a/drivers/gpio/gpio-sodaville.c b/drivers/gpio/gpio-sodaville.c
index f60da83349ef..633f363946b7 100644
--- a/drivers/gpio/gpio-sodaville.c
+++ b/drivers/gpio/gpio-sodaville.c
@@ -155,8 +155,10 @@ static int sdv_register_irqsupport(struct sdv_gpio_chip_data *sd,
155 * we unmask & ACK the IRQ before the source of the interrupt is gone 155 * we unmask & ACK the IRQ before the source of the interrupt is gone
156 * then the interrupt is active again. 156 * then the interrupt is active again.
157 */ 157 */
158 sd->gc = irq_alloc_generic_chip("sdv-gpio", 1, sd->irq_base, 158 sd->gc = devm_irq_alloc_generic_chip(&pdev->dev, "sdv-gpio", 1,
159 sd->gpio_pub_base, handle_fasteoi_irq); 159 sd->irq_base,
160 sd->gpio_pub_base,
161 handle_fasteoi_irq);
160 if (!sd->gc) 162 if (!sd->gc)
161 return -ENOMEM; 163 return -ENOMEM;
162 164
@@ -186,70 +188,52 @@ static int sdv_gpio_probe(struct pci_dev *pdev,
186 const struct pci_device_id *pci_id) 188 const struct pci_device_id *pci_id)
187{ 189{
188 struct sdv_gpio_chip_data *sd; 190 struct sdv_gpio_chip_data *sd;
189 unsigned long addr;
190 const void *prop;
191 int len;
192 int ret; 191 int ret;
193 u32 mux_val; 192 u32 mux_val;
194 193
195 sd = kzalloc(sizeof(struct sdv_gpio_chip_data), GFP_KERNEL); 194 sd = devm_kzalloc(&pdev->dev, sizeof(*sd), GFP_KERNEL);
196 if (!sd) 195 if (!sd)
197 return -ENOMEM; 196 return -ENOMEM;
198 ret = pci_enable_device(pdev); 197
198 ret = pcim_enable_device(pdev);
199 if (ret) { 199 if (ret) {
200 dev_err(&pdev->dev, "can't enable device.\n"); 200 dev_err(&pdev->dev, "can't enable device.\n");
201 goto done; 201 return ret;
202 } 202 }
203 203
204 ret = pci_request_region(pdev, GPIO_BAR, DRV_NAME); 204 ret = pcim_iomap_regions(pdev, 1 << GPIO_BAR, DRV_NAME);
205 if (ret) { 205 if (ret) {
206 dev_err(&pdev->dev, "can't alloc PCI BAR #%d\n", GPIO_BAR); 206 dev_err(&pdev->dev, "can't alloc PCI BAR #%d\n", GPIO_BAR);
207 goto disable_pci; 207 return ret;
208 } 208 }
209 209
210 addr = pci_resource_start(pdev, GPIO_BAR); 210 sd->gpio_pub_base = pcim_iomap_table(pdev)[GPIO_BAR];
211 if (!addr) {
212 ret = -ENODEV;
213 goto release_reg;
214 }
215 sd->gpio_pub_base = ioremap(addr, pci_resource_len(pdev, GPIO_BAR));
216 211
217 prop = of_get_property(pdev->dev.of_node, "intel,muxctl", &len); 212 ret = of_property_read_u32(pdev->dev.of_node, "intel,muxctl", &mux_val);
218 if (prop && len == 4) { 213 if (!ret)
219 mux_val = of_read_number(prop, 1);
220 writel(mux_val, sd->gpio_pub_base + GPMUXCTL); 214 writel(mux_val, sd->gpio_pub_base + GPMUXCTL);
221 }
222 215
223 ret = bgpio_init(&sd->chip, &pdev->dev, 4, 216 ret = bgpio_init(&sd->chip, &pdev->dev, 4,
224 sd->gpio_pub_base + GPINR, sd->gpio_pub_base + GPOUTR, 217 sd->gpio_pub_base + GPINR, sd->gpio_pub_base + GPOUTR,
225 NULL, sd->gpio_pub_base + GPOER, NULL, 0); 218 NULL, sd->gpio_pub_base + GPOER, NULL, 0);
226 if (ret) 219 if (ret)
227 goto unmap; 220 return ret;
221
228 sd->chip.ngpio = SDV_NUM_PUB_GPIOS; 222 sd->chip.ngpio = SDV_NUM_PUB_GPIOS;
229 223
230 ret = gpiochip_add_data(&sd->chip, sd); 224 ret = devm_gpiochip_add_data(&pdev->dev, &sd->chip, sd);
231 if (ret < 0) { 225 if (ret < 0) {
232 dev_err(&pdev->dev, "gpiochip_add() failed.\n"); 226 dev_err(&pdev->dev, "gpiochip_add() failed.\n");
233 goto unmap; 227 return ret;
234 } 228 }
235 229
236 ret = sdv_register_irqsupport(sd, pdev); 230 ret = sdv_register_irqsupport(sd, pdev);
237 if (ret) 231 if (ret)
238 goto unmap; 232 return ret;
239 233
240 pci_set_drvdata(pdev, sd); 234 pci_set_drvdata(pdev, sd);
241 dev_info(&pdev->dev, "Sodaville GPIO driver registered.\n"); 235 dev_info(&pdev->dev, "Sodaville GPIO driver registered.\n");
242 return 0; 236 return 0;
243
244unmap:
245 iounmap(sd->gpio_pub_base);
246release_reg:
247 pci_release_region(pdev, GPIO_BAR);
248disable_pci:
249 pci_disable_device(pdev);
250done:
251 kfree(sd);
252 return ret;
253} 237}
254 238
255static const struct pci_device_id sdv_gpio_pci_ids[] = { 239static const struct pci_device_id sdv_gpio_pci_ids[] = {