Re: [PATCH 02/03] clocksource: em_sti: Emma Mobile STI driver V2

From: Thomas Gleixner
Date: Thu May 24 2012 - 19:42:17 EST


On Wed, 9 May 2012, Magnus Damm wrote:
> +static irqreturn_t em_sti_interrupt(int irq, void *dev_id)
> +{
> + struct em_sti_priv *p = dev_id;
> +
> + /* Always regprogram timer compare A */
> + if (p->ced.mode == CLOCK_EVT_MODE_PERIODIC)
> + em_sti_update(p);

Why do you want to do that? The core code already handles timers which
only support oneshot mode.

> + spin_lock_irqsave(&p->lock, flags);

Please make that a raw_spinlock.

> +static void em_sti_clock_event_mode(enum clock_event_mode mode,
> + struct clock_event_device *ced)
> +{
> + struct em_sti_priv *p = ced_to_em_sti(ced);
> +
> + /* deal with old setting first */
> + switch (ced->mode) {
> + case CLOCK_EVT_MODE_PERIODIC:
> + case CLOCK_EVT_MODE_ONESHOT:
> + em_sti_stop(p, USER_CLOCKEVENT);
> + break;
> + default:
> + break;
> + }
> +
> + switch (mode) {
> + case CLOCK_EVT_MODE_PERIODIC:
> + dev_info(&p->pdev->dev, "used for periodic clock events\n");
> + em_sti_start(p, USER_CLOCKEVENT);
> + clockevents_config(&p->ced, p->rate);
> + p->delta = (p->rate + HZ/2) / HZ;
> + p->next = em_sti_count(p);
> + em_sti_update(p);
> + break;

All that code in this case can go away.

> +static void em_sti_register_clockevent(struct em_sti_priv *p)
> +{
> + struct clock_event_device *ced = &p->ced;
> +
> + memset(ced, 0, sizeof(*ced));
> + ced->name = dev_name(&p->pdev->dev);
> + ced->features = CLOCK_EVT_FEAT_PERIODIC;
> + ced->features |= CLOCK_EVT_FEAT_ONESHOT;

If you make that:

ced->features = CLOCK_EVT_FEAT_ONESHOT;

Thanks,

tglx
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/