summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZhang Jiejing <jiejing.zhang@freescale.com>2011-11-25 15:12:49 +0800
committerZhang Jiejing <jiejing.zhang@freescale.com>2011-12-05 15:46:27 +0800
commita7e4dbdebf366d036865ec9121cd236f15894201 (patch)
treeb72c1e912df76458e7e272f1c7d5d6b608c0d06e
parent80d420e9bc25d181270c88e9b11819ec21a2cf82 (diff)
ENGR00163704 Android: stop sensor polling when shutdown
modify these sensors: mma8451, mag3110, max17085 battery. sensor like device should stop after .shutdown callback, since after .shutdown callback, kernel going to reset, user space should not receive any message. since android not kill system server when reboot/shutdown, the userspace will still running. Signed-off-by: Zhang Jiejing <jiejing.zhang@freescale.com>
-rwxr-xr-xdrivers/hwmon/mag3110.c27
-rw-r--r--drivers/hwmon/mxc_mma8451.c21
-rw-r--r--drivers/power/max17085_battery.c9
3 files changed, 51 insertions, 6 deletions
diff --git a/drivers/hwmon/mag3110.c b/drivers/hwmon/mag3110.c
index 7c4bc62317e4..a0be33e309d3 100755
--- a/drivers/hwmon/mag3110.c
+++ b/drivers/hwmon/mag3110.c
@@ -74,6 +74,7 @@ struct mag3110_data {
struct device *hwmon_dev;
wait_queue_head_t waitq;
bool data_ready;
+ bool stop_polling;
u8 ctl_reg1;
};
@@ -186,7 +187,8 @@ static void report_abs(void)
static void mag3110_dev_poll(struct input_polled_dev *dev)
{
- report_abs();
+ if (!mag3110_pdata->stop_polling)
+ report_abs();
}
static irqreturn_t mag3110_irq_handler(int irq, void *dev_id)
@@ -340,6 +342,7 @@ static int __devinit mag3110_probe(struct i2c_client *client,
init_waitqueue_head(&data->waitq);
data->hwmon_dev = hwmon_device_register(&client->dev);
+ data->stop_polling = false;
if (IS_ERR(data->hwmon_dev)) {
dev_err(&client->dev, "hwmon register failed!\n");
ret = PTR_ERR(data->hwmon_dev);
@@ -400,17 +403,28 @@ error_kfree:
return ret;
}
+static int mag3110_stop_chip(struct i2c_client *client)
+{
+ u8 tmp;
+ tmp = mag3110_read_reg(client, MAG3110_CTRL_REG1);
+ return mag3110_write_reg(client,
+ MAG3110_CTRL_REG1,
+ tmp & ~MAG3110_AC_MASK);
+}
+
+static void mag3110_shutdown(struct i2c_client *client)
+{
+ mag3110_pdata->stop_polling = true;
+ mag3110_stop_chip(client);
+}
+
static int __devexit mag3110_remove(struct i2c_client *client)
{
struct mag3110_data *data;
int ret;
data = i2c_get_clientdata(client);
-
- data->ctl_reg1 = mag3110_read_reg(client, MAG3110_CTRL_REG1);
- ret = mag3110_write_reg(client, MAG3110_CTRL_REG1,
- data->ctl_reg1 & ~MAG3110_AC_MASK);
-
+ ret = mag3110_stop_chip(client);
free_irq(client->irq, data);
input_unregister_polled_device(data->poll_dev);
input_free_polled_device(data->poll_dev);
@@ -470,6 +484,7 @@ static struct i2c_driver mag3110_driver = {
.resume = mag3110_resume,
.probe = mag3110_probe,
.remove = __devexit_p(mag3110_remove),
+ .shutdown = mag3110_shutdown,
.id_table = mag3110_id,
};
diff --git a/drivers/hwmon/mxc_mma8451.c b/drivers/hwmon/mxc_mma8451.c
index 1faa5e26c925..a5d58d7c0146 100644
--- a/drivers/hwmon/mxc_mma8451.c
+++ b/drivers/hwmon/mxc_mma8451.c
@@ -117,6 +117,7 @@ enum {
struct mma8451_status {
u8 mode;
u8 ctl_reg1;
+ bool stop_poll;
};
static struct mma8451_status mma_status;
@@ -213,6 +214,8 @@ out:
static void mma8451_dev_poll(struct input_polled_dev *dev)
{
+ if (!mma_status.stop_poll)
+ report_abs();
report_abs();
}
@@ -224,6 +227,8 @@ static int __devinit mma8451_probe(struct i2c_client *client,
struct i2c_adapter *adapter;
mma8451_i2c_client = client;
+ mma_status.stop_poll = false;
+
adapter = to_i2c_adapter(client->dev.parent);
result = i2c_check_functionality(adapter,
I2C_FUNC_SMBUS_BYTE |
@@ -308,6 +313,21 @@ static int __devexit mma8451_remove(struct i2c_client *client)
return ret;
}
+void mma8451_shutdown(struct i2c_client *client)
+{
+ int ret;
+
+ /* first, stop polling since this chip will pull sda low if
+ * reboot during poweroff/reboot, add stop function here to
+ * prevent this
+ */
+ mma_status.stop_poll = true;
+
+ ret = mma8451_stop_chip(client);
+ if (ret < 0)
+ dev_err(&client->dev, "stop chip failed:%d\n", ret);
+}
+
#ifdef CONFIG_PM_SLEEP
static int mma8451_suspend(struct device *dev)
{
@@ -339,6 +359,7 @@ static struct i2c_driver mma8451_driver = {
},
.probe = mma8451_probe,
.remove = __devexit_p(mma8451_remove),
+ .shutdown = mma8451_shutdown,
.id_table = mma8451_id,
};
diff --git a/drivers/power/max17085_battery.c b/drivers/power/max17085_battery.c
index bef3fbf33596..aa60179a7778 100644
--- a/drivers/power/max17085_battery.c
+++ b/drivers/power/max17085_battery.c
@@ -358,12 +358,21 @@ static int max17085_bat_remove(struct platform_device *pdev)
return 0;
}
+static void max17085_bat_shutdown(struct platform_device *pdev)
+{
+ struct max17085_chip *chip = platform_get_drvdata(pdev);
+
+ cancel_delayed_work_sync(&chip->work);
+}
+
static struct platform_driver max17085_bat_driver = {
.driver = {
.name = "max17085_bat",
},
.probe = max17085_bat_probe,
.remove = max17085_bat_remove,
+ .shutdown = max17085_bat_shutdown,
+
};
static int __devinit max17085_bat_init(void)