linux-pm.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Wolfgang Wiedmeyer <wolfgit@wiedmeyer.de>
To: Krzysztof Kozlowski <krzk@kernel.org>
Cc: sre@kernel.org, dbaryshkov@gmail.com, dwmw2@infradead.org,
	cw00.choi@samsung.com, b.zolnierkie@samsung.com,
	broonie@kernel.org, lgirdwood@gmail.com, lee.jones@linaro.org,
	linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH 2/3] regulator: max77693: Also manipulate the fast charge current
Date: Tue, 27 Sep 2016 15:50:42 +0200	[thread overview]
Message-ID: <878tudwixy.fsf@machinist.wiedmeyer.de> (raw)
In-Reply-To: <20160927080357.GA4394@kozik-lap>

[-- Attachment #1: Type: text/plain, Size: 5215 bytes --]


Krzysztof Kozlowski writes:

> On Tue, Sep 27, 2016 at 01:31:09AM +0200, Wolfgang Wiedmeyer wrote:
>> For MAX77693, the fast charge current also needs to be manipulated for
>> proper charging. The fast charge current is only set in the case of
>> the MAX77693 type, as the MAX77843 properly manipulates the fast
>> charge current.
>
> Are you sure it has to be manipulated? Some time I didn't dig into this.
> Now I looked at the datasheet and it says that usually there is no need
> for changing the charge current during the operation. Maxim recommends
> to setting it to a maximum safe value for the battery. The device will
> manage charge current on its own.
>
> However I agree that the charge current should be set... maybe once, to
> a maximum value appropriate for battery. Probably this should be done
> by max77693_charger in max77693_dt_init().

When charging is disabled (e.g. by removing the USB cable) the charge
current is not reset to zero. So if I expose the current by the
CURRENT_NOW property, it incorrectly reports the current that was set
when charging was enabled, although there is no charging going on
anymore. So I felt the need to update the charge current every time the
charger gets enabled or disabled.
Initially, the charge current is set to zero, so I think it needs to be
set at least at the beginning to enable charging.

Thanks,
Wolfgang

> Best regards,
> Krzysztof
>
>
>> The fast charge current is set to the next possible value below the
>> maximum input current.
>
>
>> 
>> Signed-off-by: Wolfgang Wiedmeyer <wolfgit@wiedmeyer.de>
>> ---
>>  drivers/regulator/max77693-regulator.c | 45 +++++++++++++++++++++++++++++++---
>>  1 file changed, 42 insertions(+), 3 deletions(-)
>> 
>> diff --git a/drivers/regulator/max77693-regulator.c b/drivers/regulator/max77693-regulator.c
>> index cfbb951..e2f7584 100644
>> --- a/drivers/regulator/max77693-regulator.c
>> +++ b/drivers/regulator/max77693-regulator.c
>> @@ -54,14 +54,19 @@ struct chg_reg_data {
>>  	unsigned int linear_mask;
>>  	unsigned int uA_step;
>>  	unsigned int min_sel;
>> +
>> +	bool set_fast;
>> +	unsigned int fast_reg;
>> +	unsigned int fast_mask;
>>  };
>>  
>>  /*
>>   * MAX77693 CHARGER regulator - Min : 20mA, Max : 2580mA, step : 20mA
>>   * 0x00, 0x01, 0x2, 0x03	= 60 mA
>>   * 0x04 ~ 0x7E			= (60 + (X - 3) * 20) mA
>> - * Actually for MAX77693 the driver manipulates the maximum input current,
>> - * not the fast charge current (output). This should be fixed.
>> + * Actually for MAX77693 the driver manipulates the maximum input current
>> + * and the fast charge current (output) because the fast charge current
>> + * is not set.
>>   *
>>   * On MAX77843 the calculation formula is the same (except values).
>>   * Fortunately it properly manipulates the fast charge current.
>> @@ -100,6 +105,8 @@ static int max77693_chg_set_current_limit(struct regulator_dev *rdev,
>>  	const struct chg_reg_data *reg_data = rdev_get_drvdata(rdev);
>>  	unsigned int chg_min_uA = rdev->constraints->min_uA;
>>  	int sel = 0;
>> +	unsigned int data;
>> +	int ret;
>>  
>>  	while (chg_min_uA + reg_data->uA_step * sel < min_uA)
>>  		sel++;
>> @@ -110,7 +117,35 @@ static int max77693_chg_set_current_limit(struct regulator_dev *rdev,
>>  	/* the first four codes for charger current are all 60mA */
>>  	sel += reg_data->min_sel;
>>  
>> -	return regmap_write(rdev->regmap, reg_data->linear_reg, sel);
>> +	ret = regmap_write(rdev->regmap, reg_data->linear_reg, sel);
>> +	if (ret < 0)
>> +		return ret;
>> +
>> +	if (reg_data->set_fast) {
>> +		/* disable fast charge if minimum value */
>> +		if (sel == reg_data->min_sel)
>> +			data = 0;
>> +		else {
>> +			/*
>> +			 * set the fast charge current to the closest value
>> +			 * below the input current
>> +			 */
>> +			ret = regmap_read(rdev->regmap, reg_data->fast_reg,
>> +					  &data);
>> +			if (ret < 0)
>> +				return ret;
>> +
>> +			sel *= reg_data->uA_step / 1000; /* convert to mA */
>> +			data &= ~reg_data->fast_mask;
>> +			data |= sel * 10 / 333; /* 0.1A/3 steps */
>> +		}
>> +
>> +		ret = regmap_write(rdev->regmap, reg_data->fast_reg, data);
>> +		if (ret < 0)
>> +			return ret;
>> +	}
>> +
>> +	return 0;
>>  }
>>  /* end of CHARGER regulator ops */
>>  
>> @@ -197,6 +232,9 @@ static const struct chg_reg_data max77693_chg_reg_data = {
>>  	.linear_mask	= CHG_CNFG_09_CHGIN_ILIM_MASK,
>>  	.uA_step	= 20000,
>>  	.min_sel	= 3,
>> +	.set_fast	= true,
>> +	.fast_reg	= MAX77693_CHG_REG_CHG_CNFG_02,
>> +	.fast_mask	= CHG_CNFG_02_CC_MASK,
>>  };
>>  
>>  #define	max77843_regulator_desc_esafeout(num)	{			\
>> @@ -237,6 +275,7 @@ static const struct chg_reg_data max77843_chg_reg_data = {
>>  	.linear_mask	= MAX77843_CHG_FAST_CHG_CURRENT_MASK,
>>  	.uA_step	= MAX77843_CHG_FAST_CHG_CURRENT_STEP,
>>  	.min_sel	= 2,
>> +	.set_fast	= false,
>>  };
>>  
>>  static int max77693_pmic_probe(struct platform_device *pdev)
>> -- 
>> 2.8.0.rc3
>> 


-- 
Website: https://fossencdi.org
OpenPGP: 0F30 D1A0 2F73 F70A 6FEE  048E 5816 A24C 1075 7FC4
Key download: https://wiedmeyer.de/keys/ww.asc

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 818 bytes --]

  reply	other threads:[~2016-09-27 13:50 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-09-26 23:31 [PATCH 0/3] max77693: USB event listener for charger Wolfgang Wiedmeyer
2016-09-26 23:31 ` [PATCH 1/3] mfd: max77693: Add defines for charger current control Wolfgang Wiedmeyer
2016-09-27  8:06   ` Krzysztof Kozlowski
2016-09-27 13:54     ` Wolfgang Wiedmeyer
2016-09-26 23:31 ` [PATCH 2/3] regulator: max77693: Also manipulate the fast charge current Wolfgang Wiedmeyer
2016-09-27  8:03   ` Krzysztof Kozlowski
2016-09-27 13:50     ` Wolfgang Wiedmeyer [this message]
2016-09-27 16:15       ` Mark Brown
2016-09-27 17:51         ` Wolfgang Wiedmeyer
2016-09-28  8:04           ` Krzysztof Kozlowski
2016-09-26 23:31 ` [PATCH 3/3] power_supply: max77693: Listen for cable events and enable charging Wolfgang Wiedmeyer
2016-09-27  8:13   ` Krzysztof Kozlowski
2016-09-27 13:34     ` Wolfgang Wiedmeyer
2016-09-28  7:56       ` Krzysztof Kozlowski

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=878tudwixy.fsf@machinist.wiedmeyer.de \
    --to=wolfgit@wiedmeyer.de \
    --cc=b.zolnierkie@samsung.com \
    --cc=broonie@kernel.org \
    --cc=cw00.choi@samsung.com \
    --cc=dbaryshkov@gmail.com \
    --cc=dwmw2@infradead.org \
    --cc=krzk@kernel.org \
    --cc=lee.jones@linaro.org \
    --cc=lgirdwood@gmail.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pm@vger.kernel.org \
    --cc=sre@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;
as well as URLs for NNTP newsgroup(s).