msm: kgsl: use devres for register memory and irq
This simplfies probe error handling.
Change-Id: Ic5b333fd0d3209d9d3a655c2785191aead85f44f
Signed-off-by: Jeremy Gebben <jgebben@codeaurora.org>
diff --git a/drivers/gpu/msm/kgsl.c b/drivers/gpu/msm/kgsl.c
index 9385659..adf2772 100644
--- a/drivers/gpu/msm/kgsl.c
+++ b/drivers/gpu/msm/kgsl.c
@@ -25,6 +25,8 @@
#include <linux/ashmem.h>
#include <linux/major.h>
#include <linux/ion.h>
+#include <linux/io.h>
+#include <mach/socinfo.h>
#include "kgsl.h"
#include "kgsl_debugfs.h"
@@ -2431,19 +2433,20 @@
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 @@
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 @@
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_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 @@
void kgsl_device_platform_remove(struct kgsl_device *device)
{
-
kgsl_device_snapshot_close(device);
kgsl_cffdump_close(device->id);
@@ -2550,16 +2545,6 @@
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);