| .. | .. |
|---|
| 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, |
|---|