RE: [PATCH 2/4] firmware: arm_scmi: bus: Bypass setting fwnode for pinctrl
From: Peng Fan <peng.fan@nxp.com>
Date: 2025-01-15 07:22:39
Also in:
arm-scmi, imx, linux-gpio, lkml
Subject: Re: [PATCH 2/4] firmware: arm_scmi: bus: Bypass setting fwnode for pinctrl On Tue, Jan 14, 2025 at 08:31:03AM +0000, Peng Fan wrote:quoted
Hi Cristian, Sudeepquoted
Subject: Re: [PATCH 2/4] firmware: arm_scmi: bus: Bypass setting fwnode for pinctrl[...]quoted
quoted
quoted
fix here) than this change....or indeed this is another possibilityI am doing a patch as below, how to do you think?Do you have any comments on below ideas? I am thinking to send out new patchset based on below ideas in this week.Hi Peng, sorry for the delay. Why both blacklist and allowlist ?
Because there is blocklist in pinctrl-scmi.c and allowlist in pinctrl-imx-scmi.c. we need to make sure only one pinctrl device are created when both drivers are built in. So to pinctrl-scmi.c, use blacklist, to pinctrl-imx-scmi.c use allowlist. To vendor protocols, just need allowlist. Regards, Peng.
Cristianquoted
quoted
With below patch, we could resolve the devlink issue and also support mutitple vendor drivers built in, with each vendor driver has a machine_allowlist.diff --git a/drivers/firmware/arm_scmi/bus.cb/drivers/firmware/arm_scmi/bus.c index 1d2aedfcfdb4..c1c45b545480 100644--- a/drivers/firmware/arm_scmi/bus.c +++ b/drivers/firmware/arm_scmi/bus.c@@ -55,6 +55,20 @@ static intscmi_protocol_device_request(constquoted
quoted
struct scmi_device_id *id_table) unsigned int id = 0; struct list_head *head, *phead = NULL; struct scmi_requested_dev *rdev; + const char * const *allowlist = id_table->machine_allowlist; + const char * const *blocklist = id_table->machine_blocklist; + + if (blocklist && of_machine_compatible_match(blocklist)) { + pr_debug("block SCMI device (%s) for protocol %x\n", + id_table->name, id_table->protocol_id); + return 0; + } + + if (allowlist && !of_machine_compatible_match(allowlist)) { + pr_debug("block SCMI device (%s) for protocol %x\n", + id_table->name, id_table->protocol_id); + return 0; + } pr_debug("Requesting SCMI device (%s) for protocol %x\n", id_table->name, id_table->protocol_id); diff --git a/include/linux/scmi_protocol.h b/include/linux/scmi_protocol.h index 688466a0e816..e1b822d3522f 100644--- a/include/linux/scmi_protocol.h +++ b/include/linux/scmi_protocol.h@@ -950,6 +950,9 @@ struct scmi_device { struct scmi_device_id{quoted
quoted
u8 protocol_id; const char *name; + /* Optional */ + const char * const *machine_blocklist; + const char * const *machine_allowlist; };Thanks, Peng.quoted
struct scmi_driver { Thanks, Pengquoted
Thanks, Cristian