mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* [PATCH] pinctrl: qcom: ipq5018: replace gcc_plltest with pwm2 on gpio12
@ 2026-10-02 16:09 Adriel Santos
  2026-10-05  6:48 ` Dmitry Baryshkov
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Adriel Santos @ 2026-10-02 16:09 UTC (permalink / raw)
  To: Bartosz Golaszewski, Bjorn Andersson, Linus Walleij
  Cc: Sricharan Ramabadhran, Nitheesh Sekar, Varadarajan Narayanan,
	Konrad Dybcio, Gilberto Conde, George Moussalem, linux-arm-msm,
	linux-gpio, linux-kernel

The pingroup table has gcc_plltest at function 5 of gpio12 and does not
offer pwm2 on that pin, so the pinmux core rejects a request for pwm2 on
gpio12 as an invalid group. On the hardware, function 5 of gpio12
carries the PWM2 output: the Xiaomi AX3000T v2 drives its blue status
LED from PWM2 on gpio12.

The vendor kernel shipped on that router (Linux 4.4, stock firmware
2.0.28) has pwm2 in this slot. Its pingroup table, as read from the
firmware image, lists these functions for gpio12:

  gpio, blsp0_spi, blsp0_i2c, blsp1_uart0, _, pwm2, qdss_tracedata_a,
  _, _, _

and has pwm3 at function 4 of gpio13, matching commit c6c159fcdb4e
("pinctrl: qcom: ipq5018: add missing pwm3 function on gpio13").

Measured on the board: with gpio12 set to each of the 16 function
values in turn, and PWM2 held at 0% and then at 100% duty, the pad
level read back from GPIO_IN follows PWM2 only at function 5. There it
does not follow PWM channels 0, 1 or 3, and the LED switches with PWM2.
Functions 4 and 7, which the table leaves empty, do not carry PWM2.

Put pwm2 in function 5 of gpio12 and list gpio12 in pwm2_groups. Drop
gpio12 from gcc_plltest_groups: none of its functions is gcc_plltest
any more, and selecting it would trigger the WARN_ON() in
msm_pinmux_set_mux().

Fixes: 725d1c891658 ("pinctrl: qcom: Add IPQ5018 pinctrl driver")
Assisted-by: LLM
Signed-off-by: Adriel Santos <adriel@adriel.eu>
---

Notes:
    - The vendor table was read from the stock kernel image: each pingroup
      descriptor was found by its register offsets (0xc000 for gpio12), and
      its function array decoded with the image's own function name table.
      That table still lists gpio12 in gcc_plltest_groups, which this patch
      drops for the reason given above.
    - George Moussalem's OpenWrt port of this board first put pwm2 on gpio12
      at function 7. At function 7, and at function 4 (pwm3's slot on
      gpio13), the pad stays high at both 0% and 100% duty, which is why the
      message mentions those two.
    - This applies on top of George's "pinctrl: qcom: ipq5018: update PWM
      groups and corresponding pin functions", which Bartosz has applied for
      v7.3; the two touch different pins.
    - Tested on the Xiaomi AX3000T v2 with an OpenWrt 6.18 kernel carrying
      the same table change: the blue LED (pwm2 on gpio12) and the yellow
      LED (pwm3 on gpio13) switch with their PWM channels. This patch was
      build-tested on pinctrl-qcom/for-current (arm64, W=1, built-in and as
      a module). It has not been booted on a mainline kernel.
    - Prepared with an AI coding assistant (Claude). It found the mismatch
      while I was bringing up the board, wrote the measurement and
      table-decoding scripts, and drafted the change and this message. I
      confirmed the LED behaviour on the hardware and reviewed the change
      and the evidence.

 drivers/pinctrl/qcom/pinctrl-ipq5018.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/pinctrl/qcom/pinctrl-ipq5018.c b/drivers/pinctrl/qcom/pinctrl-ipq5018.c
index 84392fe258..28b23bb5e1 100644
--- a/drivers/pinctrl/qcom/pinctrl-ipq5018.c
+++ b/drivers/pinctrl/qcom/pinctrl-ipq5018.c
@@ -361,7 +361,7 @@ static const char * const blsp1_uart0_groups[] = {
 };
 
 static const char * const gcc_plltest_groups[] = {
-	"gpio10", "gpio12",
+	"gpio10",
 };
 
 static const char * const gcc_tlmm_groups[] = {
@@ -555,7 +555,7 @@ static const char * const qdss_cti_trig_in_b0_groups[] = {
 };
 
 static const char * const pwm2_groups[] = {
-	"gpio44",
+	"gpio12", "gpio44",
 };
 
 static const char * const qdss_cti_trig_out_b1_groups[] = {
@@ -688,7 +688,7 @@ static const struct msm_pingroup ipq5018_groups[] = {
 	PINGROUP(9, sdc1_clk, qspi_clk, _, qdss_tracedata_a, _, _, _, _, _),
 	PINGROUP(10, blsp0_spi, blsp1_uart0, led0, gcc_plltest, qdss_tracedata_a, _, _, _, _),
 	PINGROUP(11, blsp0_spi, blsp1_uart0, _, gcc_tlmm, qdss_tracedata_a, _, _, _, _),
-	PINGROUP(12, blsp0_spi, blsp0_i2c, blsp1_uart0, _, gcc_plltest, qdss_tracedata_a, _, _, _),
+	PINGROUP(12, blsp0_spi, blsp0_i2c, blsp1_uart0, _, pwm2, qdss_tracedata_a, _, _, _),
 	PINGROUP(13, blsp0_spi, blsp0_i2c, blsp1_uart0, pwm3, qdss_tracedata_a, _, _, _, _),
 	PINGROUP(14, pcie0_clk, _, _, cri_trng0, qdss_tracedata_a, _, _, _, _),
 	PINGROUP(15, _, _, cri_trng1, qdss_tracedata_a, _, _, _, _, _),

base-commit: 19fc4240358be2a25ce8e0a49a2819588ed61c5d
-- 
2.47.3


^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2026-10-13  8:48 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-10-02 16:09 [PATCH] pinctrl: qcom: ipq5018: replace gcc_plltest with pwm2 on gpio12 Adriel Santos
2026-10-05  6:48 ` Dmitry Baryshkov
2026-10-06  8:05 ` Bartosz Golaszewski
2026-10-13  8:48 ` Konrad Dybcio

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®