[7/9] media: atomisp: gc0310: Remove gc0310_s_config() function
Commit Message
gc0310_s_config() used to call camera_sensor_platform_data.csi_cfg() back
when the gc0310 driver was still using the atomisp_gmin_platform code
for power-management.
Now it is just a weirdly named wrapper around gc0310_detect(), drop
gc0310_s_config() and make probe() call gc0310_detect() directly.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
.../media/atomisp/i2c/atomisp-gc0310.c | 20 +++++--------------
1 file changed, 5 insertions(+), 15 deletions(-)
Comments
On Thu, May 18, 2023 at 6:32 PM Hans de Goede <hdegoede@redhat.com> wrote:
>
> gc0310_s_config() used to call camera_sensor_platform_data.csi_cfg() back
> when the gc0310 driver was still using the atomisp_gmin_platform code
> for power-management.
>
> Now it is just a weirdly named wrapper around gc0310_detect(), drop
> gc0310_s_config() and make probe() call gc0310_detect() directly.
...
> - ret = i2c_smbus_read_word_swapped(client, GC0310_SC_CMMN_CHIP_ID_H);
> + ret = pm_runtime_get_sync(&client->dev);
> + if (ret >= 0)
> + ret = i2c_smbus_read_word_swapped(client, GC0310_SC_CMMN_CHIP_ID_H);
> + pm_runtime_put(&client->dev);
> if (ret < 0) {
> dev_err(&client->dev, "read sensor_id failed: %d\n", ret);
> return -ENODEV;
Not sure if it's good to have in this patch, but above can be cleaned up to
pm_runtime_get_sync(&client->dev);
ret = i2c_smbus_read_word_swapped(client, GC0310_SC_CMMN_CHIP_ID_H);
pm_runtime_put(&client->dev);
if (ret < 0) {
dev_err(&client->dev, "read sensor_id failed: %d\n", ret);
return ret;
}
But I don't know what will be the response on the I2C bus if the
device is powered off.
HI,
On 5/19/23 12:32, Andy Shevchenko wrote:
> On Thu, May 18, 2023 at 6:32 PM Hans de Goede <hdegoede@redhat.com> wrote:
>>
>> gc0310_s_config() used to call camera_sensor_platform_data.csi_cfg() back
>> when the gc0310 driver was still using the atomisp_gmin_platform code
>> for power-management.
>>
>> Now it is just a weirdly named wrapper around gc0310_detect(), drop
>> gc0310_s_config() and make probe() call gc0310_detect() directly.
>
> ...
>
>> - ret = i2c_smbus_read_word_swapped(client, GC0310_SC_CMMN_CHIP_ID_H);
>> + ret = pm_runtime_get_sync(&client->dev);
>> + if (ret >= 0)
>> + ret = i2c_smbus_read_word_swapped(client, GC0310_SC_CMMN_CHIP_ID_H);
>> + pm_runtime_put(&client->dev);
>> if (ret < 0) {
>> dev_err(&client->dev, "read sensor_id failed: %d\n", ret);
>> return -ENODEV;
>
> Not sure if it's good to have in this patch, but above can be cleaned up to
>
> pm_runtime_get_sync(&client->dev);
> ret = i2c_smbus_read_word_swapped(client, GC0310_SC_CMMN_CHIP_ID_H);
> pm_runtime_put(&client->dev);
> if (ret < 0) {
> dev_err(&client->dev, "read sensor_id failed: %d\n", ret);
> return ret;
> }
>
> But I don't know what will be the response on the I2C bus if the
> device is powered off.
In my experience the i2c bus tends to get stuck when using it with
the sensor powered down and unsticking it is tricky (seems to
require a full i2c-controller reset).
So it is best to not even try if the pm_runtime_get_sync() fails
for some reason.
Regards,
Hans
@@ -172,7 +172,10 @@ static int gc0310_detect(struct i2c_client *client)
if (!i2c_check_functionality(adapter, I2C_FUNC_I2C))
return -ENODEV;
- ret = i2c_smbus_read_word_swapped(client, GC0310_SC_CMMN_CHIP_ID_H);
+ ret = pm_runtime_get_sync(&client->dev);
+ if (ret >= 0)
+ ret = i2c_smbus_read_word_swapped(client, GC0310_SC_CMMN_CHIP_ID_H);
+ pm_runtime_put(&client->dev);
if (ret < 0) {
dev_err(&client->dev, "read sensor_id failed: %d\n", ret);
return -ENODEV;
@@ -261,19 +264,6 @@ static int gc0310_s_stream(struct v4l2_subdev *sd, int enable)
return ret;
}
-static int gc0310_s_config(struct v4l2_subdev *sd)
-{
- struct i2c_client *client = v4l2_get_subdevdata(sd);
- int ret;
-
- ret = pm_runtime_get_sync(&client->dev);
- if (ret >= 0)
- ret = gc0310_detect(client);
-
- pm_runtime_put(&client->dev);
- return ret;
-}
-
static int gc0310_g_frame_interval(struct v4l2_subdev *sd,
struct v4l2_subdev_frame_interval *interval)
{
@@ -403,7 +393,7 @@ static int gc0310_probe(struct i2c_client *client)
pm_runtime_set_autosuspend_delay(&client->dev, 1000);
pm_runtime_use_autosuspend(&client->dev);
- ret = gc0310_s_config(&dev->sd);
+ ret = gc0310_detect(client);
if (ret) {
gc0310_remove(client);
return ret;