[PATCH] libcamera: Add open() and close() in CameraLens

Hans de Goede hdegoede at redhat.com
Wed Oct 23 12:25:34 CEST 2024


Hi,

On 23-Oct-24 11:20 AM, Cheng-Hao Yang wrote:
> Hi Kieran and Laurent,
> 
> On Mon, Oct 21, 2024 at 12:08 AM Laurent Pinchart
> <laurent.pinchart at ideasonboard.com> wrote:
>>
>> CC'ing Sakari.
>>
>> On Sat, Oct 19, 2024 at 11:32:02PM +0100, Kieran Bingham wrote:
>>> Quoting Harvey Yang (2024-10-17 08:39:47)
>>>> From: Han-Lin Chen <hanlinchen at chromium.org>
>>>>
>>>> This allows pipeline handlers to save some power when a camera is close.
>>>
>>> This seems reasonable - but makes me wonder - is there similar
>>> limitations with the CameraSensor class that has a very similar design?
>>
>> I think it's time to bite the bullet and see how to address the issue of
>> power management of lens controllers in the kernel. Tying it to open()
>> and close() isn't necessarily a great option.
> 
> Han-lin told me that CameraLens is a special case of
> V4L2Subdevice (at least in mtkisp7), that it's powered on when opened.
> Other ones like CameraSensor's `subdev_` might be powered on when
> the V4L2VideoDevice that receives buffers are `streamOn`ed. Just FYI.

Right, but what Laurent is proposing is changing the kernel
so that just opening the /dev/v4l20-subdev device for the VCM
will no longer power it up.

I submitted a possible proposal for this here:

https://lore.kernel.org/linux-media/20240901211834.145186-1-hdegoede@redhat.com/

Note that Laurent was not a fan of the approach taken there, so
this needs more discussion and unfortunately I have not been able
to make the time to reply to Laurent about this yet.

I'll try to make time to reply to Laurent about this today.

Regards,

Hans




> 
>>
>>>> Signed-off-by: Han-Lin Chen <hanlinchen at chromium.org>
>>>> Co-developed-by: Harvey Yang <chenghaoyang at chromium.org>
>>>> Signed-off-by: Harvey Yang <chenghaoyang at chromium.org>
>>>> ---
>>>>  include/libcamera/internal/camera_lens.h |  4 ++++
>>>>  src/libcamera/camera_lens.cpp            | 17 +++++++++++++++++
>>>>  2 files changed, 21 insertions(+)
>>>>
>>>> diff --git a/include/libcamera/internal/camera_lens.h b/include/libcamera/internal/camera_lens.h
>>>> index 5a4b993bb..095056791 100644
>>>> --- a/include/libcamera/internal/camera_lens.h
>>>> +++ b/include/libcamera/internal/camera_lens.h
>>>> @@ -26,6 +26,10 @@ public:
>>>>         ~CameraLens();
>>>>
>>>>         int init();
>>>
>>> Should we be calling close() at the end of init()? Perhaps with some
>>> sort of way to make sure if an API call is used on a now closed device
>>> it gets opened again first ? (i.e. mostly perhaps V4L2Device::setControls)?
> 
> Hmm, in the current API, I don't see function calls that "start" to use
> CameraLens.
> 
> BR,
> Harvey
> 
>>>
>>>> +
>>>> +       int open();
>>>> +       void close();
>>>> +
>>>>         int setFocusPosition(int32_t position);
>>>>
>>>>         const std::string &model() const { return model_; }
>>>> diff --git a/src/libcamera/camera_lens.cpp b/src/libcamera/camera_lens.cpp
>>>> index ccc2a6a65..039f5ad2a 100644
>>>> --- a/src/libcamera/camera_lens.cpp
>>>> +++ b/src/libcamera/camera_lens.cpp
>>>> @@ -76,6 +76,23 @@ int CameraLens::init()
>>>>         return 0;
>>>>  }
>>>>
>>>> +/**
>>>> + * \brief Open the subdev
>>>> + * \return 0 on success or a negative error code otherwise
>>>> + */
>>>> +int CameraLens::open()
>>>> +{
>>>> +       return subdev_->open();
>>>> +}
>>>> +
>>>> +/**
>>>> + * \brief Close the subdev
>>>> + */
>>>> +void CameraLens::close()
>>>> +{
>>>> +       subdev_->close();
>>>> +}
>>>> +
>>>>  /**
>>>>   * \brief This function sets the focal point of the lens to a specific position.
>>>>   * \param[in] position The focal point of the lens
>>
>> --
>> Regards,
>>
>> Laurent Pinchart
> 



More information about the libcamera-devel mailing list