44 * Author: YT SHEN <[email protected] > 55 */
66
7+ #include <linux/clk.h>
8+ #include <linux/clk-provider.h>
79#include <linux/component.h>
810#include <linux/iommu.h>
911#include <linux/module.h>
@@ -195,6 +197,19 @@ static const enum mtk_ddp_comp_id mt8192_mtk_ddp_ext[] = {
195197 DDP_COMPONENT_DPI0 ,
196198};
197199
200+ static const enum mtk_ddp_comp_id mt8195_mtk_ddp_main [] = {
201+ DDP_COMPONENT_OVL0 ,
202+ DDP_COMPONENT_RDMA0 ,
203+ DDP_COMPONENT_COLOR0 ,
204+ DDP_COMPONENT_CCORR ,
205+ DDP_COMPONENT_AAL0 ,
206+ DDP_COMPONENT_GAMMA ,
207+ DDP_COMPONENT_DITHER ,
208+ DDP_COMPONENT_DSC0 ,
209+ DDP_COMPONENT_MERGE0 ,
210+ DDP_COMPONENT_DP_INTF0 ,
211+ };
212+
198213static const struct mtk_mmsys_driver_data mt2701_mmsys_driver_data = {
199214 .main_path = mt2701_mtk_ddp_main ,
200215 .main_len = ARRAY_SIZE (mt2701_mtk_ddp_main ),
@@ -203,6 +218,13 @@ static const struct mtk_mmsys_driver_data mt2701_mmsys_driver_data = {
203218 .shadow_register = true,
204219};
205220
221+ static const struct mtk_mmsys_match_data mt2701_mmsys_match_data = {
222+ .num_drv_data = 1 ,
223+ .drv_data = {
224+ & mt2701_mmsys_driver_data ,
225+ },
226+ };
227+
206228static const struct mtk_mmsys_driver_data mt7623_mmsys_driver_data = {
207229 .main_path = mt7623_mtk_ddp_main ,
208230 .main_len = ARRAY_SIZE (mt7623_mtk_ddp_main ),
@@ -211,6 +233,13 @@ static const struct mtk_mmsys_driver_data mt7623_mmsys_driver_data = {
211233 .shadow_register = true,
212234};
213235
236+ static const struct mtk_mmsys_match_data mt7623_mmsys_match_data = {
237+ .num_drv_data = 1 ,
238+ .drv_data = {
239+ & mt7623_mmsys_driver_data ,
240+ },
241+ };
242+
214243static const struct mtk_mmsys_driver_data mt2712_mmsys_driver_data = {
215244 .main_path = mt2712_mtk_ddp_main ,
216245 .main_len = ARRAY_SIZE (mt2712_mtk_ddp_main ),
@@ -220,39 +249,99 @@ static const struct mtk_mmsys_driver_data mt2712_mmsys_driver_data = {
220249 .third_len = ARRAY_SIZE (mt2712_mtk_ddp_third ),
221250};
222251
252+ static const struct mtk_mmsys_match_data mt2712_mmsys_match_data = {
253+ .num_drv_data = 1 ,
254+ .drv_data = {
255+ & mt2712_mmsys_driver_data ,
256+ },
257+ };
258+
223259static const struct mtk_mmsys_driver_data mt8167_mmsys_driver_data = {
224260 .main_path = mt8167_mtk_ddp_main ,
225261 .main_len = ARRAY_SIZE (mt8167_mtk_ddp_main ),
226262};
227263
264+ static const struct mtk_mmsys_match_data mt8167_mmsys_match_data = {
265+ .num_drv_data = 1 ,
266+ .drv_data = {
267+ & mt8167_mmsys_driver_data ,
268+ },
269+ };
270+
228271static const struct mtk_mmsys_driver_data mt8173_mmsys_driver_data = {
229272 .main_path = mt8173_mtk_ddp_main ,
230273 .main_len = ARRAY_SIZE (mt8173_mtk_ddp_main ),
231274 .ext_path = mt8173_mtk_ddp_ext ,
232275 .ext_len = ARRAY_SIZE (mt8173_mtk_ddp_ext ),
233276};
234277
278+ static const struct mtk_mmsys_match_data mt8173_mmsys_match_data = {
279+ .num_drv_data = 1 ,
280+ .drv_data = {
281+ & mt8173_mmsys_driver_data ,
282+ },
283+ };
284+
235285static const struct mtk_mmsys_driver_data mt8183_mmsys_driver_data = {
236286 .main_path = mt8183_mtk_ddp_main ,
237287 .main_len = ARRAY_SIZE (mt8183_mtk_ddp_main ),
238288 .ext_path = mt8183_mtk_ddp_ext ,
239289 .ext_len = ARRAY_SIZE (mt8183_mtk_ddp_ext ),
240290};
241291
292+ static const struct mtk_mmsys_match_data mt8183_mmsys_match_data = {
293+ .num_drv_data = 1 ,
294+ .drv_data = {
295+ & mt8183_mmsys_driver_data ,
296+ },
297+ };
298+
242299static const struct mtk_mmsys_driver_data mt8186_mmsys_driver_data = {
243300 .main_path = mt8186_mtk_ddp_main ,
244301 .main_len = ARRAY_SIZE (mt8186_mtk_ddp_main ),
245302 .ext_path = mt8186_mtk_ddp_ext ,
246303 .ext_len = ARRAY_SIZE (mt8186_mtk_ddp_ext ),
247304};
248305
306+ static const struct mtk_mmsys_match_data mt8186_mmsys_match_data = {
307+ .num_drv_data = 1 ,
308+ .drv_data = {
309+ & mt8186_mmsys_driver_data ,
310+ },
311+ };
312+
249313static const struct mtk_mmsys_driver_data mt8192_mmsys_driver_data = {
250314 .main_path = mt8192_mtk_ddp_main ,
251315 .main_len = ARRAY_SIZE (mt8192_mtk_ddp_main ),
252316 .ext_path = mt8192_mtk_ddp_ext ,
253317 .ext_len = ARRAY_SIZE (mt8192_mtk_ddp_ext ),
254318};
255319
320+ static const struct mtk_mmsys_match_data mt8192_mmsys_match_data = {
321+ .num_drv_data = 1 ,
322+ .drv_data = {
323+ & mt8192_mmsys_driver_data ,
324+ },
325+ };
326+
327+ static const struct mtk_mmsys_driver_data mt8195_vdosys0_driver_data = {
328+ .io_start = 0x1c01a000 ,
329+ .main_path = mt8195_mtk_ddp_main ,
330+ .main_len = ARRAY_SIZE (mt8195_mtk_ddp_main ),
331+ };
332+
333+ static const struct mtk_mmsys_driver_data mt8195_vdosys1_driver_data = {
334+ .io_start = 0x1c100000 ,
335+ };
336+
337+ static const struct mtk_mmsys_match_data mt8195_mmsys_match_data = {
338+ .num_drv_data = 1 ,
339+ .drv_data = {
340+ & mt8195_vdosys0_driver_data ,
341+ & mt8195_vdosys1_driver_data ,
342+ },
343+ };
344+
256345static int mtk_drm_kms_init (struct drm_device * drm )
257346{
258347 struct mtk_drm_private * private = drm -> dev_private ;
@@ -470,12 +559,16 @@ static const struct of_device_id mtk_ddp_comp_dt_ids[] = {
470559 .data = (void * )MTK_DISP_DITHER },
471560 { .compatible = "mediatek,mt8183-disp-dither" ,
472561 .data = (void * )MTK_DISP_DITHER },
562+ { .compatible = "mediatek,mt8195-disp-dsc" ,
563+ .data = (void * )MTK_DISP_DSC },
473564 { .compatible = "mediatek,mt8167-disp-gamma" ,
474565 .data = (void * )MTK_DISP_GAMMA , },
475566 { .compatible = "mediatek,mt8173-disp-gamma" ,
476567 .data = (void * )MTK_DISP_GAMMA , },
477568 { .compatible = "mediatek,mt8183-disp-gamma" ,
478569 .data = (void * )MTK_DISP_GAMMA , },
570+ { .compatible = "mediatek,mt8195-disp-merge" ,
571+ .data = (void * )MTK_DISP_MERGE },
479572 { .compatible = "mediatek,mt2701-disp-mutex" ,
480573 .data = (void * )MTK_DISP_MUTEX },
481574 { .compatible = "mediatek,mt2712-disp-mutex" ,
@@ -490,6 +583,8 @@ static const struct of_device_id mtk_ddp_comp_dt_ids[] = {
490583 .data = (void * )MTK_DISP_MUTEX },
491584 { .compatible = "mediatek,mt8192-disp-mutex" ,
492585 .data = (void * )MTK_DISP_MUTEX },
586+ { .compatible = "mediatek,mt8195-disp-mutex" ,
587+ .data = (void * )MTK_DISP_MUTEX },
493588 { .compatible = "mediatek,mt8173-disp-od" ,
494589 .data = (void * )MTK_DISP_OD },
495590 { .compatible = "mediatek,mt2701-disp-ovl" ,
@@ -524,6 +619,8 @@ static const struct of_device_id mtk_ddp_comp_dt_ids[] = {
524619 .data = (void * )MTK_DISP_RDMA },
525620 { .compatible = "mediatek,mt8192-disp-rdma" ,
526621 .data = (void * )MTK_DISP_RDMA },
622+ { .compatible = "mediatek,mt8195-disp-rdma" ,
623+ .data = (void * )MTK_DISP_RDMA },
527624 { .compatible = "mediatek,mt8173-disp-ufoe" ,
528625 .data = (void * )MTK_DISP_UFOE },
529626 { .compatible = "mediatek,mt8173-disp-wdma" ,
@@ -549,30 +646,53 @@ static const struct of_device_id mtk_ddp_comp_dt_ids[] = {
549646
550647static const struct of_device_id mtk_drm_of_ids [] = {
551648 { .compatible = "mediatek,mt2701-mmsys" ,
552- .data = & mt2701_mmsys_driver_data },
649+ .data = & mt2701_mmsys_match_data },
553650 { .compatible = "mediatek,mt7623-mmsys" ,
554- .data = & mt7623_mmsys_driver_data },
651+ .data = & mt7623_mmsys_match_data },
555652 { .compatible = "mediatek,mt2712-mmsys" ,
556- .data = & mt2712_mmsys_driver_data },
653+ .data = & mt2712_mmsys_match_data },
557654 { .compatible = "mediatek,mt8167-mmsys" ,
558- .data = & mt8167_mmsys_driver_data },
655+ .data = & mt8167_mmsys_match_data },
559656 { .compatible = "mediatek,mt8173-mmsys" ,
560- .data = & mt8173_mmsys_driver_data },
657+ .data = & mt8173_mmsys_match_data },
561658 { .compatible = "mediatek,mt8183-mmsys" ,
562- .data = & mt8183_mmsys_driver_data },
659+ .data = & mt8183_mmsys_match_data },
563660 { .compatible = "mediatek,mt8186-mmsys" ,
564- .data = & mt8186_mmsys_driver_data },
661+ .data = & mt8186_mmsys_match_data },
565662 { .compatible = "mediatek,mt8192-mmsys" ,
566- .data = & mt8192_mmsys_driver_data },
663+ .data = & mt8192_mmsys_match_data },
664+ { .compatible = "mediatek,mt8195-mmsys" ,
665+ .data = & mt8195_mmsys_match_data },
567666 { }
568667};
569668MODULE_DEVICE_TABLE (of , mtk_drm_of_ids );
570669
670+ static int mtk_drm_find_match_data (struct device * dev ,
671+ const struct mtk_mmsys_match_data * match_data )
672+ {
673+ int i ;
674+ struct platform_device * pdev = of_find_device_by_node (dev -> parent -> of_node );
675+ struct resource * res ;
676+
677+ res = platform_get_resource (pdev , IORESOURCE_MEM , 0 );
678+ if (!res ) {
679+ dev_err (dev , "failed to get parent resource\n" );
680+ return - EINVAL ;
681+ }
682+
683+ for (i = 0 ; i < match_data -> num_drv_data ; i ++ )
684+ if (match_data -> drv_data [i ]-> io_start == res -> start )
685+ return i ;
686+
687+ return - EINVAL ;
688+ }
689+
571690static int mtk_drm_probe (struct platform_device * pdev )
572691{
573692 struct device * dev = & pdev -> dev ;
574693 struct device_node * phandle = dev -> parent -> of_node ;
575694 const struct of_device_id * of_id ;
695+ const struct mtk_mmsys_match_data * match_data ;
576696 struct mtk_drm_private * private ;
577697 struct device_node * node ;
578698 struct component_match * match = NULL ;
@@ -593,7 +713,19 @@ static int mtk_drm_probe(struct platform_device *pdev)
593713 if (!of_id )
594714 return - ENODEV ;
595715
596- private -> data = of_id -> data ;
716+ match_data = of_id -> data ;
717+ if (match_data -> num_drv_data > 1 ) {
718+ /* This SoC has multiple mmsys channels */
719+ ret = mtk_drm_find_match_data (dev , match_data );
720+ if (ret < 0 ) {
721+ dev_err (dev , "Couldn't get match driver data\n" );
722+ return ret ;
723+ }
724+ private -> data = match_data -> drv_data [ret ];
725+ } else {
726+ dev_dbg (dev , "Using single mmsys channel\n" );
727+ private -> data = match_data -> drv_data [0 ];
728+ }
597729
598730 /* Iterate over sibling DISP function blocks */
599731 for_each_child_of_node (phandle -> parent , node ) {
0 commit comments