The Linux Kernel Mailing List
 help / color / mirror / Atom feed
From: Matti Vaittinen <mazziesaccount@gmail.com>
To: Andreas Kemnade <andreas@kemnade.info>,
	lee@kernel.org, robh+dt@kernel.org,
	krzysztof.kozlowski+dt@linaro.org, conor+dt@kernel.org,
	devicetree@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v2 2/2] mfd: rohm-bd71828: Add power off functionality
Date: Wed, 27 Mar 2024 09:32:29 +0200	[thread overview]
Message-ID: <815e1cdc-145e-4880-96a0-d9c21308b9b3@gmail.com> (raw)
In-Reply-To: <20240326192258.298143-3-andreas@kemnade.info>

On 3/26/24 21:22, Andreas Kemnade wrote:
> Since the chip can power off the system, add the corresponding
> functionality.
> Based on https://github.com/kobolabs/Kobo-Reader/raw/master/hw/imx6sll-clara2e/kernel.tar.bz2
> No information source about the magic numbers found.
> 
> Signed-off-by: Andreas Kemnade <andreas@kemnade.info>
> ---
>   drivers/mfd/rohm-bd71828.c | 30 +++++++++++++++++++++++++++++-
>   1 file changed, 29 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/mfd/rohm-bd71828.c b/drivers/mfd/rohm-bd71828.c
> index 594718f7e8e1..8fd994664bbf 100644
> --- a/drivers/mfd/rohm-bd71828.c
> +++ b/drivers/mfd/rohm-bd71828.c
> @@ -464,6 +464,21 @@ static int set_clk_mode(struct device *dev, struct regmap *regmap,
>   				  OUT32K_MODE_CMOS);
>   }
>   
> +static struct i2c_client *bd71828_dev;
> +static void bd71828_power_off(void)
> +{
> +	while (true) {
> +		/* We are not allowed to sleep, so do not use regmap involving mutexes here. */
> +		i2c_smbus_write_byte_data(bd71828_dev, BD71828_REG_PS_CTRL_1, 0x02);

We need a read-modify-write here. All this should do is setting the 
bit[1] - which is 'state transition to HBNT_MODE'. The register has some 
other controls as well - like transitions to other low-power states 
(bit[0] = SHIP_MODE, bit[2] = LPSR_MODE and bit[3] = IDLE_MODE). These 
aren't a problem though because transition to the HBNT has the highest 
priority.

(It may be that someone somewhere would like to use some other low-power 
mode as the power-off target, but if this is needed then we can probably 
add another DT-property to tell which low-power mode the hardware is 
built to work with. In any case, implementing the HBNT is far better 
than not implementing power-off at all).

What might cause a problem is that the high bits control how the 
voltages of the output rails are controlled. (The PMIC has different 
options on this - and changing the control may change the voltages when 
PMIC is on RUN state. The write to bit[1] should start transition to 
HBNT, but I'm not 100% sure if voltage changes may take some effect 
before state transition is done, or if these settings may be carried 
over to next boot.) Better to not risk anything and leave the rest of 
the bits unchanged. Also, now that the magic value 0x02 is explained - 
we could use BD71828_MASK_STATE_HBNT BIT(1) - instead of a magic number ;)

I should've noticed this when I looked at the v1. Sorry for that :/

> +		mdelay(500);
> +	}
> +}
> +
> +static void bd71828_remove_poweroff(void *data)
> +{
> +	pm_power_off = NULL;
> +}
> +
>   static int bd71828_i2c_probe(struct i2c_client *i2c)
>   {
>   	struct regmap_irq_chip_data *irq_data;
> @@ -542,7 +557,20 @@ static int bd71828_i2c_probe(struct i2c_client *i2c)
>   	ret = devm_mfd_add_devices(&i2c->dev, PLATFORM_DEVID_AUTO, mfd, cells,
>   				   NULL, 0, regmap_irq_get_domain(irq_data));
>   	if (ret)
> -		dev_err_probe(&i2c->dev, ret, "Failed to create subdevices\n");
> +		return	dev_err_probe(&i2c->dev, ret, "Failed to create subdevices\n");
> +
> +	if (of_device_is_system_power_controller(i2c->dev.of_node) &&
> +	    chip_type == ROHM_CHIP_TYPE_BD71828) {

It's worth noting that there is another PMIC, BD71879, which, from the 
driver software point of view, should be (almost?) identical to the 
BD71828. I believe the BD71828 drivers should work with it as well - if 
not out of the box, at least with very minor modifications. 
Unfortunately I don't know products where the BD71879 is used or if it 
is sold via distributors - so I don't know if adding a DT 
compatible/chip type define for it would be beneficial. If someone is 
looking for information about the BD71879 and finds this mail - feel 
free to ping me :] (I expect no action from you here Andreas, just 
mentioned it for the record).

> +		if (!pm_power_off) {
> +			bd71828_dev = i2c;
> +			pm_power_off = bd71828_power_off;
> +			ret = devm_add_action_or_reset(&i2c->dev,
> +						       bd71828_remove_poweroff,
> +						       NULL);
> +		} else {
> +			dev_warn(&i2c->dev, "Poweroff callback already assigned\n");
> +		}
> +	}
>   
>   	return ret;
>   }


Just out of the curiosity... How on earth did you end up looking at this 
PMIC or kobo reader code? Do you work with a product using this PMIC, or 
do you just have the reader? No matter what the case is, I think this is 
really cool and seeing people using/improving these drivers warms my 
"open source heart" :) Almost feeling like my work has a purpose XD.

Anyways, if you add a define and change the write to rmw, and if Lee is 
ok with MFD driver hosting the power-off handler...

Acked-by: Matti Vaittinen <mazziesaccount@gmail.com>

Yours,
	-- Matti

-- 
Matti Vaittinen
Linux kernel developer at ROHM Semiconductors
Oulu Finland

~~ When things go utterly wrong vim users can always type :help! ~~


  reply	other threads:[~2024-03-27  7:32 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-03-26 19:22 [PATCH v2 0/2] mfd: rohm-bd71828: Add power off Andreas Kemnade
2024-03-26 19:22 ` [PATCH v2 1/2] dt-bindings: mfd: Add ROHM BD71828 system-power-controller property Andreas Kemnade
2024-03-27  7:01   ` Matti Vaittinen
2024-03-26 19:22 ` [PATCH v2 2/2] mfd: rohm-bd71828: Add power off functionality Andreas Kemnade
2024-03-27  7:32   ` Matti Vaittinen [this message]
2024-03-27 13:04     ` Andreas Kemnade
2024-03-27 14:11       ` Matti Vaittinen
2024-03-27 22:02         ` Andreas Kemnade
2024-03-28  5:15           ` Matti Vaittinen

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=815e1cdc-145e-4880-96a0-d9c21308b9b3@gmail.com \
    --to=mazziesaccount@gmail.com \
    --cc=andreas@kemnade.info \
    --cc=conor+dt@kernel.org \
    --cc=devicetree@vger.kernel.org \
    --cc=krzysztof.kozlowski+dt@linaro.org \
    --cc=lee@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=robh+dt@kernel.org \
    /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