aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/video
diff options
context:
space:
mode:
authorGrazvydas Ignotas <notasas@gmail.com>2012-04-23 17:08:54 -0400
committerTomi Valkeinen <tomi.valkeinen@ti.com>2012-05-11 07:44:13 -0400
commit0aca3c63e068e47616bdd54b9d19e4771db86e8e (patch)
tree9d73c3bb318180b6c80cc4446f03983f2b698bf4 /drivers/video
parent9b71fb5cbcdd83c65e5fe6db9cd12246f7ea0262 (diff)
OMAPDSS: VENC: allow switching venc output type at runtime
VENC output type (composite/svideo) doesn't have to be fixed by board wiring, it is possible to also provide composite signal through svideo luminance connector (software enabled), which is what pandora does. Having to recompile the kernel for users who have TV connector types that don't match default board setting is very inconvenient, especially for users of a consumer device, so add support for switching VENC output type at runtime over a new sysfs file output_type. Signed-off-by: Grazvydas Ignotas <notasas@gmail.com> Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
Diffstat (limited to 'drivers/video')
-rw-r--r--drivers/video/omap2/dss/venc.c54
1 files changed, 53 insertions, 1 deletions
diff --git a/drivers/video/omap2/dss/venc.c b/drivers/video/omap2/dss/venc.c
index e2374645a44..9475e6edce6 100644
--- a/drivers/video/omap2/dss/venc.c
+++ b/drivers/video/omap2/dss/venc.c
@@ -490,16 +490,68 @@ unsigned long venc_get_pixel_clock(void)
490 return 13500000; 490 return 13500000;
491} 491}
492 492
493static ssize_t display_output_type_show(struct device *dev,
494 struct device_attribute *attr, char *buf)
495{
496 struct omap_dss_device *dssdev = to_dss_device(dev);
497 const char *ret;
498
499 switch (dssdev->phy.venc.type) {
500 case OMAP_DSS_VENC_TYPE_COMPOSITE:
501 ret = "composite";
502 break;
503 case OMAP_DSS_VENC_TYPE_SVIDEO:
504 ret = "svideo";
505 break;
506 default:
507 return -EINVAL;
508 }
509
510 return snprintf(buf, PAGE_SIZE, "%s\n", ret);
511}
512
513static ssize_t display_output_type_store(struct device *dev,
514 struct device_attribute *attr, const char *buf, size_t size)
515{
516 struct omap_dss_device *dssdev = to_dss_device(dev);
517 enum omap_dss_venc_type new_type;
518
519 if (sysfs_streq("composite", buf))
520 new_type = OMAP_DSS_VENC_TYPE_COMPOSITE;
521 else if (sysfs_streq("svideo", buf))
522 new_type = OMAP_DSS_VENC_TYPE_SVIDEO;
523 else
524 return -EINVAL;
525
526 mutex_lock(&venc.venc_lock);
527
528 if (dssdev->phy.venc.type != new_type) {
529 dssdev->phy.venc.type = new_type;
530 if (dssdev->state == OMAP_DSS_DISPLAY_ACTIVE) {
531 venc_power_off(dssdev);
532 venc_power_on(dssdev);
533 }
534 }
535
536 mutex_unlock(&venc.venc_lock);
537
538 return size;
539}
540
541static DEVICE_ATTR(output_type, S_IRUGO | S_IWUSR,
542 display_output_type_show, display_output_type_store);
543
493/* driver */ 544/* driver */
494static int venc_panel_probe(struct omap_dss_device *dssdev) 545static int venc_panel_probe(struct omap_dss_device *dssdev)
495{ 546{
496 dssdev->panel.timings = omap_dss_pal_timings; 547 dssdev->panel.timings = omap_dss_pal_timings;
497 548
498 return 0; 549 return device_create_file(&dssdev->dev, &dev_attr_output_type);
499} 550}
500 551
501static void venc_panel_remove(struct omap_dss_device *dssdev) 552static void venc_panel_remove(struct omap_dss_device *dssdev)
502{ 553{
554 device_remove_file(&dssdev->dev, &dev_attr_output_type);
503} 555}
504 556
505static int venc_panel_enable(struct omap_dss_device *dssdev) 557static int venc_panel_enable(struct omap_dss_device *dssdev)