兰 亭 墨 苑
期货 · 量化 · AI · 终身学习
首页
归档
编辑文章
标题 *
URL 别名 *
内容 *
(支持 Markdown 格式)
>author Linus Torvalds <torvalds@linux-foundation.org> 2025-07-08 13:31:29 -0700 >committer Linus Torvalds <torvalds@linux-foundation.org> 2025-07-08 13:31:29 -0700 >commit 733923397fd95405a48f165c9b1fbc8c4b0a4681 (patch) >tree 0da1a8e1f47adfda2687455f1f9b6ac4e46ebf1e >parent 72782127388d96e971f0186996a5bd44e64a1665 (diff) >parent 505b730ede7f5c4083ff212aa955155b5b92e574 (diff) >download linux-733923397fd95405a48f165c9b1fbc8c4b0a4681.tar.gz >Merge tag 'pwm/for-6.16-rc6-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/ukleinek/linuxHEADmaster >Pull pwm fixes from Uwe Kleine-König: > "Two fixes for v6.16-rc6 > > The first patch fixes an embarrassing bug in the pwm core. I really > wonder this wasn't found earlier since it's introduction in v6.11-rc1 > as it greatly disturbs driving a PWM via sysfs. > > The second and last patch fixes a clock balance issue in an error path > of the Mediatek PWM driver" > >* tag 'pwm/for-6.16-rc6-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/ukleinek/linux: > pwm: mediatek: Ensure to disable clocks in error path > pwm: Fix invalid state detection >Diffstat >-rw-r--r-- drivers/pwm/core.c 2 >-rw-r--r-- drivers/pwm/pwm-mediatek.c 13 >2 files changed, 9 insertions, 6 deletions >diff --git a/drivers/pwm/core.c b/drivers/pwm/core.c >index 4d842c69219445..edf776b8ad53b9 100644 >--- a/drivers/pwm/core.c >+++ b/drivers/pwm/core.c >@@ -596,7 +596,7 @@ static bool pwm_state_valid(const struct pwm_state *state) > * and supposed to be ignored. So also ignore any strange values and > * consider the state ok. > */ >- if (state->enabled) >+ if (!state->enabled) > return true; > > if (!state->period) >diff --git a/drivers/pwm/pwm-mediatek.c b/drivers/pwm/pwm-mediatek.c >index 7eaab58314995c..33d3554b9197ab 100644 >--- a/drivers/pwm/pwm-mediatek.c >+++ b/drivers/pwm/pwm-mediatek.c >@@ -130,8 +130,10 @@ static int pwm_mediatek_config(struct pwm_chip *chip, struct pwm_device *pwm, > return ret; > > clk_rate = clk_get_rate(pc->clk_pwms[pwm->hwpwm]); >- if (!clk_rate) >- return -EINVAL; >+ if (!clk_rate) { >+ ret = -EINVAL; >+ goto out; >+ } > > /* Make sure we use the bus clock and not the 26MHz clock */ > if (pc->soc->has_ck_26m_sel) >@@ -150,9 +152,9 @@ static int pwm_mediatek_config(struct pwm_chip *chip, struct pwm_device *pwm, > } > > if (clkdiv > PWM_CLK_DIV_MAX) { >- pwm_mediatek_clk_disable(chip, pwm); > dev_err(pwmchip_parent(chip), "period of %d ns not supported\n", period_ns); >- return -EINVAL; >+ ret = -EINVAL; >+ goto out; > } > > if (pc->soc->pwm45_fixup && pwm->hwpwm > 2) { >@@ -169,9 +171,10 @@ static int pwm_mediatek_config(struct pwm_chip *chip, struct pwm_device *pwm, > pwm_mediatek_writel(pc, pwm->hwpwm, reg_width, cnt_period); > pwm_mediatek_writel(pc, pwm->hwpwm, reg_thres, cnt_duty); > >+out: > pwm_mediatek_clk_disable(chip, pwm); > >- return 0; >+ return ret; > } > > static int pwm_mediatek_enable(struct pwm_chip *chip, struct pwm_device *pwm) > > 这是一个标准的 Linux 内核代码提交(Commit)的展示页面,它包含了元数据、提交信息和具体的代码变更。我们可以分步来解析。 ### 总体概述 这是一个由 **Linus Torvalds**(Linux 内核的创造者和最高维护者)执行的**合并提交(Merge Commit)**。 它的核心作用是:将 **PWM(脉冲宽度调制)子系统**的一个修复分支合并到 Linux 内核的主干代码中。这次合并包含了两个针对 v6.16-rc6(Linux 6.16 版本的第 6 个候选发布版)的紧急修复。 --- ### 详细解析 我们按信息块来分析: #### 1. 元数据(Metadata) 这部分是关于这个提交本身的信息。 * `author Linus Torvalds <...>`: 指出这次**合并操作**的执行者是 Linus Torvalds。 * `committer Linus Torvalds <...>`: 同样,确认是 Linus 完成了这次提交。 * `commit 73392339...`: 这是本次提交的唯一标识符(SHA-1 哈希值)。你可以用这个哈希值在 Git 历史中精确定位到这次变更。 * `parent 72782127...`: 这是父提交之一,代表 Linus 的主分支在合并**之前**的状态。 * `parent 505b730e...`: 这是另一个父提交,代表被合并进来的那个 PWM 修复分支的最新状态。一个合并提交通常有两个(或更多)父提交。 * `Merge tag 'pwm/for-6.16-rc6-fixes' ...`: 这是提交的标题,清楚地说明了这是一次合并操作,合并的是一个名为 `pwm/for-6.16-rc6-fixes` 的 Git 标签。 * `download ...`: 提供了下载这个版本代码快照的链接。 **注意**: 这里的日期 `2025-07-08` 看起来是未来的,这在真实的 git log 中很罕见,可能是 cgit 系统显示问题或这是一个示例。但这不影响对代码本身的分析。 #### 2. 提交信息(Commit Message) 这部分是 Linus Torvalds 引用自 PWM 子系统维护者 **Uwe Kleine-König** 的“拉取请求”(Pull Request)信息,解释了为什么要进行这次合并。 * `Pull pwm fixes from Uwe Kleine-König:`: 说明这些修复来自于 PWM 子系统维护者 Uwe。 * `Two fixes for v6.16-rc6`: 明确指出这是为 6.16-rc6 版本准备的两个修复。 * **第一个修复**: > "The first patch fixes an embarrassing bug in the pwm core... it greatly disturbs driving a PWM via sysfs." * **问题**: PWM 核心代码中有一个“令人尴尬的”bug,从 v6.11-rc1 引入以来一直没被发现。这个 bug 严重影响了通过 `sysfs`(一种用户空间与内核交互的文件系统接口)来控制 PWM 设备的功能。 * **修复**: 对应下面的 `pwm: Fix invalid state detection`。 * **第二个修复**: > "The second and last patch fixes a clock balance issue in an error path of the Mediatek PWM driver" * **问题**: 在联发科(Mediatek)的 PWM 驱动中,某个错误处理路径上存在“时钟不平衡”的问题。这通常意味着在发生错误时,一个已经被启用的时钟没有被正确地禁用,导致资源泄漏。 * **修复**: 对应下面的 `pwm: mediatek: Ensure to disable clocks in error path`。 #### 3. 代码变更(Diff) 这部分是本次提交所包含的实际代码修改。 ##### 文件 1: `drivers/pwm/core.c` 这是 PWM 的核心框架代码,这里的修改会影响所有使用该框架的 PWM 驱动。 * **变更**: ```diff - if (state->enabled) + if (!state->enabled) return true; ``` * **含义**: * 这个函数 `pwm_state_valid` 用于检查一个 PWM 状态是否有效。 * **修改前**: `if (state->enabled)` 意味着**只有在** PWM 被启用时,才直接返回 `true`(认为状态有效),然后继续检查周期(period)等参数。这逻辑是错的。 * **修改后**: `if (!state->enabled)` 意味着**如果** PWM 是**未启用**状态,就直接返回 `true`。根据代码注释,当 PWM 未启用时,其周期和占空比等参数是无意义的,不应该去校验它们。所以,只要是“未启用”状态,就应该被认为是有效的。 * **总结**: 这是一个简单的逻辑修正,修复了之前提到的影响 `sysfs` 的 bug。 ##### 文件 2: `drivers/pwm/pwm-mediatek.c` 这是针对联发科(Mediatek)芯片的 PWM 驱动程序。 * **变更**: * 多处错误处理代码从直接 `return -EINVAL;` 改为了 `ret = -EINVAL; goto out;`。 * 在函数末尾增加了一个 `out:` 标签。 * 函数结尾的 `return 0;` 改为了 `return ret;`。 * **含义**: * 这是一个经典的**错误处理重构**。 * **修改前**: 在 `pwm_mediatek_config` 函数中,如果 `clk_get_rate()` 返回 0 或者 `clkdiv` 计算值过大,函数会直接 `return -EINVAL;` 退出。问题在于,函数开头调用了 `pwm_mediatek_clk_enable()` 来启用时钟,但这些提前退出的路径**没有**调用 `pwm_mediatek_clk_disable()` 来关闭时钟。 * **修改后**: 通过引入 `goto out;` 语句,所有错误路径都会跳转到函数末尾的 `out:` 标签处。`out:` 标签后面紧跟着 `pwm_mediatek_clk_disable()` 调用。这样就**保证了**无论函数是正常执行完毕还是因错误中途退出,之前打开的时钟都会被正确关闭。 * **总结**: 这修复了提交信息中提到的“时钟不平衡”问题,避免了时钟资源泄漏。 --- ### 最终总结 这个提交是 Linux 内核开发流程的一个典型例子: 1. **子系统维护者**(Uwe Kleine-König)收集并测试了针对 PWM 子系统的两个重要 bug 修复。 2. 他将这些修复打包,并向 **Linus Torvalds** 发送了一个拉取请求。 3. **Linus** 审查了这个请求,认为修复是必要且正确的,于是执行了一次**合并操作**,将这些修复正式集成到内核主线代码中,以便它们能包含在下一个候选版本(v6.16-rc6)里。 这两个修复分别解决了一个核心逻辑错误和一个驱动资源泄漏问题,提高了内核的稳定性和正确性。
配图 (可多选)
选择新图片文件或拖拽到此处
标签
更新文章
删除文章