@@ -126,23 +126,13 @@ static irqreturn_t sr_interrupt(int irq, void *data)
126126
127127static void sr_set_clk_length (struct omap_sr * sr )
128128{
129- struct clk * fck ;
130129 u32 fclk_speed ;
131130
132131 /* Try interconnect target module fck first if it already exists */
133- fck = clk_get (sr -> pdev -> dev .parent , "fck" );
134- if (IS_ERR (fck )) {
135- fck = clk_get (& sr -> pdev -> dev , "fck" );
136- if (IS_ERR (fck )) {
137- dev_err (& sr -> pdev -> dev ,
138- "%s: unable to get fck for device %s\n" ,
139- __func__ , dev_name (& sr -> pdev -> dev ));
140- return ;
141- }
142- }
132+ if (IS_ERR (sr -> fck ))
133+ return ;
143134
144- fclk_speed = clk_get_rate (fck );
145- clk_put (fck );
135+ fclk_speed = clk_get_rate (sr -> fck );
146136
147137 switch (fclk_speed ) {
148138 case 12000000 :
@@ -587,21 +577,25 @@ int sr_enable(struct omap_sr *sr, unsigned long volt)
587577 /* errminlimit is opp dependent and hence linked to voltage */
588578 sr -> err_minlimit = nvalue_row -> errminlimit ;
589579
590- pm_runtime_get_sync ( & sr -> pdev -> dev );
580+ clk_enable ( sr -> fck );
591581
592582 /* Check if SR is already enabled. If yes do nothing */
593583 if (sr_read_reg (sr , SRCONFIG ) & SRCONFIG_SRENABLE )
594- return 0 ;
584+ goto out_enabled ;
595585
596586 /* Configure SR */
597587 ret = sr_class -> configure (sr );
598588 if (ret )
599- return ret ;
589+ goto out_enabled ;
600590
601591 sr_write_reg (sr , NVALUERECIPROCAL , nvalue_row -> nvalue );
602592
603593 /* SRCONFIG - enable SR */
604594 sr_modify_reg (sr , SRCONFIG , SRCONFIG_SRENABLE , SRCONFIG_SRENABLE );
595+
596+ out_enabled :
597+ sr -> enabled = 1 ;
598+
605599 return 0 ;
606600}
607601
@@ -621,7 +615,7 @@ void sr_disable(struct omap_sr *sr)
621615 }
622616
623617 /* Check if SR clocks are already disabled. If yes do nothing */
624- if (pm_runtime_suspended ( & sr -> pdev -> dev ) )
618+ if (! sr -> enabled )
625619 return ;
626620
627621 /*
@@ -642,7 +636,8 @@ void sr_disable(struct omap_sr *sr)
642636 }
643637 }
644638
645- pm_runtime_put_sync_suspend (& sr -> pdev -> dev );
639+ clk_disable (sr -> fck );
640+ sr -> enabled = 0 ;
646641}
647642
648643/**
@@ -851,8 +846,12 @@ static int omap_sr_probe(struct platform_device *pdev)
851846
852847 irq = platform_get_resource (pdev , IORESOURCE_IRQ , 0 );
853848
849+ sr_info -> fck = devm_clk_get (pdev -> dev .parent , "fck" );
850+ if (IS_ERR (sr_info -> fck ))
851+ return PTR_ERR (sr_info -> fck );
852+ clk_prepare (sr_info -> fck );
853+
854854 pm_runtime_enable (& pdev -> dev );
855- pm_runtime_irq_safe (& pdev -> dev );
856855
857856 snprintf (sr_info -> name , SMARTREFLEX_NAME_LEN , "%s" , pdata -> name );
858857
@@ -878,12 +877,6 @@ static int omap_sr_probe(struct platform_device *pdev)
878877
879878 list_add (& sr_info -> node , & sr_list );
880879
881- ret = pm_runtime_get_sync (& pdev -> dev );
882- if (ret < 0 ) {
883- pm_runtime_put_noidle (& pdev -> dev );
884- goto err_list_del ;
885- }
886-
887880 /*
888881 * Call into late init to do initializations that require
889882 * both sr driver and sr class driver to be initiallized.
@@ -933,23 +926,21 @@ static int omap_sr_probe(struct platform_device *pdev)
933926
934927 }
935928
936- pm_runtime_put_sync (& pdev -> dev );
937-
938929 return ret ;
939930
940931err_debugfs :
941932 debugfs_remove_recursive (sr_info -> dbg_dir );
942933err_list_del :
943934 list_del (& sr_info -> node );
944-
945- pm_runtime_put_sync (& pdev -> dev );
935+ clk_unprepare (sr_info -> fck );
946936
947937 return ret ;
948938}
949939
950940static int omap_sr_remove (struct platform_device * pdev )
951941{
952942 struct omap_sr_data * pdata = pdev -> dev .platform_data ;
943+ struct device * dev = & pdev -> dev ;
953944 struct omap_sr * sr_info ;
954945
955946 if (!pdata ) {
@@ -968,7 +959,8 @@ static int omap_sr_remove(struct platform_device *pdev)
968959 sr_stop_vddautocomp (sr_info );
969960 debugfs_remove_recursive (sr_info -> dbg_dir );
970961
971- pm_runtime_disable (& pdev -> dev );
962+ pm_runtime_disable (dev );
963+ clk_unprepare (sr_info -> fck );
972964 list_del (& sr_info -> node );
973965 return 0 ;
974966}
0 commit comments