devm_kcalloc // 分配num_clocks个struct clk*指针 platform_set_drvdata // 保存dwc3_rockchip指针 clk = of_clk_get(np, i) // 获取时钟 clk_prepare_enable // 使能时钟 rockchip->clks[i] = clk // 保存时钟结构体指针 pm_runtime_set_active // 电源管理相关 pm_runtime_enable pm_runtime_...
devm_clk_get--获取pclk和rtc_ck。 clk_prepare_enable--使能pclk和rtc_ck。 stm32_rtc_init stm32_rtc_wpr_unlock stm32_rtc_enter_init_mode stm32_rtc_exit_init_mode stm32_rtc_wait_sync stm32_rtc_wpr_lock platform_get_irq--获取rtc alarm中断号。 device_init_wakeup--设置rtc设备具备唤醒功能。
struct clk:对于驱动开发来说,struct clk只是访问时钟的一个句柄,有了它,驱动开发就可以对时钟进行配置;其中sruct clk_hw结构包含了struck clk成员; 2.1 struct clk(drivers/clk/clk.c) 一个系统的时钟树结构是固定的,因此时钟的数目和用途也是固定的,我们以上面我们的案例图为例,假设其为一个完整的时钟系统,...
第801行,调用函数devm_ioremap_resource 完成内存映射,得到RTC外设寄存器物理基地址对应的虚拟地址。 第856行,调用clk_prepare_enable函数使能时钟。 第872行,初始化STM32MP1 rtc的寄存器。 第876行,获取设备树的中断号。 第892行,调用devm_rtc_device_register函数向系统注册rtc_devcie,RTC底层驱动集为stm32_rtc_o...
驱动程序中常用的API集成了原子和非原子操作,以确保时钟启用或停用的正确执行。这些操作可能需要CPU睡眠,特别是在启动依赖于长时间稳定状态的时钟,如PLL时钟时。因此,为了简化调用,内核封装了`clk_prepare_enable`和`clk_disable_unprepare`接口。CLK子系统的核心数据结构包括`struct clk_notifier`、`...
struct clk *clk_register_fixed_rate(struct device *dev,constchar*name, constchar*parent_name,unsignedlongflags, unsignedlongfixed_rate) ; 2. gate clock 这一类clock只可开关(会提供.enable/.disable回调),可使用下面接口注册: struct clk *clk_register_gate(struct device *dev,constchar*name, ...
这一类clock只可开关(会提供.enable/.disable回调),可使用下面接口注册: struct clk *clk_register_gate(struct device *dev, const char *name, const char *parent_name, unsigned long flags, void __iomem *reg, u8 bit_idx, u8 clk_gate_flags, spinlock_t *lock); ...
ret=clk_prepare_enable(rs->spiclk); if(ret< 0) { dev_err(&pdev->dev,"Failedtoenablespi_clk "); gotoerr_disable_apbclk; } spi_enable_chip(rs,false); ret=platform_get_irq(pdev,0); if(ret< 0) goto err_disable_spiclk;
这一类clock只可开关(会提供.enable/.disable回调),可使用下面接口注册: struct clk *clk_register_gate(struct device *dev,constchar*name, constchar*parent_name,unsignedlongflags, void__iomem *reg, u8 bit_idx, u8 clk_gate_flags,spinlock_t*lock); ...
ret = clk_prepare_enable(pclk); if (ret) {pr_err("Failed to enable pclk for '%s'\n", np->name); goto out_unmap; } timer->pclk = pclk; timer_clk = of_clk_get_by_name(np, "timer"); if (IS_ERR(timer_clk)) {ret = PTR_ERR(timer_clk); ...