]> rtime.felk.cvut.cz Git - sojka/nv-tegra/linux-3.10.git/commitdiff
video: tegra: fb: Remove redundant modelist adding
authorXia Yang <xiay@nvidia.com>
Wed, 13 Nov 2013 02:24:14 +0000 (18:24 -0800)
committerJon Mayo <jmayo@nvidia.com>
Mon, 17 Mar 2014 16:13:10 +0000 (09:13 -0700)
Fix modelist initializing in tegra_fb_register().
Remove redundant modelist adding in tegra_dc_probe()
which will cause NULL pointer dereferencing in ADF code path.

Bug 1425201
Bug 1459374

Change-Id: Ia9f31552a74743f62a3e641ed3d3571a7ffd4ece
Signed-off-by: Xia Yang <xiay@nvidia.com>
Reviewed-on: http://git-master/r/355333
Reviewed-by: Jon Mayo <jmayo@nvidia.com>
Tested-by: Jon Mayo <jmayo@nvidia.com>
drivers/video/tegra/dc/dc.c
drivers/video/tegra/fb.c

index c45c739183afe6dfb135ed73d1e89cbc9172d3f7..1d41849af41fb01248327c54a11db47065818570 100644 (file)
@@ -2647,27 +2647,6 @@ static ssize_t switch_modeset_print_mode(struct switch_dev *sdev, char *buf)
 }
 #endif
 
-static void tegra_dc_add_modes(struct tegra_dc *dc)
-{
-       struct fb_monspecs specs;
-       int i;
-
-       memset(&specs, 0, sizeof(specs));
-       specs.max_x = dc->mode.h_active * 1000;
-       specs.max_y = dc->mode.v_active * 1000;
-       specs.modedb_len = dc->out->n_modes;
-       specs.modedb = kzalloc(specs.modedb_len *
-               sizeof(struct fb_videomode), GFP_KERNEL);
-       if (specs.modedb == NULL) {
-               dev_err(&dc->ndev->dev, "modedb allocation failed\n");
-               return;
-       }
-       for (i = 0; i < dc->out->n_modes; i++)
-               tegra_dc_to_fb_videomode(&specs.modedb[i],
-                       &dc->out->modes[i]);
-       tegra_fb_update_monspecs(dc->fb, &specs, NULL);
-}
-
 static int tegra_dc_probe(struct platform_device *ndev)
 {
        struct tegra_dc *dc;
@@ -3005,9 +2984,6 @@ static int tegra_dc_probe(struct platform_device *ndev)
                }
        }
 
-       if (dc->out && dc->out->n_modes)
-               tegra_dc_add_modes(dc);
-
        if (dc->out && dc->out->hotplug_init)
                dc->out->hotplug_init(&ndev->dev);
 
index 2296f319003625c9c9af36afa96a4e71693cf482..6971951912b285053421facfe875becfa62f8008 100644 (file)
@@ -736,6 +736,18 @@ struct tegra_fb_info *tegra_fb_register(struct platform_device *ndev,
        win->flags = TEGRA_WIN_FLAG_ENABLED;
        win->global_alpha = 0xFF;
 
+       for (mode_idx = 0; mode_idx < dc->out->n_modes; mode_idx++) {
+               struct tegra_dc_mode mode = dc->out->modes[mode_idx];
+               struct fb_videomode vmode;
+
+               mode.pclk = dc->mode.pclk;
+
+               if (mode.pclk > 1000) {
+                       tegra_dc_to_fb_videomode(&vmode, &mode);
+                       fb_add_videomode(&vmode, &info->modelist);
+               }
+       }
+
        if (fb_mem)
                tegra_fb_set_par(info);
 
@@ -747,25 +759,13 @@ struct tegra_fb_info *tegra_fb_register(struct platform_device *ndev,
 
        tegra_fb->info = info;
 
-       dev_info(&ndev->dev, "probed\n");
-
        if (fb_data->flags & TEGRA_FB_FLIP_ON_PROBE) {
                tegra_dc_update_windows(&tegra_fb->win, 1);
                tegra_dc_sync_windows(&tegra_fb->win, 1);
                tegra_dc_program_bandwidth(tegra_fb->win->dc, true);
        }
 
-       for (mode_idx = 1; mode_idx < dc->out->n_modes; mode_idx++) {
-               struct tegra_dc_mode mode = dc->out->modes[mode_idx];
-               struct fb_videomode vmode;
-
-               mode.pclk = dc->mode.pclk;
-
-               if (mode.pclk > 1000) {
-                       tegra_dc_to_fb_videomode(&vmode, &mode);
-                       fb_add_videomode(&vmode, &info->modelist);
-               }
-       }
+       dev_info(&ndev->dev, "fb registered\n");
 
        return tegra_fb;