mbox series

[v2,0/9] Summit SMB3xx driver & device-tree

Message ID 20200607144113.10202-1-digetx@gmail.com
Headers show
Series Summit SMB3xx driver & device-tree | expand

Message

Dmitry Osipenko June 7, 2020, 2:41 p.m. UTC
We gathered existing patches, fixed and improved what we could and
final result is an working charging driver with device-tree support
for Nexus 7.

At this moment charging works with:
 - Nexus 7 2012 (grouper and tilapia)
 - Nexus 7 2013 (flo and deb)
 - ... and there are more devices equipped with these chargers.

Changelog:

v2: - Addressed v1 review comments from Rob Herring and Sebastian Reichel
      by moving out common battery properties from the charger node into the
      battery-cell node.

    - power_supply_register() of the SMB driver converted to resource-managed
      API variant.

    - Improved DT property names of the SMB binding by making them to follow
      the generic power-supply naming scheme (-microvolts at the end, etc).

David Heidelberg (6):
  dt-bindings: power: supply: Add device-tree binding for Summit SMB3xx
  power: supply: smb347-charger: Use resource-managed API
  power: supply: smb347-charger: Implement device-tree support
  power: supply: smb347-charger: Support SMB345 and SMB358
  power: supply: smb347-charger: Remove virtual smb347-battery
  ARM: dts: qcom: apq8064-nexus7: Add SMB345 charger node

Dmitry Osipenko (3):
  dt-bindings: battery: Add temperature properties
  power: supply: Support battery temperature device-tree properties
  power: supply: smb347-charger: Replace mutex with IRQ disable/enable

 .../bindings/power/supply/battery.txt         |  10 +
 .../power/supply/summit,smb347-charger.yaml   | 165 +++++
 .../boot/dts/qcom-apq8064-asus-nexus7-flo.dts |  23 +
 drivers/power/supply/Kconfig                  |   6 +-
 drivers/power/supply/power_supply_core.c      |  18 +
 drivers/power/supply/smb347-charger.c         | 565 +++++++++---------
 .../dt-bindings/power/summit,smb347-charger.h |  19 +
 include/linux/power_supply.h                  |   6 +
 8 files changed, 542 insertions(+), 270 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/power/supply/summit,smb347-charger.yaml
 create mode 100644 include/dt-bindings/power/summit,smb347-charger.h

Comments

Rob Herring (Arm) July 13, 2020, 11:39 p.m. UTC | #1
On Sun, Jun 07, 2020 at 05:41:05PM +0300, Dmitry Osipenko wrote:
> From: David Heidelberg <david@ixit.cz>

> 

> Summit SMB3xx series is a Programmable Switching Li+ Battery Charger.

> This patch adds device-tree binding for Summit SMB345, SMB347 and SMB358

> chargers.

> 

> Signed-off-by: David Heidelberg <david@ixit.cz>

> Signed-off-by: Dmitry Osipenko <digetx@gmail.com>

> ---

>  .../power/supply/summit,smb347-charger.yaml   | 165 ++++++++++++++++++

>  .../dt-bindings/power/summit,smb347-charger.h |  19 ++

>  2 files changed, 184 insertions(+)

>  create mode 100644 Documentation/devicetree/bindings/power/supply/summit,smb347-charger.yaml

>  create mode 100644 include/dt-bindings/power/summit,smb347-charger.h

> 

> diff --git a/Documentation/devicetree/bindings/power/supply/summit,smb347-charger.yaml b/Documentation/devicetree/bindings/power/supply/summit,smb347-charger.yaml

> new file mode 100644

> index 000000000000..eea0a6398c95

> --- /dev/null

> +++ b/Documentation/devicetree/bindings/power/supply/summit,smb347-charger.yaml

> @@ -0,0 +1,165 @@

> +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)

> +%YAML 1.2

> +---

> +$id: "http://devicetree.org/schemas/power/supply/summit,smb347-charger.yaml#"

> +$schema: "http://devicetree.org/meta-schemas/core.yaml#"

> +

> +title: Battery charger driver for SMB345, SMB347 and SMB358

> +

> +maintainers:

> +  - David Heidelberg <david@ixit.cz>

> +  - Dmitry Osipenko <digetx@gmail.com>

> +

> +properties:

> +  compatible:

> +    enum:

> +      - summit,smb345

> +      - summit,smb347

> +      - summit,smb358

> +

> +  reg:

> +    maxItems: 1

> +

> +  interrupts:

> +    maxItems: 1

> +

> +  monitored-battery:

> +    description: phandle to the battery node

> +    $ref: /schemas/types.yaml#/definitions/phandle

> +

> +  summit,enable-usb-charging:

> +    type: boolean

> +    description: Enable charging through USB.

> +

> +  summit,enable-otg-charging:

> +    type: boolean

> +    description: Provide power for USB OTG

> +

> +  summit,enable-mains-charging:

> +    type: boolean

> +    description: Enable charging through mains

> +

> +  summit,enable-charge-control:

> +    description: Enable charging control

> +    allOf:

> +      - $ref: /schemas/types.yaml#/definitions/uint32

> +      - enum:

> +          - 0 # SMB3XX_CHG_ENABLE_SW SW (I2C interface)

> +          - 1 # SMB3XX_CHG_ENABLE_PIN_ACTIVE_LOW Pin control (Active Low)

> +          - 2 # SMB3XX_CHG_ENABLE_PIN_ACTIVE_HIGH Pin control (Active High)

> +

> +  summit,fast-voltage-threshold-microvolt:

> +    description: Voltage threshold to transit to fast charge mode (in uV)

> +    allOf:

> +      - $ref: /schemas/types.yaml#/definitions/uint32


Anything with a standard unit suffix already has a type, so drop.

> +    minimum: 2400000

> +    maximum: 3000000

> +

> +  summit,mains-current-limit-microamp:

> +    description: Maximum input current from AC/DC input (in uA)

> +    allOf:

> +      - $ref: /schemas/types.yaml#/definitions/uint32

> +

> +  summit,usb-current-limit-microamp:

> +    description: Maximum input current from USB input (in uA)

> +    allOf:

> +      - $ref: /schemas/types.yaml#/definitions/uint32

> +

> +  summit,charge-current-compensation-microamp:

> +    description: Charge current compensation (in uA)

> +    allOf:

> +      - $ref: /schemas/types.yaml#/definitions/uint32

> +

> +  summit,chip-temperature-threshold-celsius:

> +    description: Chip temperature for thermal regulation in °C.

> +    allOf:

> +      - $ref: /schemas/types.yaml#/definitions/uint32

> +    enum: [100, 110, 120, 130]

> +

> +  summit,soft-compensation-method:

> +    description: Soft temperature limit compensation method

> +    allOf:

> +      - $ref: /schemas/types.yaml#/definitions/uint32

> +      - enum:

> +          - 0 # SMB3XX_SOFT_TEMP_COMPENSATE_NONE Compensation none

> +          - 1 # SMB3XX_SOFT_TEMP_COMPENSATE_CURRENT Current compensation

> +          - 2 # SMB3XX_SOFT_TEMP_COMPENSATE_VOLTAGE Voltage compensation

> +

> +allOf:

> +  - if:

> +      properties:

> +        compatible:

> +          enum:

> +            - summit,smb345

> +            - summit,smb358

> +

> +    then:

> +      properties:

> +        summit,mains-current-limit-microamp:

> +          enum: [ 300000,  500000,  700000, 1000000,

> +                 1500000, 1800000, 2000000]

> +

> +        summit,usb-current-limit-microamp:

> +          enum: [ 300000,  500000,  700000, 1000000,

> +                 1500000, 1800000, 2000000]

> +

> +        summit,charge-current-compensation-microamp:

> +          enum: [200000, 450000, 600000, 900000]

> +

> +    else:

> +      properties:

> +        summit,mains-current-limit-microamp:

> +          enum: [ 300000,  500000,  700000,  900000, 1200000,

> +                 1500000, 1800000, 2000000, 2200000, 2500000]

> +

> +        summit,usb-current-limit-microamp:

> +          enum: [ 300000,  500000,  700000,  900000, 1200000,

> +                 1500000, 1800000, 2000000, 2200000, 2500000]

> +

> +        summit,charge-current-compensation-microamp:

> +          enum: [250000, 700000, 900000, 1200000]

> +

> +required:

> +  - compatible

> +  - reg

> +

> +anyOf:

> +  - required:

> +      - summit,enable-usb-charging

> +  - required:

> +      - summit,enable-otg-charging

> +  - required:

> +      - summit,enable-mains-charging

> +

> +additionalProperties: false

> +

> +examples:

> +  - |

> +    #include <dt-bindings/power/summit,smb347-charger.h>

> +

> +    i2c {

> +        #address-cells = <1>;

> +        #size-cells = <0>;

> +

> +        charger@7f {

> +            compatible = "summit,smb347";

> +            reg = <0x7f>;

> +            status = "okay";

> +

> +            summit,enable-charge-control = <SMB3XX_CHG_ENABLE_PIN_ACTIVE_HIGH>;

> +            summit,chip-temperature-threshold-celsius = <110>;

> +            summit,mains-current-limit-microamp = <2000000>;

> +            summit,usb-current-limit-microamp = <500000>;

> +            summit,enable-usb-charging;

> +            summit,enable-mains-charging;

> +

> +            monitored-battery = <&battery>;

> +        };

> +    };

> +

> +    battery: battery-cell {

> +        compatible = "simple-battery";

> +        constant-charge-current-max-microamp = <1800000>;

> +        temperature-min-alert-celsius = <5>;

> +        temperature-max-alert-celsius = <40>;

> +    };

> diff --git a/include/dt-bindings/power/summit,smb347-charger.h b/include/dt-bindings/power/summit,smb347-charger.h

> new file mode 100644

> index 000000000000..d918bf321a71

> --- /dev/null

> +++ b/include/dt-bindings/power/summit,smb347-charger.h

> @@ -0,0 +1,19 @@

> +/* SPDX-License-Identifier: (GPL-2.0-or-later or MIT) */

> +/*

> + * Author: David Heidelberg <david@ixit.cz>

> + */

> +

> +#ifndef _DT_BINDINGS_SMB347_CHARGER_H

> +#define _DT_BINDINGS_SMB347_CHARGER_H

> +

> +/* Charging compensation method */

> +#define SMB3XX_SOFT_TEMP_COMPENSATE_NONE	0

> +#define SMB3XX_SOFT_TEMP_COMPENSATE_CURRENT	1

> +#define SMB3XX_SOFT_TEMP_COMPENSATE_VOLTAGE	2

> +

> +/* Charging enable control */

> +#define SMB3XX_CHG_ENABLE_SW			0

> +#define SMB3XX_CHG_ENABLE_PIN_ACTIVE_LOW	1

> +#define SMB3XX_CHG_ENABLE_PIN_ACTIVE_HIGH	2

> +

> +#endif

> -- 

> 2.26.0

>
Rob Herring (Arm) July 13, 2020, 11:46 p.m. UTC | #2
On Sun, Jun 07, 2020 at 05:41:06PM +0300, Dmitry Osipenko wrote:
> Document generic battery temperature properties.

> 

> Signed-off-by: Dmitry Osipenko <digetx@gmail.com>

> ---

>  .../devicetree/bindings/power/supply/battery.txt       | 10 ++++++++++

>  1 file changed, 10 insertions(+)


This is close to being converted to schema:

https://lore.kernel.org/linux-pm/20200707212914.31540-1-r-rivera-matos@ti.com/
 
> diff --git a/Documentation/devicetree/bindings/power/supply/battery.txt b/Documentation/devicetree/bindings/power/supply/battery.txt

> index 5e29595edd74..e0c35eff9d3f 100644

> --- a/Documentation/devicetree/bindings/power/supply/battery.txt

> +++ b/Documentation/devicetree/bindings/power/supply/battery.txt

> @@ -45,6 +45,16 @@ Optional Properties:

>     and corresponding battery internal resistance percent, which is used to look

>     up the resistance percent according to current temperature to get a accurate

>     batterty internal resistance in different temperatures.

> + - temperature-ambient-min-alert-celsius: Alert when ambient temperature of a

> +   battery is lower than threshold value.

> + - temperature-ambient-max-alert-celsius: Alert when ambient temperature of a

> +   battery is higher than threshold value.

> + - temperature-min-alert-celsius: Alert when battery temperature is lower

> +   than threshold value.

> + - temperature-max-alert-celsius: Alert when battery temperature is higher

> +   than threshold value.

> + - temperature-min-celsius: minimum temperature at which battery can operate

> + - temperature-max-celsius: maximum temperature at which battery can operate


Perhaps 'temperature' is redundant since we have units.

Perhaps do <min max> properties given specifying only min or max is 
probably not valid?

Rob
Dmitry Osipenko July 16, 2020, 5:24 p.m. UTC | #3
14.07.2020 02:46, Rob Herring пишет:
> On Sun, Jun 07, 2020 at 05:41:06PM +0300, Dmitry Osipenko wrote:

>> Document generic battery temperature properties.

>>

>> Signed-off-by: Dmitry Osipenko <digetx@gmail.com>

>> ---

>>  .../devicetree/bindings/power/supply/battery.txt       | 10 ++++++++++

>>  1 file changed, 10 insertions(+)

> 

> This is close to being converted to schema:

> 

> https://lore.kernel.org/linux-pm/20200707212914.31540-1-r-rivera-matos@ti.com/


Thanks! I'll keep an eye on this patch.

>> diff --git a/Documentation/devicetree/bindings/power/supply/battery.txt b/Documentation/devicetree/bindings/power/supply/battery.txt

>> index 5e29595edd74..e0c35eff9d3f 100644

>> --- a/Documentation/devicetree/bindings/power/supply/battery.txt

>> +++ b/Documentation/devicetree/bindings/power/supply/battery.txt

>> @@ -45,6 +45,16 @@ Optional Properties:

>>     and corresponding battery internal resistance percent, which is used to look

>>     up the resistance percent according to current temperature to get a accurate

>>     batterty internal resistance in different temperatures.

>> + - temperature-ambient-min-alert-celsius: Alert when ambient temperature of a

>> +   battery is lower than threshold value.

>> + - temperature-ambient-max-alert-celsius: Alert when ambient temperature of a

>> +   battery is higher than threshold value.

>> + - temperature-min-alert-celsius: Alert when battery temperature is lower

>> +   than threshold value.

>> + - temperature-max-alert-celsius: Alert when battery temperature is higher

>> +   than threshold value.

>> + - temperature-min-celsius: minimum temperature at which battery can operate

>> + - temperature-max-celsius: maximum temperature at which battery can operate

> 

> Perhaps 'temperature' is redundant since we have units.

> 

> Perhaps do <min max> properties given specifying only min or max is 

> probably not valid?


Thank you for the suggestions, I'll consider them for the v3!