diff mbox

[3/3] power: of_battery: Initial support for of-based battery specification driver.

Message ID 1412679518-21499-4-git-send-email-jonghwa3.lee@samsung.com (mailing list archive)
State Not Applicable, archived
Headers show

Commit Message

Jonghwa Lee Oct. 7, 2014, 10:58 a.m. UTC
This driver supports battery specification through the generic interface of
power_supply subsystem. All data are parsed from device tree and it exactly
matches with power_supply_info's content.

Signed-off-by: Jonghwa Lee <jonghwa3.lee@samsung.com>
---
 .../bindings/power_supply/of_battery.txt           |   34 +++++++
 drivers/power/Kconfig                              |    7 ++
 drivers/power/Makefile                             |    1 +
 drivers/power/of_battery.c                         |  100 ++++++++++++++++++++
 4 files changed, 142 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/power_supply/of_battery.txt
 create mode 100644 drivers/power/of_battery.c

Comments

Pavel Machek Oct. 9, 2014, 10:44 a.m. UTC | #1
On Tue 2014-10-07 19:58:38, Jonghwa Lee wrote:
> This driver supports battery specification through the generic interface of
> power_supply subsystem. All data are parsed from device tree and it exactly
> matches with power_supply_info's content.
> 
> Signed-off-by: Jonghwa Lee <jonghwa3.lee@samsung.com>

Acked-by: Pavel Machek <pavel@ucw.cz>

> +++ b/drivers/power/of_battery.c
> @@ -0,0 +1,100 @@
> +/*
> + * OF-based battery specification driver
> + *
> + * This driver supports generic interface to get static battery data.
> + *
> + * Copyright © 2014 Jonghwa Lee <jonghwa3.lee@samsung.com>

I'd replace it with (c).
									Pavel
diff mbox

Patch

diff --git a/Documentation/devicetree/bindings/power_supply/of_battery.txt b/Documentation/devicetree/bindings/power_supply/of_battery.txt
new file mode 100644
index 0000000..5ccd2a1
--- /dev/null
+++ b/Documentation/devicetree/bindings/power_supply/of_battery.txt
@@ -0,0 +1,34 @@ 
+of_battery bindings
+~~~~~~~~~~~~~~~~~~~
+
+This documentation describes how to define data in device tree
+to use of_battery driver. All properties are just matched with
+power_supply_info's.
+
+Required properties :
+ - battery-name : battery's name for identifying.
+
+Optional properties :
+ - voltage_max : Maximum voltage of the battery (uV).
+ - voltage_min : Minimum voltage of the battery (uV).
+ - charge_full : Full capacity of the battery (uAh).
+ - charge_empty : Empty capacity of the battery (uAh).
+ - energy_full : Full capacity of the battery (uWh).
+ - energy_empty : Empty capacity of the battery (uWh).
+ - temperature_max : Maximum temperature for the battery (deci 'C)
+ - temperature_min : Minium temperature for the battery (deci 'C)
+
+Example:
+	battery {
+		main-battery {
+			battery-name = "battery";
+			voltage-max = <4350000>;
+			charge-full = <2500000>;
+			temperature_max = <600>;
+			temperature_min = <(-100)>;
+		};
+		backup-battery {
+			battery-name = "coin-battery";
+			voltage-max = <3000000>;
+		};
+	};
diff --git a/drivers/power/Kconfig b/drivers/power/Kconfig
index 73cfcdf..c324ac6 100644
--- a/drivers/power/Kconfig
+++ b/drivers/power/Kconfig
@@ -36,6 +36,13 @@  config GENERIC_ADC_BATTERY
 	  Say Y here to enable support for the generic battery driver
 	  which uses IIO framework to read adc.
 
+config BATTERY_OF
+	tristate "Generic of-based battery specification driver"
+	depends on OF
+	help
+	  Say Y here to enable support for the of-based generic battery
+	  specification driver which gives static battery data.
+
 config MAX8925_POWER
 	tristate "MAX8925 battery charger support"
 	depends on MFD_MAX8925
diff --git a/drivers/power/Makefile b/drivers/power/Makefile
index dfa8942..38a83aa 100644
--- a/drivers/power/Makefile
+++ b/drivers/power/Makefile
@@ -6,6 +6,7 @@  power_supply-$(CONFIG_LEDS_TRIGGERS)	+= power_supply_leds.o
 
 obj-$(CONFIG_POWER_SUPPLY)	+= power_supply.o
 obj-$(CONFIG_GENERIC_ADC_BATTERY)	+= generic-adc-battery.o
+obj-$(CONFIG_BATTERY_OF)	+= of_battery.o
 
 obj-$(CONFIG_PDA_POWER)		+= pda_power.o
 obj-$(CONFIG_APM_POWER)		+= apm_power.o
diff --git a/drivers/power/of_battery.c b/drivers/power/of_battery.c
new file mode 100644
index 0000000..3c66765
--- /dev/null
+++ b/drivers/power/of_battery.c
@@ -0,0 +1,100 @@ 
+/*
+ * OF-based battery specification driver
+ *
+ * This driver supports generic interface to get static battery data.
+ *
+ * Copyright © 2014 Jonghwa Lee <jonghwa3.lee@samsung.com>
+ *
+ * This program 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.
+ */
+
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
+
+#include <linux/power_supply.h>
+#include <linux/module.h>
+#include <linux/slab.h>
+#include <linux/of.h>
+
+static struct power_supply_info *of_get_battery_info(struct device_node *np)
+{
+	struct power_supply_info *info;
+
+	info = kzalloc(sizeof(*info), GFP_KERNEL);
+	if (!info)
+		return ERR_PTR(-ENOMEM);
+
+	if (of_property_read_string(np, "battery-name", &info->name)) {
+		kfree(info);
+		return ERR_PTR(-EINVAL);
+	}
+
+	of_property_read_u32(np, "voltage_max", &info->voltage_max_design);
+	of_property_read_u32(np, "voltage_min", &info->voltage_min_design);
+	of_property_read_u32(np, "charge_full", &info->charge_full_design);
+	of_property_read_u32(np, "charge_empty", &info->charge_empty_design);
+	of_property_read_u32(np, "energy_full", &info->energy_full_design);
+	of_property_read_u32(np, "energy_empty", &info->energy_empty_design);
+	of_property_read_u32(np, "temperature_max", &info->temperature_max);
+	of_property_read_u32(np, "temperature_min", &info->temperature_min);
+
+	return info;
+}
+
+static int __init psy_of_battery_init(void)
+{
+	struct power_supply_info *info;
+	struct device_node *np, *child;
+	int ret;
+
+	np = of_find_node_by_name(NULL, "battery");
+	if (!np)
+		return -ENODEV;
+
+	for_each_child_of_node(np, child) {
+		info = of_get_battery_info(child);
+		if (IS_ERR(info)) {
+			pr_err("Failed to get battery information (%ld)\n",
+				PTR_ERR(info));
+			continue;
+		}
+		ret = psy_register_battery_info(info);
+		if (ret) {
+			pr_err("Failed to register battery information (%d)\n",
+				ret);
+			kfree(info);
+			continue;
+		}
+	}
+
+	return 0;
+}
+module_init(psy_of_battery_init);
+
+static void __exit psy_of_battery_exit(void)
+{
+	struct power_supply_info *info;
+	struct device_node *np, *child;
+	const char *name;
+
+	np = of_find_node_by_name(NULL, "battery");
+	if (!np)
+		return;
+
+	for_each_child_of_node(np, child) {
+		if (!of_property_read_string(np, "battery-name", &name))
+			continue;
+
+		info = psy_get_battery_info(name);
+		if (IS_ERR(info))
+			continue;
+
+		psy_unregister_battery_info(info);
+	}
+}
+module_exit(psy_of_battery_exit);
+
+MODULE_AUTHOR("Jonghwa Lee <jonhgwa3.lee@samsung.com>");
+MODULE_DESCRIPTION("of battery specification driver");
+MODULE_LICENSE("GPL");