From 2449a4800e1a8d7a375dd7fab336ebbcddd174ea Mon Sep 17 00:00:00 2001 From: Renjun Xu Date: Wed, 17 Jan 2018 10:42:13 +0800 Subject: [PATCH] ledring: add suspend/resume for ledring PD#158940: add suspend/resume for ledring Change-Id: I64827cd230708481768be7aabc3b4f814af8b636 Signed-off-by: Renjun Xu --- drivers/amlogic/ledring/aml-is31fl32xx.c | 40 ++++++++++++++++++++++++ drivers/amlogic/ledring/aml-pca9557.c | 33 +++++++++++++++++++ 2 files changed, 73 insertions(+) diff --git a/drivers/amlogic/ledring/aml-is31fl32xx.c b/drivers/amlogic/ledring/aml-is31fl32xx.c index e84aec5b786f..8badc17f6aca 100644 --- a/drivers/amlogic/ledring/aml-is31fl32xx.c +++ b/drivers/amlogic/ledring/aml-is31fl32xx.c @@ -22,6 +22,8 @@ #include #include #include +#include +#include #include #include @@ -752,6 +754,7 @@ static int is31fl32xx_probe(struct i2c_client *client, ret = sysfs_create_group(led_priv_data->running_kobj, &attr_group); if (ret) goto err2; + return 0; err1: return -ENOMEM; @@ -791,10 +794,47 @@ static const struct i2c_device_id is31fl32xx_id[] = { MODULE_DEVICE_TABLE(i2c, is31fl32xx_id); +static int is31fl32xx_resume(struct device *dev) +{ + pr_info("enter is31fl32xx_resume.\n"); + schedule_work(&led_priv_data->ledring_work); + mod_timer(&led_priv_data->mtimer, + jiffies+led_priv_data->ledring_speed*HZ/1000); + + return 0; +} + +static int is31fl32xx_suspend(struct device *dev) +{ + int i, ret; + + pr_info("enter is31fl32xx_suspend.\n"); + del_timer(&led_priv_data->mtimer); + for (i = 0; i < styleData.num*3; i++) { + ret = is31fl32xx_write(led_priv_data->g_client, i+1, 0); + if (ret) { + pr_err("try close led: %d fail\n", i+1); + return ret; + } + ret = is31fl32xx_write(led_priv_data->g_client, 37, 0); + if (ret) + pr_err("try close led: %d fail\n", i+1); + } + + return 0; +} + +static const struct dev_pm_ops is31fl32xx_pm = { + .suspend = is31fl32xx_suspend, + .resume = is31fl32xx_resume, +}; + static struct i2c_driver is31fl32xx_driver = { .driver = { .name = "is31fl32xx", + .owner = THIS_MODULE, .of_match_table = of_is31fl32xx_match, + .pm = &is31fl32xx_pm, }, .probe = is31fl32xx_probe, .remove = is31fl32xx_remove, diff --git a/drivers/amlogic/ledring/aml-pca9557.c b/drivers/amlogic/ledring/aml-pca9557.c index 8f3ac270a056..59cc6d0cfd01 100644 --- a/drivers/amlogic/ledring/aml-pca9557.c +++ b/drivers/amlogic/ledring/aml-pca9557.c @@ -22,7 +22,9 @@ #include #include #include +#include #include +#include #include #include @@ -589,11 +591,42 @@ static int ledring_remove(struct i2c_client *client) return 0; } +static int ledring_resume(struct device *dev) +{ + pr_info("enter ledring_resume.\n"); + + schedule_work(&key_led_des->list_work); + mod_timer(&key_led_des->mtimer, + jiffies+key_led_des->run_time*HZ/1000); + + return 0; +} + +static int ledring_suspend(struct device *dev) +{ + int ret; + + pr_info("enter ledring_suspend.\n"); + del_timer(&key_led_des->mtimer); + ret = i2c_smbus_write_byte_data(g_client, + addr_led_reg1, 0); + if (ret < 0) + pr_err("led set reg1 fail!\n"); + + return 0; +} + +static const struct dev_pm_ops ledring_pm = { + .suspend = ledring_suspend, + .resume = ledring_resume, +}; + static struct i2c_driver ledring_drv = { .driver = { .name = "aml_ledring", .owner = THIS_MODULE, .of_match_table = ledring_dt_ids, + .pm = &ledring_pm, }, .probe = ledring_probe, .remove = ledring_remove,