Skip to content

Commit

Permalink
OMAP_VOUT: Remove manager->device references
Browse files Browse the repository at this point in the history
With the introduction of output entities, managers will now connect to outputs.
Use the helper op for overlays named get_device. This will abstract away the
information on how to get the omap_dss_device pointer from an overlay.

Using the helper function will reduce the number of pointer dereferences a user
of OMAPDSS needs to do and reduce risk of a NULL dereference.

Cc: Vaibhav Hiremath <hvaibhav@ti.com>
Signed-off-by: Archit Taneja <archit@ti.com>
  • Loading branch information
Archit Taneja authored and Tomi Valkeinen committed Sep 26, 2012
1 parent 794bc4e commit d629f03
Showing 1 changed file with 50 additions and 25 deletions.
75 changes: 50 additions & 25 deletions drivers/media/video/omap/omap_vout.c
Original file line number Diff line number Diff line change
Expand Up @@ -454,11 +454,15 @@ static int omapvid_init(struct omap_vout_device *vout, u32 addr)

win = &vout->win;
for (i = 0; i < ovid->num_overlays; i++) {
struct omap_dss_device *dssdev;

ovl = ovid->overlays[i];
if (!ovl->manager || !ovl->manager->device)
dssdev = ovl->get_device(ovl);

if (!dssdev)
return -EINVAL;

timing = &ovl->manager->device->panel.timings;
timing = &dssdev->panel.timings;

outw = win->w.width;
outh = win->w.height;
Expand Down Expand Up @@ -515,8 +519,11 @@ static int omapvid_apply_changes(struct omap_vout_device *vout)
struct omapvideo_info *ovid = &vout->vid_info;

for (i = 0; i < ovid->num_overlays; i++) {
struct omap_dss_device *dssdev;

ovl = ovid->overlays[i];
if (!ovl->manager || !ovl->manager->device)
dssdev = ovl->get_device(ovl);
if (!dssdev)
return -EINVAL;
ovl->manager->apply(ovl->manager);
}
Expand Down Expand Up @@ -579,12 +586,14 @@ static void omap_vout_isr(void *arg, unsigned int irqstatus)

ovid = &vout->vid_info;
ovl = ovid->overlays[0];
/* get the display device attached to the overlay */
if (!ovl->manager || !ovl->manager->device)
return;

mgr_id = ovl->manager->id;
cur_display = ovl->manager->device;

/* get the display device attached to the overlay */
cur_display = ovl->get_device(ovl);

if (!cur_display)
return;

spin_lock(&vout->vbq_lock);
do_gettimeofday(&timevalue);
Expand Down Expand Up @@ -948,7 +957,9 @@ static int omap_vout_release(struct file *file)
/* Disable all the overlay managers connected with this interface */
for (i = 0; i < ovid->num_overlays; i++) {
struct omap_overlay *ovl = ovid->overlays[i];
if (ovl->manager && ovl->manager->device)
struct omap_dss_device *dssdev = ovl->get_device(ovl);

if (dssdev)
ovl->disable(ovl);
}
/* Turn off the pipeline */
Expand Down Expand Up @@ -1081,14 +1092,17 @@ static int vidioc_try_fmt_vid_out(struct file *file, void *fh,
struct omapvideo_info *ovid;
struct omap_video_timings *timing;
struct omap_vout_device *vout = fh;
struct omap_dss_device *dssdev;

ovid = &vout->vid_info;
ovl = ovid->overlays[0];
/* get the display device attached to the overlay */
dssdev = ovl->get_device(ovl);

if (!ovl->manager || !ovl->manager->device)
if (!dssdev)
return -EINVAL;
/* get the display device attached to the overlay */
timing = &ovl->manager->device->panel.timings;

timing = &dssdev->panel.timings;

vout->fbuf.fmt.height = timing->y_res;
vout->fbuf.fmt.width = timing->x_res;
Expand All @@ -1105,6 +1119,7 @@ static int vidioc_s_fmt_vid_out(struct file *file, void *fh,
struct omapvideo_info *ovid;
struct omap_video_timings *timing;
struct omap_vout_device *vout = fh;
struct omap_dss_device *dssdev;

if (vout->streaming)
return -EBUSY;
Expand All @@ -1113,13 +1128,14 @@ static int vidioc_s_fmt_vid_out(struct file *file, void *fh,

ovid = &vout->vid_info;
ovl = ovid->overlays[0];
dssdev = ovl->get_device(ovl);

/* get the display device attached to the overlay */
if (!ovl->manager || !ovl->manager->device) {
if (!dssdev) {
ret = -EINVAL;
goto s_fmt_vid_out_exit;
}
timing = &ovl->manager->device->panel.timings;
timing = &dssdev->panel.timings;

/* We dont support RGB24-packed mode if vrfb rotation
* is enabled*/
Expand Down Expand Up @@ -1298,20 +1314,23 @@ static int vidioc_s_crop(struct file *file, void *fh, struct v4l2_crop *crop)
struct omapvideo_info *ovid;
struct omap_overlay *ovl;
struct omap_video_timings *timing;
struct omap_dss_device *dssdev;

if (vout->streaming)
return -EBUSY;

mutex_lock(&vout->lock);
ovid = &vout->vid_info;
ovl = ovid->overlays[0];
/* get the display device attached to the overlay */
dssdev = ovl->get_device(ovl);

if (!ovl->manager || !ovl->manager->device) {
if (!dssdev) {
ret = -EINVAL;
goto s_crop_err;
}
/* get the display device attached to the overlay */
timing = &ovl->manager->device->panel.timings;

timing = &dssdev->panel.timings;

if (is_rotation_90_or_270(vout)) {
vout->fbuf.fmt.height = timing->x_res;
Expand Down Expand Up @@ -1667,7 +1686,7 @@ static int vidioc_streamon(struct file *file, void *fh, enum v4l2_buf_type i)
for (j = 0; j < ovid->num_overlays; j++) {
struct omap_overlay *ovl = ovid->overlays[j];

if (ovl->manager && ovl->manager->device) {
if (ovl->get_device(ovl)) {
struct omap_overlay_info info;
ovl->get_overlay_info(ovl, &info);
info.paddr = addr;
Expand All @@ -1690,8 +1709,9 @@ static int vidioc_streamon(struct file *file, void *fh, enum v4l2_buf_type i)

for (j = 0; j < ovid->num_overlays; j++) {
struct omap_overlay *ovl = ovid->overlays[j];
struct omap_dss_device *dssdev = ovl->get_device(ovl);

if (ovl->manager && ovl->manager->device) {
if (dssdev) {
ret = ovl->enable(ovl);
if (ret)
goto streamon_err1;
Expand Down Expand Up @@ -1726,8 +1746,9 @@ static int vidioc_streamoff(struct file *file, void *fh, enum v4l2_buf_type i)

for (j = 0; j < ovid->num_overlays; j++) {
struct omap_overlay *ovl = ovid->overlays[j];
struct omap_dss_device *dssdev = ovl->get_device(ovl);

if (ovl->manager && ovl->manager->device)
if (dssdev)
ovl->disable(ovl);
}

Expand Down Expand Up @@ -1890,8 +1911,8 @@ static int __init omap_vout_setup_video_data(struct omap_vout_device *vout)
struct video_device *vfd;
struct v4l2_pix_format *pix;
struct v4l2_control *control;
struct omap_dss_device *display =
vout->vid_info.overlays[0]->manager->device;
struct omap_overlay *ovl = vout->vid_info.overlays[0];
struct omap_dss_device *display = ovl->get_device(ovl);

/* set the default pix */
pix = &vout->pix;
Expand Down Expand Up @@ -2205,8 +2226,10 @@ static int __init omap_vout_probe(struct platform_device *pdev)
*/
for (i = 1; i < vid_dev->num_overlays; i++) {
ovl = omap_dss_get_overlay(i);
if (ovl->manager && ovl->manager->device) {
def_display = ovl->manager->device;
dssdev = ovl->get_device(ovl);

if (dssdev) {
def_display = dssdev;
} else {
dev_warn(&pdev->dev, "cannot find display\n");
def_display = NULL;
Expand Down Expand Up @@ -2253,8 +2276,10 @@ static int __init omap_vout_probe(struct platform_device *pdev)
for (i = 1; i < vid_dev->num_overlays; i++) {
def_display = NULL;
ovl = omap_dss_get_overlay(i);
if (ovl->manager && ovl->manager->device)
def_display = ovl->manager->device;
dssdev = ovl->get_device(ovl);

if (dssdev)
def_display = dssdev;

if (def_display && def_display->driver)
def_display->driver->disable(def_display);
Expand Down

0 comments on commit d629f03

Please sign in to comment.