Re: [PATCH 2/6] v4l: s5p-tv: hdmiphy: add support for per-platform variants

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Tomasz,

Thanks for the patch.

On Tuesday 13 March 2012 14:35:10 Tomasz Stanislawski wrote:
> Adds selection of HDMIPHY configuration tables basing on both preset and
> platform variant.
> 
> Signed-off-by: Tomasz Stanislawski <t.stanislaws@xxxxxxxxxxx>
> Signed-off-by: Kyungmin Park <kyungmin.park@xxxxxxxxxxx>
> ---
>  drivers/media/video/s5p-tv/hdmiphy_drv.c |  227 +++++++++++++++++++++------
> 1 files changed, 187 insertions(+), 40
> deletions(-)
> 
> diff --git a/drivers/media/video/s5p-tv/hdmiphy_drv.c
> b/drivers/media/video/s5p-tv/hdmiphy_drv.c index 0afef77..7ab00fd 100644
> --- a/drivers/media/video/s5p-tv/hdmiphy_drv.c
> +++ b/drivers/media/video/s5p-tv/hdmiphy_drv.c
> @@ -25,54 +25,186 @@ MODULE_AUTHOR("Tomasz Stanislawski
> <t.stanislaws@xxxxxxxxxxx>"); MODULE_DESCRIPTION("Samsung HDMI Physical
> interface driver");
>  MODULE_LICENSE("GPL");
> 
> -struct hdmiphy_conf {
> -	u32 preset;
> -	const u8 *data;
> +enum hdmiphy_id {
> +	HDMIPHY_S5PV210,
> +	HDMIPHY_EXYNOS4210,
> +	HDMIPHY_EXYNOS4212,
> +	HDMIPHY_EXYNOS4412,
>  };
> 
> -static const u8 hdmiphy_conf27[32] = {
> -	0x01, 0x05, 0x00, 0xD8, 0x10, 0x1C, 0x30, 0x40,
> -	0x6B, 0x10, 0x02, 0x51, 0xDf, 0xF2, 0x54, 0x87,
> -	0x84, 0x00, 0x30, 0x38, 0x00, 0x08, 0x10, 0xE0,
> -	0x22, 0x40, 0xe3, 0x26, 0x00, 0x00, 0x00, 0x00,
> -};
> -
> -static const u8 hdmiphy_conf74_175[32] = {
> -	0x01, 0x05, 0x00, 0xD8, 0x10, 0x9C, 0xef, 0x5B,
> -	0x6D, 0x10, 0x01, 0x51, 0xef, 0xF3, 0x54, 0xb9,
> -	0x84, 0x00, 0x30, 0x38, 0x00, 0x08, 0x10, 0xE0,
> -	0x22, 0x40, 0xa5, 0x26, 0x01, 0x00, 0x00, 0x00,
> +struct hdmiphy_conf {
> +	unsigned long pixclk;
> +	enum hdmiphy_id id;
> +	const u8 data[32];
>  };
> 
> -static const u8 hdmiphy_conf74_25[32] = {
> -	0x01, 0x05, 0x00, 0xd8, 0x10, 0x9c, 0xf8, 0x40,
> -	0x6a, 0x10, 0x01, 0x51, 0xff, 0xf1, 0x54, 0xba,
> -	0x84, 0x00, 0x30, 0x38, 0x00, 0x08, 0x10, 0xe0,
> -	0x22, 0x40, 0xa4, 0x26, 0x01, 0x00, 0x00, 0x00,
> +struct hdmiphy_ctx {
> +	struct v4l2_subdev sd;
> +	enum hdmiphy_id id;
>  };
> 
> -static const u8 hdmiphy_conf148_5[32] = {
> -	0x01, 0x05, 0x00, 0xD8, 0x10, 0x9C, 0xf8, 0x40,
> -	0x6A, 0x18, 0x00, 0x51, 0xff, 0xF1, 0x54, 0xba,
> -	0x84, 0x00, 0x10, 0x38, 0x00, 0x08, 0x10, 0xE0,
> -	0x22, 0x40, 0xa4, 0x26, 0x02, 0x00, 0x00, 0x00,
> -};
> +static inline  struct hdmiphy_ctx *sd_to_ctx(struct v4l2_subdev *sd)

s/inline  struct/inline struct/

> +{
> +	return container_of(sd, struct hdmiphy_ctx, sd);
> +}
> 
>  static const struct hdmiphy_conf hdmiphy_conf[] = {
> -	{ V4L2_DV_480P59_94, hdmiphy_conf27 },
> -	{ V4L2_DV_1080P30, hdmiphy_conf74_175 },
> -	{ V4L2_DV_720P59_94, hdmiphy_conf74_175 },
> -	{ V4L2_DV_720P60, hdmiphy_conf74_25 },
> -	{ V4L2_DV_1080P50, hdmiphy_conf148_5 },
> -	{ V4L2_DV_1080P60, hdmiphy_conf148_5 },
> +	{ .id = HDMIPHY_S5PV210, .pixclk = 27000000, .data = {
> +		0x01, 0x05, 0x00, 0xD8, 0x10, 0x1C, 0x30, 0x40,
> +		0x6B, 0x10, 0x02, 0x52, 0xDF, 0xF2, 0x54, 0x87,
> +		0x84, 0x00, 0x30, 0x38, 0x00, 0x08, 0x10, 0xE0,
> +		0x22, 0x40, 0xE3, 0x26, 0x00, 0x00, 0x00, 0x00, }
> +	},
> +	{ .id = HDMIPHY_S5PV210, .pixclk = 27027000, .data = {
> +		0x01, 0x05, 0x00, 0xD4, 0x10, 0x9C, 0x09, 0x64,
> +		0x6B, 0x10, 0x02, 0x52, 0xDF, 0xF2, 0x54, 0x87,
> +		0x84, 0x00, 0x30, 0x38, 0x00, 0x08, 0x10, 0xE0,
> +		0x22, 0x40, 0xE2, 0x26, 0x00, 0x00, 0x00, 0x00, }
> +	},
> +	{ .id = HDMIPHY_S5PV210, .pixclk = 74176000, .data = {
> +		0x01, 0x05, 0x00, 0xD8, 0x10, 0x9C, 0xEF, 0x5B,
> +		0x6D, 0x10, 0x01, 0x52, 0xEF, 0xF3, 0x54, 0xB9,
> +		0x84, 0x00, 0x30, 0x38, 0x00, 0x08, 0x10, 0xE0,
> +		0x22, 0x40, 0xA5, 0x26, 0x01, 0x00, 0x00, 0x00, }
> +	},
> +	{ .id = HDMIPHY_S5PV210, .pixclk = 74250000, .data = {
> +		0x01, 0x05, 0x00, 0xD8, 0x10, 0x9C, 0xF8, 0x40,
> +		0x6A, 0x10, 0x01, 0x52, 0xFF, 0xF1, 0x54, 0xBA,
> +		0x84, 0x00, 0x10, 0x38, 0x00, 0x08, 0x10, 0xE0,
> +		0x22, 0x40, 0xA4, 0x26, 0x01, 0x00, 0x00, 0x00, }
> +	},
> +	{ .id = HDMIPHY_EXYNOS4210, .pixclk = 27000000, .data = {
> +		0x01, 0x05, 0x00, 0xD8, 0x10, 0x1C, 0x30, 0x40,
> +		0x6B, 0x10, 0x02, 0x51, 0xDF, 0xF2, 0x54, 0x87,
> +		0x84, 0x00, 0x30, 0x38, 0x00, 0x08, 0x10, 0xE0,
> +		0x22, 0x40, 0xE3, 0x26, 0x00, 0x00, 0x00, 0x00, }
> +	},
> +	{ .id = HDMIPHY_EXYNOS4210, .pixclk = 27027000, .data = {
> +		0x01, 0x05, 0x00, 0xD4, 0x10, 0x9C, 0x09, 0x64,
> +		0x6B, 0x10, 0x02, 0x51, 0xDF, 0xF2, 0x54, 0x87,
> +		0x84, 0x00, 0x30, 0x38, 0x00, 0x08, 0x10, 0xE0,
> +		0x22, 0x40, 0xE2, 0x26, 0x00, 0x00, 0x00, 0x00, }
> +	},
> +	{ .id = HDMIPHY_EXYNOS4210, .pixclk = 74176000, .data = {
> +		0x01, 0x05, 0x00, 0xD8, 0x10, 0x9C, 0xEF, 0x5B,
> +		0x6D, 0x10, 0x01, 0x51, 0xEF, 0xF3, 0x54, 0xB9,
> +		0x84, 0x00, 0x30, 0x38, 0x00, 0x08, 0x10, 0xE0,
> +		0x22, 0x40, 0xA5, 0x26, 0x01, 0x00, 0x00, 0x00, }
> +	},
> +	{ .id = HDMIPHY_EXYNOS4210, .pixclk = 74250000, .data = {
> +		0x01, 0x05, 0x00, 0xD8, 0x10, 0x9C, 0xF8, 0x40,
> +		0x6A, 0x10, 0x01, 0x51, 0xFF, 0xF1, 0x54, 0xBA,
> +		0x84, 0x00, 0x10, 0x38, 0x00, 0x08, 0x10, 0xE0,
> +		0x22, 0x40, 0xA4, 0x26, 0x01, 0x00, 0x00, 0x00, }
> +	},
> +	{ .id = HDMIPHY_EXYNOS4210, .pixclk = 148352000, .data = {
> +		0x01, 0x05, 0x00, 0xD8, 0x10, 0x9C, 0xEF, 0x5B,
> +		0x6D, 0x18, 0x00, 0x51, 0xEF, 0xF3, 0x54, 0xB9,
> +		0x84, 0x00, 0x30, 0x38, 0x00, 0x08, 0x10, 0xE0,
> +		0x11, 0x40, 0xA5, 0x26, 0x02, 0x00, 0x00, 0x00, }
> +	},
> +	{ .id = HDMIPHY_EXYNOS4210, .pixclk = 148500000, .data = {
> +		0x01, 0x05, 0x00, 0xD8, 0x10, 0x9C, 0xF8, 0x40,
> +		0x6A, 0x18, 0x00, 0x51, 0xFF, 0xF1, 0x54, 0xBA,
> +		0x84, 0x00, 0x10, 0x38, 0x00, 0x08, 0x10, 0xE0,
> +		0x11, 0x40, 0xA4, 0x26, 0x02, 0x00, 0x00, 0x00, }
> +	},
> +	{ .id = HDMIPHY_EXYNOS4212, .pixclk = 27000000, .data = {
> +		0x01, 0x11, 0x2D, 0x75, 0x00, 0x01, 0x00, 0x08,
> +		0x82, 0x00, 0x0E, 0xD9, 0x45, 0xA0, 0x34, 0xC0,
> +		0x0B, 0x80, 0x12, 0x87, 0x08, 0x24, 0x24, 0x71,
> +		0x54, 0xE3, 0x24, 0x00, 0x00, 0x00, 0x01, 0x00, }
> +	},
> +	{ .id = HDMIPHY_EXYNOS4212, .pixclk = 27027000, .data = {
> +		0x01, 0x91, 0x2D, 0x72, 0x00, 0x64, 0x12, 0x08,
> +		0x43, 0x20, 0x0E, 0xD9, 0x45, 0xA0, 0x34, 0xC0,
> +		0x0B, 0x80, 0x12, 0x87, 0x08, 0x24, 0x24, 0x71,
> +		0x54, 0xE2, 0x24, 0x00, 0x00, 0x00, 0x01, 0x00, }
> +	},
> +	{ .id = HDMIPHY_EXYNOS4212, .pixclk = 74176000, .data = {
> +		0x01, 0x91, 0x3E, 0x35, 0x00, 0x5B, 0xDE, 0x08,
> +		0x82, 0x20, 0x73, 0xD9, 0x45, 0xA0, 0x34, 0xC0,
> +		0x0B, 0x80, 0x12, 0x87, 0x08, 0x24, 0x24, 0x52,
> +		0x54, 0xA5, 0x24, 0x01, 0x00, 0x00, 0x01, 0x00, }
> +	},
> +	{ .id = HDMIPHY_EXYNOS4212, .pixclk = 74250000, .data = {
> +		0x01, 0x91, 0x3E, 0x35, 0x00, 0x40, 0xF0, 0x08,
> +		0x82, 0x20, 0x73, 0xD9, 0x45, 0xA0, 0x34, 0xC0,
> +		0x0B, 0x80, 0x12, 0x87, 0x08, 0x24, 0x24, 0x52,
> +		0x54, 0xA4, 0x24, 0x01, 0x00, 0x00, 0x01, 0x00, }
> +	},
> +	{ .id = HDMIPHY_EXYNOS4212, .pixclk = 148500000, .data = {
> +		0x01, 0x91, 0x3E, 0x15, 0x00, 0x40, 0xF0, 0x08,
> +		0x82, 0x20, 0x73, 0xD9, 0x45, 0xA0, 0x34, 0xC0,
> +		0x0B, 0x80, 0x12, 0x87, 0x08, 0x24, 0x24, 0xA4,
> +		0x54, 0x4A, 0x25, 0x03, 0x00, 0x00, 0x01, 0x00, }
> +	},
> +	{ .id = HDMIPHY_EXYNOS4412, .pixclk = 27000000, .data = {
> +		0x01, 0x11, 0x2D, 0x75, 0x40, 0x01, 0x00, 0x08,
> +		0x82, 0x00, 0x0E, 0xD9, 0x45, 0xA0, 0xAC, 0x80,
> +		0x08, 0x80, 0x11, 0x84, 0x02, 0x22, 0x44, 0x86,
> +		0x54, 0xE4, 0x24, 0x00, 0x00, 0x00, 0x01, 0x00, }
> +	},
> +	{ .id = HDMIPHY_EXYNOS4412, .pixclk = 27027000, .data = {
> +		0x01, 0x91, 0x2D, 0x72, 0x40, 0x64, 0x12, 0x08,
> +		0x43, 0x20, 0x0E, 0xD9, 0x45, 0xA0, 0xAC, 0x80,
> +		0x08, 0x80, 0x11, 0x84, 0x02, 0x22, 0x44, 0x86,
> +		0x54, 0xE3, 0x24, 0x00, 0x00, 0x00, 0x01, 0x00, }
> +	},
> +	{ .id = HDMIPHY_EXYNOS4412, .pixclk = 74176000, .data = {
> +		0x01, 0x91, 0x1F, 0x10, 0x40, 0x5B, 0xEF, 0x08,
> +		0x81, 0x20, 0xB9, 0xD8, 0x45, 0xA0, 0xAC, 0x80,
> +		0x08, 0x80, 0x11, 0x84, 0x02, 0x22, 0x44, 0x86,
> +		0x54, 0xA6, 0x24, 0x01, 0x00, 0x00, 0x01, 0x00, }
> +	},
> +	{ .id = HDMIPHY_EXYNOS4412, .pixclk = 74250000, .data = {
> +		0x01, 0x91, 0x1F, 0x10, 0x40, 0x40, 0xF8, 0x08,
> +		0x81, 0x20, 0xBA, 0xD8, 0x45, 0xA0, 0xAC, 0x80,
> +		0x08, 0x80, 0x11, 0x84, 0x02, 0x22, 0x44, 0x86,
> +		0x54, 0xA5, 0x24, 0x01, 0x00, 0x00, 0x01, 0x00, }
> +	},
> +	{ .id = HDMIPHY_EXYNOS4412, .pixclk = 148500000, .data = {
> +		0x01, 0x91, 0x1F, 0x00, 0x40, 0x40, 0xF8, 0x08,
> +		0x81, 0x20, 0xBA, 0xD8, 0x45, 0xA0, 0xAC, 0x80,
> +		0x08, 0x80, 0x11, 0x84, 0x02, 0x22, 0x44, 0x86,
> +		0x54, 0x4B, 0x25, 0x03, 0x00, 0x00, 0x01, 0x00, }
> +	},
>  };
> 
> -const u8 *hdmiphy_preset2conf(u32 preset)
> +static unsigned long hdmiphy_preset_to_pixclk(u32 preset)
>  {
> +	static const unsigned long pixclk[] = {
> +		[V4L2_DV_480P59_94] =  27000000,
> +		[V4L2_DV_576P50]    =  27000000,
> +		[V4L2_DV_720P59_94] =  74176000,
> +		[V4L2_DV_720P50]    =  74250000,
> +		[V4L2_DV_720P60]    =  74250000,
> +		[V4L2_DV_1080P24]   =  74250000,
> +		[V4L2_DV_1080P30]   =  74250000,
> +		[V4L2_DV_1080I50]   =  74250000,
> +		[V4L2_DV_1080I60]   =  74250000,
> +		[V4L2_DV_1080P50]   = 148500000,
> +		[V4L2_DV_1080P60]   = 148500000,
> +	};
> +	if (preset < ARRAY_SIZE(pixclk))
> +		return pixclk[preset];
> +	else
> +		return 0;
> +}
> +
> +static const u8 *hdmiphy_find_conf(u32 preset, enum hdmiphy_id id)
> +{
> +	unsigned long pixclk;
>  	int i;
> -	for (i = 0; i < ARRAY_SIZE(hdmiphy_conf); ++i)
> -		if (hdmiphy_conf[i].preset == preset)
> -			return hdmiphy_conf[i].data;
> +	const struct hdmiphy_conf *conf = hdmiphy_conf;
> +
> +	pixclk = hdmiphy_preset_to_pixclk(preset);
> +	if (!pixclk)
> +		return NULL;
> +
> +	for (i = 0; i < ARRAY_SIZE(hdmiphy_conf); ++i, ++conf)
> +		if (conf->pixclk == pixclk && conf->id == id)
> +			return conf->data;

It would be better to have one array per ID to avoid looping through entries 
that will never match. Given the size of the array that's not a major issue 
though.

>  	return NULL;
>  }
> 

-- 
Regards,

Laurent Pinchart

--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux