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

drm/mediatek: Move mtk_ddp_comp_init() from sub driver to DRM driver

Some ddp component exist in both display path and other path, so
sub driver should not directly call DRM driver's function. Moving
mtk_ddp_comp_init() from sub driver to DRM driver to achieve this.

Signed-off-by: CK Hu <ck.hu@mediatek.com>
Signed-off-by: Chun-Kuang Hu <chunkuang.hu@kernel.org>

authored by

CK Hu and committed by
Chun-Kuang Hu
ff139560 1d33f13a

+24 -215
-35
drivers/gpu/drm/mediatek/mtk_disp_color.c
··· 37 37 * @data: platform colour driver data 38 38 */ 39 39 struct mtk_disp_color { 40 - struct mtk_ddp_comp ddp_comp; 41 40 struct drm_crtc *crtc; 42 41 struct clk *clk; 43 42 void __iomem *regs; ··· 80 81 static int mtk_disp_color_bind(struct device *dev, struct device *master, 81 82 void *data) 82 83 { 83 - struct mtk_disp_color *priv = dev_get_drvdata(dev); 84 - struct drm_device *drm_dev = data; 85 - int ret; 86 - 87 - ret = mtk_ddp_comp_register(drm_dev, &priv->ddp_comp); 88 - if (ret < 0) { 89 - dev_err(dev, "Failed to register component %pOF: %d\n", 90 - dev->of_node, ret); 91 - return ret; 92 - } 93 - 94 84 return 0; 95 85 } 96 86 97 87 static void mtk_disp_color_unbind(struct device *dev, struct device *master, 98 88 void *data) 99 89 { 100 - struct mtk_disp_color *priv = dev_get_drvdata(dev); 101 - struct drm_device *drm_dev = data; 102 - 103 - mtk_ddp_comp_unregister(drm_dev, &priv->ddp_comp); 104 90 } 105 91 106 92 static const struct component_ops mtk_disp_color_component_ops = { ··· 98 114 struct device *dev = &pdev->dev; 99 115 struct mtk_disp_color *priv; 100 116 struct resource *res; 101 - int comp_id; 102 117 int ret; 103 118 104 119 priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); ··· 122 139 dev_dbg(dev, "get mediatek,gce-client-reg fail!\n"); 123 140 #endif 124 141 125 - comp_id = mtk_ddp_comp_get_id(dev->of_node, MTK_DISP_COLOR); 126 - if (comp_id < 0) { 127 - dev_err(dev, "Failed to identify by alias: %d\n", comp_id); 128 - return comp_id; 129 - } 130 - 131 - ret = mtk_ddp_comp_init(dev->of_node, &priv->ddp_comp, comp_id); 132 - if (ret) { 133 - if (ret != -EPROBE_DEFER) 134 - dev_err(dev, "Failed to initialize component: %d\n", 135 - ret); 136 - 137 - return ret; 138 - } 139 - 140 142 priv->data = of_device_get_match_data(dev); 141 - 142 143 platform_set_drvdata(pdev, priv); 143 144 144 145 ret = component_add(dev, &mtk_disp_color_component_ops); ··· 134 167 135 168 static int mtk_disp_color_remove(struct platform_device *pdev) 136 169 { 137 - component_del(&pdev->dev, &mtk_disp_color_component_ops); 138 - 139 170 return 0; 140 171 } 141 172
-38
drivers/gpu/drm/mediatek/mtk_disp_ovl.c
··· 71 71 * @data: platform data 72 72 */ 73 73 struct mtk_disp_ovl { 74 - struct mtk_ddp_comp ddp_comp; 75 74 struct drm_crtc *crtc; 76 75 struct clk *clk; 77 76 void __iomem *regs; ··· 341 342 static int mtk_disp_ovl_bind(struct device *dev, struct device *master, 342 343 void *data) 343 344 { 344 - struct mtk_disp_ovl *priv = dev_get_drvdata(dev); 345 - struct drm_device *drm_dev = data; 346 - int ret; 347 - 348 - ret = mtk_ddp_comp_register(drm_dev, &priv->ddp_comp); 349 - if (ret < 0) { 350 - dev_err(dev, "Failed to register component %pOF: %d\n", 351 - dev->of_node, ret); 352 - return ret; 353 - } 354 - 355 345 return 0; 356 346 } 357 347 358 348 static void mtk_disp_ovl_unbind(struct device *dev, struct device *master, 359 349 void *data) 360 350 { 361 - struct mtk_disp_ovl *priv = dev_get_drvdata(dev); 362 - struct drm_device *drm_dev = data; 363 - 364 - mtk_ddp_comp_unregister(drm_dev, &priv->ddp_comp); 365 351 } 366 352 367 353 static const struct component_ops mtk_disp_ovl_component_ops = { ··· 359 375 struct device *dev = &pdev->dev; 360 376 struct mtk_disp_ovl *priv; 361 377 struct resource *res; 362 - int comp_id; 363 378 int irq; 364 379 int ret; 365 380 ··· 389 406 #endif 390 407 391 408 priv->data = of_device_get_match_data(dev); 392 - 393 - comp_id = mtk_ddp_comp_get_id(dev->of_node, 394 - priv->data->layer_nr == 4 ? 395 - MTK_DISP_OVL : 396 - MTK_DISP_OVL_2L); 397 - if (comp_id < 0) { 398 - dev_err(dev, "Failed to identify by alias: %d\n", comp_id); 399 - return comp_id; 400 - } 401 - 402 - ret = mtk_ddp_comp_init(dev->of_node, &priv->ddp_comp, comp_id); 403 - if (ret) { 404 - if (ret != -EPROBE_DEFER) 405 - dev_err(dev, "Failed to initialize component: %d\n", 406 - ret); 407 - 408 - return ret; 409 - } 410 - 411 409 platform_set_drvdata(pdev, priv); 412 410 413 411 ret = devm_request_irq(dev, irq, mtk_disp_ovl_irq_handler, ··· 407 443 408 444 static int mtk_disp_ovl_remove(struct platform_device *pdev) 409 445 { 410 - component_del(&pdev->dev, &mtk_disp_ovl_component_ops); 411 - 412 446 return 0; 413 447 } 414 448
-32
drivers/gpu/drm/mediatek/mtk_disp_rdma.c
··· 62 62 * @data: local driver data 63 63 */ 64 64 struct mtk_disp_rdma { 65 - struct mtk_ddp_comp ddp_comp; 66 65 struct clk *clk; 67 66 void __iomem *regs; 68 67 struct cmdq_client_reg cmdq_reg; ··· 249 250 static int mtk_disp_rdma_bind(struct device *dev, struct device *master, 250 251 void *data) 251 252 { 252 - struct mtk_disp_rdma *priv = dev_get_drvdata(dev); 253 - struct drm_device *drm_dev = data; 254 - int ret; 255 - 256 - ret = mtk_ddp_comp_register(drm_dev, &priv->ddp_comp); 257 - if (ret < 0) { 258 - dev_err(dev, "Failed to register component %pOF: %d\n", 259 - dev->of_node, ret); 260 - return ret; 261 - } 262 - 263 253 return 0; 264 254 265 255 } ··· 256 268 static void mtk_disp_rdma_unbind(struct device *dev, struct device *master, 257 269 void *data) 258 270 { 259 - struct mtk_disp_rdma *priv = dev_get_drvdata(dev); 260 - struct drm_device *drm_dev = data; 261 - 262 - mtk_ddp_comp_unregister(drm_dev, &priv->ddp_comp); 263 271 } 264 272 265 273 static const struct component_ops mtk_disp_rdma_component_ops = { ··· 268 284 struct device *dev = &pdev->dev; 269 285 struct mtk_disp_rdma *priv; 270 286 struct resource *res; 271 - int comp_id; 272 287 int irq; 273 288 int ret; 274 289 ··· 296 313 if (ret) 297 314 dev_dbg(dev, "get mediatek,gce-client-reg fail!\n"); 298 315 #endif 299 - 300 - comp_id = mtk_ddp_comp_get_id(dev->of_node, MTK_DISP_RDMA); 301 - if (comp_id < 0) { 302 - dev_err(dev, "Failed to identify by alias: %d\n", comp_id); 303 - return comp_id; 304 - } 305 - 306 - ret = mtk_ddp_comp_init(dev->of_node, &priv->ddp_comp, comp_id); 307 - if (ret) { 308 - if (ret != -EPROBE_DEFER) 309 - dev_err(dev, "Failed to initialize component: %d\n", 310 - ret); 311 - 312 - return ret; 313 - } 314 316 315 317 /* Disable and clear pending interrupts */ 316 318 writel(0x0, priv->regs + DISP_REG_RDMA_INT_ENABLE);
+2 -27
drivers/gpu/drm/mediatek/mtk_dpi.c
··· 63 63 }; 64 64 65 65 struct mtk_dpi { 66 - struct mtk_ddp_comp ddp_comp; 67 66 struct drm_encoder encoder; 68 67 struct drm_bridge bridge; 69 68 struct drm_bridge *next_bridge; ··· 582 583 struct drm_device *drm_dev = data; 583 584 int ret; 584 585 585 - ret = mtk_ddp_comp_register(drm_dev, &dpi->ddp_comp); 586 - if (ret < 0) { 587 - dev_err(dev, "Failed to register component %pOF: %d\n", 588 - dev->of_node, ret); 589 - return ret; 590 - } 591 - 592 586 ret = drm_simple_encoder_init(drm_dev, &dpi->encoder, 593 587 DRM_MODE_ENCODER_TMDS); 594 588 if (ret) { 595 589 dev_err(dev, "Failed to initialize decoder: %d\n", ret); 596 - goto err_unregister; 590 + return ret; 597 591 } 598 592 599 - dpi->encoder.possible_crtcs = mtk_drm_find_possible_crtc_by_comp(drm_dev, dpi->ddp_comp); 593 + dpi->encoder.possible_crtcs = mtk_drm_find_possible_crtc_by_comp(drm_dev, dpi->dev); 600 594 601 595 ret = drm_bridge_attach(&dpi->encoder, &dpi->bridge, NULL, 0); 602 596 if (ret) { ··· 606 614 607 615 err_cleanup: 608 616 drm_encoder_cleanup(&dpi->encoder); 609 - err_unregister: 610 - mtk_ddp_comp_unregister(drm_dev, &dpi->ddp_comp); 611 617 return ret; 612 618 } 613 619 ··· 613 623 void *data) 614 624 { 615 625 struct mtk_dpi *dpi = dev_get_drvdata(dev); 616 - struct drm_device *drm_dev = data; 617 626 618 627 drm_encoder_cleanup(&dpi->encoder); 619 - mtk_ddp_comp_unregister(drm_dev, &dpi->ddp_comp); 620 628 } 621 629 622 630 static const struct component_ops mtk_dpi_component_ops = { ··· 675 687 struct device *dev = &pdev->dev; 676 688 struct mtk_dpi *dpi; 677 689 struct resource *mem; 678 - int comp_id; 679 690 int ret; 680 691 681 692 dpi = devm_kzalloc(dev, sizeof(*dpi), GFP_KERNEL); ··· 751 764 return ret; 752 765 753 766 dev_info(dev, "Found bridge node: %pOF\n", dpi->next_bridge->of_node); 754 - 755 - comp_id = mtk_ddp_comp_get_id(dev->of_node, MTK_DPI); 756 - if (comp_id < 0) { 757 - dev_err(dev, "Failed to identify by alias: %d\n", comp_id); 758 - return comp_id; 759 - } 760 - 761 - ret = mtk_ddp_comp_init(dev->of_node, &dpi->ddp_comp, comp_id); 762 - if (ret) { 763 - dev_err(dev, "Failed to initialize component: %d\n", ret); 764 - return ret; 765 - } 766 767 767 768 platform_set_drvdata(pdev, dpi); 768 769
+1 -1
drivers/gpu/drm/mediatek/mtk_drm_crtc.c
··· 786 786 struct device_node *node; 787 787 788 788 node = priv->comp_node[comp_id]; 789 - comp = priv->ddp_comp[comp_id]; 789 + comp = &priv->ddp_comp[comp_id]; 790 790 if (!comp) { 791 791 dev_err(dev, "Component %pOF not initialized\n", node); 792 792 ret = -ENODEV;
+11 -27
drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c
··· 524 524 [DDP_COMPONENT_WDMA1] = { MTK_DISP_WDMA, 1, NULL }, 525 525 }; 526 526 527 - static bool mtk_drm_find_comp_in_ddp(struct mtk_ddp_comp ddp_comp, 527 + static bool mtk_drm_find_comp_in_ddp(struct device *dev, 528 528 const enum mtk_ddp_comp_id *path, 529 - unsigned int path_len) 529 + unsigned int path_len, 530 + struct mtk_ddp_comp *ddp_comp) 530 531 { 531 532 unsigned int i; 532 533 ··· 535 534 return false; 536 535 537 536 for (i = 0U; i < path_len; i++) 538 - if (ddp_comp.id == path[i]) 537 + if (dev == ddp_comp[path[i]].dev) 539 538 return true; 540 539 541 540 return false; ··· 557 556 } 558 557 559 558 unsigned int mtk_drm_find_possible_crtc_by_comp(struct drm_device *drm, 560 - struct mtk_ddp_comp ddp_comp) 559 + struct device *dev) 561 560 { 562 561 struct mtk_drm_private *private = drm->dev_private; 563 562 unsigned int ret = 0; 564 563 565 - if (mtk_drm_find_comp_in_ddp(ddp_comp, private->data->main_path, private->data->main_len)) 564 + if (mtk_drm_find_comp_in_ddp(dev, private->data->main_path, private->data->main_len, 565 + private->ddp_comp)) 566 566 ret = BIT(0); 567 - else if (mtk_drm_find_comp_in_ddp(ddp_comp, private->data->ext_path, 568 - private->data->ext_len)) 567 + else if (mtk_drm_find_comp_in_ddp(dev, private->data->ext_path, 568 + private->data->ext_len, private->ddp_comp)) 569 569 ret = BIT(1); 570 - else if (mtk_drm_find_comp_in_ddp(ddp_comp, private->data->third_path, 571 - private->data->third_len)) 570 + else if (mtk_drm_find_comp_in_ddp(dev, private->data->third_path, 571 + private->data->third_len, private->ddp_comp)) 572 572 ret = BIT(2); 573 573 else 574 574 DRM_INFO("Failed to find comp in ddp table\n"); ··· 661 659 platform_set_drvdata(comp_pdev, priv); 662 660 663 661 return 0; 664 - } 665 - 666 - int mtk_ddp_comp_register(struct drm_device *drm, struct mtk_ddp_comp *comp) 667 - { 668 - struct mtk_drm_private *private = drm->dev_private; 669 - 670 - if (private->ddp_comp[comp->id]) 671 - return -EBUSY; 672 - 673 - private->ddp_comp[comp->id] = comp; 674 - return 0; 675 - } 676 - 677 - void mtk_ddp_comp_unregister(struct drm_device *drm, struct mtk_ddp_comp *comp) 678 - { 679 - struct mtk_drm_private *private = drm->dev_private; 680 - 681 - private->ddp_comp[comp->id] = NULL; 682 662 }
+1 -3
drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h
··· 188 188 int mtk_ddp_comp_get_id(struct device_node *node, 189 189 enum mtk_ddp_comp_type comp_type); 190 190 unsigned int mtk_drm_find_possible_crtc_by_comp(struct drm_device *drm, 191 - struct mtk_ddp_comp ddp_comp); 191 + struct device *dev); 192 192 int mtk_ddp_comp_init(struct device_node *comp_node, struct mtk_ddp_comp *comp, 193 193 enum mtk_ddp_comp_id comp_id); 194 - int mtk_ddp_comp_register(struct drm_device *drm, struct mtk_ddp_comp *comp); 195 - void mtk_ddp_comp_unregister(struct drm_device *drm, struct mtk_ddp_comp *comp); 196 194 enum mtk_ddp_comp_type mtk_ddp_comp_get_type(enum mtk_ddp_comp_id comp_id); 197 195 void mtk_ddp_write(struct cmdq_pkt *cmdq_pkt, unsigned int value, 198 196 struct cmdq_client_reg *cmdq_reg, void __iomem *regs,
+7 -20
drivers/gpu/drm/mediatek/mtk_drm_drv.c
··· 502 502 node); 503 503 drm_of_component_match_add(dev, &match, compare_of, 504 504 node); 505 - } else { 506 - struct mtk_ddp_comp *comp; 505 + } 507 506 508 - comp = devm_kzalloc(dev, sizeof(*comp), GFP_KERNEL); 509 - if (!comp) { 510 - ret = -ENOMEM; 511 - of_node_put(node); 512 - goto err_node; 513 - } 514 - 515 - ret = mtk_ddp_comp_init(node, comp, comp_id); 516 - if (ret) { 517 - of_node_put(node); 518 - goto err_node; 519 - } 520 - 521 - private->ddp_comp[comp_id] = comp; 507 + ret = mtk_ddp_comp_init(node, &private->ddp_comp[comp_id], comp_id); 508 + if (ret) { 509 + of_node_put(node); 510 + goto err_node; 522 511 } 523 512 } 524 513 ··· 533 544 of_node_put(private->mutex_node); 534 545 for (i = 0; i < DDP_COMPONENT_ID_MAX; i++) { 535 546 of_node_put(private->comp_node[i]); 536 - if (private->ddp_comp[i]) { 537 - put_device(private->ddp_comp[i]->larb_dev); 538 - private->ddp_comp[i] = NULL; 539 - } 547 + if (private->ddp_comp[i].larb_dev) 548 + put_device(private->ddp_comp[i].larb_dev); 540 549 } 541 550 return ret; 542 551 }
+1 -1
drivers/gpu/drm/mediatek/mtk_drm_drv.h
··· 41 41 struct device *mutex_dev; 42 42 struct device *mmsys_dev; 43 43 struct device_node *comp_node[DDP_COMPONENT_ID_MAX]; 44 - struct mtk_ddp_comp *ddp_comp[DDP_COMPONENT_ID_MAX]; 44 + struct mtk_ddp_comp ddp_comp[DDP_COMPONENT_ID_MAX]; 45 45 const struct mtk_mmsys_driver_data *data; 46 46 struct drm_atomic_state *suspend_state; 47 47 };
+1 -31
drivers/gpu/drm/mediatek/mtk_dsi.c
··· 179 179 }; 180 180 181 181 struct mtk_dsi { 182 - struct mtk_ddp_comp ddp_comp; 183 182 struct device *dev; 184 183 struct mipi_dsi_host host; 185 184 struct drm_encoder encoder; ··· 947 948 return ret; 948 949 } 949 950 950 - dsi->encoder.possible_crtcs = mtk_drm_find_possible_crtc_by_comp(drm, dsi->ddp_comp); 951 + dsi->encoder.possible_crtcs = mtk_drm_find_possible_crtc_by_comp(drm, dsi->host.dev); 951 952 952 953 ret = drm_bridge_attach(&dsi->encoder, &dsi->bridge, NULL, 953 954 DRM_BRIDGE_ATTACH_NO_CONNECTOR); ··· 975 976 struct drm_device *drm = data; 976 977 struct mtk_dsi *dsi = dev_get_drvdata(dev); 977 978 978 - ret = mtk_ddp_comp_register(drm, &dsi->ddp_comp); 979 - if (ret < 0) { 980 - dev_err(dev, "Failed to register component %pOF: %d\n", 981 - dev->of_node, ret); 982 - return ret; 983 - } 984 - 985 979 ret = mtk_dsi_encoder_init(drm, dsi); 986 - if (ret) 987 - goto err_unregister; 988 980 989 - return 0; 990 - 991 - err_unregister: 992 - mtk_ddp_comp_unregister(drm, &dsi->ddp_comp); 993 981 return ret; 994 982 } 995 983 996 984 static void mtk_dsi_unbind(struct device *dev, struct device *master, 997 985 void *data) 998 986 { 999 - struct drm_device *drm = data; 1000 987 struct mtk_dsi *dsi = dev_get_drvdata(dev); 1001 988 1002 989 drm_encoder_cleanup(&dsi->encoder); 1003 - mtk_ddp_comp_unregister(drm, &dsi->ddp_comp); 1004 990 } 1005 991 1006 992 static const struct component_ops mtk_dsi_component_ops = { ··· 1000 1016 struct drm_panel *panel; 1001 1017 struct resource *regs; 1002 1018 int irq_num; 1003 - int comp_id; 1004 1019 int ret; 1005 1020 1006 1021 dsi = devm_kzalloc(dev, sizeof(*dsi), GFP_KERNEL); ··· 1066 1083 if (IS_ERR(dsi->phy)) { 1067 1084 ret = PTR_ERR(dsi->phy); 1068 1085 dev_err(dev, "Failed to get MIPI-DPHY: %d\n", ret); 1069 - goto err_unregister_host; 1070 - } 1071 - 1072 - comp_id = mtk_ddp_comp_get_id(dev->of_node, MTK_DSI); 1073 - if (comp_id < 0) { 1074 - dev_err(dev, "Failed to identify by alias: %d\n", comp_id); 1075 - ret = comp_id; 1076 - goto err_unregister_host; 1077 - } 1078 - 1079 - ret = mtk_ddp_comp_init(dev->of_node, &dsi->ddp_comp, comp_id); 1080 - if (ret) { 1081 - dev_err(dev, "Failed to initialize component: %d\n", ret); 1082 1086 goto err_unregister_host; 1083 1087 } 1084 1088