drivers/power/supply/bd99954-charger.c

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

File Facts

System
Linux kernel
Corpus path
drivers/power/supply/bd99954-charger.c
Extension
.c
Size
29242 bytes
Lines
1079
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

struct bd9995x_init_data {
	u16 vsysreg_set;	/* VSYS Regulation Setting */
	u16 ibus_lim_set;	/* VBUS input current limitation */
	u16 icc_lim_set;	/* VCC/VACP Input Current Limit Setting */
	u16 itrich_set;		/* Trickle-charge Current Setting */
	u16 iprech_set;		/* Pre-Charge Current Setting */
	u16 ichg_set;		/* Fast-Charge constant current */
	u16 vfastchg_reg_set1;	/* Fast Charging Regulation Voltage */
	u16 vprechg_th_set;	/* Pre-charge Voltage Threshold Setting */
	u16 vrechg_set;		/* Re-charge Battery Voltage Setting */
	u16 vbatovp_set;	/* Battery Over Voltage Threshold Setting */
	u16 iterm_set;		/* Charging termination current */
};

struct bd9995x_state {
	u8 online;
	u16 chgstm_status;
	u16 vbat_vsys_status;
	u16 vbus_vcc_status;
};

struct bd9995x_device {
	struct i2c_client *client;
	struct device *dev;
	struct power_supply *charger;

	struct regmap *rmap;
	struct regmap_field *rmap_fields[F_MAX_FIELDS];

	int chip_id;
	int chip_rev;
	struct bd9995x_init_data init_data;
	struct bd9995x_state state;

	struct mutex lock; /* Protect state data */
};

static const struct regmap_range bd9995x_readonly_reg_ranges[] = {
	regmap_reg_range(CHGSTM_STATUS, SEL_ILIM_VAL),
	regmap_reg_range(IOUT_DACIN_VAL, IOUT_DACIN_VAL),
	regmap_reg_range(VCC_UCD_STATUS, VCC_IDD_STATUS),
	regmap_reg_range(VBUS_UCD_STATUS, VBUS_IDD_STATUS),
	regmap_reg_range(CHIP_ID, CHIP_REV),
	regmap_reg_range(SYSTEM_STATUS, SYSTEM_STATUS),
	regmap_reg_range(IBATP_VAL, VBAT_AVE_VAL),
	regmap_reg_range(VTH_VAL, EXTIADP_AVE_VAL),
};

static const struct regmap_access_table bd9995x_writeable_regs = {
	.no_ranges = bd9995x_readonly_reg_ranges,
	.n_no_ranges = ARRAY_SIZE(bd9995x_readonly_reg_ranges),
};

static const struct regmap_range bd9995x_volatile_reg_ranges[] = {
	regmap_reg_range(CHGSTM_STATUS, WDT_STATUS),
	regmap_reg_range(VCC_UCD_STATUS, VCC_IDD_STATUS),
	regmap_reg_range(VBUS_UCD_STATUS, VBUS_IDD_STATUS),
	regmap_reg_range(INT0_STATUS, INT7_STATUS),
	regmap_reg_range(SYSTEM_STATUS, SYSTEM_CTRL_SET),
	regmap_reg_range(IBATP_VAL, EXTIADP_AVE_VAL), /* Measurement regs */
};

static const struct regmap_access_table bd9995x_volatile_regs = {
	.yes_ranges = bd9995x_volatile_reg_ranges,
	.n_yes_ranges = ARRAY_SIZE(bd9995x_volatile_reg_ranges),
};

static const struct regmap_range_cfg regmap_range_cfg[] = {
	{
	.selector_reg     = MAP_SET,
	.selector_mask    = 0xFFFF,
	.selector_shift   = 0,
	.window_start     = 0,
	.window_len       = 0x100,
	.range_min        = 0 * 0x100,
	.range_max        = 3 * 0x100,
	},
};

static const struct regmap_config bd9995x_regmap_config = {
	.reg_bits = 8,
	.val_bits = 16,
	.reg_stride = 1,

	.max_register = 3 * 0x100,
	.cache_type = REGCACHE_MAPLE,

	.ranges = regmap_range_cfg,
	.num_ranges = ARRAY_SIZE(regmap_range_cfg),
	.val_format_endian = REGMAP_ENDIAN_LITTLE,

Annotation

Implementation Notes