mbox series

[v2,0/3] power: supply: Lenovo Yoga C630 EC

Message ID 20230205152809.2233436-1-dmitry.baryshkov@linaro.org
Headers show
Series power: supply: Lenovo Yoga C630 EC | expand

Message

Dmitry Baryshkov Feb. 5, 2023, 3:28 p.m. UTC
This adds binding, driver and the DT support for the Lenovo Yoga C630
Embedded Controller, to provide battery information.

Support for this EC was implemented by Bjorn, who can no longer work on
this topic. Thus it was agreed that I'll pick this patchset up and
update it following the pending review comments.

Changes since v1:
- Dropped DP support for now, as the bindings are in process of being
  discussed separately,
- Merged dt patch into the same patchseries,
- Removed the fixed serial number battery property,
- Fixed indentation of dt bindings example,
- Added property: reg and unevaluatedProperties to the connector
  bindings.

Bjorn Andersson (3):
  dt-bindings: power: supply: Add Lenovo Yoga C630 EC
  power: supply: Add Lenovo Yoga C630 EC driver
  arm64: dts: qcom: c630: Add Embedded Controller node

 .../power/supply/lenovo,yoga-c630-ec.yaml     |  83 +++
 .../boot/dts/qcom/sdm850-lenovo-yoga-c630.dts |  35 ++
 drivers/power/supply/Kconfig                  |  14 +
 drivers/power/supply/Makefile                 |   1 +
 drivers/power/supply/yoga-c630-ec.c           | 471 ++++++++++++++++++
 5 files changed, 604 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/power/supply/lenovo,yoga-c630-ec.yaml
 create mode 100644 drivers/power/supply/yoga-c630-ec.c

Comments

Krzysztof Kozlowski Feb. 6, 2023, 3:16 p.m. UTC | #1
On 05/02/2023 16:28, Dmitry Baryshkov wrote:
> From: Bjorn Andersson <bjorn.andersson@linaro.org>
> 
> Add binding for the Embedded Controller found in the Qualcomm
> Snapdragon-based Lenovo Yoga C630.
> 
> Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>

Loooks ok for me.

Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>

If there is going to be resend, three nits below:


> ---
>  .../power/supply/lenovo,yoga-c630-ec.yaml     | 83 +++++++++++++++++++
>  1 file changed, 83 insertions(+)
>  create mode 100644 Documentation/devicetree/bindings/power/supply/lenovo,yoga-c630-ec.yaml
> 
> diff --git a/Documentation/devicetree/bindings/power/supply/lenovo,yoga-c630-ec.yaml b/Documentation/devicetree/bindings/power/supply/lenovo,yoga-c630-ec.yaml
> new file mode 100644
> index 000000000000..37977344f157
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/power/supply/lenovo,yoga-c630-ec.yaml
> @@ -0,0 +1,83 @@
> +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
> +%YAML 1.2
> +---
> +$id: http://devicetree.org/schemas/power/supply/lenovo,yoga-c630-ec.yaml#
> +$schema: http://devicetree.org/meta-schemas/core.yaml#
> +
> +title: Lenovo Yoga C630 Embedded Controller.

Drop trailing full stop

(...)

> +
> +examples:
> +  - |+

Just:
  - |

> +    #include <dt-bindings/interrupt-controller/irq.h>
> +    i2c1 {

Just: "i2c"

> +        clock-frequency = <400000>;
> +
> +        #address-cells = <1>;
> +        #size-cells = <0>;


Best regards,
Krzysztof
Brian Masney Feb. 6, 2023, 6:19 p.m. UTC | #2
On Sun, Feb 05, 2023 at 05:28:07PM +0200, Dmitry Baryshkov wrote:
> From: Bjorn Andersson <bjorn.andersson@linaro.org>
> 
> Add binding for the Embedded Controller found in the Qualcomm
> Snapdragon-based Lenovo Yoga C630.
> 
> Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
> ---
>  .../power/supply/lenovo,yoga-c630-ec.yaml     | 83 +++++++++++++++++++
>  1 file changed, 83 insertions(+)
>  create mode 100644 Documentation/devicetree/bindings/power/supply/lenovo,yoga-c630-ec.yaml
> 
> diff --git a/Documentation/devicetree/bindings/power/supply/lenovo,yoga-c630-ec.yaml b/Documentation/devicetree/bindings/power/supply/lenovo,yoga-c630-ec.yaml
> new file mode 100644
> index 000000000000..37977344f157
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/power/supply/lenovo,yoga-c630-ec.yaml
> @@ -0,0 +1,83 @@
> +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
> +%YAML 1.2
> +---
> +$id: http://devicetree.org/schemas/power/supply/lenovo,yoga-c630-ec.yaml#
> +$schema: http://devicetree.org/meta-schemas/core.yaml#
> +
> +title: Lenovo Yoga C630 Embedded Controller.
> +
> +maintainers:
> +  - Bjorn Andersson <bjorn.andersson@linaro.org>

Since this is new: Should this be updated with Bjorn's kernel.org
address? Last I checked, this address doesn't exist anymore.

Brian
Brian Masney Feb. 6, 2023, 6:28 p.m. UTC | #3
On Sun, Feb 05, 2023 at 05:28:08PM +0200, Dmitry Baryshkov wrote:
> +static int yoga_c630_ec_adpt_get_property(struct power_supply *psy,
> +					  enum power_supply_property psp,
> +					  union power_supply_propval *val)
> +{
> +	struct yoga_c630_ec *ec = power_supply_get_drvdata(psy);
> +	int rc = 0;
> +
> +	yoga_c630_ec_update_adapter_status(ec);
> +
> +	switch (psp) {
> +	case POWER_SUPPLY_PROP_ONLINE:
> +		val->intval = ec->adapter_online;
> +		break;
> +	default:
> +		rc = -EINVAL;
> +		break;
> +	}
> +
> +	return rc;

You can simplify this function by getting rid of the switch statement
and rc variable:

	if (psp == POWER_SUPPLY_PROP_ONLINE) {
		val->intval = ec->adapter_online;
		return 0;
	}

	return -EINVAL;

Brian
Dmitry Baryshkov Feb. 7, 2023, 12:09 a.m. UTC | #4
On 06/02/2023 20:19, Brian Masney wrote:
> On Sun, Feb 05, 2023 at 05:28:07PM +0200, Dmitry Baryshkov wrote:
>> From: Bjorn Andersson <bjorn.andersson@linaro.org>
>>
>> Add binding for the Embedded Controller found in the Qualcomm
>> Snapdragon-based Lenovo Yoga C630.
>>
>> Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
>> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
>> ---
>>   .../power/supply/lenovo,yoga-c630-ec.yaml     | 83 +++++++++++++++++++
>>   1 file changed, 83 insertions(+)
>>   create mode 100644 Documentation/devicetree/bindings/power/supply/lenovo,yoga-c630-ec.yaml
>>
>> diff --git a/Documentation/devicetree/bindings/power/supply/lenovo,yoga-c630-ec.yaml b/Documentation/devicetree/bindings/power/supply/lenovo,yoga-c630-ec.yaml
>> new file mode 100644
>> index 000000000000..37977344f157
>> --- /dev/null
>> +++ b/Documentation/devicetree/bindings/power/supply/lenovo,yoga-c630-ec.yaml
>> @@ -0,0 +1,83 @@
>> +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
>> +%YAML 1.2
>> +---
>> +$id: http://devicetree.org/schemas/power/supply/lenovo,yoga-c630-ec.yaml#
>> +$schema: http://devicetree.org/meta-schemas/core.yaml#
>> +
>> +title: Lenovo Yoga C630 Embedded Controller.
>> +
>> +maintainers:
>> +  - Bjorn Andersson <bjorn.andersson@linaro.org>
> 
> Since this is new: Should this be updated with Bjorn's kernel.org
> address? Last I checked, this address doesn't exist anymore.

Ack, nice catch.

> 
> Brian
>
Sebastian Reichel Feb. 13, 2023, 9:11 p.m. UTC | #5
Hi,

On Sun, Feb 05, 2023 at 05:28:08PM +0200, Dmitry Baryshkov wrote:
> From: Bjorn Andersson <bjorn.andersson@linaro.org>
> 
> The Qualcomm Snapdragon-based Lenovo Yoga C630 has some sort of EC
> providing AC-adapter and battery status, as well as USB Type-C altmode
> notifications for Displayport operation.
> 
> The Yoga C630 ships with Windows, where these operations primarily are
> implemented in ACPI, but due to various issues with the hardware
> representation therein it's not possible to run Linux on this
> information. As such this is a best-effort re-implementation of these
> operations, based on the register map expressed in ACPI and a fair
> amount of trial and error.
> 
> Tested-by: Steev Klimaszewski <steev@kali.org>
> Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
> ---

[...]

> +static bool yoga_c630_ec_is_charged(struct yoga_c630_ec *ec)
> +{
> +	if (ec->bat_status != 0)
> +		return false;
> +
> +	if (ec->full_charge_capacity == ec->capacity_now)
> +		return true;
> +
> +	if (ec->design_capacity == ec->capacity_now)
> +		return true;

For other platforms I've seen the current capacity sometimes
reaching higher values than the full charge capacity, so it's better
to use <= here.

> +	return false;
> +}

[...]

> +static int yoga_c630_ec_query_usb_event(struct yoga_c630_ec *ec)
> +{
> +	struct device *dev = &ec->client->dev;
> +	int event;
> +
> +	mutex_lock(&ec->lock);
> +	event = yoga_c630_ec_read8(ec, LENOVO_EC_QUERY_USB_EVENT);
> +	mutex_unlock(&ec->lock);
> +	if (event < 0) {
> +		dev_err(dev, "unable to query USB event\n");
> +		return event;
> +	}
> +
> +	/* FIXME: handle the returned event to set the Type-C properties */

I guess this is more of a TODO than a FIXME? :)

> +
> +	return 0;
> +}

-- Sebastian