1 // SPDX-License-Identifier: GPL-2.0+
3 * Supports for the power IC on the Surface 3 tablet.
5 * (C) Copyright 2016-2018 Red Hat, Inc
6 * (C) Copyright 2016-2018 Benjamin Tissoires <benjamin.tissoires@gmail.com>
7 * (C) Copyright 2016 Stephen Just <stephenjust@gmail.com>
9 * This driver has been reverse-engineered by parsing the DSDT of the Surface 3
10 * and looking at the registers of the chips.
12 * The DSDT allowed to find out that:
13 * - the driver is required for the ACPI BAT0 device to communicate to the chip
14 * through an operation region.
15 * - the various defines for the operation region functions to communicate with
17 * - the DSM 3f99e367-6220-4955-8b0f-06ef2ae79412 allows to trigger ACPI
18 * events to BAT0 (the code is all available in the DSDT).
20 * Further findings regarding the 2 chips declared in the MSHW0011 are:
21 * - there are 2 chips declared:
22 * . 0x22 seems to control the ADP1 line status (and probably the charger)
23 * . 0x55 controls the battery directly
24 * - the battery chip uses a SMBus protocol (using plain SMBus allows non
25 * destructive commands):
26 * . the commands/registers used are in the range 0x00..0x7F
27 * . if bit 8 (0x80) is set in the SMBus command, the returned value is the
28 * same as when it is not set. There is a high chance this bit is the
30 * . the various registers semantic as been deduced by observing the register
34 #include <linux/acpi.h>
35 #include <linux/bits.h>
36 #include <linux/freezer.h>
37 #include <linux/i2c.h>
38 #include <linux/kernel.h>
39 #include <linux/kthread.h>
40 #include <linux/slab.h>
41 #include <linux/types.h>
42 #include <linux/uuid.h>
43 #include <linux/unaligned.h>
45 #define SURFACE_3_POLL_INTERVAL (2 * HZ)
46 #define SURFACE_3_STRLEN 10
48 struct mshw0011_data
{
49 struct i2c_client
*adp1
;
50 struct i2c_client
*bat0
;
51 unsigned short notify_mask
;
52 struct task_struct
*poll_task
;
61 struct mshw0011_handler_data
{
62 struct acpi_connection_info info
;
63 struct i2c_client
*client
;
70 u32 last_full_charg_capacity
;
71 u32 battery_technology
;
73 u32 design_capacity_of_warning
;
74 u32 design_capacity_of_low
;
76 u32 measurement_accuracy
;
77 u32 max_sampling_time
;
78 u32 min_sampling_time
;
79 u32 max_average_interval
;
80 u32 min_average_interval
;
81 u32 battery_capacity_granularity_1
;
82 u32 battery_capacity_granularity_2
;
83 char model
[SURFACE_3_STRLEN
];
84 char serial
[SURFACE_3_STRLEN
];
85 char type
[SURFACE_3_STRLEN
];
86 char OEM
[SURFACE_3_STRLEN
];
91 s32 battery_present_rate
;
92 u32 battery_remaining_capacity
;
93 u32 battery_present_voltage
;
107 struct gsb_command cmd
;
113 #define ACPI_BATTERY_STATE_DISCHARGING BIT(0)
114 #define ACPI_BATTERY_STATE_CHARGING BIT(1)
115 #define ACPI_BATTERY_STATE_CRITICAL BIT(2)
117 #define MSHW0011_CMD_DEST_BAT0 0x01
118 #define MSHW0011_CMD_DEST_ADP1 0x03
120 #define MSHW0011_CMD_BAT0_STA 0x01
121 #define MSHW0011_CMD_BAT0_BIX 0x02
122 #define MSHW0011_CMD_BAT0_BCT 0x03
123 #define MSHW0011_CMD_BAT0_BTM 0x04
124 #define MSHW0011_CMD_BAT0_BST 0x05
125 #define MSHW0011_CMD_BAT0_BTP 0x06
126 #define MSHW0011_CMD_ADP1_PSR 0x07
127 #define MSHW0011_CMD_BAT0_PSOC 0x09
128 #define MSHW0011_CMD_BAT0_PMAX 0x0a
129 #define MSHW0011_CMD_BAT0_PSRC 0x0b
130 #define MSHW0011_CMD_BAT0_CHGI 0x0c
131 #define MSHW0011_CMD_BAT0_ARTG 0x0d
133 #define MSHW0011_NOTIFY_GET_VERSION 0x00
134 #define MSHW0011_NOTIFY_ADP1 0x01
135 #define MSHW0011_NOTIFY_BAT0_BST 0x02
136 #define MSHW0011_NOTIFY_BAT0_BIX 0x05
138 #define MSHW0011_ADP1_REG_PSR 0x04
140 #define MSHW0011_BAT0_REG_CAPACITY 0x0c
141 #define MSHW0011_BAT0_REG_FULL_CHG_CAPACITY 0x0e
142 #define MSHW0011_BAT0_REG_DESIGN_CAPACITY 0x40
143 #define MSHW0011_BAT0_REG_VOLTAGE 0x08
144 #define MSHW0011_BAT0_REG_RATE 0x14
145 #define MSHW0011_BAT0_REG_OEM 0x45
146 #define MSHW0011_BAT0_REG_TYPE 0x4e
147 #define MSHW0011_BAT0_REG_SERIAL_NO 0x56
148 #define MSHW0011_BAT0_REG_CYCLE_CNT 0x6e
150 #define MSHW0011_EV_2_5_MASK GENMASK(8, 0)
152 /* 3f99e367-6220-4955-8b0f-06ef2ae79412 */
153 static const guid_t mshw0011_guid
=
154 GUID_INIT(0x3F99E367, 0x6220, 0x4955, 0x8B, 0x0F, 0x06, 0xEF,
155 0x2A, 0xE7, 0x94, 0x12);
158 mshw0011_notify(struct mshw0011_data
*cdata
, u8 arg1
, u8 arg2
,
159 unsigned int *ret_value
)
161 union acpi_object
*obj
;
165 handle
= ACPI_HANDLE(&cdata
->adp1
->dev
);
169 obj
= acpi_evaluate_dsm_typed(handle
, &mshw0011_guid
, arg1
, arg2
, NULL
,
172 dev_err(&cdata
->adp1
->dev
, "device _DSM execution failed\n");
177 for (i
= 0; i
< obj
->buffer
.length
; i
++)
178 *ret_value
|= obj
->buffer
.pointer
[i
] << (i
* 8);
184 static const struct bix default_bix
= {
187 .design_capacity
= 0x1dca,
188 .last_full_charg_capacity
= 0x1dca,
189 .battery_technology
= 0x01,
190 .design_voltage
= 0x10df,
191 .design_capacity_of_warning
= 0x8f,
192 .design_capacity_of_low
= 0x47,
193 .cycle_count
= 0xffffffff,
194 .measurement_accuracy
= 0x00015f90,
195 .max_sampling_time
= 0x03e8,
196 .min_sampling_time
= 0x03e8,
197 .max_average_interval
= 0x03e8,
198 .min_average_interval
= 0x03e8,
199 .battery_capacity_granularity_1
= 0x45,
200 .battery_capacity_granularity_2
= 0x11,
207 static int mshw0011_bix(struct mshw0011_data
*cdata
, struct bix
*bix
)
209 struct i2c_client
*client
= cdata
->bat0
;
210 char buf
[SURFACE_3_STRLEN
];
215 /* get design capacity */
216 ret
= i2c_smbus_read_word_data(client
,
217 MSHW0011_BAT0_REG_DESIGN_CAPACITY
);
219 dev_err(&client
->dev
, "Error reading design capacity: %d\n",
223 bix
->design_capacity
= ret
;
225 /* get last full charge capacity */
226 ret
= i2c_smbus_read_word_data(client
,
227 MSHW0011_BAT0_REG_FULL_CHG_CAPACITY
);
229 dev_err(&client
->dev
,
230 "Error reading last full charge capacity: %d\n", ret
);
233 bix
->last_full_charg_capacity
= ret
;
236 * Get serial number, on some devices (with unofficial replacement
237 * battery?) reading any of the serial number range addresses gets
238 * nacked in this case just leave the serial number empty.
240 ret
= i2c_smbus_read_i2c_block_data(client
, MSHW0011_BAT0_REG_SERIAL_NO
,
242 if (ret
== -EREMOTEIO
) {
243 /* no serial number available */
244 } else if (ret
!= sizeof(buf
)) {
245 dev_err(&client
->dev
, "Error reading serial no: %d\n", ret
);
248 snprintf(bix
->serial
, ARRAY_SIZE(bix
->serial
), "%3pE%6pE", buf
+ 7, buf
);
251 /* get cycle count */
252 ret
= i2c_smbus_read_word_data(client
, MSHW0011_BAT0_REG_CYCLE_CNT
);
254 dev_err(&client
->dev
, "Error reading cycle count: %d\n", ret
);
257 bix
->cycle_count
= ret
;
260 ret
= i2c_smbus_read_i2c_block_data(client
, MSHW0011_BAT0_REG_OEM
,
263 dev_err(&client
->dev
, "Error reading cycle count: %d\n", ret
);
266 snprintf(bix
->OEM
, ARRAY_SIZE(bix
->OEM
), "%3pE", buf
);
271 static int mshw0011_bst(struct mshw0011_data
*cdata
, struct bst
*bst
)
273 struct i2c_client
*client
= cdata
->bat0
;
274 int rate
, capacity
, voltage
, state
;
277 rate
= i2c_smbus_read_word_data(client
, MSHW0011_BAT0_REG_RATE
);
281 capacity
= i2c_smbus_read_word_data(client
, MSHW0011_BAT0_REG_CAPACITY
);
285 voltage
= i2c_smbus_read_word_data(client
, MSHW0011_BAT0_REG_VOLTAGE
);
290 bst
->battery_present_rate
= abs((s32
)tmp
);
294 state
|= ACPI_BATTERY_STATE_CHARGING
;
295 else if ((s32
) tmp
< 0)
296 state
|= ACPI_BATTERY_STATE_DISCHARGING
;
297 bst
->battery_state
= state
;
299 bst
->battery_remaining_capacity
= capacity
;
300 bst
->battery_present_voltage
= voltage
;
305 static int mshw0011_adp_psr(struct mshw0011_data
*cdata
)
307 return i2c_smbus_read_byte_data(cdata
->adp1
, MSHW0011_ADP1_REG_PSR
);
310 static int mshw0011_isr(struct mshw0011_data
*cdata
)
315 bool status
, bat_status
;
317 ret
= mshw0011_adp_psr(cdata
);
322 if (status
!= cdata
->charging
)
323 mshw0011_notify(cdata
, cdata
->notify_mask
,
324 MSHW0011_NOTIFY_ADP1
, &ret
);
326 cdata
->charging
= status
;
328 ret
= mshw0011_bst(cdata
, &bst
);
332 bat_status
= bst
.battery_state
;
333 if (bat_status
!= cdata
->bat_charging
)
334 mshw0011_notify(cdata
, cdata
->notify_mask
,
335 MSHW0011_NOTIFY_BAT0_BST
, &ret
);
337 cdata
->bat_charging
= bat_status
;
339 ret
= mshw0011_bix(cdata
, &bix
);
343 if (bix
.last_full_charg_capacity
!= cdata
->full_capacity
)
344 mshw0011_notify(cdata
, cdata
->notify_mask
,
345 MSHW0011_NOTIFY_BAT0_BIX
, &ret
);
347 cdata
->full_capacity
= bix
.last_full_charg_capacity
;
352 static int mshw0011_poll_task(void *data
)
354 struct mshw0011_data
*cdata
= data
;
357 cdata
->kthread_running
= true;
361 while (!kthread_should_stop()) {
362 schedule_timeout_interruptible(SURFACE_3_POLL_INTERVAL
);
364 ret
= mshw0011_isr(data
);
369 cdata
->kthread_running
= false;
374 mshw0011_space_handler(u32 function
, acpi_physical_address command
,
375 u32 bits
, u64
*value64
,
376 void *handler_context
, void *region_context
)
378 struct gsb_buffer
*gsb
= (struct gsb_buffer
*)value64
;
379 struct mshw0011_handler_data
*data
= handler_context
;
380 struct acpi_connection_info
*info
= &data
->info
;
381 struct acpi_resource_i2c_serialbus
*sb
;
382 struct i2c_client
*client
= data
->client
;
383 struct mshw0011_data
*cdata
= i2c_get_clientdata(client
);
384 struct acpi_resource
*ares
;
385 u32 accessor_type
= function
>> 16;
389 ret
= acpi_buffer_to_resource(info
->connection
, info
->length
, &ares
);
390 if (ACPI_FAILURE(ret
))
393 if (!value64
|| !i2c_acpi_get_i2c_resource(ares
, &sb
)) {
394 ret
= AE_BAD_PARAMETER
;
398 if (accessor_type
!= ACPI_GSB_ACCESS_ATTRIB_RAW_PROCESS
) {
399 ret
= AE_BAD_PARAMETER
;
403 if (gsb
->cmd
.arg0
== MSHW0011_CMD_DEST_ADP1
&&
404 gsb
->cmd
.arg1
== MSHW0011_CMD_ADP1_PSR
) {
405 status
= mshw0011_adp_psr(cdata
);
415 if (gsb
->cmd
.arg0
!= MSHW0011_CMD_DEST_BAT0
) {
416 ret
= AE_BAD_PARAMETER
;
420 switch (gsb
->cmd
.arg1
) {
421 case MSHW0011_CMD_BAT0_STA
:
423 case MSHW0011_CMD_BAT0_BIX
:
424 ret
= mshw0011_bix(cdata
, &gsb
->bix
);
426 case MSHW0011_CMD_BAT0_BTP
:
427 cdata
->trip_point
= gsb
->cmd
.arg2
;
429 case MSHW0011_CMD_BAT0_BST
:
430 ret
= mshw0011_bst(cdata
, &gsb
->bst
);
433 dev_info(&cdata
->bat0
->dev
, "command(0x%02x) is not supported.\n", gsb
->cmd
.arg1
);
434 ret
= AE_BAD_PARAMETER
;
447 static int mshw0011_install_space_handler(struct i2c_client
*client
)
449 struct acpi_device
*adev
;
450 struct mshw0011_handler_data
*data
;
453 adev
= ACPI_COMPANION(&client
->dev
);
457 data
= kzalloc(sizeof(struct mshw0011_handler_data
),
462 data
->client
= client
;
463 status
= acpi_bus_attach_private_data(adev
->handle
, (void *)data
);
464 if (ACPI_FAILURE(status
)) {
469 status
= acpi_install_address_space_handler(adev
->handle
,
470 ACPI_ADR_SPACE_GSBUS
,
471 &mshw0011_space_handler
,
474 if (ACPI_FAILURE(status
)) {
475 dev_err(&client
->dev
, "Error installing i2c space handler\n");
476 acpi_bus_detach_private_data(adev
->handle
);
481 acpi_dev_clear_dependencies(adev
);
485 static void mshw0011_remove_space_handler(struct i2c_client
*client
)
487 struct mshw0011_handler_data
*data
;
491 handle
= ACPI_HANDLE(&client
->dev
);
495 acpi_remove_address_space_handler(handle
,
496 ACPI_ADR_SPACE_GSBUS
,
497 &mshw0011_space_handler
);
499 status
= acpi_bus_get_private_data(handle
, (void **)&data
);
500 if (ACPI_SUCCESS(status
))
503 acpi_bus_detach_private_data(handle
);
506 static int mshw0011_probe(struct i2c_client
*client
)
508 struct i2c_board_info board_info
;
509 struct device
*dev
= &client
->dev
;
510 struct i2c_client
*bat0
;
511 struct mshw0011_data
*data
;
514 data
= devm_kzalloc(dev
, sizeof(*data
), GFP_KERNEL
);
519 i2c_set_clientdata(client
, data
);
521 memset(&board_info
, 0, sizeof(board_info
));
522 strscpy(board_info
.type
, "MSHW0011-bat0", I2C_NAME_SIZE
);
524 bat0
= i2c_acpi_new_device(dev
, 1, &board_info
);
526 return PTR_ERR(bat0
);
529 i2c_set_clientdata(bat0
, data
);
531 error
= mshw0011_notify(data
, 1, MSHW0011_NOTIFY_GET_VERSION
, &mask
);
535 data
->notify_mask
= mask
== MSHW0011_EV_2_5_MASK
;
537 data
->poll_task
= kthread_run(mshw0011_poll_task
, data
, "mshw0011_adp");
538 if (IS_ERR(data
->poll_task
)) {
539 error
= PTR_ERR(data
->poll_task
);
540 dev_err(&client
->dev
, "Unable to run kthread err %d\n", error
);
544 error
= mshw0011_install_space_handler(client
);
551 if (data
->kthread_running
)
552 kthread_stop(data
->poll_task
);
553 i2c_unregister_device(data
->bat0
);
557 static void mshw0011_remove(struct i2c_client
*client
)
559 struct mshw0011_data
*cdata
= i2c_get_clientdata(client
);
561 mshw0011_remove_space_handler(client
);
563 if (cdata
->kthread_running
)
564 kthread_stop(cdata
->poll_task
);
566 i2c_unregister_device(cdata
->bat0
);
569 static const struct acpi_device_id mshw0011_acpi_match
[] = {
573 MODULE_DEVICE_TABLE(acpi
, mshw0011_acpi_match
);
575 static struct i2c_driver mshw0011_driver
= {
576 .probe
= mshw0011_probe
,
577 .remove
= mshw0011_remove
,
580 .acpi_match_table
= mshw0011_acpi_match
,
583 module_i2c_driver(mshw0011_driver
);
585 MODULE_AUTHOR("Benjamin Tissoires <benjamin.tissoires@gmail.com>");
586 MODULE_DESCRIPTION("mshw0011 driver");
587 MODULE_LICENSE("GPL v2");