2 * Marvell Berlin PWM driver
4 * Copyright (C) 2015 Marvell Technology Group Ltd.
6 * Author: Antoine Tenart <antoine.tenart@free-electrons.com>
8 * This file is licensed under the terms of the GNU General Public
9 * License version 2. This program is licensed "as is" without any
10 * warranty of any kind, whether express or implied.
13 #include <linux/clk.h>
15 #include <linux/kernel.h>
16 #include <linux/mod_devicetable.h>
17 #include <linux/module.h>
18 #include <linux/platform_device.h>
19 #include <linux/pwm.h>
20 #include <linux/slab.h>
22 #define BERLIN_PWM_EN 0x0
23 #define BERLIN_PWM_ENABLE BIT(0)
24 #define BERLIN_PWM_CONTROL 0x4
26 * The prescaler claims to support 8 different moduli, configured using the
27 * low three bits of PWM_CONTROL. (Sequentially, they are 1, 4, 8, 16, 64,
28 * 256, 1024, and 4096.) However, the moduli from 4 to 1024 appear to be
29 * implemented by internally shifting TCNT left without adding additional
30 * bits. So, the max TCNT that actually works for a modulus of 4 is 0x3fff;
31 * for 8, 0x1fff; and so on. This means that those moduli are entirely
32 * useless, as we could just do the shift ourselves. The 4096 modulus is
33 * implemented with a real prescaler, so we do use that, but we treat it
34 * as a flag instead of pretending the modulus is actually configurable.
36 #define BERLIN_PWM_PRESCALE_4096 0x7
37 #define BERLIN_PWM_INVERT_POLARITY BIT(3)
38 #define BERLIN_PWM_DUTY 0x8
39 #define BERLIN_PWM_TCNT 0xc
40 #define BERLIN_PWM_MAX_TCNT 65535
42 #define BERLIN_PWM_NUMPWMS 4
44 struct berlin_pwm_channel
{
51 struct berlin_pwm_chip
{
54 struct berlin_pwm_channel channel
[BERLIN_PWM_NUMPWMS
];
57 static inline struct berlin_pwm_chip
*to_berlin_pwm_chip(struct pwm_chip
*chip
)
59 return pwmchip_get_drvdata(chip
);
62 static inline u32
berlin_pwm_readl(struct berlin_pwm_chip
*bpc
,
63 unsigned int channel
, unsigned long offset
)
65 return readl_relaxed(bpc
->base
+ channel
* 0x10 + offset
);
68 static inline void berlin_pwm_writel(struct berlin_pwm_chip
*bpc
,
69 unsigned int channel
, u32 value
,
72 writel_relaxed(value
, bpc
->base
+ channel
* 0x10 + offset
);
75 static int berlin_pwm_config(struct pwm_chip
*chip
, struct pwm_device
*pwm
,
76 u64 duty_ns
, u64 period_ns
)
78 struct berlin_pwm_chip
*bpc
= to_berlin_pwm_chip(chip
);
79 bool prescale_4096
= false;
80 u32 value
, duty
, period
;
83 cycles
= clk_get_rate(bpc
->clk
);
85 do_div(cycles
, NSEC_PER_SEC
);
87 if (cycles
> BERLIN_PWM_MAX_TCNT
) {
89 cycles
>>= 12; // Prescaled by 4096
91 if (cycles
> BERLIN_PWM_MAX_TCNT
)
97 do_div(cycles
, period_ns
);
100 value
= berlin_pwm_readl(bpc
, pwm
->hwpwm
, BERLIN_PWM_CONTROL
);
102 value
|= BERLIN_PWM_PRESCALE_4096
;
104 value
&= ~BERLIN_PWM_PRESCALE_4096
;
105 berlin_pwm_writel(bpc
, pwm
->hwpwm
, value
, BERLIN_PWM_CONTROL
);
107 berlin_pwm_writel(bpc
, pwm
->hwpwm
, duty
, BERLIN_PWM_DUTY
);
108 berlin_pwm_writel(bpc
, pwm
->hwpwm
, period
, BERLIN_PWM_TCNT
);
113 static int berlin_pwm_set_polarity(struct pwm_chip
*chip
,
114 struct pwm_device
*pwm
,
115 enum pwm_polarity polarity
)
117 struct berlin_pwm_chip
*bpc
= to_berlin_pwm_chip(chip
);
120 value
= berlin_pwm_readl(bpc
, pwm
->hwpwm
, BERLIN_PWM_CONTROL
);
122 if (polarity
== PWM_POLARITY_NORMAL
)
123 value
&= ~BERLIN_PWM_INVERT_POLARITY
;
125 value
|= BERLIN_PWM_INVERT_POLARITY
;
127 berlin_pwm_writel(bpc
, pwm
->hwpwm
, value
, BERLIN_PWM_CONTROL
);
132 static int berlin_pwm_enable(struct pwm_chip
*chip
, struct pwm_device
*pwm
)
134 struct berlin_pwm_chip
*bpc
= to_berlin_pwm_chip(chip
);
137 value
= berlin_pwm_readl(bpc
, pwm
->hwpwm
, BERLIN_PWM_EN
);
138 value
|= BERLIN_PWM_ENABLE
;
139 berlin_pwm_writel(bpc
, pwm
->hwpwm
, value
, BERLIN_PWM_EN
);
144 static void berlin_pwm_disable(struct pwm_chip
*chip
,
145 struct pwm_device
*pwm
)
147 struct berlin_pwm_chip
*bpc
= to_berlin_pwm_chip(chip
);
150 value
= berlin_pwm_readl(bpc
, pwm
->hwpwm
, BERLIN_PWM_EN
);
151 value
&= ~BERLIN_PWM_ENABLE
;
152 berlin_pwm_writel(bpc
, pwm
->hwpwm
, value
, BERLIN_PWM_EN
);
155 static int berlin_pwm_apply(struct pwm_chip
*chip
, struct pwm_device
*pwm
,
156 const struct pwm_state
*state
)
159 bool enabled
= pwm
->state
.enabled
;
161 if (state
->polarity
!= pwm
->state
.polarity
) {
163 berlin_pwm_disable(chip
, pwm
);
167 err
= berlin_pwm_set_polarity(chip
, pwm
, state
->polarity
);
172 if (!state
->enabled
) {
174 berlin_pwm_disable(chip
, pwm
);
178 err
= berlin_pwm_config(chip
, pwm
, state
->duty_cycle
, state
->period
);
183 return berlin_pwm_enable(chip
, pwm
);
188 static const struct pwm_ops berlin_pwm_ops
= {
189 .apply
= berlin_pwm_apply
,
192 static const struct of_device_id berlin_pwm_match
[] = {
193 { .compatible
= "marvell,berlin-pwm" },
196 MODULE_DEVICE_TABLE(of
, berlin_pwm_match
);
198 static int berlin_pwm_probe(struct platform_device
*pdev
)
200 struct pwm_chip
*chip
;
201 struct berlin_pwm_chip
*bpc
;
204 chip
= devm_pwmchip_alloc(&pdev
->dev
, BERLIN_PWM_NUMPWMS
, sizeof(*bpc
));
206 return PTR_ERR(chip
);
207 bpc
= to_berlin_pwm_chip(chip
);
209 bpc
->base
= devm_platform_ioremap_resource(pdev
, 0);
210 if (IS_ERR(bpc
->base
))
211 return PTR_ERR(bpc
->base
);
213 bpc
->clk
= devm_clk_get_enabled(&pdev
->dev
, NULL
);
214 if (IS_ERR(bpc
->clk
))
215 return PTR_ERR(bpc
->clk
);
217 chip
->ops
= &berlin_pwm_ops
;
219 ret
= devm_pwmchip_add(&pdev
->dev
, chip
);
221 return dev_err_probe(&pdev
->dev
, ret
, "failed to add PWM chip\n");
223 platform_set_drvdata(pdev
, chip
);
228 static int berlin_pwm_suspend(struct device
*dev
)
230 struct pwm_chip
*chip
= dev_get_drvdata(dev
);
231 struct berlin_pwm_chip
*bpc
= to_berlin_pwm_chip(chip
);
234 for (i
= 0; i
< chip
->npwm
; i
++) {
235 struct berlin_pwm_channel
*channel
= &bpc
->channel
[i
];
237 channel
->enable
= berlin_pwm_readl(bpc
, i
, BERLIN_PWM_ENABLE
);
238 channel
->ctrl
= berlin_pwm_readl(bpc
, i
, BERLIN_PWM_CONTROL
);
239 channel
->duty
= berlin_pwm_readl(bpc
, i
, BERLIN_PWM_DUTY
);
240 channel
->tcnt
= berlin_pwm_readl(bpc
, i
, BERLIN_PWM_TCNT
);
243 clk_disable_unprepare(bpc
->clk
);
248 static int berlin_pwm_resume(struct device
*dev
)
250 struct pwm_chip
*chip
= dev_get_drvdata(dev
);
251 struct berlin_pwm_chip
*bpc
= to_berlin_pwm_chip(chip
);
255 ret
= clk_prepare_enable(bpc
->clk
);
259 for (i
= 0; i
< chip
->npwm
; i
++) {
260 struct berlin_pwm_channel
*channel
= &bpc
->channel
[i
];
262 berlin_pwm_writel(bpc
, i
, channel
->ctrl
, BERLIN_PWM_CONTROL
);
263 berlin_pwm_writel(bpc
, i
, channel
->duty
, BERLIN_PWM_DUTY
);
264 berlin_pwm_writel(bpc
, i
, channel
->tcnt
, BERLIN_PWM_TCNT
);
265 berlin_pwm_writel(bpc
, i
, channel
->enable
, BERLIN_PWM_ENABLE
);
271 static DEFINE_SIMPLE_DEV_PM_OPS(berlin_pwm_pm_ops
, berlin_pwm_suspend
,
274 static struct platform_driver berlin_pwm_driver
= {
275 .probe
= berlin_pwm_probe
,
277 .name
= "berlin-pwm",
278 .of_match_table
= berlin_pwm_match
,
279 .pm
= pm_ptr(&berlin_pwm_pm_ops
),
282 module_platform_driver(berlin_pwm_driver
);
284 MODULE_AUTHOR("Antoine Tenart <antoine.tenart@free-electrons.com>");
285 MODULE_DESCRIPTION("Marvell Berlin PWM driver");
286 MODULE_LICENSE("GPL v2");