Merge tag 'for-linus' of git://github.com/openrisc/linux
[linux-2.6-microblaze.git] / drivers / clocksource / sh_cmt.c
index d7ed99f..dd0956a 100644 (file)
@@ -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",