[PATCH v6 03/20] pinctrl: nxp: add a pin controller driver based on SCMI pin control protocol

Marek Vasut marex at denx.de
Fri Feb 28 20:16:35 CET 2025


On 2/28/25 11:53 AM, Alice Guo (OSS) wrote:
> From: Alice Guo <alice.guo at nxp.com>
> 
> This patch provides a pinctrl driver based on SCMI pin control protocol.
> Currently, only the PINCTRL_CONFIG_SET command is implemented.

This can also be a separate patch and go in separately , right ?

If so, send this as separate patch.

[...]

> diff --git a/drivers/pinctrl/nxp/pinctrl-scmi.c b/drivers/pinctrl/nxp/pinctrl-scmi.c
> new file mode 100644
> index 0000000000..4a791b7e95
> --- /dev/null
> +++ b/drivers/pinctrl/nxp/pinctrl-scmi.c
> @@ -0,0 +1,143 @@
> +// SPDX-License-Identifier: GPL-2.0+
> +/*
> + * Copyright 2025 NXP
> + */
> +
> +#include <asm/io.h>
> +#include <asm/mach-imx/sys_proto.h>
> +#include <dm.h>
> +#include <dm/device_compat.h>
> +#include <dm/pinctrl.h>
> +#include <scmi_agent.h>
> +#include <scmi_protocols.h>
> +
> +#include "pinctrl-imx.h"
> +
> +#define DAISY_OFFSET_IMX93	0x360
> +#define DAISY_OFFSET_IMX95	0x408
> +
> +/* SCMI pin control types */
> +#define PINCTRL_TYPE_MUX        192
> +#define PINCTRL_TYPE_CONFIG     193
> +#define PINCTRL_TYPE_DAISY_ID   194
> +#define PINCTRL_TYPE_DAISY_CFG  195
> +#define PINCTRL_NUM_CFGS_SHIFT  2
> +
> +struct imx_scmi_pinctrl_priv {
> +	u16		daisy_offset;
> +};
> +
> +static int imx_pinconf_scmi_set(struct udevice *dev, u32 mux_ofs, u32 mux, u32 config_val,
> +				u32 input_ofs, u32 input_val)
> +{
> +	struct imx_scmi_pinctrl_priv *priv = dev_get_priv(dev);
> +	int ret, num_cfgs = 0;
> +	struct scmi_msg msg;
> +
> +	/* Call SCMI API to set the pin mux and configuration. */
> +	struct scmi_pinctrl_config_set_out out;
> +	struct scmi_pinctrl_config_set_in in = {
> +		.identifier = mux_ofs / 4,
> +		.function_id = 0xFFFFFFFF,
> +		.attributes = 0,
> +	};
> +
> +	if (mux_ofs != 0) {

if (mux) { ... } is enough, the !=0 is unnecessary.

> +		in.configs[num_cfgs].type = PINCTRL_TYPE_MUX;
> +		in.configs[num_cfgs].val = mux;
> +		num_cfgs++;
> +	}
> +
> +	if (config_val != 0) {

DTTO

> +		in.configs[num_cfgs].type = PINCTRL_TYPE_CONFIG;
> +		in.configs[num_cfgs].val = config_val;
> +		num_cfgs++;
> +	}
> +
> +	if (input_ofs != 0) {

DTTO

> +		in.configs[num_cfgs].type = PINCTRL_TYPE_DAISY_ID;
> +		in.configs[num_cfgs].val = (input_ofs -  priv->daisy_offset) / 4;
> +		num_cfgs++;
> +		in.configs[num_cfgs].type = PINCTRL_TYPE_DAISY_CFG;
> +		in.configs[num_cfgs].val = input_val;
> +		num_cfgs++;
> +	}
> +
> +	/* Update the number of configs sent in this call. */
> +	in.attributes = num_cfgs << PINCTRL_NUM_CFGS_SHIFT;
> +
> +	msg = SCMI_MSG_IN(SCMI_PROTOCOL_ID_PINCTRL,
> +			  SCMI_MSG_PINCTRL_CONFIG_SET, in, out);
> +
> +	ret = devm_scmi_process_msg(dev, &msg);
> +	if (ret || out.status != 0) {
> +		dev_err(dev, "Failed to set PAD = %d, daisy = %d, scmi_err = %d, ret = %d\n",
> +			mux_ofs / 4, input_ofs / 4, out.status, ret);
> +	}
> +
> +	return ret;

[...]

> diff --git a/include/scmi_protocols.h b/include/scmi_protocols.h
> index 7abb2a6f36..279ebbad44 100644
> --- a/include/scmi_protocols.h
> +++ b/include/scmi_protocols.h
> @@ -24,6 +24,7 @@ enum scmi_std_protocol {
>   	SCMI_PROTOCOL_ID_SENSOR = 0x15,
>   	SCMI_PROTOCOL_ID_RESET_DOMAIN = 0x16,
>   	SCMI_PROTOCOL_ID_VOLTAGE_DOMAIN = 0x17,
> +	SCMI_PROTOCOL_ID_PINCTRL = 0x19,
This is the custom iMX specific pinctrl protocol, isn't it ?

Can you rename it to some SCMI_PROTOCOL_ID_NXP_IMX9_PINCTRL to make it 
clear this is custom protocol ?


More information about the U-Boot mailing list