drivers/regulator/88pm886-regulator.c

Source file repositories/reference/linux-study-clean/drivers/regulator/88pm886-regulator.c

File Facts

System
Linux kernel
Corpus path
drivers/regulator/88pm886-regulator.c
Extension
.c
Size
11260 bytes
Lines
393
Domain
Driver Families
Bucket
drivers/regulator
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-only
#include <linux/i2c.h>
#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/regmap.h>
#include <linux/regulator/driver.h>

#include <linux/mfd/88pm886.h>

static const struct regmap_config pm886_regulator_regmap_config = {
	.reg_bits = 8,
	.val_bits = 8,
	.max_register = PM886_REG_BUCK5_VOUT,
};

static const struct regulator_ops pm886_ldo_ops = {
	.list_voltage = regulator_list_voltage_table,
	.map_voltage = regulator_map_voltage_iterate,
	.set_voltage_sel = regulator_set_voltage_sel_regmap,
	.get_voltage_sel = regulator_get_voltage_sel_regmap,
	.enable = regulator_enable_regmap,
	.disable = regulator_disable_regmap,
	.is_enabled = regulator_is_enabled_regmap,
};

static const struct regulator_ops pm886_buck_ops = {
	.list_voltage = regulator_list_voltage_linear_range,
	.map_voltage = regulator_map_voltage_linear_range,
	.set_voltage_sel = regulator_set_voltage_sel_regmap,
	.get_voltage_sel = regulator_get_voltage_sel_regmap,
	.enable = regulator_enable_regmap,
	.disable = regulator_disable_regmap,
	.is_enabled = regulator_is_enabled_regmap,
};

static const unsigned int pm886_ldo_volt_table1[] = {
	1700000, 1800000, 1900000, 2500000, 2800000, 2900000, 3100000, 3300000,
};

static const unsigned int pm886_ldo_volt_table2[] = {
	1200000, 1250000, 1700000, 1800000, 1850000, 1900000, 2500000, 2600000,
	2700000, 2750000, 2800000, 2850000, 2900000, 3000000, 3100000, 3300000,
};

static const unsigned int pm886_ldo_volt_table3[] = {
	1700000, 1800000, 1900000, 2000000, 2100000, 2500000, 2700000, 2800000,
};

static const struct linear_range pm886_buck_volt_ranges1[] = {
	REGULATOR_LINEAR_RANGE(600000, 0, 79, 12500),
	REGULATOR_LINEAR_RANGE(1600000, 80, 84, 50000),
};

static const struct linear_range pm886_buck_volt_ranges2[] = {
	REGULATOR_LINEAR_RANGE(600000, 0, 79, 12500),
	REGULATOR_LINEAR_RANGE(1600000, 80, 114, 50000),
};

static struct regulator_desc pm886_regulators[] = {
	{
		.name = "LDO1",
		.regulators_node = "regulators",
		.of_match = "ldo1",
		.ops = &pm886_ldo_ops,
		.type = REGULATOR_VOLTAGE,
		.enable_reg = PM886_REG_LDO_EN1,
		.enable_mask = BIT(0),
		.volt_table = pm886_ldo_volt_table1,
		.n_voltages = ARRAY_SIZE(pm886_ldo_volt_table1),
		.vsel_reg = PM886_REG_LDO1_VOUT,
		.vsel_mask = PM886_LDO_VSEL_MASK,
	},
	{
		.name = "LDO2",
		.regulators_node = "regulators",
		.of_match = "ldo2",
		.ops = &pm886_ldo_ops,
		.type = REGULATOR_VOLTAGE,
		.enable_reg = PM886_REG_LDO_EN1,
		.enable_mask = BIT(1),
		.volt_table = pm886_ldo_volt_table1,
		.n_voltages = ARRAY_SIZE(pm886_ldo_volt_table1),
		.vsel_reg = PM886_REG_LDO2_VOUT,
		.vsel_mask = PM886_LDO_VSEL_MASK,
	},
	{
		.name = "LDO3",
		.regulators_node = "regulators",
		.of_match = "ldo3",
		.ops = &pm886_ldo_ops,

Annotation

Implementation Notes