]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
regulator: fp9931: Fix VPOS/VNEG voltage selector table
authorRobby Cai <robby.cai@nxp.com>
Fri, 24 Jul 2026 10:34:40 +0000 (18:34 +0800)
committerMark Brown <broonie@kernel.org>
Fri, 31 Jul 2026 17:40:28 +0000 (18:40 +0100)
The VPOSNEG_table[] mapping does not match the FP9931 datasheet.

The datasheet defines the VPOS/VNEG voltage mapping as:

  00h-04h ->  7.04V (-7.04V)
  05h     ->  7.26V (-7.26V)
  06h     ->  7.49V (-7.49V)
  ...
  28h-3Fh -> 15.06V (-15.06V)

However, VPOSNEG_table[] has two issues:

1. Selector 0x00~0x04 should all map to 7.04V (5 entries), but the
   table has 6 entries of 7.04V, causing all subsequent entries to be
   shifted by one position.

2. Selectors 0x29~0x3F should all clamp to 15.06V (23 entries), but
   the table has only 41 entries. Any selector value above 0x28
   would result in an out-of-bounds table access.

Fix both issues by removing the duplicate 7.04V entry and appending
the missing 23 clamped 15.06V entries, bringing the table to the
correct size of 64 entries (0x00~0x3F).

Fixes: 12d821bd13d4 ("regulator: Add FP9931/JD9930 driver")
Signed-off-by: Robby Cai <robby.cai@nxp.com>
Link: https://patch.msgid.link/20260724103441.800522-2-robby.cai@oss.nxp.com
Signed-off-by: Mark Brown <broonie@kernel.org>
drivers/regulator/fp9931.c

index 002b41f53eff89807d0ee5d8dffdfcf842854a1f..ff743a8b0dfe80cdcdca75fd61376376442f09ea 100644 (file)
@@ -37,48 +37,18 @@ struct fp9931_data {
 };
 
 static const unsigned int VPOSNEG_table[] = {
-       7040000,
-       7040000,
-       7040000,
-       7040000,
-       7040000,
-       7040000,
-       7260000,
-       7490000,
-       7710000,
-       7930000,
-       8150000,
-       8380000,
-       8600000,
-       8820000,
-       9040000,
-       9270000,
-       9490000,
-       9710000,
-       9940000,
-       10160000,
-       10380000,
-       10600000,
-       10830000,
-       11050000,
-       11270000,
-       11490000,
-       11720000,
-       11940000,
-       12160000,
-       12380000,
-       12610000,
-       12830000,
-       13050000,
-       13280000,
-       13500000,
-       13720000,
-       13940000,
-       14170000,
-       14390000,
-       14610000,
-       14830000,
-       15060000,
+       7040000,  7040000,  7040000,  7040000,  7040000,            /* 00h-04h */
+       7260000,  7490000,  7710000,  7930000,  8150000,  8380000,  /* 05h-0Ah */
+       8600000,  8820000,  9040000,  9270000,  9490000,  9710000,  /* 0Bh-10h */
+       9940000,  10160000, 10380000, 10600000, 10830000, 11050000, /* 11h-16h */
+       11270000, 11490000, 11720000, 11940000, 12160000, 12380000, /* 17h-1Ch */
+       12610000, 12830000, 13050000, 13280000, 13500000, 13720000, /* 1Dh-22h */
+       13940000, 14170000, 14390000, 14610000, 14830000, 15060000, /* 23h-28h */
+       /* 29h-3Fh: clamped to 15.06V per datasheet */
+       15060000, 15060000, 15060000, 15060000, 15060000, 15060000,
+       15060000, 15060000, 15060000, 15060000, 15060000, 15060000,
+       15060000, 15060000, 15060000, 15060000, 15060000, 15060000,
+       15060000, 15060000, 15060000, 15060000, 15060000,
 };
 
 static const struct hwmon_channel_info *fp9931_info[] = {