On Fri March 1 2013 12:02:14 Tomasz Stanislawski wrote:
> Hi Hans,
> Please refer to the comments below.
> 
> On 02/16/2013 10:28 AM, Hans Verkuil wrote:
> > From: Hans Verkuil <hans.verk...@cisco.com>
> > 
> > This just adds dv_timings support without modifying existing dv_preset
> > support, although I had to refactor a little bit in order to share
> > hdmiphy_find_conf() between the preset and timings code.
> > 
> > Signed-off-by: Hans Verkuil <hans.verk...@cisco.com>
> > Cc: Tomasz Stanislawski <t.stanisl...@samsung.com>
> > Cc: Kyungmin Park <kyungmin.p...@samsung.com>
> > ---
> >  drivers/media/platform/s5p-tv/hdmiphy_drv.c |   48 
> > ++++++++++++++++++++++-----
> >  1 file changed, 39 insertions(+), 9 deletions(-)
> > 
> > diff --git a/drivers/media/platform/s5p-tv/hdmiphy_drv.c 
> > b/drivers/media/platform/s5p-tv/hdmiphy_drv.c
> > index 80717ce..85b4211 100644
> > --- a/drivers/media/platform/s5p-tv/hdmiphy_drv.c
> > +++ b/drivers/media/platform/s5p-tv/hdmiphy_drv.c
> > @@ -197,14 +197,9 @@ static unsigned long hdmiphy_preset_to_pixclk(u32 
> > preset)
> >             return 0;
> >  }
> >  
> > -static const u8 *hdmiphy_find_conf(u32 preset, const struct hdmiphy_conf 
> > *conf)
> > +static const u8 *hdmiphy_find_conf(unsigned long pixclk,
> > +           const struct hdmiphy_conf *conf)
> >  {
> > -   unsigned long pixclk;
> > -
> > -   pixclk = hdmiphy_preset_to_pixclk(preset);
> > -   if (!pixclk)
> > -           return NULL;
> > -
> >     for (; conf->pixclk; ++conf)
> >             if (conf->pixclk == pixclk)
> >                     return conf->data;
> > @@ -220,15 +215,49 @@ static int hdmiphy_s_power(struct v4l2_subdev *sd, 
> > int on)
> >  static int hdmiphy_s_dv_preset(struct v4l2_subdev *sd,
> >     struct v4l2_dv_preset *preset)
> >  {
> > -   const u8 *data;
> > +   const u8 *data = NULL;
> >     u8 buffer[32];
> >     int ret;
> >     struct hdmiphy_ctx *ctx = sd_to_ctx(sd);
> >     struct i2c_client *client = v4l2_get_subdevdata(sd);
> > +   unsigned long pixclk;
> >     struct device *dev = &client->dev;
> >  
> >     dev_info(dev, "s_dv_preset(preset = %d)\n", preset->preset);
> > -   data = hdmiphy_find_conf(preset->preset, ctx->conf_tab);
> > +
> > +   pixclk = hdmiphy_preset_to_pixclk(preset->preset);
> 
> Just nitpicking.
> The pixclk might be 0 is the preset is not supported hdmiphy.
> For some platforms not all frequencies are supported.
> Anyway, if pixclk is 0 then hdmiphy_find_conf will detect it.

I'll add a comment clarifying this. I actually was relying on find_conf
to handle the 0 case.

> > +   data = hdmiphy_find_conf(pixclk, ctx->conf_tab);
> > +   if (!data) {
> > +           dev_err(dev, "format not supported\n");
> > +           return -EINVAL;
> > +   }
> > +
> > +   /* storing configuration to the device */
> > +   memcpy(buffer, data, 32);
> > +   ret = i2c_master_send(client, buffer, 32);
> > +   if (ret != 32) {
> > +           dev_err(dev, "failed to configure HDMIPHY via I2C\n");
> > +           return -EIO;
> > +   }
> > +
> > +   return 0;
> > +}
> > +
> > +static int hdmiphy_s_dv_timings(struct v4l2_subdev *sd,
> > +   struct v4l2_dv_timings *timings)
> > +{
> > +   const u8 *data;
> > +   u8 buffer[32];
> > +   int ret;
> > +   struct hdmiphy_ctx *ctx = sd_to_ctx(sd);
> > +   struct i2c_client *client = v4l2_get_subdevdata(sd);
> > +   struct device *dev = &client->dev;
> > +   unsigned long pixclk = timings->bt.pixelclock;
> > +
> > +   dev_info(dev, "s_dv_timings\n");
> 
> Using test against V4L2_DV_FL_REDUCED_FPS and 74250000 looks little hacky to 
> me.
> Why there is no such a check for 148500000 and 27000000 (REDUCED -> 
> INCREASED?).

Because that was not supported by the original code. I have no idea whether 
1080p59.94
is supported or not, or what pixelclock should be used in that case. So I 
faithfully
reproduced the original functionality.

BTW, it is 'reduced': 74.25 MHz is for 30 fps, 74.176 is for 29.97 fps. Also, 
REDUCED_FPS
doesn't apply to the 27 MHz case which is always 29.97 fps in the NTSC 
resolution
case.

> Maybe it will be better to past both timings->bt.pixelclock and 
> timings->bt.flags
> as parameters for hdmiphy_find_conf function. The hdmiphy_find_conf could
> perform pixclk adjustment or some fallback policy based on the flags.

I really prefer to keep the same functionality. I don't want to make changes
to the existing functionality, partially to make it easier to prevent
regressions, partially because I don't have the setup anyway to test this if
I add functionality.

But feel free to provide an additional patch doing this :-)

Regards,

        Hans

> 
> > +   if ((timings->bt.flags & V4L2_DV_FL_REDUCED_FPS) && pixclk == 74250000)
> > +           pixclk = 74176000;
> > +   data = hdmiphy_find_conf(pixclk, ctx->conf_tab);
> >     if (!data) {
> >             dev_err(dev, "format not supported\n");
> >             return -EINVAL;
> > @@ -271,6 +300,7 @@ static const struct v4l2_subdev_core_ops 
> > hdmiphy_core_ops = {
> >  
> >  static const struct v4l2_subdev_video_ops hdmiphy_video_ops = {
> >     .s_dv_preset = hdmiphy_s_dv_preset,
> > +   .s_dv_timings = hdmiphy_s_dv_timings,
> >     .s_stream =  hdmiphy_s_stream,
> >  };
> >  
> > 
> 
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to