Commit 4aa36444 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'timers-urgent-2021-02-22' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull timer fixes from Thomas Gleixner:
 "A small set of clockevent fixes which fell through the cracks before
  the 5.11 release:

   - Ensure a clock is enabled on sh_cmt

   - Trivial compile fail and compile warning fixes"

* tag 'timers-urgent-2021-02-22' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  clocksource/drivers/mxs_timer: Add missing semicolon when DEBUG is defined
  clocksource/drivers/sh_cmt: Make sure channel clock supply is enabled
  clocksource/drivers/ixp4xx: Select TIMER_OF when needed
parents c9584234 8acb54ab
...@@ -13,7 +13,6 @@ config MACH_IXP4XX_OF ...@@ -13,7 +13,6 @@ config MACH_IXP4XX_OF
select I2C select I2C
select I2C_IOP3XX select I2C_IOP3XX
select PCI select PCI
select TIMER_OF
select USE_OF select USE_OF
help help
Say 'Y' here to support Device Tree-based IXP4xx platforms. Say 'Y' here to support Device Tree-based IXP4xx platforms.
......
...@@ -79,6 +79,7 @@ config IXP4XX_TIMER ...@@ -79,6 +79,7 @@ config IXP4XX_TIMER
bool "Intel XScale IXP4xx timer driver" if COMPILE_TEST bool "Intel XScale IXP4xx timer driver" if COMPILE_TEST
depends on HAS_IOMEM depends on HAS_IOMEM
select CLKSRC_MMIO select CLKSRC_MMIO
select TIMER_OF if OF
help help
Enables support for the Intel XScale IXP4xx SoC timer. Enables support for the Intel XScale IXP4xx SoC timer.
......
...@@ -131,10 +131,7 @@ static void mxs_irq_clear(char *state) ...@@ -131,10 +131,7 @@ static void mxs_irq_clear(char *state)
/* Clear pending interrupt */ /* Clear pending interrupt */
timrot_irq_acknowledge(); timrot_irq_acknowledge();
pr_debug("%s: changing mode to %s\n", __func__, state);
#ifdef DEBUG
pr_info("%s: changing mode to %s\n", __func__, state)
#endif /* DEBUG */
} }
static int mxs_shutdown(struct clock_event_device *evt) static int mxs_shutdown(struct clock_event_device *evt)
......
...@@ -235,6 +235,8 @@ static const struct sh_cmt_info sh_cmt_info[] = { ...@@ -235,6 +235,8 @@ static const struct sh_cmt_info sh_cmt_info[] = {
#define CMCNT 1 /* channel register */ #define CMCNT 1 /* channel register */
#define CMCOR 2 /* channel register */ #define CMCOR 2 /* channel register */
#define CMCLKE 0x1000 /* CLK Enable Register (R-Car Gen2) */
static inline u32 sh_cmt_read_cmstr(struct sh_cmt_channel *ch) static inline u32 sh_cmt_read_cmstr(struct sh_cmt_channel *ch)
{ {
if (ch->iostart) if (ch->iostart)
...@@ -853,6 +855,7 @@ static int sh_cmt_setup_channel(struct sh_cmt_channel *ch, unsigned int index, ...@@ -853,6 +855,7 @@ 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)
{ {
u32 value;
int ret; int ret;
/* Skip unused channels. */ /* Skip unused channels. */
...@@ -882,6 +885,11 @@ static int sh_cmt_setup_channel(struct sh_cmt_channel *ch, unsigned int index, ...@@ -882,6 +885,11 @@ static int sh_cmt_setup_channel(struct sh_cmt_channel *ch, unsigned int index,
ch->iostart = cmt->mapbase + ch->hwidx * 0x100; ch->iostart = cmt->mapbase + ch->hwidx * 0x100;
ch->ioctrl = ch->iostart + 0x10; ch->ioctrl = ch->iostart + 0x10;
ch->timer_bit = 0; ch->timer_bit = 0;
/* Enable the clock supply to the channel */
value = ioread32(cmt->mapbase + CMCLKE);
value |= BIT(hwidx);
iowrite32(value, cmt->mapbase + CMCLKE);
break; break;
} }
...@@ -1014,12 +1022,10 @@ static int sh_cmt_setup(struct sh_cmt_device *cmt, struct platform_device *pdev) ...@@ -1014,12 +1022,10 @@ static int sh_cmt_setup(struct sh_cmt_device *cmt, struct platform_device *pdev)
else else
cmt->rate = clk_get_rate(cmt->clk) / 8; cmt->rate = clk_get_rate(cmt->clk) / 8;
clk_disable(cmt->clk);
/* Map the memory resource(s). */ /* Map the memory resource(s). */
ret = sh_cmt_map_memory(cmt); ret = sh_cmt_map_memory(cmt);
if (ret < 0) if (ret < 0)
goto err_clk_unprepare; goto err_clk_disable;
/* Allocate and setup the channels. */ /* Allocate and setup the channels. */
cmt->num_channels = hweight8(cmt->hw_channels); cmt->num_channels = hweight8(cmt->hw_channels);
...@@ -1047,6 +1053,8 @@ static int sh_cmt_setup(struct sh_cmt_device *cmt, struct platform_device *pdev) ...@@ -1047,6 +1053,8 @@ static int sh_cmt_setup(struct sh_cmt_device *cmt, struct platform_device *pdev)
mask &= ~(1 << hwidx); mask &= ~(1 << hwidx);
} }
clk_disable(cmt->clk);
platform_set_drvdata(pdev, cmt); platform_set_drvdata(pdev, cmt);
return 0; return 0;
...@@ -1054,6 +1062,8 @@ static int sh_cmt_setup(struct sh_cmt_device *cmt, struct platform_device *pdev) ...@@ -1054,6 +1062,8 @@ static int sh_cmt_setup(struct sh_cmt_device *cmt, struct platform_device *pdev)
err_unmap: err_unmap:
kfree(cmt->channels); kfree(cmt->channels);
iounmap(cmt->mapbase); iounmap(cmt->mapbase);
err_clk_disable:
clk_disable(cmt->clk);
err_clk_unprepare: err_clk_unprepare:
clk_unprepare(cmt->clk); clk_unprepare(cmt->clk);
err_clk_put: err_clk_put:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment