Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/msm/dsi: replace version checks with helper functions

Replace version checks with the helper functions bound to
cfg_handler for DSI v2, DSI 6G 1.x and DSI 6G v2.0+ controllers

Signed-off-by: Sibi Sankar <sibis@codeaurora.org>
Signed-off-by: Rob Clark <robdclark@gmail.com>

authored by

Sibi Sankar and committed by
Rob Clark
8f7ca540 c4d8cfe5

+29 -212
+29 -212
drivers/gpu/drm/msm/dsi/dsi_host.c
··· 427 427 goto exit; 428 428 } 429 429 430 - if (cfg_hnd->major == MSM_DSI_VER_MAJOR_6G && 431 - cfg_hnd->minor >= MSM_DSI_6G_VER_MINOR_V2_2_1) { 432 - msm_host->byte_intf_clk = msm_clk_get(pdev, "byte_intf"); 433 - if (IS_ERR(msm_host->byte_intf_clk)) { 434 - ret = PTR_ERR(msm_host->byte_intf_clk); 435 - pr_err("%s: can't find byte_intf clock. ret=%d\n", 436 - __func__, ret); 437 - goto exit; 438 - } 439 - } else { 440 - msm_host->byte_intf_clk = NULL; 441 - } 442 - 443 430 msm_host->byte_clk_src = clk_get_parent(msm_host->byte_clk); 444 431 if (!msm_host->byte_clk_src) { 445 432 ret = -ENODEV; ··· 441 454 goto exit; 442 455 } 443 456 444 - if (cfg_hnd->major == MSM_DSI_VER_MAJOR_V2) { 445 - msm_host->src_clk = msm_clk_get(pdev, "src"); 446 - if (IS_ERR(msm_host->src_clk)) { 447 - ret = PTR_ERR(msm_host->src_clk); 448 - pr_err("%s: can't find src clock. ret=%d\n", 449 - __func__, ret); 450 - msm_host->src_clk = NULL; 451 - goto exit; 452 - } 453 - 454 - msm_host->esc_clk_src = clk_get_parent(msm_host->esc_clk); 455 - if (!msm_host->esc_clk_src) { 456 - ret = -ENODEV; 457 - pr_err("%s: can't get esc clock parent. ret=%d\n", 458 - __func__, ret); 459 - goto exit; 460 - } 461 - 462 - msm_host->dsi_clk_src = clk_get_parent(msm_host->src_clk); 463 - if (!msm_host->dsi_clk_src) { 464 - ret = -ENODEV; 465 - pr_err("%s: can't get src clock parent. ret=%d\n", 466 - __func__, ret); 467 - } 468 - } 457 + if (cfg_hnd->ops->clk_init_ver) 458 + ret = cfg_hnd->ops->clk_init_ver(msm_host); 469 459 exit: 470 460 return ret; 471 461 } ··· 646 682 return ret; 647 683 } 648 684 649 - static int dsi_link_clk_enable(struct msm_dsi_host *msm_host) 650 - { 651 - const struct msm_dsi_cfg_handler *cfg_hnd = msm_host->cfg_hnd; 652 - 653 - if (cfg_hnd->major == MSM_DSI_VER_MAJOR_6G) 654 - return dsi_link_clk_enable_6g(msm_host); 655 - else 656 - return dsi_link_clk_enable_v2(msm_host); 657 - } 658 - 659 685 void dsi_link_clk_disable_6g(struct msm_dsi_host *msm_host) 660 686 { 661 687 clk_disable_unprepare(msm_host->esc_clk); ··· 661 707 clk_disable_unprepare(msm_host->src_clk); 662 708 clk_disable_unprepare(msm_host->esc_clk); 663 709 clk_disable_unprepare(msm_host->byte_clk); 664 - } 665 - 666 - static void dsi_link_clk_disable(struct msm_dsi_host *msm_host) 667 - { 668 - const struct msm_dsi_cfg_handler *cfg_hnd = msm_host->cfg_hnd; 669 - 670 - if (cfg_hnd->major == MSM_DSI_VER_MAJOR_6G) { 671 - clk_disable_unprepare(msm_host->esc_clk); 672 - clk_disable_unprepare(msm_host->pixel_clk); 673 - if (msm_host->byte_intf_clk) 674 - clk_disable_unprepare(msm_host->byte_intf_clk); 675 - clk_disable_unprepare(msm_host->byte_clk); 676 - } else { 677 - clk_disable_unprepare(msm_host->pixel_clk); 678 - clk_disable_unprepare(msm_host->src_clk); 679 - clk_disable_unprepare(msm_host->esc_clk); 680 - clk_disable_unprepare(msm_host->byte_clk); 681 - } 682 710 } 683 711 684 712 int dsi_calc_clk_rate_6g(struct msm_dsi_host *msm_host) ··· 737 801 738 802 DBG("esc=%d, src=%d", msm_host->esc_clk_rate, 739 803 msm_host->src_clk_rate); 740 - 741 - return 0; 742 - } 743 - 744 - static int dsi_calc_clk_rate(struct msm_dsi_host *msm_host) 745 - { 746 - struct drm_display_mode *mode = msm_host->mode; 747 - const struct msm_dsi_cfg_handler *cfg_hnd = msm_host->cfg_hnd; 748 - u8 lanes = msm_host->lanes; 749 - u32 bpp = dsi_get_bpp(msm_host->format); 750 - u32 pclk_rate; 751 - 752 - if (!mode) { 753 - pr_err("%s: mode not set\n", __func__); 754 - return -EINVAL; 755 - } 756 - 757 - pclk_rate = mode->clock * 1000; 758 - if (lanes > 0) { 759 - msm_host->byte_clk_rate = (pclk_rate * bpp) / (8 * lanes); 760 - } else { 761 - pr_err("%s: forcing mdss_dsi lanes to 1\n", __func__); 762 - msm_host->byte_clk_rate = (pclk_rate * bpp) / 8; 763 - } 764 - 765 - DBG("pclk=%d, bclk=%d", pclk_rate, msm_host->byte_clk_rate); 766 - 767 - msm_host->esc_clk_rate = clk_get_rate(msm_host->esc_clk); 768 - 769 - if (cfg_hnd->major == MSM_DSI_VER_MAJOR_V2) { 770 - unsigned int esc_mhz, esc_div; 771 - unsigned long byte_mhz; 772 - 773 - msm_host->src_clk_rate = (pclk_rate * bpp) / 8; 774 - 775 - /* 776 - * esc clock is byte clock followed by a 4 bit divider, 777 - * we need to find an escape clock frequency within the 778 - * mipi DSI spec range within the maximum divider limit 779 - * We iterate here between an escape clock frequencey 780 - * between 20 Mhz to 5 Mhz and pick up the first one 781 - * that can be supported by our divider 782 - */ 783 - 784 - byte_mhz = msm_host->byte_clk_rate / 1000000; 785 - 786 - for (esc_mhz = 20; esc_mhz >= 5; esc_mhz--) { 787 - esc_div = DIV_ROUND_UP(byte_mhz, esc_mhz); 788 - 789 - /* 790 - * TODO: Ideally, we shouldn't know what sort of divider 791 - * is available in mmss_cc, we're just assuming that 792 - * it'll always be a 4 bit divider. Need to come up with 793 - * a better way here. 794 - */ 795 - if (esc_div >= 1 && esc_div <= 16) 796 - break; 797 - } 798 - 799 - if (esc_mhz < 5) 800 - return -EINVAL; 801 - 802 - msm_host->esc_clk_rate = msm_host->byte_clk_rate / esc_div; 803 - 804 - DBG("esc=%d, src=%d", msm_host->esc_clk_rate, 805 - msm_host->src_clk_rate); 806 - } 807 804 808 805 return 0; 809 806 } ··· 1062 1193 return 0; 1063 1194 } 1064 1195 1065 - /* dsi_cmd */ 1066 - static int dsi_tx_buf_alloc(struct msm_dsi_host *msm_host, int size) 1067 - { 1068 - struct drm_device *dev = msm_host->dev; 1069 - struct msm_drm_private *priv = dev->dev_private; 1070 - const struct msm_dsi_cfg_handler *cfg_hnd = msm_host->cfg_hnd; 1071 - int ret; 1072 - uint64_t iova; 1073 - 1074 - if (cfg_hnd->major == MSM_DSI_VER_MAJOR_6G) { 1075 - msm_host->tx_gem_obj = msm_gem_new(dev, size, MSM_BO_UNCACHED); 1076 - if (IS_ERR(msm_host->tx_gem_obj)) { 1077 - ret = PTR_ERR(msm_host->tx_gem_obj); 1078 - pr_err("%s: failed to allocate gem, %d\n", 1079 - __func__, ret); 1080 - msm_host->tx_gem_obj = NULL; 1081 - return ret; 1082 - } 1083 - 1084 - ret = msm_gem_get_iova(msm_host->tx_gem_obj, 1085 - priv->kms->aspace, &iova); 1086 - if (ret) { 1087 - pr_err("%s: failed to get iova, %d\n", __func__, ret); 1088 - return ret; 1089 - } 1090 - 1091 - if (iova & 0x07) { 1092 - pr_err("%s: buf NOT 8 bytes aligned\n", __func__); 1093 - return -EINVAL; 1094 - } 1095 - 1096 - msm_host->tx_size = msm_host->tx_gem_obj->size; 1097 - } else { 1098 - msm_host->tx_buf = dma_alloc_coherent(dev->dev, size, 1099 - &msm_host->tx_buf_paddr, GFP_KERNEL); 1100 - if (!msm_host->tx_buf) { 1101 - ret = -ENOMEM; 1102 - pr_err("%s: failed to allocate tx buf, %d\n", 1103 - __func__, ret); 1104 - return ret; 1105 - } 1106 - 1107 - msm_host->tx_size = size; 1108 - } 1109 - 1110 - return 0; 1111 - } 1112 - 1113 1196 static void dsi_tx_buf_free(struct msm_dsi_host *msm_host) 1114 1197 { 1115 1198 struct drm_device *dev = msm_host->dev; ··· 1127 1306 return -EINVAL; 1128 1307 } 1129 1308 1130 - if (cfg_hnd->major == MSM_DSI_VER_MAJOR_6G) { 1131 - data = msm_gem_get_vaddr(msm_host->tx_gem_obj); 1132 - if (IS_ERR(data)) { 1133 - ret = PTR_ERR(data); 1134 - pr_err("%s: get vaddr failed, %d\n", __func__, ret); 1135 - return ret; 1136 - } 1137 - } else { 1138 - data = msm_host->tx_buf; 1309 + data = cfg_hnd->ops->tx_buf_get(msm_host); 1310 + if (IS_ERR(data)) { 1311 + ret = PTR_ERR(data); 1312 + pr_err("%s: get vaddr failed, %d\n", __func__, ret); 1313 + return ret; 1139 1314 } 1140 1315 1141 1316 /* MSM specific command format in memory */ ··· 1152 1335 if (packet.size < len) 1153 1336 memset(data + packet.size, 0xff, len - packet.size); 1154 1337 1155 - if (cfg_hnd->major == MSM_DSI_VER_MAJOR_6G) 1156 - msm_gem_put_vaddr(msm_host->tx_gem_obj); 1338 + if (cfg_hnd->ops->tx_buf_put) 1339 + cfg_hnd->ops->tx_buf_put(msm_host); 1157 1340 1158 1341 return len; 1159 1342 } ··· 1224 1407 static int dsi_cmd_dma_tx(struct msm_dsi_host *msm_host, int len) 1225 1408 { 1226 1409 const struct msm_dsi_cfg_handler *cfg_hnd = msm_host->cfg_hnd; 1227 - struct drm_device *dev = msm_host->dev; 1228 - struct msm_drm_private *priv = dev->dev_private; 1229 1410 int ret; 1230 1411 uint64_t dma_base; 1231 1412 bool triggered; 1232 1413 1233 - if (cfg_hnd->major == MSM_DSI_VER_MAJOR_6G) { 1234 - ret = msm_gem_get_iova(msm_host->tx_gem_obj, 1235 - priv->kms->aspace, &dma_base); 1236 - if (ret) { 1237 - pr_err("%s: failed to get iova: %d\n", __func__, ret); 1238 - return ret; 1239 - } 1240 - } else { 1241 - dma_base = msm_host->tx_buf_paddr; 1414 + ret = cfg_hnd->ops->dma_base_get(msm_host, &dma_base); 1415 + if (ret) { 1416 + pr_err("%s: failed to get iova: %d\n", __func__, ret); 1417 + return ret; 1242 1418 } 1243 1419 1244 1420 reinit_completion(&msm_host->dma_comp); ··· 1869 2059 struct drm_device *dev) 1870 2060 { 1871 2061 struct msm_dsi_host *msm_host = to_msm_dsi_host(host); 2062 + const struct msm_dsi_cfg_handler *cfg_hnd = msm_host->cfg_hnd; 1872 2063 struct platform_device *pdev = msm_host->pdev; 1873 2064 int ret; 1874 2065 ··· 1890 2079 } 1891 2080 1892 2081 msm_host->dev = dev; 1893 - ret = dsi_tx_buf_alloc(msm_host, SZ_4K); 2082 + ret = cfg_hnd->ops->tx_buf_alloc(msm_host, SZ_4K); 1894 2083 if (ret) { 1895 2084 pr_err("%s: alloc tx gem obj failed, %d\n", __func__, ret); 1896 2085 return ret; ··· 1948 2137 const struct mipi_dsi_msg *msg) 1949 2138 { 1950 2139 struct msm_dsi_host *msm_host = to_msm_dsi_host(host); 2140 + const struct msm_dsi_cfg_handler *cfg_hnd = msm_host->cfg_hnd; 1951 2141 1952 2142 /* TODO: make sure dsi_cmd_mdp is idle. 1953 2143 * Since DSI6G v1.2.0, we can set DSI_TRIG_CTRL.BLOCK_DMA_WITHIN_FRAME ··· 1961 2149 * mdp clock need to be enabled to receive dsi interrupt 1962 2150 */ 1963 2151 pm_runtime_get_sync(&msm_host->pdev->dev); 1964 - dsi_link_clk_enable(msm_host); 2152 + cfg_hnd->ops->link_clk_enable(msm_host); 1965 2153 1966 2154 /* TODO: vote for bus bandwidth */ 1967 2155 ··· 1982 2170 const struct mipi_dsi_msg *msg) 1983 2171 { 1984 2172 struct msm_dsi_host *msm_host = to_msm_dsi_host(host); 2173 + const struct msm_dsi_cfg_handler *cfg_hnd = msm_host->cfg_hnd; 1985 2174 1986 2175 dsi_intr_ctrl(msm_host, DSI_IRQ_MASK_CMD_DMA_DONE, 0); 1987 2176 dsi_write(msm_host, REG_DSI_CTRL, msm_host->dma_cmd_ctrl_restore); ··· 1992 2179 1993 2180 /* TODO: unvote for bus bandwidth */ 1994 2181 1995 - dsi_link_clk_disable(msm_host); 2182 + cfg_hnd->ops->link_clk_disable(msm_host); 1996 2183 pm_runtime_put_autosuspend(&msm_host->pdev->dev); 1997 2184 } 1998 2185 ··· 2156 2343 struct msm_dsi_pll *src_pll) 2157 2344 { 2158 2345 struct msm_dsi_host *msm_host = to_msm_dsi_host(host); 2159 - const struct msm_dsi_cfg_handler *cfg_hnd = msm_host->cfg_hnd; 2160 2346 struct clk *byte_clk_provider, *pixel_clk_provider; 2161 2347 int ret; 2162 2348 ··· 2181 2369 goto exit; 2182 2370 } 2183 2371 2184 - if (cfg_hnd->major == MSM_DSI_VER_MAJOR_V2) { 2372 + if (msm_host->dsi_clk_src) { 2185 2373 ret = clk_set_parent(msm_host->dsi_clk_src, pixel_clk_provider); 2186 2374 if (ret) { 2187 2375 pr_err("%s: can't set parent to dsi_clk_src. ret=%d\n", 2188 2376 __func__, ret); 2189 2377 goto exit; 2190 2378 } 2379 + } 2191 2380 2381 + if (msm_host->esc_clk_src) { 2192 2382 ret = clk_set_parent(msm_host->esc_clk_src, byte_clk_provider); 2193 2383 if (ret) { 2194 2384 pr_err("%s: can't set parent to esc_clk_src. ret=%d\n", ··· 2220 2406 struct msm_dsi_phy_clk_request *clk_req) 2221 2407 { 2222 2408 struct msm_dsi_host *msm_host = to_msm_dsi_host(host); 2409 + const struct msm_dsi_cfg_handler *cfg_hnd = msm_host->cfg_hnd; 2223 2410 int ret; 2224 2411 2225 - ret = dsi_calc_clk_rate(msm_host); 2412 + ret = cfg_hnd->ops->calc_clk_rate(msm_host); 2226 2413 if (ret) { 2227 2414 pr_err("%s: unable to calc clk rate, %d\n", __func__, ret); 2228 2415 return; ··· 2288 2473 struct msm_dsi_phy_shared_timings *phy_shared_timings) 2289 2474 { 2290 2475 struct msm_dsi_host *msm_host = to_msm_dsi_host(host); 2476 + const struct msm_dsi_cfg_handler *cfg_hnd = msm_host->cfg_hnd; 2291 2477 int ret = 0; 2292 2478 2293 2479 mutex_lock(&msm_host->dev_mutex); ··· 2307 2491 } 2308 2492 2309 2493 pm_runtime_get_sync(&msm_host->pdev->dev); 2310 - ret = dsi_link_clk_enable(msm_host); 2494 + ret = cfg_hnd->ops->link_clk_enable(msm_host); 2311 2495 if (ret) { 2312 2496 pr_err("%s: failed to enable link clocks. ret=%d\n", 2313 2497 __func__, ret); ··· 2334 2518 return 0; 2335 2519 2336 2520 fail_disable_clk: 2337 - dsi_link_clk_disable(msm_host); 2521 + cfg_hnd->ops->link_clk_disable(msm_host); 2338 2522 pm_runtime_put_autosuspend(&msm_host->pdev->dev); 2339 2523 fail_disable_reg: 2340 2524 dsi_host_regulator_disable(msm_host); ··· 2346 2530 int msm_dsi_host_power_off(struct mipi_dsi_host *host) 2347 2531 { 2348 2532 struct msm_dsi_host *msm_host = to_msm_dsi_host(host); 2533 + const struct msm_dsi_cfg_handler *cfg_hnd = msm_host->cfg_hnd; 2349 2534 2350 2535 mutex_lock(&msm_host->dev_mutex); 2351 2536 if (!msm_host->power_on) { ··· 2361 2544 2362 2545 pinctrl_pm_select_sleep_state(&msm_host->pdev->dev); 2363 2546 2364 - dsi_link_clk_disable(msm_host); 2547 + cfg_hnd->ops->link_clk_disable(msm_host); 2365 2548 pm_runtime_put_autosuspend(&msm_host->pdev->dev); 2366 2549 2367 2550 dsi_host_regulator_disable(msm_host);