2 * This file is provided under a dual BSD/GPLv2 license. When using or
3 * redistributing this file, you may do so under either license.
7 * Copyright (c) 2016 BayLibre, SAS.
8 * Author: Neil Armstrong <narmstrong@baylibre.com>
9 * Copyright (C) 2014 Amlogic, Inc.
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of version 2 of the GNU General Public License as
13 * published by the Free Software Foundation.
15 * This program is distributed in the hope that it will be useful, but
16 * WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 * General Public License for more details.
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, see <http://www.gnu.org/licenses/>.
22 * The full GNU General Public License is included in this distribution
23 * in the file called COPYING.
27 * Copyright (c) 2016 BayLibre, SAS.
28 * Author: Neil Armstrong <narmstrong@baylibre.com>
29 * Copyright (C) 2014 Amlogic, Inc.
31 * Redistribution and use in source and binary forms, with or without
32 * modification, are permitted provided that the following conditions
35 * * Redistributions of source code must retain the above copyright
36 * notice, this list of conditions and the following disclaimer.
37 * * Redistributions in binary form must reproduce the above copyright
38 * notice, this list of conditions and the following disclaimer in
39 * the documentation and/or other materials provided with the
41 * * Neither the name of Intel Corporation nor the names of its
42 * contributors may be used to endorse or promote products derived
43 * from this software without specific prior written permission.
45 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
46 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
47 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
48 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
49 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
50 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
51 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
52 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
53 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
54 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
55 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
58 #include <linux/clk.h>
59 #include <linux/clk-provider.h>
60 #include <linux/err.h>
62 #include <linux/kernel.h>
63 #include <linux/module.h>
65 #include <linux/of_device.h>
66 #include <linux/platform_device.h>
67 #include <linux/pwm.h>
68 #include <linux/slab.h>
69 #include <linux/spinlock.h>
73 #define PWM_HIGH_SHIFT 16
75 #define REG_MISC_AB 0x8
76 #define MISC_B_CLK_EN BIT(23)
77 #define MISC_A_CLK_EN BIT(15)
78 #define MISC_CLK_DIV_MASK 0x7f
79 #define MISC_B_CLK_DIV_SHIFT 16
80 #define MISC_A_CLK_DIV_SHIFT 8
81 #define MISC_B_CLK_SEL_SHIFT 6
82 #define MISC_A_CLK_SEL_SHIFT 4
83 #define MISC_CLK_SEL_WIDTH 2
84 #define MISC_B_EN BIT(1)
85 #define MISC_A_EN BIT(0)
87 static const unsigned int mux_reg_shifts
[] = {
92 struct meson_pwm_channel
{
97 struct pwm_state state
;
99 struct clk
*clk_parent
;
104 struct meson_pwm_data
{
105 const char * const *parent_names
;
106 unsigned int num_parents
;
110 struct pwm_chip chip
;
111 const struct meson_pwm_data
*data
;
115 * Protects register (write) access to the REG_MISC_AB register
116 * that is shared between the two PWMs.
121 static inline struct meson_pwm
*to_meson_pwm(struct pwm_chip
*chip
)
123 return container_of(chip
, struct meson_pwm
, chip
);
126 static int meson_pwm_request(struct pwm_chip
*chip
, struct pwm_device
*pwm
)
128 struct meson_pwm_channel
*channel
= pwm_get_chip_data(pwm
);
129 struct device
*dev
= chip
->dev
;
135 if (channel
->clk_parent
) {
136 err
= clk_set_parent(channel
->clk
, channel
->clk_parent
);
138 dev_err(dev
, "failed to set parent %s for %s: %d\n",
139 __clk_get_name(channel
->clk_parent
),
140 __clk_get_name(channel
->clk
), err
);
145 err
= clk_prepare_enable(channel
->clk
);
147 dev_err(dev
, "failed to enable clock %s: %d\n",
148 __clk_get_name(channel
->clk
), err
);
152 chip
->ops
->get_state(chip
, pwm
, &channel
->state
);
157 static void meson_pwm_free(struct pwm_chip
*chip
, struct pwm_device
*pwm
)
159 struct meson_pwm_channel
*channel
= pwm_get_chip_data(pwm
);
162 clk_disable_unprepare(channel
->clk
);
165 static int meson_pwm_calc(struct meson_pwm
*meson
,
166 struct meson_pwm_channel
*channel
, unsigned int id
,
167 unsigned int duty
, unsigned int period
)
169 unsigned int pre_div
, cnt
, duty_cnt
;
170 unsigned long fin_freq
= -1;
173 if (~(meson
->inverter_mask
>> id
) & 0x1)
174 duty
= period
- duty
;
176 if (period
== channel
->state
.period
&&
177 duty
== channel
->state
.duty_cycle
)
180 fin_freq
= clk_get_rate(channel
->clk
);
182 dev_err(meson
->chip
.dev
, "invalid source clock frequency\n");
186 dev_dbg(meson
->chip
.dev
, "fin_freq: %lu Hz\n", fin_freq
);
187 fin_ps
= (u64
)NSEC_PER_SEC
* 1000;
188 do_div(fin_ps
, fin_freq
);
190 /* Calc pre_div with the period */
191 for (pre_div
= 0; pre_div
<= MISC_CLK_DIV_MASK
; pre_div
++) {
192 cnt
= DIV_ROUND_CLOSEST_ULL((u64
)period
* 1000,
193 fin_ps
* (pre_div
+ 1));
194 dev_dbg(meson
->chip
.dev
, "fin_ps=%llu pre_div=%u cnt=%u\n",
195 fin_ps
, pre_div
, cnt
);
200 if (pre_div
> MISC_CLK_DIV_MASK
) {
201 dev_err(meson
->chip
.dev
, "unable to get period pre_div\n");
205 dev_dbg(meson
->chip
.dev
, "period=%u pre_div=%u cnt=%u\n", period
,
208 if (duty
== period
) {
209 channel
->pre_div
= pre_div
;
212 } else if (duty
== 0) {
213 channel
->pre_div
= pre_div
;
217 /* Then check is we can have the duty with the same pre_div */
218 duty_cnt
= DIV_ROUND_CLOSEST_ULL((u64
)duty
* 1000,
219 fin_ps
* (pre_div
+ 1));
220 if (duty_cnt
> 0xffff) {
221 dev_err(meson
->chip
.dev
, "unable to get duty cycle\n");
225 dev_dbg(meson
->chip
.dev
, "duty=%u pre_div=%u duty_cnt=%u\n",
226 duty
, pre_div
, duty_cnt
);
228 channel
->pre_div
= pre_div
;
229 channel
->hi
= duty_cnt
;
230 channel
->lo
= cnt
- duty_cnt
;
236 static void meson_pwm_enable(struct meson_pwm
*meson
,
237 struct meson_pwm_channel
*channel
,
240 u32 value
, clk_shift
, clk_enable
, enable
;
246 clk_shift
= MISC_A_CLK_DIV_SHIFT
;
247 clk_enable
= MISC_A_CLK_EN
;
253 clk_shift
= MISC_B_CLK_DIV_SHIFT
;
254 clk_enable
= MISC_B_CLK_EN
;
263 spin_lock_irqsave(&meson
->lock
, flags
);
265 value
= readl(meson
->base
+ REG_MISC_AB
);
266 value
&= ~(MISC_CLK_DIV_MASK
<< clk_shift
);
267 value
|= channel
->pre_div
<< clk_shift
;
269 writel(value
, meson
->base
+ REG_MISC_AB
);
271 value
= (channel
->hi
<< PWM_HIGH_SHIFT
) | channel
->lo
;
272 writel(value
, meson
->base
+ offset
);
274 value
= readl(meson
->base
+ REG_MISC_AB
);
276 writel(value
, meson
->base
+ REG_MISC_AB
);
278 spin_unlock_irqrestore(&meson
->lock
, flags
);
281 static void meson_pwm_disable(struct meson_pwm
*meson
, unsigned int id
)
299 spin_lock_irqsave(&meson
->lock
, flags
);
301 value
= readl(meson
->base
+ REG_MISC_AB
);
303 writel(value
, meson
->base
+ REG_MISC_AB
);
305 spin_unlock_irqrestore(&meson
->lock
, flags
);
308 static int meson_pwm_apply(struct pwm_chip
*chip
, struct pwm_device
*pwm
,
309 struct pwm_state
*state
)
311 struct meson_pwm_channel
*channel
= pwm_get_chip_data(pwm
);
312 struct meson_pwm
*meson
= to_meson_pwm(chip
);
318 if (!state
->enabled
) {
319 meson_pwm_disable(meson
, pwm
->hwpwm
);
320 channel
->state
.enabled
= false;
325 if (state
->period
!= channel
->state
.period
||
326 state
->duty_cycle
!= channel
->state
.duty_cycle
||
327 state
->polarity
!= channel
->state
.polarity
) {
328 if (state
->polarity
!= channel
->state
.polarity
) {
329 if (state
->polarity
== PWM_POLARITY_NORMAL
)
330 meson
->inverter_mask
|= BIT(pwm
->hwpwm
);
332 meson
->inverter_mask
&= ~BIT(pwm
->hwpwm
);
335 err
= meson_pwm_calc(meson
, channel
, pwm
->hwpwm
,
336 state
->duty_cycle
, state
->period
);
340 channel
->state
.polarity
= state
->polarity
;
341 channel
->state
.period
= state
->period
;
342 channel
->state
.duty_cycle
= state
->duty_cycle
;
345 if (state
->enabled
&& !channel
->state
.enabled
) {
346 meson_pwm_enable(meson
, channel
, pwm
->hwpwm
);
347 channel
->state
.enabled
= true;
353 static void meson_pwm_get_state(struct pwm_chip
*chip
, struct pwm_device
*pwm
,
354 struct pwm_state
*state
)
356 struct meson_pwm
*meson
= to_meson_pwm(chip
);
362 switch (pwm
->hwpwm
) {
375 value
= readl(meson
->base
+ REG_MISC_AB
);
376 state
->enabled
= (value
& mask
) != 0;
379 static const struct pwm_ops meson_pwm_ops
= {
380 .request
= meson_pwm_request
,
381 .free
= meson_pwm_free
,
382 .apply
= meson_pwm_apply
,
383 .get_state
= meson_pwm_get_state
,
384 .owner
= THIS_MODULE
,
387 static const char * const pwm_meson8b_parent_names
[] = {
388 "xtal", "vid_pll", "fclk_div4", "fclk_div3"
391 static const struct meson_pwm_data pwm_meson8b_data
= {
392 .parent_names
= pwm_meson8b_parent_names
,
393 .num_parents
= ARRAY_SIZE(pwm_meson8b_parent_names
),
396 static const char * const pwm_gxbb_parent_names
[] = {
397 "xtal", "hdmi_pll", "fclk_div4", "fclk_div3"
400 static const struct meson_pwm_data pwm_gxbb_data
= {
401 .parent_names
= pwm_gxbb_parent_names
,
402 .num_parents
= ARRAY_SIZE(pwm_gxbb_parent_names
),
406 * Only the 2 first inputs of the GXBB AO PWMs are valid
407 * The last 2 are grounded
409 static const char * const pwm_gxbb_ao_parent_names
[] = {
413 static const struct meson_pwm_data pwm_gxbb_ao_data
= {
414 .parent_names
= pwm_gxbb_ao_parent_names
,
415 .num_parents
= ARRAY_SIZE(pwm_gxbb_ao_parent_names
),
418 static const char * const pwm_axg_ee_parent_names
[] = {
419 "xtal", "fclk_div5", "fclk_div4", "fclk_div3"
422 static const struct meson_pwm_data pwm_axg_ee_data
= {
423 .parent_names
= pwm_axg_ee_parent_names
,
424 .num_parents
= ARRAY_SIZE(pwm_axg_ee_parent_names
),
427 static const char * const pwm_axg_ao_parent_names
[] = {
428 "aoclk81", "xtal", "fclk_div4", "fclk_div5"
431 static const struct meson_pwm_data pwm_axg_ao_data
= {
432 .parent_names
= pwm_axg_ao_parent_names
,
433 .num_parents
= ARRAY_SIZE(pwm_axg_ao_parent_names
),
436 static const struct of_device_id meson_pwm_matches
[] = {
438 .compatible
= "amlogic,meson8b-pwm",
439 .data
= &pwm_meson8b_data
442 .compatible
= "amlogic,meson-gxbb-pwm",
443 .data
= &pwm_gxbb_data
446 .compatible
= "amlogic,meson-gxbb-ao-pwm",
447 .data
= &pwm_gxbb_ao_data
450 .compatible
= "amlogic,meson-axg-ee-pwm",
451 .data
= &pwm_axg_ee_data
454 .compatible
= "amlogic,meson-axg-ao-pwm",
455 .data
= &pwm_axg_ao_data
459 MODULE_DEVICE_TABLE(of
, meson_pwm_matches
);
461 static int meson_pwm_init_channels(struct meson_pwm
*meson
,
462 struct meson_pwm_channel
*channels
)
464 struct device
*dev
= meson
->chip
.dev
;
465 struct clk_init_data init
;
470 for (i
= 0; i
< meson
->chip
.npwm
; i
++) {
471 struct meson_pwm_channel
*channel
= &channels
[i
];
473 snprintf(name
, sizeof(name
), "%s#mux%u", dev_name(dev
), i
);
476 init
.ops
= &clk_mux_ops
;
477 init
.flags
= CLK_IS_BASIC
;
478 init
.parent_names
= meson
->data
->parent_names
;
479 init
.num_parents
= meson
->data
->num_parents
;
481 channel
->mux
.reg
= meson
->base
+ REG_MISC_AB
;
482 channel
->mux
.shift
= mux_reg_shifts
[i
];
483 channel
->mux
.mask
= BIT(MISC_CLK_SEL_WIDTH
) - 1;
484 channel
->mux
.flags
= 0;
485 channel
->mux
.lock
= &meson
->lock
;
486 channel
->mux
.table
= NULL
;
487 channel
->mux
.hw
.init
= &init
;
489 channel
->clk
= devm_clk_register(dev
, &channel
->mux
.hw
);
490 if (IS_ERR(channel
->clk
)) {
491 err
= PTR_ERR(channel
->clk
);
492 dev_err(dev
, "failed to register %s: %d\n", name
, err
);
496 snprintf(name
, sizeof(name
), "clkin%u", i
);
498 channel
->clk_parent
= devm_clk_get(dev
, name
);
499 if (IS_ERR(channel
->clk_parent
)) {
500 err
= PTR_ERR(channel
->clk_parent
);
501 if (err
== -EPROBE_DEFER
)
504 channel
->clk_parent
= NULL
;
511 static void meson_pwm_add_channels(struct meson_pwm
*meson
,
512 struct meson_pwm_channel
*channels
)
516 for (i
= 0; i
< meson
->chip
.npwm
; i
++)
517 pwm_set_chip_data(&meson
->chip
.pwms
[i
], &channels
[i
]);
520 static int meson_pwm_probe(struct platform_device
*pdev
)
522 struct meson_pwm_channel
*channels
;
523 struct meson_pwm
*meson
;
524 struct resource
*regs
;
527 meson
= devm_kzalloc(&pdev
->dev
, sizeof(*meson
), GFP_KERNEL
);
531 regs
= platform_get_resource(pdev
, IORESOURCE_MEM
, 0);
532 meson
->base
= devm_ioremap_resource(&pdev
->dev
, regs
);
533 if (IS_ERR(meson
->base
))
534 return PTR_ERR(meson
->base
);
536 spin_lock_init(&meson
->lock
);
537 meson
->chip
.dev
= &pdev
->dev
;
538 meson
->chip
.ops
= &meson_pwm_ops
;
539 meson
->chip
.base
= -1;
540 meson
->chip
.npwm
= 2;
541 meson
->chip
.of_xlate
= of_pwm_xlate_with_flags
;
542 meson
->chip
.of_pwm_n_cells
= 3;
544 meson
->data
= of_device_get_match_data(&pdev
->dev
);
545 meson
->inverter_mask
= BIT(meson
->chip
.npwm
) - 1;
547 channels
= devm_kcalloc(&pdev
->dev
, meson
->chip
.npwm
,
548 sizeof(*channels
), GFP_KERNEL
);
552 err
= meson_pwm_init_channels(meson
, channels
);
556 err
= pwmchip_add(&meson
->chip
);
558 dev_err(&pdev
->dev
, "failed to register PWM chip: %d\n", err
);
562 meson_pwm_add_channels(meson
, channels
);
564 platform_set_drvdata(pdev
, meson
);
569 static int meson_pwm_remove(struct platform_device
*pdev
)
571 struct meson_pwm
*meson
= platform_get_drvdata(pdev
);
573 return pwmchip_remove(&meson
->chip
);
576 static struct platform_driver meson_pwm_driver
= {
579 .of_match_table
= meson_pwm_matches
,
581 .probe
= meson_pwm_probe
,
582 .remove
= meson_pwm_remove
,
584 module_platform_driver(meson_pwm_driver
);
586 MODULE_DESCRIPTION("Amlogic Meson PWM Generator driver");
587 MODULE_AUTHOR("Neil Armstrong <narmstrong@baylibre.com>");
588 MODULE_LICENSE("Dual BSD/GPL");