]> rtime.felk.cvut.cz Git - sojka/nv-tegra/linux-3.10.git/commitdiff
power: batter-charger-gauge: add API for reading battery current
authorLaxman Dewangan <ldewangan@nvidia.com>
Sun, 13 Apr 2014 05:35:03 +0000 (11:05 +0530)
committerMrutyunjay Sawant <msawant@nvidia.com>
Tue, 15 Apr 2014 09:00:39 +0000 (02:00 -0700)
Add API for reading battery current throuch IIO channels.
IIO channel information is read from battery gauge device node.

bug 1413219

Change-Id: I87094acbd15796a16acb520ba52c2351439e4bbb
Signed-off-by: Laxman Dewangan <ldewangan@nvidia.com>
Reviewed-on: http://git-master/r/395550
(cherry picked from commit ff66b38933844c9cd6b57abcf3073b13a35dc092)
Reviewed-on: http://git-master/r/395782
GVS: Gerrit_Virtual_Submit
Reviewed-by: Venkat Reddy Talla <vreddytalla@nvidia.com>
Tested-by: Venkat Reddy Talla <vreddytalla@nvidia.com>
drivers/power/battery-charger-gauge-comm.c
include/linux/power/battery-charger-gauge-comm.h

index 2a2f180a053f0e5251a6de2413235e556b14c19c..3b615bcc82bb764046a4728271b840196165b668 100644 (file)
@@ -40,6 +40,7 @@
 #include <linux/wakelock.h>
 #include <linux/iio/consumer.h>
 #include <linux/iio/types.h>
+#include <linux/iio/iio.h>
 
 #define JETI_TEMP_COLD         0
 #define JETI_TEMP_COOL         10
@@ -82,6 +83,8 @@ struct battery_gauge_dev {
        int                             battery_capacity;
        int                             battery_snapshot_voltage;
        int                             battery_snapshot_capacity;
+       const char                      *bat_curr_channel_name;
+       struct iio_channel              *bat_current_iio_channel;
 };
 
 struct battery_gauge_dev *bg_temp;
@@ -548,6 +551,36 @@ int battery_gauge_get_battery_temperature(struct battery_gauge_dev *bg_dev,
 }
 EXPORT_SYMBOL_GPL(battery_gauge_get_battery_temperature);
 
+int battery_gauge_get_battery_current(struct battery_gauge_dev *bg_dev,
+       int *current_ma)
+{
+       int ret;
+
+       if (!bg_dev || !bg_dev->bat_curr_channel_name)
+               return -EINVAL;
+
+       if (!bg_dev->bat_current_iio_channel)
+               bg_dev->bat_current_iio_channel =
+                       iio_channel_get(bg_dev->parent_dev,
+                                       bg_dev->bat_curr_channel_name);
+       if (!bg_dev->bat_current_iio_channel || IS_ERR(bg_dev->bat_current_iio_channel)) {
+               dev_info(bg_dev->parent_dev,
+                       "Battery IIO current channel %s not registered yet\n",
+                       bg_dev->bat_curr_channel_name);
+               bg_dev->bat_current_iio_channel = NULL;
+               return -ENODEV;
+       }
+
+       ret = iio_read_channel_processed(bg_dev->bat_current_iio_channel,
+                       current_ma);
+       if (ret < 0) {
+               dev_err(bg_dev->parent_dev, " The channel read failed: %d\n", ret);
+               return ret;
+       }
+       return 0;
+}
+EXPORT_SYMBOL_GPL(battery_gauge_get_battery_current);
+
 struct battery_gauge_dev *battery_gauge_register(struct device *dev,
        struct battery_gauge_info *bgi, void *drv_data)
 {
@@ -580,6 +613,9 @@ struct battery_gauge_dev *battery_gauge_register(struct device *dev,
        bg_dev->drv_data = drv_data;
        bg_dev->tz_name = kstrdup(bgi->tz_name, GFP_KERNEL);
 
+       if (bgi->current_channel_name)
+               bg_dev->bat_curr_channel_name = bgi->current_channel_name;
+
        if (bg_dev->tz_name) {
                bg_dev->battery_tz = thermal_zone_device_find_by_name(
                        bg_dev->tz_name);
index 81baae7a8987828cf476bed176fff90091573a6a..f04ef645e57ff965de10fc0507f39d2a3b48a48f 100644 (file)
@@ -61,6 +61,7 @@ struct battery_charger_info {
 struct battery_gauge_info {
        int cell_id;
        const char *tz_name;
+       const char *current_channel_name;
        struct battery_gauge_ops *bg_ops;
 };
 
@@ -85,6 +86,8 @@ int battery_charging_system_power_on_usb_event(
        struct battery_charger_dev *bc_dev);
 int battery_gauge_get_battery_temperature(struct battery_gauge_dev *bg_dev,
        int *temp);
+int battery_gauge_get_battery_current(struct battery_gauge_dev *bg_dev,
+       int *current_ma);
 int battery_charger_set_current_broadcast(struct battery_charger_dev *bc_dev);
 struct battery_gauge_dev *battery_gauge_register(struct device *dev,
                struct battery_gauge_info *bgi, void *drv_data);