diff options
author | Amit Bhanagay <amitbhanagay@google.com> | 2023-02-14 21:42:02 +0000 |
---|---|---|
committer | Amit Bhanagay <amitbhanagay@google.com> | 2023-02-16 21:59:30 +0000 |
commit | 1112211944e42eb035f193ec5c1e1ce792800bf0 (patch) | |
tree | 7248373f18328d828473728ec9083b4165304ad8 | |
parent | 34fe6bac73d68481e2d109e9c1f5c284a0420a4b (diff) | |
parent | 23c66d7b8284577568c3d3b6ebea90e05af9d35c (diff) | |
download | rotary-encoders-1112211944e42eb035f193ec5c1e1ce792800bf0.tar.gz |
Merge branch 'partner/android-msm-eos-5.4' into android13-msm-pixelwatch-5.15
Bug: 268415090
Signed-off-by: Amit Bhanagay <amitbhanagay@google.com>
Change-Id: Ifb33fb155c94c986b3c8bb43e5faba3833b3d859
-rw-r--r-- | ots_pat9126/pat9126.c | 80 | ||||
-rw-r--r-- | ots_pat9126/pat9126.h | 3 |
2 files changed, 58 insertions, 25 deletions
diff --git a/ots_pat9126/pat9126.c b/ots_pat9126/pat9126.c index 9b1079c..01f005f 100644 --- a/ots_pat9126/pat9126.c +++ b/ots_pat9126/pat9126.c @@ -25,6 +25,9 @@ #include <linux/string.h> #include <linux/soc/qcom/panel_event_notifier.h> +#define WAKE_SENSITIVITY 1 +#define SENSITIVITY_LEN 4 /* range "0" - "255" */ + struct pixart_pat9126_data { struct i2c_client *client; struct input_dev *input; @@ -40,6 +43,7 @@ struct pixart_pat9126_data { u32 vdd_sleep_load; u32 vld_sleep_load; int state; + u8 crown_sensitivity; struct work_struct work; struct workqueue_struct *workqueue; struct delayed_work polling_work; @@ -51,7 +55,7 @@ struct pixart_pat9126_data { struct regulator *vld_supply; }; -#define PAT9126_STATE_OFF 0 +#define PAT9126_STATE_SUSPEND 0 #define PAT9126_STATE_ON 1 #define PAT9126_STATE_RESUMING 2 @@ -178,7 +182,7 @@ static int pat9126_read(struct i2c_client *client, u8 addr, u8 *data) }; if (i2c_transfer(client->adapter, msg, 2) != 2) { - dev_err(dev, "%s Failed: writing to reg 0x%x\n", __func__, + dev_err(dev, "%s Failed: reading reg 0x%x\n", __func__, addr); return -EIO; } @@ -419,14 +423,8 @@ static void pat9126_work_handler(struct work_struct *work) mutex_lock(&data->mtx); - if (data->state != PAT9126_STATE_ON) { - if (data->state == PAT9126_STATE_RESUMING) { - pr_warn("[PAT9126] %s: work handler run before resume complete\n", __func__); - } else { - // PAT9126_STATE_OFF - pr_warn("[PAT9126] %s: work handler run with device suspended\n", __func__); - } - + if (data->state == PAT9126_STATE_RESUMING) { + pr_warn("[PAT9126] %s: work handler run before resume complete\n", __func__); goto end_work_handler; } @@ -473,19 +471,25 @@ static irqreturn_t pat9126_irq(int irq, void *dev_data) return IRQ_HANDLED; } +static void pat9126_sensitivity_write(struct device *dev, + u8 sensitivity) { + struct pixart_pat9126_data *data = + (struct pixart_pat9126_data *) dev_get_drvdata(dev); + struct i2c_client *client = data->client; + + pr_info("[PAT9126] set sensitivity: %d\n", sensitivity); + pat9126_write(client, PIXART_PAT9126_SET_CPI_RES_X_REG, sensitivity); +} + static ssize_t pat9126_sensitivity_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { - u8 sensitivity; - struct pixart_pat9126_data *data = (struct pixart_pat9126_data *) dev_get_drvdata(dev); - struct i2c_client *client = data->client; - if (!kstrtou8(buf, 0, &sensitivity)) { - dev_dbg(dev, "RES_X: %d, 0x%x\n", sensitivity, sensitivity); - pat9126_write(client, PIXART_PAT9126_SET_CPI_RES_X_REG, sensitivity); + if (!kstrtou8(buf, 0, &data->crown_sensitivity)) { + pat9126_sensitivity_write(dev, data->crown_sensitivity); } return count; @@ -715,7 +719,6 @@ static void pat9126_complete_resume(struct work_struct *work) { pat9126_enable_mot_write_protected(data->client); data->state = PAT9126_STATE_ON; - enable_irq(data->client->irq); end_complete_resume: mutex_unlock(&data->mtx); @@ -956,6 +959,7 @@ static int pat9126_i2c_probe(struct i2c_client *client, mutex_init(&data->mtx); data->state = PAT9126_STATE_ON; + data->crown_sensitivity = PIXART_PAT9126_CPI_RESOLUTION_X; ret = pat9126_register_panel_notifier(data); if (ret) { @@ -1046,7 +1050,7 @@ static int pat9126_display_suspend(struct device *dev) pr_debug("[PAT9126] %s\n", __func__); if(data->state != PAT9126_STATE_ON) { - if (data->state == PAT9126_STATE_OFF) { + if (data->state == PAT9126_STATE_SUSPEND) { pr_warn("[PAT9126] %s: Redundant call to suspend\n", __func__); } else { // PAT9126_STATE_RESUMING @@ -1056,12 +1060,15 @@ static int pat9126_display_suspend(struct device *dev) goto end_suspend; } - disable_irq(data->client->irq); + /* Set low sensitivity */ + pat9126_sensitivity_write(dev, WAKE_SENSITIVITY); + + enable_irq_wake(data->client->irq); pat9126_disable_mot_write_protected(data->client); pat9126_set_loads_sleep(data); end_suspend: - data->state = PAT9126_STATE_OFF; + data->state = PAT9126_STATE_SUSPEND; mutex_unlock(&data->mtx); return 0; } @@ -1074,13 +1081,16 @@ static int pat9126_display_resume(struct device *dev) pr_debug("[PAT9126] %s\n", __func__); mutex_lock(&data->mtx); - - if (data->state != PAT9126_STATE_OFF) { + if (data->state != PAT9126_STATE_SUSPEND) { pr_warn("[PAT9126] %s: Redundant call to resume\n", __func__); mutex_unlock(&data->mtx); return 0; } + /* Set regular sensitivity */ + pat9126_sensitivity_write(dev, data->crown_sensitivity); + + disable_irq_wake(data->client->irq); data->state = PAT9126_STATE_RESUMING; mutex_unlock(&data->mtx); @@ -1095,12 +1105,37 @@ static int pat9126_display_resume(struct device *dev) return 0; } +static int pat9126_pm_suspend(struct device *dev) +{ + struct pixart_pat9126_data *data = + (struct pixart_pat9126_data *) dev_get_drvdata(dev); + + mutex_lock(&data->mtx); + + return 0; +} + +static int pat9126_pm_resume(struct device *dev) +{ + struct pixart_pat9126_data *data = + (struct pixart_pat9126_data *) dev_get_drvdata(dev); + + mutex_unlock(&data->mtx); + + return 0; +} + static const struct i2c_device_id pat9126_device_id[] = { {PAT9126_DEV_NAME, 0}, {} }; MODULE_DEVICE_TABLE(i2c, pat9126_device_id); +static const struct dev_pm_ops pat9126_pm_ops = { + .suspend = pat9126_pm_suspend, + .resume = pat9126_pm_resume +}; + static const struct of_device_id pixart_pat9126_match_table[] = { { .compatible = "pixart,pat9126",}, { }, @@ -1110,6 +1145,7 @@ static struct i2c_driver pat9126_i2c_driver = { .driver = { .name = PAT9126_DEV_NAME, .owner = THIS_MODULE, + .pm = &pat9126_pm_ops, .of_match_table = pixart_pat9126_match_table, }, .probe = pat9126_i2c_probe, diff --git a/ots_pat9126/pat9126.h b/ots_pat9126/pat9126.h index 72d8a7e..1b6b7d8 100644 --- a/ots_pat9126/pat9126.h +++ b/ots_pat9126/pat9126.h @@ -10,9 +10,6 @@ #define PAT9126_DEV_NAME "pixart_pat9126" #define BUF_SIZE 2 #define RESET_DELAY_US 1000 -#define PINCTRL_STATE_ACTIVE "pmx_rot_switch_active" -#define PINCTRL_STATE_SUSPEND "pmx_rot_switch_suspend" -#define PINCTRL_STATE_RELEASE "pmx_rot_switch_release" #define VDD_VTG_MIN_UV 1800000 #define VDD_VTG_MAX_UV 1800000 #define VDD_ACTIVE_LOAD_UA 10000 |