drivers/regulator/88pm800-regulator.c

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

File Facts

System
Linux kernel
Corpus path
drivers/regulator/88pm800-regulator.c
Extension
.c
Size
9463 bytes
Lines
288
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

struct pm800_regulator_info {
	struct regulator_desc desc;
	int max_ua;
};

/*
 * vreg - the buck regs string.
 * ereg - the string for the enable register.
 * ebit - the bit number in the enable register.
 * amax - the current
 * Buck has 2 kinds of voltage steps. It is easy to find voltage by ranges,
 * not the constant voltage table.
 * n_volt - Number of available selectors
 */
#define PM800_BUCK(match, vreg, ereg, ebit, amax, volt_ranges, n_volt)	\
{									\
	.desc	= {							\
		.name			= #vreg,			\
		.of_match		= of_match_ptr(#match),		\
		.regulators_node	= of_match_ptr("regulators"),	\
		.ops			= &pm800_volt_range_ops,	\
		.type			= REGULATOR_VOLTAGE,		\
		.id			= PM800_ID_##vreg,		\
		.owner			= THIS_MODULE,			\
		.n_voltages		= n_volt,			\
		.linear_ranges		= volt_ranges,			\
		.n_linear_ranges	= ARRAY_SIZE(volt_ranges),	\
		.vsel_reg		= PM800_##vreg,			\
		.vsel_mask		= 0x7f,				\
		.enable_reg		= PM800_##ereg,			\
		.enable_mask		= 1 << (ebit),			\
	},								\
	.max_ua	= (amax),						\
}

/*
 * vreg - the LDO regs string
 * ereg -  the string for the enable register.
 * ebit - the bit number in the enable register.
 * amax - the current
 * volt_table - the LDO voltage table
 * For all the LDOes, there are too many ranges. Using volt_table will be
 * simpler and faster.
 */
#define PM800_LDO(match, vreg, ereg, ebit, amax, ldo_volt_table)	\
{									\
	.desc	= {							\
		.name			= #vreg,			\
		.of_match		= of_match_ptr(#match),		\
		.regulators_node	= of_match_ptr("regulators"),	\
		.ops			= &pm800_volt_table_ops,	\
		.type			= REGULATOR_VOLTAGE,		\
		.id			= PM800_ID_##vreg,		\
		.owner			= THIS_MODULE,			\
		.n_voltages		= ARRAY_SIZE(ldo_volt_table),	\
		.vsel_reg		= PM800_##vreg##_VOUT,		\
		.vsel_mask		= 0xf,				\
		.enable_reg		= PM800_##ereg,			\
		.enable_mask		= 1 << (ebit),			\
		.volt_table		= ldo_volt_table,		\
	},								\
	.max_ua	= (amax),						\
}

/* Ranges are sorted in ascending order. */
static const struct linear_range buck1_volt_range[] = {
	REGULATOR_LINEAR_RANGE(600000, 0, 0x4f, 12500),
	REGULATOR_LINEAR_RANGE(1600000, 0x50, 0x54, 50000),
};

/* BUCK 2~5 have same ranges. */
static const struct linear_range buck2_5_volt_range[] = {
	REGULATOR_LINEAR_RANGE(600000, 0, 0x4f, 12500),
	REGULATOR_LINEAR_RANGE(1600000, 0x50, 0x72, 50000),
};

static const unsigned int ldo1_volt_table[] = {
	600000,  650000,  700000,  750000,  800000,  850000,  900000,  950000,
	1000000, 1050000, 1100000, 1150000, 1200000, 1300000, 1400000, 1500000,
};

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

/* LDO 3~17 have same voltage table. */
static const unsigned int ldo3_17_volt_table[] = {
	1200000, 1250000, 1700000, 1800000, 1850000, 1900000, 2500000, 2600000,
	2700000, 2750000, 2800000, 2850000, 2900000, 3000000, 3100000, 3300000,
};

Annotation

Implementation Notes