Skip to content

Commit

Permalink
OMAPDSS: DPI: Add ops
Browse files Browse the repository at this point in the history
Add "ops" style method for using DPI functionality.

Ops style calls will allow us to have arbitrarily long display
pipelines, where each entity can call ops in the previous display
entity.

Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
  • Loading branch information
Tomi Valkeinen committed Jun 17, 2013
1 parent 4635c17 commit 0b24edb
Show file tree
Hide file tree
Showing 2 changed files with 93 additions and 0 deletions.
70 changes: 70 additions & 0 deletions drivers/video/omap2/dss/dpi.c
Original file line number Diff line number Diff line change
Expand Up @@ -461,6 +461,16 @@ void omapdss_dpi_set_timings(struct omap_dss_device *dssdev,
}
EXPORT_SYMBOL(omapdss_dpi_set_timings);

static void dpi_get_timings(struct omap_dss_device *dssdev,
struct omap_video_timings *timings)
{
mutex_lock(&dpi.lock);

*timings = dpi.timings;

mutex_unlock(&dpi.lock);
}

int dpi_check_timings(struct omap_dss_device *dssdev,
struct omap_video_timings *timings)
{
Expand Down Expand Up @@ -678,6 +688,65 @@ static int dpi_probe_pdata(struct platform_device *dpidev)
return 0;
}

static int dpi_connect(struct omap_dss_device *dssdev,
struct omap_dss_device *dst)
{
struct omap_overlay_manager *mgr;
int r;

r = dpi_init_regulator();
if (r)
return r;

dpi_init_pll();

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 dpi_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_dpi_ops dpi_ops = {
.connect = dpi_connect,
.disconnect = dpi_disconnect,

.enable = omapdss_dpi_display_enable,
.disable = omapdss_dpi_display_disable,

.check_timings = dpi_check_timings,
.set_timings = omapdss_dpi_set_timings,
.get_timings = dpi_get_timings,

.set_data_lines = omapdss_dpi_set_data_lines,
};

static void dpi_init_output(struct platform_device *pdev)
{
struct omap_dss_device *out = &dpi.output;
Expand All @@ -687,6 +756,7 @@ static void dpi_init_output(struct platform_device *pdev)
out->output_type = OMAP_DISPLAY_TYPE_DPI;
out->name = "dpi.0";
out->dispc_channel = dpi_get_channel();
out->ops.dpi = &dpi_ops;
out->owner = THIS_MODULE;

omapdss_register_output(out);
Expand Down
23 changes: 23 additions & 0 deletions include/video/omapdss.h
Original file line number Diff line number Diff line change
Expand Up @@ -573,6 +573,25 @@ struct omap_dss_writeback_info {
u8 pre_mult_alpha;
};

struct omapdss_dpi_ops {
int (*connect)(struct omap_dss_device *dssdev,
struct omap_dss_device *dst);
void (*disconnect)(struct omap_dss_device *dssdev,
struct omap_dss_device *dst);

int (*enable)(struct omap_dss_device *dssdev);
void (*disable)(struct omap_dss_device *dssdev);

int (*check_timings)(struct omap_dss_device *dssdev,
struct omap_video_timings *timings);
void (*set_timings)(struct omap_dss_device *dssdev,
struct omap_video_timings *timings);
void (*get_timings)(struct omap_dss_device *dssdev,
struct omap_video_timings *timings);

void (*set_data_lines)(struct omap_dss_device *dssdev, int data_lines);
};

struct omap_dss_device {
/* old device, to be removed */
struct device old_dev;
Expand Down Expand Up @@ -638,6 +657,10 @@ struct omap_dss_device {

struct omap_dss_driver *driver;

union {
const struct omapdss_dpi_ops *dpi;
} ops;

/* helper variable for driver suspend/resume */
bool activate_after_resume;

Expand Down

0 comments on commit 0b24edb

Please sign in to comment.