misc: rk628: display: compatible with rk628f

Change-Id: I51e0ea03baa92e5e7083779b7a59fbe81d104ec5
Signed-off-by: Guochun Huang <hero.huang@rock-chips.com>
This commit is contained in:
Guochun Huang
2023-10-18 09:33:06 +00:00
committed by Tao Huang
parent c046c02467
commit 673444991a
10 changed files with 231 additions and 80 deletions

View File

@@ -183,7 +183,7 @@ int rk628_panel_info_get(struct rk628 *rk628, struct device_node *np)
rk628->panel = panel;
if (rk628->output_mode == OUTPUT_MODE_DSI) {
if (rk628_output_is_dsi(rk628)) {
ret = dsi_panel_get_cmds(rk628, np);
if (ret) {
dev_err(dev, "failed to get cmds\n");

View File

@@ -381,24 +381,24 @@ static void rk628_display_disable(struct rk628 *rk628)
if (!rk628->display_enabled)
return;
if (rk628->output_mode == OUTPUT_MODE_CSI)
if (rk628_output_is_csi(rk628))
rk628_csi_disable(rk628);
if (rk628->output_mode == OUTPUT_MODE_GVI)
if (rk628_output_is_gvi(rk628))
rk628_gvi_disable(rk628);
if (rk628->output_mode == OUTPUT_MODE_LVDS)
if (rk628_output_is_lvds(rk628))
rk628_lvds_disable(rk628);
if (rk628->output_mode == OUTPUT_MODE_DSI)
if (rk628_output_is_dsi(rk628))
rk628_dsi_disable(rk628);
if (rk628->output_mode == OUTPUT_MODE_RGB)
if (rk628_output_is_rgb(rk628))
rk628_rgb_tx_disable(rk628);
rk628_post_process_disable(rk628);
if (rk628->input_mode == INPUT_MODE_HDMI)
if (rk628_input_is_hdmi(rk628))
rk628_hdmirx_disable(rk628);
rk628->display_enabled = false;
@@ -411,19 +411,19 @@ static void rk628_display_enable(struct rk628 *rk628)
if (rk628->display_enabled)
return;
if (rk628->input_mode == INPUT_MODE_RGB)
if (rk628_input_is_rgb(rk628))
rk628_rgb_rx_enable(rk628);
if (rk628->input_mode == INPUT_MODE_BT1120)
if (rk628_input_is_bt1120(rk628))
rk628_bt1120_rx_enable(rk628);
if (rk628->output_mode == OUTPUT_MODE_RGB)
if (rk628_output_is_rgb(rk628))
rk628_rgb_tx_enable(rk628);
if (rk628->output_mode == OUTPUT_MODE_DSI)
if (rk628_output_is_dsi(rk628))
queue_delayed_work(rk628->dsi_wq, &rk628->dsi_delay_work, msecs_to_jiffies(10));
if (rk628->input_mode == INPUT_MODE_HDMI) {
if (rk628_input_is_hdmi(rk628)) {
ret = rk628_hdmirx_enable(rk628);
if ((ret == HDMIRX_PLUGOUT) || (ret & HDMIRX_NOSIGNAL)) {
rk628_display_disable(rk628);
@@ -431,25 +431,25 @@ static void rk628_display_enable(struct rk628 *rk628)
}
}
if (rk628->output_mode == OUTPUT_MODE_BT1120)
if (rk628_output_is_bt1120(rk628))
rk628_bt1120_tx_enable(rk628);
if (rk628->output_mode != OUTPUT_MODE_HDMI) {
if (!rk628_output_is_hdmi(rk628)) {
rk628_post_process_init(rk628);
rk628_post_process_enable(rk628);
}
if (rk628->output_mode == OUTPUT_MODE_LVDS)
if (rk628_output_is_lvds(rk628))
rk628_lvds_enable(rk628);
if (rk628->output_mode == OUTPUT_MODE_GVI)
if (rk628_output_is_gvi(rk628))
rk628_gvi_enable(rk628);
if (rk628->output_mode == OUTPUT_MODE_CSI)
if (rk628_output_is_csi(rk628))
rk628_csi_enable(rk628);
#ifdef CONFIG_RK628_MISC_HDMITX
if (rk628->output_mode == OUTPUT_MODE_HDMI)
if (rk628_output_is_hdmi(rk628))
rk628_hdmitx_enable(rk628);
#endif
@@ -476,7 +476,7 @@ static int rk628_fb_notifier_callback(struct notifier_block *nb,
rk628_i2c_write(rk628, GRF_GPIO3AB_SEL_CON, 0x30002000);
rk628_cru_init(rk628);
if (rk628->input_mode == INPUT_MODE_HDMI) {
if (rk628_input_is_hdmi(rk628)) {
rk628_i2c_write(rk628, GRF_INTR0_EN, 0x01000100);
/*
* make hdmi rx register domain polling
@@ -497,7 +497,7 @@ static int rk628_fb_notifier_callback(struct notifier_block *nb,
return NOTIFY_OK;
case FB_BLANK_POWERDOWN:
if (rk628->input_mode == INPUT_MODE_HDMI)
if (rk628_input_is_hdmi(rk628))
cancel_delayed_work_sync(&rk628->delay_work);
rk628_display_disable(rk628);
@@ -517,7 +517,7 @@ static void rk628_display_work(struct work_struct *work)
container_of(work, struct rk628, delay_work.work);
int delay = msecs_to_jiffies(2000);
if (rk628->input_mode == INPUT_MODE_HDMI) {
if (rk628_input_is_hdmi(rk628)) {
ret = rk628_hdmirx_detect(rk628);
dev_info(rk628->dev, "%s: hdmirx detect status:0x%x\n", __func__, ret);
if (!(ret & (HDMIRX_CHANGED | HDMIRX_NOLOCK))) {
@@ -538,7 +538,7 @@ static void rk628_display_work(struct work_struct *work)
rk628_display_disable(rk628);
}
if (rk628->input_mode == INPUT_MODE_HDMI) {
if (rk628_input_is_hdmi(rk628)) {
if (!rk628->plugin_det_gpio) {
if (ret & HDMIRX_NOLOCK)
delay = msecs_to_jiffies(200);
@@ -574,12 +574,76 @@ static irqreturn_t rk628_hdmirx_plugin_irq(int irq, void *dev_id)
return IRQ_HANDLED;
}
static bool rk628_input_is_rgb(struct rk628 *rk628)
static bool rk628_display_route_check(struct rk628 *rk628)
{
if (rk628->input_mode == INPUT_MODE_RGB || rk628->input_mode == INPUT_MODE_BT1120)
if (!hweight32(rk628->input_mode) || !hweight32(rk628->output_mode))
return false;
/*
* the RGB/BT1120 RX and RGB/BT1120 TX are the same shared IP
* and cannot be used as both input and output simultaneously.
*/
if ((rk628_input_is_rgb(rk628) || rk628_input_is_bt1120(rk628)) &&
(rk628_output_is_rgb(rk628) || rk628_output_is_bt1120(rk628)))
return false;
if (rk628->version == RK628F_VERSION)
return true;
return false;
/* rk628d only support rgb and hdmi output simultaneously */
if (hweight32(rk628->output_mode) > 2)
return false;
if (hweight32(rk628->output_mode) == 2 &&
!(rk628_output_is_rgb(rk628) && rk628_output_is_hdmi(rk628)))
return false;
return true;
}
static void rk628_final_display_route(struct rk628 *rk628)
{
char *input = NULL;
char *output = NULL;
char buf[20];
if (rk628_input_is_hdmi(rk628))
input = "hdmi";
else if (rk628_input_is_bt1120(rk628))
input = "bt1120";
else
input = "rgb";
if (rk628_output_is_gvi(rk628))
output = "gvi";
else if (rk628_output_is_lvds(rk628))
output = "lvds";
else if (rk628_output_is_dsi(rk628))
output = "dsi";
else if (rk628_output_is_csi(rk628))
output = "csi";
if (rk628_output_is_bt1120(rk628)) {
if (output)
sprintf(buf, "%s & %s", output, "bt1120");
else
output = "bt1120";
} else if (rk628_output_is_rgb(rk628)) {
if (output)
sprintf(buf, "%s & %s", output, "rgb");
else
output = "rgb";
}
if (rk628_output_is_hdmi(rk628)) {
if (output)
sprintf(buf, "%s & %s", output, "hdmi");
else
output = "hdmi";
}
dev_info(rk628->dev, "input_mode:%s output_mode:%s\n", input,
hweight32(rk628->output_mode) > 1 ? buf : output);
}
static int rk628_display_route_info_parse(struct rk628 *rk628)
@@ -589,44 +653,50 @@ static int rk628_display_route_info_parse(struct rk628 *rk628)
u32 val;
if (of_property_read_bool(rk628->dev->of_node, "rk628,hdmi-in"))
rk628->input_mode = INPUT_MODE_HDMI;
rk628->input_mode = BIT(INPUT_MODE_HDMI);
else if (of_property_read_bool(rk628->dev->of_node, "rk628,rgb-in"))
rk628->input_mode = INPUT_MODE_RGB;
rk628->input_mode = BIT(INPUT_MODE_RGB);
else if (of_property_read_bool(rk628->dev->of_node, "rk628,bt1120-in"))
rk628->input_mode = INPUT_MODE_BT1120;
rk628->input_mode = BIT(INPUT_MODE_BT1120);
else
rk628->input_mode = INPUT_MODE_RGB;
rk628->input_mode = BIT(INPUT_MODE_RGB);
if (of_find_node_by_name(rk628->dev->of_node, "rk628-dsi")) {
np = of_find_node_by_name(rk628->dev->of_node, "rk628-dsi");
ret = rk628_dsi_parse(rk628, np);
if (of_find_node_by_name(rk628->dev->of_node, "rk628-gvi")) {
np = of_find_node_by_name(rk628->dev->of_node, "rk628-gvi");
rk628->output_mode |= BIT(OUTPUT_MODE_GVI);
ret = rk628_gvi_parse(rk628, np);
} else if (of_find_node_by_name(rk628->dev->of_node, "rk628-lvds")) {
np = of_find_node_by_name(rk628->dev->of_node, "rk628-lvds");
rk628->output_mode |= BIT(OUTPUT_MODE_LVDS);
ret = rk628_lvds_parse(rk628, np);
} else if (of_find_node_by_name(rk628->dev->of_node, "rk628-gvi")) {
np = of_find_node_by_name(rk628->dev->of_node, "rk628-gvi");
ret = rk628_gvi_parse(rk628, np);
} else if (of_property_read_bool(rk628->dev->of_node, "rk628-bt1120")) {
rk628->output_mode = OUTPUT_MODE_BT1120;
} else if (of_property_read_bool(rk628->dev->of_node, "rk628,hdmi-out")) {
rk628->output_mode = OUTPUT_MODE_HDMI;
} else if (of_find_node_by_name(rk628->dev->of_node, "rk628-dsi")) {
np = of_find_node_by_name(rk628->dev->of_node, "rk628-dsi");
rk628->output_mode |= BIT(OUTPUT_MODE_DSI);
ret = rk628_dsi_parse(rk628, np);
} else if (of_property_read_bool(rk628->dev->of_node, "rk628,csi-out")) {
rk628->output_mode = OUTPUT_MODE_CSI;
} else if (of_property_read_bool(rk628->dev->of_node, "rk628-rgb")) {
ret = rk628_rgb_parse(rk628, NULL);
rk628->output_mode = OUTPUT_MODE_RGB;
} else {
rk628->output_mode = OUTPUT_MODE_RGB;
rk628->output_mode |= BIT(OUTPUT_MODE_CSI);
}
if (of_property_read_bool(rk628->dev->of_node, "rk628,hdmi-out"))
rk628->output_mode |= BIT(OUTPUT_MODE_HDMI);
if (of_property_read_bool(rk628->dev->of_node, "rk628-rgb")) {
ret = rk628_rgb_parse(rk628, NULL);
rk628->output_mode |= BIT(OUTPUT_MODE_RGB);
} else if (of_property_read_bool(rk628->dev->of_node, "rk628-bt1120")) {
rk628->output_mode |= BIT(OUTPUT_MODE_BT1120);
}
if (!rk628_display_route_check(rk628))
return -EINVAL;
rk628_final_display_route(rk628);
if (of_property_read_u32(rk628->dev->of_node, "mode-sync-pol", &val) < 0)
rk628->sync_pol = MODE_FLAG_PSYNC;
else
rk628->sync_pol = (!val ? MODE_FLAG_NSYNC : MODE_FLAG_PSYNC);
if (rk628_input_is_rgb(rk628) && rk628->output_mode == OUTPUT_MODE_RGB)
return -EINVAL;
return ret;
}
@@ -1140,9 +1210,9 @@ rk628_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id)
return ret;
}
if (rk628->output_mode != OUTPUT_MODE_CSI) {
if (!rk628_output_is_csi(rk628)) {
ret = rk628_display_timings_get(rk628);
if (ret && rk628->output_mode != OUTPUT_MODE_HDMI) {
if (ret && !rk628_output_is_hdmi(rk628)) {
dev_info(dev, "display timings err\n");
return ret;
}
@@ -1216,7 +1286,7 @@ rk628_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id)
WQ_MEM_RECLAIM | WQ_FREEZABLE, "rk628-monitor-wq");
INIT_DELAYED_WORK(&rk628->delay_work, rk628_display_work);
if (rk628->output_mode == OUTPUT_MODE_DSI) {
if (rk628_output_is_dsi(rk628)) {
rk628->dsi_wq = alloc_ordered_workqueue("%s",
WQ_MEM_RECLAIM | WQ_FREEZABLE, "rk628-dsi-wq");
INIT_DELAYED_WORK(&rk628->dsi_delay_work, rk628_dsi_work);
@@ -1224,10 +1294,10 @@ rk628_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id)
rk628_cru_init(rk628);
if (rk628->output_mode == OUTPUT_MODE_CSI)
if (rk628_output_is_csi(rk628))
rk628_csi_init(rk628);
if (rk628->input_mode == INPUT_MODE_HDMI) {
if (rk628_input_is_hdmi(rk628)) {
if (rk628->plugin_det_gpio) {
rk628->plugin_irq = gpiod_to_irq(rk628->plugin_det_gpio);
if (rk628->plugin_irq < 0) {
@@ -1287,7 +1357,7 @@ static int rk628_i2c_remove(struct i2c_client *client)
struct rk628 *rk628 = i2c_get_clientdata(client);
struct device *dev = &client->dev;
if (rk628->output_mode == OUTPUT_MODE_DSI) {
if (rk628_output_is_dsi(rk628)) {
cancel_delayed_work_sync(&rk628->dsi_delay_work);
destroy_workqueue(rk628->dsi_wq);
}
@@ -1323,7 +1393,7 @@ static int rk628_resume(struct device *dev)
rk628_i2c_write(rk628, GRF_GPIO3AB_SEL_CON, 0x30002000);
rk628_cru_init(rk628);
if (rk628->input_mode == INPUT_MODE_HDMI) {
if (rk628_input_is_hdmi(rk628)) {
rk628_i2c_write(rk628, GRF_INTR0_EN, 0x01000100);
/*
* make hdmi rx register domain polling

View File

@@ -39,8 +39,16 @@
#define SW_BT_DATA_OEN BIT(9)
#define SW_EFUSE_HDCP_EN_MASK BIT(8)
#define SW_EFUSE_HDCP_EN(x) UPDATE(x, 8, 8)
#define SW_OUTPUT_MODE_MASK GENMASK(7, 3)
#define SW_OUTPUT_MODE(x) UPDATE(x, 7, 3)
#define SW_OUTPUT_MODE_MASK GENMASK(5, 3)
#define SW_OUTPUT_MODE(x) UPDATE(x, 5, 3)
/* compatible with rk628f */
#define SW_OUTPUT_RGB_MODE_MASK GENMASK(7, 6)
#define SW_OUTPUT_RGB_MODE(x) UPDATE(x, 7, 6)
#define SW_HDMITX_EN_MASK BIT(5)
#define SW_HDMITX_EN(x) UPDATE(x, 5, 5)
#define SW_OUTPUT_COMBTX_MODE_MASK GENMASK(4, 3)
#define SW_OUTPUT_COMBTX_MODE(x) UPDATE(x, 4, 3)
#define SW_INPUT_MODE_MASK GENMASK(2, 0)
#define SW_INPUT_MODE(x) UPDATE(x, 2, 0)
#define GRF_SYSTEM_CON1 0x0004
@@ -444,8 +452,8 @@ struct rk628 {
struct rk628_panel_simple *panel;
void *hdmirx;
bool display_enabled;
enum rk628_input_mode input_mode;
enum rk628_output_mode output_mode;
u32 input_mode;
u32 output_mode;
struct rk628_display_mode src_mode;
struct rk628_display_mode dst_mode;
enum bus_format input_fmt;
@@ -461,6 +469,56 @@ struct rk628 {
u32 version;
};
static inline bool rk628_input_is_hdmi(struct rk628 *rk628)
{
return rk628->input_mode & BIT(INPUT_MODE_HDMI);
}
static inline bool rk628_input_is_rgb(struct rk628 *rk628)
{
return rk628->input_mode & BIT(INPUT_MODE_RGB);
}
static inline bool rk628_input_is_bt1120(struct rk628 *rk628)
{
return rk628->input_mode & BIT(INPUT_MODE_BT1120);
}
static inline bool rk628_output_is_rgb(struct rk628 *rk628)
{
return rk628->output_mode & BIT(OUTPUT_MODE_RGB);
}
static inline bool rk628_output_is_bt1120(struct rk628 *rk628)
{
return rk628->output_mode & BIT(OUTPUT_MODE_BT1120);
}
static inline bool rk628_output_is_gvi(struct rk628 *rk628)
{
return rk628->output_mode & BIT(OUTPUT_MODE_GVI);
}
static inline bool rk628_output_is_lvds(struct rk628 *rk628)
{
return rk628->output_mode & BIT(OUTPUT_MODE_LVDS);
}
static inline bool rk628_output_is_dsi(struct rk628 *rk628)
{
return rk628->output_mode & BIT(OUTPUT_MODE_DSI);
}
static inline bool rk628_output_is_csi(struct rk628 *rk628)
{
return rk628->output_mode & BIT(OUTPUT_MODE_CSI);
}
static inline bool rk628_output_is_hdmi(struct rk628 *rk628)
{
return rk628->output_mode & BIT(OUTPUT_MODE_HDMI);
}
static inline int rk628_i2c_write(struct rk628 *rk628, u32 reg, u32 val)
{
int region = (reg >> 16) & 0xff;

View File

@@ -416,8 +416,15 @@ static void enable_stream(struct rk628 *rk628, bool en)
void rk628_csi_init(struct rk628 *rk628)
{
rk628_i2c_update_bits(rk628, GRF_SYSTEM_CON0,
SW_OUTPUT_MODE_MASK, SW_OUTPUT_MODE(OUTPUT_MODE_CSI));
u32 mask = SW_OUTPUT_MODE_MASK;
u32 val = SW_OUTPUT_MODE(OUTPUT_MODE_CSI);
if (rk628->version == RK628F_VERSION) {
mask = SW_OUTPUT_COMBTX_MODE_MASK;
val = SW_OUTPUT_COMBTX_MODE(OUTPUT_MODE_CSI - 1);
}
rk628_i2c_update_bits(rk628, GRF_SYSTEM_CON0, mask, val);
rk628_csi_get_detected_timings(rk628);
mipi_dphy_reset(rk628);
}

View File

@@ -237,7 +237,6 @@ int rk628_dsi_parse(struct rk628 *rk628, struct device_node *dsi_np)
if (!of_device_is_available(dsi_np))
return -EINVAL;
rk628->output_mode = OUTPUT_MODE_DSI;
rk628->dsi0.id = 0;
rk628->dsi0.channel = 0;
rk628->dsi0.rk628 = rk628;
@@ -1210,9 +1209,15 @@ void rk628_mipi_dsi_pre_enable(struct rk628 *rk628)
const struct rk628_dsi *dsi1 = &rk628->dsi1;
u32 rate = rk628_dsi_get_lane_rate(dsi);
int bus_width;
u32 mask = SW_OUTPUT_MODE_MASK;
u32 val = SW_OUTPUT_MODE(OUTPUT_MODE_DSI);
rk628_i2c_update_bits(rk628, GRF_SYSTEM_CON0, SW_OUTPUT_MODE_MASK,
SW_OUTPUT_MODE(OUTPUT_MODE_DSI));
if (rk628->version == RK628F_VERSION) {
mask = SW_OUTPUT_COMBTX_MODE_MASK;
val = SW_OUTPUT_COMBTX_MODE(OUTPUT_MODE_DSI - 2);
}
rk628_i2c_update_bits(rk628, GRF_SYSTEM_CON0, mask, val);
rk628_i2c_update_bits(rk628, GRF_POST_PROC_CON, SW_SPLIT_EN,
dsi->slave ? SW_SPLIT_EN : 0);

View File

@@ -21,8 +21,6 @@ int rk628_gvi_parse(struct rk628 *rk628, struct device_node *gvi_np)
if (!of_device_is_available(gvi_np))
return -EINVAL;
rk628->output_mode = OUTPUT_MODE_GVI;
if (!of_property_read_u32(gvi_np, "gvi,lanes", &val))
rk628->gvi.lanes = val;
@@ -196,14 +194,21 @@ void rk628_gvi_enable(struct rk628 *rk628)
{
struct rk628_gvi *gvi = &rk628->gvi;
unsigned int rate;
u32 mask = SW_OUTPUT_MODE_MASK;
u32 val = SW_OUTPUT_MODE(OUTPUT_MODE_GVI);
rk628_gvi_get_info(gvi);
rate = rk628_gvi_get_lane_rate(rk628);
/* set gvi_hpd and gvi_lock mux */
rk628_i2c_write(rk628, GRF_GPIO3AB_SEL_CON, 0x06000600);
rk628_i2c_update_bits(rk628, GRF_SYSTEM_CON0, SW_OUTPUT_MODE_MASK,
SW_OUTPUT_MODE(OUTPUT_MODE_GVI));
if (rk628->version == RK628F_VERSION) {
mask = SW_OUTPUT_COMBTX_MODE_MASK;
val = SW_OUTPUT_COMBTX_MODE(OUTPUT_MODE_GVI);
}
rk628_i2c_update_bits(rk628, GRF_SYSTEM_CON0, mask, val);
rk628_combtxphy_set_bus_width(rk628, rate);
rk628_combtxphy_set_gvi_division_mode(rk628, gvi->division_mode);
rk628_combtxphy_set_mode(rk628, PHY_MODE_VIDEO_GVI);

View File

@@ -655,7 +655,9 @@ static int rk628_hdmirx_init(struct rk628 *rk628)
/* if GVI and HDMITX OUT, HDMIRX missing signal */
rk628_i2c_update_bits(rk628, GRF_SYSTEM_CON0,
SW_OUTPUT_MODE_MASK, SW_OUTPUT_MODE(OUTPUT_MODE_RGB));
SW_OUTPUT_RGB_MODE_MASK,
SW_OUTPUT_RGB_MODE(OUTPUT_MODE_RGB >> 3));
rk628_i2c_update_bits(rk628, GRF_SYSTEM_CON0,
SW_INPUT_MODE_MASK, SW_INPUT_MODE(INPUT_MODE_HDMI));
rk628_hdmirx_set_edid(rk628);

View File

@@ -30,8 +30,6 @@ int rk628_lvds_parse(struct rk628 *rk628, struct device_node *lvds_np)
if (!of_device_is_available(lvds_np))
return -EINVAL;
rk628->output_mode = OUTPUT_MODE_LVDS;
if (!of_property_read_string(lvds_np, "bus-format", &string)) {
if (!strcmp(string, "jeida_24"))
rk628->lvds.format = LVDS_FORMAT_JEIDA_24BIT;
@@ -68,10 +66,17 @@ void rk628_lvds_enable(struct rk628 *rk628)
enum lvds_link_type link_type = rk628->lvds.link_type;
enum lvds_format format = rk628->lvds.format;
const struct rk628_display_mode *mode = &rk628->dst_mode;
u32 val, bus_width;
u32 val, mask, bus_width;
lvds_update_bits(rk628, GRF_SYSTEM_CON0, SW_OUTPUT_MODE_MASK,
SW_OUTPUT_MODE(OUTPUT_MODE_LVDS));
mask = SW_OUTPUT_MODE_MASK;
val = SW_OUTPUT_MODE(OUTPUT_MODE_LVDS);
if (rk628->version == RK628F_VERSION) {
mask = SW_OUTPUT_COMBTX_MODE_MASK;
val = SW_OUTPUT_COMBTX_MODE(OUTPUT_MODE_LVDS);
}
lvds_update_bits(rk628, GRF_SYSTEM_CON0, mask, val);
switch (link_type) {
case LVDS_DUAL_LINK_ODD_EVEN_PIXELS:

View File

@@ -213,7 +213,7 @@ void rk628_post_process_init(struct rk628 *rk628)
rk628_cru_clk_set_rate(rk628, CGU_CLK_RX_READ, src->clock * 1000);
rk628_cru_clk_set_rate(rk628, CGU_SCLK_VOP, dst_rate * 1000);
if (rk628->output_mode == OUTPUT_MODE_HDMI) {
if (rk628_output_is_hdmi(rk628)) {
rk628_i2c_update_bits(rk628, GRF_SYSTEM_CON0, SW_VSYNC_POL_MASK,
SW_VSYNC_POL(rk628->sync_pol));
rk628_i2c_update_bits(rk628, GRF_SYSTEM_CON0, SW_HSYNC_POL_MASK,

View File

@@ -40,8 +40,8 @@ void rk628_rgb_decoder_enable(struct rk628 *rk628)
void rk628_rgb_encoder_enable(struct rk628 *rk628)
{
rk628_i2c_update_bits(rk628, GRF_SYSTEM_CON0,
SW_BT_DATA_OEN_MASK | SW_OUTPUT_MODE_MASK,
SW_OUTPUT_MODE(OUTPUT_MODE_RGB));
SW_BT_DATA_OEN_MASK | SW_OUTPUT_RGB_MODE_MASK,
SW_OUTPUT_RGB_MODE(OUTPUT_MODE_RGB >> 3));
rk628_i2c_update_bits(rk628, GRF_POST_PROC_CON, SW_DCLK_OUT_INV_EN,
SW_DCLK_OUT_INV_EN);
@@ -160,10 +160,9 @@ void rk628_bt1120_encoder_enable(struct rk628 *rk628)
rk628_i2c_write(rk628, GRF_GPIO3A_D0_CON, 0xffff1011);
rk628_i2c_write(rk628, GRF_GPIO3B_D_CON, 0xf0001);
/* config sw_input_mode bt1120 */
rk628_i2c_update_bits(rk628, GRF_SYSTEM_CON0,
SW_BT_DATA_OEN_MASK | SW_OUTPUT_MODE_MASK,
SW_OUTPUT_MODE(OUTPUT_MODE_BT1120));
SW_BT_DATA_OEN_MASK | SW_OUTPUT_RGB_MODE_MASK,
SW_OUTPUT_RGB_MODE(OUTPUT_MODE_BT1120 >> 3));
rk628_i2c_write(rk628, GRF_CSC_CTRL_CON, SW_R2Y_EN(1));
rk628_i2c_update_bits(rk628, GRF_POST_PROC_CON,
SW_DCLK_OUT_INV_EN, SW_DCLK_OUT_INV_EN);