问题引入

[ 7898.374645] ------------[ cut here ]------------
[ 7898.374837] WARNING: CPU: 2 PID: 1517 at drivers/clk/clk.c:730 clk_core_enable+0x94/0x)
[ 7898.375021] Modules linked in: timer(O+) [last unloaded: timer]
[ 7898.375285] CPU: 2 PID: 1517 Comm: insmod Tainted: G        W  O    4.4.0 #3
[ 7898.380949] Hardware name: SAMSUNG EXYNOS (Flattened Device Tree)
[ 7898.387084] [<c00160ec>] (unwind_backtrace) from [<c0012e08>] (show_stack+0x10/0x14)
[ 7898.394786] [<c0012e08>] (show_stack) from [<c01f6bd8>] (dump_stack+0x80/0xc0)
[ 7898.401947] [<c01f6bd8>] (dump_stack) from [<c00235c8>] (warn_slowpath_common+0x80/0xb)
[ 7898.410016] [<c00235c8>] (warn_slowpath_common) from [<c0023694>] (warn_slowpath_null+)
[ 7898.418781] [<c0023694>] (warn_slowpath_null) from [<c04092c4>] (clk_core_enable+0x94/)
[ 7898.427116] [<c04092c4>] (clk_core_enable) from [<c04095e0>] (clk_enable+0x1c/0x38)
[ 7898.434760] [<c04095e0>] (clk_enable) from [<bf02c07c>] (timer3_probe+0x5c/0x15c [time)
[ 7898.442921] [<bf02c07c>] (timer3_probe [timer]) from [<c02c58c4>] (platform_drv_probe+)
[ 7898.451680] [<c02c58c4>] (platform_drv_probe) from [<c02c3f54>] (driver_probe_device+0)
[ 7898.460532] [<c02c3f54>] (driver_probe_device) from [<c02c40a0>] (__driver_attach+0x8c)
[ 7898.468959] [<c02c40a0>] (__driver_attach) from [<c02c247c>] (bus_for_each_dev+0x60/0x)
[ 7898.477115] [<c02c247c>] (bus_for_each_dev) from [<c02c366c>] (bus_add_driver+0x1a0/0x)
[ 7898.485358] [<c02c366c>] (bus_add_driver) from [<c02c4874>] (driver_register+0x78/0xf8)
[ 7898.493346] [<c02c4874>] (driver_register) from [<bf02c18c>] (timer_init+0x10/0x3c [ti)
[ 7898.501681] [<bf02c18c>] (timer_init [timer]) from [<c0009774>] (do_one_initcall+0x90/)
[ 7898.510100] [<c0009774>] (do_one_initcall) from [<c0098050>] (do_init_module+0x60/0x34)
[ 7898.518172] [<c0098050>] (do_init_module) from [<c008bef0>] (load_module+0x1b3c/0x1d68)
[ 7898.526153] [<c008bef0>] (load_module) from [<c008c1f0>] (SyS_init_module+0xd4/0x144)
[ 7898.533967] [<c008c1f0>] (SyS_init_module) from [<c000f600>] (ret_fast_syscall+0x0/0x3)
[ 7898.542031] ---[ end trace 655de26992d22f14 ]---
[ 7898.546682] ret:-108

最近写驱动时ret=clk_enable(clk)报错,追溯原因:
http://blog.csdn.net/qq_33160790/article/details/79354855
108对应着ESHUTDOWN,所以出错是因为

后来查阅资料,在使用clk_enable之前调用clk_prepare,或者使用clk_prepare_enable API即可。


clk_prepare()和clk_prepare_enable

/* clk_prepare_enable helps cases using clk_enable in non-atomic context. */
static inline int clk_prepare_enable(struct clk *clk)
{int ret;ret = clk_prepare(clk);if (ret)return ret;ret = clk_enable(clk);if (ret)        clk_unprepare(clk);return ret;
}

很明显clk_prepare_enable就是把clk_prepare和clk_enable封装在一起。
早期的驱动中,并没有clk_prepare这个API,带prepare关键字的都是新加入的。

值得一提的是,名称中含有prepare、unprepare字符串的API是内核后来才加入的,过去
只有clk_enable和clk_disable。只有clk_enable和clk_disable带来的问题是,
有时候,某些硬件的enable/disable clk可能引起睡眠使得enable/disable不能在原子
上下文进行。
加上prepare后,把过去的clk_enable分解成不可在原子上下文调用的
clk_prepare(该函数可能睡眠)和可以在原子上下文调用的clk_enable。
而clk_prepare_enable则同时完成
prepare和enable的工作,当然也只能在可能睡眠的上下文调用该API。

怎么理解上面这段话呢,我觉得关键点在于clk_prepare为什么可能睡眠。

clk_prepare()和clk_prepare_enable相关推荐

  1. Linux时钟管理clk devm_clk_get clk_prepare_enable等学习

    Linux时钟管理clk devm_clk_get clk_prepare_enable等学习 一.查看系统clk命令 cat d/clk/clk_summary 二.clock获取有关的API. s ...

  2. 基于RK3399 PWM驱动开发

    1. 主板型号:AIO-3399J 2. 芯片型号:RK3399 3. 操作系统版本:Android 7.1 4. Linux版本:v4.4.103 PWM(Pulse Width Modulatio ...

  3. Exynos4412的Linux5.4.174时钟驱动开发(四)——clk API的调用方法

    系列文章目录 Exynos4412的Linux时钟驱动开发(一)--Exynos4412的时钟管理单元CMU Exynos4412的Linux时钟驱动开发(二)--时钟驱动的初始化(CLK_OF_DE ...

  4. 高通平台GPIO模拟PWM控制背光

    很多时候由于节省硬件资源,降低成本,会把PWM控制芯片去掉或者是改做它用,导致当我们想用PWM方式控制背光时只能使用带有clk功能的GPIO口.本篇文档就来讲解下如何使用GPIO模拟PWM功能进行背光 ...

  5. i.MX8MPlus中的CLK子系统

    芯片手册中的clk框架 CCM(Clock Control Module)框架图 外部时钟的输入源有24MHz,32.768KHz以及四个EXT CLK.这7个输入源都可以直接连接到CCM,但是PLL ...

  6. Linux clock子系统【3】-i2c控制器打开时钟的流程分析(devm_clk_get)(consumer侧)

    文章目录 前言 一.硬件流程图 二.晶振设备树描述 三. I2CX时钟设备树描述 四.驱动中获得/使能时钟 4.1 流程源码分析 4.1.1 devm_clk_get(struct device *d ...

  7. 驱动篇:底层驱动移植(四)(摘录)

    驱动篇:底层驱动移植(四)(摘录) 时钟驱动 在一个 SoC 中,晶振. PLL .驱动和门等会形成一个时钟树形结构,在 Linux 2.6 中,也存有clk_get_rate ().clk_set_ ...

  8. 4.imx6 IPU代码详细分析

    4.0 ipu_soc,ipu_channel_t ,ipu_channel_params_t结构体详解 1.ipu_soc结构体: struct ipu_soc { unsigned int id; ...

  9. 4.1 ipu_common.c分析---入口函数及probe函数分析

    这个ipu_common.c函数提供ipu底层函数调用的一些关系和函数. (一)分析这个文件从init函数入口,发现有这个subsys_initcall,说明ipu是作为一个子系统注册到内核中的: i ...

最新文章

  1. sql isnull函数的使用(转载)
  2. C语言中的#ifndef、#def、#endif等宏
  3. muduo之EventLoopThreadPool
  4. SpringBoot整合异步任务实现发送邮件
  5. 科大星云诗社动态20210419
  6. 312. Burst Balloons 戳气球
  7. 自动设置图片的序号_巧用word软件中的题注功能,让你插入的对象自动排序与更新...
  8. OBS Windows10 1909版本黑屏问题解决方案
  9. java用一条语句判断一个整数是不是2的整数次方
  10. latex 图片缩小指定比例
  11. 新版微信语音转发方法 萌妹子变声器手机版 微信语音怎么转发给别人
  12. 对于i=1,i=i++,最后输出结果为1的理解
  13. Kali Linux pyqt5 运行报错xcb
  14. C语言从入门到入土---初识C语言
  15. 520到来!教你如何用代码向心仪的学妹表白,获取他的芳心!
  16. python 柱状图折线图共用一个图例_Python数据可视化–折线图–柱状图
  17. C#中的cs0116Error
  18. android touch事件无反应,android的touch事件分发响应机制
  19. Pyautogui 实现键盘鼠标动作
  20. 仓库搬仓实施过程参考

热门文章

  1. 面向智能制造全价值链的精益数字孪生体
  2. 2020年第四轮计算机科学与技术学科评估排名结果
  3. 2010 01 13 开博
  4. java编写股票交易软件有哪些,java开发程序源代码_炒股软件说明-小S股票
  5. 接触网机器人:设计和控制由两个四旋翼飞行器驱动的电缆(Matlab代码实现)
  6. saveig.org,帮你批量下载爱豆的Instagram照片
  7. jsp70877婚庆策划婚车预订网站 双数据库 mysql版
  8. Java——成绩等级评定
  9. 突发:深度学习之父Hinton为了警告AI的风险,不惜从谷歌离职!
  10. Ubuntu-Touch-03:使用SSH连接手机