Re: [PATCH] power: supply: Add driver for TI BQ2416X battery charger

From: Sebastian Reichel
Date: Mon Mar 20 2017 - 01:58:59 EST


Hi,

On Tue, Feb 07, 2017 at 01:09:09AM +0000, Wojciech Ziemba wrote:
> There is interest in adding a Linux driver for TI BQ2416X battery
> charger.

This is a strange sentence to introduce a patch. If there wasn't
you wouldn't have sent a patch...

> The driver supports BQ24160 chip, thus can be easily extended
> for other BQ2416X family chargers.

Doesn't it already do? Do you mean "I only tested the driver using
bq24160"?

> Device exposes 'POWER_SUPPLY_PROP_*' properties

ok.

> and a number of knobs for controlling the charging process

missing sysfs ABI documentation. Most of them are probably either
not needed, or should become standard POWER_SUPPLY_PROP_ properties.

> as well as sends power supply change notification via power-supply
> subsystem.

ok.

> Signed-off-by: Wojciech Ziemba <wojciech.ziemba@xxxxxxxxxxxx>
> ---
> .../devicetree/bindings/power/supply/bq2416x.txt | 71 +
> drivers/power/supply/Kconfig | 7 +
> drivers/power/supply/Makefile | 1 +
> drivers/power/supply/bq2416x_charger.c | 1871 ++++++++++++++++++++
> include/dt-bindings/power/bq2416x_charger.h | 23 +
> include/linux/power/bq2416x_charger.h | 80 +
> 6 files changed, 2053 insertions(+)
> create mode 100644 Documentation/devicetree/bindings/power/supply/bq2416x.txt
> create mode 100644 drivers/power/supply/bq2416x_charger.c
> create mode 100644 include/dt-bindings/power/bq2416x_charger.h
> create mode 100644 include/linux/power/bq2416x_charger.h
>
> diff --git a/Documentation/devicetree/bindings/power/supply/bq2416x.txt b/Documentation/devicetree/bindings/power/supply/bq2416x.txt
> new file mode 100644
> index 0000000..8f4b814
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/power/supply/bq2416x.txt
> @@ -0,0 +1,71 @@
> +Binding for TI bq2416x Li-Ion Charger
> +
> +Required properties:
> +===================
> +- compatible: one of the following:
> + * "ti,bq24160"
> + * "ti,bq24160a"
> + * "ti,bq24161"
> + * "ti,bq24161b"
> + * "ti,bq24163"
> + * "ti,bq24168"
> +
> +- reg: I2c address of the device.
> +- interrupt-parent: The irq controller(phandle) connected to INT pin on BQ2416x
> +- interrupts: The irq number assigned for INT pin.
> +
> +Optional properties:
> +===================
> +- interrupt-names: Meanigfull irq name.

Drop this, it's not used.

> +- ti,charge-voltage: Charge volatge [mV].
> +- ti,charge-current: Charge current [mA].
> +- ti,termination-current: Termination current [mA}.

These are battery dependent. You should get them from the
battery instead.

> +- ti,in-current-limit: IN source current limit. enum:
> + - IN_CURR_LIM_1500MA (0)
> + - IN_CURR_LIM_2500MA (1)

This is probably needed. Just use an integer with the current
instead of the enum. The driver can just bail out if invalid
value was specified.

> +- ti,usb-current-limit: USB source current limit. enum:
> + - USB_CURR_LIM_100MA (0)
> + - USB_CURR_LIM_150MA (1)
> + - USB_CURR_LIM_500MA (2)
> + - USB_CURR_LIM_800MA (3)
> + - USB_CURR_LIM_900MA (4)
> + - USB_CURR_LIM_1500MA (5)

Let's not add that to the DT binding. It should be auto-detected.
Additionally you can make the sysfs property writable.

> +- ti,status-pin-enable: 0 or 1. Enable charge status output STAT pin.
> +- ti,current-termination-enable:0 or 1. Enable charge current termination.

If termination current is specified -> enable, otherwise -> disable,
so not needed.

> +- ti,usb-dpm-voltage: USB dpm voltage [mV]. Refer to datasheet.
> +- ti,in-dpm-voltage: IN dpm voltage [mV].

I will have to check datasheet before commenting about this one.

> +- ti,safety-timer: Safety timer. enum:
> + - TMR_27MIN (0)
> + - TMR_6H (1)
> + - TMR_9H (2)
> + - TMR_OFF (3)

This does not belong into DT. Just always set it to 27 minutes and
properly reset the timer in the driver. You will also need a suspend
handler, that disables the timer (or wakeup every now and then to
reset it).

> +- ti,supplied-to: string array: max 4. Names of devices to which
> + the charger supplies.

There is a standard binding for this, which is documented here:

Documentation/devicetree/bindings/power/supply/power_supply.txt

> +Example:
> +=======
> +#include <dt-bindings/power/bq2416x_charger.h>
> +
> +bq24160@6b {
> + compatible = "ti,bq24160";
> + reg = <0x6b>;
> +
> + interrupt-parent = <&gpio5>;
> + interrupts = <31 IRQ_TYPE_EDGE_RISING>;
> + interrupt-names = "bq24160-charge-status-change";
> +
> + ti,charge-voltage = <4300>;
> + ti,charge-current = <1300>;
> + ti,termination-current = <100>;
> + ti,in-current-limit = <IN_CURR_LIM_1500MA>;
> + ti,usb-current-limit = <USB_CURR_LIM_1500MA>;
> + ti,status-pin-enable = <1>;
> + ti,current-termination-enable = <1>;
> + ti,usb-dpm-voltage = <4300>;
> + ti,in-dpm-voltage = <4300>;
> + ti,safety-timer = <TMR_6H>; /* charge max 6h */
> + ti,supplied-to = "bq27621-0";
> +};
> diff --git a/drivers/power/supply/Kconfig b/drivers/power/supply/Kconfig
> index 76806a0..575096e 100644
> --- a/drivers/power/supply/Kconfig
> +++ b/drivers/power/supply/Kconfig
> @@ -413,6 +413,13 @@ config CHARGER_BQ2415X
> You'll need this driver to charge batteries on e.g. Nokia
> RX-51/N900.
>
> +config CHARGER_BQ2416X
> + tristate "TI BQ2416x Dual-Input, Single Cell Switch-Mode Li-Ion charger"
> + depends on I2C
> + help
> + Say Y here to enable support for the TI BQ2416x battery charger.
> + The driver is configured to operate with a single lithium cell.
> +
> config CHARGER_BQ24190
> tristate "TI BQ24190 battery charger driver"
> depends on I2C
> diff --git a/drivers/power/supply/Makefile b/drivers/power/supply/Makefile
> index 36c599d..73711e0 100644
> --- a/drivers/power/supply/Makefile
> +++ b/drivers/power/supply/Makefile
> @@ -63,6 +63,7 @@ obj-$(CONFIG_CHARGER_MAX8997) += max8997_charger.o
> obj-$(CONFIG_CHARGER_MAX8998) += max8998_charger.o
> obj-$(CONFIG_CHARGER_QCOM_SMBB) += qcom_smbb.o
> obj-$(CONFIG_CHARGER_BQ2415X) += bq2415x_charger.o
> +obj-$(CONFIG_CHARGER_BQ2416X) += bq2416x_charger.o
> obj-$(CONFIG_CHARGER_BQ24190) += bq24190_charger.o
> obj-$(CONFIG_CHARGER_BQ24257) += bq24257_charger.o
> obj-$(CONFIG_CHARGER_BQ24735) += bq24735-charger.o
> diff --git a/drivers/power/supply/bq2416x_charger.c b/drivers/power/supply/bq2416x_charger.c
> new file mode 100644
> index 0000000..fa13e55
> --- /dev/null
> +++ b/drivers/power/supply/bq2416x_charger.c
> @@ -0,0 +1,1871 @@
> +/*
> + * Driver for BQ2416X Li-Ion Battery Charger
> + *
> + * Copyright (C) 2015 Verifone, Inc.
> + *
> + * Author: Wojciech Ziemba <wojciech.ziemba@xxxxxxxxxxxx>
> + *
> + * This package is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License version 2 as
> + * published by the Free Software Foundation.
> + *
> + * THIS PACKAGE IS PROVIDED AS IS AND WITHOUT ANY EXPRESS OR
> + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
> + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
> + *
> + * The bq2416x series is a 2.5A, Dual-Input, Single-Cell Switched-Mode
> + * Li-Ion Battery Charger with Power
> + * Path Management and I2C Interface

strange line wrapping above.

> + * This driver was tested on BQ24160.
> + *
> + * Datasheets:
> + * http://www.ti.com/product/bq24160
> + * http://www.ti.com/product/bq24160a
> + * http://www.ti.com/product/bq24161
> + * http://www.ti.com/product/bq24161b
> + * http://www.ti.com/product/bq24163
> + * http://www.ti.com/product/bq24168
> + */
> +
> +#include <linux/module.h>
> +#include <linux/slab.h>
> +#include <linux/interrupt.h>
> +#include <linux/delay.h>
> +#include <linux/i2c.h>
> +#include <linux/pm_runtime.h>
> +#include <linux/hwmon-sysfs.h>
> +#include <linux/regmap.h>
> +#include <linux/power_supply.h>
> +#include <linux/power/bq2416x_charger.h>

[...]

> diff --git a/include/linux/power/bq2416x_charger.h b/include/linux/power/bq2416x_charger.h
> new file mode 100644
> index 0000000..c561666
> --- /dev/null
> +++ b/include/linux/power/bq2416x_charger.h
> @@ -0,0 +1,80 @@
> +/*
> + * Driver for BQ2416X Li-Ion Battery Charger
> + *
> + * Copyright (C) 2015 Verifone, Inc.
> + *
> + * Author: Wojciech Ziemba <wojciech.ziemba@xxxxxxxxxxxx>
> + *
> + * This package is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License version 2 as
> + * published by the Free Software Foundation.
> + *
> + * THIS PACKAGE IS PROVIDED AS IS AND WITHOUT ANY EXPRESS OR
> + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
> + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
> + *
> + * The bq2416x series is a 2.5A, Dual-Input, Single-Cell Switched-Mode
> + * Li-Ion Battery Charger with Power
> + * Path Management and I2C Interface
> + *
> + */
> +
> +#ifndef _BQ2416X_CHARGER_H
> +#define _BQ2416X_CHARGER_H
> +
> +/* IN(Wall) source limit */
> +enum in_curr_lim {
> + IN_CURR_LIM_1500MA,
> + IN_CURR_LIM_2500MA,
> +};
> +
> +/* USB source current limit */
> +enum usb_curr_lim {
> + USB_CURR_LIM_100MA,
> + USB_CURR_LIM_150MA,
> + USB_CURR_LIM_500MA,
> + USB_CURR_LIM_800MA,
> + USB_CURR_LIM_900MA,
> + USB_CURR_LIM_1500MA,
> +};
> +
> +/* Safety timer settings */
> +enum safe_tmr {
> + TMR_27MIN,
> + TMR_6H,
> + TMR_9H,
> + TMR_OFF,
> +};
> +
> +/**
> + * struct bq2416x_pdata - Platform data for bq2416x chip. It contains default
> + * board voltages and currents.
> + * @charge_voltage: charge voltage in [mV]
> + * @charge_current: charge current in [mA]
> + * @in_curr_limit: Current limit for IN source . Enum 1.5A or 2.5A
> + * @usb_curr_limit: Current limit for USB source Enum 100mA - 1500mA
> + * @curr_term_en: enable charge terination by current
> + * @term_current: charge termination current in [mA]
> + * @usb_dpm_voltage: USB DPM voltage [mV]
> + * @in_dpm_voltage: IN DPM voltage [mV]
> + * @stat_pin_en: status pin enable
> + * @safety_timer: safety timer enum: 27min, 6h, 9h, off.
> + * @num_supplicants: number of notify devices. Max 4.
> + * @supplied_to: array of names of supplied to devices
> + */
> +struct bq2416x_pdata {
> + int charge_voltage;
> + int charge_current;
> + enum in_curr_lim in_curr_limit;
> + enum usb_curr_lim usb_curr_limit;
> + int curr_term_en;
> + int term_current;
> + int usb_dpm_voltage;
> + int in_dpm_voltage;
> + int stat_pin_en;
> + enum safe_tmr safety_timer;
> + int num_supplicants;
> + const char *supplied_to[4];
> +};
> +
> +#endif /* _BQ2416X_CHARGER_H */

Please use device properties instead of platform_data (especially if
this is not yet used).

Apart from the comments I only skipped quickly over the driver. I
will have a more detailed look once the basic things are fixed.

-- Sebastian

Attachment: signature.asc
Description: PGP signature