@@ -785,10 +785,28 @@ static void sh_cmt_clock_event_resume(struct clock_event_device *ced)
785785 pm_genpd_syscore_poweron (& ch -> cmt -> pdev -> dev );
786786}
787787
788- static void sh_cmt_register_clockevent (struct sh_cmt_channel * ch ,
789- const char * name )
788+ static int sh_cmt_register_clockevent (struct sh_cmt_channel * ch ,
789+ const char * name )
790790{
791791 struct clock_event_device * ced = & ch -> ced ;
792+ int irq ;
793+ int ret ;
794+
795+ irq = platform_get_irq (ch -> cmt -> pdev , ch -> cmt -> legacy ? 0 : ch -> index );
796+ if (irq < 0 ) {
797+ dev_err (& ch -> cmt -> pdev -> dev , "ch%u: failed to get irq\n" ,
798+ ch -> index );
799+ return irq ;
800+ }
801+
802+ ret = request_irq (irq , sh_cmt_interrupt ,
803+ IRQF_TIMER | IRQF_IRQPOLL | IRQF_NOBALANCING ,
804+ dev_name (& ch -> cmt -> pdev -> dev ), ch );
805+ if (ret ) {
806+ dev_err (& ch -> cmt -> pdev -> dev , "ch%u: failed to request irq %d\n" ,
807+ ch -> index , irq );
808+ return ret ;
809+ }
792810
793811 ced -> name = name ;
794812 ced -> features = CLOCK_EVT_FEAT_PERIODIC ;
@@ -803,14 +821,20 @@ static void sh_cmt_register_clockevent(struct sh_cmt_channel *ch,
803821 dev_info (& ch -> cmt -> pdev -> dev , "ch%u: used for clock events\n" ,
804822 ch -> index );
805823 clockevents_register_device (ced );
824+
825+ return 0 ;
806826}
807827
808828static int sh_cmt_register (struct sh_cmt_channel * ch , const char * name ,
809829 bool clockevent , bool clocksource )
810830{
831+ int ret ;
832+
811833 if (clockevent ) {
812834 ch -> cmt -> has_clockevent = true;
813- sh_cmt_register_clockevent (ch , name );
835+ ret = sh_cmt_register_clockevent (ch , name );
836+ if (ret < 0 )
837+ return ret ;
814838 }
815839
816840 if (clocksource ) {
@@ -825,7 +849,6 @@ static int sh_cmt_setup_channel(struct sh_cmt_channel *ch, unsigned int index,
825849 unsigned int hwidx , bool clockevent ,
826850 bool clocksource , struct sh_cmt_device * cmt )
827851{
828- int irq ;
829852 int ret ;
830853
831854 /* Skip unused channels. */
@@ -869,17 +892,6 @@ static int sh_cmt_setup_channel(struct sh_cmt_channel *ch, unsigned int index,
869892 }
870893 }
871894
872- if (cmt -> legacy )
873- irq = platform_get_irq (cmt -> pdev , 0 );
874- else
875- irq = platform_get_irq (cmt -> pdev , ch -> index );
876-
877- if (irq < 0 ) {
878- dev_err (& cmt -> pdev -> dev , "ch%u: failed to get irq\n" ,
879- ch -> index );
880- return irq ;
881- }
882-
883895 if (cmt -> info -> width == (sizeof (ch -> max_match_value ) * 8 ))
884896 ch -> max_match_value = ~0 ;
885897 else
@@ -904,15 +916,6 @@ static int sh_cmt_setup_channel(struct sh_cmt_channel *ch, unsigned int index,
904916 }
905917 ch -> cs_enabled = false;
906918
907- ret = request_irq (irq , sh_cmt_interrupt ,
908- IRQF_TIMER | IRQF_IRQPOLL | IRQF_NOBALANCING ,
909- dev_name (& cmt -> pdev -> dev ), ch );
910- if (ret ) {
911- dev_err (& cmt -> pdev -> dev , "ch%u: failed to request irq %d\n" ,
912- ch -> index , irq );
913- return ret ;
914- }
915-
916919 return 0 ;
917920}
918921
0 commit comments