diff options
Diffstat (limited to 'drivers/gpu/drm/bridge/adv7511/adv7533.c')
-rw-r--r-- | drivers/gpu/drm/bridge/adv7511/adv7533.c | 38 |
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; |