diff options
author | Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com> | 2014-03-04 08:17:26 -0500 |
---|---|---|
committer | Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com> | 2014-04-16 06:03:29 -0400 |
commit | d2b93177065fd8e1e18f4f42880326e0881ff457 (patch) | |
tree | e854d4f160f262dfd12b8f343381e2622f5d5103 /drivers/clocksource | |
parent | da90a1c67751a412499a9f5698c3bf0bf80f65a6 (diff) |
clocksource: sh_mtu2: Add index to struct sh_mtu2_channel
Use the index as the timer start/stop bit and when printing messages to
identify the channel.
Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
Tested-by: Wolfram Sang <wsa@sang-engineering.com>
Diffstat (limited to 'drivers/clocksource')
-rw-r--r-- | drivers/clocksource/sh_mtu2.c | 22 |
1 files changed, 13 insertions, 9 deletions
diff --git a/drivers/clocksource/sh_mtu2.c b/drivers/clocksource/sh_mtu2.c index 97714ce5e851..61827c66f7d3 100644 --- a/drivers/clocksource/sh_mtu2.c +++ b/drivers/clocksource/sh_mtu2.c | |||
@@ -38,6 +38,7 @@ struct sh_mtu2_device; | |||
38 | 38 | ||
39 | struct sh_mtu2_channel { | 39 | struct sh_mtu2_channel { |
40 | struct sh_mtu2_device *mtu; | 40 | struct sh_mtu2_device *mtu; |
41 | unsigned int index; | ||
41 | 42 | ||
42 | void __iomem *base; | 43 | void __iomem *base; |
43 | int irq; | 44 | int irq; |
@@ -110,7 +111,6 @@ static inline void sh_mtu2_write(struct sh_mtu2_channel *ch, int reg_nr, | |||
110 | 111 | ||
111 | static void sh_mtu2_start_stop_ch(struct sh_mtu2_channel *ch, int start) | 112 | static void sh_mtu2_start_stop_ch(struct sh_mtu2_channel *ch, int start) |
112 | { | 113 | { |
113 | struct sh_timer_config *cfg = ch->mtu->pdev->dev.platform_data; | ||
114 | unsigned long flags, value; | 114 | unsigned long flags, value; |
115 | 115 | ||
116 | /* start stop register shared by multiple timer channels */ | 116 | /* start stop register shared by multiple timer channels */ |
@@ -118,9 +118,9 @@ static void sh_mtu2_start_stop_ch(struct sh_mtu2_channel *ch, int start) | |||
118 | value = sh_mtu2_read(ch, TSTR); | 118 | value = sh_mtu2_read(ch, TSTR); |
119 | 119 | ||
120 | if (start) | 120 | if (start) |
121 | value |= 1 << cfg->timer_bit; | 121 | value |= 1 << ch->index; |
122 | else | 122 | else |
123 | value &= ~(1 << cfg->timer_bit); | 123 | value &= ~(1 << ch->index); |
124 | 124 | ||
125 | sh_mtu2_write(ch, TSTR, value); | 125 | sh_mtu2_write(ch, TSTR, value); |
126 | raw_spin_unlock_irqrestore(&sh_mtu2_lock, flags); | 126 | raw_spin_unlock_irqrestore(&sh_mtu2_lock, flags); |
@@ -138,7 +138,8 @@ static int sh_mtu2_enable(struct sh_mtu2_channel *ch) | |||
138 | /* enable clock */ | 138 | /* enable clock */ |
139 | ret = clk_enable(ch->mtu->clk); | 139 | ret = clk_enable(ch->mtu->clk); |
140 | if (ret) { | 140 | if (ret) { |
141 | dev_err(&ch->mtu->pdev->dev, "cannot enable clock\n"); | 141 | dev_err(&ch->mtu->pdev->dev, "ch%u: cannot enable clock\n", |
142 | ch->index); | ||
142 | return ret; | 143 | return ret; |
143 | } | 144 | } |
144 | 145 | ||
@@ -211,7 +212,7 @@ static void sh_mtu2_clock_event_mode(enum clock_event_mode mode, | |||
211 | switch (mode) { | 212 | switch (mode) { |
212 | case CLOCK_EVT_MODE_PERIODIC: | 213 | case CLOCK_EVT_MODE_PERIODIC: |
213 | dev_info(&ch->mtu->pdev->dev, | 214 | dev_info(&ch->mtu->pdev->dev, |
214 | "used for periodic clock events\n"); | 215 | "ch%u: used for periodic clock events\n", ch->index); |
215 | sh_mtu2_enable(ch); | 216 | sh_mtu2_enable(ch); |
216 | break; | 217 | break; |
217 | case CLOCK_EVT_MODE_UNUSED: | 218 | case CLOCK_EVT_MODE_UNUSED: |
@@ -250,15 +251,16 @@ static void sh_mtu2_register_clockevent(struct sh_mtu2_channel *ch, | |||
250 | ced->suspend = sh_mtu2_clock_event_suspend; | 251 | ced->suspend = sh_mtu2_clock_event_suspend; |
251 | ced->resume = sh_mtu2_clock_event_resume; | 252 | ced->resume = sh_mtu2_clock_event_resume; |
252 | 253 | ||
253 | dev_info(&ch->mtu->pdev->dev, "used for clock events\n"); | 254 | dev_info(&ch->mtu->pdev->dev, "ch%u: used for clock events\n", |
255 | ch->index); | ||
254 | clockevents_register_device(ced); | 256 | clockevents_register_device(ced); |
255 | 257 | ||
256 | ret = request_irq(ch->irq, sh_mtu2_interrupt, | 258 | ret = request_irq(ch->irq, sh_mtu2_interrupt, |
257 | IRQF_TIMER | IRQF_IRQPOLL | IRQF_NOBALANCING, | 259 | IRQF_TIMER | IRQF_IRQPOLL | IRQF_NOBALANCING, |
258 | dev_name(&ch->mtu->pdev->dev), ch); | 260 | dev_name(&ch->mtu->pdev->dev), ch); |
259 | if (ret) { | 261 | if (ret) { |
260 | dev_err(&ch->mtu->pdev->dev, "failed to request irq %d\n", | 262 | dev_err(&ch->mtu->pdev->dev, "ch%u: failed to request irq %d\n", |
261 | ch->irq); | 263 | ch->index, ch->irq); |
262 | return; | 264 | return; |
263 | } | 265 | } |
264 | } | 266 | } |
@@ -279,10 +281,12 @@ static int sh_mtu2_setup_channel(struct sh_mtu2_channel *ch, | |||
279 | 281 | ||
280 | memset(ch, 0, sizeof(*ch)); | 282 | memset(ch, 0, sizeof(*ch)); |
281 | ch->mtu = mtu; | 283 | ch->mtu = mtu; |
284 | ch->index = cfg->timer_bit; | ||
282 | 285 | ||
283 | ch->irq = platform_get_irq(mtu->pdev, 0); | 286 | ch->irq = platform_get_irq(mtu->pdev, 0); |
284 | if (ch->irq < 0) { | 287 | if (ch->irq < 0) { |
285 | dev_err(&mtu->pdev->dev, "failed to get irq\n"); | 288 | dev_err(&mtu->pdev->dev, "ch%u: failed to get irq\n", |
289 | ch->index); | ||
286 | return ch->irq; | 290 | return ch->irq; |
287 | } | 291 | } |
288 | 292 | ||