[media] v4l: vsp1: sru: Don't program intensity in control set handler

The datasheet clearly states that all but a few registers can't be
modified when the device is running. Programming the intensity
parameters in the control set handler is thus prohibited. Program it
when starting the module instead.

This requires storing the intensity value internally as the module can
be started from the frame completion interrupt handler, and accessing
control values requires taking a mutex.

Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
This commit is contained in:
Laurent Pinchart 2015-11-01 12:19:42 -02:00 committed by Mauro Carvalho Chehab
parent bd2fdd5aa9
commit d884a8b2a5
2 changed files with 11 additions and 26 deletions

View file

@ -26,11 +26,6 @@
* Device Access * Device Access
*/ */
static inline u32 vsp1_sru_read(struct vsp1_sru *sru, u32 reg)
{
return vsp1_read(sru->entity.vsp1, reg);
}
static inline void vsp1_sru_write(struct vsp1_sru *sru, u32 reg, u32 data) static inline void vsp1_sru_write(struct vsp1_sru *sru, u32 reg, u32 data)
{ {
vsp1_write(sru->entity.vsp1, reg, data); vsp1_write(sru->entity.vsp1, reg, data);
@ -82,20 +77,10 @@ static int sru_s_ctrl(struct v4l2_ctrl *ctrl)
{ {
struct vsp1_sru *sru = struct vsp1_sru *sru =
container_of(ctrl->handler, struct vsp1_sru, ctrls); container_of(ctrl->handler, struct vsp1_sru, ctrls);
const struct vsp1_sru_param *param;
u32 value;
switch (ctrl->id) { switch (ctrl->id) {
case V4L2_CID_VSP1_SRU_INTENSITY: case V4L2_CID_VSP1_SRU_INTENSITY:
param = &vsp1_sru_params[ctrl->val - 1]; sru->intensity = ctrl->val;
value = vsp1_sru_read(sru, VI6_SRU_CTRL0);
value &= ~(VI6_SRU_CTRL0_PARAM0_MASK |
VI6_SRU_CTRL0_PARAM1_MASK);
value |= param->ctrl0;
vsp1_sru_write(sru, VI6_SRU_CTRL0, value);
vsp1_sru_write(sru, VI6_SRU_CTRL2, param->ctrl2);
break; break;
} }
@ -123,6 +108,7 @@ static const struct v4l2_ctrl_config sru_intensity_control = {
static int sru_s_stream(struct v4l2_subdev *subdev, int enable) static int sru_s_stream(struct v4l2_subdev *subdev, int enable)
{ {
const struct vsp1_sru_param *param;
struct vsp1_sru *sru = to_sru(subdev); struct vsp1_sru *sru = to_sru(subdev);
struct v4l2_mbus_framefmt *input; struct v4l2_mbus_framefmt *input;
struct v4l2_mbus_framefmt *output; struct v4l2_mbus_framefmt *output;
@ -148,18 +134,13 @@ static int sru_s_stream(struct v4l2_subdev *subdev, int enable)
if (input->width != output->width) if (input->width != output->width)
ctrl0 |= VI6_SRU_CTRL0_MODE_UPSCALE; ctrl0 |= VI6_SRU_CTRL0_MODE_UPSCALE;
/* Take the control handler lock to ensure that the CTRL0 value won't be param = &vsp1_sru_params[sru->intensity - 1];
* changed behind our back by a set control operation.
*/
if (sru->entity.vsp1->info->uapi)
mutex_lock(sru->ctrls.lock);
ctrl0 |= vsp1_sru_read(sru, VI6_SRU_CTRL0)
& (VI6_SRU_CTRL0_PARAM0_MASK | VI6_SRU_CTRL0_PARAM1_MASK);
vsp1_sru_write(sru, VI6_SRU_CTRL0, ctrl0);
if (sru->entity.vsp1->info->uapi)
mutex_unlock(sru->ctrls.lock);
ctrl0 |= param->ctrl0;
vsp1_sru_write(sru, VI6_SRU_CTRL0, ctrl0);
vsp1_sru_write(sru, VI6_SRU_CTRL1, VI6_SRU_CTRL1_PARAM5); vsp1_sru_write(sru, VI6_SRU_CTRL1, VI6_SRU_CTRL1_PARAM5);
vsp1_sru_write(sru, VI6_SRU_CTRL2, param->ctrl2);
return 0; return 0;
} }
@ -376,6 +357,8 @@ struct vsp1_sru *vsp1_sru_create(struct vsp1_device *vsp1)
v4l2_ctrl_handler_init(&sru->ctrls, 1); v4l2_ctrl_handler_init(&sru->ctrls, 1);
v4l2_ctrl_new_custom(&sru->ctrls, &sru_intensity_control, NULL); v4l2_ctrl_new_custom(&sru->ctrls, &sru_intensity_control, NULL);
sru->intensity = 1;
sru->entity.subdev.ctrl_handler = &sru->ctrls; sru->entity.subdev.ctrl_handler = &sru->ctrls;
if (sru->ctrls.error) { if (sru->ctrls.error) {

View file

@ -28,6 +28,8 @@ struct vsp1_sru {
struct vsp1_entity entity; struct vsp1_entity entity;
struct v4l2_ctrl_handler ctrls; struct v4l2_ctrl_handler ctrls;
unsigned int intensity;
}; };
static inline struct vsp1_sru *to_sru(struct v4l2_subdev *subdev) static inline struct vsp1_sru *to_sru(struct v4l2_subdev *subdev)