From 7643ffa0e67d57b067c778b95b0c8cd1e69f3f1d Mon Sep 17 00:00:00 2001 From: Tang Yun ping Date: Mon, 24 Aug 2015 19:03:31 +0800 Subject: [PATCH] RK3368 Scpi: add Scpi version check Signed-off-by: Tang Yun ping --- drivers/mailbox/scpi_cmd.h | 2 +- drivers/mailbox/scpi_protocol.c | 58 +++++++++++++++++++++------------ 2 files changed, 39 insertions(+), 21 deletions(-) diff --git a/drivers/mailbox/scpi_cmd.h b/drivers/mailbox/scpi_cmd.h index a15ef87b547a..f516e42b4669 100644 --- a/drivers/mailbox/scpi_cmd.h +++ b/drivers/mailbox/scpi_cmd.h @@ -16,7 +16,7 @@ * this program. If not, see . */ -#define SCPI_VERSION 0x01000000 /* version: 1.0.0.0 */ +#define SCPI_VERSION 0x01000001 /* version: 1.0.0.0 */ enum scpi_error_codes { SCPI_SUCCESS = 0, /* Success */ diff --git a/drivers/mailbox/scpi_protocol.c b/drivers/mailbox/scpi_protocol.c index 771746396501..673437a5deea 100644 --- a/drivers/mailbox/scpi_protocol.c +++ b/drivers/mailbox/scpi_protocol.c @@ -59,6 +59,11 @@ struct scpi_data_buf { int timeout_ms; }; +struct scpi_mcu_ver { + u32 scpi_ver; + char mcu_ver[16]; +}; + static int high_priority_cmds[] = { SCPI_CMD_GET_CSS_PWR_STATE, SCPI_CMD_CFG_PWR_STATE_STAT, @@ -424,23 +429,29 @@ int scpi_get_sensor_value(u16 sensor, u32 *val) } EXPORT_SYMBOL_GPL(scpi_get_sensor_value); -static int scpi_get_version(u32 old, u32 *ver) +static int scpi_get_version(u32 old, struct scpi_mcu_ver *ver) { + int ret; struct scpi_data_buf sdata; struct rockchip_mbox_msg mdata; struct __packed { u32 status; - u32 ver; + struct scpi_mcu_ver version; } buf; - int ret; + memset(&buf, 0, sizeof(buf)); SCPI_SETUP_DBUF(sdata, mdata, SCPI_CL_SYS, SCPI_SYS_GET_VERSION, old, buf); ret = scpi_execute_cmd(&sdata); - if (ret) - *ver = buf.ver; + if (ret) { + pr_err("get scpi version from MCU failed, ret=%d\n", ret); + goto OUT; + } + memcpy(ver, &(buf.version), sizeof(*ver)); + +OUT: return ret; } @@ -674,35 +685,42 @@ static int mobx_scpi_probe(struct platform_device *pdev) { int ret = 0; int retry = 3; - u32 ver = 0; - int check_version = 0; /*0: not check version, 1: check version*/ int val = 0; + struct scpi_mcu_ver mcu_ver; + int check_version = 1; /*0: not check version, 1: check version*/ the_scpi_device = &pdev->dev; + /* try to get mboxes chan nums from DT */ + if (of_property_read_u32((&pdev->dev)->of_node, "chan-nums", &val)) { + dev_err(&pdev->dev, "parse mboxes chan-nums failed\n"); + ret = -EINVAL; + goto exit; + } + + max_chan_num = val; + + /* try to check up with SCPI version from MCU */ while ((retry--) && (check_version != 0)) { - ret = scpi_get_version(SCPI_VERSION, &ver); - if ((ret == 0) && (ver == SCPI_VERSION)) + memset(&mcu_ver, 0, sizeof(mcu_ver)); + + ret = scpi_get_version(SCPI_VERSION, &mcu_ver); + if ((ret == 0) && (mcu_ver.scpi_ver == SCPI_VERSION)) break; } if ((retry <= 0) && (check_version != 0)) { - dev_err(&pdev->dev, "Failed to get scpi version\n"); + dev_err(&pdev->dev, + "Scpi verison not match:kernel ver:0x%x, MCU ver:0x%x, ret=%d\n", + SCPI_VERSION, mcu_ver.scpi_ver, ret); ret = -EIO; goto exit; } - /* try to get mboxes chan nums from DT */ - if (of_property_read_u32((&pdev->dev)->of_node, "chan-nums", &val)) { - dev_err(&pdev->dev, "parse mboxes chan-nums failed\n"); - ret = -EINVAL; - goto exit; - } - - max_chan_num = val; + dev_info(&pdev->dev, "Scpi initialize, version: 0x%x, chan nums: %d\n", + mcu_ver.scpi_ver, val); + dev_info(&pdev->dev, "MCU version: %s\n", mcu_ver.mcu_ver); - dev_info(&pdev->dev, - "Scpi initialize, version: 0x%x, chan nums: %d\n", ver, val); return 0; exit: the_scpi_device = NULL; -- 2.34.1