-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge tag 'omapdss-for-3.11-2' of git://gitorious.org/linux-omap-dss2…
…/linux into fbdev/for-next OMAP display subsystem changes for 3.11 (part 2/2) This is the second part of OMAP DSS changes for 3.11. This part contains the new DSS device model support. The current OMAP panel drivers use a custom DSS bus, and there's a hard limit of one external display block per video pipeline. In the new DSS device model the devices/drivers are made according to the control bus of the display block, usually platform, i2c or spi. The display blocks can also be chained so that we can have separate drivers for setups with both external encoder and panel. To allow the current board files, which use the old style panels, to function, the old display drivers are left in their current state, and new ones are added to drivers/video/omap2/displays-new/. When the board files have been converted to use the new style panels, we can remove the old code. This is planned to happen in v3.12. Having to support two very different DSS device models makes the driver somewhat confusing in some parts, and prevents us from properly cleaning up some other parts. These cleanups will be done when the old code is removed. The new device model is designed with CDF (Common Display Framework) in mind. While CDF is still under work, the new DSS device model should be much more similar to CDF's model than the old device model, which should make the eventual conversion to CDF much easier.
- Loading branch information
Showing
30 changed files
with
6,911 additions
and
36 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,73 @@ | ||
menu "OMAP Display Device Drivers (new device model)" | ||
depends on OMAP2_DSS | ||
|
||
config DISPLAY_ENCODER_TFP410 | ||
tristate "TFP410 DPI to DVI Encoder" | ||
help | ||
Driver for TFP410 DPI to DVI encoder. | ||
|
||
config DISPLAY_ENCODER_TPD12S015 | ||
tristate "TPD12S015 HDMI ESD protection and level shifter" | ||
help | ||
Driver for TPD12S015, which offers HDMI ESD protection and level | ||
shifting. | ||
|
||
config DISPLAY_CONNECTOR_DVI | ||
tristate "DVI Connector" | ||
depends on I2C | ||
help | ||
Driver for a generic DVI connector. | ||
|
||
config DISPLAY_CONNECTOR_HDMI | ||
tristate "HDMI Connector" | ||
help | ||
Driver for a generic HDMI connector. | ||
|
||
config DISPLAY_CONNECTOR_ANALOG_TV | ||
tristate "Analog TV Connector" | ||
help | ||
Driver for a generic analog TV connector. | ||
|
||
config DISPLAY_PANEL_DPI | ||
tristate "Generic DPI panel" | ||
help | ||
Driver for generic DPI panels. | ||
|
||
config DISPLAY_PANEL_DSI_CM | ||
tristate "Generic DSI Command Mode Panel" | ||
help | ||
Driver for generic DSI command mode panels. | ||
|
||
config DISPLAY_PANEL_SONY_ACX565AKM | ||
tristate "ACX565AKM Panel" | ||
depends on SPI && BACKLIGHT_CLASS_DEVICE | ||
help | ||
This is the LCD panel used on Nokia N900 | ||
|
||
config DISPLAY_PANEL_LGPHILIPS_LB035Q02 | ||
tristate "LG.Philips LB035Q02 LCD Panel" | ||
depends on SPI | ||
help | ||
LCD Panel used on the Gumstix Overo Palo35 | ||
|
||
config DISPLAY_PANEL_SHARP_LS037V7DW01 | ||
tristate "Sharp LS037V7DW01 LCD Panel" | ||
depends on BACKLIGHT_CLASS_DEVICE | ||
help | ||
LCD Panel used in TI's SDP3430 and EVM boards | ||
|
||
config DISPLAY_PANEL_TPO_TD043MTEA1 | ||
tristate "TPO TD043MTEA1 LCD Panel" | ||
depends on SPI | ||
help | ||
LCD Panel used in OMAP3 Pandora | ||
|
||
config DISPLAY_PANEL_NEC_NL8048HL11 | ||
tristate "NEC NL8048HL11 Panel" | ||
depends on SPI | ||
depends on BACKLIGHT_CLASS_DEVICE | ||
help | ||
This NEC NL8048HL11 panel is TFT LCD used in the | ||
Zoom2/3/3630 sdp boards. | ||
|
||
endmenu |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
obj-$(CONFIG_DISPLAY_ENCODER_TFP410) += encoder-tfp410.o | ||
obj-$(CONFIG_DISPLAY_ENCODER_TPD12S015) += encoder-tpd12s015.o | ||
obj-$(CONFIG_DISPLAY_CONNECTOR_DVI) += connector-dvi.o | ||
obj-$(CONFIG_DISPLAY_CONNECTOR_HDMI) += connector-hdmi.o | ||
obj-$(CONFIG_DISPLAY_CONNECTOR_ANALOG_TV) += connector-analog-tv.o | ||
obj-$(CONFIG_DISPLAY_PANEL_DPI) += panel-dpi.o | ||
obj-$(CONFIG_DISPLAY_PANEL_DSI_CM) += panel-dsi-cm.o | ||
obj-$(CONFIG_DISPLAY_PANEL_SONY_ACX565AKM) += panel-sony-acx565akm.o | ||
obj-$(CONFIG_DISPLAY_PANEL_LGPHILIPS_LB035Q02) += panel-lgphilips-lb035q02.o | ||
obj-$(CONFIG_DISPLAY_PANEL_SHARP_LS037V7DW01) += panel-sharp-ls037v7dw01.o | ||
obj-$(CONFIG_DISPLAY_PANEL_TPO_TD043MTEA1) += panel-tpo-td043mtea1.o | ||
obj-$(CONFIG_DISPLAY_PANEL_NEC_NL8048HL11) += panel-nec-nl8048hl11.o |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,265 @@ | ||
/* | ||
* Analog TV Connector driver | ||
* | ||
* Copyright (C) 2013 Texas Instruments | ||
* Author: Tomi Valkeinen <tomi.valkeinen@ti.com> | ||
* | ||
* This program is free software; you can redistribute it and/or modify it | ||
* under the terms of the GNU General Public License version 2 as published by | ||
* the Free Software Foundation. | ||
*/ | ||
|
||
#include <linux/slab.h> | ||
#include <linux/module.h> | ||
#include <linux/platform_device.h> | ||
|
||
#include <video/omapdss.h> | ||
#include <video/omap-panel-data.h> | ||
|
||
struct panel_drv_data { | ||
struct omap_dss_device dssdev; | ||
struct omap_dss_device *in; | ||
|
||
struct device *dev; | ||
|
||
struct omap_video_timings timings; | ||
|
||
enum omap_dss_venc_type connector_type; | ||
bool invert_polarity; | ||
}; | ||
|
||
#define to_panel_data(x) container_of(x, struct panel_drv_data, dssdev) | ||
|
||
static int tvc_connect(struct omap_dss_device *dssdev) | ||
{ | ||
struct panel_drv_data *ddata = to_panel_data(dssdev); | ||
struct omap_dss_device *in = ddata->in; | ||
int r; | ||
|
||
dev_dbg(ddata->dev, "connect\n"); | ||
|
||
if (omapdss_device_is_connected(dssdev)) | ||
return 0; | ||
|
||
r = in->ops.atv->connect(in, dssdev); | ||
if (r) | ||
return r; | ||
|
||
return 0; | ||
} | ||
|
||
static void tvc_disconnect(struct omap_dss_device *dssdev) | ||
{ | ||
struct panel_drv_data *ddata = to_panel_data(dssdev); | ||
struct omap_dss_device *in = ddata->in; | ||
|
||
dev_dbg(ddata->dev, "disconnect\n"); | ||
|
||
if (!omapdss_device_is_connected(dssdev)) | ||
return; | ||
|
||
in->ops.atv->disconnect(in, dssdev); | ||
} | ||
|
||
static int tvc_enable(struct omap_dss_device *dssdev) | ||
{ | ||
struct panel_drv_data *ddata = to_panel_data(dssdev); | ||
struct omap_dss_device *in = ddata->in; | ||
int r; | ||
|
||
dev_dbg(ddata->dev, "enable\n"); | ||
|
||
if (!omapdss_device_is_connected(dssdev)) | ||
return -ENODEV; | ||
|
||
if (omapdss_device_is_enabled(dssdev)) | ||
return 0; | ||
|
||
in->ops.atv->set_timings(in, &ddata->timings); | ||
|
||
in->ops.atv->set_type(in, ddata->connector_type); | ||
in->ops.atv->invert_vid_out_polarity(in, ddata->invert_polarity); | ||
|
||
r = in->ops.atv->enable(in); | ||
if (r) | ||
return r; | ||
|
||
dssdev->state = OMAP_DSS_DISPLAY_ACTIVE; | ||
|
||
return r; | ||
} | ||
|
||
static void tvc_disable(struct omap_dss_device *dssdev) | ||
{ | ||
struct panel_drv_data *ddata = to_panel_data(dssdev); | ||
struct omap_dss_device *in = ddata->in; | ||
|
||
dev_dbg(ddata->dev, "disable\n"); | ||
|
||
if (!omapdss_device_is_enabled(dssdev)) | ||
return; | ||
|
||
in->ops.atv->disable(in); | ||
|
||
dssdev->state = OMAP_DSS_DISPLAY_DISABLED; | ||
} | ||
|
||
static void tvc_set_timings(struct omap_dss_device *dssdev, | ||
struct omap_video_timings *timings) | ||
{ | ||
struct panel_drv_data *ddata = to_panel_data(dssdev); | ||
struct omap_dss_device *in = ddata->in; | ||
|
||
ddata->timings = *timings; | ||
dssdev->panel.timings = *timings; | ||
|
||
in->ops.atv->set_timings(in, timings); | ||
} | ||
|
||
static void tvc_get_timings(struct omap_dss_device *dssdev, | ||
struct omap_video_timings *timings) | ||
{ | ||
struct panel_drv_data *ddata = to_panel_data(dssdev); | ||
|
||
*timings = ddata->timings; | ||
} | ||
|
||
static int tvc_check_timings(struct omap_dss_device *dssdev, | ||
struct omap_video_timings *timings) | ||
{ | ||
struct panel_drv_data *ddata = to_panel_data(dssdev); | ||
struct omap_dss_device *in = ddata->in; | ||
|
||
return in->ops.atv->check_timings(in, timings); | ||
} | ||
|
||
static u32 tvc_get_wss(struct omap_dss_device *dssdev) | ||
{ | ||
struct panel_drv_data *ddata = to_panel_data(dssdev); | ||
struct omap_dss_device *in = ddata->in; | ||
|
||
return in->ops.atv->get_wss(in); | ||
} | ||
|
||
static int tvc_set_wss(struct omap_dss_device *dssdev, u32 wss) | ||
{ | ||
struct panel_drv_data *ddata = to_panel_data(dssdev); | ||
struct omap_dss_device *in = ddata->in; | ||
|
||
return in->ops.atv->set_wss(in, wss); | ||
} | ||
|
||
static struct omap_dss_driver tvc_driver = { | ||
.connect = tvc_connect, | ||
.disconnect = tvc_disconnect, | ||
|
||
.enable = tvc_enable, | ||
.disable = tvc_disable, | ||
|
||
.set_timings = tvc_set_timings, | ||
.get_timings = tvc_get_timings, | ||
.check_timings = tvc_check_timings, | ||
|
||
.get_resolution = omapdss_default_get_resolution, | ||
|
||
.get_wss = tvc_get_wss, | ||
.set_wss = tvc_set_wss, | ||
}; | ||
|
||
static int tvc_probe_pdata(struct platform_device *pdev) | ||
{ | ||
struct panel_drv_data *ddata = platform_get_drvdata(pdev); | ||
struct connector_atv_platform_data *pdata; | ||
struct omap_dss_device *in, *dssdev; | ||
|
||
pdata = dev_get_platdata(&pdev->dev); | ||
|
||
in = omap_dss_find_output(pdata->source); | ||
if (in == NULL) { | ||
dev_err(&pdev->dev, "Failed to find video source\n"); | ||
return -ENODEV; | ||
} | ||
|
||
ddata->in = in; | ||
|
||
ddata->connector_type = pdata->connector_type; | ||
ddata->invert_polarity = ddata->invert_polarity; | ||
|
||
dssdev = &ddata->dssdev; | ||
dssdev->name = pdata->name; | ||
|
||
return 0; | ||
} | ||
|
||
static int tvc_probe(struct platform_device *pdev) | ||
{ | ||
struct panel_drv_data *ddata; | ||
struct omap_dss_device *dssdev; | ||
int r; | ||
|
||
ddata = devm_kzalloc(&pdev->dev, sizeof(*ddata), GFP_KERNEL); | ||
if (!ddata) | ||
return -ENOMEM; | ||
|
||
platform_set_drvdata(pdev, ddata); | ||
ddata->dev = &pdev->dev; | ||
|
||
if (dev_get_platdata(&pdev->dev)) { | ||
r = tvc_probe_pdata(pdev); | ||
if (r) | ||
return r; | ||
} else { | ||
return -ENODEV; | ||
} | ||
|
||
ddata->timings = omap_dss_pal_timings; | ||
|
||
dssdev = &ddata->dssdev; | ||
dssdev->driver = &tvc_driver; | ||
dssdev->dev = &pdev->dev; | ||
dssdev->type = OMAP_DISPLAY_TYPE_VENC; | ||
dssdev->owner = THIS_MODULE; | ||
dssdev->panel.timings = omap_dss_pal_timings; | ||
|
||
r = omapdss_register_display(dssdev); | ||
if (r) { | ||
dev_err(&pdev->dev, "Failed to register panel\n"); | ||
goto err_reg; | ||
} | ||
|
||
return 0; | ||
err_reg: | ||
omap_dss_put_device(ddata->in); | ||
return r; | ||
} | ||
|
||
static int __exit tvc_remove(struct platform_device *pdev) | ||
{ | ||
struct panel_drv_data *ddata = platform_get_drvdata(pdev); | ||
struct omap_dss_device *dssdev = &ddata->dssdev; | ||
struct omap_dss_device *in = ddata->in; | ||
|
||
omapdss_unregister_display(&ddata->dssdev); | ||
|
||
tvc_disable(dssdev); | ||
tvc_disconnect(dssdev); | ||
|
||
omap_dss_put_device(in); | ||
|
||
return 0; | ||
} | ||
|
||
static struct platform_driver tvc_connector_driver = { | ||
.probe = tvc_probe, | ||
.remove = __exit_p(tvc_remove), | ||
.driver = { | ||
.name = "connector-analog-tv", | ||
.owner = THIS_MODULE, | ||
}, | ||
}; | ||
|
||
module_platform_driver(tvc_connector_driver); | ||
|
||
MODULE_AUTHOR("Tomi Valkeinen <tomi.valkeinen@ti.com>"); | ||
MODULE_DESCRIPTION("Analog TV Connector driver"); | ||
MODULE_LICENSE("GPL"); |
Oops, something went wrong.