All of lore.kernel.org
 help / color / mirror / Atom feed
From: Martin Hecht <mhecht73@gmail.com>
To: Sakari Ailus <sakari.ailus@linux.intel.com>
Cc: michael.roeder@avnet.eu, martin.hecht@avnet.eu,
	Tommaso Merciai <tomm.merciai@gmail.com>,
	Mauro Carvalho Chehab <mchehab@kernel.org>,
	linux-kernel@vger.kernel.org,
	Ricardo Ribalda <ribalda@chromium.org>
Subject: Re: [PATCH v2] media: i2c: alvium: Accelerated alvium_set_power
Date: Wed, 10 Sep 2025 19:17:01 +0200	[thread overview]
Message-ID: <7f095cde-cefc-4259-9f7d-9de17c12758b@gmail.com> (raw)
In-Reply-To: <aMGUoQMGZ12oBnpa@kekkonen.localdomain>

Hi Sakari,

thank you for your feedback. Please ignore v3 because overlap. I will 
adopt your proposal and send v4. Nevertheless I'm in conversation with 
Ricardo because some eventually misleading feedback from CI to learn how 
to deal with that.

BR Martin

On 9/10/25 17:09, Sakari Ailus wrote:
> Hi Martin,
> 
> On Tue, Sep 09, 2025 at 01:22:51PM +0200, Martin Hecht wrote:
>> Now alvium_set_power tests if Alvium is up and running already
>> instead of waiting for the period of a full reboot. This safes
>> about 5-7 seconds delay for each connected camera what is already
>> booted especially when using multiple Alvium cameras or using
>> camera arrays.
>> The new function alvium_check is used by read_poll_timeout to check
>> whether a camera is connected on I2C and if it responds already.
>>
>> Signed-off-by: Martin Hecht <mhecht73@gmail.com>
>> ---
>> v2:
>> - added alvium_check to be used by read_poll_timeout as
>>    suggested by Sakari
>> ---
>>   drivers/media/i2c/alvium-csi2.c | 32 +++++++++++++++++++++++++-------
>>   1 file changed, 25 insertions(+), 7 deletions(-)
>>
>> diff --git a/drivers/media/i2c/alvium-csi2.c b/drivers/media/i2c/alvium-csi2.c
>> index 5c1bab574394..c63af96d3b31 100644
>> --- a/drivers/media/i2c/alvium-csi2.c
>> +++ b/drivers/media/i2c/alvium-csi2.c
>> @@ -443,10 +443,8 @@ static int alvium_is_alive(struct alvium_dev *alvium)
>>   
>>   	alvium_read(alvium, REG_BCRM_MINOR_VERSION_R, &bcrm, &ret);
>>   	alvium_read(alvium, REG_BCRM_HEARTBEAT_RW, &hbeat, &ret);
>> -	if (ret)
>> -		return ret;
>>   
>> -	return hbeat;
>> +	return ret;
>>   }
>>   
>>   static void alvium_print_avail_mipi_fmt(struct alvium_dev *alvium)
>> @@ -2364,8 +2362,25 @@ static int alvium_get_dt_data(struct alvium_dev *alvium)
>>   	return -EINVAL;
>>   }
>>   
>> +static int alvium_check(struct alvium_dev *alvium, u64 *bcrm_major)
>> +{
>> +	struct device *dev = &alvium->i2c_client->dev;
>> +	int ret = 0;
> 
> No need to assign ret here.
> 
>> +
>> +	ret = alvium_read(alvium, REG_BCRM_MAJOR_VERSION_R, bcrm_major, NULL);
>> +
> 
> No need for an empty line here.
> 
> But see below...
> 
>> +	if (ret)
>> +		return ret;
>> +
>> +	if (*bcrm_major != 0)
>> +		return 0;
>> +
>> +	return -ENODEV;
>> +}
>> +
>>   static int alvium_set_power(struct alvium_dev *alvium, bool on)
>>   {
>> +	u64 bcrm_major = 0;
>>   	int ret;
>>   
>>   	if (!on)
>> @@ -2375,9 +2390,12 @@ static int alvium_set_power(struct alvium_dev *alvium, bool on)
>>   	if (ret)
>>   		return ret;
>>   
>> -	/* alvium boot time 7s */
>> -	msleep(7000);
>> -	return 0;
>> +	/* alvium boot time is up to 7.5s but test if its available already */
>> +	read_poll_timeout(alvium_check, bcrm_major, (bcrm_major == 0),
>> +		250000, 7500000, false,
>> +		alvium, &bcrm_major);
> 
> I presume bcrm_major needs to be non-zero to proceed rather than zero?
> 
> I think you could also do:
> 
> 	read_poll_timeout(alvium_read, ret, !ret && brcm_major, 250000, 7500000,
> 			  false, alvium, REG_BCRM_MAJOR_VERSION_R, bcrm_major,
> 			  NULL);
> 
> 	return ret ?: brcm_major ? 0 : -ENODEV;
> 
>> +
>> +	return ret;
>>   }
>>   
>>   static int alvium_runtime_resume(struct device *dev)
>> @@ -2442,7 +2460,7 @@ static int alvium_probe(struct i2c_client *client)
>>   	if (ret)
>>   		goto err_powerdown;
>>   
>> -	if (!alvium_is_alive(alvium)) {
>> +	if (alvium_is_alive(alvium)) {
> 
> If you prefer to change this, then I'd assign the return value to ret, as
> returned by alvium_read() and use it as the error code here, too. But this
> should be a separate patch.
> 
>>   		ret = -ENODEV;
>>   		dev_err_probe(dev, ret, "Device detection failed\n");
>>   		goto err_powerdown;
> 


  reply	other threads:[~2025-09-10 17:17 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-09-09 11:22 [PATCH v2] media: i2c: alvium: Accelerated alvium_set_power Martin Hecht
2025-09-10  2:31 ` kernel test robot
2025-09-10 15:09 ` Sakari Ailus
2025-09-10 17:17   ` Martin Hecht [this message]
2025-09-11  6:39     ` Sakari Ailus

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=7f095cde-cefc-4259-9f7d-9de17c12758b@gmail.com \
    --to=mhecht73@gmail.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=martin.hecht@avnet.eu \
    --cc=mchehab@kernel.org \
    --cc=michael.roeder@avnet.eu \
    --cc=ribalda@chromium.org \
    --cc=sakari.ailus@linux.intel.com \
    --cc=tomm.merciai@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.