2 * This file is part of the coreboot project.
4 * Copyright 2014 Rockchip Inc.
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; version 2 of the License.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
18 #include <console/console.h>
20 #include <soc/addressmap.h>
24 #include <soc/clock.h>
35 struct rk3288_pwm_regs
{
36 struct pwm_ctl pwm
[4];
40 check_member(rk3288_pwm_regs
, int_en
, 0x44);
42 #define RK_PWM_DISABLE (0 << 0)
43 #define RK_PWM_ENABLE (1 << 0)
46 #define PWM_ONE_SHOT (0 << 1)
47 #define PWM_CONTINUOUS (1 << 1)
48 #define RK_PWM_CAPTURE (1 << 2)
50 #define PWM_DUTY_POSTIVE (1 << 3)
51 #define PWM_DUTY_NEGATIVE (0 << 3)
53 #define PWM_INACTIVE_POSTIVE (1 << 4)
54 #define PWM_INACTIVE_NEGATIVE (0 << 4)
56 #define PWM_OUTPUT_LEFT (0 << 5)
57 #define PWM_OUTPUT_CENTER (1 << 5)
59 #define PWM_LP_ENABLE (1 << 8)
60 #define PWM_LP_DISABLE (0 << 8)
62 #define PWM_SEL_SCALE_CLK (1 << 9)
63 #define PWM_SEL_SRC_CLK (0 << 9)
65 struct rk3288_pwm_regs
*rk3288_pwm
= (void *)RK_PWM0123_BASE
;
67 void pwm_init(u32 id
, u32 period_ns
, u32 duty_ns
)
69 unsigned long period
, duty
;
72 write32(&rk3288_grf
->soc_con2
, RK_SETBITS(1 << 0));
74 write32(&rk3288_pwm
->pwm
[id
].pwm_ctrl
, PWM_SEL_SRC_CLK
|
75 PWM_OUTPUT_LEFT
| PWM_LP_DISABLE
| PWM_CONTINUOUS
|
76 PWM_DUTY_POSTIVE
| PWM_INACTIVE_POSTIVE
| RK_PWM_DISABLE
);
78 period
= (PD_BUS_PCLK_HZ
/ 1000) * period_ns
/ USECS_PER_SEC
;
79 duty
= (PD_BUS_PCLK_HZ
/ 1000) * duty_ns
/ USECS_PER_SEC
;
81 write32(&rk3288_pwm
->pwm
[id
].pwm_period_hpr
, period
);
82 write32(&rk3288_pwm
->pwm
[id
].pwm_duty_lpr
, duty
);
83 setbits_le32(&rk3288_pwm
->pwm
[id
].pwm_ctrl
, RK_PWM_ENABLE
);