* [PATCH v5 0/4] pinctrl: mediatek: Enable module build support
@ 2026-07-09 6:33 Justin Yeh
2026-07-09 6:33 ` [PATCH v5 1/4] pinctrl: mediatek: use devm_gpiochip_add_data() for GPIO chip Justin Yeh
` (4 more replies)
0 siblings, 5 replies; 9+ messages in thread
From: Justin Yeh @ 2026-07-09 6:33 UTC (permalink / raw)
To: Sean Wang, Linus Walleij, Matthias Brugger,
AngeloGioacchino Del Regno
Cc: Project_Global_Chrome_Upstream_Group, linux-mediatek, linux-gpio,
linux-kernel, linux-arm-kernel, Justin Yeh
This series lets the MediaTek pinctrl drivers be built as loadable
kernel modules. This is required for Android GKI + vendor_dlkm
deployments, where vendor-specific drivers must be kept separate from
the GKI vmlinux and loaded as modules from the vendor partition.
Enabling the individual SoC drivers as modules is a single logical step,
but it has a few prerequisites, so the series is:
1. Fix a pre-existing GPIO chip lifecycle bug. The gpio_chip lives in
device-managed memory but is registered with the non-managed
gpiochip_add_data(). While the drivers were built-in only this was
harmless, but once they can be unbound/rmmod'd, devm frees the
backing memory while the chip is still registered (use-after-free).
Switch to devm_gpiochip_add_data() in the shared probe/init paths.
This affects the v1 common code (pinctrl-mtk-common.c) as well as
the moore and paris common code, which is where the v2 SoCs
register their gpio_chip (pinctrl-mtk-common-v2.c itself does not
register one, so it is untouched).
2. Make the shared common code modular. The SoC drivers link against
pinctrl-mtk-common.c (v1), pinctrl-moore.c and pinctrl-mtmips.c,
whose Kconfig symbols were bool and which exported nothing. Without
this, selecting a SoC driver as =m forces the common symbol to =y
and the module fails to link against the unexported entry points
(e.g. allmodconfig would break). Convert PINCTRL_MTK,
PINCTRL_MTK_MOORE and PINCTRL_MTK_MTMIPS to tristate, export the
entry points, and add MODULE_LICENSE()/MODULE_DESCRIPTION(). The
already-modular v2 common code additionally needs mtk_rmw()
exported, since it is called directly by SoC drivers such as
mt7623 and would otherwise be undefined once those are modular.
3. Convert the MT7986 driver to a single initcall. It registers two
platform drivers (mt7986a/mt7986b) and used to call arch_initcall()
twice. That is fine when built-in, but a module has only one
module_init(), so two arch_initcall()s break the module build with
a redefinition of init_module()/__inittest(). Fold both drivers
into one platform_register_drivers() call from a single initcall.
No functional change when built-in.
4. Flip every SoC driver's Kconfig from bool to tristate and add the
module metadata.
The series builds cleanly under allmodconfig on arm64 (all SoC drivers
as =m).
Changes since v4:
- Squashed the 32 per-driver "Enable module build support" patches into
a single patch (4/4), as requested by Linus Walleij.
- Added patch 1/4 fixing the gpio_chip lifecycle (devm) bug, as a
prerequisite for making the drivers unloadable, per Linus Walleij's
review.
- Added patch 2/4 converting the shared common drivers to modules, so
that the v1/moore/mtmips SoC drivers can actually link as modules
(without it 21 of the SoC drivers would fail to build as =m). Also
export mtk_rmw() from the v2 common code (fixes a modpost
"mtk_rmw undefined" error on the mt7623 module).
- Added patch 3/4 folding MT7986's two arch_initcall()s into a single
initcall (fixes an init_module()/__inittest() redefinition when the
driver is built as a module).
- Dropped the (inappropriate) per-driver Fixes: tags from the module
enablement patch; it is a feature change, not a fix.
The Reviewed-by on patch 4/4 is carried over from the per-driver patches
reviewed in v4; the reviewer agreed to preserve it across the squash.
Note that the MT7986 single-initcall change that was part of that patch
has been split out into patch 3/4, so patch 4/4 now only flips Kconfig
and adds module metadata. Patches 1/4, 2/4 and 3/4 have not been
reviewed yet.
Justin Yeh (4):
pinctrl: mediatek: use devm_gpiochip_add_data() for GPIO chip
pinctrl: mediatek: allow common drivers to be built as modules
pinctrl: mediatek: mt7986: register both platform drivers from a
single initcall
pinctrl: mediatek: enable module build support for all SoC drivers
drivers/pinctrl/mediatek/Kconfig | 70 +++++++++----------
drivers/pinctrl/mediatek/pinctrl-moore.c | 11 +--
drivers/pinctrl/mediatek/pinctrl-mt2701.c | 3 +
drivers/pinctrl/mediatek/pinctrl-mt2712.c | 3 +
drivers/pinctrl/mediatek/pinctrl-mt6397.c | 3 +
drivers/pinctrl/mediatek/pinctrl-mt6795.c | 3 +
drivers/pinctrl/mediatek/pinctrl-mt6797.c | 3 +
drivers/pinctrl/mediatek/pinctrl-mt6878.c | 1 +
drivers/pinctrl/mediatek/pinctrl-mt6893.c | 1 +
drivers/pinctrl/mediatek/pinctrl-mt7620.c | 3 +
drivers/pinctrl/mediatek/pinctrl-mt7621.c | 3 +
drivers/pinctrl/mediatek/pinctrl-mt7622.c | 3 +
drivers/pinctrl/mediatek/pinctrl-mt7623.c | 3 +
drivers/pinctrl/mediatek/pinctrl-mt7629.c | 3 +
drivers/pinctrl/mediatek/pinctrl-mt76x8.c | 3 +
drivers/pinctrl/mediatek/pinctrl-mt7981.c | 3 +
drivers/pinctrl/mediatek/pinctrl-mt7986.c | 18 ++---
drivers/pinctrl/mediatek/pinctrl-mt7988.c | 3 +
drivers/pinctrl/mediatek/pinctrl-mt8127.c | 3 +
drivers/pinctrl/mediatek/pinctrl-mt8135.c | 3 +
drivers/pinctrl/mediatek/pinctrl-mt8167.c | 3 +
drivers/pinctrl/mediatek/pinctrl-mt8173.c | 3 +
drivers/pinctrl/mediatek/pinctrl-mt8183.c | 3 +
drivers/pinctrl/mediatek/pinctrl-mt8186.c | 3 +
drivers/pinctrl/mediatek/pinctrl-mt8188.c | 1 +
drivers/pinctrl/mediatek/pinctrl-mt8189.c | 1 +
drivers/pinctrl/mediatek/pinctrl-mt8192.c | 1 +
drivers/pinctrl/mediatek/pinctrl-mt8195.c | 3 +
drivers/pinctrl/mediatek/pinctrl-mt8196.c | 1 +
drivers/pinctrl/mediatek/pinctrl-mt8365.c | 1 +
drivers/pinctrl/mediatek/pinctrl-mt8516.c | 3 +
.../pinctrl/mediatek/pinctrl-mtk-common-v2.c | 1 +
drivers/pinctrl/mediatek/pinctrl-mtk-common.c | 22 +++---
drivers/pinctrl/mediatek/pinctrl-mtmips.c | 4 ++
drivers/pinctrl/mediatek/pinctrl-paris.c | 2 +-
drivers/pinctrl/mediatek/pinctrl-rt2880.c | 3 +
drivers/pinctrl/mediatek/pinctrl-rt305x.c | 3 +
drivers/pinctrl/mediatek/pinctrl-rt3883.c | 3 +
38 files changed, 149 insertions(+), 58 deletions(-)
base-commit: 8e9685d3c41c35dd1b37df70d854137abcb2fbac
--
2.45.2
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH v5 1/4] pinctrl: mediatek: use devm_gpiochip_add_data() for GPIO chip
2026-07-09 6:33 [PATCH v5 0/4] pinctrl: mediatek: Enable module build support Justin Yeh
@ 2026-07-09 6:33 ` Justin Yeh
2026-07-09 8:26 ` Chen-Yu Tsai
2026-07-09 6:33 ` [PATCH v5 2/4] pinctrl: mediatek: allow common drivers to be built as modules Justin Yeh
` (3 subsequent siblings)
4 siblings, 1 reply; 9+ messages in thread
From: Justin Yeh @ 2026-07-09 6:33 UTC (permalink / raw)
To: Sean Wang, Linus Walleij, Matthias Brugger,
AngeloGioacchino Del Regno
Cc: Project_Global_Chrome_Upstream_Group, linux-mediatek, linux-gpio,
linux-kernel, linux-arm-kernel, Justin Yeh
The gpio_chip is allocated with device-managed memory but registered with
the non-managed gpiochip_add_data(). This was harmless while the drivers
were built-in, but once they can be built as modules and unbound/rmmod'd,
devm frees the gpio_chip's memory while it is still registered, causing a
use-after-free.
Register it with devm_gpiochip_add_data() so it shares the same
device-managed lifecycle, which also lets the manual gpiochip_remove()
error paths go away.
Fixes: a6df410d420a ("pinctrl: mediatek: Add Pinctrl/GPIO driver for mt8135.")
Fixes: 805250982bb5 ("pinctrl: mediatek: add pinctrl-paris that implements the vendor dt-bindings")
Fixes: e78d57b2f87c ("pinctrl: mediatek: add pinctrl-moore that implements the generic pinctrl dt-bindings")
Signed-off-by: Justin Yeh <justin.yeh@mediatek.com>
---
drivers/pinctrl/mediatek/pinctrl-moore.c | 6 ++----
drivers/pinctrl/mediatek/pinctrl-mtk-common.c | 14 ++++----------
drivers/pinctrl/mediatek/pinctrl-paris.c | 2 +-
3 files changed, 7 insertions(+), 15 deletions(-)
diff --git a/drivers/pinctrl/mediatek/pinctrl-moore.c b/drivers/pinctrl/mediatek/pinctrl-moore.c
index 17e30f83dc19..38f15dbe9a28 100644
--- a/drivers/pinctrl/mediatek/pinctrl-moore.c
+++ b/drivers/pinctrl/mediatek/pinctrl-moore.c
@@ -594,7 +594,7 @@ static int mtk_build_gpiochip(struct mtk_pinctrl *hw)
chip->base = -1;
chip->ngpio = hw->soc->npins;
- ret = gpiochip_add_data(chip, hw);
+ ret = devm_gpiochip_add_data(hw->dev, chip, hw);
if (ret < 0)
return ret;
@@ -608,10 +608,8 @@ static int mtk_build_gpiochip(struct mtk_pinctrl *hw)
if (!of_property_present(hw->dev->of_node, "gpio-ranges")) {
ret = gpiochip_add_pin_range(chip, dev_name(hw->dev), 0, 0,
chip->ngpio);
- if (ret < 0) {
- gpiochip_remove(chip);
+ if (ret < 0)
return ret;
- }
}
return 0;
diff --git a/drivers/pinctrl/mediatek/pinctrl-mtk-common.c b/drivers/pinctrl/mediatek/pinctrl-mtk-common.c
index dd2c8aa03938..791eddd7a2c6 100644
--- a/drivers/pinctrl/mediatek/pinctrl-mtk-common.c
+++ b/drivers/pinctrl/mediatek/pinctrl-mtk-common.c
@@ -1130,30 +1130,24 @@ int mtk_pctrl_init(struct platform_device *pdev,
pctl->chip->parent = &pdev->dev;
pctl->chip->base = -1;
- ret = gpiochip_add_data(pctl->chip, pctl);
+ ret = devm_gpiochip_add_data(&pdev->dev, pctl->chip, pctl);
if (ret)
return -EINVAL;
/* Register the GPIO to pin mappings. */
ret = gpiochip_add_pin_range(pctl->chip, dev_name(&pdev->dev),
0, 0, pctl->devdata->npins);
- if (ret) {
- ret = -EINVAL;
- goto chip_error;
- }
+ if (ret)
+ return -EINVAL;
/* Only initialize EINT if we have EINT pins */
if (data->eint_hw.ap_num > 0) {
ret = mtk_eint_init(pctl, pdev);
if (ret)
- goto chip_error;
+ return ret;
}
return 0;
-
-chip_error:
- gpiochip_remove(pctl->chip);
- return ret;
}
int mtk_pctrl_common_probe(struct platform_device *pdev)
diff --git a/drivers/pinctrl/mediatek/pinctrl-paris.c b/drivers/pinctrl/mediatek/pinctrl-paris.c
index 23f04b24fd65..09098b68f725 100644
--- a/drivers/pinctrl/mediatek/pinctrl-paris.c
+++ b/drivers/pinctrl/mediatek/pinctrl-paris.c
@@ -957,7 +957,7 @@ static int mtk_build_gpiochip(struct mtk_pinctrl *hw)
chip->base = -1;
chip->ngpio = hw->soc->npins;
- ret = gpiochip_add_data(chip, hw);
+ ret = devm_gpiochip_add_data(hw->dev, chip, hw);
if (ret < 0)
return ret;
--
2.45.2
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH v5 2/4] pinctrl: mediatek: allow common drivers to be built as modules
2026-07-09 6:33 [PATCH v5 0/4] pinctrl: mediatek: Enable module build support Justin Yeh
2026-07-09 6:33 ` [PATCH v5 1/4] pinctrl: mediatek: use devm_gpiochip_add_data() for GPIO chip Justin Yeh
@ 2026-07-09 6:33 ` Justin Yeh
2026-07-09 8:23 ` Chen-Yu Tsai
2026-07-09 6:33 ` [PATCH v5 3/4] pinctrl: mediatek: mt7986: register both platform drivers from a single initcall Justin Yeh
` (2 subsequent siblings)
4 siblings, 1 reply; 9+ messages in thread
From: Justin Yeh @ 2026-07-09 6:33 UTC (permalink / raw)
To: Sean Wang, Linus Walleij, Matthias Brugger,
AngeloGioacchino Del Regno
Cc: Project_Global_Chrome_Upstream_Group, linux-mediatek, linux-gpio,
linux-kernel, linux-arm-kernel, Justin Yeh
The MediaTek SoC pinctrl drivers link against the shared implementations
in pinctrl-mtk-common.c (v1), pinctrl-moore.c and pinctrl-mtmips.c. These
were built-in only: their Kconfig symbols were bool, they did not export
their entry points and they carried no MODULE_LICENSE().
To let the individual SoC drivers be built as loadable modules (required
for Android GKI + vendor_dlkm, where vendor drivers must live outside the
GKI vmlinux), the shared code they depend on has to be modular too.
Otherwise selecting a SoC driver as =m forces the common symbol to =y and
the resulting module fails to link against the unexported common entry
points.
Convert PINCTRL_MTK, PINCTRL_MTK_MOORE and PINCTRL_MTK_MTMIPS to
tristate, export the entry points used by the SoC drivers, and add
MODULE_DESCRIPTION()/MODULE_LICENSE() to the three common files.
The v2 common code (PINCTRL_MTK_V2) is already modular, but mtk_rmw() was
never exported. It is called directly by SoC drivers such as mt7623, so
export it as well to keep those drivers linking once they are modular.
Signed-off-by: Justin Yeh <justin.yeh@mediatek.com>
---
drivers/pinctrl/mediatek/Kconfig | 6 +++---
drivers/pinctrl/mediatek/pinctrl-moore.c | 5 +++++
drivers/pinctrl/mediatek/pinctrl-mtk-common-v2.c | 1 +
drivers/pinctrl/mediatek/pinctrl-mtk-common.c | 8 ++++++++
drivers/pinctrl/mediatek/pinctrl-mtmips.c | 4 ++++
5 files changed, 21 insertions(+), 3 deletions(-)
diff --git a/drivers/pinctrl/mediatek/Kconfig b/drivers/pinctrl/mediatek/Kconfig
index 97980cc28b9c..864e7ffc6044 100644
--- a/drivers/pinctrl/mediatek/Kconfig
+++ b/drivers/pinctrl/mediatek/Kconfig
@@ -11,7 +11,7 @@ config EINT_MTK
default PINCTRL_MTK_PARIS
config PINCTRL_MTK
- bool
+ tristate
depends on OF
select PINMUX
select GENERIC_PINCONF
@@ -22,13 +22,13 @@ config PINCTRL_MTK_V2
tristate
config PINCTRL_MTK_MTMIPS
- bool
+ tristate
depends on RALINK
select PINMUX
select GENERIC_PINCONF
config PINCTRL_MTK_MOORE
- bool
+ tristate
depends on OF
select GENERIC_PINCONF
select GENERIC_PINCTRL_GROUPS
diff --git a/drivers/pinctrl/mediatek/pinctrl-moore.c b/drivers/pinctrl/mediatek/pinctrl-moore.c
index 38f15dbe9a28..3247622911cd 100644
--- a/drivers/pinctrl/mediatek/pinctrl-moore.c
+++ b/drivers/pinctrl/mediatek/pinctrl-moore.c
@@ -10,6 +10,7 @@
#include <dt-bindings/pinctrl/mt65xx.h>
#include <linux/gpio/driver.h>
+#include <linux/module.h>
#include <linux/pinctrl/consumer.h>
@@ -743,3 +744,7 @@ int mtk_moore_pinctrl_probe(struct platform_device *pdev,
return 0;
}
+EXPORT_SYMBOL_GPL(mtk_moore_pinctrl_probe);
+
+MODULE_DESCRIPTION("MediaTek Pinctrl Common Driver V2 Moore");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/pinctrl/mediatek/pinctrl-mtk-common-v2.c b/drivers/pinctrl/mediatek/pinctrl-mtk-common-v2.c
index 4918d38abfc2..3813dfb0fa7d 100644
--- a/drivers/pinctrl/mediatek/pinctrl-mtk-common-v2.c
+++ b/drivers/pinctrl/mediatek/pinctrl-mtk-common-v2.c
@@ -69,6 +69,7 @@ void mtk_rmw(struct mtk_pinctrl *pctl, u8 i, u32 reg, u32 mask, u32 set)
spin_unlock_irqrestore(&pctl->lock, flags);
}
+EXPORT_SYMBOL_GPL(mtk_rmw);
static int mtk_hw_pin_field_lookup(struct mtk_pinctrl *hw,
const struct mtk_pin_desc *desc,
diff --git a/drivers/pinctrl/mediatek/pinctrl-mtk-common.c b/drivers/pinctrl/mediatek/pinctrl-mtk-common.c
index 791eddd7a2c6..a58015b508af 100644
--- a/drivers/pinctrl/mediatek/pinctrl-mtk-common.c
+++ b/drivers/pinctrl/mediatek/pinctrl-mtk-common.c
@@ -7,6 +7,7 @@
#include <linux/io.h>
#include <linux/gpio/driver.h>
+#include <linux/module.h>
#include <linux/of.h>
#include <linux/of_irq.h>
#include <linux/pinctrl/consumer.h>
@@ -190,6 +191,7 @@ int mtk_pconf_spec_set_ies_smt_range(struct regmap *regmap,
regmap_write(regmap, reg_addr, bit);
return 0;
}
+EXPORT_SYMBOL_GPL(mtk_pconf_spec_set_ies_smt_range);
static const struct mtk_pin_drv_grp *mtk_find_pin_drv_grp_by_pin(
struct mtk_pinctrl *pctl, unsigned long pin) {
@@ -297,6 +299,7 @@ int mtk_pctrl_spec_pull_set_samereg(struct regmap *regmap,
return 0;
}
+EXPORT_SYMBOL_GPL(mtk_pctrl_spec_pull_set_samereg);
static int mtk_pconf_set_pull_select(struct mtk_pinctrl *pctl,
unsigned int pin, bool enable, bool isup, unsigned int arg)
@@ -1149,6 +1152,7 @@ int mtk_pctrl_init(struct platform_device *pdev,
return 0;
}
+EXPORT_SYMBOL_GPL(mtk_pctrl_init);
int mtk_pctrl_common_probe(struct platform_device *pdev)
{
@@ -1160,3 +1164,7 @@ int mtk_pctrl_common_probe(struct platform_device *pdev)
return mtk_pctrl_init(pdev, data, NULL);
}
+EXPORT_SYMBOL_GPL(mtk_pctrl_common_probe);
+
+MODULE_DESCRIPTION("MediaTek Pinctrl Common Driver");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/pinctrl/mediatek/pinctrl-mtmips.c b/drivers/pinctrl/mediatek/pinctrl-mtmips.c
index efd77b6c56a1..c9d9de68e282 100644
--- a/drivers/pinctrl/mediatek/pinctrl-mtmips.c
+++ b/drivers/pinctrl/mediatek/pinctrl-mtmips.c
@@ -349,3 +349,7 @@ int mtmips_pinctrl_init(struct platform_device *pdev,
return PTR_ERR_OR_ZERO(dev);
}
+EXPORT_SYMBOL_GPL(mtmips_pinctrl_init);
+
+MODULE_DESCRIPTION("MediaTek MIPS Pinctrl Common Driver");
+MODULE_LICENSE("GPL v2");
--
2.45.2
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH v5 3/4] pinctrl: mediatek: mt7986: register both platform drivers from a single initcall
2026-07-09 6:33 [PATCH v5 0/4] pinctrl: mediatek: Enable module build support Justin Yeh
2026-07-09 6:33 ` [PATCH v5 1/4] pinctrl: mediatek: use devm_gpiochip_add_data() for GPIO chip Justin Yeh
2026-07-09 6:33 ` [PATCH v5 2/4] pinctrl: mediatek: allow common drivers to be built as modules Justin Yeh
@ 2026-07-09 6:33 ` Justin Yeh
2026-07-09 7:02 ` Chen-Yu Tsai
2026-07-09 6:33 ` [PATCH v5 4/4] pinctrl: mediatek: enable module build support for all SoC drivers Justin Yeh
2026-07-10 20:29 ` [PATCH v5 0/4] pinctrl: mediatek: Enable module build support Linus Walleij
4 siblings, 1 reply; 9+ messages in thread
From: Justin Yeh @ 2026-07-09 6:33 UTC (permalink / raw)
To: Sean Wang, Linus Walleij, Matthias Brugger,
AngeloGioacchino Del Regno
Cc: Project_Global_Chrome_Upstream_Group, linux-mediatek, linux-gpio,
linux-kernel, linux-arm-kernel, Justin Yeh
The MT7986 driver registers two separate platform drivers (mt7986a and
mt7986b) and used to call arch_initcall() twice, once for each.
This is fine while the driver is built-in, but a single translation unit
can only provide one module_init(). Since arch_initcall() expands to
module_init() when built as a module, having two of them would break the
module build with a redefinition of init_module()/__inittest().
Fold both platform drivers into a single driver array and register them
from one initcall using platform_register_drivers(), matching the shape of
the other MediaTek pinctrl SoC drivers. platform_register_drivers() also
rolls back the first registration if the second one fails.
No functional change for built-in builds; this is a preparatory cleanup
for enabling module builds.
Signed-off-by: Justin Yeh <justin.yeh@mediatek.com>
---
drivers/pinctrl/mediatek/pinctrl-mt7986.c | 17 ++++++++---------
1 file changed, 8 insertions(+), 9 deletions(-)
diff --git a/drivers/pinctrl/mediatek/pinctrl-mt7986.c b/drivers/pinctrl/mediatek/pinctrl-mt7986.c
index 5dda4b7467fd..8dae91530d9b 100644
--- a/drivers/pinctrl/mediatek/pinctrl-mt7986.c
+++ b/drivers/pinctrl/mediatek/pinctrl-mt7986.c
@@ -997,15 +997,14 @@ static struct platform_driver mt7986b_pinctrl_driver = {
.probe = mt7986b_pinctrl_probe,
};
-static int __init mt7986a_pinctrl_init(void)
-{
- return platform_driver_register(&mt7986a_pinctrl_driver);
-}
+static struct platform_driver * const mt7986_pinctrl_drivers[] = {
+ &mt7986a_pinctrl_driver,
+ &mt7986b_pinctrl_driver,
+};
-static int __init mt7986b_pinctrl_init(void)
+static int __init mt7986_pinctrl_init(void)
{
- return platform_driver_register(&mt7986b_pinctrl_driver);
+ return platform_register_drivers(mt7986_pinctrl_drivers,
+ ARRAY_SIZE(mt7986_pinctrl_drivers));
}
-
-arch_initcall(mt7986a_pinctrl_init);
-arch_initcall(mt7986b_pinctrl_init);
+arch_initcall(mt7986_pinctrl_init);
--
2.45.2
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH v5 4/4] pinctrl: mediatek: enable module build support for all SoC drivers
2026-07-09 6:33 [PATCH v5 0/4] pinctrl: mediatek: Enable module build support Justin Yeh
` (2 preceding siblings ...)
2026-07-09 6:33 ` [PATCH v5 3/4] pinctrl: mediatek: mt7986: register both platform drivers from a single initcall Justin Yeh
@ 2026-07-09 6:33 ` Justin Yeh
2026-07-10 20:29 ` [PATCH v5 0/4] pinctrl: mediatek: Enable module build support Linus Walleij
4 siblings, 0 replies; 9+ messages in thread
From: Justin Yeh @ 2026-07-09 6:33 UTC (permalink / raw)
To: Sean Wang, Linus Walleij, Matthias Brugger,
AngeloGioacchino Del Regno
Cc: Project_Global_Chrome_Upstream_Group, linux-mediatek, linux-gpio,
linux-kernel, linux-arm-kernel, Justin Yeh
Convert the Kconfig option of every MediaTek pinctrl SoC driver from bool
to tristate and add MODULE_DESCRIPTION()/MODULE_LICENSE() so that they can
be built as loadable kernel modules.
This is required for Android GKI + vendor_dlkm deployments, where
vendor-specific drivers must be kept separate from the GKI vmlinux and
loaded as modules from the vendor partition.
Signed-off-by: Justin Yeh <justin.yeh@mediatek.com>
Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
---
drivers/pinctrl/mediatek/Kconfig | 64 +++++++++++------------
drivers/pinctrl/mediatek/pinctrl-mt2701.c | 3 ++
drivers/pinctrl/mediatek/pinctrl-mt2712.c | 3 ++
drivers/pinctrl/mediatek/pinctrl-mt6397.c | 3 ++
drivers/pinctrl/mediatek/pinctrl-mt6795.c | 3 ++
drivers/pinctrl/mediatek/pinctrl-mt6797.c | 3 ++
drivers/pinctrl/mediatek/pinctrl-mt6878.c | 1 +
drivers/pinctrl/mediatek/pinctrl-mt6893.c | 1 +
drivers/pinctrl/mediatek/pinctrl-mt7620.c | 3 ++
drivers/pinctrl/mediatek/pinctrl-mt7621.c | 3 ++
drivers/pinctrl/mediatek/pinctrl-mt7622.c | 3 ++
drivers/pinctrl/mediatek/pinctrl-mt7623.c | 3 ++
drivers/pinctrl/mediatek/pinctrl-mt7629.c | 3 ++
drivers/pinctrl/mediatek/pinctrl-mt76x8.c | 3 ++
drivers/pinctrl/mediatek/pinctrl-mt7981.c | 3 ++
drivers/pinctrl/mediatek/pinctrl-mt7986.c | 3 ++
drivers/pinctrl/mediatek/pinctrl-mt7988.c | 3 ++
drivers/pinctrl/mediatek/pinctrl-mt8127.c | 3 ++
drivers/pinctrl/mediatek/pinctrl-mt8135.c | 3 ++
drivers/pinctrl/mediatek/pinctrl-mt8167.c | 3 ++
drivers/pinctrl/mediatek/pinctrl-mt8173.c | 3 ++
drivers/pinctrl/mediatek/pinctrl-mt8183.c | 3 ++
drivers/pinctrl/mediatek/pinctrl-mt8186.c | 3 ++
drivers/pinctrl/mediatek/pinctrl-mt8188.c | 1 +
drivers/pinctrl/mediatek/pinctrl-mt8189.c | 1 +
drivers/pinctrl/mediatek/pinctrl-mt8192.c | 1 +
drivers/pinctrl/mediatek/pinctrl-mt8195.c | 3 ++
drivers/pinctrl/mediatek/pinctrl-mt8196.c | 1 +
drivers/pinctrl/mediatek/pinctrl-mt8365.c | 1 +
drivers/pinctrl/mediatek/pinctrl-mt8516.c | 3 ++
drivers/pinctrl/mediatek/pinctrl-rt2880.c | 3 ++
drivers/pinctrl/mediatek/pinctrl-rt305x.c | 3 ++
drivers/pinctrl/mediatek/pinctrl-rt3883.c | 3 ++
33 files changed, 114 insertions(+), 32 deletions(-)
diff --git a/drivers/pinctrl/mediatek/Kconfig b/drivers/pinctrl/mediatek/Kconfig
index 864e7ffc6044..611ca57ecefa 100644
--- a/drivers/pinctrl/mediatek/Kconfig
+++ b/drivers/pinctrl/mediatek/Kconfig
@@ -48,42 +48,42 @@ config PINCTRL_MTK_PARIS
# For MIPS SoCs
config PINCTRL_MT7620
- bool "MediaTek MT7620 pin control"
+ tristate "MediaTek MT7620 pin control"
depends on SOC_MT7620 || COMPILE_TEST
depends on RALINK
default SOC_MT7620
select PINCTRL_MTK_MTMIPS
config PINCTRL_MT7621
- bool "MediaTek MT7621 pin control"
+ tristate "MediaTek MT7621 pin control"
depends on SOC_MT7621 || COMPILE_TEST
depends on RALINK
default SOC_MT7621
select PINCTRL_MTK_MTMIPS
config PINCTRL_MT76X8
- bool "MediaTek MT76X8 pin control"
+ tristate "MediaTek MT76X8 pin control"
depends on SOC_MT7620 || COMPILE_TEST
depends on RALINK
default SOC_MT7620
select PINCTRL_MTK_MTMIPS
config PINCTRL_RT2880
- bool "Ralink RT2880 pin control"
+ tristate "Ralink RT2880 pin control"
depends on SOC_RT288X || COMPILE_TEST
depends on RALINK
default SOC_RT288X
select PINCTRL_MTK_MTMIPS
config PINCTRL_RT305X
- bool "Ralink RT305X pin control"
+ tristate "Ralink RT305X pin control"
depends on SOC_RT305X || COMPILE_TEST
depends on RALINK
default SOC_RT305X
select PINCTRL_MTK_MTMIPS
config PINCTRL_RT3883
- bool "Ralink RT3883 pin control"
+ tristate "Ralink RT3883 pin control"
depends on SOC_RT3883 || COMPILE_TEST
depends on RALINK
default SOC_RT3883
@@ -91,35 +91,35 @@ config PINCTRL_RT3883
# For ARMv7 SoCs
config PINCTRL_MT2701
- bool "MediaTek MT2701 pin control"
+ tristate "MediaTek MT2701 pin control"
depends on MACH_MT7623 || MACH_MT2701 || COMPILE_TEST
depends on OF
default MACH_MT2701
select PINCTRL_MTK
config PINCTRL_MT7623
- bool "MediaTek MT7623 pin control with generic binding"
+ tristate "MediaTek MT7623 pin control with generic binding"
depends on MACH_MT7623 || COMPILE_TEST
depends on OF
default MACH_MT7623
select PINCTRL_MTK_MOORE
config PINCTRL_MT7629
- bool "MediaTek MT7629 pin control"
+ tristate "MediaTek MT7629 pin control"
depends on MACH_MT7629 || COMPILE_TEST
depends on OF
default MACH_MT7629
select PINCTRL_MTK_MOORE
config PINCTRL_MT8135
- bool "MediaTek MT8135 pin control"
+ tristate "MediaTek MT8135 pin control"
depends on MACH_MT8135 || COMPILE_TEST
depends on OF
default MACH_MT8135
select PINCTRL_MTK
config PINCTRL_MT8127
- bool "MediaTek MT8127 pin control"
+ tristate "MediaTek MT8127 pin control"
depends on MACH_MT8127 || COMPILE_TEST
depends on OF
default MACH_MT8127
@@ -127,7 +127,7 @@ config PINCTRL_MT8127
# For ARMv8 SoCs
config PINCTRL_MT2712
- bool "MediaTek MT2712 pin control"
+ tristate "MediaTek MT2712 pin control"
depends on OF
depends on ARM64 || COMPILE_TEST
default ARM64 && ARCH_MEDIATEK
@@ -153,21 +153,21 @@ config PINCTRL_MT6779
map specific eint which doesn't have real gpio pin.
config PINCTRL_MT6795
- bool "MediaTek MT6795 pin control"
+ tristate "MediaTek MT6795 pin control"
depends on OF
depends on ARM64 || COMPILE_TEST
default ARM64 && ARCH_MEDIATEK
select PINCTRL_MTK_PARIS
config PINCTRL_MT6797
- bool "MediaTek MT6797 pin control"
+ tristate "MediaTek MT6797 pin control"
depends on OF
depends on ARM64 || COMPILE_TEST
default ARM64 && ARCH_MEDIATEK
select PINCTRL_MTK_PARIS
config PINCTRL_MT6878
- bool "MediaTek MT6878 pin control"
+ tristate "MediaTek MT6878 pin control"
depends on OF
depends on ARM64 || COMPILE_TEST
default ARM64 && ARCH_MEDIATEK
@@ -177,7 +177,7 @@ config PINCTRL_MT6878
on the MediaTek MT6878 SoC.
config PINCTRL_MT6893
- bool "MediaTek Dimensity MT6893 pin control"
+ tristate "MediaTek Dimensity MT6893 pin control"
depends on OF
depends on ARM64 || COMPILE_TEST
default ARM64 && ARCH_MEDIATEK
@@ -187,63 +187,63 @@ config PINCTRL_MT6893
on the MediaTek Dimensity 1200 MT6893 Smartphone SoC.
config PINCTRL_MT7622
- bool "MediaTek MT7622 pin control"
+ tristate "MediaTek MT7622 pin control"
depends on OF
depends on ARM64 || COMPILE_TEST
default ARM64 && ARCH_MEDIATEK
select PINCTRL_MTK_MOORE
config PINCTRL_MT7981
- bool "MediaTek MT7981 pin control"
+ tristate "MediaTek MT7981 pin control"
depends on OF
depends on ARM64 || COMPILE_TEST
default ARM64 && ARCH_MEDIATEK
select PINCTRL_MTK_MOORE
config PINCTRL_MT7986
- bool "MediaTek MT7986 pin control"
+ tristate "MediaTek MT7986 pin control"
depends on OF
depends on ARM64 || COMPILE_TEST
default ARM64 && ARCH_MEDIATEK
select PINCTRL_MTK_MOORE
config PINCTRL_MT7988
- bool "Mediatek MT7988 pin control"
+ tristate "Mediatek MT7988 pin control"
depends on OF
depends on ARM64 || COMPILE_TEST
default ARM64 && ARCH_MEDIATEK
select PINCTRL_MTK_MOORE
config PINCTRL_MT8167
- bool "MediaTek MT8167 pin control"
+ tristate "MediaTek MT8167 pin control"
depends on OF
depends on ARM64 || COMPILE_TEST
default ARM64 && ARCH_MEDIATEK
select PINCTRL_MTK
config PINCTRL_MT8173
- bool "MediaTek MT8173 pin control"
+ tristate "MediaTek MT8173 pin control"
depends on OF
depends on ARM64 || COMPILE_TEST
default ARM64 && ARCH_MEDIATEK
select PINCTRL_MTK
config PINCTRL_MT8183
- bool "MediaTek MT8183 pin control"
+ tristate "MediaTek MT8183 pin control"
depends on OF
depends on ARM64 || COMPILE_TEST
default ARM64 && ARCH_MEDIATEK
select PINCTRL_MTK_PARIS
config PINCTRL_MT8186
- bool "MediaTek MT8186 pin control"
+ tristate "MediaTek MT8186 pin control"
depends on OF
depends on ARM64 || COMPILE_TEST
default ARM64 && ARCH_MEDIATEK
select PINCTRL_MTK_PARIS
config PINCTRL_MT8188
- bool "MediaTek MT8188 pin control"
+ tristate "MediaTek MT8188 pin control"
depends on OF
depends on ARM64 || COMPILE_TEST
default ARM64 && ARCH_MEDIATEK
@@ -255,7 +255,7 @@ config PINCTRL_MT8188
map specific eint which doesn't have real gpio pin.
config PINCTRL_MT8189
- bool "MediaTek MT8189 pin control"
+ tristate "MediaTek MT8189 pin control"
depends on OF
depends on ARM64 || COMPILE_TEST
default ARM64 && ARCH_MEDIATEK
@@ -267,21 +267,21 @@ config PINCTRL_MT8189
map specific eint which doesn't have real gpio pin.
config PINCTRL_MT8192
- bool "MediaTek MT8192 pin control"
+ tristate "MediaTek MT8192 pin control"
depends on OF
depends on ARM64 || COMPILE_TEST
default ARM64 && ARCH_MEDIATEK
select PINCTRL_MTK_PARIS
config PINCTRL_MT8195
- bool "MediaTek MT8195 pin control"
+ tristate "MediaTek MT8195 pin control"
depends on OF
depends on ARM64 || COMPILE_TEST
default ARM64 && ARCH_MEDIATEK
select PINCTRL_MTK_PARIS
config PINCTRL_MT8196
- bool "MediaTek MT8196 pin control"
+ tristate "MediaTek MT8196 pin control"
depends on OF
depends on ARM64 || COMPILE_TEST
default ARM64 && ARCH_MEDIATEK
@@ -293,14 +293,14 @@ config PINCTRL_MT8196
map specific eint which doesn't have real gpio pin.
config PINCTRL_MT8365
- bool "MediaTek MT8365 pin control"
+ tristate "MediaTek MT8365 pin control"
depends on OF
depends on ARM64 || COMPILE_TEST
default ARM64 && ARCH_MEDIATEK
select PINCTRL_MTK
config PINCTRL_MT8516
- bool "MediaTek MT8516 pin control"
+ tristate "MediaTek MT8516 pin control"
depends on OF
depends on ARM64 || COMPILE_TEST
default ARM64 && ARCH_MEDIATEK
@@ -308,7 +308,7 @@ config PINCTRL_MT8516
# For PMIC
config PINCTRL_MT6397
- bool "MediaTek MT6397 pin control"
+ tristate "MediaTek MT6397 pin control"
depends on MFD_MT6397 || COMPILE_TEST
depends on OF
default MFD_MT6397
diff --git a/drivers/pinctrl/mediatek/pinctrl-mt2701.c b/drivers/pinctrl/mediatek/pinctrl-mt2701.c
index 6b1c7122b0fb..a7d9b0b94713 100644
--- a/drivers/pinctrl/mediatek/pinctrl-mt2701.c
+++ b/drivers/pinctrl/mediatek/pinctrl-mt2701.c
@@ -542,3 +542,6 @@ static int __init mtk_pinctrl_init(void)
return platform_driver_register(&mtk_pinctrl_driver);
}
arch_initcall(mtk_pinctrl_init);
+
+MODULE_DESCRIPTION("MediaTek MT2701 Pinctrl Driver");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/pinctrl/mediatek/pinctrl-mt2712.c b/drivers/pinctrl/mediatek/pinctrl-mt2712.c
index bb7394ae252b..4b737c5ad147 100644
--- a/drivers/pinctrl/mediatek/pinctrl-mt2712.c
+++ b/drivers/pinctrl/mediatek/pinctrl-mt2712.c
@@ -591,3 +591,6 @@ static int __init mtk_pinctrl_init(void)
}
arch_initcall(mtk_pinctrl_init);
+
+MODULE_DESCRIPTION("MediaTek MT2712 Pinctrl Driver");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/pinctrl/mediatek/pinctrl-mt6397.c b/drivers/pinctrl/mediatek/pinctrl-mt6397.c
index 03d0f65d7bcc..9ff479e7459a 100644
--- a/drivers/pinctrl/mediatek/pinctrl-mt6397.c
+++ b/drivers/pinctrl/mediatek/pinctrl-mt6397.c
@@ -59,3 +59,6 @@ static struct platform_driver mtk_pinctrl_driver = {
};
builtin_platform_driver(mtk_pinctrl_driver);
+
+MODULE_DESCRIPTION("MediaTek MT6397 Pinctrl Driver");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/pinctrl/mediatek/pinctrl-mt6795.c b/drivers/pinctrl/mediatek/pinctrl-mt6795.c
index ee3ae3d2fa7e..78cd11c0381b 100644
--- a/drivers/pinctrl/mediatek/pinctrl-mt6795.c
+++ b/drivers/pinctrl/mediatek/pinctrl-mt6795.c
@@ -622,3 +622,6 @@ static int __init mtk_pinctrl_init(void)
return platform_driver_register(&mt6795_pinctrl_driver);
}
arch_initcall(mtk_pinctrl_init);
+
+MODULE_DESCRIPTION("MediaTek MT6795 Pinctrl Driver");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/pinctrl/mediatek/pinctrl-mt6797.c b/drivers/pinctrl/mediatek/pinctrl-mt6797.c
index 53f240491259..6f9b831f5334 100644
--- a/drivers/pinctrl/mediatek/pinctrl-mt6797.c
+++ b/drivers/pinctrl/mediatek/pinctrl-mt6797.c
@@ -75,3 +75,6 @@ static int __init mt6797_pinctrl_init(void)
return platform_driver_register(&mt6797_pinctrl_driver);
}
arch_initcall(mt6797_pinctrl_init);
+
+MODULE_DESCRIPTION("MediaTek MT6797 Pinctrl Driver");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/pinctrl/mediatek/pinctrl-mt6878.c b/drivers/pinctrl/mediatek/pinctrl-mt6878.c
index b59ae089128a..9e832227391b 100644
--- a/drivers/pinctrl/mediatek/pinctrl-mt6878.c
+++ b/drivers/pinctrl/mediatek/pinctrl-mt6878.c
@@ -1476,3 +1476,4 @@ static int __init mt6878_pinctrl_init(void)
arch_initcall(mt6878_pinctrl_init);
MODULE_DESCRIPTION("MediaTek MT6878 Pinctrl Driver");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/pinctrl/mediatek/pinctrl-mt6893.c b/drivers/pinctrl/mediatek/pinctrl-mt6893.c
index 468ce0109b07..80fc4e933c5a 100644
--- a/drivers/pinctrl/mediatek/pinctrl-mt6893.c
+++ b/drivers/pinctrl/mediatek/pinctrl-mt6893.c
@@ -877,3 +877,4 @@ static int __init mt6893_pinctrl_init(void)
arch_initcall(mt6893_pinctrl_init);
MODULE_DESCRIPTION("MediaTek MT6893 Pinctrl Driver");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/pinctrl/mediatek/pinctrl-mt7620.c b/drivers/pinctrl/mediatek/pinctrl-mt7620.c
index d2624b9b5bc4..8d08a2e2dbb0 100644
--- a/drivers/pinctrl/mediatek/pinctrl-mt7620.c
+++ b/drivers/pinctrl/mediatek/pinctrl-mt7620.c
@@ -135,3 +135,6 @@ static int __init mt7620_pinctrl_init(void)
return platform_driver_register(&mt7620_pinctrl_driver);
}
core_initcall_sync(mt7620_pinctrl_init);
+
+MODULE_DESCRIPTION("MediaTek MT7620 Pinctrl Driver");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/pinctrl/mediatek/pinctrl-mt7621.c b/drivers/pinctrl/mediatek/pinctrl-mt7621.c
index b18c1a47bbeb..3300d085a748 100644
--- a/drivers/pinctrl/mediatek/pinctrl-mt7621.c
+++ b/drivers/pinctrl/mediatek/pinctrl-mt7621.c
@@ -115,3 +115,6 @@ static int __init mt7621_pinctrl_init(void)
return platform_driver_register(&mt7621_pinctrl_driver);
}
core_initcall_sync(mt7621_pinctrl_init);
+
+MODULE_DESCRIPTION("MediaTek MT7621 Pinctrl Driver");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/pinctrl/mediatek/pinctrl-mt7622.c b/drivers/pinctrl/mediatek/pinctrl-mt7622.c
index d5777889448a..7fa7b163695d 100644
--- a/drivers/pinctrl/mediatek/pinctrl-mt7622.c
+++ b/drivers/pinctrl/mediatek/pinctrl-mt7622.c
@@ -893,3 +893,6 @@ static int __init mt7622_pinctrl_init(void)
return platform_driver_register(&mt7622_pinctrl_driver);
}
arch_initcall(mt7622_pinctrl_init);
+
+MODULE_DESCRIPTION("MediaTek MT7622 Pinctrl Driver");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/pinctrl/mediatek/pinctrl-mt7623.c b/drivers/pinctrl/mediatek/pinctrl-mt7623.c
index 69c06c2c0e21..4db7a0ba466d 100644
--- a/drivers/pinctrl/mediatek/pinctrl-mt7623.c
+++ b/drivers/pinctrl/mediatek/pinctrl-mt7623.c
@@ -1440,3 +1440,6 @@ static int __init mtk_pinctrl_init(void)
return platform_driver_register(&mtk_pinctrl_driver);
}
arch_initcall(mtk_pinctrl_init);
+
+MODULE_DESCRIPTION("MediaTek MT7623 Pinctrl Driver");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/pinctrl/mediatek/pinctrl-mt7629.c b/drivers/pinctrl/mediatek/pinctrl-mt7629.c
index cc0694881ac9..d765e4382629 100644
--- a/drivers/pinctrl/mediatek/pinctrl-mt7629.c
+++ b/drivers/pinctrl/mediatek/pinctrl-mt7629.c
@@ -449,3 +449,6 @@ static int __init mt7629_pinctrl_init(void)
return platform_driver_register(&mt7629_pinctrl_driver);
}
arch_initcall(mt7629_pinctrl_init);
+
+MODULE_DESCRIPTION("MediaTek MT7629 Pinctrl Driver");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/pinctrl/mediatek/pinctrl-mt76x8.c b/drivers/pinctrl/mediatek/pinctrl-mt76x8.c
index 2bc8d4409ca2..d4f8f9a200e4 100644
--- a/drivers/pinctrl/mediatek/pinctrl-mt76x8.c
+++ b/drivers/pinctrl/mediatek/pinctrl-mt76x8.c
@@ -247,3 +247,6 @@ static int __init mt76x8_pinctrl_init(void)
return platform_driver_register(&mt76x8_pinctrl_driver);
}
core_initcall_sync(mt76x8_pinctrl_init);
+
+MODULE_DESCRIPTION("MediaTek MT76X8 Pinctrl Driver");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/pinctrl/mediatek/pinctrl-mt7981.c b/drivers/pinctrl/mediatek/pinctrl-mt7981.c
index 22c8f2480346..12f187061c60 100644
--- a/drivers/pinctrl/mediatek/pinctrl-mt7981.c
+++ b/drivers/pinctrl/mediatek/pinctrl-mt7981.c
@@ -1058,3 +1058,6 @@ static int __init mt7981_pinctrl_init(void)
return platform_driver_register(&mt7981_pinctrl_driver);
}
arch_initcall(mt7981_pinctrl_init);
+
+MODULE_DESCRIPTION("MediaTek MT7981 Pinctrl Driver");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/pinctrl/mediatek/pinctrl-mt7986.c b/drivers/pinctrl/mediatek/pinctrl-mt7986.c
index 8dae91530d9b..e84b142d4d7f 100644
--- a/drivers/pinctrl/mediatek/pinctrl-mt7986.c
+++ b/drivers/pinctrl/mediatek/pinctrl-mt7986.c
@@ -1008,3 +1008,6 @@ static int __init mt7986_pinctrl_init(void)
ARRAY_SIZE(mt7986_pinctrl_drivers));
}
arch_initcall(mt7986_pinctrl_init);
+
+MODULE_DESCRIPTION("MediaTek MT7986 Pinctrl Driver");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/pinctrl/mediatek/pinctrl-mt7988.c b/drivers/pinctrl/mediatek/pinctrl-mt7988.c
index fd3a7ff0a04d..24484724b632 100644
--- a/drivers/pinctrl/mediatek/pinctrl-mt7988.c
+++ b/drivers/pinctrl/mediatek/pinctrl-mt7988.c
@@ -1544,3 +1544,6 @@ static int __init mt7988_pinctrl_init(void)
return platform_driver_register(&mt7988_pinctrl_driver);
}
arch_initcall(mt7988_pinctrl_init);
+
+MODULE_DESCRIPTION("MediaTek MT7988 Pinctrl Driver");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/pinctrl/mediatek/pinctrl-mt8127.c b/drivers/pinctrl/mediatek/pinctrl-mt8127.c
index f5030a9ea40b..35f4951e50d0 100644
--- a/drivers/pinctrl/mediatek/pinctrl-mt8127.c
+++ b/drivers/pinctrl/mediatek/pinctrl-mt8127.c
@@ -307,3 +307,6 @@ static int __init mtk_pinctrl_init(void)
return platform_driver_register(&mtk_pinctrl_driver);
}
arch_initcall(mtk_pinctrl_init);
+
+MODULE_DESCRIPTION("MediaTek MT8127 Pinctrl Driver");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/pinctrl/mediatek/pinctrl-mt8135.c b/drivers/pinctrl/mediatek/pinctrl-mt8135.c
index 77c6ac464e86..83b53775f4e5 100644
--- a/drivers/pinctrl/mediatek/pinctrl-mt8135.c
+++ b/drivers/pinctrl/mediatek/pinctrl-mt8135.c
@@ -336,3 +336,6 @@ static int __init mtk_pinctrl_init(void)
return platform_driver_register(&mtk_pinctrl_driver);
}
arch_initcall(mtk_pinctrl_init);
+
+MODULE_DESCRIPTION("MediaTek MT8135 Pinctrl Driver");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/pinctrl/mediatek/pinctrl-mt8167.c b/drivers/pinctrl/mediatek/pinctrl-mt8167.c
index c812d614e9d4..ee294e1d408a 100644
--- a/drivers/pinctrl/mediatek/pinctrl-mt8167.c
+++ b/drivers/pinctrl/mediatek/pinctrl-mt8167.c
@@ -343,3 +343,6 @@ static int __init mtk_pinctrl_init(void)
return platform_driver_register(&mtk_pinctrl_driver);
}
arch_initcall(mtk_pinctrl_init);
+
+MODULE_DESCRIPTION("MediaTek MT8167 Pinctrl Driver");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/pinctrl/mediatek/pinctrl-mt8173.c b/drivers/pinctrl/mediatek/pinctrl-mt8173.c
index b214deeafbf1..b1234ce2a52b 100644
--- a/drivers/pinctrl/mediatek/pinctrl-mt8173.c
+++ b/drivers/pinctrl/mediatek/pinctrl-mt8173.c
@@ -356,3 +356,6 @@ static int __init mtk_pinctrl_init(void)
return platform_driver_register(&mtk_pinctrl_driver);
}
arch_initcall(mtk_pinctrl_init);
+
+MODULE_DESCRIPTION("MediaTek MT8173 Pinctrl Driver");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/pinctrl/mediatek/pinctrl-mt8183.c b/drivers/pinctrl/mediatek/pinctrl-mt8183.c
index 93e482c6b5fd..d15e8a9805c0 100644
--- a/drivers/pinctrl/mediatek/pinctrl-mt8183.c
+++ b/drivers/pinctrl/mediatek/pinctrl-mt8183.c
@@ -586,3 +586,6 @@ static int __init mt8183_pinctrl_init(void)
return platform_driver_register(&mt8183_pinctrl_driver);
}
arch_initcall(mt8183_pinctrl_init);
+
+MODULE_DESCRIPTION("MediaTek MT8183 Pinctrl Driver");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/pinctrl/mediatek/pinctrl-mt8186.c b/drivers/pinctrl/mediatek/pinctrl-mt8186.c
index dd19e74856a9..c0ab38d2ffad 100644
--- a/drivers/pinctrl/mediatek/pinctrl-mt8186.c
+++ b/drivers/pinctrl/mediatek/pinctrl-mt8186.c
@@ -1265,3 +1265,6 @@ static int __init mt8186_pinctrl_init(void)
}
arch_initcall(mt8186_pinctrl_init);
+
+MODULE_DESCRIPTION("MediaTek MT8186 Pinctrl Driver");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/pinctrl/mediatek/pinctrl-mt8188.c b/drivers/pinctrl/mediatek/pinctrl-mt8188.c
index 3975e99d9cf4..ff84bba7334c 100644
--- a/drivers/pinctrl/mediatek/pinctrl-mt8188.c
+++ b/drivers/pinctrl/mediatek/pinctrl-mt8188.c
@@ -1671,3 +1671,4 @@ static int __init mt8188_pinctrl_init(void)
arch_initcall(mt8188_pinctrl_init);
MODULE_DESCRIPTION("MediaTek MT8188 Pinctrl Driver");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/pinctrl/mediatek/pinctrl-mt8189.c b/drivers/pinctrl/mediatek/pinctrl-mt8189.c
index cd4cdff309a1..a9c128c514a4 100644
--- a/drivers/pinctrl/mediatek/pinctrl-mt8189.c
+++ b/drivers/pinctrl/mediatek/pinctrl-mt8189.c
@@ -1696,3 +1696,4 @@ static int __init mt8189_pinctrl_init(void)
arch_initcall(mt8189_pinctrl_init);
MODULE_DESCRIPTION("MediaTek MT8189 Pinctrl Driver");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/pinctrl/mediatek/pinctrl-mt8192.c b/drivers/pinctrl/mediatek/pinctrl-mt8192.c
index 3f8a9dbcb704..8a2f90f71bdc 100644
--- a/drivers/pinctrl/mediatek/pinctrl-mt8192.c
+++ b/drivers/pinctrl/mediatek/pinctrl-mt8192.c
@@ -1431,3 +1431,4 @@ static int __init mt8192_pinctrl_init(void)
arch_initcall(mt8192_pinctrl_init);
MODULE_DESCRIPTION("MediaTek MT8192 Pinctrl Driver");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/pinctrl/mediatek/pinctrl-mt8195.c b/drivers/pinctrl/mediatek/pinctrl-mt8195.c
index 83345c52b2fa..8d893d57f14f 100644
--- a/drivers/pinctrl/mediatek/pinctrl-mt8195.c
+++ b/drivers/pinctrl/mediatek/pinctrl-mt8195.c
@@ -978,3 +978,6 @@ static int __init mt8195_pinctrl_init(void)
return platform_driver_register(&mt8195_pinctrl_driver);
}
arch_initcall(mt8195_pinctrl_init);
+
+MODULE_DESCRIPTION("MediaTek MT8195 Pinctrl Driver");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/pinctrl/mediatek/pinctrl-mt8196.c b/drivers/pinctrl/mediatek/pinctrl-mt8196.c
index dec957c1724b..29d17af788c0 100644
--- a/drivers/pinctrl/mediatek/pinctrl-mt8196.c
+++ b/drivers/pinctrl/mediatek/pinctrl-mt8196.c
@@ -1856,3 +1856,4 @@ static int __init mt8196_pinctrl_init(void)
arch_initcall(mt8196_pinctrl_init);
MODULE_DESCRIPTION("MediaTek MT8196 Pinctrl Driver");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/pinctrl/mediatek/pinctrl-mt8365.c b/drivers/pinctrl/mediatek/pinctrl-mt8365.c
index c20b9e2e02dd..3777cbac4c1c 100644
--- a/drivers/pinctrl/mediatek/pinctrl-mt8365.c
+++ b/drivers/pinctrl/mediatek/pinctrl-mt8365.c
@@ -494,4 +494,5 @@ static int __init mtk_pinctrl_init(void)
arch_initcall(mtk_pinctrl_init);
MODULE_DESCRIPTION("MediaTek MT8365 Pinctrl Driver");
+MODULE_LICENSE("GPL v2");
MODULE_AUTHOR("Zhiyong Tao <zhiyong.tao@mediatek.com>");
diff --git a/drivers/pinctrl/mediatek/pinctrl-mt8516.c b/drivers/pinctrl/mediatek/pinctrl-mt8516.c
index 68d6638e7f4b..94de038026a3 100644
--- a/drivers/pinctrl/mediatek/pinctrl-mt8516.c
+++ b/drivers/pinctrl/mediatek/pinctrl-mt8516.c
@@ -343,3 +343,6 @@ static int __init mtk_pinctrl_init(void)
return platform_driver_register(&mtk_pinctrl_driver);
}
arch_initcall(mtk_pinctrl_init);
+
+MODULE_DESCRIPTION("MediaTek MT8516 Pinctrl Driver");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/pinctrl/mediatek/pinctrl-rt2880.c b/drivers/pinctrl/mediatek/pinctrl-rt2880.c
index e0366721a515..587d782a9b67 100644
--- a/drivers/pinctrl/mediatek/pinctrl-rt2880.c
+++ b/drivers/pinctrl/mediatek/pinctrl-rt2880.c
@@ -59,3 +59,6 @@ static int __init rt2880_pinctrl_init(void)
return platform_driver_register(&rt2880_pinctrl_driver);
}
core_initcall_sync(rt2880_pinctrl_init);
+
+MODULE_DESCRIPTION("MediaTek RT2880 Pinctrl Driver");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/pinctrl/mediatek/pinctrl-rt305x.c b/drivers/pinctrl/mediatek/pinctrl-rt305x.c
index 77bd4d1f6122..6b108fecd9ae 100644
--- a/drivers/pinctrl/mediatek/pinctrl-rt305x.c
+++ b/drivers/pinctrl/mediatek/pinctrl-rt305x.c
@@ -138,3 +138,6 @@ static int __init rt305x_pinctrl_init(void)
return platform_driver_register(&rt305x_pinctrl_driver);
}
core_initcall_sync(rt305x_pinctrl_init);
+
+MODULE_DESCRIPTION("MediaTek RT305X Pinctrl Driver");
+MODULE_LICENSE("GPL v2");
diff --git a/drivers/pinctrl/mediatek/pinctrl-rt3883.c b/drivers/pinctrl/mediatek/pinctrl-rt3883.c
index eeaf344c3647..87c37b178cfa 100644
--- a/drivers/pinctrl/mediatek/pinctrl-rt3883.c
+++ b/drivers/pinctrl/mediatek/pinctrl-rt3883.c
@@ -106,3 +106,6 @@ static int __init rt3883_pinctrl_init(void)
return platform_driver_register(&rt3883_pinctrl_driver);
}
core_initcall_sync(rt3883_pinctrl_init);
+
+MODULE_DESCRIPTION("MediaTek RT3883 Pinctrl Driver");
+MODULE_LICENSE("GPL v2");
--
2.45.2
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH v5 3/4] pinctrl: mediatek: mt7986: register both platform drivers from a single initcall
2026-07-09 6:33 ` [PATCH v5 3/4] pinctrl: mediatek: mt7986: register both platform drivers from a single initcall Justin Yeh
@ 2026-07-09 7:02 ` Chen-Yu Tsai
0 siblings, 0 replies; 9+ messages in thread
From: Chen-Yu Tsai @ 2026-07-09 7:02 UTC (permalink / raw)
To: Justin Yeh
Cc: Sean Wang, Linus Walleij, Matthias Brugger,
AngeloGioacchino Del Regno, Project_Global_Chrome_Upstream_Group,
linux-mediatek, linux-gpio, linux-kernel, linux-arm-kernel
On Thu, Jul 9, 2026 at 2:35 PM Justin Yeh <justin.yeh@mediatek.com> wrote:
>
> The MT7986 driver registers two separate platform drivers (mt7986a and
> mt7986b) and used to call arch_initcall() twice, once for each.
>
> This is fine while the driver is built-in, but a single translation unit
> can only provide one module_init(). Since arch_initcall() expands to
> module_init() when built as a module, having two of them would break the
> module build with a redefinition of init_module()/__inittest().
>
> Fold both platform drivers into a single driver array and register them
> from one initcall using platform_register_drivers(), matching the shape of
> the other MediaTek pinctrl SoC drivers. platform_register_drivers() also
> rolls back the first registration if the second one fails.
>
> No functional change for built-in builds; this is a preparatory cleanup
> for enabling module builds.
>
> Signed-off-by: Justin Yeh <justin.yeh@mediatek.com>
Reviewed-by: Chen-Yu Tsai <wenst@chromium.org>
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v5 2/4] pinctrl: mediatek: allow common drivers to be built as modules
2026-07-09 6:33 ` [PATCH v5 2/4] pinctrl: mediatek: allow common drivers to be built as modules Justin Yeh
@ 2026-07-09 8:23 ` Chen-Yu Tsai
0 siblings, 0 replies; 9+ messages in thread
From: Chen-Yu Tsai @ 2026-07-09 8:23 UTC (permalink / raw)
To: Justin Yeh
Cc: Sean Wang, Linus Walleij, Matthias Brugger,
AngeloGioacchino Del Regno, Project_Global_Chrome_Upstream_Group,
linux-mediatek, linux-gpio, linux-kernel, linux-arm-kernel
On Thu, Jul 9, 2026 at 2:35 PM Justin Yeh <justin.yeh@mediatek.com> wrote:
>
> The MediaTek SoC pinctrl drivers link against the shared implementations
> in pinctrl-mtk-common.c (v1), pinctrl-moore.c and pinctrl-mtmips.c. These
> were built-in only: their Kconfig symbols were bool, they did not export
> their entry points and they carried no MODULE_LICENSE().
>
> To let the individual SoC drivers be built as loadable modules (required
> for Android GKI + vendor_dlkm, where vendor drivers must live outside the
> GKI vmlinux), the shared code they depend on has to be modular too.
> Otherwise selecting a SoC driver as =m forces the common symbol to =y and
> the resulting module fails to link against the unexported common entry
> points.
>
> Convert PINCTRL_MTK, PINCTRL_MTK_MOORE and PINCTRL_MTK_MTMIPS to
> tristate, export the entry points used by the SoC drivers, and add
> MODULE_DESCRIPTION()/MODULE_LICENSE() to the three common files.
>
> The v2 common code (PINCTRL_MTK_V2) is already modular, but mtk_rmw() was
> never exported. It is called directly by SoC drivers such as mt7623, so
> export it as well to keep those drivers linking once they are modular.
>
> Signed-off-by: Justin Yeh <justin.yeh@mediatek.com>
> ---
> drivers/pinctrl/mediatek/Kconfig | 6 +++---
> drivers/pinctrl/mediatek/pinctrl-moore.c | 5 +++++
> drivers/pinctrl/mediatek/pinctrl-mtk-common-v2.c | 1 +
> drivers/pinctrl/mediatek/pinctrl-mtk-common.c | 8 ++++++++
> drivers/pinctrl/mediatek/pinctrl-mtmips.c | 4 ++++
> 5 files changed, 21 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/pinctrl/mediatek/Kconfig b/drivers/pinctrl/mediatek/Kconfig
> index 97980cc28b9c..864e7ffc6044 100644
> --- a/drivers/pinctrl/mediatek/Kconfig
> +++ b/drivers/pinctrl/mediatek/Kconfig
> @@ -11,7 +11,7 @@ config EINT_MTK
> default PINCTRL_MTK_PARIS
>
> config PINCTRL_MTK
> - bool
> + tristate
> depends on OF
> select PINMUX
> select GENERIC_PINCONF
> @@ -22,13 +22,13 @@ config PINCTRL_MTK_V2
> tristate
>
> config PINCTRL_MTK_MTMIPS
> - bool
> + tristate
> depends on RALINK
> select PINMUX
> select GENERIC_PINCONF
>
> config PINCTRL_MTK_MOORE
> - bool
> + tristate
> depends on OF
> select GENERIC_PINCONF
> select GENERIC_PINCTRL_GROUPS
> diff --git a/drivers/pinctrl/mediatek/pinctrl-moore.c b/drivers/pinctrl/mediatek/pinctrl-moore.c
> index 38f15dbe9a28..3247622911cd 100644
> --- a/drivers/pinctrl/mediatek/pinctrl-moore.c
> +++ b/drivers/pinctrl/mediatek/pinctrl-moore.c
> @@ -10,6 +10,7 @@
>
> #include <dt-bindings/pinctrl/mt65xx.h>
> #include <linux/gpio/driver.h>
> +#include <linux/module.h>
>
> #include <linux/pinctrl/consumer.h>
>
> @@ -743,3 +744,7 @@ int mtk_moore_pinctrl_probe(struct platform_device *pdev,
>
> return 0;
> }
> +EXPORT_SYMBOL_GPL(mtk_moore_pinctrl_probe);
Maybe use a separate namespace, like "MTK_PINCTRL"? (Use EXPORT_SYMBOL_NS())
Otherwise seems correct.
> +
> +MODULE_DESCRIPTION("MediaTek Pinctrl Common Driver V2 Moore");
> +MODULE_LICENSE("GPL v2");
> diff --git a/drivers/pinctrl/mediatek/pinctrl-mtk-common-v2.c b/drivers/pinctrl/mediatek/pinctrl-mtk-common-v2.c
> index 4918d38abfc2..3813dfb0fa7d 100644
> --- a/drivers/pinctrl/mediatek/pinctrl-mtk-common-v2.c
> +++ b/drivers/pinctrl/mediatek/pinctrl-mtk-common-v2.c
> @@ -69,6 +69,7 @@ void mtk_rmw(struct mtk_pinctrl *pctl, u8 i, u32 reg, u32 mask, u32 set)
>
> spin_unlock_irqrestore(&pctl->lock, flags);
> }
> +EXPORT_SYMBOL_GPL(mtk_rmw);
>
> static int mtk_hw_pin_field_lookup(struct mtk_pinctrl *hw,
> const struct mtk_pin_desc *desc,
> diff --git a/drivers/pinctrl/mediatek/pinctrl-mtk-common.c b/drivers/pinctrl/mediatek/pinctrl-mtk-common.c
> index 791eddd7a2c6..a58015b508af 100644
> --- a/drivers/pinctrl/mediatek/pinctrl-mtk-common.c
> +++ b/drivers/pinctrl/mediatek/pinctrl-mtk-common.c
> @@ -7,6 +7,7 @@
>
> #include <linux/io.h>
> #include <linux/gpio/driver.h>
> +#include <linux/module.h>
> #include <linux/of.h>
> #include <linux/of_irq.h>
> #include <linux/pinctrl/consumer.h>
> @@ -190,6 +191,7 @@ int mtk_pconf_spec_set_ies_smt_range(struct regmap *regmap,
> regmap_write(regmap, reg_addr, bit);
> return 0;
> }
> +EXPORT_SYMBOL_GPL(mtk_pconf_spec_set_ies_smt_range);
>
> static const struct mtk_pin_drv_grp *mtk_find_pin_drv_grp_by_pin(
> struct mtk_pinctrl *pctl, unsigned long pin) {
> @@ -297,6 +299,7 @@ int mtk_pctrl_spec_pull_set_samereg(struct regmap *regmap,
>
> return 0;
> }
> +EXPORT_SYMBOL_GPL(mtk_pctrl_spec_pull_set_samereg);
>
> static int mtk_pconf_set_pull_select(struct mtk_pinctrl *pctl,
> unsigned int pin, bool enable, bool isup, unsigned int arg)
> @@ -1149,6 +1152,7 @@ int mtk_pctrl_init(struct platform_device *pdev,
>
> return 0;
> }
> +EXPORT_SYMBOL_GPL(mtk_pctrl_init);
>
> int mtk_pctrl_common_probe(struct platform_device *pdev)
> {
> @@ -1160,3 +1164,7 @@ int mtk_pctrl_common_probe(struct platform_device *pdev)
>
> return mtk_pctrl_init(pdev, data, NULL);
> }
> +EXPORT_SYMBOL_GPL(mtk_pctrl_common_probe);
> +
> +MODULE_DESCRIPTION("MediaTek Pinctrl Common Driver");
> +MODULE_LICENSE("GPL v2");
> diff --git a/drivers/pinctrl/mediatek/pinctrl-mtmips.c b/drivers/pinctrl/mediatek/pinctrl-mtmips.c
> index efd77b6c56a1..c9d9de68e282 100644
> --- a/drivers/pinctrl/mediatek/pinctrl-mtmips.c
> +++ b/drivers/pinctrl/mediatek/pinctrl-mtmips.c
> @@ -349,3 +349,7 @@ int mtmips_pinctrl_init(struct platform_device *pdev,
>
> return PTR_ERR_OR_ZERO(dev);
> }
> +EXPORT_SYMBOL_GPL(mtmips_pinctrl_init);
> +
> +MODULE_DESCRIPTION("MediaTek MIPS Pinctrl Common Driver");
> +MODULE_LICENSE("GPL v2");
> --
> 2.45.2
>
>
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v5 1/4] pinctrl: mediatek: use devm_gpiochip_add_data() for GPIO chip
2026-07-09 6:33 ` [PATCH v5 1/4] pinctrl: mediatek: use devm_gpiochip_add_data() for GPIO chip Justin Yeh
@ 2026-07-09 8:26 ` Chen-Yu Tsai
0 siblings, 0 replies; 9+ messages in thread
From: Chen-Yu Tsai @ 2026-07-09 8:26 UTC (permalink / raw)
To: Justin Yeh
Cc: Sean Wang, Linus Walleij, Matthias Brugger,
AngeloGioacchino Del Regno, Project_Global_Chrome_Upstream_Group,
linux-mediatek, linux-gpio, linux-kernel, linux-arm-kernel
On Thu, Jul 9, 2026 at 2:35 PM Justin Yeh <justin.yeh@mediatek.com> wrote:
>
> The gpio_chip is allocated with device-managed memory but registered with
> the non-managed gpiochip_add_data(). This was harmless while the drivers
> were built-in, but once they can be built as modules and unbound/rmmod'd,
> devm frees the gpio_chip's memory while it is still registered, causing a
> use-after-free.
>
> Register it with devm_gpiochip_add_data() so it shares the same
> device-managed lifecycle, which also lets the manual gpiochip_remove()
> error paths go away.
>
> Fixes: a6df410d420a ("pinctrl: mediatek: Add Pinctrl/GPIO driver for mt8135.")
> Fixes: 805250982bb5 ("pinctrl: mediatek: add pinctrl-paris that implements the vendor dt-bindings")
> Fixes: e78d57b2f87c ("pinctrl: mediatek: add pinctrl-moore that implements the generic pinctrl dt-bindings")
> Signed-off-by: Justin Yeh <justin.yeh@mediatek.com>
Reviewed-by: Chen-Yu Tsai <wenst@chromium.org>
But see below.
> ---
> drivers/pinctrl/mediatek/pinctrl-moore.c | 6 ++----
> drivers/pinctrl/mediatek/pinctrl-mtk-common.c | 14 ++++----------
> drivers/pinctrl/mediatek/pinctrl-paris.c | 2 +-
> 3 files changed, 7 insertions(+), 15 deletions(-)
>
> diff --git a/drivers/pinctrl/mediatek/pinctrl-moore.c b/drivers/pinctrl/mediatek/pinctrl-moore.c
> index 17e30f83dc19..38f15dbe9a28 100644
> --- a/drivers/pinctrl/mediatek/pinctrl-moore.c
> +++ b/drivers/pinctrl/mediatek/pinctrl-moore.c
> @@ -594,7 +594,7 @@ static int mtk_build_gpiochip(struct mtk_pinctrl *hw)
> chip->base = -1;
> chip->ngpio = hw->soc->npins;
>
> - ret = gpiochip_add_data(chip, hw);
> + ret = devm_gpiochip_add_data(hw->dev, chip, hw);
> if (ret < 0)
> return ret;
>
> @@ -608,10 +608,8 @@ static int mtk_build_gpiochip(struct mtk_pinctrl *hw)
> if (!of_property_present(hw->dev->of_node, "gpio-ranges")) {
> ret = gpiochip_add_pin_range(chip, dev_name(hw->dev), 0, 0,
> chip->ngpio);
> - if (ret < 0) {
> - gpiochip_remove(chip);
> + if (ret < 0)
> return ret;
> - }
> }
>
> return 0;
> diff --git a/drivers/pinctrl/mediatek/pinctrl-mtk-common.c b/drivers/pinctrl/mediatek/pinctrl-mtk-common.c
> index dd2c8aa03938..791eddd7a2c6 100644
> --- a/drivers/pinctrl/mediatek/pinctrl-mtk-common.c
> +++ b/drivers/pinctrl/mediatek/pinctrl-mtk-common.c
> @@ -1130,30 +1130,24 @@ int mtk_pctrl_init(struct platform_device *pdev,
> pctl->chip->parent = &pdev->dev;
> pctl->chip->base = -1;
>
> - ret = gpiochip_add_data(pctl->chip, pctl);
> + ret = devm_gpiochip_add_data(&pdev->dev, pctl->chip, pctl);
> if (ret)
> return -EINVAL;
>
> /* Register the GPIO to pin mappings. */
> ret = gpiochip_add_pin_range(pctl->chip, dev_name(&pdev->dev),
> 0, 0, pctl->devdata->npins);
> - if (ret) {
> - ret = -EINVAL;
> - goto chip_error;
> - }
> + if (ret)
> + return -EINVAL;
>
> /* Only initialize EINT if we have EINT pins */
> if (data->eint_hw.ap_num > 0) {
> ret = mtk_eint_init(pctl, pdev);
I think you would also need some matching cleanup function for mtk_eint_init()
or you end up with a dangling IRQ domain and mappings that are active but
have invalid chain handlers.
This would probably be a separate patch.
> if (ret)
> - goto chip_error;
> + return ret;
> }
>
> return 0;
> -
> -chip_error:
> - gpiochip_remove(pctl->chip);
> - return ret;
> }
>
> int mtk_pctrl_common_probe(struct platform_device *pdev)
> diff --git a/drivers/pinctrl/mediatek/pinctrl-paris.c b/drivers/pinctrl/mediatek/pinctrl-paris.c
> index 23f04b24fd65..09098b68f725 100644
> --- a/drivers/pinctrl/mediatek/pinctrl-paris.c
> +++ b/drivers/pinctrl/mediatek/pinctrl-paris.c
> @@ -957,7 +957,7 @@ static int mtk_build_gpiochip(struct mtk_pinctrl *hw)
> chip->base = -1;
> chip->ngpio = hw->soc->npins;
>
> - ret = gpiochip_add_data(chip, hw);
> + ret = devm_gpiochip_add_data(hw->dev, chip, hw);
> if (ret < 0)
> return ret;
>
> --
> 2.45.2
>
>
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v5 0/4] pinctrl: mediatek: Enable module build support
2026-07-09 6:33 [PATCH v5 0/4] pinctrl: mediatek: Enable module build support Justin Yeh
` (3 preceding siblings ...)
2026-07-09 6:33 ` [PATCH v5 4/4] pinctrl: mediatek: enable module build support for all SoC drivers Justin Yeh
@ 2026-07-10 20:29 ` Linus Walleij
4 siblings, 0 replies; 9+ messages in thread
From: Linus Walleij @ 2026-07-10 20:29 UTC (permalink / raw)
To: Justin Yeh
Cc: Sean Wang, Matthias Brugger, AngeloGioacchino Del Regno,
Project_Global_Chrome_Upstream_Group, linux-mediatek, linux-gpio,
linux-kernel, linux-arm-kernel
Hi Justin,
thanks for your patches!
On Thu, Jul 9, 2026 at 8:35 AM Justin Yeh <justin.yeh@mediatek.com> wrote:
> This series lets the MediaTek pinctrl drivers be built as loadable
> kernel modules. This is required for Android GKI + vendor_dlkm
> deployments, where vendor-specific drivers must be kept separate from
> the GKI vmlinux and loaded as modules from the vendor partition.
Nice series, I see Chen-Yu has some more comments and a
separare cleanup patch may be needed for mtk_eint IIUC,
but definitely getting there!
Yours,
Linus Walleij
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2026-07-10 20:30 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-07-09 6:33 [PATCH v5 0/4] pinctrl: mediatek: Enable module build support Justin Yeh
2026-07-09 6:33 ` [PATCH v5 1/4] pinctrl: mediatek: use devm_gpiochip_add_data() for GPIO chip Justin Yeh
2026-07-09 8:26 ` Chen-Yu Tsai
2026-07-09 6:33 ` [PATCH v5 2/4] pinctrl: mediatek: allow common drivers to be built as modules Justin Yeh
2026-07-09 8:23 ` Chen-Yu Tsai
2026-07-09 6:33 ` [PATCH v5 3/4] pinctrl: mediatek: mt7986: register both platform drivers from a single initcall Justin Yeh
2026-07-09 7:02 ` Chen-Yu Tsai
2026-07-09 6:33 ` [PATCH v5 4/4] pinctrl: mediatek: enable module build support for all SoC drivers Justin Yeh
2026-07-10 20:29 ` [PATCH v5 0/4] pinctrl: mediatek: Enable module build support Linus Walleij
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox