video: dw_hdmi: Add support for ddc-i2c-bus property
Add support for the ddc-i2c-bus device tree property which allows for using an external i2c master for reading the display's EDID. Signed-off-by: Niklas Schulze <me@jns.io>
This commit is contained in:
parent
233358c46a
commit
60a62acfb0
@ -8,6 +8,7 @@
|
||||
#include <common.h>
|
||||
#include <fdtdec.h>
|
||||
#include <asm/io.h>
|
||||
#include <i2c.h>
|
||||
#include <media_bus_format.h>
|
||||
#include "dw_hdmi.h"
|
||||
|
||||
@ -812,6 +813,18 @@ static int hdmi_read_edid(struct dw_hdmi *hdmi, int block, u8 *buff)
|
||||
u32 trytime = 5;
|
||||
u32 n;
|
||||
|
||||
if (CONFIG_IS_ENABLED(DM_I2C) && hdmi->ddc_bus) {
|
||||
struct udevice *chip;
|
||||
|
||||
edid_read_err = i2c_get_chip(hdmi->ddc_bus,
|
||||
HDMI_I2CM_SLAVE_DDC_ADDR,
|
||||
1, &chip);
|
||||
if (edid_read_err)
|
||||
return edid_read_err;
|
||||
|
||||
return dm_i2c_read(chip, shift, buff, HDMI_EDID_BLOCK_SIZE);
|
||||
}
|
||||
|
||||
/* set ddc i2c clk which devided from ddc_clk to 100khz */
|
||||
hdmi_write(hdmi, hdmi->i2c_clk_high, HDMI_I2CM_SS_SCL_HCNT_0_ADDR);
|
||||
hdmi_write(hdmi, hdmi->i2c_clk_low, HDMI_I2CM_SS_SCL_LCNT_0_ADDR);
|
||||
|
@ -375,6 +375,9 @@ static int meson_dw_hdmi_probe(struct udevice *dev)
|
||||
}
|
||||
#endif
|
||||
|
||||
uclass_get_device_by_phandle(UCLASS_I2C, dev, "ddc-i2c-bus",
|
||||
&priv->hdmi.ddc_bus);
|
||||
|
||||
ret = reset_get_bulk(dev, &resets);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
@ -93,6 +93,9 @@ int rk_hdmi_ofdata_to_platdata(struct udevice *dev)
|
||||
|
||||
priv->grf = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
|
||||
|
||||
uclass_get_device_by_phandle(UCLASS_I2C, dev, "ddc-i2c-bus",
|
||||
&hdmi->ddc_bus);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -373,6 +373,9 @@ static int sunxi_dw_hdmi_probe(struct udevice *dev)
|
||||
priv->hdmi.phy_set = sunxi_dw_hdmi_phy_cfg;
|
||||
priv->mux = uc_plat->source_id;
|
||||
|
||||
uclass_get_device_by_phandle(UCLASS_I2C, dev, "ddc-i2c-bus",
|
||||
&priv->hdmi.ddc_bus);
|
||||
|
||||
dw_hdmi_init(&priv->hdmi);
|
||||
|
||||
return 0;
|
||||
|
@ -542,6 +542,7 @@ struct dw_hdmi {
|
||||
u8 i2c_clk_low;
|
||||
u8 reg_io_width;
|
||||
struct hdmi_data_info hdmi_data;
|
||||
struct udevice *ddc_bus;
|
||||
|
||||
int (*phy_set)(struct dw_hdmi *hdmi, uint mpixelclock);
|
||||
void (*write_reg)(struct dw_hdmi *hdmi, u8 val, int offset);
|
||||
|
Loading…
Reference in New Issue
Block a user