From 6542cc7762d7363d514ba436f552dfaee47bb26e Mon Sep 17 00:00:00 2001 From: Cai Wenzhong Date: Tue, 5 Aug 2025 14:33:16 +0800 Subject: [PATCH] media: i2c: maxim: driver version v3.10.00 Signed-off-by: Cai Wenzhong Change-Id: Ib88178d5fd02484342a3b848db32d457c3fa3034 --- .../i2c/maxim/local/maxim2c/maxim2c_api.h | 3 - .../i2c/maxim/local/maxim2c/maxim2c_drv.c | 56 ++++++++++--------- .../i2c/maxim/local/maxim2c/maxim2c_drv.h | 1 + .../i2c/maxim/local/maxim2c/maxim2c_pattern.c | 7 +++ .../i2c/maxim/local/maxim2c/maxim2c_v4l2.c | 24 ++++---- .../i2c/maxim/local/maxim4c/maxim4c_api.h | 3 - .../i2c/maxim/local/maxim4c/maxim4c_drv.c | 56 ++++++++++--------- .../i2c/maxim/local/maxim4c/maxim4c_drv.h | 1 + .../i2c/maxim/local/maxim4c/maxim4c_pattern.c | 7 +++ .../i2c/maxim/local/maxim4c/maxim4c_v4l2.c | 24 ++++---- 10 files changed, 100 insertions(+), 82 deletions(-) diff --git a/drivers/media/i2c/maxim/local/maxim2c/maxim2c_api.h b/drivers/media/i2c/maxim/local/maxim2c/maxim2c_api.h index d954db1c28fe..f682ebb1b65e 100644 --- a/drivers/media/i2c/maxim/local/maxim2c/maxim2c_api.h +++ b/drivers/media/i2c/maxim/local/maxim2c/maxim2c_api.h @@ -24,9 +24,6 @@ /* Maxim Deserializer Test Pattern */ #define MAXIM2C_TEST_PATTERN 0 -/* Maxim Deserializer pwdn on/off enable */ -#define MAXIM2C_LOCAL_DES_ON_OFF_EN 0 - /* maxim2c i2c mux api */ int maxim2c_i2c_mux_enable(maxim2c_t *maxim2c, u8 def_mask); int maxim2c_i2c_mux_disable(maxim2c_t *maxim2c); diff --git a/drivers/media/i2c/maxim/local/maxim2c/maxim2c_drv.c b/drivers/media/i2c/maxim/local/maxim2c/maxim2c_drv.c index 2564d148e94e..df4ddcd86aa9 100644 --- a/drivers/media/i2c/maxim/local/maxim2c/maxim2c_drv.c +++ b/drivers/media/i2c/maxim/local/maxim2c/maxim2c_drv.c @@ -69,6 +69,9 @@ * fix lockdep debug warning. * 2. fix compile warning when MAXIM2C_LOCAL_DES_ON_OFF_EN enable. * + * V3.10.00 + * 1. local pwdn on/off enable replace MAXIM4C_LOCAL_DES_ON_OFF_EN with local_power_off_enable + * */ #include #include @@ -96,7 +99,7 @@ #include "maxim2c_api.h" -#define DRIVER_VERSION KERNEL_VERSION(3, 0x09, 0x01) +#define DRIVER_VERSION KERNEL_VERSION(3, 0x10, 0x00) #define MAXIM2C_NAME "maxim2c" @@ -419,44 +422,40 @@ static void maxim2c_device_power_off(maxim2c_t *maxim2c) static int maxim2c_runtime_resume(struct device *dev) { -#if MAXIM2C_LOCAL_DES_ON_OFF_EN struct i2c_client *client = to_i2c_client(dev); struct v4l2_subdev *sd = i2c_get_clientdata(client); maxim2c_t *maxim2c = v4l2_get_subdevdata(sd); - int ret = 0; - ret |= maxim2c_device_power_on(maxim2c); + if (maxim2c->local_power_off_enable == 0) + return 0; - return ret; -#else - return 0; -#endif /* MAXIM2C_LOCAL_DES_ON_OFF_EN */ + return maxim2c_device_power_on(maxim2c); } static int maxim2c_runtime_suspend(struct device *dev) { -#if MAXIM2C_LOCAL_DES_ON_OFF_EN struct i2c_client *client = to_i2c_client(dev); struct v4l2_subdev *sd = i2c_get_clientdata(client); maxim2c_t *maxim2c = v4l2_get_subdevdata(sd); - int ret = 0; + + if (maxim2c->local_power_off_enable == 0) + return 0; maxim2c_device_power_off(maxim2c); - return ret; -#else return 0; -#endif /* MAXIM2C_LOCAL_DES_ON_OFF_EN */ } static int __maybe_unused maxim2c_resume(struct device *dev) { -#if (MAXIM2C_LOCAL_DES_ON_OFF_EN == 0) struct i2c_client *client = to_i2c_client(dev); struct v4l2_subdev *sd = i2c_get_clientdata(client); maxim2c_t *maxim2c = v4l2_get_subdevdata(sd); int ret = 0; + if (maxim2c->local_power_off_enable == 0) + return 0; + dev_info(dev, "maxim2c resume\n"); #if MAXIM2C_TEST_PATTERN @@ -472,7 +471,6 @@ static int __maybe_unused maxim2c_resume(struct device *dev) return ret; } #endif /* MAXIM2C_TEST_PATTERN */ -#endif /* MAXIM2C_LOCAL_DES_ON_OFF_EN */ return 0; } @@ -550,6 +548,12 @@ static int maxim2c_module_parse_dt(maxim2c_t *maxim2c) return -ENODEV; } + ret = of_property_read_u32(node, "local-power-off-enable", &value); + if (ret == 0) { + dev_info(dev, "local-power-off-enable property: %d\n", value); + maxim2c->local_power_off_enable = value; + } + ret = of_property_read_u32(node, "remote-routing-to-isp", &value); if (ret == 0) { dev_info(dev, "remote-routing-to-isp property: %d\n", value); @@ -789,13 +793,13 @@ static int maxim2c_probe(struct i2c_client *client, #if MAXIM2C_TEST_PATTERN ret = maxim2c_pattern_data_init(maxim2c); if (ret) - goto err_power_off; + goto err_subdev_deinit; -#if (MAXIM2C_LOCAL_DES_ON_OFF_EN == 0) - ret = maxim2c_pattern_hw_init(maxim2c); - if (ret) - goto err_power_off; -#endif /* MAXIM2C_LOCAL_DES_ON_OFF_EN */ + if (maxim2c->local_power_off_enable == 0) { + ret = maxim2c_pattern_hw_init(maxim2c); + if (ret) + goto err_subdev_deinit; + } pm_runtime_set_autosuspend_delay(dev, 1000); pm_runtime_use_autosuspend(dev); @@ -808,11 +812,11 @@ static int maxim2c_probe(struct i2c_client *client, maxim2c_module_data_init(maxim2c); maxim2c_module_parse_dt(maxim2c); -#if (MAXIM2C_LOCAL_DES_ON_OFF_EN == 0) - ret = maxim2c_module_hw_init(maxim2c); - if (ret) - goto err_subdev_deinit; -#endif /* MAXIM2C_LOCAL_DES_ON_OFF_EN */ + if (maxim2c->local_power_off_enable == 0) { + ret = maxim2c_module_hw_init(maxim2c); + if (ret) + goto err_subdev_deinit; + } ret = maxim2c_i2c_mux_init(maxim2c); if (ret) diff --git a/drivers/media/i2c/maxim/local/maxim2c/maxim2c_drv.h b/drivers/media/i2c/maxim/local/maxim2c/maxim2c_drv.h index b961cb0f0750..34204ebf004d 100644 --- a/drivers/media/i2c/maxim/local/maxim2c/maxim2c_drv.h +++ b/drivers/media/i2c/maxim/local/maxim2c/maxim2c_drv.h @@ -104,6 +104,7 @@ typedef struct maxim2c { u32 chipid; + bool local_power_off_enable; bool remote_routing_to_isp; bool streaming; diff --git a/drivers/media/i2c/maxim/local/maxim2c/maxim2c_pattern.c b/drivers/media/i2c/maxim/local/maxim2c/maxim2c_pattern.c index a0c4d02eac23..da92f992c96f 100644 --- a/drivers/media/i2c/maxim/local/maxim2c/maxim2c_pattern.c +++ b/drivers/media/i2c/maxim/local/maxim2c/maxim2c_pattern.c @@ -253,6 +253,7 @@ int maxim2c_pattern_data_init(maxim2c_t *maxim2c) struct maxim2c_mode *supported_mode = NULL; struct maxim2c_pattern *pattern = NULL; maxim2c_mipi_txphy_t *mipi_txphy = &maxim2c->mipi_txphy; + u32 value = 0; int ret = 0; // maxim serdes local @@ -270,6 +271,12 @@ int maxim2c_pattern_data_init(maxim2c_t *maxim2c) return -ENODEV; } + ret = of_property_read_u32(node, "local-power-off-enable", &value); + if (ret == 0) { + dev_info(dev, "local-power-off-enable property: %d\n", value); + maxim2c->local_power_off_enable = value; + } + maxim2c_mipi_txphy_data_init(maxim2c); /* mipi txphy parse dt */ diff --git a/drivers/media/i2c/maxim/local/maxim2c/maxim2c_v4l2.c b/drivers/media/i2c/maxim/local/maxim2c/maxim2c_v4l2.c index 83729a942428..0f5355868926 100644 --- a/drivers/media/i2c/maxim/local/maxim2c/maxim2c_v4l2.c +++ b/drivers/media/i2c/maxim/local/maxim2c/maxim2c_v4l2.c @@ -635,21 +635,21 @@ static int __maxim2c_start_stream(maxim2c_t *maxim2c) u8 link_mask = 0, link_freq_idx = 0; u8 video_pipe_mask = 0; -#if MAXIM2C_LOCAL_DES_ON_OFF_EN + if (maxim2c->local_power_off_enable != 0) { #if MAXIM2C_TEST_PATTERN - ret = maxim2c_pattern_hw_init(maxim2c); - if (ret) { - dev_err(dev, "test pattern hw init error\n"); - return ret; - } + ret = maxim2c_pattern_hw_init(maxim2c); + if (ret) { + dev_err(dev, "test pattern hw init error\n"); + return ret; + } #else - ret = maxim2c_module_hw_init(maxim2c); - if (ret) { - dev_err(dev, "maxim2c module hw init error\n"); - return ret; - } + ret = maxim2c_module_hw_init(maxim2c); + if (ret) { + dev_err(dev, "maxim2c module hw init error\n"); + return ret; + } #endif /* MAXIM2C_TEST_PATTERN */ -#endif /* MAXIM2C_LOCAL_DES_ON_OFF_EN */ + } link_mask = maxim2c->gmsl_link.link_enable_mask; video_pipe_mask = maxim2c->video_pipe.pipe_enable_mask; diff --git a/drivers/media/i2c/maxim/local/maxim4c/maxim4c_api.h b/drivers/media/i2c/maxim/local/maxim4c/maxim4c_api.h index 4944595ce43e..8feb5e466cc6 100644 --- a/drivers/media/i2c/maxim/local/maxim4c/maxim4c_api.h +++ b/drivers/media/i2c/maxim/local/maxim4c/maxim4c_api.h @@ -24,9 +24,6 @@ /* Maxim Deserializer Test Pattern */ #define MAXIM4C_TEST_PATTERN 0 -/* Maxim Deserializer pwdn on/off enable */ -#define MAXIM4C_LOCAL_DES_ON_OFF_EN 0 - /* maxim4c i2c mux api */ int maxim4c_i2c_mux_enable(maxim4c_t *maxim4c, u8 def_mask); int maxim4c_i2c_mux_disable(maxim4c_t *maxim4c); diff --git a/drivers/media/i2c/maxim/local/maxim4c/maxim4c_drv.c b/drivers/media/i2c/maxim/local/maxim4c/maxim4c_drv.c index 505fe2413ca9..aaf3ec79803a 100644 --- a/drivers/media/i2c/maxim/local/maxim4c/maxim4c_drv.c +++ b/drivers/media/i2c/maxim/local/maxim4c/maxim4c_drv.c @@ -92,6 +92,9 @@ * fix lockdep debug warning. * 2. fix compile warning when MAXIM4C_LOCAL_DES_ON_OFF_EN enable. * + * V3.10.00 + * 1. local pwdn on/off enable replace MAXIM4C_LOCAL_DES_ON_OFF_EN with local_power_off_enable + * */ #include #include @@ -119,7 +122,7 @@ #include "maxim4c_api.h" -#define DRIVER_VERSION KERNEL_VERSION(3, 0x09, 0x01) +#define DRIVER_VERSION KERNEL_VERSION(3, 0x10, 0x00) #define MAXIM4C_NAME "maxim4c" @@ -494,44 +497,40 @@ static void maxim4c_device_power_off(maxim4c_t *maxim4c) static int maxim4c_runtime_resume(struct device *dev) { -#if MAXIM4C_LOCAL_DES_ON_OFF_EN struct i2c_client *client = to_i2c_client(dev); struct v4l2_subdev *sd = i2c_get_clientdata(client); maxim4c_t *maxim4c = v4l2_get_subdevdata(sd); - int ret = 0; - ret |= maxim4c_device_power_on(maxim4c); + if (maxim4c->local_power_off_enable == 0) + return 0; - return ret; -#else - return 0; -#endif /* MAXIM4C_LOCAL_DES_ON_OFF_EN */ + return maxim4c_device_power_on(maxim4c); } static int maxim4c_runtime_suspend(struct device *dev) { -#if MAXIM4C_LOCAL_DES_ON_OFF_EN struct i2c_client *client = to_i2c_client(dev); struct v4l2_subdev *sd = i2c_get_clientdata(client); maxim4c_t *maxim4c = v4l2_get_subdevdata(sd); - int ret = 0; + + if (maxim4c->local_power_off_enable == 0) + return 0; maxim4c_device_power_off(maxim4c); - return ret; -#else return 0; -#endif /* MAXIM4C_LOCAL_DES_ON_OFF_EN */ } static int __maybe_unused maxim4c_resume(struct device *dev) { -#if (MAXIM4C_LOCAL_DES_ON_OFF_EN == 0) struct i2c_client *client = to_i2c_client(dev); struct v4l2_subdev *sd = i2c_get_clientdata(client); maxim4c_t *maxim4c = v4l2_get_subdevdata(sd); int ret = 0; + if (maxim4c->local_power_off_enable == 0) + return 0; + dev_info(dev, "maxim4c resume\n"); #if MAXIM4C_TEST_PATTERN @@ -547,7 +546,6 @@ static int __maybe_unused maxim4c_resume(struct device *dev) return ret; } #endif /* MAXIM4C_TEST_PATTERN */ -#endif /* MAXIM4C_LOCAL_DES_ON_OFF_EN */ return 0; } @@ -625,6 +623,12 @@ static int maxim4c_module_parse_dt(maxim4c_t *maxim4c) return -ENODEV; } + ret = of_property_read_u32(node, "local-power-off-enable", &value); + if (ret == 0) { + dev_info(dev, "local-power-off-enable property: %d\n", value); + maxim4c->local_power_off_enable = value; + } + ret = of_property_read_u32(node, "remote-routing-to-isp", &value); if (ret == 0) { dev_info(dev, "remote-routing-to-isp property: %d\n", value); @@ -856,13 +860,13 @@ static int maxim4c_probe(struct i2c_client *client, #if MAXIM4C_TEST_PATTERN ret = maxim4c_pattern_data_init(maxim4c); if (ret) - goto err_power_off; + goto err_subdev_deinit; -#if (MAXIM4C_LOCAL_DES_ON_OFF_EN == 0) - ret = maxim4c_pattern_hw_init(maxim4c); - if (ret) - goto err_power_off; -#endif /* MAXIM4C_LOCAL_DES_ON_OFF_EN */ + if (maxim4c->local_power_off_enable == 0) { + ret = maxim4c_pattern_hw_init(maxim4c); + if (ret) + goto err_subdev_deinit; + } pm_runtime_set_autosuspend_delay(dev, 1000); pm_runtime_use_autosuspend(dev); @@ -879,11 +883,11 @@ static int maxim4c_probe(struct i2c_client *client, if (ret) goto err_subdev_deinit; -#if (MAXIM4C_LOCAL_DES_ON_OFF_EN == 0) - ret = maxim4c_module_hw_init(maxim4c); - if (ret) - goto err_dbgfs_deinit; -#endif /* MAXIM4C_LOCAL_DES_ON_OFF_EN */ + if (maxim4c->local_power_off_enable == 0) { + ret = maxim4c_module_hw_init(maxim4c); + if (ret) + goto err_dbgfs_deinit; + } ret = maxim4c_i2c_mux_init(maxim4c); if (ret) diff --git a/drivers/media/i2c/maxim/local/maxim4c/maxim4c_drv.h b/drivers/media/i2c/maxim/local/maxim4c/maxim4c_drv.h index 18ec7828d0f7..543907b0e5d0 100644 --- a/drivers/media/i2c/maxim/local/maxim4c/maxim4c_drv.h +++ b/drivers/media/i2c/maxim/local/maxim4c/maxim4c_drv.h @@ -104,6 +104,7 @@ typedef struct maxim4c { u32 chipid; + bool local_power_off_enable; bool remote_routing_to_isp; bool streaming; diff --git a/drivers/media/i2c/maxim/local/maxim4c/maxim4c_pattern.c b/drivers/media/i2c/maxim/local/maxim4c/maxim4c_pattern.c index 1ea4e2eeecf1..de402b01ab15 100644 --- a/drivers/media/i2c/maxim/local/maxim4c/maxim4c_pattern.c +++ b/drivers/media/i2c/maxim/local/maxim4c/maxim4c_pattern.c @@ -274,6 +274,7 @@ int maxim4c_pattern_data_init(maxim4c_t *maxim4c) struct maxim4c_mode *supported_mode = NULL; struct maxim4c_pattern *pattern = NULL; maxim4c_mipi_txphy_t *mipi_txphy = &maxim4c->mipi_txphy; + u32 value = 0; int ret = 0; // maxim serdes local @@ -291,6 +292,12 @@ int maxim4c_pattern_data_init(maxim4c_t *maxim4c) return -ENODEV; } + ret = of_property_read_u32(node, "local-power-off-enable", &value); + if (ret == 0) { + dev_info(dev, "local-power-off-enable property: %d\n", value); + maxim4c->local_power_off_enable = value; + } + maxim4c_mipi_txphy_data_init(maxim4c); /* mipi txphy parse dt */ diff --git a/drivers/media/i2c/maxim/local/maxim4c/maxim4c_v4l2.c b/drivers/media/i2c/maxim/local/maxim4c/maxim4c_v4l2.c index 754f36008117..40510cfd465d 100644 --- a/drivers/media/i2c/maxim/local/maxim4c/maxim4c_v4l2.c +++ b/drivers/media/i2c/maxim/local/maxim4c/maxim4c_v4l2.c @@ -635,21 +635,21 @@ static int __maxim4c_start_stream(maxim4c_t *maxim4c) u8 link_mask = 0, link_freq_idx = 0; u8 video_pipe_mask = 0; -#if MAXIM4C_LOCAL_DES_ON_OFF_EN + if (maxim4c->local_power_off_enable != 0) { #if MAXIM4C_TEST_PATTERN - ret = maxim4c_pattern_hw_init(maxim4c); - if (ret) { - dev_err(dev, "test pattern hw init error\n"); - return ret; - } + ret = maxim4c_pattern_hw_init(maxim4c); + if (ret) { + dev_err(dev, "test pattern hw init error\n"); + return ret; + } #else - ret = maxim4c_module_hw_init(maxim4c); - if (ret) { - dev_err(dev, "maxim4c module hw init error\n"); - return ret; - } + ret = maxim4c_module_hw_init(maxim4c); + if (ret) { + dev_err(dev, "maxim4c module hw init error\n"); + return ret; + } #endif /* MAXIM4C_TEST_PATTERN */ -#endif /* MAXIM4C_LOCAL_DES_ON_OFF_EN */ + } link_mask = maxim4c->gmsl_link.link_enable_mask; video_pipe_mask = maxim4c->video_pipe.pipe_enable_mask;