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 驱动。
-
变更:
- 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 内核开发流程的一个典型例子:
-
子系统维护者(Uwe Kleine-König)收集并测试了针对 PWM 子系统的两个重要 bug 修复。
-
他将这些修复打包,并向 Linus Torvalds 发送了一个拉取请求。
-
Linus 审查了这个请求,认为修复是必要且正确的,于是执行了一次合并操作,将这些修复正式集成到内核主线代码中,以便它们能包含在下一个候选版本(v6.16-rc6)里。
这两个修复分别解决了一个核心逻辑错误和一个驱动资源泄漏问题,提高了内核的稳定性和正确性。