blob: 3aafa9eeeb99d7329a0405c0d8045671216612c2 [file] [log] [blame]
Angel Pons16c851f2020-04-05 13:21:38 +02001/* SPDX-License-Identifier: GPL-2.0-only */
Eric Gao61e6c442016-07-29 12:34:32 +08002
Kyösti Mälkki13f66502019-03-03 08:01:05 +02003#include <device/mmio.h>
Eric Gao61e6c442016-07-29 12:34:32 +08004#include <assert.h>
5#include <boardid.h>
6#include <console/console.h>
Julius Werner7feb86b2016-09-02 11:25:56 -07007#include <gpio.h>
Eric Gao61e6c442016-07-29 12:34:32 +08008#include <soc/grf.h>
9#include <soc/pwm.h>
10
11#include "pwm_regulator.h"
12
13/*
14 * Apparently a period of 3333 is determined by EEs to be ideal for our
15 * board design / resistors / capacitors / regulators but due to
16 * clock dividers we actually get 3337.
17 */
Caesar Wang8c454aa2017-01-04 18:26:04 +080018#define PWM_PERIOD 3337
19#define PWM_DESIGN_VOLTAGE_MIN_OUTDATED 8000
20#define PWM_DESIGN_VOLTAGE_MAX_OUTDATED 15000
Eric Gao61e6c442016-07-29 12:34:32 +080021
Lin Huangc93d79b2017-07-31 15:12:15 +080022/* Applies for Kevin rev6+ */
Caesar Wang8c454aa2017-01-04 18:26:04 +080023int kevin6_pwm_design_voltage[][2] = {
Julius Wernerf52288f2016-09-01 11:50:18 -070024 [PWM_REGULATOR_GPU] = {7858, 12177},
25 [PWM_REGULATOR_BIG] = {7987, 13022},
26 [PWM_REGULATOR_LIT] = {7991, 13037},
27 [PWM_REGULATOR_CENTERLOG] = {8001, 10497}
Eric Gao61e6c442016-07-29 12:34:32 +080028};
29
Philip Chena0618202017-08-23 18:02:25 -070030/* Applies for Gru rev2+, Bob, and Nefario. */
Caesar Wang8c454aa2017-01-04 18:26:04 +080031int pwm_design_voltage[][2] = {
32 [PWM_REGULATOR_GPU] = {7864, 12177},
33 [PWM_REGULATOR_BIG] = {8001, 13022},
34 [PWM_REGULATOR_LIT] = {7977, 13078},
35 [PWM_REGULATOR_CENTERLOG] = {7994, 10499}
36};
37
Ege Mihmanli75b15432017-11-15 17:19:58 -080038/* Applies for Scarlet-based boards. */
Lin Huangc93d79b2017-07-31 15:12:15 +080039int scarlet_pwm_design_voltage[][2] = {
40 [PWM_REGULATOR_GPU] = {7996, 10990},
41 [PWM_REGULATOR_BIG] = {8000, 12992},
42 [PWM_REGULATOR_LIT] = {8021, 11996},
43};
44
Julius Werner6486e782017-07-14 14:30:29 -070045int pwm_enum_to_pwm_number[] = {
46 [PWM_REGULATOR_GPU] = 0,
47 [PWM_REGULATOR_LIT] = 2,
Julius Wernercd49cce2019-03-05 16:53:33 -080048#if CONFIG(GRU_HAS_CENTERLOG_PWM)
Philip Chena0618202017-08-23 18:02:25 -070049 [PWM_REGULATOR_CENTERLOG] = 3,
50#else
51 [PWM_REGULATOR_CENTERLOG] = -1,
52#endif
Julius Wernercd49cce2019-03-05 16:53:33 -080053#if CONFIG(GRU_BASEBOARD_SCARLET)
Julius Werner6486e782017-07-14 14:30:29 -070054 [PWM_REGULATOR_BIG] = 3,
Julius Werner6486e782017-07-14 14:30:29 -070055#else
56 [PWM_REGULATOR_BIG] = 1,
Julius Werner6486e782017-07-14 14:30:29 -070057#endif
58};
59
Eric Gao61e6c442016-07-29 12:34:32 +080060void pwm_regulator_configure(enum pwm_regulator pwm, int millivolt)
61{
62 int duty_ns, voltage_max, voltage_min;
Martin Roth50863da2021-10-01 14:37:30 -060063 int voltage = millivolt * 10; /* for higher calculation accuracy */
Julius Werner6486e782017-07-14 14:30:29 -070064 int pwm_number = pwm_enum_to_pwm_number[pwm];
Eric Gao61e6c442016-07-29 12:34:32 +080065
Caesar Wang8c454aa2017-01-04 18:26:04 +080066 voltage_min = pwm_design_voltage[pwm][0];
67 voltage_max = pwm_design_voltage[pwm][1];
Julius Wernercd49cce2019-03-05 16:53:33 -080068 if ((CONFIG(BOARD_GOOGLE_KEVIN) && board_id() < 6) ||
69 (CONFIG(BOARD_GOOGLE_GRU) && board_id() < 2)) {
Caesar Wang8c454aa2017-01-04 18:26:04 +080070 voltage_min = PWM_DESIGN_VOLTAGE_MIN_OUTDATED;
71 voltage_max = PWM_DESIGN_VOLTAGE_MAX_OUTDATED;
Julius Wernercd49cce2019-03-05 16:53:33 -080072 } else if (CONFIG(BOARD_GOOGLE_KEVIN) && board_id() >= 6) {
Caesar Wang8c454aa2017-01-04 18:26:04 +080073 voltage_min = kevin6_pwm_design_voltage[pwm][0];
74 voltage_max = kevin6_pwm_design_voltage[pwm][1];
Julius Wernercd49cce2019-03-05 16:53:33 -080075 } else if (CONFIG(GRU_BASEBOARD_SCARLET)) {
Lin Huangc93d79b2017-07-31 15:12:15 +080076 voltage_min = scarlet_pwm_design_voltage[pwm][0];
77 voltage_max = scarlet_pwm_design_voltage[pwm][1];
Eric Gao61e6c442016-07-29 12:34:32 +080078 }
79
80 assert(voltage <= voltage_max && voltage >= voltage_min);
81
82 /*
83 * Intentionally round down (higher volt) to be safe.
84 * eg, for the default min & max design voltage:
85 * period = 3337, volt = 1.1: 1906
86 * period = 3337, volt = 1.0: 2383
87 * period = 3337, volt = 0.9: 2860
88 */
89 duty_ns = PWM_PERIOD * (voltage_max - voltage)
90 / (voltage_max - voltage_min);
91
Julius Werner6486e782017-07-14 14:30:29 -070092 pwm_init(pwm_number, PWM_PERIOD, duty_ns);
Douglas Anderson1eb69b42016-09-06 13:51:03 -070093
Julius Werner6486e782017-07-14 14:30:29 -070094 switch (pwm_number) {
95 case 0:
Julius Werner7feb86b2016-09-02 11:25:56 -070096 gpio_input(GPIO(4, C, 2)); /* PWM0 remove pull-down */
Douglas Anderson1eb69b42016-09-06 13:51:03 -070097 write32(&rk3399_grf->iomux_pwm_0, IOMUX_PWM_0);
98 break;
Julius Werner6486e782017-07-14 14:30:29 -070099 case 1:
Julius Werner7feb86b2016-09-02 11:25:56 -0700100 gpio_input(GPIO(4, C, 6)); /* PWM1 remove pull-down */
Douglas Anderson1eb69b42016-09-06 13:51:03 -0700101 write32(&rk3399_grf->iomux_pwm_1, IOMUX_PWM_1);
102 break;
Julius Werner6486e782017-07-14 14:30:29 -0700103 case 2:
Julius Werner7feb86b2016-09-02 11:25:56 -0700104 gpio_input(GPIO(1, C, 3)); /* PWM2 remove pull-down */
Douglas Anderson1eb69b42016-09-06 13:51:03 -0700105 write32(&rk3399_pmugrf->iomux_pwm_2, IOMUX_PWM_2);
106 break;
Julius Werner6486e782017-07-14 14:30:29 -0700107 case 3:
Julius Werner7feb86b2016-09-02 11:25:56 -0700108 gpio_input(GPIO(0, A, 6)); /* PWM3 remove pull-down */
Douglas Anderson1eb69b42016-09-06 13:51:03 -0700109 write32(&rk3399_pmugrf->iomux_pwm_3a, IOMUX_PWM_3_A);
110 break;
Julius Werner6486e782017-07-14 14:30:29 -0700111 default:
112 die("incorrect board configuration");
Douglas Anderson1eb69b42016-09-06 13:51:03 -0700113 }
Eric Gao61e6c442016-07-29 12:34:32 +0800114}