浏览代码

Merge branch 'clockevents/fixes' of git://git.linaro.org/people/dlezcano/linux into timers/urgent

 * Hide event stream Kconfig option for the arch_arm_timer for ARM=n
 * Fix a missing a clk_put in case the registering of the sh_mtu[2] drivers fails.
 * Reuse clockevents_config_and_register for the at91rm9200_time timer
Thomas Gleixner 12 年之前
父节点
当前提交
70fe8217e1
共有 4 个文件被更改,包括 34 次插入10 次删除
  1. 2 5
      arch/arm/mach-at91/at91rm9200_time.c
  2. 1 0
      drivers/clocksource/Kconfig
  3. 14 2
      drivers/clocksource/sh_mtu2.c
  4. 17 3
      drivers/clocksource/sh_tmu.c

+ 2 - 5
arch/arm/mach-at91/at91rm9200_time.c

@@ -174,7 +174,6 @@ clkevt32k_next_event(unsigned long delta, struct clock_event_device *dev)
 static struct clock_event_device clkevt = {
 static struct clock_event_device clkevt = {
 	.name		= "at91_tick",
 	.name		= "at91_tick",
 	.features	= CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT,
 	.features	= CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT,
-	.shift		= 32,
 	.rating		= 150,
 	.rating		= 150,
 	.set_next_event	= clkevt32k_next_event,
 	.set_next_event	= clkevt32k_next_event,
 	.set_mode	= clkevt32k_mode,
 	.set_mode	= clkevt32k_mode,
@@ -265,11 +264,9 @@ void __init at91rm9200_timer_init(void)
 	at91_st_write(AT91_ST_RTMR, 1);
 	at91_st_write(AT91_ST_RTMR, 1);
 
 
 	/* Setup timer clockevent, with minimum of two ticks (important!!) */
 	/* Setup timer clockevent, with minimum of two ticks (important!!) */
-	clkevt.mult = div_sc(AT91_SLOW_CLOCK, NSEC_PER_SEC, clkevt.shift);
-	clkevt.max_delta_ns = clockevent_delta2ns(AT91_ST_ALMV, &clkevt);
-	clkevt.min_delta_ns = clockevent_delta2ns(2, &clkevt) + 1;
 	clkevt.cpumask = cpumask_of(0);
 	clkevt.cpumask = cpumask_of(0);
-	clockevents_register_device(&clkevt);
+	clockevents_config_and_register(&clkevt, AT91_SLOW_CLOCK,
+					2, AT91_ST_ALMV);
 
 
 	/* register clocksource */
 	/* register clocksource */
 	clocksource_register_hz(&clk32k, AT91_SLOW_CLOCK);
 	clocksource_register_hz(&clk32k, AT91_SLOW_CLOCK);

+ 1 - 0
drivers/clocksource/Kconfig

@@ -87,6 +87,7 @@ config ARM_ARCH_TIMER
 config ARM_ARCH_TIMER_EVTSTREAM
 config ARM_ARCH_TIMER_EVTSTREAM
 	bool "Support for ARM architected timer event stream generation"
 	bool "Support for ARM architected timer event stream generation"
 	default y if ARM_ARCH_TIMER
 	default y if ARM_ARCH_TIMER
+	depends on ARM_ARCH_TIMER
 	help
 	help
 	  This option enables support for event stream generation based on
 	  This option enables support for event stream generation based on
 	  the ARM architected timer. It is used for waking up CPUs executing
 	  the ARM architected timer. It is used for waking up CPUs executing

+ 14 - 2
drivers/clocksource/sh_mtu2.c

@@ -313,8 +313,20 @@ static int sh_mtu2_setup(struct sh_mtu2_priv *p, struct platform_device *pdev)
 		goto err1;
 		goto err1;
 	}
 	}
 
 
-	return sh_mtu2_register(p, (char *)dev_name(&p->pdev->dev),
-				cfg->clockevent_rating);
+	ret = clk_prepare(p->clk);
+	if (ret < 0)
+		goto err2;
+
+	ret = sh_mtu2_register(p, (char *)dev_name(&p->pdev->dev),
+			       cfg->clockevent_rating);
+	if (ret < 0)
+		goto err3;
+
+	return 0;
+ err3:
+	clk_unprepare(p->clk);
+ err2:
+	clk_put(p->clk);
  err1:
  err1:
 	iounmap(p->mapbase);
 	iounmap(p->mapbase);
  err0:
  err0:

+ 17 - 3
drivers/clocksource/sh_tmu.c

@@ -472,12 +472,26 @@ static int sh_tmu_setup(struct sh_tmu_priv *p, struct platform_device *pdev)
 		ret = PTR_ERR(p->clk);
 		ret = PTR_ERR(p->clk);
 		goto err1;
 		goto err1;
 	}
 	}
+
+	ret = clk_prepare(p->clk);
+	if (ret < 0)
+		goto err2;
+
 	p->cs_enabled = false;
 	p->cs_enabled = false;
 	p->enable_count = 0;
 	p->enable_count = 0;
 
 
-	return sh_tmu_register(p, (char *)dev_name(&p->pdev->dev),
-			       cfg->clockevent_rating,
-			       cfg->clocksource_rating);
+	ret = sh_tmu_register(p, (char *)dev_name(&p->pdev->dev),
+			      cfg->clockevent_rating,
+			      cfg->clocksource_rating);
+	if (ret < 0)
+		goto err3;
+
+	return 0;
+
+ err3:
+	clk_unprepare(p->clk);
+ err2:
+	clk_put(p->clk);
  err1:
  err1:
 	iounmap(p->mapbase);
 	iounmap(p->mapbase);
  err0:
  err0: