struct sh_clk_ops {
#ifdef CONFIG_SH_CLK_CPG_LEGACY
void (*init)(struct clk *clk); // 初始化时钟
#endif
int (*enable)(struct clk *clk); // 使能时钟
void (*disable)(struct clk *clk); // 禁用时钟
unsigned long (*recalc)(struct clk *clk); // 重新计算时钟频率
int (*set_rate)(struct clk *clk, unsigned long rate); // 设置时钟频率
int (*set_parent)(struct clk *clk, struct clk *parent); // 设置时钟的父时钟
long (*round_rate)(struct clk *clk, unsigned long rate);// 四舍五入时钟频率
};
struct clk_mapping {
phys_addr_t phys; // 时钟寄存器的物理地址
void __iomem *base; // 时钟寄存器的虚拟地址
unsigned long len; // 时钟寄存器的长度
struct kref ref; // 时钟映射的引用计数
};
struct clk {
struct list_head node; // 用于将时钟源链接到全局时钟列表的链表节点
struct clk *parent; // 指向父时钟源的指针
struct clk **parent_table; // 指向父时钟源表的指针,用于选择父时钟源
unsigned short parent_num; // 父时钟源表中的时钟源数量
unsigned char src_shift; // 配置寄存器中源时钟字段的偏移量
unsigned char src_width; // 配置寄存器中源时钟字段的宽度
struct sh_clk_ops *ops; // 指向时钟操作函数表的指针
struct list_head children; // 用于链接子时钟源的链表头
struct list_head sibling; // 用于链接兄弟时钟源的链表节点
int usecount; // 时钟源的使用计数
unsigned long rate; // 时钟源的当前频率
unsigned long flags; // 时钟源的标志位
void __iomem *enable_reg; // 时钟使能寄存器的地址
void __iomem *status_reg; // 时钟状态寄存器的地址
unsigned int enable_bit; // 时钟使能位的偏移量
void __iomem *mapped_reg; // 映射寄存器的地址
unsigned int div_mask; // 时钟分频掩码
unsigned long arch_flags; // 架构相关的标志位
void *priv; // 私有数据指针
struct clk_mapping *mapping; // 时钟映射结构体指针
struct cpufreq_frequency_table *freq_table; // 时钟频率表指针
unsigned int nr_freqs; // 时钟频率表中的频率数量
};
直接开始下一节说明: 音频输出和采样模块