summaryrefslogtreecommitdiff
path: root/drivers/gpu/drm/bridge/adv7511/adv7533.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/bridge/adv7511/adv7533.c')
-rw-r--r--drivers/gpu/drm/bridge/adv7511/adv7533.c38
1 files changed, 31 insertions, 7 deletions
diff --git a/drivers/gpu/drm/bridge/adv7511/adv7533.c b/drivers/gpu/drm/bridge/adv7511/adv7533.c
index d7f7b7ce8ebe..6a7dd000aeee 100644
--- a/drivers/gpu/drm/bridge/adv7511/adv7533.c
+++ b/drivers/gpu/drm/bridge/adv7511/adv7533.c
@@ -117,11 +117,16 @@ void adv7533_dsi_power_off(struct adv7511 *adv)
void adv7533_mode_set(struct adv7511 *adv, struct drm_display_mode *mode)
{
+}
+
+bool adv7533_mode_fixup(struct adv7511 *adv,
+ struct drm_display_mode *mode)
+{
struct mipi_dsi_device *dsi = adv->dsi;
int lanes, ret;
if (adv->num_dsi_lanes != 4)
- return;
+ return true;
if (mode->clock > 80000)
lanes = 4;
@@ -130,11 +135,16 @@ void adv7533_mode_set(struct adv7511 *adv, struct drm_display_mode *mode)
if (lanes != dsi->lanes) {
mipi_dsi_detach(dsi);
- dsi->lanes = lanes;
+ swap(dsi->lanes, lanes);
ret = mipi_dsi_attach(dsi);
- if (ret)
+ if (ret) {
dev_err(&dsi->dev, "failed to change host lanes\n");
+ swap(dsi->lanes, lanes);
+ return false;
+ }
}
+
+ return true;
}
int adv7533_patch_registers(struct adv7511 *adv)
@@ -154,7 +164,7 @@ int adv7533_init_cec(struct adv7511 *adv)
int ret;
adv->i2c_cec = i2c_new_dummy(adv->i2c_main->adapter,
- adv->i2c_main->addr - 1);
+ adv->addr_cec);
if (!adv->i2c_cec)
return -ENOMEM;
@@ -184,7 +194,7 @@ int adv7533_attach_dsi(struct adv7511 *adv)
struct mipi_dsi_device *dsi;
int ret = 0;
const struct mipi_dsi_device_info info = { .type = "adv7533",
- .channel = 0,
+ .channel = adv->channel_id,
.node = NULL,
};
@@ -230,15 +240,25 @@ void adv7533_detach_dsi(struct adv7511 *adv)
int adv7533_parse_dt(struct device_node *np, struct adv7511 *adv)
{
- u32 num_lanes;
+ struct device *dev = &adv->i2c_main->dev;
+ u32 num_lanes = 0, channel_id = 0;
struct device_node *endpoint;
+ of_property_read_u32(np, "adi,dsi-channel", &channel_id);
of_property_read_u32(np, "adi,dsi-lanes", &num_lanes);
- if (num_lanes < 1 || num_lanes > 4)
+ if (num_lanes < 1 || num_lanes > 4) {
+ dev_err(dev, "Invalid dsi-lanes: %d\n", num_lanes);
return -EINVAL;
+ }
+
+ if (channel_id > 3) {
+ dev_err(dev, "Invalid dsi-channel: %d\n", channel_id);
+ return -EINVAL;
+ }
adv->num_dsi_lanes = num_lanes;
+ adv->channel_id = channel_id;
endpoint = of_graph_get_next_endpoint(np, NULL);
if (!endpoint)
@@ -256,6 +276,10 @@ int adv7533_parse_dt(struct device_node *np, struct adv7511 *adv)
adv->use_timing_gen = !of_property_read_bool(np,
"adi,disable-timing-generator");
+ of_property_read_u32(np, "adi,addr-cec", &adv->addr_cec);
+ of_property_read_u32(np, "adi,addr-edid", &adv->addr_edid);
+ of_property_read_u32(np, "adi,addr-pkt", &adv->addr_pkt);
+
/* TODO: Check if these need to be parsed by DT or not */
adv->rgb = true;
adv->embedded_sync = false;