aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaxman Dewangan <ldewangan@nvidia.com>2013-09-11 17:24:19 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2013-09-11 18:58:55 -0400
commit666a584d3a765a914642f80deef7a33fb309df5d (patch)
tree44075201728ea751d07c63ce5458e4cfd0404e92
parent8af750e3f5ca21eaa5595a96a4cf5eaa996deed4 (diff)
drivers/rtc/rtc-palmas.c: support for backup battery charging
Palmas series device like TPS65913, TPS80036 supports the backup battery for powering the RTC when no other energy source is available. The backup battery is optional, connected to the VBACKUP pin, and can be nonrechargeable or rechargeable. The rechargeable battery can be charged from the system supply using the backup battery charger. Add support for enabling charging of this backup battery. Also add the DT binding document and the new properties to have this support. Signed-off-by: Laxman Dewangan <ldewangan@nvidia.com> Reviewed-by: Felipe Balbi <balbi@ti.com> Acked-by: Kumar Gala <galak@codeaurora.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--Documentation/devicetree/bindings/rtc/rtc-palmas.txt33
-rw-r--r--drivers/rtc/rtc-palmas.c35
2 files changed, 68 insertions, 0 deletions
diff --git a/Documentation/devicetree/bindings/rtc/rtc-palmas.txt b/Documentation/devicetree/bindings/rtc/rtc-palmas.txt
new file mode 100644
index 000000000000..adbccc0a51e1
--- /dev/null
+++ b/Documentation/devicetree/bindings/rtc/rtc-palmas.txt
@@ -0,0 +1,33 @@
1Palmas RTC controller bindings
2
3Required properties:
4- compatible:
5 - "ti,palmas-rtc" for palma series of the RTC controller
6- interrupt-parent: Parent interrupt device, must be handle of palmas node.
7- interrupts: Interrupt number of RTC submodule on device.
8
9Optional properties:
10
11- ti,backup-battery-chargeable: The Palmas series device like TPS65913 or
12 TPS80036 supports the backup battery for powering the RTC when main
13 battery is removed or in very low power state. The backup battery
14 can be chargeable or non-chargeable. This flag will tells whether
15 battery is chargeable or not. If charging battery then driver can
16 enable the charging.
17- ti,backup-battery-charge-high-current: Enable high current charging in
18 backup battery. Device supports the < 100mA and > 100mA charging.
19 The high current will be > 100mA. Absence of this property will
20 charge battery to lower current i.e. < 100mA.
21
22Example:
23 palmas: tps65913@58 {
24 ...
25 palmas_rtc: rtc {
26 compatible = "ti,palmas-rtc";
27 interrupt-parent = <&palmas>;
28 interrupts = <8 0>;
29 ti,backup-battery-chargeable;
30 ti,backup-battery-charge-high-current;
31 };
32 ...
33 };
diff --git a/drivers/rtc/rtc-palmas.c b/drivers/rtc/rtc-palmas.c
index a1fecc8d97fc..fffb7d3449d7 100644
--- a/drivers/rtc/rtc-palmas.c
+++ b/drivers/rtc/rtc-palmas.c
@@ -238,6 +238,15 @@ static int palmas_rtc_probe(struct platform_device *pdev)
238 struct palmas *palmas = dev_get_drvdata(pdev->dev.parent); 238 struct palmas *palmas = dev_get_drvdata(pdev->dev.parent);
239 struct palmas_rtc *palmas_rtc = NULL; 239 struct palmas_rtc *palmas_rtc = NULL;
240 int ret; 240 int ret;
241 bool enable_bb_charging = false;
242 bool high_bb_charging;
243
244 if (pdev->dev.of_node) {
245 enable_bb_charging = of_property_read_bool(pdev->dev.of_node,
246 "ti,backup-battery-chargeable");
247 high_bb_charging = of_property_read_bool(pdev->dev.of_node,
248 "ti,backup-battery-charge-high-current");
249 }
241 250
242 palmas_rtc = devm_kzalloc(&pdev->dev, sizeof(struct palmas_rtc), 251 palmas_rtc = devm_kzalloc(&pdev->dev, sizeof(struct palmas_rtc),
243 GFP_KERNEL); 252 GFP_KERNEL);
@@ -254,6 +263,32 @@ static int palmas_rtc_probe(struct platform_device *pdev)
254 palmas_rtc->dev = &pdev->dev; 263 palmas_rtc->dev = &pdev->dev;
255 platform_set_drvdata(pdev, palmas_rtc); 264 platform_set_drvdata(pdev, palmas_rtc);
256 265
266 if (enable_bb_charging) {
267 unsigned reg = PALMAS_BACKUP_BATTERY_CTRL_BBS_BBC_LOW_ICHRG;
268
269 if (high_bb_charging)
270 reg = 0;
271
272 ret = palmas_update_bits(palmas, PALMAS_PMU_CONTROL_BASE,
273 PALMAS_BACKUP_BATTERY_CTRL,
274 PALMAS_BACKUP_BATTERY_CTRL_BBS_BBC_LOW_ICHRG, reg);
275 if (ret < 0) {
276 dev_err(&pdev->dev,
277 "BACKUP_BATTERY_CTRL update failed, %d\n", ret);
278 return ret;
279 }
280
281 ret = palmas_update_bits(palmas, PALMAS_PMU_CONTROL_BASE,
282 PALMAS_BACKUP_BATTERY_CTRL,
283 PALMAS_BACKUP_BATTERY_CTRL_BB_CHG_EN,
284 PALMAS_BACKUP_BATTERY_CTRL_BB_CHG_EN);
285 if (ret < 0) {
286 dev_err(&pdev->dev,
287 "BACKUP_BATTERY_CTRL update failed, %d\n", ret);
288 return ret;
289 }
290 }
291
257 /* Start RTC */ 292 /* Start RTC */
258 ret = palmas_update_bits(palmas, PALMAS_RTC_BASE, PALMAS_RTC_CTRL_REG, 293 ret = palmas_update_bits(palmas, PALMAS_RTC_BASE, PALMAS_RTC_CTRL_REG,
259 PALMAS_RTC_CTRL_REG_STOP_RTC, 294 PALMAS_RTC_CTRL_REG_STOP_RTC,