V4L/DVB (11913): cx231xx: TRY_FMT should not actually set anything
In the TRY_FMT handler the function get_scale() is called to find what the scaler hardware will produce for a requested size. The problem is that get_scale(struct cx231xx *dev, ..., unsigned int *vscale, unsigned int *hscale) saves the calculated scale values into both the pointer arguments and into dev's hscale and vscale fields. TRY_FMT shouldn't actually change anything in the device state. The code to in get_scale() that writes to dev->[hv]scale can just be deleted. In all cases when dev's fields should be modified, get_scale() was called with get_scale(dev, ..., &dev->hscale, &dev->vscale), so dev was getting updated anyway. This didn't actually cause a problem because nothing ever actually made use of the hscale and vscale fields. I changed cx231xx_resolution_set() to use those fields rather than re-calculate them with a call to get_scale(). Updating [hv]scale in cx231xx_resolution_set() isn't necessary because every call of cx231xx_resolution_set() was already preceded by a call to get_scale() or setting the [hv]scale fields, so they will be always be up-to-date w.r.t. width and height. Removing the call to get_scale() from cx231xx_resolution_set() allowed making get_scale() a static function, which is a good thing for something with such a short name. There is already another function with the same name in the em28xx driver, but that one is static. Signed-off-by: Trent Piepho <xyzzy@speakeasy.org> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
This commit is contained in:
Родитель
ccb83408b2
Коммит
1ca27379f3
|
@ -1052,22 +1052,13 @@ int cx231xx_set_audio_decoder_input(struct cx231xx *dev,
|
|||
/* Set resolution of the video */
|
||||
int cx231xx_resolution_set(struct cx231xx *dev)
|
||||
{
|
||||
int width, height;
|
||||
u32 hscale, vscale;
|
||||
int status = 0;
|
||||
|
||||
width = dev->width;
|
||||
height = dev->height;
|
||||
|
||||
get_scale(dev, width, height, &hscale, &vscale);
|
||||
|
||||
/* set horzontal scale */
|
||||
status = vid_blk_write_word(dev, HSCALE_CTRL, hscale);
|
||||
int status = vid_blk_write_word(dev, HSCALE_CTRL, dev->hscale);
|
||||
if (status)
|
||||
return status;
|
||||
|
||||
/* set vertical scale */
|
||||
status = vid_blk_write_word(dev, VSCALE_CTRL, vscale);
|
||||
|
||||
return status;
|
||||
return vid_blk_write_word(dev, VSCALE_CTRL, dev->vscale);
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
|
|
|
@ -893,9 +893,9 @@ static int check_dev(struct cx231xx *dev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
void get_scale(struct cx231xx *dev,
|
||||
unsigned int width, unsigned int height,
|
||||
unsigned int *hscale, unsigned int *vscale)
|
||||
static void get_scale(struct cx231xx *dev,
|
||||
unsigned int width, unsigned int height,
|
||||
unsigned int *hscale, unsigned int *vscale)
|
||||
{
|
||||
unsigned int maxw = norm_maxw(dev);
|
||||
unsigned int maxh = norm_maxh(dev);
|
||||
|
@ -907,10 +907,6 @@ void get_scale(struct cx231xx *dev,
|
|||
*vscale = (((unsigned long)maxh) << 12) / height - 4096L;
|
||||
if (*vscale >= 0x4000)
|
||||
*vscale = 0x3fff;
|
||||
|
||||
dev->hscale = *hscale;
|
||||
dev->vscale = *vscale;
|
||||
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------------
|
||||
|
|
|
@ -722,9 +722,6 @@ int cx231xx_set_video_input_mux(struct cx231xx *dev, u8 input);
|
|||
int cx231xx_set_decoder_video_input(struct cx231xx *dev, u8 pin_type, u8 input);
|
||||
int cx231xx_do_mode_ctrl_overrides(struct cx231xx *dev);
|
||||
int cx231xx_set_audio_input(struct cx231xx *dev, u8 input);
|
||||
void get_scale(struct cx231xx *dev,
|
||||
unsigned int width, unsigned int height,
|
||||
unsigned int *hscale, unsigned int *vscale);
|
||||
|
||||
/* Provided by cx231xx-video.c */
|
||||
int cx231xx_register_extension(struct cx231xx_ops *dev);
|
||||
|
|
Загрузка…
Ссылка в новой задаче