drivers/regulator/sun20i-regulator.c
Source file repositories/reference/linux-study-clean/drivers/regulator/sun20i-regulator.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/regulator/sun20i-regulator.c- Extension
.c- Size
- 4017 bytes
- Lines
- 158
- 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.
- 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.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/mfd/syscon.hlinux/module.hlinux/of.hlinux/of_device.hlinux/platform_device.hlinux/regmap.hlinux/regulator/driver.h
Detected Declarations
struct sun20i_regulator_datafunction sun20i_d1_system_ldo_list_voltagefunction sun20i_regulator_probe
Annotated Snippet
struct sun20i_regulator_data {
const struct regulator_desc *descs;
unsigned int ndescs;
};
/* regulator_list_voltage_linear() modified for the non-integral uV_step. */
static int sun20i_d1_system_ldo_list_voltage(struct regulator_dev *rdev,
unsigned int selector)
{
const struct regulator_desc *desc = rdev->desc;
unsigned int fraction, uV;
if (selector >= desc->n_voltages)
return -EINVAL;
uV = desc->min_uV + (desc->uV_step * selector);
fraction = selector + (desc->min_uV % 4);
if (uV > 1606667)
uV += 6667;
else
fraction++;
/* Produce correctly-rounded absolute voltages. */
return uV + (fraction / 3);
}
static const struct regulator_ops sun20i_d1_system_ldo_ops = {
.list_voltage = sun20i_d1_system_ldo_list_voltage,
.map_voltage = regulator_map_voltage_ascend,
.set_voltage_sel = regulator_set_voltage_sel_regmap,
.get_voltage_sel = regulator_get_voltage_sel_regmap,
};
static const struct regulator_desc sun20i_d1_system_ldo_descs[] = {
{
.name = "ldoa",
.supply_name = "ldo-in",
.of_match = "ldoa",
.ops = &sun20i_d1_system_ldo_ops,
.type = REGULATOR_VOLTAGE,
.owner = THIS_MODULE,
.n_voltages = 32,
.min_uV = 1593333,
.uV_step = 13333, /* repeating */
.vsel_reg = SUN20I_SYS_LDO_CTRL_REG,
.vsel_mask = GENMASK(7, 0),
},
{
.name = "ldob",
.supply_name = "ldo-in",
.of_match = "ldob",
.ops = &sun20i_d1_system_ldo_ops,
.type = REGULATOR_VOLTAGE,
.owner = THIS_MODULE,
.n_voltages = 64,
.min_uV = 1166666,
.uV_step = 13333, /* repeating */
.vsel_reg = SUN20I_SYS_LDO_CTRL_REG,
.vsel_mask = GENMASK(15, 8),
},
};
static const struct sun20i_regulator_data sun20i_d1_system_ldos = {
.descs = sun20i_d1_system_ldo_descs,
.ndescs = ARRAY_SIZE(sun20i_d1_system_ldo_descs),
};
static struct regmap *sun20i_regulator_get_regmap(struct device *dev)
{
struct regmap *regmap;
/*
* First try the syscon interface. The system control device is not
* compatible with "syscon", so fall back to getting the regmap from
* its platform device. This is ugly, but required for devicetree
* backward compatibility.
*/
regmap = syscon_node_to_regmap(dev->parent->of_node);
if (!IS_ERR(regmap))
return regmap;
regmap = dev_get_regmap(dev->parent, NULL);
if (regmap)
return regmap;
return ERR_PTR(-EPROBE_DEFER);
}
static int sun20i_regulator_probe(struct platform_device *pdev)
Annotation
- Immediate include surface: `linux/mfd/syscon.h`, `linux/module.h`, `linux/of.h`, `linux/of_device.h`, `linux/platform_device.h`, `linux/regmap.h`, `linux/regulator/driver.h`.
- Detected declarations: `struct sun20i_regulator_data`, `function sun20i_d1_system_ldo_list_voltage`, `function sun20i_regulator_probe`.
- Atlas domain: Driver Families / drivers/regulator.
- Implementation status: source implementation candidate.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.