All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v4 0/4]
@ 2016-05-06  5:19 Michael Haas
       [not found] ` <1462511991-1911-1-git-send-email-haas-bdq14YP6qtSV9CzYT+GlPGD2FQJk+8+b@public.gmane.org>
  0 siblings, 1 reply; 8+ messages in thread
From: Michael Haas @ 2016-05-06  5:19 UTC (permalink / raw)
  To: robh+dt-DgEjT+Ai2ygdnm+yROfE0A, pawel.moll-5wv7dgnIgG8,
	mark.rutland-5wv7dgnIgG8, ijc+devicetree-KcIKpvwj1kUDXYZnReoRVg,
	galak-sgV2jX0FEOL9JmXXK+q4OQ,
	maxime.ripard-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8, wens-jdAy2FN1RRM,
	lee.jones-QSEj5FYQhm4dnm+yROfE0A, sre-DgEjT+Ai2ygdnm+yROfE0A,
	dbaryshkov-Re5JQEeQqe8AvxtiuMwx3w, dwmw2-wEGCiKHe2LqWVfeAwA7xHQ
  Cc: hdegoede-H+wXaHxf7aLQT0dZR+AlfA,
	bonbons-ud5FBsm0p/xEiooADzr8i9i2O/JbrIOy,
	devicetree-u79uwXL29TY76Z2rM5mHXA,
	linux-pm-u79uwXL29TY76Z2rM5mHXA, linux-lFZ/pmaqli7XmaaqVzeoHQ,
	linux-sunxi-/JYPxA39Uh5TLH3MbocFFw


Changes in v4:

* Mark AC power driver as disabled by default in axp209.dtsi
* Drop patch enabling USB power driver by default
* Add Acked-By Rob Herring and Chen-Yu Tsai

Changes in v3:

* Move register definitions back from MFD header to driver itself
* Globally enable AC power supply driver in axp209.dtsi
* Additionally enable USB power supply driver in axp209.dtsi
* Fix formatting and ordering issues noted by Chen-Yu Tsai
* Drop Rob Herring's ACKED-BY on the binding documentation patch as I have
  simplified the example

Changes in v2:

* Remove check for shortcut between AC and USB
* Remove logging in interrupt handler

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH v4 1/4] power: Add an axp20x-ac-power driver
       [not found] ` <1462511991-1911-1-git-send-email-haas-bdq14YP6qtSV9CzYT+GlPGD2FQJk+8+b@public.gmane.org>
@ 2016-05-06  5:19   ` Michael Haas
  2016-05-09 16:33     ` Chen-Yu Tsai
  2016-05-06  5:19   ` [PATCH v4 2/4] mfd: axp20x: Add a cell for the ac power_supply part of the axp20x PMICs Michael Haas
                     ` (2 subsequent siblings)
  3 siblings, 1 reply; 8+ messages in thread
From: Michael Haas @ 2016-05-06  5:19 UTC (permalink / raw)
  To: robh+dt-DgEjT+Ai2ygdnm+yROfE0A, pawel.moll-5wv7dgnIgG8,
	mark.rutland-5wv7dgnIgG8, ijc+devicetree-KcIKpvwj1kUDXYZnReoRVg,
	galak-sgV2jX0FEOL9JmXXK+q4OQ,
	maxime.ripard-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8, wens-jdAy2FN1RRM,
	lee.jones-QSEj5FYQhm4dnm+yROfE0A, sre-DgEjT+Ai2ygdnm+yROfE0A,
	dbaryshkov-Re5JQEeQqe8AvxtiuMwx3w, dwmw2-wEGCiKHe2LqWVfeAwA7xHQ
  Cc: hdegoede-H+wXaHxf7aLQT0dZR+AlfA,
	bonbons-ud5FBsm0p/xEiooADzr8i9i2O/JbrIOy,
	devicetree-u79uwXL29TY76Z2rM5mHXA,
	linux-pm-u79uwXL29TY76Z2rM5mHXA, linux-lFZ/pmaqli7XmaaqVzeoHQ,
	linux-sunxi-/JYPxA39Uh5TLH3MbocFFw, Michael Haas

This adds a driver for the ac power_supply bits of the axp20x
PMICs.

This submission is taken directly from Bruno Prémonts 2015 RFC [0].
The original RFC contains drivers for AC, battery and backup
battery. This commit only adds the AC driver for now.

[0] http://permalink.gmane.org/gmane.comp.hardware.netbook.arm.sunxi/17980

Signed-off-by: Michael Haas <haas-bdq14YP6qtSV9CzYT+GlPGD2FQJk+8+b@public.gmane.org>
---
 drivers/power/Makefile          |   2 +-
 drivers/power/axp20x_ac_power.c | 181 ++++++++++++++++++++++++++++++++++++++++
 2 files changed, 182 insertions(+), 1 deletion(-)
 create mode 100644 drivers/power/axp20x_ac_power.c

diff --git a/drivers/power/Makefile b/drivers/power/Makefile
index e46b75d..3a785cc 100644
--- a/drivers/power/Makefile
+++ b/drivers/power/Makefile
@@ -9,7 +9,7 @@ obj-$(CONFIG_GENERIC_ADC_BATTERY)	+= generic-adc-battery.o
 
 obj-$(CONFIG_PDA_POWER)		+= pda_power.o
 obj-$(CONFIG_APM_POWER)		+= apm_power.o
-obj-$(CONFIG_AXP20X_POWER)	+= axp20x_usb_power.o
+obj-$(CONFIG_AXP20X_POWER)	+= axp20x_usb_power.o axp20x_ac_power.o
 obj-$(CONFIG_MAX8925_POWER)	+= max8925_power.o
 obj-$(CONFIG_WM831X_BACKUP)	+= wm831x_backup.o
 obj-$(CONFIG_WM831X_POWER)	+= wm831x_power.o
diff --git a/drivers/power/axp20x_ac_power.c b/drivers/power/axp20x_ac_power.c
new file mode 100644
index 0000000..0d1ca0e
--- /dev/null
+++ b/drivers/power/axp20x_ac_power.c
@@ -0,0 +1,181 @@
+/*
+ * AXP20x PMIC AC power driver
+ *
+ * Copyright 2014-2015 Bruno Prémont <bonbons-ud5FBsm0p/xEiooADzr8i9i2O/JbrIOy@public.gmane.org>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under  the terms of the GNU General  Public License as published by the
+ * Free Software Foundation;  either version 2 of the License, or (at your
+ * option) any later version.
+ */
+
+#include <linux/err.h>
+#include <linux/interrupt.h>
+#include <linux/irq.h>
+#include <linux/mfd/axp20x.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/platform_device.h>
+#include <linux/power_supply.h>
+#include <linux/regmap.h>
+#include <linux/slab.h>
+
+#define DRVNAME "axp20x-ac-power"
+
+
+/* Fields of AXP20X_PWR_INPUT_STATUS */
+#define AXP20X_PWR_STATUS_AC_PRESENT     BIT(7)
+#define AXP20X_PWR_STATUS_AC_AVAILABLE   BIT(6)
+#define AXP20X_PWR_STATUS_AC_VBUS_SHORT  BIT(1)
+#define AXP20X_PWR_STATUS_AC_VBUS_SEL    BIT(0)
+
+/* Fields of AXP20X_ADC_EN1 */
+#define AXP20X_ADC_EN1_ACIN_VOLT BIT(5)
+#define AXP20X_ADC_EN1_ACIN_CURR BIT(4)
+
+
+struct axp20x_ac_power {
+	struct regmap *regmap;
+	struct power_supply *supply;
+};
+
+static int axp20x_ac_power_get_property(struct power_supply *psy,
+					enum power_supply_property psp,
+					union power_supply_propval *val)
+{
+	struct axp20x_ac_power *power = power_supply_get_drvdata(psy);
+	unsigned int input;
+	int r;
+
+	switch (psp) {
+	case POWER_SUPPLY_PROP_VOLTAGE_NOW:
+		r = axp20x_read_variable_width(power->regmap,
+					       AXP20X_ACIN_V_ADC_H, 12);
+		if (r < 0)
+			return r;
+
+		val->intval = r * 1700; /* 1 step = 1.7 mV */
+		return 0;
+	case POWER_SUPPLY_PROP_CURRENT_NOW:
+		r = axp20x_read_variable_width(power->regmap,
+					       AXP20X_ACIN_I_ADC_H, 12);
+		if (r < 0)
+			return r;
+
+		val->intval = r * 375; /* 1 step = 0.375 mA */
+		return 0;
+	default:
+		break;
+	}
+
+	/* All the properties below need the input-status reg value */
+	r = regmap_read(power->regmap, AXP20X_PWR_INPUT_STATUS, &input);
+	if (r)
+		return r;
+
+	switch (psp) {
+	case POWER_SUPPLY_PROP_PRESENT:
+		val->intval = !!(input & AXP20X_PWR_STATUS_AC_PRESENT);
+		break;
+	case POWER_SUPPLY_PROP_ONLINE:
+		val->intval = !!(input & AXP20X_PWR_STATUS_AC_AVAILABLE);
+		break;
+	default:
+		return -EINVAL;
+	}
+
+	return 0;
+}
+
+static enum power_supply_property axp20x_ac_power_properties[] = {
+	POWER_SUPPLY_PROP_PRESENT,
+	POWER_SUPPLY_PROP_ONLINE,
+	POWER_SUPPLY_PROP_VOLTAGE_NOW,
+	POWER_SUPPLY_PROP_CURRENT_NOW,
+};
+
+static const struct power_supply_desc axp20x_ac_power_desc = {
+	.name = "axp20x-ac",
+	.type = POWER_SUPPLY_TYPE_MAINS,
+	.properties = axp20x_ac_power_properties,
+	.num_properties = ARRAY_SIZE(axp20x_ac_power_properties),
+	.get_property = axp20x_ac_power_get_property,
+};
+
+static irqreturn_t axp20x_irq_ac_handler(int irq, void *devid)
+{
+	struct axp20x_ac_power *power = devid;
+
+	power_supply_changed(power->supply);
+
+	return IRQ_HANDLED;
+}
+
+static int axp20x_ac_power_probe(struct platform_device *pdev)
+{
+	struct axp20x_dev *axp20x = dev_get_drvdata(pdev->dev.parent);
+	struct power_supply_config psy_cfg = {};
+	struct axp20x_ac_power *power;
+	static const char * const irq_names[] = { "ACIN_PLUGIN",
+		"ACIN_REMOVAL", "ACIN_OVER_V" };
+	int i, irq, r;
+
+	power = devm_kzalloc(&pdev->dev, sizeof(*power), GFP_KERNEL);
+	if (!power)
+		return -ENOMEM;
+
+	power->regmap = axp20x->regmap;
+
+	/* Enable ac voltage and current measurement */
+	r = regmap_update_bits(power->regmap, AXP20X_ADC_EN1,
+			AXP20X_ADC_EN1_ACIN_CURR | AXP20X_ADC_EN1_ACIN_VOLT,
+			AXP20X_ADC_EN1_ACIN_CURR | AXP20X_ADC_EN1_ACIN_VOLT);
+	if (r)
+		return r;
+
+	psy_cfg.of_node = pdev->dev.of_node;
+	psy_cfg.drv_data = power;
+
+	power->supply = devm_power_supply_register(&pdev->dev,
+					&axp20x_ac_power_desc, &psy_cfg);
+	if (IS_ERR(power->supply))
+		return PTR_ERR(power->supply);
+
+	/* Request irqs after registering, as irqs may trigger immediately */
+	for (i = 0; i < ARRAY_SIZE(irq_names); i++) {
+		irq = platform_get_irq_byname(pdev, irq_names[i]);
+		if (irq < 0) {
+			dev_warn(&pdev->dev, "No IRQ for %s: %d\n",
+				 irq_names[i], irq);
+			continue;
+		}
+		irq = regmap_irq_get_virq(axp20x->regmap_irqc, irq);
+		r = devm_request_any_context_irq(&pdev->dev, irq,
+				axp20x_irq_ac_handler, 0, DRVNAME, power);
+		if (r < 0)
+			dev_warn(&pdev->dev, "Error requesting %s IRQ: %d\n",
+				 irq_names[i], r);
+	}
+
+	return 0;
+}
+
+static const struct of_device_id axp20x_ac_power_match[] = {
+	{ .compatible = "x-powers,axp202-ac-power-supply" },
+	{ }
+};
+MODULE_DEVICE_TABLE(of, axp20x_ac_power_match);
+
+static struct platform_driver axp20x_ac_power_driver = {
+	.probe = axp20x_ac_power_probe,
+	.driver = {
+		.name = DRVNAME,
+		.of_match_table = axp20x_ac_power_match,
+	},
+};
+
+module_platform_driver(axp20x_ac_power_driver);
+
+MODULE_AUTHOR("Bruno Prémont <bonbons-ud5FBsm0p/xEiooADzr8i9i2O/JbrIOy@public.gmane.org>");
+MODULE_DESCRIPTION("AXP20x PMIC AC power supply status driver");
+MODULE_LICENSE("GPL");
-- 
2.8.2

-- 
You received this message because you are subscribed to the Google Groups "linux-sunxi" group.
To unsubscribe from this group and stop receiving emails from it, send an email to linux-sunxi+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org
For more options, visit https://groups.google.com/d/optout.

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH v4 2/4] mfd: axp20x: Add a cell for the ac power_supply part of the axp20x PMICs
       [not found] ` <1462511991-1911-1-git-send-email-haas-bdq14YP6qtSV9CzYT+GlPGD2FQJk+8+b@public.gmane.org>
  2016-05-06  5:19   ` [PATCH v4 1/4] power: Add an axp20x-ac-power driver Michael Haas
@ 2016-05-06  5:19   ` Michael Haas
       [not found]     ` <1462511991-1911-3-git-send-email-haas-bdq14YP6qtSV9CzYT+GlPGD2FQJk+8+b@public.gmane.org>
  2016-05-06  5:19   ` [PATCH v4 3/4] ARM: dts: Add binding documentation for AXP20x pmic ac power supply Michael Haas
  2016-05-06  5:19   ` [PATCH v4 4/4] ARM: dts: axp209: Add ac_power_supply child node to the ax209 node Michael Haas
  3 siblings, 1 reply; 8+ messages in thread
From: Michael Haas @ 2016-05-06  5:19 UTC (permalink / raw)
  To: robh+dt-DgEjT+Ai2ygdnm+yROfE0A, pawel.moll-5wv7dgnIgG8,
	mark.rutland-5wv7dgnIgG8, ijc+devicetree-KcIKpvwj1kUDXYZnReoRVg,
	galak-sgV2jX0FEOL9JmXXK+q4OQ,
	maxime.ripard-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8, wens-jdAy2FN1RRM,
	lee.jones-QSEj5FYQhm4dnm+yROfE0A, sre-DgEjT+Ai2ygdnm+yROfE0A,
	dbaryshkov-Re5JQEeQqe8AvxtiuMwx3w, dwmw2-wEGCiKHe2LqWVfeAwA7xHQ
  Cc: hdegoede-H+wXaHxf7aLQT0dZR+AlfA,
	bonbons-ud5FBsm0p/xEiooADzr8i9i2O/JbrIOy,
	devicetree-u79uwXL29TY76Z2rM5mHXA,
	linux-pm-u79uwXL29TY76Z2rM5mHXA, linux-lFZ/pmaqli7XmaaqVzeoHQ,
	linux-sunxi-/JYPxA39Uh5TLH3MbocFFw, Michael Haas

As a counterpart to the usb power_supply cell, this commit adds an AC
power_supply cell to the axp20x driver.

Still missing are the RTC backup battery and the main battery charger
cells.

Signed-off-by: Michael Haas <haas-bdq14YP6qtSV9CzYT+GlPGD2FQJk+8+b@public.gmane.org>
Acked-by: Chen-Yu Tsai <wens-jdAy2FN1RRM@public.gmane.org>
---
 drivers/mfd/axp20x.c | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/drivers/mfd/axp20x.c b/drivers/mfd/axp20x.c
index a57d6e9..aa6ef08 100644
--- a/drivers/mfd/axp20x.c
+++ b/drivers/mfd/axp20x.c
@@ -128,6 +128,12 @@ static struct resource axp152_pek_resources[] = {
 	DEFINE_RES_IRQ_NAMED(AXP152_IRQ_PEK_FAL_EDGE, "PEK_DBF"),
 };
 
+static struct resource axp20x_ac_power_supply_resources[] = {
+	DEFINE_RES_IRQ_NAMED(AXP20X_IRQ_ACIN_PLUGIN, "ACIN_PLUGIN"),
+	DEFINE_RES_IRQ_NAMED(AXP20X_IRQ_ACIN_REMOVAL, "ACIN_REMOVAL"),
+	DEFINE_RES_IRQ_NAMED(AXP20X_IRQ_ACIN_OVER_V, "ACIN_OVER_V"),
+};
+
 static struct resource axp20x_pek_resources[] = {
 	{
 		.name	= "PEK_DBR",
@@ -436,6 +442,11 @@ static struct mfd_cell axp20x_cells[] = {
 	}, {
 		.name		= "axp20x-regulator",
 	}, {
+		.name		= "axp20x-ac-power-supply",
+		.of_compatible	= "x-powers,axp202-ac-power-supply",
+		.num_resources	= ARRAY_SIZE(axp20x_ac_power_supply_resources),
+		.resources	= axp20x_ac_power_supply_resources,
+	}, {
 		.name		= "axp20x-usb-power-supply",
 		.of_compatible	= "x-powers,axp202-usb-power-supply",
 		.num_resources	= ARRAY_SIZE(axp20x_usb_power_supply_resources),
-- 
2.8.2

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH v4 3/4] ARM: dts: Add binding documentation for AXP20x pmic ac power supply
       [not found] ` <1462511991-1911-1-git-send-email-haas-bdq14YP6qtSV9CzYT+GlPGD2FQJk+8+b@public.gmane.org>
  2016-05-06  5:19   ` [PATCH v4 1/4] power: Add an axp20x-ac-power driver Michael Haas
  2016-05-06  5:19   ` [PATCH v4 2/4] mfd: axp20x: Add a cell for the ac power_supply part of the axp20x PMICs Michael Haas
@ 2016-05-06  5:19   ` Michael Haas
  2016-05-06  5:19   ` [PATCH v4 4/4] ARM: dts: axp209: Add ac_power_supply child node to the ax209 node Michael Haas
  3 siblings, 0 replies; 8+ messages in thread
From: Michael Haas @ 2016-05-06  5:19 UTC (permalink / raw)
  To: robh+dt-DgEjT+Ai2ygdnm+yROfE0A, pawel.moll-5wv7dgnIgG8,
	mark.rutland-5wv7dgnIgG8, ijc+devicetree-KcIKpvwj1kUDXYZnReoRVg,
	galak-sgV2jX0FEOL9JmXXK+q4OQ,
	maxime.ripard-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8, wens-jdAy2FN1RRM,
	lee.jones-QSEj5FYQhm4dnm+yROfE0A, sre-DgEjT+Ai2ygdnm+yROfE0A,
	dbaryshkov-Re5JQEeQqe8AvxtiuMwx3w, dwmw2-wEGCiKHe2LqWVfeAwA7xHQ
  Cc: hdegoede-H+wXaHxf7aLQT0dZR+AlfA,
	bonbons-ud5FBsm0p/xEiooADzr8i9i2O/JbrIOy,
	devicetree-u79uwXL29TY76Z2rM5mHXA,
	linux-pm-u79uwXL29TY76Z2rM5mHXA, linux-lFZ/pmaqli7XmaaqVzeoHQ,
	linux-sunxi-/JYPxA39Uh5TLH3MbocFFw, Michael Haas

Add binding documentation for the ac power supply part of the AXP20x
pmic.

Signed-off-by: Michael Haas <haas-bdq14YP6qtSV9CzYT+GlPGD2FQJk+8+b@public.gmane.org>
Acked-by: Rob Herring <robh-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
---
 .../bindings/power_supply/axp20x_ac_power.txt           | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/power_supply/axp20x_ac_power.txt

diff --git a/Documentation/devicetree/bindings/power_supply/axp20x_ac_power.txt b/Documentation/devicetree/bindings/power_supply/axp20x_ac_power.txt
new file mode 100644
index 0000000..1cebe35
--- /dev/null
+++ b/Documentation/devicetree/bindings/power_supply/axp20x_ac_power.txt
@@ -0,0 +1,17 @@
+AXP20x AC power supply
+
+Required Properties:
+-compatible: "x-powers,axp202-ac-power-supply"
+
+This node is a subnode of the axp20x PMIC.
+
+Example:
+
+axp209: pmic@34 {
+
+	ac-power-supply: ac-power-supply {
+		compatible = "x-powers,axp202-ac-power-supply";
+	};
+
+	...
+};
-- 
2.8.2

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH v4 4/4] ARM: dts: axp209: Add ac_power_supply child node to the ax209 node
       [not found] ` <1462511991-1911-1-git-send-email-haas-bdq14YP6qtSV9CzYT+GlPGD2FQJk+8+b@public.gmane.org>
                     ` (2 preceding siblings ...)
  2016-05-06  5:19   ` [PATCH v4 3/4] ARM: dts: Add binding documentation for AXP20x pmic ac power supply Michael Haas
@ 2016-05-06  5:19   ` Michael Haas
  3 siblings, 0 replies; 8+ messages in thread
From: Michael Haas @ 2016-05-06  5:19 UTC (permalink / raw)
  To: robh+dt-DgEjT+Ai2ygdnm+yROfE0A, pawel.moll-5wv7dgnIgG8,
	mark.rutland-5wv7dgnIgG8, ijc+devicetree-KcIKpvwj1kUDXYZnReoRVg,
	galak-sgV2jX0FEOL9JmXXK+q4OQ,
	maxime.ripard-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8, wens-jdAy2FN1RRM,
	lee.jones-QSEj5FYQhm4dnm+yROfE0A, sre-DgEjT+Ai2ygdnm+yROfE0A,
	dbaryshkov-Re5JQEeQqe8AvxtiuMwx3w, dwmw2-wEGCiKHe2LqWVfeAwA7xHQ
  Cc: hdegoede-H+wXaHxf7aLQT0dZR+AlfA,
	bonbons-ud5FBsm0p/xEiooADzr8i9i2O/JbrIOy,
	devicetree-u79uwXL29TY76Z2rM5mHXA,
	linux-pm-u79uwXL29TY76Z2rM5mHXA, linux-lFZ/pmaqli7XmaaqVzeoHQ,
	linux-sunxi-/JYPxA39Uh5TLH3MbocFFw, Michael Haas

Add a node representing the ac power supply part of the axp209 pmic.

Signed-off-by: Michael Haas <haas-bdq14YP6qtSV9CzYT+GlPGD2FQJk+8+b@public.gmane.org>
---
 arch/arm/boot/dts/axp209.dtsi | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/arch/arm/boot/dts/axp209.dtsi b/arch/arm/boot/dts/axp209.dtsi
index 051ab3b..bdf8fe8 100644
--- a/arch/arm/boot/dts/axp209.dtsi
+++ b/arch/arm/boot/dts/axp209.dtsi
@@ -90,8 +90,14 @@
 		};
 	};
 
+	ac_power_supply: ac_power_supply {
+		compatible = "x-powers,axp202-ac-power-supply";
+		status = "disabled";
+	};
+
 	usb_power_supply: usb_power_supply {
 		compatible = "x-powers,axp202-usb-power-supply";
 		status = "disabled";
 	};
+
 };
-- 
2.8.2

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH v4 2/4] mfd: axp20x: Add a cell for the ac power_supply part of the axp20x PMICs
       [not found]     ` <1462511991-1911-3-git-send-email-haas-bdq14YP6qtSV9CzYT+GlPGD2FQJk+8+b@public.gmane.org>
@ 2016-05-09  8:06       ` Lee Jones
  0 siblings, 0 replies; 8+ messages in thread
From: Lee Jones @ 2016-05-09  8:06 UTC (permalink / raw)
  To: Michael Haas
  Cc: robh+dt-DgEjT+Ai2ygdnm+yROfE0A, pawel.moll-5wv7dgnIgG8,
	mark.rutland-5wv7dgnIgG8, ijc+devicetree-KcIKpvwj1kUDXYZnReoRVg,
	galak-sgV2jX0FEOL9JmXXK+q4OQ,
	maxime.ripard-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8, wens-jdAy2FN1RRM,
	sre-DgEjT+Ai2ygdnm+yROfE0A, dbaryshkov-Re5JQEeQqe8AvxtiuMwx3w,
	dwmw2-wEGCiKHe2LqWVfeAwA7xHQ, hdegoede-H+wXaHxf7aLQT0dZR+AlfA,
	bonbons-ud5FBsm0p/xEiooADzr8i9i2O/JbrIOy,
	devicetree-u79uwXL29TY76Z2rM5mHXA,
	linux-pm-u79uwXL29TY76Z2rM5mHXA, linux-lFZ/pmaqli7XmaaqVzeoHQ,
	linux-sunxi-/JYPxA39Uh5TLH3MbocFFw

On Fri, 06 May 2016, Michael Haas wrote:

> As a counterpart to the usb power_supply cell, this commit adds an AC
> power_supply cell to the axp20x driver.
> 
> Still missing are the RTC backup battery and the main battery charger
> cells.
> 
> Signed-off-by: Michael Haas <haas-bdq14YP6qtSV9CzYT+GlPGD2FQJk+8+b@public.gmane.org>
> Acked-by: Chen-Yu Tsai <wens-jdAy2FN1RRM@public.gmane.org>
> ---
>  drivers/mfd/axp20x.c | 11 +++++++++++
>  1 file changed, 11 insertions(+)

Applied, thanks.

> diff --git a/drivers/mfd/axp20x.c b/drivers/mfd/axp20x.c
> index a57d6e9..aa6ef08 100644
> --- a/drivers/mfd/axp20x.c
> +++ b/drivers/mfd/axp20x.c
> @@ -128,6 +128,12 @@ static struct resource axp152_pek_resources[] = {
>  	DEFINE_RES_IRQ_NAMED(AXP152_IRQ_PEK_FAL_EDGE, "PEK_DBF"),
>  };
>  
> +static struct resource axp20x_ac_power_supply_resources[] = {
> +	DEFINE_RES_IRQ_NAMED(AXP20X_IRQ_ACIN_PLUGIN, "ACIN_PLUGIN"),
> +	DEFINE_RES_IRQ_NAMED(AXP20X_IRQ_ACIN_REMOVAL, "ACIN_REMOVAL"),
> +	DEFINE_RES_IRQ_NAMED(AXP20X_IRQ_ACIN_OVER_V, "ACIN_OVER_V"),
> +};
> +
>  static struct resource axp20x_pek_resources[] = {
>  	{
>  		.name	= "PEK_DBR",
> @@ -436,6 +442,11 @@ static struct mfd_cell axp20x_cells[] = {
>  	}, {
>  		.name		= "axp20x-regulator",
>  	}, {
> +		.name		= "axp20x-ac-power-supply",
> +		.of_compatible	= "x-powers,axp202-ac-power-supply",
> +		.num_resources	= ARRAY_SIZE(axp20x_ac_power_supply_resources),
> +		.resources	= axp20x_ac_power_supply_resources,
> +	}, {
>  		.name		= "axp20x-usb-power-supply",
>  		.of_compatible	= "x-powers,axp202-usb-power-supply",
>  		.num_resources	= ARRAY_SIZE(axp20x_usb_power_supply_resources),

-- 
Lee Jones
Linaro STMicroelectronics Landing Team Lead
Linaro.org │ Open source software for ARM SoCs
Follow Linaro: Facebook | Twitter | Blog

-- 
You received this message because you are subscribed to the Google Groups "linux-sunxi" group.
To unsubscribe from this group and stop receiving emails from it, send an email to linux-sunxi+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org
For more options, visit https://groups.google.com/d/optout.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v4 1/4] power: Add an axp20x-ac-power driver
  2016-05-06  5:19   ` [PATCH v4 1/4] power: Add an axp20x-ac-power driver Michael Haas
@ 2016-05-09 16:33     ` Chen-Yu Tsai
  2016-05-14  7:31       ` Michael Haas
  0 siblings, 1 reply; 8+ messages in thread
From: Chen-Yu Tsai @ 2016-05-09 16:33 UTC (permalink / raw)
  To: Michael Haas
  Cc: Rob Herring, Pawel Moll, Mark Rutland, Ian Campbell, Kumar Gala,
	Maxime Ripard, Chen-Yu Tsai, Lee Jones, Sebastian Reichel,
	Dmitry Eremin-Solenikov, David Woodhouse, Hans De Goede,
	Bruno Prémont, devicetree, linux-pm,
	Russell King - ARM Linux, linux-sunxi

On Fri, May 6, 2016 at 1:19 PM, Michael Haas <haas@computerlinguist.org> wrote:
> This adds a driver for the ac power_supply bits of the axp20x
> PMICs.
>
> This submission is taken directly from Bruno Prémonts 2015 RFC [0].
> The original RFC contains drivers for AC, battery and backup
> battery. This commit only adds the AC driver for now.
>
> [0] http://permalink.gmane.org/gmane.comp.hardware.netbook.arm.sunxi/17980
>
> Signed-off-by: Michael Haas <haas@computerlinguist.org>
> ---
>  drivers/power/Makefile          |   2 +-
>  drivers/power/axp20x_ac_power.c | 181 ++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 182 insertions(+), 1 deletion(-)
>  create mode 100644 drivers/power/axp20x_ac_power.c
>
> diff --git a/drivers/power/Makefile b/drivers/power/Makefile
> index e46b75d..3a785cc 100644
> --- a/drivers/power/Makefile
> +++ b/drivers/power/Makefile
> @@ -9,7 +9,7 @@ obj-$(CONFIG_GENERIC_ADC_BATTERY)       += generic-adc-battery.o
>
>  obj-$(CONFIG_PDA_POWER)                += pda_power.o
>  obj-$(CONFIG_APM_POWER)                += apm_power.o
> -obj-$(CONFIG_AXP20X_POWER)     += axp20x_usb_power.o
> +obj-$(CONFIG_AXP20X_POWER)     += axp20x_usb_power.o axp20x_ac_power.o

Sort the file names please.

>  obj-$(CONFIG_MAX8925_POWER)    += max8925_power.o
>  obj-$(CONFIG_WM831X_BACKUP)    += wm831x_backup.o
>  obj-$(CONFIG_WM831X_POWER)     += wm831x_power.o
> diff --git a/drivers/power/axp20x_ac_power.c b/drivers/power/axp20x_ac_power.c
> new file mode 100644
> index 0000000..0d1ca0e
> --- /dev/null
> +++ b/drivers/power/axp20x_ac_power.c
> @@ -0,0 +1,181 @@
> +/*
> + * AXP20x PMIC AC power driver
> + *
> + * Copyright 2014-2015 Bruno Prémont <bonbons@linux-vserver.org>
> + *
> + * This program is free software; you can redistribute it and/or modify it
> + * under  the terms of the GNU General  Public License as published by the
> + * Free Software Foundation;  either version 2 of the License, or (at your
> + * option) any later version.
> + */
> +
> +#include <linux/err.h>
> +#include <linux/interrupt.h>
> +#include <linux/irq.h>
> +#include <linux/mfd/axp20x.h>
> +#include <linux/module.h>
> +#include <linux/of.h>
> +#include <linux/platform_device.h>
> +#include <linux/power_supply.h>
> +#include <linux/regmap.h>
> +#include <linux/slab.h>
> +
> +#define DRVNAME "axp20x-ac-power"
> +
> +
> +/* Fields of AXP20X_PWR_INPUT_STATUS */
> +#define AXP20X_PWR_STATUS_AC_PRESENT     BIT(7)
> +#define AXP20X_PWR_STATUS_AC_AVAILABLE   BIT(6)

> +#define AXP20X_PWR_STATUS_AC_VBUS_SHORT  BIT(1)
> +#define AXP20X_PWR_STATUS_AC_VBUS_SEL    BIT(0)

These 2 aren't used anymore. Please remove them.

> +
> +/* Fields of AXP20X_ADC_EN1 */
> +#define AXP20X_ADC_EN1_ACIN_VOLT BIT(5)
> +#define AXP20X_ADC_EN1_ACIN_CURR BIT(4)
> +
> +
> +struct axp20x_ac_power {
> +       struct regmap *regmap;
> +       struct power_supply *supply;
> +};
> +
> +static int axp20x_ac_power_get_property(struct power_supply *psy,
> +                                       enum power_supply_property psp,
> +                                       union power_supply_propval *val)
> +{
> +       struct axp20x_ac_power *power = power_supply_get_drvdata(psy);
> +       unsigned int input;
> +       int r;
> +
> +       switch (psp) {
> +       case POWER_SUPPLY_PROP_VOLTAGE_NOW:
> +               r = axp20x_read_variable_width(power->regmap,
> +                                              AXP20X_ACIN_V_ADC_H, 12);
> +               if (r < 0)
> +                       return r;
> +
> +               val->intval = r * 1700; /* 1 step = 1.7 mV */
> +               return 0;
> +       case POWER_SUPPLY_PROP_CURRENT_NOW:
> +               r = axp20x_read_variable_width(power->regmap,
> +                                              AXP20X_ACIN_I_ADC_H, 12);
> +               if (r < 0)
> +                       return r;
> +
> +               val->intval = r * 375; /* 1 step = 0.375 mA */

The step for ACIN is 0.625 mA. 0.375 is for VBUS.

> +               return 0;
> +       default:
> +               break;
> +       }
> +
> +       /* All the properties below need the input-status reg value */
> +       r = regmap_read(power->regmap, AXP20X_PWR_INPUT_STATUS, &input);
> +       if (r)
> +               return r;
> +
> +       switch (psp) {
> +       case POWER_SUPPLY_PROP_PRESENT:
> +               val->intval = !!(input & AXP20X_PWR_STATUS_AC_PRESENT);
> +               break;
> +       case POWER_SUPPLY_PROP_ONLINE:
> +               val->intval = !!(input & AXP20X_PWR_STATUS_AC_AVAILABLE);
> +               break;
> +       default:
> +               return -EINVAL;
> +       }
> +
> +       return 0;
> +}
> +
> +static enum power_supply_property axp20x_ac_power_properties[] = {
> +       POWER_SUPPLY_PROP_PRESENT,
> +       POWER_SUPPLY_PROP_ONLINE,
> +       POWER_SUPPLY_PROP_VOLTAGE_NOW,
> +       POWER_SUPPLY_PROP_CURRENT_NOW,
> +};
> +
> +static const struct power_supply_desc axp20x_ac_power_desc = {
> +       .name = "axp20x-ac",
> +       .type = POWER_SUPPLY_TYPE_MAINS,
> +       .properties = axp20x_ac_power_properties,
> +       .num_properties = ARRAY_SIZE(axp20x_ac_power_properties),
> +       .get_property = axp20x_ac_power_get_property,
> +};
> +
> +static irqreturn_t axp20x_irq_ac_handler(int irq, void *devid)
> +{
> +       struct axp20x_ac_power *power = devid;
> +
> +       power_supply_changed(power->supply);
> +
> +       return IRQ_HANDLED;
> +}
> +
> +static int axp20x_ac_power_probe(struct platform_device *pdev)
> +{
> +       struct axp20x_dev *axp20x = dev_get_drvdata(pdev->dev.parent);
> +       struct power_supply_config psy_cfg = {};
> +       struct axp20x_ac_power *power;
> +       static const char * const irq_names[] = { "ACIN_PLUGIN",
> +               "ACIN_REMOVAL", "ACIN_OVER_V" };
> +       int i, irq, r;
> +
> +       power = devm_kzalloc(&pdev->dev, sizeof(*power), GFP_KERNEL);
> +       if (!power)
> +               return -ENOMEM;
> +
> +       power->regmap = axp20x->regmap;
> +
> +       /* Enable ac voltage and current measurement */
> +       r = regmap_update_bits(power->regmap, AXP20X_ADC_EN1,
> +                       AXP20X_ADC_EN1_ACIN_CURR | AXP20X_ADC_EN1_ACIN_VOLT,
> +                       AXP20X_ADC_EN1_ACIN_CURR | AXP20X_ADC_EN1_ACIN_VOLT);
> +       if (r)
> +               return r;
> +
> +       psy_cfg.of_node = pdev->dev.of_node;
> +       psy_cfg.drv_data = power;
> +
> +       power->supply = devm_power_supply_register(&pdev->dev,
> +                                       &axp20x_ac_power_desc, &psy_cfg);
> +       if (IS_ERR(power->supply))
> +               return PTR_ERR(power->supply);
> +
> +       /* Request irqs after registering, as irqs may trigger immediately */
> +       for (i = 0; i < ARRAY_SIZE(irq_names); i++) {
> +               irq = platform_get_irq_byname(pdev, irq_names[i]);
> +               if (irq < 0) {
> +                       dev_warn(&pdev->dev, "No IRQ for %s: %d\n",
> +                                irq_names[i], irq);
> +                       continue;
> +               }
> +               irq = regmap_irq_get_virq(axp20x->regmap_irqc, irq);
> +               r = devm_request_any_context_irq(&pdev->dev, irq,
> +                               axp20x_irq_ac_handler, 0, DRVNAME, power);
> +               if (r < 0)
> +                       dev_warn(&pdev->dev, "Error requesting %s IRQ: %d\n",
> +                                irq_names[i], r);

Won't missing IRQs hinder the usage of this driver / hardware?
A power supply isn't much use if the system isn't told when
it's gone.


Regards
ChenYu

> +       }
> +
> +       return 0;
> +}
> +
> +static const struct of_device_id axp20x_ac_power_match[] = {
> +       { .compatible = "x-powers,axp202-ac-power-supply" },
> +       { }
> +};
> +MODULE_DEVICE_TABLE(of, axp20x_ac_power_match);
> +
> +static struct platform_driver axp20x_ac_power_driver = {
> +       .probe = axp20x_ac_power_probe,
> +       .driver = {
> +               .name = DRVNAME,
> +               .of_match_table = axp20x_ac_power_match,
> +       },
> +};
> +
> +module_platform_driver(axp20x_ac_power_driver);
> +
> +MODULE_AUTHOR("Bruno Prémont <bonbons@linux-vserver.org>");
> +MODULE_DESCRIPTION("AXP20x PMIC AC power supply status driver");
> +MODULE_LICENSE("GPL");
> --
> 2.8.2
>

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH v4 1/4] power: Add an axp20x-ac-power driver
  2016-05-09 16:33     ` Chen-Yu Tsai
@ 2016-05-14  7:31       ` Michael Haas
  0 siblings, 0 replies; 8+ messages in thread
From: Michael Haas @ 2016-05-14  7:31 UTC (permalink / raw)
  To: Chen-Yu Tsai
  Cc: Rob Herring, Pawel Moll, Mark Rutland, Ian Campbell, Kumar Gala,
	Maxime Ripard, Lee Jones, Sebastian Reichel,
	Dmitry Eremin-Solenikov, David Woodhouse, Hans De Goede,
	Bruno Prémont, devicetree, linux-pm,
	Russell King - ARM Linux, linux-sunxi

On 05/09/2016 06:33 PM, Chen-Yu Tsai wrote:

>> +
>> +       power->supply = devm_power_supply_register(&pdev->dev,
>> +                                       &axp20x_ac_power_desc, &psy_cfg);
>> +       if (IS_ERR(power->supply))
>> +               return PTR_ERR(power->supply);
>> +
>> +       /* Request irqs after registering, as irqs may trigger immediately */
>> +       for (i = 0; i < ARRAY_SIZE(irq_names); i++) {
>> +               irq = platform_get_irq_byname(pdev, irq_names[i]);
>> +               if (irq < 0) {
>> +                       dev_warn(&pdev->dev, "No IRQ for %s: %d\n",
>> +                                irq_names[i], irq);
>> +                       continue;
>> +               }
>> +               irq = regmap_irq_get_virq(axp20x->regmap_irqc, irq);
>> +               r = devm_request_any_context_irq(&pdev->dev, irq,
>> +                               axp20x_irq_ac_handler, 0, DRVNAME, power);
>> +               if (r < 0)
>> +                       dev_warn(&pdev->dev, "Error requesting %s IRQ: %d\n",
>> +                                irq_names[i], r);
> 
> Won't missing IRQs hinder the usage of this driver / hardware?
> A power supply isn't much use if the system isn't told when
> it's gone.
> 

That's a good point. The real question is: how would you handle missing
IRQs? I have looked at other uses of devm_request_any_context_irq, e.g.
in rtc-pm8xxx.c [0]. These other users often return an error code in the
probe function. That doesn't help the system, though: it still won't
notice if the power is unplugged in addition to missing the driver
completely.

It's probably best to provide the remaining (functional) parts of the
driver (reading from /sys/class..) even if the IRQs cannot be
registered. The code is pretty much the same in  the axp20x-usb-power.

Michael

[0] http://lxr.free-electrons.com/source/drivers/rtc/rtc-pm8xxx.c#L490


^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2016-05-14  7:31 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-05-06  5:19 [PATCH v4 0/4] Michael Haas
     [not found] ` <1462511991-1911-1-git-send-email-haas-bdq14YP6qtSV9CzYT+GlPGD2FQJk+8+b@public.gmane.org>
2016-05-06  5:19   ` [PATCH v4 1/4] power: Add an axp20x-ac-power driver Michael Haas
2016-05-09 16:33     ` Chen-Yu Tsai
2016-05-14  7:31       ` Michael Haas
2016-05-06  5:19   ` [PATCH v4 2/4] mfd: axp20x: Add a cell for the ac power_supply part of the axp20x PMICs Michael Haas
     [not found]     ` <1462511991-1911-3-git-send-email-haas-bdq14YP6qtSV9CzYT+GlPGD2FQJk+8+b@public.gmane.org>
2016-05-09  8:06       ` Lee Jones
2016-05-06  5:19   ` [PATCH v4 3/4] ARM: dts: Add binding documentation for AXP20x pmic ac power supply Michael Haas
2016-05-06  5:19   ` [PATCH v4 4/4] ARM: dts: axp209: Add ac_power_supply child node to the ax209 node Michael Haas

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.