drivers/clk/clk-si5351.c
Source file repositories/reference/linux-study-clean/drivers/clk/clk-si5351.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/clk/clk-si5351.c- Extension
.c- Size
- 44864 bytes
- Lines
- 1724
- Domain
- Driver Families
- Bucket
- drivers/clk
- 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.
- Allocates kernel memory; connect allocation flags and lifetime to context constraints.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/module.hlinux/kernel.hlinux/clk.hlinux/clk-provider.hlinux/delay.hlinux/err.hlinux/errno.hlinux/rational.hlinux/i2c.hlinux/of.hlinux/platform_data/si5351.hlinux/regmap.hlinux/slab.hlinux/string.hasm/div64.hclk-si5351.h
Detected Declarations
struct si5351_driver_datastruct si5351_parametersstruct si5351_hw_datastruct si5351_driver_datafunction si5351_reg_readfunction si5351_bulk_readfunction si5351_reg_writefunction si5351_bulk_writefunction si5351_set_bitsfunction si5351_msynth_params_addressfunction si5351_read_parametersfunction si5351_write_parametersfunction si5351_regmap_is_volatilefunction si5351_regmap_is_writeablefunction si5351_xtal_preparefunction si5351_xtal_unpreparefunction inputfunction si5351_clkin_unpreparefunction si5351_clkin_recalc_ratefunction inputfunction si5351_vxco_unpreparefunction si5351_vxco_set_ratefunction Transposingfunction si5351_pll_get_parentfunction si5351_pll_set_parentfunction si5351_pll_recalc_ratefunction si5351_pll_determine_ratefunction si5351_pll_set_ratefunction _si5351_msynth_reparentfunction si5351_msynth_get_parentfunction si5351_msynth_set_parentfunction si5351_msynth_recalc_ratefunction si5351_msynth_determine_ratefunction si5351_msynth_set_ratefunction _si5351_clkout_reparentfunction _si5351_clkout_set_drive_strengthfunction _si5351_clkout_set_disable_statefunction _si5351_clkout_reset_pllfunction si5351_clkout_preparefunction si5351_clkout_unpreparefunction si5351_clkout_get_parentfunction si5351_clkout_set_parentfunction si5351_clkout_recalc_ratefunction si5351_clkout_determine_ratefunction si5351_clkout_set_ratefunction si5351_dt_parsefunction si53351_of_clk_getfunction si5351_dt_parse
Annotated Snippet
struct si5351_parameters {
unsigned long p1;
unsigned long p2;
unsigned long p3;
int valid;
};
struct si5351_hw_data {
struct clk_hw hw;
struct si5351_driver_data *drvdata;
struct si5351_parameters params;
unsigned char num;
};
struct si5351_driver_data {
enum si5351_variant variant;
struct i2c_client *client;
struct regmap *regmap;
struct clk *pxtal;
const char *pxtal_name;
struct clk_hw xtal;
struct clk *pclkin;
const char *pclkin_name;
struct clk_hw clkin;
struct si5351_hw_data pll[2];
struct si5351_hw_data *msynth;
struct si5351_hw_data *clkout;
size_t num_clkout;
};
static const char * const si5351_input_names[] = {
"xtal", "clkin"
};
static const char * const si5351_pll_names[] = {
"si5351_plla", "si5351_pllb", "si5351_vxco"
};
static const char * const si5351_msynth_names[] = {
"ms0", "ms1", "ms2", "ms3", "ms4", "ms5", "ms6", "ms7"
};
static const char * const si5351_clkout_names[] = {
"clk0", "clk1", "clk2", "clk3", "clk4", "clk5", "clk6", "clk7"
};
/*
* Si5351 i2c regmap
*/
static inline u8 si5351_reg_read(struct si5351_driver_data *drvdata, u8 reg)
{
u32 val;
int ret;
ret = regmap_read(drvdata->regmap, reg, &val);
if (ret) {
dev_err(&drvdata->client->dev,
"unable to read from reg%02x\n", reg);
return 0;
}
return (u8)val;
}
static inline int si5351_bulk_read(struct si5351_driver_data *drvdata,
u8 reg, u8 count, u8 *buf)
{
return regmap_bulk_read(drvdata->regmap, reg, buf, count);
}
static inline int si5351_reg_write(struct si5351_driver_data *drvdata,
u8 reg, u8 val)
{
return regmap_write(drvdata->regmap, reg, val);
}
static inline int si5351_bulk_write(struct si5351_driver_data *drvdata,
u8 reg, u8 count, const u8 *buf)
{
return regmap_raw_write(drvdata->regmap, reg, buf, count);
}
static inline int si5351_set_bits(struct si5351_driver_data *drvdata,
u8 reg, u8 mask, u8 val)
{
return regmap_update_bits(drvdata->regmap, reg, mask, val);
}
static inline u8 si5351_msynth_params_address(int num)
{
if (num > 5)
Annotation
- Immediate include surface: `linux/module.h`, `linux/kernel.h`, `linux/clk.h`, `linux/clk-provider.h`, `linux/delay.h`, `linux/err.h`, `linux/errno.h`, `linux/rational.h`.
- Detected declarations: `struct si5351_driver_data`, `struct si5351_parameters`, `struct si5351_hw_data`, `struct si5351_driver_data`, `function si5351_reg_read`, `function si5351_bulk_read`, `function si5351_reg_write`, `function si5351_bulk_write`, `function si5351_set_bits`, `function si5351_msynth_params_address`.
- Atlas domain: Driver Families / drivers/clk.
- 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.