forked from Minki/linux
drm/exynos/hdmi: use array specifier for HDMI-PHY configurations
HDMI-PHY configurations are stored as array pointer and count pair, we can re-use existing helpers to simplify their initialization. Signed-off-by: Andrzej Hajda <a.hajda@samsung.com> Signed-off-by: Inki Dae <inki.dae@samsung.com>
This commit is contained in:
parent
190a3c619d
commit
65e9803091
@ -90,6 +90,16 @@ static const char * const supply[] = {
|
|||||||
"vdd_pll",
|
"vdd_pll",
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct hdmiphy_config {
|
||||||
|
int pixel_clock;
|
||||||
|
u8 conf[32];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct hdmiphy_configs {
|
||||||
|
int count;
|
||||||
|
const struct hdmiphy_config *data;
|
||||||
|
};
|
||||||
|
|
||||||
struct string_array_spec {
|
struct string_array_spec {
|
||||||
int count;
|
int count;
|
||||||
const char * const *data;
|
const char * const *data;
|
||||||
@ -99,9 +109,8 @@ struct string_array_spec {
|
|||||||
|
|
||||||
struct hdmi_driver_data {
|
struct hdmi_driver_data {
|
||||||
unsigned int type;
|
unsigned int type;
|
||||||
const struct hdmiphy_config *phy_confs;
|
|
||||||
unsigned int phy_conf_count;
|
|
||||||
unsigned int is_apb_phy:1;
|
unsigned int is_apb_phy:1;
|
||||||
|
struct hdmiphy_configs phy_confs;
|
||||||
struct string_array_spec clk_gates;
|
struct string_array_spec clk_gates;
|
||||||
/*
|
/*
|
||||||
* Array of triplets (p_off, p_on, clock), where p_off and p_on are
|
* Array of triplets (p_off, p_on, clock), where p_off and p_on are
|
||||||
@ -145,11 +154,6 @@ static inline struct hdmi_context *connector_to_hdmi(struct drm_connector *c)
|
|||||||
return container_of(c, struct hdmi_context, connector);
|
return container_of(c, struct hdmi_context, connector);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct hdmiphy_config {
|
|
||||||
int pixel_clock;
|
|
||||||
u8 conf[32];
|
|
||||||
};
|
|
||||||
|
|
||||||
/* list of phy config settings */
|
/* list of phy config settings */
|
||||||
static const struct hdmiphy_config hdmiphy_v13_configs[] = {
|
static const struct hdmiphy_config hdmiphy_v13_configs[] = {
|
||||||
{
|
{
|
||||||
@ -521,27 +525,24 @@ static const char * const hdmi_clk_muxes4[] = {
|
|||||||
|
|
||||||
static const struct hdmi_driver_data exynos5420_hdmi_driver_data = {
|
static const struct hdmi_driver_data exynos5420_hdmi_driver_data = {
|
||||||
.type = HDMI_TYPE14,
|
.type = HDMI_TYPE14,
|
||||||
.phy_confs = hdmiphy_5420_configs,
|
|
||||||
.phy_conf_count = ARRAY_SIZE(hdmiphy_5420_configs),
|
|
||||||
.is_apb_phy = 1,
|
.is_apb_phy = 1,
|
||||||
|
.phy_confs = INIT_ARRAY_SPEC(hdmiphy_5420_configs),
|
||||||
.clk_gates = INIT_ARRAY_SPEC(hdmi_clk_gates4),
|
.clk_gates = INIT_ARRAY_SPEC(hdmi_clk_gates4),
|
||||||
.clk_muxes = INIT_ARRAY_SPEC(hdmi_clk_muxes4),
|
.clk_muxes = INIT_ARRAY_SPEC(hdmi_clk_muxes4),
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct hdmi_driver_data exynos4212_hdmi_driver_data = {
|
static const struct hdmi_driver_data exynos4212_hdmi_driver_data = {
|
||||||
.type = HDMI_TYPE14,
|
.type = HDMI_TYPE14,
|
||||||
.phy_confs = hdmiphy_v14_configs,
|
|
||||||
.phy_conf_count = ARRAY_SIZE(hdmiphy_v14_configs),
|
|
||||||
.is_apb_phy = 0,
|
.is_apb_phy = 0,
|
||||||
|
.phy_confs = INIT_ARRAY_SPEC(hdmiphy_v14_configs),
|
||||||
.clk_gates = INIT_ARRAY_SPEC(hdmi_clk_gates4),
|
.clk_gates = INIT_ARRAY_SPEC(hdmi_clk_gates4),
|
||||||
.clk_muxes = INIT_ARRAY_SPEC(hdmi_clk_muxes4),
|
.clk_muxes = INIT_ARRAY_SPEC(hdmi_clk_muxes4),
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct hdmi_driver_data exynos4210_hdmi_driver_data = {
|
static const struct hdmi_driver_data exynos4210_hdmi_driver_data = {
|
||||||
.type = HDMI_TYPE13,
|
.type = HDMI_TYPE13,
|
||||||
.phy_confs = hdmiphy_v13_configs,
|
|
||||||
.phy_conf_count = ARRAY_SIZE(hdmiphy_v13_configs),
|
|
||||||
.is_apb_phy = 0,
|
.is_apb_phy = 0,
|
||||||
|
.phy_confs = INIT_ARRAY_SPEC(hdmiphy_v13_configs),
|
||||||
.clk_gates = INIT_ARRAY_SPEC(hdmi_clk_gates4),
|
.clk_gates = INIT_ARRAY_SPEC(hdmi_clk_gates4),
|
||||||
.clk_muxes = INIT_ARRAY_SPEC(hdmi_clk_muxes4),
|
.clk_muxes = INIT_ARRAY_SPEC(hdmi_clk_muxes4),
|
||||||
};
|
};
|
||||||
@ -1065,10 +1066,11 @@ static int hdmi_get_modes(struct drm_connector *connector)
|
|||||||
|
|
||||||
static int hdmi_find_phy_conf(struct hdmi_context *hdata, u32 pixel_clock)
|
static int hdmi_find_phy_conf(struct hdmi_context *hdata, u32 pixel_clock)
|
||||||
{
|
{
|
||||||
|
const struct hdmiphy_configs *confs = &hdata->drv_data->phy_confs;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < hdata->drv_data->phy_conf_count; i++)
|
for (i = 0; i < confs->count; i++)
|
||||||
if (hdata->drv_data->phy_confs[i].pixel_clock == pixel_clock)
|
if (confs->data[i].pixel_clock == pixel_clock)
|
||||||
return i;
|
return i;
|
||||||
|
|
||||||
DRM_DEBUG_KMS("Could not find phy config for %d\n", pixel_clock);
|
DRM_DEBUG_KMS("Could not find phy config for %d\n", pixel_clock);
|
||||||
@ -1609,7 +1611,7 @@ static void hdmiphy_conf_apply(struct hdmi_context *hdata)
|
|||||||
}
|
}
|
||||||
|
|
||||||
ret = hdmiphy_reg_write_buf(hdata, 0,
|
ret = hdmiphy_reg_write_buf(hdata, 0,
|
||||||
hdata->drv_data->phy_confs[i].conf, 32);
|
hdata->drv_data->phy_confs.data[i].conf, 32);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
DRM_ERROR("failed to configure hdmiphy\n");
|
DRM_ERROR("failed to configure hdmiphy\n");
|
||||||
return;
|
return;
|
||||||
|
Loading…
Reference in New Issue
Block a user