| Date: | 2010-05-10 13:07:06 (13 years 7 months ago) |
|---|---|
| Author: | Lars C. |
| Commit: | f1df893177d8441142c0460041c84575da60445e |
| Message: | pwm fixes. |
| Files: |
arch/mips/jz4740/pwm.c (4 diffs) arch/mips/jz4740/timer.c (1 diff) arch/mips/jz4740/timer.h (1 diff) |
Change Details
| arch/mips/jz4740/pwm.c | ||
|---|---|---|
| 83 | 83 | |
| 84 | 84 | jz_gpio_set_function(pwm->gpio, JZ_GPIO_FUNC_PWM); |
| 85 | 85 | |
| 86 | jz4740_timer_start(id); | |
| 87 | ||
| 86 | 88 | return pwm; |
| 87 | 89 | } |
| 88 | 90 | |
| ... | ... | |
| 94 | 96 | jz_gpio_set_function(pwm->gpio, JZ_GPIO_FUNC_NONE); |
| 95 | 97 | gpio_free(pwm->gpio); |
| 96 | 98 | |
| 99 | jz4740_timer_stop(pwm->id); | |
| 100 | ||
| 97 | 101 | pwm->used = false; |
| 102 | ||
| 98 | 103 | } |
| 99 | 104 | |
| 100 | 105 | int pwm_config(struct pwm_device *pwm, int duty_ns, int period_ns) |
| 101 | 106 | { |
| 102 | ||
| 103 | 107 | unsigned long long tmp; |
| 104 | 108 | unsigned long period, duty; |
| 105 | 109 | unsigned int prescaler = 0; |
| 106 | 110 | unsigned int id = pwm->id; |
| 107 | 111 | uint16_t ctrl; |
| 112 | bool is_enabled; | |
| 108 | 113 | |
| 109 | if (duty_ns > period_ns) | |
| 114 | if (duty_ns < 0 || duty_ns > period_ns) | |
| 110 | 115 | return -EINVAL; |
| 111 | 116 | |
| 112 | 117 | tmp = (unsigned long long)clk_get_rate(jz4740_pwm_clk) * period_ns; |
| ... | ... | |
| 128 | 133 | do_div(tmp, period_ns); |
| 129 | 134 | duty = tmp; |
| 130 | 135 | |
| 136 | if (duty >= period) | |
| 137 | duty = period - 1; | |
| 138 | ||
| 139 | is_enabled = jz4740_timer_is_enabled(id); | |
| 140 | jz4740_timer_disable(id); | |
| 141 | ||
| 142 | jz4740_timer_set_count(id, 0); | |
| 131 | 143 | jz4740_timer_set_duty(id, duty); |
| 132 | 144 | jz4740_timer_set_period(id, period); |
| 133 | 145 | |
| ... | ... | |
| 136 | 148 | |
| 137 | 149 | jz4740_timer_set_ctrl(id, ctrl); |
| 138 | 150 | |
| 151 | if (is_enabled) | |
| 152 | jz4740_timer_enable(id); | |
| 153 | ||
| 139 | 154 | return 0; |
| 140 | 155 | } |
| 141 | 156 | |
| arch/mips/jz4740/timer.c | ||
|---|---|---|
| 39 | 39 | |
| 40 | 40 | if (!jz4740_timer_base) |
| 41 | 41 | panic("Failed to ioremap timer registers"); |
| 42 | ||
| 43 | /* Disable all timers except those used as system timers */ | |
| 44 | writeb(0xfc, jz4740_timer_base + JZ_REG_TIMER_STOP_SET); | |
| 42 | 45 | } |
| arch/mips/jz4740/timer.h | ||
|---|---|---|
| 60 | 60 | extern void __iomem *jz4740_timer_base; |
| 61 | 61 | void __init jz4740_timer_init(void); |
| 62 | 62 | |
| 63 | static inline void jz4740_timer_enable(unsigned int timer) | |
| 63 | static inline void jz4740_timer_stop(unsigned int timer) | |
| 64 | { | |
| 65 | writel(BIT(timer), jz4740_timer_base + JZ_REG_TIMER_STOP_SET); | |
| 66 | } | |
| 67 | ||
| 68 | static inline void jz4740_timer_start(unsigned int timer) | |
| 64 | 69 | { |
| 65 | 70 | writel(BIT(timer), jz4740_timer_base + JZ_REG_TIMER_STOP_CLEAR); |
| 71 | } | |
| 72 | ||
| 73 | static inline bool jz4740_timer_is_enabled(unsigned int timer) | |
| 74 | { | |
| 75 | return readb(jz4740_timer_base + JZ_REG_TIMER_ENABLE) & BIT(timer); | |
| 76 | } | |
| 77 | ||
| 78 | static inline void jz4740_timer_enable(unsigned int timer) | |
| 79 | { | |
| 66 | 80 | writeb(BIT(timer), jz4740_timer_base + JZ_REG_TIMER_ENABLE_SET); |
| 67 | 81 | } |
| 68 | 82 | |
| 69 | 83 | static inline void jz4740_timer_disable(unsigned int timer) |
| 70 | 84 | { |
| 71 | 85 | writeb(BIT(timer), jz4740_timer_base + JZ_REG_TIMER_ENABLE_CLEAR); |
| 72 | writel(BIT(timer), jz4740_timer_base + JZ_REG_TIMER_STOP_SET); | |
| 73 | 86 | } |
| 74 | 87 | |
| 75 | 88 | |
Branches:
ben-wpan
ben-wpan-stefan
5396a9238205f20f811ea57898980d3ca82df0b6
jz-2.6.34
jz-2.6.34-rc5
jz-2.6.34-rc6
jz-2.6.34-rc7
jz-2.6.35
jz-2.6.36
jz-2.6.37
jz-2.6.38
jz-2.6.39
jz-3.0
jz-3.1
jz-3.11
jz-3.12
jz-3.13
jz-3.15
jz-3.16
jz-3.18-dt
jz-3.2
jz-3.3
jz-3.4
jz-3.5
jz-3.6
jz-3.6-rc2-pwm
jz-3.9
jz-3.9-clk
jz-3.9-rc8
jz47xx
jz47xx-2.6.38
master
Tags:
od-2011-09-04
od-2011-09-18
v2.6.34-rc5
v2.6.34-rc6
v2.6.34-rc7
v3.9
