diff options
| -rw-r--r-- | drivers/clocksource/sh_cmt.c | 30 | 
1 files changed, 18 insertions, 12 deletions
| diff --git a/drivers/clocksource/sh_cmt.c b/drivers/clocksource/sh_cmt.c index d7ed99f0001f..dd0956ad969c 100644 --- a/drivers/clocksource/sh_cmt.c +++ b/drivers/clocksource/sh_cmt.c @@ -579,7 +579,8 @@ static int sh_cmt_start(struct sh_cmt_channel *ch, unsigned long flag)  	ch->flags |= flag;  	/* setup timeout if no clockevent */ -	if ((flag == FLAG_CLOCKSOURCE) && (!(ch->flags & FLAG_CLOCKEVENT))) +	if (ch->cmt->num_channels == 1 && +	    flag == FLAG_CLOCKSOURCE && (!(ch->flags & FLAG_CLOCKEVENT)))  		__sh_cmt_set_next(ch, ch->max_match_value);   out:  	raw_spin_unlock_irqrestore(&ch->lock, flags); @@ -621,20 +622,25 @@ static struct sh_cmt_channel *cs_to_sh_cmt(struct clocksource *cs)  static u64 sh_cmt_clocksource_read(struct clocksource *cs)  {  	struct sh_cmt_channel *ch = cs_to_sh_cmt(cs); -	unsigned long flags;  	u32 has_wrapped; -	u64 value; -	u32 raw; -	raw_spin_lock_irqsave(&ch->lock, flags); -	value = ch->total_cycles; -	raw = sh_cmt_get_counter(ch, &has_wrapped); +	if (ch->cmt->num_channels == 1) { +		unsigned long flags; +		u64 value; +		u32 raw; -	if (unlikely(has_wrapped)) -		raw += ch->match_value + 1; -	raw_spin_unlock_irqrestore(&ch->lock, flags); +		raw_spin_lock_irqsave(&ch->lock, flags); +		value = ch->total_cycles; +		raw = sh_cmt_get_counter(ch, &has_wrapped); + +		if (unlikely(has_wrapped)) +			raw += ch->match_value + 1; +		raw_spin_unlock_irqrestore(&ch->lock, flags); + +		return value + raw; +	} -	return value + raw; +	return sh_cmt_get_counter(ch, &has_wrapped);  }  static int sh_cmt_clocksource_enable(struct clocksource *cs) @@ -697,7 +703,7 @@ static int sh_cmt_register_clocksource(struct sh_cmt_channel *ch,  	cs->disable = sh_cmt_clocksource_disable;  	cs->suspend = sh_cmt_clocksource_suspend;  	cs->resume = sh_cmt_clocksource_resume; -	cs->mask = CLOCKSOURCE_MASK(sizeof(u64) * 8); +	cs->mask = CLOCKSOURCE_MASK(ch->cmt->info->width);  	cs->flags = CLOCK_SOURCE_IS_CONTINUOUS;  	dev_info(&ch->cmt->pdev->dev, "ch%u: used as clock source\n", |