aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c218
-rw-r--r--drivers/gpu/drm/omapdrm/dss/dsi.c143
-rw-r--r--drivers/gpu/drm/omapdrm/dss/omapdss-boot-init.c1
-rw-r--r--drivers/gpu/drm/omapdrm/dss/omapdss.h22
-rw-r--r--drivers/gpu/drm/omapdrm/omap_crtc.c17
5 files changed, 208 insertions, 193 deletions
diff --git a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
index 3f894de0092177..05eefbe6556f5b 100644
--- a/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
+++ b/drivers/gpu/drm/omapdrm/displays/panel-dsi-cm.c
@@ -9,8 +9,6 @@
* the Free Software Foundation.
*/
-/* #define DEBUG */
-
#include <linux/backlight.h>
#include <linux/delay.h>
#include <linux/gpio/consumer.h>
@@ -24,11 +22,14 @@
#include <linux/regulator/consumer.h>
#include <drm/drm_connector.h>
+#include <drm/drm_mipi_dsi.h>
+#include <drm/drm_panel.h>
+#include <drm/drm_modes.h>
+#include <video/display_timing.h>
#include <video/mipi_display.h>
#include <video/of_display_timing.h>
-
-#include "../dss/omapdss.h"
+#include <video/videomode.h>
#define DCS_READ_NUM_ERRORS 0x05
#define DCS_GET_ID1 0xda
@@ -39,11 +40,8 @@
struct panel_drv_data {
struct mipi_dsi_device *dsi;
-
- struct omap_dss_device dssdev;
- struct omap_dss_device *src;
-
- struct videomode vm;
+ struct drm_panel panel;
+ struct drm_display_mode mode;
struct mutex lock;
@@ -75,7 +73,11 @@ struct panel_drv_data {
bool ulps_enabled;
};
-#define to_panel_data(p) container_of(p, struct panel_drv_data, dssdev)
+
+static inline struct panel_drv_data *panel_to_ddata(struct drm_panel *panel)
+{
+ return container_of(panel, struct panel_drv_data, panel);
+}
static int _dsicm_enable_te(struct panel_drv_data *ddata, bool enable);
@@ -291,10 +293,15 @@ static void dsicm_hw_reset(struct panel_drv_data *ddata)
static int dsicm_power_on(struct panel_drv_data *ddata)
{
- struct omap_dss_device *src = ddata->src;
u8 id1, id2, id3;
int r;
+ r = regulator_bulk_enable(DCS_REGULATOR_SUPPLY_NUM, ddata->supplies);
+ if (r) {
+ dev_err(&ddata->dsi->dev, "failed to enable supplies: %d\n", r);
+ return r;
+ }
+
dsicm_hw_reset(ddata);
ddata->dsi->mode_flags |= MIPI_DSI_MODE_LPM;
@@ -328,10 +335,6 @@ static int dsicm_power_on(struct panel_drv_data *ddata)
if (r)
goto err;
- r = src->ops->dsi.enable_video_output(src, ddata->dsi->channel);
- if (r)
- goto err;
-
ddata->enabled = 1;
if (!ddata->intro_printed) {
@@ -348,18 +351,17 @@ err:
dsicm_hw_reset(ddata);
+ regulator_bulk_disable(DCS_REGULATOR_SUPPLY_NUM, ddata->supplies);
+
return r;
}
-static void dsicm_power_off(struct panel_drv_data *ddata)
+static int dsicm_power_off(struct panel_drv_data *ddata)
{
- struct omap_dss_device *src = ddata->src;
int r;
ddata->enabled = 0;
- src->ops->dsi.disable_video_output(src, ddata->dsi->channel);
-
r = mipi_dsi_dcs_set_display_off(ddata->dsi);
if (!r)
r = dsicm_sleep_in(ddata);
@@ -369,52 +371,17 @@ static void dsicm_power_off(struct panel_drv_data *ddata)
"error disabling panel, issuing HW reset\n");
dsicm_hw_reset(ddata);
}
-}
-static int dsicm_connect(struct omap_dss_device *src,
- struct omap_dss_device *dst)
-{
- struct panel_drv_data *ddata = to_panel_data(dst);
-
- ddata->src = src;
- return 0;
-}
-
-static void dsicm_disconnect(struct omap_dss_device *src,
- struct omap_dss_device *dst)
-{
- struct panel_drv_data *ddata = to_panel_data(dst);
-
- ddata->src = NULL;
-}
-
-static void dsicm_pre_enable(struct omap_dss_device *dssdev)
-{
- struct panel_drv_data *ddata = to_panel_data(dssdev);
- struct omap_dss_device *src = ddata->src;
- int r;
- struct omap_dss_dsi_config dsi_config = {
- .vm = &ddata->vm,
- .hs_clk_min = 150000000,
- .hs_clk_max = 300000000,
- .lp_clk_min = 7000000,
- .lp_clk_max = 10000000,
- };
-
- r = regulator_bulk_enable(DCS_REGULATOR_SUPPLY_NUM, ddata->supplies);
- if (r) {
- dev_err(&ddata->dsi->dev, "failed to enable supplies: %d\n", r);
- }
+ r = regulator_bulk_disable(DCS_REGULATOR_SUPPLY_NUM, ddata->supplies);
+ if (r)
+ dev_err(&ddata->dsi->dev, "failed to disable supplies: %d\n", r);
- r = src->ops->dsi.set_config(src, &dsi_config);
- if (r) {
- dev_err(&ddata->dsi->dev, "failed to configure DSI\n");
- }
+ return r;
}
-static void dsicm_enable(struct omap_dss_device *dssdev)
+static int dsicm_prepare(struct drm_panel *panel)
{
- struct panel_drv_data *ddata = to_panel_data(dssdev);
+ struct panel_drv_data *ddata = panel_to_ddata(panel);
int r;
mutex_lock(&ddata->lock);
@@ -427,33 +394,27 @@ static void dsicm_enable(struct omap_dss_device *dssdev)
dsicm_bl_power(ddata, true);
- return;
+ return 0;
err:
- dev_dbg(&ddata->dsi->dev, "enable failed (%d)\n", r);
+ dev_err(&ddata->dsi->dev, "enable failed (%d)\n", r);
mutex_unlock(&ddata->lock);
+ return r;
}
-static void dsicm_disable(struct omap_dss_device *dssdev)
+static int dsicm_unprepare(struct drm_panel *panel)
{
- struct panel_drv_data *ddata = to_panel_data(dssdev);
+ struct panel_drv_data *ddata = panel_to_ddata(panel);
+ int r;
dsicm_bl_power(ddata, false);
mutex_lock(&ddata->lock);
- dsicm_power_off(ddata);
+ r = dsicm_power_off(ddata);
mutex_unlock(&ddata->lock);
-}
-
-static void dsicm_post_disable(struct omap_dss_device *dssdev)
-{
- struct panel_drv_data *ddata = to_panel_data(dssdev);
- int r;
- r = regulator_bulk_disable(DCS_REGULATOR_SUPPLY_NUM, ddata->supplies);
- if (r)
- dev_err(&ddata->dsi->dev, "failed to disable supplies: %d\n", r);
+ return r;
}
static int _dsicm_enable_te(struct panel_drv_data *ddata, bool enable)
@@ -472,50 +433,35 @@ static int _dsicm_enable_te(struct panel_drv_data *ddata, bool enable)
return r;
}
-static int dsicm_get_modes(struct omap_dss_device *dssdev,
- struct drm_connector *connector)
+static int dsicm_get_modes(struct drm_panel *panel)
{
- struct panel_drv_data *ddata = to_panel_data(dssdev);
-
- connector->display_info.width_mm = ddata->width_mm;
- connector->display_info.height_mm = ddata->height_mm;
-
- return omapdss_display_get_modes(connector, &ddata->vm);
-}
-
-static int dsicm_check_timings(struct omap_dss_device *dssdev,
- struct drm_display_mode *mode)
-{
- struct panel_drv_data *ddata = to_panel_data(dssdev);
- int ret = 0;
+ struct panel_drv_data *ddata = panel_to_ddata(panel);
+ struct drm_connector *connector = panel->connector;
+ struct drm_display_mode *mode;
+
+ mode = drm_mode_duplicate(panel->drm, &ddata->mode);
+ if (!mode) {
+ dev_err(&ddata->dsi->dev, "failed to add mode %ux%ux@%u\n",
+ ddata->mode.hdisplay, ddata->mode.vdisplay,
+ ddata->mode.vrefresh);
+ return -ENOMEM;
+ }
- if (mode->hdisplay != ddata->vm.hactive)
- ret = -EINVAL;
+ drm_mode_set_name(mode);
- if (mode->vdisplay != ddata->vm.vactive)
- ret = -EINVAL;
+ mode->type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED;
+ drm_mode_probed_add(connector, mode);
- if (ret) {
- dev_warn(dssdev->dev, "wrong resolution: %d x %d",
- mode->hdisplay, mode->vdisplay);
- dev_warn(dssdev->dev, "panel resolution: %d x %d",
- ddata->vm.hactive, ddata->vm.vactive);
- }
+ connector->display_info.width_mm = ddata->width_mm;
+ connector->display_info.height_mm = ddata->height_mm;
- return ret;
+ return 1;
}
-static const struct omap_dss_device_ops dsicm_ops = {
- .connect = dsicm_connect,
- .disconnect = dsicm_disconnect,
-
- .pre_enable = dsicm_pre_enable,
- .enable = dsicm_enable,
- .disable = dsicm_disable,
- .post_disable = dsicm_post_disable,
-
- .get_modes = dsicm_get_modes,
- .check_timings = dsicm_check_timings,
+static const struct drm_panel_funcs dsicm_panel_funcs = {
+ .unprepare = dsicm_unprepare,
+ .prepare = dsicm_prepare,
+ .get_modes = dsicm_get_modes,
};
static int dsicm_probe_of(struct mipi_dsi_device *dsi)
@@ -524,8 +470,12 @@ static int dsicm_probe_of(struct mipi_dsi_device *dsi)
struct device_node *backlight;
struct panel_drv_data *ddata = mipi_dsi_get_drvdata(dsi);
struct display_timing timing;
+ struct videomode vm;
int err;
+ vm.hactive = 864;
+ vm.vactive = 480;
+
ddata->reset_gpio = devm_gpiod_get(&dsi->dev, "reset", GPIOD_OUT_LOW);
if (IS_ERR(ddata->reset_gpio)) {
err = PTR_ERR(ddata->reset_gpio);
@@ -535,15 +485,16 @@ static int dsicm_probe_of(struct mipi_dsi_device *dsi)
err = of_get_display_timing(node, "panel-timing", &timing);
if (!err) {
- videomode_from_timing(&timing, &ddata->vm);
- if (!ddata->vm.pixelclock)
- ddata->vm.pixelclock =
- ddata->vm.hactive * ddata->vm.vactive * 60;
+ videomode_from_timing(&timing, &vm);
} else {
dev_warn(&dsi->dev,
"failed to get video timing, using defaults\n");
}
+ if (!vm.pixelclock)
+ vm.pixelclock = vm.hactive * vm.vactive * 60;
+ drm_display_mode_from_videomode(&vm, &ddata->mode);
+
ddata->width_mm = 0;
of_property_read_u32(node, "width-mm", &ddata->width_mm);
@@ -579,7 +530,6 @@ static int dsicm_probe(struct mipi_dsi_device *dsi)
struct panel_drv_data *ddata;
struct backlight_device *bldev = NULL;
struct device *dev = &dsi->dev;
- struct omap_dss_device *dssdev;
int r;
dev_dbg(dev, "probe\n");
@@ -591,33 +541,18 @@ static int dsicm_probe(struct mipi_dsi_device *dsi)
mipi_dsi_set_drvdata(dsi, ddata);
ddata->dsi = dsi;
- ddata->vm.hactive = 864;
- ddata->vm.vactive = 480;
- ddata->vm.pixelclock = 864 * 480 * 60;
-
r = dsicm_probe_of(dsi);
if (r)
return r;
- dssdev = &ddata->dssdev;
- dssdev->dev = dev;
- dssdev->ops = &dsicm_ops;
- dssdev->type = OMAP_DISPLAY_TYPE_DSI;
- dssdev->display = true;
- dssdev->owner = THIS_MODULE;
- dssdev->of_ports = BIT(0);
- dssdev->ops_flags = OMAP_DSS_DEVICE_OP_MODES;
-
- dssdev->caps = OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE |
- OMAP_DSS_DISPLAY_CAP_TEAR_ELIM;
-
- omapdss_display_init(dssdev);
- omapdss_device_register(dssdev);
-
mutex_init(&ddata->lock);
dsicm_hw_reset(ddata);
+ drm_panel_init(&ddata->panel);
+ ddata->panel.dev = dev;
+ ddata->panel.funcs = &dsicm_panel_funcs;
+
if (ddata->use_dsi_backlight) {
struct backlight_properties props = { 0 };
props.max_brightness = 255;
@@ -649,6 +584,10 @@ static int dsicm_probe(struct mipi_dsi_device *dsi)
if (ddata->ulps_enabled)
dsi->mode_flags |= MIPI_DSI_MODE_ULPS_IDLE;
+ r = drm_panel_add(&ddata->panel);
+ if (r < 0)
+ goto err_panel_add;
+
r = mipi_dsi_attach(dsi);
if (r < 0)
goto err_dsi_attach;
@@ -656,6 +595,8 @@ static int dsicm_probe(struct mipi_dsi_device *dsi)
return 0;
err_dsi_attach:
+ drm_panel_remove(&ddata->panel);
+err_panel_add:
sysfs_remove_group(&dsi->dev.kobj, &dsicm_attr_group);
err_bl:
if (ddata->extbldev)
@@ -667,15 +608,12 @@ err_bl:
static int __exit dsicm_remove(struct mipi_dsi_device *dsi)
{
struct panel_drv_data *ddata = mipi_dsi_get_drvdata(dsi);
- struct omap_dss_device *dssdev = &ddata->dssdev;
dev_dbg(&dsi->dev, "remove\n");
mipi_dsi_detach(dsi);
- omapdss_device_unregister(dssdev);
-
- omapdss_device_disconnect(ddata->src, dssdev);
+ drm_panel_remove(&ddata->panel);
sysfs_remove_group(&dsi->dev.kobj, &dsicm_attr_group);
@@ -689,7 +627,7 @@ static int __exit dsicm_remove(struct mipi_dsi_device *dsi)
}
static const struct of_device_id dsicm_of_match[] = {
- { .compatible = "omapdss,panel-dsi-cm", },
+ { .compatible = "panel-dsi-cm", },
{},
};
diff --git a/drivers/gpu/drm/omapdrm/dss/dsi.c b/drivers/gpu/drm/omapdrm/dss/dsi.c
index 51c7be068c69d5..56f1b469df4b17 100644
--- a/drivers/gpu/drm/omapdrm/dss/dsi.c
+++ b/drivers/gpu/drm/omapdrm/dss/dsi.c
@@ -48,6 +48,7 @@
#include <video/mipi_display.h>
#include <drm/drm_mipi_dsi.h>
+#include <drm/drm_panel.h>
#include "omapdss.h"
#include "dss.h"
@@ -231,6 +232,8 @@ static int dsi_vc_send_null(struct dsi_data *dsi, int channel);
static ssize_t _omap_dsi_host_transfer(struct dsi_data *dsi,
const struct mipi_dsi_msg *msg);
+static void dsi_display_disable(struct omap_dss_device *dssdev);
+
/* DSI PLL HSDIV indices */
#define HSDIV_DISPC 0
#define HSDIV_DSI 1
@@ -397,6 +400,7 @@ struct dsi_data {
bool te_enabled;
bool ulps_enabled;
bool ulps_auto_idle;
+ bool video_enabled;
struct delayed_work ulps_work;
@@ -437,6 +441,8 @@ struct dsi_data {
unsigned int scp_clk_refcount;
+ struct omap_dss_dsi_config config;
+
struct dss_lcd_mgr_config mgr_config;
struct videomode vm;
enum mipi_dsi_pixel_format pix_fmt;
@@ -3637,7 +3643,7 @@ static int dsi_configure_pins(struct omap_dss_device *dssdev,
return 0;
}
-static int dsi_enable_video_output(struct omap_dss_device *dssdev, int channel)
+static void dsi_enable_video_output(struct omap_dss_device *dssdev, int channel)
{
struct dsi_data *dsi = to_dsi_data(dssdev);
int bpp = mipi_dsi_pixel_format_to_bpp(dsi->pix_fmt);
@@ -3646,8 +3652,10 @@ static int dsi_enable_video_output(struct omap_dss_device *dssdev, int channel)
int r;
r = dsi_display_init_dispc(dsi);
- if (r)
- return r;
+ if (r) {
+ dev_err(dsi->dev, "failed to init dispc!\n");
+ return;
+ }
if (dsi->mode == OMAP_DSS_DSI_VIDEO_MODE) {
switch (dsi->pix_fmt) {
@@ -3687,7 +3695,7 @@ static int dsi_enable_video_output(struct omap_dss_device *dssdev, int channel)
if (r)
goto err_mgr_enable;
- return 0;
+ return;
err_mgr_enable:
if (dsi->mode == OMAP_DSS_DSI_VIDEO_MODE) {
@@ -3696,7 +3704,8 @@ err_mgr_enable:
}
err_pix_fmt:
dsi_display_uninit_dispc(dsi);
- return r;
+ dev_err(dsi->dev, "failed to enable DSI encoder!\n");
+ return;
}
static void dsi_disable_video_output(struct omap_dss_device *dssdev, int channel)
@@ -3717,6 +3726,27 @@ static void dsi_disable_video_output(struct omap_dss_device *dssdev, int channel
dss_mgr_disable(&dsi->output);
dsi_display_uninit_dispc(dsi);
+
+ dsi->vc[channel].dest = NULL;
+}
+
+static void dsi_disable_video_outputs(struct omap_dss_device *dssdev)
+{
+ struct dsi_data *dsi = to_dsi_data(dssdev);
+ int i;
+
+ dsi_bus_lock(dsi);
+ dsi->video_enabled = false;
+
+ for (i = 0; i < 3; i++) {
+ if (!dsi->vc[i].dest)
+ continue;
+ dsi_disable_video_output(dssdev, i);
+ }
+
+ dsi_display_disable(dssdev);
+
+ dsi_bus_unlock(dsi);
}
static void dsi_update_screen_dispc(struct dsi_data *dsi)
@@ -3913,6 +3943,11 @@ static int dsi_update_channel(struct omap_dss_device *dssdev, int channel)
dsi_bus_lock(dsi);
+ if (!dsi->video_enabled) {
+ r = -EIO;
+ goto err;
+ }
+
if (!dsi->vc[channel].dest) {
r = -ENODEV;
goto err;
@@ -3958,7 +3993,7 @@ static int dsi_update_all(struct omap_dss_device *dssdev)
for (i = 0; i < 4; i++) {
r = dsi_update_channel(dssdev, i);
- if (r != -ENODEV)
+ if (r && r != -ENODEV)
return r;
}
@@ -4181,8 +4216,30 @@ static void dsi_display_enable(struct omap_dss_device *dssdev)
{
struct dsi_data *dsi = to_dsi_data(dssdev);
DSSDBG("dsi_display_enable\n");
- dsi_bus_lock(dsi);
+ WARN_ON(!dsi_bus_is_locked(dsi));
+
dsi_display_ulps_enable(dsi);
+}
+
+static void dsi_enable_video_outputs(struct omap_dss_device *dssdev)
+{
+ struct dsi_data *dsi = to_dsi_data(dssdev);
+ int i;
+
+ dsi_bus_lock(dsi);
+
+ dsi_display_enable(dssdev);
+
+ for (i = 0; i < 3; i++) {
+ if (!dsi->vc[i].dest)
+ continue;
+ dsi_enable_video_output(dssdev, i);
+ }
+
+ dsi->video_enabled = true;
+
+ dsi_set_ulps_auto(dsi, true);
+
dsi_bus_unlock(dsi);
}
@@ -4208,10 +4265,10 @@ static void dsi_display_ulps_disable(struct dsi_data *dsi,
static void dsi_display_disable(struct omap_dss_device *dssdev)
{
struct dsi_data *dsi = to_dsi_data(dssdev);
+ WARN_ON(!dsi_bus_is_locked(dsi));
DSSDBG("dsi_display_disable\n");
- dsi_bus_lock(dsi);
+
dsi_display_ulps_disable(dsi, true, false);
- dsi_bus_unlock(dsi);
}
static int dsi_enable_te(struct dsi_data *dsi, bool enable)
@@ -4741,15 +4798,26 @@ static bool dsi_vm_calc(struct dsi_data *dsi,
dsi_vm_calc_pll_cb, ctx);
}
+static bool dsi_is_video_mode(struct omap_dss_device *dssdev)
+{
+ struct dsi_data *dsi = to_dsi_data(dssdev);
+
+ return (dsi->mode == OMAP_DSS_DSI_VIDEO_MODE);
+}
+
static int dsi_set_config(struct omap_dss_device *dssdev,
- const struct omap_dss_dsi_config *config)
+ const struct drm_display_mode *mode)
{
struct dsi_data *dsi = to_dsi_data(dssdev);
struct dsi_clk_calc_ctx ctx;
- struct omap_dss_dsi_config cfg = *config;
+ struct videomode vm;
+ struct omap_dss_dsi_config cfg = dsi->config;
bool ok;
int r;
+ drm_display_mode_to_videomode(mode, &vm);
+ cfg.vm = &vm;
+
mutex_lock(&dsi->lock);
cfg.mode = dsi->mode;
@@ -4912,9 +4980,15 @@ static ssize_t omap_dsi_host_transfer(struct mipi_dsi_host *host,
int r;
dsi_bus_lock(dsi);
- dsi_set_ulps_auto(dsi, false);
- r = _omap_dsi_host_transfer(dsi, msg);
- dsi_set_ulps_auto(dsi, true);
+
+ if (dsi->video_enabled) {
+ dsi_set_ulps_auto(dsi, false);
+ r = _omap_dsi_host_transfer(dsi, msg);
+ dsi_set_ulps_auto(dsi, true);
+ } else {
+ r = -EIO;
+ }
+
dsi_bus_unlock(dsi);
return r;
@@ -4935,6 +5009,23 @@ static int dsi_get_clocks(struct dsi_data *dsi)
return 0;
}
+static void dsi_set_timings(struct omap_dss_device *dssdev,
+ const struct drm_display_mode *mode)
+{
+ DSSDBG("dsi_set_timings\n");
+ dsi_set_config(dssdev, mode);
+}
+
+static int dsi_check_timings(struct omap_dss_device *dssdev,
+ struct drm_display_mode *mode)
+{
+ DSSDBG("dsi_check_timings\n");
+
+ /* TODO */
+
+ return 0;
+}
+
static int dsi_connect(struct omap_dss_device *src,
struct omap_dss_device *dst)
{
@@ -4950,16 +5041,15 @@ static void dsi_disconnect(struct omap_dss_device *src,
static const struct omap_dss_device_ops dsi_ops = {
.connect = dsi_connect,
.disconnect = dsi_disconnect,
- .enable = dsi_display_enable,
- .disable = dsi_display_disable,
-
- .dsi = {
- .set_config = dsi_set_config,
+ .enable = dsi_enable_video_outputs,
+ .disable = dsi_disable_video_outputs,
- .enable_video_output = dsi_enable_video_output,
- .disable_video_output = dsi_disable_video_output,
+ .check_timings = dsi_check_timings,
+ .set_timings = dsi_set_timings,
+ .dsi = {
.update = dsi_update_all,
+ .is_video_mode = dsi_is_video_mode,
},
};
@@ -5044,6 +5134,7 @@ int omap_dsi_host_attach(struct mipi_dsi_host *host,
{
struct dsi_data *dsi = host_to_omap(host);
unsigned int channel = client->channel;
+ struct drm_panel *panel;
int r;
if (channel > 3)
@@ -5056,6 +5147,10 @@ int omap_dsi_host_attach(struct mipi_dsi_host *host,
dsi_bus_lock(dsi);
+ panel = of_drm_find_panel(client->dev.of_node);
+ if (IS_ERR(panel))
+ return PTR_ERR(panel);
+
atomic_set(&dsi->do_ext_te_update, 0);
if (client->mode_flags & MIPI_DSI_MODE_VIDEO) {
@@ -5076,8 +5171,12 @@ int omap_dsi_host_attach(struct mipi_dsi_host *host,
INIT_DEFERRABLE_WORK(&dsi->ulps_work,
omap_dsi_ulps_work_callback);
+ dsi->config.hs_clk_min = 150000000; // TODO: get from client?
+ dsi->config.hs_clk_max = client->hs_rate;
+ dsi->config.lp_clk_min = 7000000; // TODO: get from client?
+ dsi->config.lp_clk_max = client->lp_rate;
+
dsi->ulps_auto_idle = !!(client->mode_flags & MIPI_DSI_MODE_ULPS_IDLE);
- dsi_set_ulps_auto(dsi, true);
dsi_bus_unlock(dsi);
return 0;
diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss-boot-init.c b/drivers/gpu/drm/omapdrm/dss/omapdss-boot-init.c
index 2b41c75ce98830..606def96b96d96 100644
--- a/drivers/gpu/drm/omapdrm/dss/omapdss-boot-init.c
+++ b/drivers/gpu/drm/omapdrm/dss/omapdss-boot-init.c
@@ -189,7 +189,6 @@ static const struct of_device_id omapdss_of_fixups_whitelist[] __initconst = {
{ .compatible = "hdmi-connector" },
{ .compatible = "lgphilips,lb035q02" },
{ .compatible = "nec,nl8048hl11" },
- { .compatible = "panel-dsi-cm" },
{ .compatible = "sharp,ls037v7dw01" },
{ .compatible = "sony,acx565akm" },
{ .compatible = "svideo-connector" },
diff --git a/drivers/gpu/drm/omapdrm/dss/omapdss.h b/drivers/gpu/drm/omapdrm/dss/omapdss.h
index 1106e36688d947..2b8a05cd26a4cf 100644
--- a/drivers/gpu/drm/omapdrm/dss/omapdss.h
+++ b/drivers/gpu/drm/omapdrm/dss/omapdss.h
@@ -133,11 +133,6 @@ enum omap_dss_dsi_mode {
OMAP_DSS_DSI_VIDEO_MODE,
};
-enum omap_display_caps {
- OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE = 1 << 0,
- OMAP_DSS_DISPLAY_CAP_TEAR_ELIM = 1 << 1,
-};
-
enum omap_dss_display_state {
OMAP_DSS_DISPLAY_DISABLED = 0,
OMAP_DSS_DISPLAY_ACTIVE,
@@ -299,14 +294,7 @@ struct omapdss_hdmi_ops {
struct omapdss_dsi_ops {
int (*update)(struct omap_dss_device *dssdev);
-
- /* legacy API used by omapdss panels */
- int (*set_config)(struct omap_dss_device *dssdev,
- const struct omap_dss_dsi_config *cfg);
-
- int (*enable_video_output)(struct omap_dss_device *dssdev, int channel);
- void (*disable_video_output)(struct omap_dss_device *dssdev,
- int channel);
+ bool (*is_video_mode)(struct omap_dss_device *dssdev);
};
struct omap_dss_device_ops {
@@ -385,13 +373,10 @@ struct omap_dss_device {
const char *name;
- const struct omap_dss_driver *driver;
const struct omap_dss_device_ops *ops;
unsigned long ops_flags;
u32 bus_flags;
- enum omap_display_caps caps;
-
enum omap_dss_display_state state;
/* OMAP DSS output specific fields */
@@ -406,11 +391,6 @@ struct omap_dss_device {
unsigned int of_ports;
};
-struct omap_dss_driver {
- int (*update)(struct omap_dss_device *dssdev,
- u16 x, u16 y, u16 w, u16 h);
-};
-
struct dss_device *omapdss_get_dss(void);
void omapdss_set_dss(struct dss_device *dss);
static inline bool omapdss_is_initialized(void)
diff --git a/drivers/gpu/drm/omapdrm/omap_crtc.c b/drivers/gpu/drm/omapdrm/omap_crtc.c
index dac0d9b8e8bee9..de2bda3ab7f7c5 100644
--- a/drivers/gpu/drm/omapdrm/omap_crtc.c
+++ b/drivers/gpu/drm/omapdrm/omap_crtc.c
@@ -506,8 +506,7 @@ static enum drm_mode_status omap_crtc_mode_valid(struct drm_crtc *crtc,
* valid DISPC mode. DSI will calculate and configure the
* proper DISPC mode later.
*/
- if (omap_crtc->pipe->output->next == NULL ||
- omap_crtc->pipe->output->next->type != OMAP_DISPLAY_TYPE_DSI) {
+ if (omap_crtc->pipe->output->type != OMAP_DISPLAY_TYPE_DSI) {
r = priv->dispc_ops->mgr_check_timings(priv->dispc,
omap_crtc->channel,
&vm);
@@ -559,17 +558,17 @@ static void omap_crtc_mode_set_nofb(struct drm_crtc *crtc)
static bool omap_crtc_is_manually_updated(struct drm_crtc *crtc)
{
struct omap_crtc *omap_crtc = to_omap_crtc(crtc);
- struct omap_dss_device *display = omap_crtc->pipe->output->next;
+ struct omap_dss_device *dssdev = omap_crtc->pipe->output;
- if (!display)
+ if (dssdev->type != OMAP_DISPLAY_TYPE_DSI ||
+ !dssdev->ops->dsi.is_video_mode)
return false;
- if (display->caps & OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE) {
- DBG("detected manually updated display!");
- return true;
- }
+ if (dssdev->ops->dsi.is_video_mode(dssdev))
+ return false;
- return false;
+ DBG("detected manually updated display!");
+ return true;
}
static int omap_crtc_atomic_check(struct drm_crtc *crtc,