Received: by 2002:ac0:946b:0:0:0:0:0 with SMTP id j40csp4352210imj; Tue, 12 Feb 2019 14:27:48 -0800 (PST) X-Google-Smtp-Source: AHgI3IaqfLwRsGIvK7qxhwgNZQJu/Wh+R+YWezrQQPuBnf1P1LDBCNIfg8ZJwg2h59gtUks2kWTf X-Received: by 2002:a63:6a07:: with SMTP id f7mr2467269pgc.118.1550010468814; Tue, 12 Feb 2019 14:27:48 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1550010468; cv=none; d=google.com; s=arc-20160816; b=ycq20emsTwHIA+8hM5VDDLx3dLptFy+1pddd3/r3ueMREUcBAOghAj4PBDoSZOl+gB Z+9i6qm7KgqSxH/WgRtaVNIKNhvEGAduDi7yBJg5sdADeZW/NM9KbbfTvWXALGOgScaI vkKwW+STptuZOWXwOM4M4v4m8Zck2chy9ZusV6IVnZOOD1EITyCa9VZ7bCDtGo72JjCB y7749L5uw/JUQVqMQmgSK6jvwahaKGfTmdLZoIrVcVf/vW5NNT2Etci2hgM4ZDR136Mr kEM1ypIYB1YXrAydvZ4G8Do9clxl8kADtEW+pGkFL5Hp42E+z3pnT1oiwGVuSjdcHWz6 TMNg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:in-reply-to :content-disposition:mime-version:references:message-id:subject:cc :to:from:date; bh=UgAiOuyZzX8vx6ytiaWNqPRbR6QsJgHCfVEp5vBkwVI=; b=0nVhPAASVK2rd1oei69YSYodzpaxC1qc2Tixq/13l5oJHhoyZrvkAIYxbA1K3YQCHi /14TSbgFe2nUBsFiBmnz4alvbaAr2AyujsbrbTuTJumBDOpRKHLsCCGbbk+Lr3XrJjnx G4+/iz6zUM7iLjvUwn17P3yfcsuT12c4hk9X+mZf2Lzpq4pyQTirWui3FaTqBF9+trcO 8eDi1XBl9uPsBvT7BY81v9kDio5FhHOflQSgqUighzSMkLggqMnxrvPbnjco8vwZlX2r /Iu9r8YBPQ+c6o/dsFiLBjCHR1vS/9wfz3QGLzPDVyW0AbtPH3wtUXWWfDQIJnyWhEkb 3SMA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=collabora.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id s12si838954pgm.586.2019.02.12.14.27.32; Tue, 12 Feb 2019 14:27:48 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=collabora.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732754AbfBLVq5 (ORCPT + 99 others); Tue, 12 Feb 2019 16:46:57 -0500 Received: from bhuna.collabora.co.uk ([46.235.227.227]:43748 "EHLO bhuna.collabora.co.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728096AbfBLVqy (ORCPT ); Tue, 12 Feb 2019 16:46:54 -0500 Received: from [127.0.0.1] (localhost [127.0.0.1]) (Authenticated sender: sre) with ESMTPSA id DED7B27EC2B Received: by earth.universe (Postfix, from userid 1000) id A3EBA3C08DD; Tue, 12 Feb 2019 22:46:48 +0100 (CET) Date: Tue, 12 Feb 2019 22:46:48 +0100 From: Sebastian Reichel To: Virendra Kakade Cc: devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org, lee.jones@linaro.org, robh+dt@kernel.org, mark.rutland@arm.com, moritz.fischer@ettus.com Subject: Re: [RFC 4/6] power: supply: Ettus Research E31x charger driver Message-ID: <20190212214648.77lzvexfs2v46ejn@earth.universe> References: <20190212010143.3729-1-virendra.kakade@ni.com> <20190212010143.3729-5-virendra.kakade@ni.com> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha512; protocol="application/pgp-signature"; boundary="zju52o37iaea74zq" Content-Disposition: inline In-Reply-To: <20190212010143.3729-5-virendra.kakade@ni.com> User-Agent: NeoMutt/20180716 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org --zju52o37iaea74zq Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Hi, On Mon, Feb 11, 2019 at 07:01:41PM -0600, Virendra Kakade wrote: > Add support for E31x devices charger which is a sub-device of E31X-PMU. > Enables query of charger properties from device tree. >=20 > Signed-off-by: Virendra Kakade > --- > drivers/power/supply/Kconfig | 6 + > drivers/power/supply/Makefile | 1 + > drivers/power/supply/e31x-charger.c | 190 ++++++++++++++++++++++++++++ > include/linux/mfd/e31x-pmu.h | 4 + > 4 files changed, 201 insertions(+) > create mode 100644 drivers/power/supply/e31x-charger.c >=20 > diff --git a/drivers/power/supply/Kconfig b/drivers/power/supply/Kconfig > index e901b9879e7e..3d043b8fd49c 100644 > --- a/drivers/power/supply/Kconfig > +++ b/drivers/power/supply/Kconfig > @@ -660,4 +660,10 @@ config FUEL_GAUGE_SC27XX > Say Y here to enable support for fuel gauge with SC27XX > PMIC chips. > =20 > +config E31X_CHARGER > + tristate "Ettus Research E31x charger support" > + depends on MFD_E31X_PMU > + help > + This adds support for the battery charger in Ettus Research E31x PMU. > + > endif # POWER_SUPPLY > diff --git a/drivers/power/supply/Makefile b/drivers/power/supply/Makefile > index b731c2a9b695..6f4f8ca5484e 100644 > --- a/drivers/power/supply/Makefile > +++ b/drivers/power/supply/Makefile > @@ -87,3 +87,4 @@ obj-$(CONFIG_AXP288_CHARGER) +=3D axp288_charger.o > obj-$(CONFIG_CHARGER_CROS_USBPD) +=3D cros_usbpd-charger.o > obj-$(CONFIG_CHARGER_SC2731) +=3D sc2731_charger.o > obj-$(CONFIG_FUEL_GAUGE_SC27XX) +=3D sc27xx_fuel_gauge.o > +obj-$(CONFIG_E31X_CHARGER) +=3D e31x-charger.o > diff --git a/drivers/power/supply/e31x-charger.c b/drivers/power/supply/e= 31x-charger.c > new file mode 100644 > index 000000000000..f154482bf95e > --- /dev/null > +++ b/drivers/power/supply/e31x-charger.c > @@ -0,0 +1,190 @@ > +// SPDX-License-Identifier: GPL-2.0 This specifies GPLv2 only, but MODULE_LICENSE("GPL") specifies GPL2 or later. Please fix one of them. > +/* > + * Copyright (c) 2018 National Instruments Corp > + * Author: Virendra Kakade > + * > + * Ettus Research E31x charger driver > + */ > + > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include Please check the includes. Quite a few seem to be unused. > + > +#define E31X_PMU_CHARGER_HEALTH_MASK GENMASK(1, 0) > +#define E31X_PMU_CHARGER_HEALTH_SHIFT 0 > +#define E31X_PMU_CHARGER_CHARGE_TYPE_MASK GENMASK(4, 3) > +#define E31X_PMU_CHARGER_CHARGE_TYPE_SHIFT 3 > + > +struct e31x_charger_dev { > + struct regmap *regmap; > + struct power_supply *supply; > +}; > + > +static int e31x_charger_get_health(struct e31x_charger_dev *charger, > + union power_supply_propval *val) > +{ > + u32 value; > + int err; > + > + err =3D regmap_read(charger->regmap, E31X_PMU_REG_CHARGER, &value); > + if (err) > + return err; > + > + value =3D E31X_PMU_GET_FIELD(CHARGER_HEALTH, value); > + switch (value) { > + case 0x0: > + val->intval =3D POWER_SUPPLY_HEALTH_GOOD; > + break; > + case 0x1: > + val->intval =3D POWER_SUPPLY_HEALTH_UNSPEC_FAILURE; > + break; > + case 0x2: > + val->intval =3D POWER_SUPPLY_HEALTH_OVERVOLTAGE; > + break; > + case 0x3: > + val->intval =3D POWER_SUPPLY_HEALTH_OVERHEAT; > + break; > + default: > + val->intval =3D POWER_SUPPLY_HEALTH_UNKNOWN; > + break; > + }; > + > + return 0; > +} > + > +static int e31x_charger_get_type(struct e31x_charger_dev *charger, > + union power_supply_propval *val) > +{ > + u32 value; > + int err; > + > + err =3D regmap_read(charger->regmap, E31X_PMU_REG_CHARGER, &value); > + if (err) > + return err; > + > + value =3D E31X_PMU_GET_FIELD(CHARGER_CHARGE_TYPE, value); > + switch (value) { > + case 0x0: > + val->intval =3D POWER_SUPPLY_CHARGE_TYPE_NONE; > + break; > + case 0x1: > + val->intval =3D POWER_SUPPLY_CHARGE_TYPE_TRICKLE; > + break; > + case 0x2: > + val->intval =3D POWER_SUPPLY_CHARGE_TYPE_FAST; > + break; > + default: > + val->intval =3D POWER_SUPPLY_CHARGE_TYPE_NONE; > + break; > + }; > + return 0; > +} > + > +static int e31x_charger_get_online(struct e31x_charger_dev *charger, > + union power_supply_propval *val) > +{ > + u32 value; > + int err; > + > + err =3D regmap_read(charger->regmap, E31X_PMU_REG_CHARGER, &value); > + if (err) > + return err; > + > + value =3D E31X_PMU_GET_FIELD(CHARGER_ONLINE, value); > + val->intval =3D !!value; > + > + return 0; > +} > + > +static int e31x_charger_get_property(struct power_supply *psy, > + enum power_supply_property psp, > + union power_supply_propval *val) > +{ > + struct e31x_charger_dev *charger =3D power_supply_get_drvdata(psy); > + int err =3D -EINVAL; > + > + switch (psp) { > + case POWER_SUPPLY_PROP_HEALTH: > + return e31x_charger_get_health(charger, val); > + case POWER_SUPPLY_PROP_CHARGE_TYPE: > + return e31x_charger_get_type(charger, val); > + case POWER_SUPPLY_PROP_ONLINE: > + return e31x_charger_get_online(charger, val); > + case POWER_SUPPLY_PROP_SCOPE: > + val->intval =3D POWER_SUPPLY_SCOPE_SYSTEM; > + return 0; > + default: > + break; > + } > + > + return err; > +} > + > +static enum power_supply_property e31x_charger_properties[] =3D { > + POWER_SUPPLY_PROP_HEALTH, > + POWER_SUPPLY_PROP_CHARGE_TYPE, > + POWER_SUPPLY_PROP_ONLINE, > + POWER_SUPPLY_PROP_SCOPE, > +}; > + > +static const struct power_supply_desc e31x_charger_desc =3D { > + .name =3D "e31x-charger", > + .type =3D POWER_SUPPLY_TYPE_MAINS, > + .properties =3D e31x_charger_properties, > + .num_properties =3D ARRAY_SIZE(e31x_charger_properties), > + .get_property =3D e31x_charger_get_property, > +}; > + > +static const struct of_device_id e31x_charger_id[] =3D { > + { .compatible =3D "ni,e31x-charger" }, > + { }, > +}; > + > +static int e31x_charger_probe(struct platform_device *pdev) > +{ > + struct power_supply_config psy_cfg =3D {}; > + struct e31x_charger_dev *charger; > + > + if (!of_device_is_available(pdev->dev.of_node)) > + return -ENODEV; > + > + charger =3D devm_kzalloc(&pdev->dev, sizeof(*charger), GFP_KERNEL); > + if (!charger) > + return -ENOMEM; > + > + charger->regmap =3D syscon_regmap_lookup_by_phandle(\ useless \ > + pdev->dev.parent->of_node, "regmap"); > + > + psy_cfg.of_node =3D pdev->dev.of_node; > + psy_cfg.drv_data =3D charger; > + > + charger->supply =3D devm_power_supply_register(&pdev->dev, > + &e31x_charger_desc, > + &psy_cfg); > + > + if (IS_ERR(charger->supply)) > + return PTR_ERR(charger->supply); > + return 0; > +} > + > +static struct platform_driver e31x_charger_driver =3D { > + .driver =3D { > + .name =3D "e31x-charger", > + .of_match_table =3D e31x_charger_id, > + }, > + .probe =3D e31x_charger_probe, > +}; > +module_platform_driver(e31x_charger_driver); > + > +MODULE_AUTHOR("Virendra Kakade "); > +MODULE_DESCRIPTION("E31x charger driver"); > +MODULE_LICENSE("GPL"); > diff --git a/include/linux/mfd/e31x-pmu.h b/include/linux/mfd/e31x-pmu.h > index c57d5a8c1aad..e0649845fe4d 100644 > --- a/include/linux/mfd/e31x-pmu.h > +++ b/include/linux/mfd/e31x-pmu.h > @@ -12,9 +12,13 @@ > #include > =20 > #define E31X_PMU_REG_MISC 0x04 > +#define E31X_PMU_REG_CHARGER 0x0c > =20 > #define E31X_PMU_GET_FIELD(name, reg) \ > (((reg) & E31X_PMU_## name ##_MASK) >> \ > E31X_PMU_## name ##_SHIFT) > =20 > +#define E31X_PMU_CHARGER_ONLINE_MASK BIT(2) > +#define E31X_PMU_CHARGER_ONLINE_SHIFT 2 > + > #endif /* MFD_E31X_PMU_H */ Otherwise this looks good. -- Sebastian --zju52o37iaea74zq Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQIzBAEBCgAdFiEE72YNB0Y/i3JqeVQT2O7X88g7+poFAlxjPsUACgkQ2O7X88g7 +pqPdA//UlODPX4uiVWGpoOU2iAxdEDSTzGHW+dHAc/LZ5/v2NeXP588CHR+Zltp cF1S//KK7Si/59b6xig2/yIi5mr2XKLHZRc6FPGASUBXhg7LbhFbZb5wFmLz9w2V yyi1DOAiLA1dNVAul1dJMDzOVcGHtLehjMtblvdtIx0MYi8DNcHGXT5r/f3MHeCX gqgD+4V3QATAXtGCZiKjPX5oVUzsss8+Dy4qVAARRWT70rnWvddhQXAfXMLgH0yb oyH74eCIhNMIgpVy7tgJeRRwtp6MQn5LCSPyW+Eobxma3IMhWziT94xbhB0LFa7n swycRFtbFpMDJx/XGE5GFL3UP6PUGTSHqmfL5wrcgT/AheS7Ij8L+DMPptvSGb9h LxzHOpDHXTugwGUwdUnhOgF1+Lc/+C8dSEmznRjP++RdqSxbHk275hE89RGBcGJ5 SWLzbzVJFpewnTO6CDlm7GBvvw5uMPDKQGnWA0hkoO/Bq5j4lHugGOZ17e5LDB3Q Un9gvdeiG7bdBzMomK4qfy/1BG8DU7VAVaQPRQmhxWl9xCydQ+8gP1VoU8nYLbCk bnhSm6mI9rSE5LehoDAV8K9p8D7fiC9O6NVz3VxxTBflIMOoD3qy1HKcL9rkqrd5 3Kt1WdVaCseQO4y31mopMtouS+nOYSprzxlGStVgIdTYjDG7vaY= =+osu -----END PGP SIGNATURE----- --zju52o37iaea74zq--