From 4204d0f3c090c0d271f01320805b4e592a88d00d Mon Sep 17 00:00:00 2001 From: Jeremy Gebben Date: Thu, 1 Mar 2012 16:06:21 -0700 Subject: [PATCH] msm: kgsl: use devres for register memory and irq This simplfies probe error handling. Change-Id: Ic5b333fd0d3209d9d3a655c2785191aead85f44f Signed-off-by: Jeremy Gebben --- drivers/gpu/msm/kgsl.c | 43 ++++++++++++++---------------------------- 1 file changed, 14 insertions(+), 29 deletions(-) diff --git a/drivers/gpu/msm/kgsl.c b/drivers/gpu/msm/kgsl.c index 9385659d6cc..adf27729862 100644 --- a/drivers/gpu/msm/kgsl.c +++ b/drivers/gpu/msm/kgsl.c @@ -25,6 +25,8 @@ #include #include #include +#include +#include #include "kgsl.h" #include "kgsl_debugfs.h" @@ -2431,19 +2433,20 @@ int kgsl_device_platform_probe(struct kgsl_device *device) device->reg_phys = res->start; device->reg_len = resource_size(res); - if (!request_mem_region(device->reg_phys, device->reg_len, - device->name)) { + if (!devm_request_mem_region(device->dev, device->reg_phys, + device->reg_len, device->name)) { KGSL_DRV_ERR(device, "request_mem_region failed\n"); status = -ENODEV; goto error_pwrctrl_close; } - device->reg_virt = ioremap(device->reg_phys, device->reg_len); + device->reg_virt = devm_ioremap(device->dev, device->reg_phys, + device->reg_len); if (device->reg_virt == NULL) { KGSL_DRV_ERR(device, "ioremap failed\n"); status = -ENODEV; - goto error_release_mem; + goto error_pwrctrl_close; } /*acquire interrupt */ device->pwrctrl.interrupt_num = @@ -2453,15 +2456,16 @@ int kgsl_device_platform_probe(struct kgsl_device *device) KGSL_DRV_ERR(device, "platform_get_irq_byname failed: %d\n", device->pwrctrl.interrupt_num); status = -EINVAL; - goto error_iounmap; + goto error_pwrctrl_close; } - status = request_irq(device->pwrctrl.interrupt_num, kgsl_irq_handler, - IRQF_TRIGGER_HIGH, device->name, device); + status = devm_request_irq(device->dev, device->pwrctrl.interrupt_num, + kgsl_irq_handler, IRQF_TRIGGER_HIGH, + device->name, device); if (status) { KGSL_DRV_ERR(device, "request_irq(%d) failed: %d\n", device->pwrctrl.interrupt_num, status); - goto error_iounmap; + goto error_pwrctrl_close; } disable_irq(device->pwrctrl.interrupt_num); @@ -2472,14 +2476,14 @@ int kgsl_device_platform_probe(struct kgsl_device *device) result = kgsl_drm_init(pdev); if (result) - goto error_irq; + goto error_pwrctrl_close; kgsl_cffdump_open(device->id); setup_timer(&device->idle_timer, kgsl_timer, (unsigned long) device); status = kgsl_create_device_workqueue(device); if (status) - goto error_irq; + goto error_pwrctrl_close; status = kgsl_mmu_init(device); if (status != 0) { @@ -2513,14 +2517,6 @@ error_close_mmu: error_dest_work_q: destroy_workqueue(device->work_queue); device->work_queue = NULL; -error_irq: - free_irq(device->pwrctrl.interrupt_num, NULL); - device->pwrctrl.interrupt_num = 0; -error_iounmap: - iounmap(device->reg_virt); - device->reg_virt = NULL; -error_release_mem: - release_mem_region(device->reg_phys, device->reg_len); error_pwrctrl_close: kgsl_pwrctrl_close(device); error: @@ -2531,7 +2527,6 @@ EXPORT_SYMBOL(kgsl_device_platform_probe); void kgsl_device_platform_remove(struct kgsl_device *device) { - kgsl_device_snapshot_close(device); kgsl_cffdump_close(device->id); @@ -2550,16 +2545,6 @@ void kgsl_device_platform_remove(struct kgsl_device *device) destroy_workqueue(device->work_queue); device->work_queue = NULL; } - if (device->reg_virt != NULL) { - iounmap(device->reg_virt); - device->reg_virt = NULL; - release_mem_region(device->reg_phys, device->reg_len); - } - if (device->pwrctrl.interrupt_num > 0) { - free_irq(device->pwrctrl.interrupt_num, NULL); - device->pwrctrl.interrupt_num = 0; - } - kgsl_pwrctrl_close(device); _unregister_device(device);