blob: fd0ef80d2ad5808ba2b0bd45cfdd483be68b5921 [file] [log] [blame]
/*
* Copyright 2024 NXP
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr/drivers/firmware/scmi/pinctrl.h>
DT_SCMI_PROTOCOL_DEFINE_NODEV(DT_INST(0, arm_scmi_pinctrl), NULL);
int scmi_pinctrl_settings_configure(struct scmi_pinctrl_settings *settings)
{
struct scmi_protocol *proto;
struct scmi_message msg, reply;
uint32_t config_num;
int32_t status, ret;
proto = &SCMI_PROTOCOL_NAME(SCMI_PROTOCOL_PINCTRL);
/* sanity checks */
if (!settings) {
return -EINVAL;
}
if (!proto) {
return -EINVAL;
}
if (proto->id != SCMI_PROTOCOL_PINCTRL) {
return -EINVAL;
}
config_num = SCMI_PINCTRL_ATTRIBUTES_CONFIG_NUM(settings->attributes);
if (!config_num) {
return -EINVAL;
}
if ((config_num * 2) > ARM_SCMI_PINCTRL_MAX_CONFIG_SIZE) {
return -EINVAL;
}
msg.hdr = SCMI_MESSAGE_HDR_MAKE(SCMI_PINCTRL_MSG_PINCTRL_SETTINGS_CONFIGURE,
SCMI_COMMAND, proto->id, 0x0);
msg.len = sizeof(*settings) -
(ARM_SCMI_PINCTRL_MAX_CONFIG_SIZE - config_num * 2) * 4;
msg.content = settings;
reply.hdr = msg.hdr;
reply.len = sizeof(status);
reply.content = &status;
ret = scmi_send_message(proto, &msg, &reply);
if (ret < 0) {
return ret;
}
if (status != SCMI_SUCCESS) {
return scmi_status_to_errno(status);
}
return 0;
}