Skip to content

Commit bfa76bb

Browse files
author
Laurent Pinchart
committed
clocksource: sh_cmt: Request IRQ for clock event device only
Clock sources don't need an IRQ, request the IRQ only for channels used as clock event devices. Signed-off-by: Laurent Pinchart <[email protected]>
1 parent e7a9bcc commit bfa76bb

File tree

1 file changed

+27
-24
lines changed

1 file changed

+27
-24
lines changed

drivers/clocksource/sh_cmt.c

Lines changed: 27 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -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

808828
static 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

Comments
 (0)