From: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
To: Tobias Schramm <t.schramm@manjaro.org>
Cc: Sebastian Reichel <sre@kernel.org>,
Rob Herring <robh+dt@kernel.org>,
Mark Rutland <mark.rutland@arm.com>,
Maxime Ripard <mripard@kernel.org>,
Sam Ravnborg <sam@ravnborg.org>,
Heiko Stuebner <heiko.stuebner@theobroma-systems.com>,
Stephan Gerhold <stephan@gerhold.net>,
Mark Brown <broonie@kernel.org>,
Mauro Carvalho Chehab <mchehab+samsung@kernel.org>,
"David S. Miller" <davem@davemloft.net>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
Jonathan Cameron <Jonathan.Cameron@huawei.com>,
linux-pm@vger.kernel.org, devicetree@vger.kernel.org,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH v3 3/3] power: supply: add CellWise cw2015 fuel gauge driver
Date: Wed, 11 Mar 2020 12:18:30 +0200 [thread overview]
Message-ID: <20200311101830.GE1922688@smile.fi.intel.com> (raw)
In-Reply-To: <20200311093043.3636807-4-t.schramm@manjaro.org>
On Wed, Mar 11, 2020 at 10:30:43AM +0100, Tobias Schramm wrote:
> This patch adds a driver for the CellWise cw2015 fuel gauge.
>
> The CellWise cw2015 is a shuntless, single-cell Li-Ion fuel gauge used
> in the pine64 Pinebook Pro laptop and some Raspberry Pi UPS HATs.
Thank you for an update!
My comments below.
...
> + /* wait for gauge to become ready */
> + for (i = 0; i < CW2015_READ_TRIES; i++) {
> + ret = regmap_read(cw_bat->regmap, CW2015_REG_SOC, ®_val);
> + if (ret)
> + return ret;
> + /* SoC must not be more than 100% */
> + else if (reg_val <= 100)
> + break;
> +
> + msleep(100);
> + }
Have you considered to use regmap_read_poll_timeout()?
> +
> + if (i >= CW2015_READ_TRIES) {
> + reg_val = CW2015_MODE_SLEEP;
> + regmap_write(cw_bat->regmap, CW2015_REG_MODE, reg_val);
> + dev_err(cw_bat->dev,
> + "Gauge did not become ready after profile upload");
> + return -ETIMEDOUT;
> + }
...
> + if (memcmp(bat_info, cw_bat->bat_profile,
> + CW2015_SIZE_BATINFO)) {
I think it's pretty much okay to have this on one line, disregard 80 limit
(it's only 1 extra).
...
> +static int cw_get_soc(struct cw_battery *cw_bat)
> +{
> + unsigned int soc;
> + int ret;
> +
> + ret = regmap_read(cw_bat->regmap, CW2015_REG_SOC, &soc);
> + if (ret)
> + return ret;
> +
> + if (soc > 100) {
> + int max_error_cycles = CW2015_BAT_SOC_ERROR_MS /
> + cw_bat->poll_interval_ms;
The following looks better
int max_error_cycles =
CW2015_BAT_SOC_ERROR_MS / cw_bat->poll_interval_ms;
Applies to all similar places in the code.
> + dev_err(cw_bat->dev, "Invalid SoC %d%%", soc);
> + cw_bat->read_errors++;
> + if (cw_bat->read_errors > max_error_cycles) {
> + dev_warn(cw_bat->dev,
> + "Too many invalid SoC reports, resetting gauge");
> + cw_power_on_reset(cw_bat);
> + cw_bat->read_errors = 0;
> + }
> + return cw_bat->soc;
> + }
> + cw_bat->read_errors = 0;
> +
> + /* Reset gauge if stuck while charging */
> + if (cw_bat->status == POWER_SUPPLY_STATUS_CHARGING &&
> + soc == cw_bat->soc) {
A bit strange indentation, and honestly I would leave it on one line, but it's up to you.
> + int max_stuck_cycles = CW2015_BAT_CHARGING_STUCK_MS /
> + cw_bat->poll_interval_ms;
> +
> + cw_bat->charge_stuck_cnt++;
> + if (cw_bat->charge_stuck_cnt > max_stuck_cycles) {
> + dev_warn(cw_bat->dev,
> + "SoC stuck @%u%%, resetting gauge", soc);
> + cw_power_on_reset(cw_bat);
> + cw_bat->charge_stuck_cnt = 0;
> + }
> + } else {
> + cw_bat->charge_stuck_cnt = 0;
> + }
> +
> + /* Ignore voltage dips during charge */
> + if (cw_bat->charger_attached &&
> + HYSTERESIS(soc, cw_bat->soc, 0, 3)) {
This is pretty much one line (77), check your editor settings and update all
similar places in the code.
> + soc = cw_bat->soc;
> + }
> +
> + /* Ignore voltage spikes during discharge */
> + if (!cw_bat->charger_attached &&
> + HYSTERESIS(soc, cw_bat->soc, 3, 0)) {
> + soc = cw_bat->soc;
> + }
> +
> + return soc;
> +}
...
> + cw_bat =
> + container_of(delay_work, struct cw_battery, battery_delay_work);
It will be better to read if it would be one line.
...
> +static bool cw_battery_valid_time_to_empty(struct cw_battery *cw_bat)
> +{
> + return cw_bat->time_to_empty > 0 &&
> + cw_bat->time_to_empty < CW2015_MASK_SOC &&
> + cw_bat->status == POWER_SUPPLY_STATUS_DISCHARGING;
Fix indentation to be all 'c':s in one column.
> +}
...
> +static int cw2015_parse_properties(struct cw_battery *cw_bat)
> +{
> + struct device *dev = cw_bat->dev;
> + int length;
> + u32 value;
> + int ret;
> +
> + length = device_property_read_u8_array(dev, "cellwise,battery-profile",
> + NULL, 0);
device_property_count_u8();
> + if (length) {
> + if (length != CW2015_SIZE_BATINFO) {
> + dev_err(cw_bat->dev, "battery-profile must be %d bytes",
> + CW2015_SIZE_BATINFO);
> + return -EINVAL;
> + }
> +
> + cw_bat->bat_profile =
> + devm_kzalloc(dev, CW2015_SIZE_BATINFO, GFP_KERNEL);
Replace with length (so, you will have one point of validation), and put on
one line.
> + if (!cw_bat->bat_profile) {
> + dev_err(cw_bat->dev,
> + "Failed to allocate memory for battery config info");
> + return -ENOMEM;
> + }
> +
> + ret = device_property_read_u8_array(dev,
> + "cellwise,battery-profile",
> + cw_bat->bat_profile,
> + CW2015_SIZE_BATINFO);
length.
> + if (ret)
> + return ret;
> + } else {
> + dev_warn(cw_bat->dev,
> + "No battery-profile found, rolling with current flash contents");
> + }
> +
> + cw_bat->poll_interval_ms = CW2015_DEFAULT_POLL_INTERVAL_MS;
> + ret = device_property_read_u32_array(dev,
> + "cellwise,monitor-interval-ms",
It's fine to have it on one line.
> + &value, 1);
> + if (ret >= 0) {
> + dev_dbg(cw_bat->dev, "Overriding default monitor-interval with %u ms",
> + value);
> + cw_bat->poll_interval_ms = value;
> + }
> +
> + return 0;
> +}
...
> + regmap_reg_range(CW2015_REG_BATINFO,
> + CW2015_REG_BATINFO + CW2015_SIZE_BATINFO - 1),
Indentation issue. Check all similar places.
...
> + cw_bat->rk_bat = devm_power_supply_register(&client->dev,
> + &cw2015_bat_desc, &psy_cfg);
> + if (IS_ERR(cw_bat->rk_bat)) {
> + dev_err(cw_bat->dev, "Failed to register power supply");
> + return -1;
Do not shadow an error code.
> + }
--
With Best Regards,
Andy Shevchenko
next prev parent reply other threads:[~2020-03-11 10:18 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-03-11 9:30 [PATCH v3 0/3] Add support for CellWise cw2015 fuel gauge Tobias Schramm
2020-03-11 9:30 ` [PATCH v3 1/3] dt-bindings: Document cellwise vendor-prefix Tobias Schramm
2020-03-11 9:30 ` [PATCH v3 2/3] dt-bindings: power: supply: add cw2015_battery bindings Tobias Schramm
2020-03-11 17:20 ` Daniel Thompson
2020-03-11 23:17 ` Tobias Schramm
2020-03-12 10:17 ` Daniel Thompson
2020-03-11 9:30 ` [PATCH v3 3/3] power: supply: add CellWise cw2015 fuel gauge driver Tobias Schramm
2020-03-11 10:18 ` Andy Shevchenko [this message]
2020-03-11 10:22 ` Andy Shevchenko
2020-03-11 23:51 ` Tobias Schramm
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=20200311101830.GE1922688@smile.fi.intel.com \
--to=andriy.shevchenko@linux.intel.com \
--cc=Jonathan.Cameron@huawei.com \
--cc=broonie@kernel.org \
--cc=davem@davemloft.net \
--cc=devicetree@vger.kernel.org \
--cc=gregkh@linuxfoundation.org \
--cc=heiko.stuebner@theobroma-systems.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=mark.rutland@arm.com \
--cc=mchehab+samsung@kernel.org \
--cc=mripard@kernel.org \
--cc=robh+dt@kernel.org \
--cc=sam@ravnborg.org \
--cc=sre@kernel.org \
--cc=stephan@gerhold.net \
--cc=t.schramm@manjaro.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).