From 3e0e3811550407251c9332ae7be5bfffc5b8f96d Mon Sep 17 00:00:00 2001 From: Grazvydas Ignotas Date: Thu, 29 Mar 2012 00:03:08 +0300 Subject: [PATCH] OMAPDSS: VENC: allow switching venc type at runtime VENC type (composite/svideo) doesn't have to be fixed by board wiring, it is possible to provide both connectors, which is what pandora does. Having to recompile the kernel for users who have TV connector types that's don't match default board setting is very inconvenient, especially for users of a consumer device, so add support for switching VENC type at runtime over a new sysfs file venc_type. Signed-off-by: Grazvydas Ignotas --- Documentation/arm/OMAP/DSS | 1 + drivers/video/omap2/dss/venc.c | 55 +++++++++++++++++++++++++++++++++- 2 files changed, 55 insertions(+), 1 deletion(-) diff --git a/Documentation/arm/OMAP/DSS b/Documentation/arm/OMAP/DSS index 888ae7b83ae4..18e22144676b 100644 --- a/Documentation/arm/OMAP/DSS +++ b/Documentation/arm/OMAP/DSS @@ -156,6 +156,7 @@ timings Display timings (pixclock,xres/hfp/hbp/hsw,yres/vfp/vbp/vsw) "pal" and "ntsc" panel_name tear_elim Tearing elimination 0=off, 1=on +venc_type Output type (video encoder only): "composite" or "svideo" There are also some debugfs files at /omapdss/ which show information about clocks and registers. diff --git a/drivers/video/omap2/dss/venc.c b/drivers/video/omap2/dss/venc.c index dee2ec4ba1f8..26e94d52fde4 100644 --- a/drivers/video/omap2/dss/venc.c +++ b/drivers/video/omap2/dss/venc.c @@ -469,16 +469,69 @@ unsigned long venc_get_pixel_clock(void) return 13500000; } +static ssize_t display_venc_type_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct omap_dss_device *dssdev = to_dss_device(dev); + const char *ret; + + switch (dssdev->phy.venc.type) { + case OMAP_DSS_VENC_TYPE_COMPOSITE: + ret = "composite"; + break; + case OMAP_DSS_VENC_TYPE_SVIDEO: + ret = "svideo"; + break; + default: + ret = "unknown"; + break; + } + + return snprintf(buf, PAGE_SIZE, "%s\n", ret); +} + +static ssize_t display_venc_type_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t size) +{ + struct omap_dss_device *dssdev = to_dss_device(dev); + enum omap_dss_venc_type new_type; + + if (strncmp("composite", buf, 9) == 0) + new_type = OMAP_DSS_VENC_TYPE_COMPOSITE; + else if (strncmp("svideo", buf, 6) == 0) + new_type = OMAP_DSS_VENC_TYPE_SVIDEO; + else + return -EINVAL; + + mutex_lock(&venc.venc_lock); + + if (dssdev->phy.venc.type != new_type) { + dssdev->phy.venc.type = new_type; + if (dssdev->state == OMAP_DSS_DISPLAY_ACTIVE) { + venc_power_off(dssdev); + venc_power_on(dssdev); + } + } + + mutex_unlock(&venc.venc_lock); + + return size; +} + +static DEVICE_ATTR(venc_type, S_IRUGO | S_IWUSR, + display_venc_type_show, display_venc_type_store); + /* driver */ static int venc_panel_probe(struct omap_dss_device *dssdev) { dssdev->panel.timings = omap_dss_pal_timings; - return 0; + return device_create_file(&dssdev->dev, &dev_attr_venc_type); } static void venc_panel_remove(struct omap_dss_device *dssdev) { + device_remove_file(&dssdev->dev, &dev_attr_venc_type); } static int venc_panel_enable(struct omap_dss_device *dssdev) -- 2.39.2