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 <laurent.pinchart+renesas@ideasonboard.com>
This commit is contained in:
parent
e7a9bcc237
commit
bfa76bb12f
1 changed files with 27 additions and 24 deletions
|
@ -785,10 +785,28 @@ static void sh_cmt_clock_event_resume(struct clock_event_device *ced)
|
||||||
pm_genpd_syscore_poweron(&ch->cmt->pdev->dev);
|
pm_genpd_syscore_poweron(&ch->cmt->pdev->dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void sh_cmt_register_clockevent(struct sh_cmt_channel *ch,
|
static int sh_cmt_register_clockevent(struct sh_cmt_channel *ch,
|
||||||
const char *name)
|
const char *name)
|
||||||
{
|
{
|
||||||
struct clock_event_device *ced = &ch->ced;
|
struct clock_event_device *ced = &ch->ced;
|
||||||
|
int irq;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
irq = platform_get_irq(ch->cmt->pdev, ch->cmt->legacy ? 0 : ch->index);
|
||||||
|
if (irq < 0) {
|
||||||
|
dev_err(&ch->cmt->pdev->dev, "ch%u: failed to get irq\n",
|
||||||
|
ch->index);
|
||||||
|
return irq;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = request_irq(irq, sh_cmt_interrupt,
|
||||||
|
IRQF_TIMER | IRQF_IRQPOLL | IRQF_NOBALANCING,
|
||||||
|
dev_name(&ch->cmt->pdev->dev), ch);
|
||||||
|
if (ret) {
|
||||||
|
dev_err(&ch->cmt->pdev->dev, "ch%u: failed to request irq %d\n",
|
||||||
|
ch->index, irq);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
ced->name = name;
|
ced->name = name;
|
||||||
ced->features = CLOCK_EVT_FEAT_PERIODIC;
|
ced->features = CLOCK_EVT_FEAT_PERIODIC;
|
||||||
|
@ -803,14 +821,20 @@ static void sh_cmt_register_clockevent(struct sh_cmt_channel *ch,
|
||||||
dev_info(&ch->cmt->pdev->dev, "ch%u: used for clock events\n",
|
dev_info(&ch->cmt->pdev->dev, "ch%u: used for clock events\n",
|
||||||
ch->index);
|
ch->index);
|
||||||
clockevents_register_device(ced);
|
clockevents_register_device(ced);
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int sh_cmt_register(struct sh_cmt_channel *ch, const char *name,
|
static int sh_cmt_register(struct sh_cmt_channel *ch, const char *name,
|
||||||
bool clockevent, bool clocksource)
|
bool clockevent, bool clocksource)
|
||||||
{
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
if (clockevent) {
|
if (clockevent) {
|
||||||
ch->cmt->has_clockevent = true;
|
ch->cmt->has_clockevent = true;
|
||||||
sh_cmt_register_clockevent(ch, name);
|
ret = sh_cmt_register_clockevent(ch, name);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (clocksource) {
|
if (clocksource) {
|
||||||
|
@ -825,7 +849,6 @@ static int sh_cmt_setup_channel(struct sh_cmt_channel *ch, unsigned int index,
|
||||||
unsigned int hwidx, bool clockevent,
|
unsigned int hwidx, bool clockevent,
|
||||||
bool clocksource, struct sh_cmt_device *cmt)
|
bool clocksource, struct sh_cmt_device *cmt)
|
||||||
{
|
{
|
||||||
int irq;
|
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
/* Skip unused channels. */
|
/* Skip unused channels. */
|
||||||
|
@ -869,17 +892,6 @@ static int sh_cmt_setup_channel(struct sh_cmt_channel *ch, unsigned int index,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cmt->legacy)
|
|
||||||
irq = platform_get_irq(cmt->pdev, 0);
|
|
||||||
else
|
|
||||||
irq = platform_get_irq(cmt->pdev, ch->index);
|
|
||||||
|
|
||||||
if (irq < 0) {
|
|
||||||
dev_err(&cmt->pdev->dev, "ch%u: failed to get irq\n",
|
|
||||||
ch->index);
|
|
||||||
return irq;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cmt->info->width == (sizeof(ch->max_match_value) * 8))
|
if (cmt->info->width == (sizeof(ch->max_match_value) * 8))
|
||||||
ch->max_match_value = ~0;
|
ch->max_match_value = ~0;
|
||||||
else
|
else
|
||||||
|
@ -904,15 +916,6 @@ static int sh_cmt_setup_channel(struct sh_cmt_channel *ch, unsigned int index,
|
||||||
}
|
}
|
||||||
ch->cs_enabled = false;
|
ch->cs_enabled = false;
|
||||||
|
|
||||||
ret = request_irq(irq, sh_cmt_interrupt,
|
|
||||||
IRQF_TIMER | IRQF_IRQPOLL | IRQF_NOBALANCING,
|
|
||||||
dev_name(&cmt->pdev->dev), ch);
|
|
||||||
if (ret) {
|
|
||||||
dev_err(&cmt->pdev->dev, "ch%u: failed to request irq %d\n",
|
|
||||||
ch->index, irq);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue