All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Pali Rohár" <pali.rohar@gmail.com>
To: Anton Vorontsov <anton@enomsg.org>,
	David Woodhouse <dwmw2@infradead.org>,
	Tony Lindgren <tony@atomide.com>,
	Russell King <linux@arm.linux.org.uk>
Cc: linux-kernel@vger.kernel.org, linux-omap@vger.kernel.org,
	freemangordon@abv.bg, aaro.koskinen@iki.fi, pavel@ucw.cz,
	"Pali Rohár" <pali.rohar@gmail.com>
Subject: [PATCH v2 2/3] bq2415x_charger: Use power_supply notifier for automode
Date: Tue, 19 Nov 2013 11:18:04 +0100	[thread overview]
Message-ID: <1384856285-19593-3-git-send-email-pali.rohar@gmail.com> (raw)
In-Reply-To: <1384856285-19593-1-git-send-email-pali.rohar@gmail.com>

This patch removing set_mode_hook function from board data and replacing it with
new string variable of notifier power supply device. After this change it is
possible to add DT support because driver does not need specific board function
anymore. Only static data and name of power supply device is required.

Signed-off-by: Pali Rohár <pali.rohar@gmail.com>
---
 drivers/power/bq2415x_charger.c       |   77 +++++++++++++++++++++++++--------
 include/linux/power/bq2415x_charger.h |   48 +++-----------------
 2 files changed, 65 insertions(+), 60 deletions(-)

diff --git a/drivers/power/bq2415x_charger.c b/drivers/power/bq2415x_charger.c
index 0727f92..d89583d 100644
--- a/drivers/power/bq2415x_charger.c
+++ b/drivers/power/bq2415x_charger.c
@@ -1,7 +1,7 @@
 /*
  * bq2415x charger driver
  *
- * Copyright (C) 2011-2012  Pali Rohár <pali.rohar@gmail.com>
+ * Copyright (C) 2011-2013  Pali Rohár <pali.rohar@gmail.com>
  *
  * 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
@@ -170,6 +170,7 @@ struct bq2415x_device {
 	struct bq2415x_platform_data init_data;
 	struct power_supply charger;
 	struct delayed_work work;
+	struct notifier_block nb;
 	enum bq2415x_mode reported_mode;/* mode reported by hook function */
 	enum bq2415x_mode mode;		/* current configured mode */
 	enum bq2415x_chip chip;
@@ -791,24 +792,53 @@ static int bq2415x_set_mode(struct bq2415x_device *bq, enum bq2415x_mode mode)
 
 }
 
-/* hook function called by other driver which set reported mode */
-static void bq2415x_hook_function(enum bq2415x_mode mode, void *data)
+static int bq2415x_notifier_call(struct notifier_block *nb,
+		unsigned long val, void *v)
 {
-	struct bq2415x_device *bq = data;
+	struct bq2415x_device *bq =
+		container_of(nb, struct bq2415x_device, nb);
+	struct power_supply *psy = v;
+	enum bq2415x_mode mode;
+	union power_supply_propval prop;
+	int ret;
+	int mA;
 
-	if (!bq)
-		return;
+	if (val != PSY_EVENT_PROP_CHANGED)
+		return NOTIFY_OK;
+
+	if (strcmp(psy->name, bq->init_data.notify_device) != 0)
+		return NOTIFY_OK;
+
+	dev_dbg(bq->dev, "notifier call was called\n");
+
+	ret = psy->get_property(psy, POWER_SUPPLY_PROP_CURRENT_MAX, &prop);
+	if (ret != 0)
+		return NOTIFY_OK;
+
+	mA = prop.intval;
+
+	if (mA == 0)
+		mode = BQ2415X_MODE_OFF;
+	else if (mA < 500)
+		mode = BQ2415X_MODE_NONE;
+	else if (mA < 1800)
+		mode = BQ2415X_MODE_HOST_CHARGER;
+	else
+		mode = BQ2415X_MODE_DEDICATED_CHARGER;
+
+	if (bq->reported_mode == mode)
+		return NOTIFY_OK;
 
-	dev_dbg(bq->dev, "hook function was called\n");
 	bq->reported_mode = mode;
 
 	/* if automode is not enabled do not tell about reported_mode */
 	if (bq->automode < 1)
-		return;
+		return NOTIFY_OK;
 
 	sysfs_notify(&bq->charger.dev->kobj, NULL, "reported_mode");
 	bq2415x_set_mode(bq, bq->reported_mode);
 
+	return NOTIFY_OK;
 }
 
 /**** timer functions ****/
@@ -1508,6 +1538,7 @@ static int bq2415x_probe(struct i2c_client *client,
 	int num;
 	char *name;
 	struct bq2415x_device *bq;
+	struct power_supply *psy;
 
 	if (!client->dev.platform_data) {
 		dev_err(&client->dev, "platform data not set\n");
@@ -1569,16 +1600,27 @@ static int bq2415x_probe(struct i2c_client *client,
 		goto error_4;
 	}
 
-	if (bq->init_data.set_mode_hook) {
-		if (bq->init_data.set_mode_hook(
-				bq2415x_hook_function, bq)) {
-			bq->automode = 1;
+	if (bq->init_data.notify_device) {
+		bq->nb.notifier_call = bq2415x_notifier_call;
+		ret = power_supply_reg_notifier(&bq->nb);
+		if (ret) {
+			dev_err(bq->dev, "failed to reg notifier: %d\n", ret);
+			goto error_5;
+		}
+		psy = power_supply_get_by_name(bq->init_data.notify_device);
+		if (psy) {
+			/* Query for initial reported_mode and set it */
+			bq2415x_notifier_call(&bq->nb,
+					PSY_EVENT_PROP_CHANGED, psy);
 			bq2415x_set_mode(bq, bq->reported_mode);
-			dev_info(bq->dev, "automode enabled\n");
 		} else {
-			bq->automode = -1;
-			dev_info(bq->dev, "automode failed\n");
+			dev_info(bq->dev, "notifier power supply device (%s) "
+				"for automode is not registred yet... "
+				"automode will not work without that device\n",
+				bq->init_data.notify_device);
 		}
+		bq->automode = 1;
+		dev_info(bq->dev, "automode enabled\n");
 	} else {
 		bq->automode = -1;
 		dev_info(bq->dev, "automode not supported\n");
@@ -1590,6 +1632,7 @@ static int bq2415x_probe(struct i2c_client *client,
 	dev_info(bq->dev, "driver registered\n");
 	return 0;
 
+error_5:
 error_4:
 	bq2415x_sysfs_exit(bq);
 error_3:
@@ -1610,8 +1653,8 @@ static int bq2415x_remove(struct i2c_client *client)
 {
 	struct bq2415x_device *bq = i2c_get_clientdata(client);
 
-	if (bq->init_data.set_mode_hook)
-		bq->init_data.set_mode_hook(NULL, NULL);
+	if (bq->init_data.notify_device)
+		power_supply_unreg_notifier(&bq->nb);
 
 	bq2415x_sysfs_exit(bq);
 	bq2415x_power_supply_exit(bq);
diff --git a/include/linux/power/bq2415x_charger.h b/include/linux/power/bq2415x_charger.h
index 8dcc0f4..50762af 100644
--- a/include/linux/power/bq2415x_charger.h
+++ b/include/linux/power/bq2415x_charger.h
@@ -1,7 +1,7 @@
 /*
  * bq2415x charger driver
  *
- * Copyright (C) 2011-2012  Pali Rohár <pali.rohar@gmail.com>
+ * Copyright (C) 2011-2013  Pali Rohár <pali.rohar@gmail.com>
  *
  * 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
@@ -31,46 +31,9 @@
  * termination current. It it is less or equal to zero, configuring charge
  * and termination current will not be possible.
  *
- * Function set_mode_hook is needed for automode (setting correct current
- * limit when charger is connected/disconnected or setting boost mode).
- * When is NULL, automode function is disabled. When is not NULL, it must
- * have this prototype:
- *
- *    int (*set_mode_hook)(
- *      void (*hook)(enum bq2415x_mode mode, void *data),
- *      void *data)
- *
- * hook is hook function (see below) and data is pointer to driver private
- * data
- *
- * bq2415x driver will call it as:
- *
- *    platform_data->set_mode_hook(bq2415x_hook_function, bq2415x_device);
- *
- * Board/platform function set_mode_hook return non zero value when hook
- * function was successful registered. Platform code should call that hook
- * function (which get from pointer, with data) every time when charger
- * was connected/disconnected or require to enable boost mode. bq2415x
- * driver then will set correct current limit, enable/disable charger or
- * boost mode.
- *
- * Hook function has this prototype:
- *
- *    void hook(enum bq2415x_mode mode, void *data);
- *
- * mode is bq2415x mode (charger or boost)
- * data is pointer to driver private data (which get from
- * set_charger_type_hook)
- *
- * When bq driver is being unloaded, it call function:
- *
- *    platform_data->set_mode_hook(NULL, NULL);
- *
- * (hook function and driver private data are NULL)
- *
- * After that board/platform code must not call driver hook function! It
- * is possible that pointer to hook function will not be valid and calling
- * will cause undefined result.
+ * For automode support is needed to provide name of power supply device
+ * in value notify_device. Device driver must immediately report property
+ * POWER_SUPPLY_PROP_CURRENT_MAX when current changed.
  */
 
 /* Supported modes with maximal current limit */
@@ -89,8 +52,7 @@ struct bq2415x_platform_data {
 	int charge_current;		/* mA */
 	int termination_current;	/* mA */
 	int resistor_sense;		/* m ohm */
-	int (*set_mode_hook)(void (*hook)(enum bq2415x_mode mode, void *data),
-			     void *data);
+	const char *notify_device;	/* name */
 };
 
 #endif
-- 
1.7.9.5


  parent reply	other threads:[~2013-11-19 10:22 UTC|newest]

Thread overview: 155+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-09-08  8:50 [PATCH 0/4] Add support for charging battery in Nokia RX-51 Pali Rohár
2013-09-08  8:50 ` Pali Rohár
2013-09-08  8:50 ` [PATCH 1/4] usb: musb: Call atomic_notifier_call_chain when status is changed Pali Rohár
2013-09-08  8:50   ` Pali Rohár
2013-09-17 15:48   ` Felipe Balbi
2013-09-17 15:48     ` Felipe Balbi
2013-09-17 15:48     ` Felipe Balbi
2013-09-17 15:49   ` Felipe Balbi
2013-09-17 15:49     ` Felipe Balbi
2013-09-17 15:49     ` Felipe Balbi
2013-09-17 16:05     ` Pali Rohár
2013-09-17 16:05       ` Pali Rohár
2013-09-17 16:05       ` Pali Rohár
2013-09-17 16:08       ` Felipe Balbi
2013-09-17 16:08         ` Felipe Balbi
2013-09-17 16:08         ` Felipe Balbi
2013-09-17 19:28         ` Pali Rohár
2013-09-17 19:28           ` Pali Rohár
2013-09-18  1:49           ` Felipe Balbi
2013-09-18  1:49             ` Felipe Balbi
2013-09-18  1:49             ` Felipe Balbi
2013-09-18  8:20             ` Pali Rohár
2013-09-18  8:20               ` Pali Rohár
2013-09-18  8:20               ` Pali Rohár
2013-09-18  9:04               ` Javier Martinez Canillas
2013-09-18  9:04                 ` Javier Martinez Canillas
2013-09-18  9:04                 ` Javier Martinez Canillas
2013-09-18 13:30                 ` Pavel Machek
2013-09-18 13:30                   ` Pavel Machek
2013-09-18 13:57                   ` Javier Martinez Canillas
2013-09-18 13:57                     ` Javier Martinez Canillas
2013-09-18 14:22                     ` Pavel Machek
2013-09-18 14:22                       ` Pavel Machek
2013-09-18 14:35                       ` Pavel Machek
2013-09-18 14:35                         ` Pavel Machek
2013-09-18 16:25                         ` Felipe Balbi
2013-09-18 16:25                           ` Felipe Balbi
2013-09-18 16:25                           ` Felipe Balbi
2013-09-18 14:53                       ` Javier Martinez Canillas
2013-09-18 14:53                         ` Javier Martinez Canillas
2013-09-18 15:56                     ` Pali Rohár
2013-09-18 15:56                       ` Pali Rohár
2013-09-18 15:56                       ` Pali Rohár
2013-09-18 16:36                       ` Felipe Balbi
2013-09-18 16:36                         ` Felipe Balbi
2013-09-18 16:36                         ` Felipe Balbi
2013-09-18 16:43                         ` Pali Rohár
2013-09-18 16:43                           ` Pali Rohár
2013-09-18 16:43                           ` Pali Rohár
2013-09-18 16:48                           ` Felipe Balbi
2013-09-18 16:48                             ` Felipe Balbi
2013-09-18 16:48                             ` Felipe Balbi
2013-09-18 17:03                             ` [PATCH usb 1/2] usb: musb: Add missing ATOMIC_INIT_NOTIFIER_HEAD Pali Rohár
2013-09-18 17:03                               ` Pali Rohár
2013-09-18 17:03                               ` Pali Rohár
2013-09-25  8:17                               ` Pali Rohár
2013-09-25  8:17                                 ` Pali Rohár
2013-09-25  8:17                                 ` Pali Rohár
2013-09-25 20:33                                 ` Felipe Balbi
2013-09-25 20:33                                   ` Felipe Balbi
2013-09-25 20:33                                   ` Felipe Balbi
2013-09-26  0:00                                   ` Pavel Machek
2013-09-26  0:00                                     ` Pavel Machek
2013-10-01 14:22                                     ` Felipe Balbi
2013-10-01 14:22                                       ` Felipe Balbi
2013-10-01 14:22                                       ` Felipe Balbi
2013-09-18 17:03                             ` [PATCH usb 2/2] usb: musb: Call atomic_notifier_call_chain when status is changed Pali Rohár
2013-09-18 17:03                               ` Pali Rohár
2013-09-18 17:03                               ` Pali Rohár
2013-09-08  8:50 ` [PATCH 2/4] power: isp1704_charger: Fix driver to work with changes introduced in v3.5 Pali Rohár
2013-09-08  8:50   ` Pali Rohár
2013-10-22 21:03   ` Anton Vorontsov
2013-10-22 21:03     ` Anton Vorontsov
2013-09-08  8:50 ` [PATCH 3/4] power: isp1704_charger: Add callback function set_current Pali Rohár
2013-09-08  8:50   ` Pali Rohár
2013-09-08  8:50 ` [PATCH 4/4] RX-51: Add platform function and data for bq24150a charger Pali Rohár
2013-09-08  8:50   ` Pali Rohár
2013-09-09 13:39   ` Sebastian Reichel
2013-09-09 13:39     ` Sebastian Reichel
2013-09-20 19:22   ` Pali Rohár
2013-09-20 19:22     ` Pali Rohár
2013-09-23 18:03     ` Tony Lindgren
2013-09-23 18:03       ` Tony Lindgren
2013-09-23 19:16       ` Pali Rohár
2013-09-23 19:16         ` Pali Rohár
2013-09-23 20:00         ` Sebastian Reichel
2013-09-23 20:00           ` Sebastian Reichel
2013-09-23 20:06           ` Pali Rohár
2013-09-23 20:06             ` Pali Rohár
2013-09-23 20:47             ` Sebastian Reichel
2013-09-23 20:47               ` Sebastian Reichel
2013-09-23 23:11               ` Tony Lindgren
2013-09-23 23:11                 ` Tony Lindgren
2013-09-24  0:05               ` Pavel Machek
2013-09-24  0:05                 ` Pavel Machek
2013-09-24 17:05               ` Pali Rohár
2013-09-24 17:05                 ` Pali Rohár
2013-09-24 20:50                 ` Sebastian Reichel
2013-09-24 20:50                   ` Sebastian Reichel
2013-09-14  9:38 ` [PATCH 0/4] Add support for charging battery in Nokia RX-51 Pali Rohár
2013-09-14  9:38   ` Pali Rohár
2013-09-21 13:42 ` Pali Rohár
2013-09-21 13:42   ` Pali Rohár
2013-11-19 10:18 ` [PATCH v2 0/3] " Pali Rohár
2013-11-19 10:18   ` [PATCH v2 1/3] power_supply: Add power_supply notifier Pali Rohár
2013-11-19 13:10     ` Pavel Machek
2013-11-19 13:19       ` Pali Rohár
2013-11-24 17:02     ` Sebastian Reichel
2013-11-27 17:23     ` Tc, Jenny
2013-11-27 17:23       ` Tc, Jenny
2013-12-01 22:20       ` Anton Vorontsov
2013-12-01 22:23     ` Anton Vorontsov
2013-12-01 22:23       ` Anton Vorontsov
2014-01-03 11:09       ` Tc, Jenny
2014-01-03 11:09         ` Tc, Jenny
2014-01-03 16:02         ` Anton Vorontsov
2013-11-19 10:18   ` Pali Rohár [this message]
2013-11-19 13:24     ` [PATCH v2 2/3] bq2415x_charger: Use power_supply notifier for automode Pavel Machek
2013-12-24  1:58       ` Anton Vorontsov
2013-11-24 17:00     ` Sebastian Reichel
2013-11-24 19:01       ` Pali Rohár
2013-11-24 19:26         ` Sebastian Reichel
2013-11-24 19:41           ` Pali Rohár
2013-11-24 21:00             ` Sebastian Reichel
2013-11-25 14:01             ` Pavel Machek
2013-11-25 14:10               ` Pali Rohár
2013-11-25 15:18                 ` Pavel Machek
2013-11-25 18:52                   ` Pali Rohár
2013-11-24 17:18     ` Michael Trimarchi
2013-11-24 17:18       ` Michael Trimarchi
2013-11-24 19:01       ` Pali Rohár
2013-11-25 19:16         ` Michael Trimarchi
2013-11-25 19:16           ` Michael Trimarchi
2013-12-01 22:37           ` Anton Vorontsov
2013-12-02  0:02             ` Michael Trimarchi
2013-12-02  0:24               ` Anton Vorontsov
2013-12-02  1:45                 ` Michael Trimarchi
2014-01-19 20:54                   ` Sebastian Reichel
2014-01-19 20:56                     ` Michael Trimarchi
2014-01-20 10:21                     ` Russell King - ARM Linux
2014-01-20 11:24                       ` Sebastian Reichel
2013-12-06 13:32     ` Pali Rohár
2013-11-19 10:18   ` [PATCH v2 3/3] RX-51: Add platform data for bq24150a charger Pali Rohár
2013-11-19 13:32     ` Pavel Machek
2013-11-24 10:28       ` Pali Rohár
2013-11-19 14:44   ` [PATCH v2 0/3] Add support for charging battery in Nokia RX-51 Sebastian Reichel
2013-11-19 15:40     ` Tony Lindgren
2013-11-19 21:38     ` Pali Rohár
2013-11-25 17:01 [PATCH v2 2/3] bq2415x_charger: Use power_supply notifier for automode Ивайло Димитров
2013-11-25 17:14 ` Sebastian Reichel
2013-11-25 18:32 Ивайло Димитров
2013-11-25 21:50 ` Sebastian Reichel
2013-11-27 21:16   ` Pali Rohár
2013-11-28  0:25     ` Sebastian Reichel
2013-11-28  6:53       ` Pali Rohár

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1384856285-19593-3-git-send-email-pali.rohar@gmail.com \
    --to=pali.rohar@gmail.com \
    --cc=aaro.koskinen@iki.fi \
    --cc=anton@enomsg.org \
    --cc=dwmw2@infradead.org \
    --cc=freemangordon@abv.bg \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-omap@vger.kernel.org \
    --cc=linux@arm.linux.org.uk \
    --cc=pavel@ucw.cz \
    --cc=tony@atomide.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.