summaryrefslogtreecommitdiffstats
path: root/drivers/video/tegra/dc/dc.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/video/tegra/dc/dc.c')
-rw-r--r--drivers/video/tegra/dc/dc.c86
1 files changed, 37 insertions, 49 deletions
diff --git a/drivers/video/tegra/dc/dc.c b/drivers/video/tegra/dc/dc.c
index c716b1e9b..4f15f34b4 100644
--- a/drivers/video/tegra/dc/dc.c
+++ b/drivers/video/tegra/dc/dc.c
@@ -72,7 +72,7 @@
72#define DC_COM_PIN_OUTPUT_POLARITY1_INIT_VAL 0x01000000 72#define DC_COM_PIN_OUTPUT_POLARITY1_INIT_VAL 0x01000000
73#define DC_COM_PIN_OUTPUT_POLARITY3_INIT_VAL 0x0 73#define DC_COM_PIN_OUTPUT_POLARITY3_INIT_VAL 0x0
74 74
75static struct fb_videomode tegra_dc_hdmi_fallback_mode = { 75static struct fb_videomode tegra_dc_vga_mode = {
76 .refresh = 60, 76 .refresh = 60,
77 .xres = 640, 77 .xres = 640,
78 .yres = 480, 78 .yres = 480,
@@ -1419,22 +1419,6 @@ static int tegra_dc_set_out(struct tegra_dc *dc, struct tegra_dc_out *out)
1419 return err; 1419 return err;
1420 } 1420 }
1421 } 1421 }
1422 /* If there is no predefined mode, try early_enable()
1423 to check mode from panel directly */
1424 if (!mode && !out->n_modes && dc->out_ops &&
1425 dc->out_ops->early_enable) {
1426 if (dc->out_ops->early_enable(dc))
1427 dev_info(&dc->ndev->dev,
1428 "Detected mode: %dx%d (on %dx%dmm) pclk=%d\n",
1429 dc->mode.h_active, dc->mode.v_active,
1430 dc->out->h_size, dc->out->v_size,
1431 dc->mode.pclk);
1432 else {
1433 dev_err(&dc->ndev->dev,
1434 "Error: failed to check panel mode\n");
1435 err = -EINVAL;
1436 }
1437 }
1438 1422
1439 return err; 1423 return err;
1440} 1424}
@@ -2355,13 +2339,15 @@ static int _tegra_dc_set_default_videomode(struct tegra_dc *dc)
2355 /* DC enable called but no videomode is loaded. 2339 /* DC enable called but no videomode is loaded.
2356 Check if HDMI is connected, then set fallback mdoe */ 2340 Check if HDMI is connected, then set fallback mdoe */
2357 if (tegra_dc_hpd(dc)) { 2341 if (tegra_dc_hpd(dc)) {
2358 return tegra_dc_set_fb_mode(dc, 2342 return tegra_dc_set_fb_mode(dc, &tegra_dc_vga_mode, 0);
2359 &tegra_dc_hdmi_fallback_mode, 0);
2360 } else 2343 } else
2361 return false; 2344 return false;
2362 2345
2363 break; 2346 break;
2364 2347
2348 case TEGRA_DC_OUT_DP:
2349 return tegra_dc_set_fb_mode(dc, &tegra_dc_vga_mode, 0);
2350
2365 /* Do nothing for other outputs for now */ 2351 /* Do nothing for other outputs for now */
2366 case TEGRA_DC_OUT_RGB: 2352 case TEGRA_DC_OUT_RGB:
2367 2353
@@ -2925,39 +2911,18 @@ static int tegra_dc_probe(struct platform_device *ndev)
2925 } 2911 }
2926 dc->mode_dirty = false; /* ignore changes tegra_dc_set_out has done */ 2912 dc->mode_dirty = false; /* ignore changes tegra_dc_set_out has done */
2927 2913
2928#ifdef CONFIG_TEGRA_ISOMGR 2914#ifndef CONFIG_TEGRA_ISOMGR
2929 if (isomgr_client_id == -1) { 2915 /*
2930 dc->isomgr_handle = NULL; 2916 * The emc is a shared clock, it will be set based on
2931 } else { 2917 * the requirements for each user on the bus.
2932 dc->isomgr_handle = tegra_isomgr_register(isomgr_client_id, 2918 */
2933 tegra_dc_calc_min_bandwidth(dc), 2919 emc_clk = clk_get(&ndev->dev, "emc");
2934 tegra_dc_bandwidth_renegotiate, dc); 2920 if (IS_ERR_OR_NULL(emc_clk)) {
2935 if (IS_ERR(dc->isomgr_handle)) { 2921 dev_err(&ndev->dev, "can't get emc clock\n");
2936 dev_err(&dc->ndev->dev,
2937 "could not register isomgr. err=%ld\n",
2938 PTR_ERR(dc->isomgr_handle));
2939 ret = -ENOENT; 2922 ret = -ENOENT;
2940 goto err_put_clk; 2923 goto err_put_clk;
2941 } 2924 }
2942 dc->reserved_bw = tegra_dc_calc_min_bandwidth(dc); 2925 dc->emc_clk = emc_clk;
2943 /*
2944 * Use maximum value so we can try to reserve as much as
2945 * needed until we are told by isomgr to backoff.
2946 */
2947 dc->available_bw = UINT_MAX;
2948 }
2949#else
2950 /*
2951 * The emc is a shared clock, it will be set based on
2952 * the requirements for each user on the bus.
2953 */
2954 emc_clk = clk_get(&ndev->dev, "emc");
2955 if (IS_ERR_OR_NULL(emc_clk)) {
2956 dev_err(&ndev->dev, "can't get emc clock\n");
2957 ret = -ENOENT;
2958 goto err_put_clk;
2959 }
2960 dc->emc_clk = emc_clk;
2961#endif 2926#endif
2962 2927
2963 dc->ext = tegra_dc_ext_register(ndev, dc); 2928 dc->ext = tegra_dc_ext_register(ndev, dc);
@@ -2985,6 +2950,29 @@ static int tegra_dc_probe(struct platform_device *ndev)
2985 dc->enabled = _tegra_dc_enable(dc); 2950 dc->enabled = _tegra_dc_enable(dc);
2986 } 2951 }
2987 2952
2953#ifdef CONFIG_TEGRA_ISOMGR
2954 if (isomgr_client_id == -1) {
2955 dc->isomgr_handle = NULL;
2956 } else {
2957 dc->isomgr_handle = tegra_isomgr_register(isomgr_client_id,
2958 tegra_dc_calc_min_bandwidth(dc),
2959 tegra_dc_bandwidth_renegotiate, dc);
2960 if (IS_ERR(dc->isomgr_handle)) {
2961 dev_err(&dc->ndev->dev,
2962 "could not register isomgr. err=%ld\n",
2963 PTR_ERR(dc->isomgr_handle));
2964 ret = -ENOENT;
2965 goto err_put_clk;
2966 }
2967 dc->reserved_bw = tegra_dc_calc_min_bandwidth(dc);
2968 /*
2969 * Use maximum value so we can try to reserve as much as
2970 * needed until we are told by isomgr to backoff.
2971 */
2972 dc->available_bw = UINT_MAX;
2973 }
2974#endif
2975
2988 tegra_dc_create_debugfs(dc); 2976 tegra_dc_create_debugfs(dc);
2989 2977
2990 dev_info(&ndev->dev, "probed\n"); 2978 dev_info(&ndev->dev, "probed\n");