|
@@ -564,6 +564,16 @@ int omapdss_venc_check_timings(struct omap_dss_device *dssdev,
|
|
|
return -EINVAL;
|
|
|
}
|
|
|
|
|
|
+static void venc_get_timings(struct omap_dss_device *dssdev,
|
|
|
+ struct omap_video_timings *timings)
|
|
|
+{
|
|
|
+ mutex_lock(&venc.venc_lock);
|
|
|
+
|
|
|
+ *timings = venc.timings;
|
|
|
+
|
|
|
+ mutex_unlock(&venc.venc_lock);
|
|
|
+}
|
|
|
+
|
|
|
u32 omapdss_venc_get_wss(struct omap_dss_device *dssdev)
|
|
|
{
|
|
|
/* Invert due to VENC_L21_WC_CTL:INV=1 */
|
|
@@ -779,6 +789,67 @@ static int venc_probe_pdata(struct platform_device *vencdev)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static int venc_connect(struct omap_dss_device *dssdev,
|
|
|
+ struct omap_dss_device *dst)
|
|
|
+{
|
|
|
+ struct omap_overlay_manager *mgr;
|
|
|
+ int r;
|
|
|
+
|
|
|
+ r = venc_init_regulator();
|
|
|
+ if (r)
|
|
|
+ return r;
|
|
|
+
|
|
|
+ mgr = omap_dss_get_overlay_manager(dssdev->dispc_channel);
|
|
|
+ if (!mgr)
|
|
|
+ return -ENODEV;
|
|
|
+
|
|
|
+ r = dss_mgr_connect(mgr, dssdev);
|
|
|
+ if (r)
|
|
|
+ return r;
|
|
|
+
|
|
|
+ r = omapdss_output_set_device(dssdev, dst);
|
|
|
+ if (r) {
|
|
|
+ DSSERR("failed to connect output to new device: %s\n",
|
|
|
+ dst->name);
|
|
|
+ dss_mgr_disconnect(mgr, dssdev);
|
|
|
+ return r;
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static void venc_disconnect(struct omap_dss_device *dssdev,
|
|
|
+ struct omap_dss_device *dst)
|
|
|
+{
|
|
|
+ WARN_ON(dst != dssdev->device);
|
|
|
+
|
|
|
+ if (dst != dssdev->device)
|
|
|
+ return;
|
|
|
+
|
|
|
+ omapdss_output_unset_device(dssdev);
|
|
|
+
|
|
|
+ if (dssdev->manager)
|
|
|
+ dss_mgr_disconnect(dssdev->manager, dssdev);
|
|
|
+}
|
|
|
+
|
|
|
+static const struct omapdss_atv_ops venc_ops = {
|
|
|
+ .connect = venc_connect,
|
|
|
+ .disconnect = venc_disconnect,
|
|
|
+
|
|
|
+ .enable = omapdss_venc_display_enable,
|
|
|
+ .disable = omapdss_venc_display_disable,
|
|
|
+
|
|
|
+ .check_timings = omapdss_venc_check_timings,
|
|
|
+ .set_timings = omapdss_venc_set_timings,
|
|
|
+ .get_timings = venc_get_timings,
|
|
|
+
|
|
|
+ .set_type = omapdss_venc_set_type,
|
|
|
+ .invert_vid_out_polarity = omapdss_venc_invert_vid_out_polarity,
|
|
|
+
|
|
|
+ .set_wss = omapdss_venc_set_wss,
|
|
|
+ .get_wss = omapdss_venc_get_wss,
|
|
|
+};
|
|
|
+
|
|
|
static void venc_init_output(struct platform_device *pdev)
|
|
|
{
|
|
|
struct omap_dss_device *out = &venc.output;
|
|
@@ -788,6 +859,7 @@ static void venc_init_output(struct platform_device *pdev)
|
|
|
out->output_type = OMAP_DISPLAY_TYPE_VENC;
|
|
|
out->name = "venc.0";
|
|
|
out->dispc_channel = OMAP_DSS_CHANNEL_DIGIT;
|
|
|
+ out->ops.atv = &venc_ops;
|
|
|
out->owner = THIS_MODULE;
|
|
|
|
|
|
omapdss_register_output(out);
|