aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpio/gpio-pl061.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpio/gpio-pl061.c')
-rw-r--r--drivers/gpio/gpio-pl061.c66
1 files changed, 23 insertions, 43 deletions
diff --git a/drivers/gpio/gpio-pl061.c b/drivers/gpio/gpio-pl061.c
index b4b5da4fd2cc..c1720de18a4f 100644
--- a/drivers/gpio/gpio-pl061.c
+++ b/drivers/gpio/gpio-pl061.c
@@ -48,12 +48,7 @@ struct pl061_context_save_regs {
48#endif 48#endif
49 49
50struct pl061_gpio { 50struct pl061_gpio {
51 /* Each of the two spinlocks protects a different set of hardware 51 spinlock_t lock;
52 * regiters and data structurs. This decouples the code of the IRQ from
53 * the GPIO code. This also makes the case of a GPIO routine call from
54 * the IRQ code simpler.
55 */
56 spinlock_t lock; /* GPIO registers */
57 52
58 void __iomem *base; 53 void __iomem *base;
59 int irq_base; 54 int irq_base;
@@ -216,39 +211,34 @@ static void __init pl061_init_gc(struct pl061_gpio *chip, int irq_base)
216 IRQ_GC_INIT_NESTED_LOCK, IRQ_NOREQUEST, 0); 211 IRQ_GC_INIT_NESTED_LOCK, IRQ_NOREQUEST, 0);
217} 212}
218 213
219static int pl061_probe(struct amba_device *dev, const struct amba_id *id) 214static int pl061_probe(struct amba_device *adev, const struct amba_id *id)
220{ 215{
221 struct pl061_platform_data *pdata; 216 struct device *dev = &adev->dev;
217 struct pl061_platform_data *pdata = dev->platform_data;
222 struct pl061_gpio *chip; 218 struct pl061_gpio *chip;
223 int ret, irq, i; 219 int ret, irq, i;
224 220
225 chip = kzalloc(sizeof(*chip), GFP_KERNEL); 221 chip = devm_kzalloc(dev, sizeof(*chip), GFP_KERNEL);
226 if (chip == NULL) 222 if (chip == NULL)
227 return -ENOMEM; 223 return -ENOMEM;
228 224
229 pdata = dev->dev.platform_data;
230 if (pdata) { 225 if (pdata) {
231 chip->gc.base = pdata->gpio_base; 226 chip->gc.base = pdata->gpio_base;
232 chip->irq_base = pdata->irq_base; 227 chip->irq_base = pdata->irq_base;
233 } else if (dev->dev.of_node) { 228 } else if (adev->dev.of_node) {
234 chip->gc.base = -1; 229 chip->gc.base = -1;
235 chip->irq_base = 0; 230 chip->irq_base = 0;
236 } else { 231 } else
237 ret = -ENODEV; 232 return -ENODEV;
238 goto free_mem;
239 }
240 233
241 if (!request_mem_region(dev->res.start, 234 if (!devm_request_mem_region(dev, adev->res.start,
242 resource_size(&dev->res), "pl061")) { 235 resource_size(&adev->res), "pl061"))
243 ret = -EBUSY; 236 return -EBUSY;
244 goto free_mem;
245 }
246 237
247 chip->base = ioremap(dev->res.start, resource_size(&dev->res)); 238 chip->base = devm_ioremap(dev, adev->res.start,
248 if (chip->base == NULL) { 239 resource_size(&adev->res));
249 ret = -ENOMEM; 240 if (chip->base == NULL)
250 goto release_region; 241 return -ENOMEM;
251 }
252 242
253 spin_lock_init(&chip->lock); 243 spin_lock_init(&chip->lock);
254 244
@@ -258,13 +248,13 @@ static int pl061_probe(struct amba_device *dev, const struct amba_id *id)
258 chip->gc.set = pl061_set_value; 248 chip->gc.set = pl061_set_value;
259 chip->gc.to_irq = pl061_to_irq; 249 chip->gc.to_irq = pl061_to_irq;
260 chip->gc.ngpio = PL061_GPIO_NR; 250 chip->gc.ngpio = PL061_GPIO_NR;
261 chip->gc.label = dev_name(&dev->dev); 251 chip->gc.label = dev_name(dev);
262 chip->gc.dev = &dev->dev; 252 chip->gc.dev = dev;
263 chip->gc.owner = THIS_MODULE; 253 chip->gc.owner = THIS_MODULE;
264 254
265 ret = gpiochip_add(&chip->gc); 255 ret = gpiochip_add(&chip->gc);
266 if (ret) 256 if (ret)
267 goto iounmap; 257 return ret;
268 258
269 /* 259 /*
270 * irq_chip support 260 * irq_chip support
@@ -276,11 +266,10 @@ static int pl061_probe(struct amba_device *dev, const struct amba_id *id)
276 pl061_init_gc(chip, chip->irq_base); 266 pl061_init_gc(chip, chip->irq_base);
277 267
278 writeb(0, chip->base + GPIOIE); /* disable irqs */ 268 writeb(0, chip->base + GPIOIE); /* disable irqs */
279 irq = dev->irq[0]; 269 irq = adev->irq[0];
280 if (irq < 0) { 270 if (irq < 0)
281 ret = -ENODEV; 271 return -ENODEV;
282 goto iounmap; 272
283 }
284 irq_set_chained_handler(irq, pl061_irq_handler); 273 irq_set_chained_handler(irq, pl061_irq_handler);
285 irq_set_handler_data(irq, chip); 274 irq_set_handler_data(irq, chip);
286 275
@@ -294,18 +283,9 @@ static int pl061_probe(struct amba_device *dev, const struct amba_id *id)
294 } 283 }
295 } 284 }
296 285
297 amba_set_drvdata(dev, chip); 286 amba_set_drvdata(adev, chip);
298 287
299 return 0; 288 return 0;
300
301iounmap:
302 iounmap(chip->base);
303release_region:
304 release_mem_region(dev->res.start, resource_size(&dev->res));
305free_mem:
306 kfree(chip);
307
308 return ret;
309} 289}
310 290
311#ifdef CONFIG_PM 291#ifdef CONFIG_PM