@@ -103,6 +103,7 @@ struct mmdc_pmu {
103
103
struct perf_event * mmdc_events [MMDC_NUM_COUNTERS ];
104
104
struct hlist_node node ;
105
105
struct fsl_mmdc_devtype_data * devtype_data ;
106
+ struct clk * mmdc_ipg_clk ;
106
107
};
107
108
108
109
/*
@@ -462,11 +463,14 @@ static int imx_mmdc_remove(struct platform_device *pdev)
462
463
463
464
cpuhp_state_remove_instance_nocalls (cpuhp_mmdc_state , & pmu_mmdc -> node );
464
465
perf_pmu_unregister (& pmu_mmdc -> pmu );
466
+ iounmap (pmu_mmdc -> mmdc_base );
467
+ clk_disable_unprepare (pmu_mmdc -> mmdc_ipg_clk );
465
468
kfree (pmu_mmdc );
466
469
return 0 ;
467
470
}
468
471
469
- static int imx_mmdc_perf_init (struct platform_device * pdev , void __iomem * mmdc_base )
472
+ static int imx_mmdc_perf_init (struct platform_device * pdev , void __iomem * mmdc_base ,
473
+ struct clk * mmdc_ipg_clk )
470
474
{
471
475
struct mmdc_pmu * pmu_mmdc ;
472
476
char * name ;
@@ -494,6 +498,7 @@ static int imx_mmdc_perf_init(struct platform_device *pdev, void __iomem *mmdc_b
494
498
}
495
499
496
500
mmdc_num = mmdc_pmu_init (pmu_mmdc , mmdc_base , & pdev -> dev );
501
+ pmu_mmdc -> mmdc_ipg_clk = mmdc_ipg_clk ;
497
502
if (mmdc_num == 0 )
498
503
name = "mmdc" ;
499
504
else
@@ -529,7 +534,7 @@ static int imx_mmdc_perf_init(struct platform_device *pdev, void __iomem *mmdc_b
529
534
530
535
#else
531
536
#define imx_mmdc_remove NULL
532
- #define imx_mmdc_perf_init (pdev , mmdc_base ) 0
537
+ #define imx_mmdc_perf_init (pdev , mmdc_base , mmdc_ipg_clk ) 0
533
538
#endif
534
539
535
540
static int imx_mmdc_probe (struct platform_device * pdev )
@@ -567,7 +572,13 @@ static int imx_mmdc_probe(struct platform_device *pdev)
567
572
val &= ~(1 << BP_MMDC_MAPSR_PSD );
568
573
writel_relaxed (val , reg );
569
574
570
- return imx_mmdc_perf_init (pdev , mmdc_base );
575
+ err = imx_mmdc_perf_init (pdev , mmdc_base , mmdc_ipg_clk );
576
+ if (err ) {
577
+ iounmap (mmdc_base );
578
+ clk_disable_unprepare (mmdc_ipg_clk );
579
+ }
580
+
581
+ return err ;
571
582
}
572
583
573
584
int imx_mmdc_get_ddr_type (void )
0 commit comments