[media] v4l: ctrls: Provide an unlocked variant of v4l2_ctrl_modify_range()
Drivers may use the v4l2_ctrl_modify_range() internally as part of other operations that need to be both serialised using a driver's lock which can also be used to serialise access to the control handler. Provide an unlocked version of the function, __v4l2_ctrl_modify_range() which then may be used by drivers for the purpose. Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com> Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com> Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
This commit is contained in:
parent
605b38403b
commit
5a57392515
|
@ -3213,12 +3213,14 @@ void v4l2_ctrl_notify(struct v4l2_ctrl *ctrl, v4l2_ctrl_notify_fnc notify, void
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(v4l2_ctrl_notify);
|
EXPORT_SYMBOL(v4l2_ctrl_notify);
|
||||||
|
|
||||||
int v4l2_ctrl_modify_range(struct v4l2_ctrl *ctrl,
|
int __v4l2_ctrl_modify_range(struct v4l2_ctrl *ctrl,
|
||||||
s64 min, s64 max, u64 step, s64 def)
|
s64 min, s64 max, u64 step, s64 def)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
struct v4l2_ext_control c;
|
struct v4l2_ext_control c;
|
||||||
|
|
||||||
|
lockdep_assert_held(ctrl->handler->lock);
|
||||||
|
|
||||||
switch (ctrl->type) {
|
switch (ctrl->type) {
|
||||||
case V4L2_CTRL_TYPE_INTEGER:
|
case V4L2_CTRL_TYPE_INTEGER:
|
||||||
case V4L2_CTRL_TYPE_INTEGER64:
|
case V4L2_CTRL_TYPE_INTEGER64:
|
||||||
|
@ -3237,7 +3239,6 @@ int v4l2_ctrl_modify_range(struct v4l2_ctrl *ctrl,
|
||||||
default:
|
default:
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
v4l2_ctrl_lock(ctrl);
|
|
||||||
ctrl->minimum = min;
|
ctrl->minimum = min;
|
||||||
ctrl->maximum = max;
|
ctrl->maximum = max;
|
||||||
ctrl->step = step;
|
ctrl->step = step;
|
||||||
|
@ -3249,10 +3250,9 @@ int v4l2_ctrl_modify_range(struct v4l2_ctrl *ctrl,
|
||||||
ret = set_ctrl(NULL, ctrl, &c, V4L2_EVENT_CTRL_CH_RANGE);
|
ret = set_ctrl(NULL, ctrl, &c, V4L2_EVENT_CTRL_CH_RANGE);
|
||||||
else
|
else
|
||||||
send_event(NULL, ctrl, V4L2_EVENT_CTRL_CH_RANGE);
|
send_event(NULL, ctrl, V4L2_EVENT_CTRL_CH_RANGE);
|
||||||
v4l2_ctrl_unlock(ctrl);
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(v4l2_ctrl_modify_range);
|
EXPORT_SYMBOL(__v4l2_ctrl_modify_range);
|
||||||
|
|
||||||
static int v4l2_ctrl_add_event(struct v4l2_subscribed_event *sev, unsigned elems)
|
static int v4l2_ctrl_add_event(struct v4l2_subscribed_event *sev, unsigned elems)
|
||||||
{
|
{
|
||||||
|
|
|
@ -620,6 +620,11 @@ void v4l2_ctrl_activate(struct v4l2_ctrl *ctrl, bool active);
|
||||||
*/
|
*/
|
||||||
void v4l2_ctrl_grab(struct v4l2_ctrl *ctrl, bool grabbed);
|
void v4l2_ctrl_grab(struct v4l2_ctrl *ctrl, bool grabbed);
|
||||||
|
|
||||||
|
|
||||||
|
/** __v4l2_ctrl_modify_range() - Unlocked variant of v4l2_ctrl_modify_range() */
|
||||||
|
int __v4l2_ctrl_modify_range(struct v4l2_ctrl *ctrl,
|
||||||
|
s64 min, s64 max, u64 step, s64 def);
|
||||||
|
|
||||||
/** v4l2_ctrl_modify_range() - Update the range of a control.
|
/** v4l2_ctrl_modify_range() - Update the range of a control.
|
||||||
* @ctrl: The control to update.
|
* @ctrl: The control to update.
|
||||||
* @min: The control's minimum value.
|
* @min: The control's minimum value.
|
||||||
|
@ -637,8 +642,17 @@ void v4l2_ctrl_grab(struct v4l2_ctrl *ctrl, bool grabbed);
|
||||||
* This function assumes that the control handler is not locked and will
|
* This function assumes that the control handler is not locked and will
|
||||||
* take the lock itself.
|
* take the lock itself.
|
||||||
*/
|
*/
|
||||||
int v4l2_ctrl_modify_range(struct v4l2_ctrl *ctrl,
|
static inline int v4l2_ctrl_modify_range(struct v4l2_ctrl *ctrl,
|
||||||
s64 min, s64 max, u64 step, s64 def);
|
s64 min, s64 max, u64 step, s64 def)
|
||||||
|
{
|
||||||
|
int rval;
|
||||||
|
|
||||||
|
v4l2_ctrl_lock(ctrl);
|
||||||
|
rval = __v4l2_ctrl_modify_range(ctrl, min, max, step, def);
|
||||||
|
v4l2_ctrl_unlock(ctrl);
|
||||||
|
|
||||||
|
return rval;
|
||||||
|
}
|
||||||
|
|
||||||
/** v4l2_ctrl_notify() - Function to set a notify callback for a control.
|
/** v4l2_ctrl_notify() - Function to set a notify callback for a control.
|
||||||
* @ctrl: The control.
|
* @ctrl: The control.
|
||||||
|
|
Loading…
Reference in a new issue