summaryrefslogtreecommitdiff
path: root/drivers/misc/m4sensorhub_stillmode.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/misc/m4sensorhub_stillmode.c')
-rw-r--r--drivers/misc/m4sensorhub_stillmode.c98
1 files changed, 59 insertions, 39 deletions
diff --git a/drivers/misc/m4sensorhub_stillmode.c b/drivers/misc/m4sensorhub_stillmode.c
index 3fa61219245..bfd56cc28a7 100644
--- a/drivers/misc/m4sensorhub_stillmode.c
+++ b/drivers/misc/m4sensorhub_stillmode.c
@@ -224,6 +224,57 @@ static DEVICE_ATTR(state, 0664, m4_stillmode_getstate,
static DEVICE_ATTR(timeout, 0664, m4_stillmode_get_timeout,
m4_stillmode_set_timeout);
+static int stillmode_driver_init(struct m4sensorhub_data *m4sensorhub)
+{
+ int ret;
+
+ ret = m4sensorhub_irq_register(m4sensorhub, M4SH_IRQ_STILL_DETECTED,
+ m4_handle_stillmode_irq,
+ g_stillmode_data);
+
+ if (ret < 0) {
+ KDEBUG(M4SH_ERROR, "Error registering still mode IRQ: %d\n",
+ ret);
+ return ret;
+ }
+
+ ret = m4sensorhub_irq_enable(m4sensorhub, M4SH_IRQ_STILL_DETECTED);
+ if (ret < 0) {
+ KDEBUG(M4SH_ERROR, "Error enabling still mode int: %d\n",
+ ret);
+ goto unregister_still_irq;
+ }
+
+ ret = m4sensorhub_irq_register(m4sensorhub, M4SH_IRQ_MOTION_DETECTED,
+ m4_handle_stillmode_irq,
+ g_stillmode_data);
+
+ if (ret < 0) {
+ KDEBUG(M4SH_ERROR, "Error registering moving mode IRQ: %d\n",
+ ret);
+ goto disable_still_irq;
+ }
+
+ ret = m4sensorhub_irq_enable(m4sensorhub, M4SH_IRQ_MOTION_DETECTED);
+ if (ret < 0) {
+ KDEBUG(M4SH_ERROR, "Error enabling moving mode int: %d\n",
+ ret);
+ goto unregister_moving_irq;
+ }
+
+ /* initialize timer on M4 */
+ m4sensorhub_stillmode_exit();
+ return ret;
+
+unregister_moving_irq:
+ m4sensorhub_irq_unregister(m4sensorhub, M4SH_IRQ_MOTION_DETECTED);
+disable_still_irq:
+ m4sensorhub_irq_disable(m4sensorhub, M4SH_IRQ_STILL_DETECTED);
+unregister_still_irq:
+ m4sensorhub_irq_unregister(m4sensorhub, M4SH_IRQ_STILL_DETECTED);
+ return ret;
+}
+
static int stillmode_client_probe(struct platform_device *pdev)
{
int ret = -1;
@@ -267,42 +318,19 @@ static int stillmode_client_probe(struct platform_device *pdev)
STILLMODE_CLIENT_DRIVER_NAME);
INIT_WORK(&stillmode_client_data->queued_work,
- m4sensorhub_stillmode_work);
+ m4sensorhub_stillmode_work);
- ret = m4sensorhub_irq_register(m4sensorhub, M4SH_IRQ_STILL_DETECTED,
- m4_handle_stillmode_irq,
- stillmode_client_data);
+ ret = m4sensorhub_register_initcall(stillmode_driver_init);
if (ret < 0) {
- KDEBUG(M4SH_ERROR, "Error registering still mode IRQ: "
- "%d\n", ret);
+ KDEBUG(M4SH_ERROR, "Unable to register init function "
+ "for stillmode client = %d\n", ret);
goto destroy_wakelock;
}
- ret = m4sensorhub_irq_enable(m4sensorhub, M4SH_IRQ_STILL_DETECTED);
- if (ret < 0) {
- KDEBUG(M4SH_ERROR, "Error enabling still mode int: "
- "%d\n", ret);
- goto unregister_still_irq;
- }
-
- ret = m4sensorhub_irq_register(m4sensorhub, M4SH_IRQ_MOTION_DETECTED,
- m4_handle_stillmode_irq,
- stillmode_client_data);
- if (ret < 0) {
- KDEBUG(M4SH_ERROR, "Error registering moving mode IRQ: "
- "%d\n", ret);
- goto disable_still_irq;
- }
- ret = m4sensorhub_irq_enable(m4sensorhub, M4SH_IRQ_MOTION_DETECTED);
- if (ret < 0) {
- KDEBUG(M4SH_ERROR, "Error enabling moving mode int: "
- "%d\n", ret);
- goto unregister_moving_irq;
- }
if (device_create_file(&pdev->dev, &dev_attr_state)) {
KDEBUG(M4SH_ERROR, "Error creating stillmode sys entry\n");
ret = -1;
- goto disable_moving_irq;
+ goto unregister_initcall;
}
if (device_create_file(&pdev->dev, &dev_attr_timeout)) {
@@ -311,9 +339,6 @@ static int stillmode_client_probe(struct platform_device *pdev)
goto remove_stillmode_sysfs;
}
- /* initialize timer on M4 */
- m4sensorhub_stillmode_exit();
-
KDEBUG(M4SH_INFO, "Initialized %s driver\n",
STILLMODE_CLIENT_DRIVER_NAME);
@@ -321,14 +346,8 @@ static int stillmode_client_probe(struct platform_device *pdev)
remove_stillmode_sysfs:
device_remove_file(&pdev->dev, &dev_attr_state);
-disable_moving_irq:
- m4sensorhub_irq_disable(m4sensorhub, M4SH_IRQ_MOTION_DETECTED);
-unregister_moving_irq:
- m4sensorhub_irq_unregister(m4sensorhub, M4SH_IRQ_MOTION_DETECTED);
-disable_still_irq:
- m4sensorhub_irq_disable(m4sensorhub, M4SH_IRQ_STILL_DETECTED);
-unregister_still_irq:
- m4sensorhub_irq_unregister(m4sensorhub, M4SH_IRQ_STILL_DETECTED);
+unregister_initcall:
+ m4sensorhub_unregister_initcall(stillmode_driver_init);
destroy_wakelock:
wake_lock_destroy(&stillmode_client_data->wakelock);
input_unregister_device(stillmode_client_data->input_dev);
@@ -355,6 +374,7 @@ static int __exit stillmode_client_remove(struct platform_device *pdev)
m4sensorhub_irq_unregister(m4sensorhub, M4SH_IRQ_MOTION_DETECTED);
m4sensorhub_irq_disable(m4sensorhub, M4SH_IRQ_STILL_DETECTED);
m4sensorhub_irq_unregister(m4sensorhub, M4SH_IRQ_STILL_DETECTED);
+ m4sensorhub_unregister_initcall(stillmode_driver_init);
wake_lock_destroy(&stillmode_client_data->wakelock);
input_unregister_device(stillmode_client_data->input_dev);
platform_set_drvdata(pdev, NULL);