diff options
author | Thierry Reding <treding@nvidia.com> | 2014-08-06 16:02:50 +0200 |
---|---|---|
committer | Thierry Reding <treding@nvidia.com> | 2014-08-07 17:00:28 +0200 |
commit | 583b89de4c875b75ccced26efeca4e26db06d9a4 (patch) | |
tree | 7a3666c5bcbe595674d2051bf45a4c0dc5a8f879 | |
parent | b6ce73e1da42f44e377859ace1e972c4c5c6fbc3 (diff) |
sharp panel fixup
-rw-r--r-- | drivers/gpu/drm/panel/panel-sharp-lq101r1sx01.c | 90 |
1 files changed, 60 insertions, 30 deletions
diff --git a/drivers/gpu/drm/panel/panel-sharp-lq101r1sx01.c b/drivers/gpu/drm/panel/panel-sharp-lq101r1sx01.c index 7bddba8ab2df..9d5841df5769 100644 --- a/drivers/gpu/drm/panel/panel-sharp-lq101r1sx01.c +++ b/drivers/gpu/drm/panel/panel-sharp-lq101r1sx01.c @@ -23,8 +23,6 @@ struct sharp_panel { struct drm_panel base; - struct mipi_dsi_device *primary; - struct mipi_dsi_device *secondary; struct mipi_dsi_device *dsi; struct backlight_device *backlight; @@ -189,7 +187,7 @@ static int sharp_panel_prepare(struct drm_panel *panel) if (err < 0) dev_err(panel->dev, "failed to set pixel format: %d\n", err); - err = sharp_setup_symmetrical_split(sharp->primary, sharp->secondary, + err = sharp_setup_symmetrical_split(sharp->dsi, sharp->dsi->slave, sharp->mode); if (err < 0) dev_err(panel->dev, "failed to set up symmetrical split: %d\n", @@ -270,6 +268,35 @@ static const struct of_device_id sharp_of_match[] = { }; MODULE_DEVICE_TABLE(of, sharp_of_match); +static int sharp_panel_enslave(struct mipi_dsi_device *master, + struct mipi_dsi_device *slave) +{ + int err; + + err = mipi_dsi_attach(master); + if (err < 0) + return err; + + return err; +} + +static int sharp_panel_liberate(struct mipi_dsi_device *master, + struct mipi_dsi_device *slave) +{ + int err; + + err = mipi_dsi_detach(master); + if (err < 0) + return err; + + return 0; +} + +static const struct mipi_dsi_master_ops sharp_panel_master_ops = { + .enslave = sharp_panel_enslave, + .liberate = sharp_panel_liberate, +}; + static int sharp_panel_probe(struct mipi_dsi_device *dsi) { struct sharp_panel *sharp; @@ -280,34 +307,45 @@ static int sharp_panel_probe(struct mipi_dsi_device *dsi) if (!sharp) return -ENOMEM; - sharp->supply = devm_regulator_get(&dsi->dev, "power"); - if (IS_ERR(sharp->supply)) - return PTR_ERR(sharp->supply); + mipi_dsi_set_drvdata(dsi, sharp); + sharp->mode = &default_mode; + sharp->dsi = dsi; - dsi->lanes = 8; + dsi->lanes = 4; dsi->format = MIPI_DSI_FMT_RGB888; dsi->mode_flags = 0; - sharp->mode = &default_mode; - sharp->dsi = dsi; + dsi->master = mipi_dsi_get_master(dsi); + if (IS_ERR(dsi->master)) + return PTR_ERR(sharp->dsi->master); - np = of_parse_phandle(dsi->dev.of_node, "backlight", 0); - if (np) { - sharp->backlight = of_find_backlight_by_node(np); - of_node_put(np); + if (dsi->master) { + err = mipi_dsi_attach(dsi); + if (err < 0) + return err; - if (!sharp->backlight) - return -EPROBE_DEFER; + err = mipi_dsi_enslave(dsi->master, dsi); + if (err < 0) { + dev_err(&dsi->dev, "mipi_dsi_enslave() failed: %d\n", + err); + return err; + } + + return 0; } - sharp->primary = dsi; + dsi->ops = &sharp_panel_master_ops; - np = of_parse_phandle(dsi->dev.of_node, "secondary", 0); + sharp->supply = devm_regulator_get(&dsi->dev, "power"); + if (IS_ERR(sharp->supply)) + return PTR_ERR(sharp->supply); + + np = of_parse_phandle(dsi->dev.of_node, "backlight", 0); if (np) { - sharp->secondary = of_find_mipi_dsi_by_node(np); + sharp->backlight = of_find_backlight_by_node(np); of_node_put(np); - if (!sharp->secondary) + if (!sharp->backlight) return -EPROBE_DEFER; } @@ -317,19 +355,11 @@ static int sharp_panel_probe(struct mipi_dsi_device *dsi) err = drm_panel_add(&sharp->base); if (err < 0) - goto free_backlight; - - mipi_dsi_set_drvdata(dsi, sharp); - - err = mipi_dsi_attach(dsi); - if (err < 0) - goto remove_panel; + goto put_backlight; return 0; -remove_panel: - drm_panel_remove(&sharp->base); -free_backlight: +put_backlight: if (sharp->backlight) put_device(&sharp->backlight->dev); @@ -353,7 +383,7 @@ static int sharp_panel_remove(struct mipi_dsi_device *dsi) if (sharp->backlight) put_device(&sharp->backlight->dev); - put_device(&sharp->secondary->dev); + put_device(&dsi->slave->dev); return 0; } |