On Tue, 13 Oct 2009, Kuninori Morimoto wrote:
> tw9910 can control output signal.
> This patch will stop all signal when video was stopped.
>
> Signed-off-by: Kuninori Morimoto <[email protected]>
> ---
> drivers/media/video/tw9910.c | 35 ++++++++++++++++++++++++-----------
> 1 files changed, 24 insertions(+), 11 deletions(-)
>
> diff --git a/drivers/media/video/tw9910.c b/drivers/media/video/tw9910.c
> index 5152d56..8bda689 100644
> --- a/drivers/media/video/tw9910.c
> +++ b/drivers/media/video/tw9910.c
> @@ -152,7 +152,8 @@
> /* 1 : non-auto */
> #define VSCTL 0x08 /* 1 : Vertical out ctrl by DVALID */
> /* 0 : Vertical out ctrl by HACTIVE and DVALID */
> -#define OEN 0x04 /* Output Enable together with TRI_SEL. */
> +#define OEN 0x00 /* Enable output */
> +#define EN_TRI_SEL 0x04 /* TRI_SEL output */
Is this to tri-state the output? Ok, from the datasheet it tri-states all
outputs except clocks. My copy of the datasheet is funny at this point. It
first describes OEN = bit 2 of OPFORM, and then the TRI_SEL field, which
is said to occupy bits 1-0, but is documented together with bit 2 with
values 0-7... And you cannot really say that values 0-3 have a feature
distinguishing them from values 4-7. So, I wouldn't separate OEN and just
use the bits 2-0 as a single field. And call the required values like
#define OEN_TRI_SEL_ALL_ON 0
#define OEN_TRI_SEL_CLK_ON 4
>
> /* OUTCTR1 */
> #define VSP_LO 0x00 /* 0 : VS pin output polarity is active low */
> @@ -236,7 +237,6 @@ struct tw9910_priv {
>
> static const struct regval_list tw9910_default_regs[] =
> {
> - { OPFORM, 0x00 },
> { OUTCTR1, VSP_LO | VSSL_VVALID | HSP_HI | HSSL_HSYNC },
> ENDMARKER,
> };
> @@ -513,19 +513,32 @@ static int tw9910_s_stream(struct v4l2_subdev *sd, int
> enable)
> {
> struct i2c_client *client = sd->priv;
> struct tw9910_priv *priv = to_tw9910(client);
> + u8 val;
>
> - if (!enable)
> + if (!enable) {
> + switch (priv->rev) {
> + case 0:
> + val = EN_TRI_SEL | 0x2;
> + break;
> + case 1:
> + val = EN_TRI_SEL | 0x3;
> + break;
> + }
> return 0;
> + } else {
Ok, it's 8:30 here, so, I might be still not quite awake... but I fail to
understand, why you bother calculating val above if you anyway just return
immediately without using it? And if that return is misplaced - what are
those 2 and 3 constants doing?
>
> - if (!priv->scale) {
> - dev_err(&client->dev, "norm select error\n");
> - return -EPERM;
> + if (!priv->scale) {
> + dev_err(&client->dev, "norm select error\n");
> + return -EPERM;
> + }
> +
> + dev_dbg(&client->dev, "%s %dx%d\n",
> + priv->scale->name,
> + priv->scale->width,
> + priv->scale->height);
> }
>
> - dev_dbg(&client->dev, "%s %dx%d\n",
> - priv->scale->name,
> - priv->scale->width,
> - priv->scale->height);
> + tw9910_mask_set(client, OPFORM, 0x7, val);
...and you don't get an "uninitialised variable" warning here? I don't see
where val gets set in the enable case... Please, wake me up if I'm
dreaming. Oh, I see, you fix it in the next patch. Please, don't do that!
Don't introduce bugs to fix them in a later patch. Do it here.
>
> return 0;
Yes, tri-stating outputs for switched off streaming is better than doing
nothing at all, but isn't there anything else that can be safely powered
down? What about CLK_PDN, Y_PDN and C_PDN in ACNTL? YSV, CSV and PLL_PDN
in Analog Control II? I would also expect, that we can at least tristate
all outputs without any problem, we shouldn't need pixel clock running
with disabled streaming.
> }
> --
> 1.6.0.4
Thanks
Guennadi
---
Guennadi Liakhovetski, Ph.D.
Freelance Open-Source Software Developer
http://www.open-technology.de/
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html