drivers/power/supply/ab8500_bmdata.c

Source file repositories/reference/linux-study-clean/drivers/power/supply/ab8500_bmdata.c

File Facts

System
Linux kernel
Corpus path
drivers/power/supply/ab8500_bmdata.c
Extension
.c
Size
7334 bytes
Lines
242
Domain
Driver Families
Bucket
drivers/power
Inferred role
Driver Families: implementation source
Status
source implementation candidate

Why This File Exists

Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.

Dependency Surface

Detected Declarations

Annotated Snippet

// SPDX-License-Identifier: GPL-2.0
#include <linux/export.h>
#include <linux/power_supply.h>
#include <linux/of.h>

#include "ab8500-bm.h"

/* Default: under this temperature, charging is stopped */
#define AB8500_TEMP_UNDER	3
/* Default: between this temp and AB8500_TEMP_UNDER charging is reduced */
#define AB8500_TEMP_LOW		8
/* Default: between this temp and AB8500_TEMP_OVER charging is reduced */
#define AB8500_TEMP_HIGH	43
/* Default: over this temp, charging is stopped */
#define AB8500_TEMP_OVER	48
/* Default: temperature hysteresis */
#define AB8500_TEMP_HYSTERESIS	3

static const struct power_supply_battery_ocv_table ocv_cap_tbl[] = {
	{ .ocv = 4186000, .capacity = 100},
	{ .ocv = 4163000, .capacity = 99},
	{ .ocv = 4114000, .capacity = 95},
	{ .ocv = 4068000, .capacity = 90},
	{ .ocv = 3990000, .capacity = 80},
	{ .ocv = 3926000, .capacity = 70},
	{ .ocv = 3898000, .capacity = 65},
	{ .ocv = 3866000, .capacity = 60},
	{ .ocv = 3833000, .capacity = 55},
	{ .ocv = 3812000, .capacity = 50},
	{ .ocv = 3787000, .capacity = 40},
	{ .ocv = 3768000, .capacity = 30},
	{ .ocv = 3747000, .capacity = 25},
	{ .ocv = 3730000, .capacity = 20},
	{ .ocv = 3705000, .capacity = 15},
	{ .ocv = 3699000, .capacity = 14},
	{ .ocv = 3684000, .capacity = 12},
	{ .ocv = 3672000, .capacity = 9},
	{ .ocv = 3657000, .capacity = 7},
	{ .ocv = 3638000, .capacity = 6},
	{ .ocv = 3556000, .capacity = 4},
	{ .ocv = 3424000, .capacity = 2},
	{ .ocv = 3317000, .capacity = 1},
	{ .ocv = 3094000, .capacity = 0},
};

/*
 * Note that the batres_vs_temp table must be strictly sorted by falling
 * temperature values to work. Factory resistance is 300 mOhm and the
 * resistance values to the right are percentages of 300 mOhm.
 */
static const struct power_supply_resistance_temp_table temp_to_batres_tbl_thermistor[] = {
	{ .temp = 40, .resistance = 40 /* 120 mOhm */ },
	{ .temp = 30, .resistance = 45 /* 135 mOhm */ },
	{ .temp = 20, .resistance = 55 /* 165 mOhm */ },
	{ .temp = 10, .resistance = 77 /* 230 mOhm */ },
	{ .temp = 00, .resistance = 108 /* 325 mOhm */ },
	{ .temp = -10, .resistance = 158 /* 445 mOhm */ },
	{ .temp = -20, .resistance = 198 /* 595 mOhm */ },
};

static struct power_supply_maintenance_charge_table ab8500_maint_charg_table[] = {
	{
		/* Maintenance charging phase A, 60 hours */
		.charge_current_max_ua = 400000,
		.charge_voltage_max_uv = 4050000,
		.charge_safety_timer_minutes = 60*60,
	},
	{
		/* Maintenance charging phase B, 200 hours */
		.charge_current_max_ua = 400000,
		.charge_voltage_max_uv = 4000000,
		.charge_safety_timer_minutes = 200*60,
	}
};

static const struct ab8500_bm_capacity_levels cap_levels = {
	.critical	= 2,
	.low		= 10,
	.normal		= 70,
	.high		= 95,
	.full		= 100,
};

static const struct ab8500_fg_parameters fg = {
	.recovery_sleep_timer = 10,
	.recovery_total_time = 100,
	.init_timer = 1,
	.init_discard_time = 5,
	.init_total_time = 40,
	.high_curr_time = 60,

Annotation

Implementation Notes