On 11/25/19 4:06 PM, Ardelean, Alexandru wrote: > On Fri, 2019-10-18 at 14:29 +0300, Alexandru Ardelean wrote: >> From: Dragos Bogdan <dragos.bogdan@xxxxxxxxxx> >> >> The AD7611 chip supports the same Deep Color Mode settings as the AD7604. >> This change extends support for this feature to the AD7611 by adding a >> wrapper function for the `read_hdmi_pixelclock` hook and adding the same >> frequency adjustment logic. >> > > ping here Not forgotten, it's on my TODO list. But I need some time to dig a bit deeper into this code. Regards, Hans > >> Signed-off-by: Dragos Bogdan <dragos.bogdan@xxxxxxxxxx> >> Signed-off-by: Alexandru Ardelean <alexandru.ardelean@xxxxxxxxxx> >> --- >> >> Changelog v1 -> v2: >> * address checkpatch complaints about 80 col limit and >> use of `unsigned` vs `unsigned int` >> >> drivers/media/i2c/adv7604.c | 32 +++++++++++++++++++++----------- >> 1 file changed, 21 insertions(+), 11 deletions(-) >> >> diff --git a/drivers/media/i2c/adv7604.c b/drivers/media/i2c/adv7604.c >> index 28a84bf9f8a9..c6fe3aa69733 100644 >> --- a/drivers/media/i2c/adv7604.c >> +++ b/drivers/media/i2c/adv7604.c >> @@ -1503,23 +1503,14 @@ static void >> adv76xx_fill_optional_dv_timings_fields(struct v4l2_subdev *sd, >> >> static unsigned int adv7604_read_hdmi_pixelclock(struct v4l2_subdev *sd) >> { >> - unsigned int freq; >> int a, b; >> >> a = hdmi_read(sd, 0x06); >> b = hdmi_read(sd, 0x3b); >> if (a < 0 || b < 0) >> return 0; >> - freq = a * 1000000 + ((b & 0x30) >> 4) * 250000; >> >> - if (is_hdmi(sd)) { >> - /* adjust for deep color mode */ >> - unsigned bits_per_channel = ((hdmi_read(sd, 0x0b) & 0x60) >>>> 4) + 8; >> - >> - freq = freq * 8 / bits_per_channel; >> - } >> - >> - return freq; >> + return a * 1000000 + ((b & 0x30) >> 4) * 250000; >> } >> >> static unsigned int adv7611_read_hdmi_pixelclock(struct v4l2_subdev *sd) >> @@ -1530,9 +1521,28 @@ static unsigned int >> adv7611_read_hdmi_pixelclock(struct v4l2_subdev *sd) >> b = hdmi_read(sd, 0x52); >> if (a < 0 || b < 0) >> return 0; >> + >> return ((a << 1) | (b >> 7)) * 1000000 + (b & 0x7f) * 1000000 / >> 128; >> } >> >> +static unsigned int adv76xx_read_hdmi_pixelclock(struct v4l2_subdev *sd) >> +{ >> + struct adv76xx_state *state = to_state(sd); >> + const struct adv76xx_chip_info *info = state->info; >> + unsigned int freq, bits_per_channel, pixelrepetition; >> + >> + freq = info->read_hdmi_pixelclock(sd); >> + if (is_hdmi(sd)) { >> + /* adjust for deep color mode and pixel repetition */ >> + bits_per_channel = ((hdmi_read(sd, 0x0b) & 0x60) >> 4) + 8; >> + pixelrepetition = (hdmi_read(sd, 0x05) & 0x0f) + 1; >> + >> + freq = freq * 8 / bits_per_channel / pixelrepetition; >> + } >> + >> + return freq; >> +} >> + >> static int adv76xx_query_dv_timings(struct v4l2_subdev *sd, >> struct v4l2_dv_timings *timings) >> { >> @@ -1579,7 +1589,7 @@ static int adv76xx_query_dv_timings(struct >> v4l2_subdev *sd, >> >> bt->width = w; >> bt->height = h; >> - bt->pixelclock = info->read_hdmi_pixelclock(sd); >> + bt->pixelclock = adv76xx_read_hdmi_pixelclock(sd); >> bt->hfrontporch = hdmi_read16(sd, 0x20, info- >>> hfrontporch_mask); >> bt->hsync = hdmi_read16(sd, 0x22, info->hsync_mask); >> bt->hbackporch = hdmi_read16(sd, 0x24, info- >>> hbackporch_mask);