diff options
author | Andy Shevchenko <andriy.shevchenko@linux.intel.com> | 2018-11-07 14:18:04 -0500 |
---|---|---|
committer | Andy Shevchenko <andriy.shevchenko@linux.intel.com> | 2018-12-02 08:40:21 -0500 |
commit | 9381fc5d655d172af737b5f16749a63e4b931040 (patch) | |
tree | 7d87139a8a0e62c85c9326de51ae234ed0ed8c93 | |
parent | 6ad02b29b836b6180263f14cc41147f4cb6d6a70 (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.c | 52 |
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 | |||
244 | unmap: | ||
245 | iounmap(sd->gpio_pub_base); | ||
246 | release_reg: | ||
247 | pci_release_region(pdev, GPIO_BAR); | ||
248 | disable_pci: | ||
249 | pci_disable_device(pdev); | ||
250 | done: | ||
251 | kfree(sd); | ||
252 | return ret; | ||
253 | } | 237 | } |
254 | 238 | ||
255 | static const struct pci_device_id sdv_gpio_pci_ids[] = { | 239 | static const struct pci_device_id sdv_gpio_pci_ids[] = { |