Re: [PATCH v7 0/5] pinctrl: mediatek: Enable module build support

Linus Walleij <[email protected]>
Newsgroups org.kernel.vger.linux-gpio,org.infradead.lists.linux-arm-kernel,org.infradead.lists.linux-mediatek,org.kernel.vger.linux-kernel
Message-ID <CAD++jL=fy+0ZZhg_eH_BGLUZfpK69zCcOaTp_LQ93yvSxUiS3w@mail.gmail.com>
On Thu, Jul 23, 2026 at 5:58 AM Justin Yeh <[email protected]> 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.
>
> 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.
>
>   2. Fix a pre-existing EINT resource leak on unbind. mtk_eint_do_init()
>      creates an IRQ domain, an interrupt mapping per EINT line and a
>      chained handler on the parent interrupt, none of which were ever
>      released. Once the drivers can be unbound/rmmod'd this leaves a
>      dangling IRQ domain, mappings whose chip data points at freed
>      memory, and a chained handler still firing into that freed data.
>      Tear them down with a device-managed action, matching the devm
>      lifecycle used for the gpio_chip.
>
>   3. 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.
>      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. The shared symbols are exported in
>      the "MTK_PINCTRL" symbol namespace (EXPORT_SYMBOL_NS_GPL()), and
>      each SoC driver that uses them declares MODULE_IMPORT_NS().
>
>   4. Convert the MT7986 driver to a single initcall. It registers two
>      platform drivers (mt7986a/mt7986b) and used to call arch_initcall()
>      twice. 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.
>
>   5. Flip every SoC driver's Kconfig from bool to tristate and add the
>      module metadata. This also adds the MODULE_DEVICE_TABLE(of, ...)
>      entries that several drivers were missing, so the resulting modules
>      carry the modalias information udev needs to autoload them on a
>      matching device.
>
> The series builds cleanly under allmodconfig on arm64 (all SoC drivers
> as =m).
>
> Changes in v7:
>  - patch 2/5 (free EINT resources on unbind): add synchronize_irq() in
>    the teardown, after detaching the chained handler and before disposing
>    of the domain/mappings, so any in-flight handler has finished before
>    the data it references is freed, as suggested by AngeloGioacchino Del
>    Regno. Also add the missing #include <linux/interrupt.h> that
>    synchronize_irq() needs. Added his Reviewed-by.
>  - patch 5/5 (enable module build support): add MODULE_DEVICE_TABLE(of,
>    ...) to the SoC drivers that were missing it. AngeloGioacchino and
>    Chen-Yu Tsai both pointed this out; without it the module still
>    builds but is not autoloaded by udev on a matching device.
>
> Review status: patches 1/5 and 4/5 carry Chen-Yu Tsai's Reviewed-by;
> patch 2/5 carries AngeloGioacchino Del Regno's Reviewed-by; patch 5/5
> carries AngeloGioacchino Del Regno's Reviewed-by (from the per-driver
> patches reviewed in v4, preserved across the squash). Patch 3/5 has not
> been reviewed yet.

All patches applied, I had to rebase patch 5/5, please check the
result!

Yours,
Linus Walleij
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.