.. | .. |
---|
| 1 | +// SPDX-License-Identifier: GPL-2.0 |
---|
1 | 2 | /* |
---|
2 | 3 | * Power supply driver for the goldfish emulator |
---|
3 | 4 | * |
---|
.. | .. |
---|
5 | 6 | * Copyright (C) 2012 Intel, Inc. |
---|
6 | 7 | * Copyright (C) 2013 Intel, Inc. |
---|
7 | 8 | * Author: Mike Lockwood <lockwood@android.com> |
---|
8 | | - * |
---|
9 | | - * This software is licensed under the terms of the GNU General Public |
---|
10 | | - * License version 2, as published by the Free Software Foundation, and |
---|
11 | | - * may be copied, distributed, and modified under those terms. |
---|
12 | | - * |
---|
13 | | - * This program is distributed in the hope that it will be useful, |
---|
14 | | - * but WITHOUT ANY WARRANTY; without even the implied warranty of |
---|
15 | | - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
---|
16 | | - * GNU General Public License for more details. |
---|
17 | 9 | */ |
---|
18 | 10 | |
---|
19 | 11 | #include <linux/module.h> |
---|
.. | .. |
---|
40 | 32 | #define GOLDFISH_BATTERY_WRITE(data, addr, x) \ |
---|
41 | 33 | (writel(x, data->reg_base + addr)) |
---|
42 | 34 | |
---|
43 | | -/* |
---|
44 | | - * Temporary variable used between goldfish_battery_probe() and |
---|
45 | | - * goldfish_battery_open(). |
---|
46 | | - */ |
---|
47 | | -static struct goldfish_battery_data *battery_data; |
---|
48 | | - |
---|
49 | 35 | enum { |
---|
50 | 36 | /* status register */ |
---|
51 | | - BATTERY_INT_STATUS = 0x00, |
---|
| 37 | + BATTERY_INT_STATUS = 0x00, |
---|
52 | 38 | /* set this to enable IRQ */ |
---|
53 | | - BATTERY_INT_ENABLE = 0x04, |
---|
| 39 | + BATTERY_INT_ENABLE = 0x04, |
---|
54 | 40 | |
---|
55 | | - BATTERY_AC_ONLINE = 0x08, |
---|
56 | | - BATTERY_STATUS = 0x0C, |
---|
57 | | - BATTERY_HEALTH = 0x10, |
---|
58 | | - BATTERY_PRESENT = 0x14, |
---|
59 | | - BATTERY_CAPACITY = 0x18, |
---|
| 41 | + BATTERY_AC_ONLINE = 0x08, |
---|
| 42 | + BATTERY_STATUS = 0x0C, |
---|
| 43 | + BATTERY_HEALTH = 0x10, |
---|
| 44 | + BATTERY_PRESENT = 0x14, |
---|
| 45 | + BATTERY_CAPACITY = 0x18, |
---|
| 46 | + BATTERY_VOLTAGE = 0x1C, |
---|
| 47 | + BATTERY_TEMP = 0x20, |
---|
| 48 | + BATTERY_CHARGE_COUNTER = 0x24, |
---|
| 49 | + BATTERY_VOLTAGE_MAX = 0x28, |
---|
| 50 | + BATTERY_CURRENT_MAX = 0x2C, |
---|
| 51 | + BATTERY_CURRENT_NOW = 0x30, |
---|
| 52 | + BATTERY_CURRENT_AVG = 0x34, |
---|
| 53 | + BATTERY_CHARGE_FULL_UAH = 0x38, |
---|
| 54 | + BATTERY_CYCLE_COUNT = 0x40, |
---|
60 | 55 | |
---|
61 | 56 | BATTERY_STATUS_CHANGED = 1U << 0, |
---|
62 | 57 | AC_STATUS_CHANGED = 1U << 1, |
---|
63 | | - BATTERY_INT_MASK = BATTERY_STATUS_CHANGED | AC_STATUS_CHANGED, |
---|
| 58 | + BATTERY_INT_MASK = BATTERY_STATUS_CHANGED | AC_STATUS_CHANGED, |
---|
64 | 59 | }; |
---|
65 | 60 | |
---|
66 | 61 | |
---|
.. | .. |
---|
74 | 69 | switch (psp) { |
---|
75 | 70 | case POWER_SUPPLY_PROP_ONLINE: |
---|
76 | 71 | val->intval = GOLDFISH_BATTERY_READ(data, BATTERY_AC_ONLINE); |
---|
| 72 | + break; |
---|
| 73 | + case POWER_SUPPLY_PROP_VOLTAGE_MAX: |
---|
| 74 | + val->intval = GOLDFISH_BATTERY_READ(data, BATTERY_VOLTAGE_MAX); |
---|
| 75 | + break; |
---|
| 76 | + case POWER_SUPPLY_PROP_CURRENT_MAX: |
---|
| 77 | + val->intval = GOLDFISH_BATTERY_READ(data, BATTERY_CURRENT_MAX); |
---|
77 | 78 | break; |
---|
78 | 79 | default: |
---|
79 | 80 | ret = -EINVAL; |
---|
.. | .. |
---|
105 | 106 | case POWER_SUPPLY_PROP_CAPACITY: |
---|
106 | 107 | val->intval = GOLDFISH_BATTERY_READ(data, BATTERY_CAPACITY); |
---|
107 | 108 | break; |
---|
| 109 | + case POWER_SUPPLY_PROP_VOLTAGE_NOW: |
---|
| 110 | + val->intval = GOLDFISH_BATTERY_READ(data, BATTERY_VOLTAGE); |
---|
| 111 | + break; |
---|
| 112 | + case POWER_SUPPLY_PROP_TEMP: |
---|
| 113 | + val->intval = GOLDFISH_BATTERY_READ(data, BATTERY_TEMP); |
---|
| 114 | + break; |
---|
| 115 | + case POWER_SUPPLY_PROP_CHARGE_COUNTER: |
---|
| 116 | + val->intval = GOLDFISH_BATTERY_READ(data, |
---|
| 117 | + BATTERY_CHARGE_COUNTER); |
---|
| 118 | + break; |
---|
| 119 | + case POWER_SUPPLY_PROP_CURRENT_NOW: |
---|
| 120 | + val->intval = GOLDFISH_BATTERY_READ(data, BATTERY_CURRENT_NOW); |
---|
| 121 | + break; |
---|
| 122 | + case POWER_SUPPLY_PROP_CURRENT_AVG: |
---|
| 123 | + val->intval = GOLDFISH_BATTERY_READ(data, BATTERY_CURRENT_AVG); |
---|
| 124 | + break; |
---|
| 125 | + case POWER_SUPPLY_PROP_CHARGE_FULL: |
---|
| 126 | + val->intval = GOLDFISH_BATTERY_READ(data, |
---|
| 127 | + BATTERY_CHARGE_FULL_UAH); |
---|
| 128 | + break; |
---|
| 129 | + case POWER_SUPPLY_PROP_CYCLE_COUNT: |
---|
| 130 | + val->intval = GOLDFISH_BATTERY_READ(data, BATTERY_CYCLE_COUNT); |
---|
| 131 | + break; |
---|
108 | 132 | default: |
---|
109 | 133 | ret = -EINVAL; |
---|
110 | 134 | break; |
---|
.. | .. |
---|
119 | 143 | POWER_SUPPLY_PROP_PRESENT, |
---|
120 | 144 | POWER_SUPPLY_PROP_TECHNOLOGY, |
---|
121 | 145 | POWER_SUPPLY_PROP_CAPACITY, |
---|
| 146 | + POWER_SUPPLY_PROP_VOLTAGE_NOW, |
---|
| 147 | + POWER_SUPPLY_PROP_TEMP, |
---|
| 148 | + POWER_SUPPLY_PROP_CHARGE_COUNTER, |
---|
| 149 | + POWER_SUPPLY_PROP_CURRENT_NOW, |
---|
| 150 | + POWER_SUPPLY_PROP_CURRENT_AVG, |
---|
| 151 | + POWER_SUPPLY_PROP_CHARGE_FULL, |
---|
| 152 | + POWER_SUPPLY_PROP_CYCLE_COUNT, |
---|
122 | 153 | }; |
---|
123 | 154 | |
---|
124 | 155 | static enum power_supply_property goldfish_ac_props[] = { |
---|
125 | 156 | POWER_SUPPLY_PROP_ONLINE, |
---|
| 157 | + POWER_SUPPLY_PROP_VOLTAGE_MAX, |
---|
| 158 | + POWER_SUPPLY_PROP_CURRENT_MAX, |
---|
126 | 159 | }; |
---|
127 | 160 | |
---|
128 | 161 | static irqreturn_t goldfish_battery_interrupt(int irq, void *dev_id) |
---|
.. | .. |
---|
193 | 226 | return -ENODEV; |
---|
194 | 227 | } |
---|
195 | 228 | |
---|
196 | | - ret = devm_request_irq(&pdev->dev, data->irq, goldfish_battery_interrupt, |
---|
197 | | - IRQF_SHARED, pdev->name, data); |
---|
| 229 | + ret = devm_request_irq(&pdev->dev, data->irq, |
---|
| 230 | + goldfish_battery_interrupt, |
---|
| 231 | + IRQF_SHARED, pdev->name, data); |
---|
198 | 232 | if (ret) |
---|
199 | 233 | return ret; |
---|
200 | 234 | |
---|
.. | .. |
---|
212 | 246 | } |
---|
213 | 247 | |
---|
214 | 248 | platform_set_drvdata(pdev, data); |
---|
215 | | - battery_data = data; |
---|
216 | 249 | |
---|
217 | 250 | GOLDFISH_BATTERY_WRITE(data, BATTERY_INT_ENABLE, BATTERY_INT_MASK); |
---|
218 | 251 | return 0; |
---|
.. | .. |
---|
224 | 257 | |
---|
225 | 258 | power_supply_unregister(data->battery); |
---|
226 | 259 | power_supply_unregister(data->ac); |
---|
227 | | - battery_data = NULL; |
---|
228 | 260 | return 0; |
---|
229 | 261 | } |
---|
230 | 262 | |
---|
.. | .. |
---|
234 | 266 | }; |
---|
235 | 267 | MODULE_DEVICE_TABLE(of, goldfish_battery_of_match); |
---|
236 | 268 | |
---|
| 269 | +#ifdef CONFIG_ACPI |
---|
237 | 270 | static const struct acpi_device_id goldfish_battery_acpi_match[] = { |
---|
238 | 271 | { "GFSH0001", 0 }, |
---|
239 | 272 | { }, |
---|
240 | 273 | }; |
---|
241 | 274 | MODULE_DEVICE_TABLE(acpi, goldfish_battery_acpi_match); |
---|
| 275 | +#endif |
---|
242 | 276 | |
---|
243 | 277 | static struct platform_driver goldfish_battery_device = { |
---|
244 | 278 | .probe = goldfish_battery_probe, |
---|