diff --git a/drivers/i3c/master/i3c-master-qcom-geni.c b/drivers/i3c/master/i3c-master-qcom-geni.c index 3d8e1e1daf68..3d9fc7858820 100644 --- a/drivers/i3c/master/i3c-master-qcom-geni.c +++ b/drivers/i3c/master/i3c-master-qcom-geni.c @@ -244,6 +244,15 @@ struct rcvd_ibi_data { u32 payload; }; + +struct geni_i3c_ver_info { + int hw_major_ver; + int hw_minor_ver; + int hw_step_ver; + int m_fw_ver; + int s_fw_ver; +}; + struct geni_ibi { bool hw_support; bool is_init; @@ -283,6 +292,7 @@ struct geni_i3c_dev { struct work_struct hj_wd; struct wakeup_source *hj_wl; struct pinctrl_state *i3c_gpio_disable; + struct geni_i3c_ver_info ver_info; }; struct geni_i3c_i2c_dev_data { @@ -1990,6 +2000,26 @@ static int i3c_ibi_rsrcs_init(struct geni_i3c_dev *gi3c, return 0; } +static void geni_i3c_get_ver_info(struct geni_i3c_dev *gi3c) +{ + int hw_ver; + unsigned int major, minor, step; + + hw_ver = geni_se_qupv3_hw_version(gi3c->se.i3c_rsc.wrapper_dev, + &major, &minor, &step); + if (hw_ver) + GENI_SE_ERR(gi3c->ipcl, true, gi3c->se.dev, + "%s:Error reading HW version %d\n", __func__, hw_ver); + else + GENI_SE_DBG(gi3c->ipcl, false, gi3c->se.dev, + "%s:Major:%d Minor:%d step:%d\n", __func__, major, minor, step); + + gi3c->ver_info.m_fw_ver = get_se_m_fw(gi3c->se.base); + gi3c->ver_info.s_fw_ver = get_se_s_fw(gi3c->se.base); + GENI_SE_DBG(gi3c->ipcl, false, gi3c->se.dev, "%s:FW Ver:0x%x%x\n", + __func__, gi3c->ver_info.m_fw_ver, gi3c->ver_info.s_fw_ver); +} + static int geni_i3c_probe(struct platform_device *pdev) { struct geni_i3c_dev *gi3c; @@ -2059,6 +2089,8 @@ static int geni_i3c_probe(struct platform_device *pdev) "Invalid proto %d\n", proto); ret = -ENXIO; goto geni_resources_off; + } else { + geni_i3c_get_ver_info(gi3c); } se_mode = geni_read_reg(gi3c->se.base, GENI_IF_FIFO_DISABLE_RO);