Re: [PATCH v12 1/7] mfd: Add core driver for Nuvoton NCT6694
From: Ming Yu <hidden>
Date: 2025-06-13 01:55:09
Also in:
linux-can, linux-gpio, linux-hwmon, linux-i2c, linux-rtc, linux-usb, linux-watchdog, lkml
Lee Jones [off-list ref] 於 2025年6月12日 週四 下午11:23寫道:
On Thu, 12 Jun 2025, Ming Yu wrote:quoted
Dear Lee, Thank you for reviewing, Lee Jones [off-list ref] 於 2025年6月12日 週四 下午10:00寫道:quoted
...quoted
quoted
+static const struct mfd_cell nct6694_devs[] = { + MFD_CELL_BASIC("nct6694-gpio", NULL, NULL, 0, 0), + MFD_CELL_BASIC("nct6694-gpio", NULL, NULL, 0, 1), + MFD_CELL_BASIC("nct6694-gpio", NULL, NULL, 0, 2), + MFD_CELL_BASIC("nct6694-gpio", NULL, NULL, 0, 3), + MFD_CELL_BASIC("nct6694-gpio", NULL, NULL, 0, 4), + MFD_CELL_BASIC("nct6694-gpio", NULL, NULL, 0, 5), + MFD_CELL_BASIC("nct6694-gpio", NULL, NULL, 0, 6), + MFD_CELL_BASIC("nct6694-gpio", NULL, NULL, 0, 7), + MFD_CELL_BASIC("nct6694-gpio", NULL, NULL, 0, 8), + MFD_CELL_BASIC("nct6694-gpio", NULL, NULL, 0, 9), + MFD_CELL_BASIC("nct6694-gpio", NULL, NULL, 0, 10), + MFD_CELL_BASIC("nct6694-gpio", NULL, NULL, 0, 11), + MFD_CELL_BASIC("nct6694-gpio", NULL, NULL, 0, 12), + MFD_CELL_BASIC("nct6694-gpio", NULL, NULL, 0, 13), + MFD_CELL_BASIC("nct6694-gpio", NULL, NULL, 0, 14), + MFD_CELL_BASIC("nct6694-gpio", NULL, NULL, 0, 15), + + MFD_CELL_BASIC("nct6694-i2c", NULL, NULL, 0, 0), + MFD_CELL_BASIC("nct6694-i2c", NULL, NULL, 0, 1), + MFD_CELL_BASIC("nct6694-i2c", NULL, NULL, 0, 2), + MFD_CELL_BASIC("nct6694-i2c", NULL, NULL, 0, 3), + MFD_CELL_BASIC("nct6694-i2c", NULL, NULL, 0, 4), + MFD_CELL_BASIC("nct6694-i2c", NULL, NULL, 0, 5),Why have we gone back to this silly numbering scheme? What happened to using IDA in the child driver?In a previous version, I tried to maintain a static IDA in each sub-driver. However, I didn’t consider the case where multiple NCT6694 devices are bound to the same driver — in that case, the IDs are not fixed and become unusable for my purpose.Not sure I understand.
As far as I know, if I maintain the IDA in the sub-drivers and use
multiple MFD_CELL_NAME("nct6694-gpio") entries in the MFD, the first
NCT6694 device bound to the GPIO driver will receive IDs 0~15.
However, when a second NCT6694 device is connected to the system, it
will receive IDs 16~31.
Because of this behavior, I switched back to using platform_device->id.
quoted
I’ve since realized that using pdev->id avoids the need for cell->id, so I reverted to the earlier approach. That said, do you think it would be a better solution to manage all the IDAs centrally within the driver? For example: in nct6694.c struct nct6694 { struct device *dev; struct ida gpio_ida; struct ida i2c_ida; struct ida can_ida; struct ida wdt_ida; }; static int nct6694_probe(struct platform_device *pdev) { ida_init(&nct6694->gpio_ida); ... } in gpio-nct6694.c static int nct6694_gpio_probe(struct platform_device *pdev) { id = ida_alloc(&nct6694->gpio_ida, GFP_KERNEL); }No that would be way worse.
Thanks, Ming