diff options
Diffstat (limited to 'drivers/video/tegra/dc/dc.c')
-rw-r--r-- | drivers/video/tegra/dc/dc.c | 86 |
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 | ||
75 | static struct fb_videomode tegra_dc_hdmi_fallback_mode = { | 75 | static 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"); |