@@ -364,14 +364,50 @@ static int v3d_platform_drm_probe(struct platform_device *pdev)
364364 return ret ;
365365 }
366366
367+ if (v3d -> ver < V3D_GEN_41 ) {
368+ ret = map_regs (v3d , & v3d -> gca_regs , "gca" );
369+ if (ret )
370+ return ret ;
371+ }
372+
373+ v3d -> reset = devm_reset_control_get_optional_exclusive (dev , NULL );
374+ if (IS_ERR (v3d -> reset ))
375+ return dev_err_probe (dev , PTR_ERR (v3d -> reset ),
376+ "Failed to get reset control\n" );
377+
378+ if (!v3d -> reset ) {
379+ ret = map_regs (v3d , & v3d -> bridge_regs , "bridge" );
380+ if (ret ) {
381+ dev_err (dev , "Failed to get bridge registers\n" );
382+ return ret ;
383+ }
384+ }
385+
367386 v3d -> clk = devm_clk_get_optional (dev , NULL );
368387 if (IS_ERR (v3d -> clk ))
369388 return dev_err_probe (dev , PTR_ERR (v3d -> clk ), "Failed to get V3D clock\n" );
370389
390+ ret = v3d_irq_init (v3d );
391+ if (ret )
392+ return ret ;
393+
394+ v3d_perfmon_init (v3d );
395+
396+ v3d -> mmu_scratch = dma_alloc_wc (dev , 4096 , & v3d -> mmu_scratch_paddr ,
397+ GFP_KERNEL | __GFP_NOWARN | __GFP_ZERO );
398+ if (!v3d -> mmu_scratch ) {
399+ dev_err (dev , "Failed to allocate MMU scratch page\n" );
400+ return - ENOMEM ;
401+ }
402+
403+ ret = v3d_gem_init (drm );
404+ if (ret )
405+ goto dma_free ;
406+
371407 ret = clk_prepare_enable (v3d -> clk );
372408 if (ret ) {
373409 dev_err (& pdev -> dev , "Couldn't enable the V3D clock\n" );
374- return ret ;
410+ goto gem_destroy ;
375411 }
376412
377413 v3d_idle_sms (v3d );
@@ -400,44 +436,9 @@ static int v3d_platform_drm_probe(struct platform_device *pdev)
400436 ident3 = V3D_READ (V3D_HUB_IDENT3 );
401437 v3d -> rev = V3D_GET_FIELD (ident3 , V3D_HUB_IDENT3_IPREV );
402438
403- v3d_perfmon_init (v3d );
404-
405- v3d -> reset = devm_reset_control_get_optional_exclusive (dev , NULL );
406- if (IS_ERR (v3d -> reset )) {
407- ret = dev_err_probe (dev , PTR_ERR (v3d -> reset ),
408- "Failed to get reset control\n" );
409- goto clk_disable ;
410- }
411-
412- if (!v3d -> reset ) {
413- ret = map_regs (v3d , & v3d -> bridge_regs , "bridge" );
414- if (ret ) {
415- dev_err (dev , "Failed to get bridge registers\n" );
416- goto clk_disable ;
417- }
418- }
419-
420- if (v3d -> ver < V3D_GEN_41 ) {
421- ret = map_regs (v3d , & v3d -> gca_regs , "gca" );
422- if (ret )
423- goto clk_disable ;
424- }
425-
426- v3d -> mmu_scratch = dma_alloc_wc (dev , 4096 , & v3d -> mmu_scratch_paddr ,
427- GFP_KERNEL | __GFP_NOWARN | __GFP_ZERO );
428- if (!v3d -> mmu_scratch ) {
429- dev_err (dev , "Failed to allocate MMU scratch page\n" );
430- ret = - ENOMEM ;
431- goto clk_disable ;
432- }
433-
434- ret = v3d_gem_init (drm );
435- if (ret )
436- goto dma_free ;
437-
438- ret = v3d_irq_init (v3d );
439- if (ret )
440- goto gem_destroy ;
439+ v3d_init_hw_state (v3d );
440+ v3d_mmu_set_page_table (v3d );
441+ v3d_irq_enable (v3d );
441442
442443 ret = drm_dev_register (drm , 0 );
443444 if (ret )
@@ -453,12 +454,13 @@ static int v3d_platform_drm_probe(struct platform_device *pdev)
453454 drm_dev_unregister (drm );
454455irq_disable :
455456 v3d_irq_disable (v3d );
457+ clk_disable :
458+ v3d_power_off_sms (v3d );
459+ clk_disable_unprepare (v3d -> clk );
456460gem_destroy :
457461 v3d_gem_destroy (drm );
458462dma_free :
459463 dma_free_wc (dev , 4096 , v3d -> mmu_scratch , v3d -> mmu_scratch_paddr );
460- clk_disable :
461- clk_disable_unprepare (v3d -> clk );
462464 return ret ;
463465}
464466
@@ -472,14 +474,13 @@ static void v3d_platform_drm_remove(struct platform_device *pdev)
472474
473475 drm_dev_unregister (drm );
474476
475- v3d_gem_destroy (drm );
476-
477- dma_free_wc (v3d -> drm .dev , 4096 , v3d -> mmu_scratch ,
478- v3d -> mmu_scratch_paddr );
479-
480477 v3d_power_off_sms (v3d );
481478
482479 clk_disable_unprepare (v3d -> clk );
480+
481+ v3d_gem_destroy (drm );
482+
483+ dma_free_wc (dev , 4096 , v3d -> mmu_scratch , v3d -> mmu_scratch_paddr );
483484}
484485
485486static struct platform_driver v3d_platform_driver = {
0 commit comments