From ea5440f147d6beff6ea1768d3f50ac92ba27f69b Mon Sep 17 00:00:00 2001 From: Junghyun Kim Date: Sun, 20 Oct 2024 17:42:09 +0000 Subject: [PATCH] cdi: Add fsync_ctrl_port variable Parse fsync_ctrl_port property in DT to overwrite FSYNC control GPIO port of IO expander JIRA CAMERASW-29219 Change-Id: I2311739d0460ad0601e1e40990201a4c0fd01ded Reviewed-on: https://git-master.nvidia.com/r/c/linux-nv-oot/+/3233562 Tested-by: Justin Kim (SW-TEGRA) GVS: buildbot_gerritrpt Reviewed-by: Chinmay Mahajan Reviewed-by: Frank Chen --- .../media/platform/tegra/cdi/cdi-tca-priv.h | 1 + drivers/media/platform/tegra/cdi/cdi_dev.c | 21 +++++++++++++++++-- drivers/media/platform/tegra/cdi/cdi_mgr.c | 12 +++++++++++ 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/drivers/media/platform/tegra/cdi/cdi-tca-priv.h b/drivers/media/platform/tegra/cdi/cdi-tca-priv.h index d569d689..8bbeee5f 100644 --- a/drivers/media/platform/tegra/cdi/cdi-tca-priv.h +++ b/drivers/media/platform/tegra/cdi/cdi-tca-priv.h @@ -15,6 +15,7 @@ struct tca9539_priv { u32 dat_len; u8 init_val[12]; u32 power_port; + u32 fsync_ctrl_port; bool enable; }; diff --git a/drivers/media/platform/tegra/cdi/cdi_dev.c b/drivers/media/platform/tegra/cdi/cdi_dev.c index 7195b0d2..3cb59efb 100644 --- a/drivers/media/platform/tegra/cdi/cdi_dev.c +++ b/drivers/media/platform/tegra/cdi/cdi_dev.c @@ -431,6 +431,7 @@ static int cdi_dev_set_fsync_mux( void __user *arg) { u8 val, shift; + u8 cam_grp; struct cdi_dev_fsync_mux fsync_mux; if (copy_from_user(&fsync_mux, arg, sizeof(fsync_mux))) { @@ -445,9 +446,14 @@ static int cdi_dev_set_fsync_mux( * P05:P04 for the camera group D. cam_grp 3. */ if ((fsync_mux.cam_grp > 0U) && (fsync_mux.cam_grp < 4U)) { + if (info->tca9539.fsync_ctrl_port != -1) + cam_grp = info->tca9539.fsync_ctrl_port; + else + cam_grp = fsync_mux.cam_grp; + if (tca9539_rd(info, 0x02, &val) != 0) return -EFAULT; - switch (fsync_mux.cam_grp) { + switch (cam_grp) { case 1U: shift = 0U; break; @@ -581,6 +587,7 @@ static int cdi_dev_probe(struct i2c_client *client, int err; int numLinks = 0; int i; + u32 fsync_ctrl_port; dev_dbg(&client->dev, "%s: initializing link @%x-%04x\n", __func__, client->adapter->nr, client->addr); @@ -727,7 +734,17 @@ static int cdi_dev_probe(struct i2c_client *client, info->tca9539.power_port); return -ENODEV; } - + info->tca9539.fsync_ctrl_port = -1; + err = of_property_read_u32(child_tca9539, + "fsync_ctrl_port", + &fsync_ctrl_port); + if (err == 0) { + if ((fsync_ctrl_port >= 0) && + (fsync_ctrl_port <= 3)) { + info->tca9539.fsync_ctrl_port = + fsync_ctrl_port; + } + } info->tca9539.reg_len /= 8; info->tca9539.dat_len /= 8; info->tca9539.enable = 1; diff --git a/drivers/media/platform/tegra/cdi/cdi_mgr.c b/drivers/media/platform/tegra/cdi/cdi_mgr.c index a3b28a22..5252ae78 100644 --- a/drivers/media/platform/tegra/cdi/cdi_mgr.c +++ b/drivers/media/platform/tegra/cdi/cdi_mgr.c @@ -1721,6 +1721,7 @@ static int cdi_mgr_probe(struct platform_device *pdev) struct device_node *child_tca9539 = NULL; struct device_node *root_node = NULL; const char *model; + u32 fsync_ctrl_port; dev_info(&pdev->dev, "%sing...\n", __func__); @@ -1939,6 +1940,17 @@ static int cdi_mgr_probe(struct platform_device *pdev) cdi_mgr->tca9539.power_port); goto err_probe; } + cdi_mgr->tca9539.fsync_ctrl_port = -1; + err = of_property_read_u32(child_tca9539, + "fsync_ctrl_port", + &fsync_ctrl_port); + if (err == 0) { + if ((fsync_ctrl_port >= 0) && + (fsync_ctrl_port <= 3)) { + cdi_mgr->tca9539.fsync_ctrl_port = + fsync_ctrl_port; + } + } cdi_mgr->tca9539.reg_len /= 8; cdi_mgr->tca9539.dat_len /= 8;