From: Jonathan Cameron <jic23@kernel.org>
To: Miao Li <limiao870622@163.com>
Cc: dlechner@baylibre.com, nuno.sa@analog.com, andy@kernel.org,
waqar.hameed@axis.com, dixitparmar19@gmail.com,
linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org,
Miao Li <limiao@kylinos.cn>
Subject: Re: [PATCH v4 1/3] iio: light: stk3310: Deal with the ps interrupt issue in PM
Date: Mon, 4 May 2026 16:34:23 +0100 [thread overview]
Message-ID: <20260504163423.33dcf4e1@jic23-huawei> (raw)
In-Reply-To: <20260504030408.105762-2-limiao870622@163.com>
On Mon, 4 May 2026 11:04:06 +0800
Miao Li <limiao870622@163.com> wrote:
> From: Miao Li <limiao@kylinos.cn>
>
> On the Inspur HS326 laptop(which integrated with HiSilicon M900
> processor), if the STK3311-X chip's PS interrupt is configured
> in "Recommended interrupt mode", the interrupt cannot be triggered
> normally after waking from suspend or hibernation.
>
> In this case, neither disabling and re-enabling the interrupt nor
> resetting the PS threshold register can restore the interrupt to
> normal operation.
>
> If the interrupt is disabled in suspend() then reset the PS threshold
> register and enable the interrupt in resume(). This resolves the issue.
>
> Signed-off-by: Miao Li <limiao@kylinos.cn>
Hi Miao Li,
This to me feels like something we should backport and is
sort of a fix. For now I'm going to queue it via the slow path (for next
merge window) but you want me to drag it into the fixes branch to hit
sooner please reply with a Fixes tag to indicate when this code was
added. I'd guess the second ever patch to the driver that added
threshold support, but I haven't checked.
So for now series applied to the testing branch of iio.git.
Note I made two tweaks - see below.
> ---
> drivers/iio/light/stk3310.c | 72 ++++++++++++++++++++++++++++++++++---
> 1 file changed, 67 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/iio/light/stk3310.c b/drivers/iio/light/stk3310.c
> index a75a83594..86cc6e8ec 100644
> --- a/drivers/iio/light/stk3310.c
> +++ b/drivers/iio/light/stk3310.c
> @@ -117,6 +117,9 @@ struct stk3310_data {
> struct mutex lock;
> bool als_enabled;
> bool ps_enabled;
> + bool ps_int_enabled;
> + uint32_t ps_thdl;
> + uint32_t ps_thdh;
> uint32_t ps_near_level;
> u64 timestamp;
> struct regmap *regmap;
> @@ -296,8 +299,15 @@ static int stk3310_write_event(struct iio_dev *indio_dev,
>
> buf = cpu_to_be16(val);
> ret = regmap_bulk_write(data->regmap, reg, &buf, 2);
> - if (ret < 0)
> + if (ret < 0) {
> dev_err(&client->dev, "failed to set PS threshold!\n");
> + return ret;
> + }
> +
> + if (reg == STK3310_REG_THDH_PS)
> + data->ps_thdh = val;
> + else
> + data->ps_thdl = val;
>
> return ret;
return 0;
> }
> @@ -331,8 +341,14 @@ static int stk3310_write_event_config(struct iio_dev *indio_dev,
> /* Set INT_PS value */
> mutex_lock(&data->lock);
> ret = regmap_field_write(data->reg_int_ps, state);
> - if (ret < 0)
> + if (ret < 0) {
> dev_err(&client->dev, "failed to set interrupt mode\n");
> + mutex_unlock(&data->lock);
> + return ret;
> + }
> +
> + data->ps_int_enabled = state;
> +
> mutex_unlock(&data->lock);
>
> return ret;
return 0;
> @@ -504,10 +520,15 @@ static int stk3310_init(struct iio_dev *indio_dev)
>
> /* Enable PS interrupts */
> ret = regmap_field_write(data->reg_int_ps, STK3310_PSINT_EN);
> - if (ret < 0)
> + if (ret < 0) {
> dev_err(&client->dev, "failed to enable interrupts!\n");
> + return ret;
> + }
>
> - return ret;
> + data->ps_int_enabled = true;
> + data->ps_thdh = STK3310_PS_MAX_VAL;
> +
> + return 0;
> }
>
> static bool stk3310_is_volatile_reg(struct device *dev, unsigned int reg)
> @@ -671,9 +692,18 @@ static void stk3310_remove(struct i2c_client *client)
> static int stk3310_suspend(struct device *dev)
> {
> struct stk3310_data *data;
> + int ret;
>
> data = iio_priv(i2c_get_clientdata(to_i2c_client(dev)));
>
> + if (data->ps_int_enabled) {
> + ret = regmap_field_write(data->reg_int_ps, 0x0);
> + if (ret < 0) {
> + dev_err(dev, "failed to disable ps int at suspend.\n");
> + return ret;
> + }
> + }
> +
> return stk3310_set_state(data, STK3310_STATE_STANDBY);
> }
>
> @@ -681,6 +711,8 @@ static int stk3310_resume(struct device *dev)
> {
> u8 state = 0;
> struct stk3310_data *data;
> + __be16 buf;
> + int ret;
>
> data = iio_priv(i2c_get_clientdata(to_i2c_client(dev)));
> if (data->ps_enabled)
> @@ -688,7 +720,37 @@ static int stk3310_resume(struct device *dev)
> if (data->als_enabled)
> state |= STK3310_STATE_EN_ALS;
>
> - return stk3310_set_state(data, state);
> + ret = stk3310_set_state(data, state);
> + if (ret < 0)
> + return ret;
> +
> + if (data->ps_thdl != 0x0) {
> + buf = cpu_to_be16(data->ps_thdl);
> + ret = regmap_bulk_write(data->regmap, STK3310_REG_THDL_PS, &buf, 2);
> + if (ret < 0) {
> + dev_err(dev, "failed to set reg THDL_PS at resume.\n");
> + return ret;
> + }
> + }
> +
> + if (data->ps_thdh != STK3310_PS_MAX_VAL) {
> + buf = cpu_to_be16(data->ps_thdh);
> + ret = regmap_bulk_write(data->regmap, STK3310_REG_THDH_PS, &buf, 2);
> + if (ret < 0) {
> + dev_err(dev, "failed to set reg THDH_PS at resume.\n");
> + return ret;
> + }
> + }
> +
> + if (data->ps_int_enabled) {
> + ret = regmap_field_write(data->reg_int_ps, STK3310_PSINT_EN);
> + if (ret < 0) {
> + dev_err(dev, "failed to enable ps int at resume.\n");
> + return ret;
> + }
> + }
> +
> + return 0;
> }
>
> static DEFINE_SIMPLE_DEV_PM_OPS(stk3310_pm_ops, stk3310_suspend,
next prev parent reply other threads:[~2026-05-04 15:34 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-05-04 3:04 [PATCH v4 0/3] iio: light: stk3310: Fix PS interrupt after suspend and clean up code style Miao Li
2026-05-04 3:04 ` [PATCH v4 1/3] iio: light: stk3310: Deal with the ps interrupt issue in PM Miao Li
2026-05-04 15:34 ` Jonathan Cameron [this message]
2026-05-05 6:53 ` Andy Shevchenko
2026-05-04 3:04 ` [PATCH v4 2/3] iio: light: stk3310: Replace uint32_t with u32 and reorder members to eliminate padding Miao Li
2026-05-04 8:19 ` Joshua Crofts
2026-05-05 6:51 ` Andy Shevchenko
2026-05-04 3:04 ` [PATCH v4 3/3] iio: light: stk3310: Use sizeof() for regmap_bulk_read/write count parameter Miao Li
2026-05-04 7:11 ` Joshua Crofts
2026-05-05 6:49 ` Andy Shevchenko
2026-05-05 9:29 ` Jonathan Cameron
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260504163423.33dcf4e1@jic23-huawei \
--to=jic23@kernel.org \
--cc=andy@kernel.org \
--cc=dixitparmar19@gmail.com \
--cc=dlechner@baylibre.com \
--cc=limiao870622@163.com \
--cc=limiao@kylinos.cn \
--cc=linux-iio@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=nuno.sa@analog.com \
--cc=waqar.hameed@axis.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox