2 * Copyright (c) 2014, Fuzhou Rockchip Electronics Co., Ltd
3 * Author: Chris Zhong<zyw@rock-chips.com>
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms and conditions of the GNU General Public License,
7 * version 2, as published by the Free Software Foundation.
9 * This program is distributed in the hope it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
16 #include <linux/clk.h>
18 #include <linux/kernel.h>
20 #include <linux/of_address.h>
21 #include <linux/regmap.h>
24 #include "embedded/rk3288_ddr.h"
25 #include "embedded/rk3288_resume.h"
27 void __iomem *rk3288_regulator_pwm_addr;
28 void __iomem *rk3288_ddr_ctrl_addr[RK3288_NUM_DDR_PORTS];
29 void __iomem *rk3288_phy_addr[RK3288_NUM_DDR_PORTS];
30 void __iomem *rk3288_msch_addr[RK3288_NUM_DDR_PORTS];
32 static const char * const rk3288_ddr_clk_names[] = {
39 #define NUM_DDR_CLK_NAMES ARRAY_SIZE(rk3288_ddr_clk_names)
41 static struct clk *rk3288_ddr_clks[NUM_DDR_CLK_NAMES];
43 static const u32 rk3288_pwm_reg[] = {
48 #define NUM_PWM_REGS ARRAY_SIZE(rk3288_pwm_reg)
50 static const u32 rk3288_ddr_phy_dll_reg[] = {
59 #define NUM_DDR_PHY_DLL_REGS ARRAY_SIZE(rk3288_ddr_phy_dll_reg)
61 static const u32 rk3288_ddr_ctrl_reg[] = {
102 DDR_PCTL_DFITCTRLDELAY,
105 DDR_PCTL_DFIODTRANKMAP,
106 DDR_PCTL_DFITPHYWRDATA,
107 DDR_PCTL_DFITPHYWRLAT,
108 DDR_PCTL_DFITRDDATAEN,
109 DDR_PCTL_DFITPHYRDLAT,
110 DDR_PCTL_DFITPHYUPDTYPE0,
111 DDR_PCTL_DFITPHYUPDTYPE1,
112 DDR_PCTL_DFITPHYUPDTYPE2,
113 DDR_PCTL_DFITPHYUPDTYPE3,
114 DDR_PCTL_DFITCTRLUPDMIN,
115 DDR_PCTL_DFITCTRLUPDMAX,
116 DDR_PCTL_DFITCTRLUPDDLY,
118 DDR_PCTL_DFITREFMSKI,
119 DDR_PCTL_DFITCTRLUPDI,
122 DDR_PCTL_DFITDRAMCLKEN,
123 DDR_PCTL_DFITDRAMCLKDIS,
127 #define NUM_DDR_CTRL_REGS ARRAY_SIZE(rk3288_ddr_ctrl_reg)
129 static const u32 rk3288_ddr_phy_reg[] = {
160 #define NUM_DDR_PHY_REGS ARRAY_SIZE(rk3288_ddr_phy_reg)
162 static const u32 rk3288_ddr_msch_reg[] = {
166 DDR_MSCH_READLATENCY,
170 #define NUM_DDR_MSCH_REGS ARRAY_SIZE(rk3288_ddr_msch_reg)
172 static const u32 rk3288_ddr_phy_zqcr_reg[] = {
176 #define NUM_DDR_PHY_ZQCR_REGS ARRAY_SIZE(rk3288_ddr_phy_zqcr_reg)
178 static void rk3288_ddr_reg_save(void __iomem *regbase, const u32 reg_list[],
179 int num_reg, u32 *vals)
183 for (i = 0; i < num_reg; i++)
184 vals[i] = readl_relaxed(regbase + reg_list[i]);
187 static void rk3288_ddr_save_offsets(u32 *dst_offsets, const u32 *src_offsets,
188 int num_offsets, int max_offsets)
190 memcpy(dst_offsets, src_offsets, sizeof(*dst_offsets) * num_offsets);
193 * Bytes are precious in the restore code, so we don't actually store
194 * a count. We just put a 0xffffffff if num >= max.
196 if (num_offsets < max_offsets)
197 dst_offsets[num_offsets] = RK3288_BOGUS_OFFSET;
200 int rk3288_ddr_suspend(struct rk3288_ddr_save_data *ddr_save)
205 for (i = 0; i < ARRAY_SIZE(rk3288_ddr_clk_names); i++) {
206 ret = clk_enable(rk3288_ddr_clks[i]);
208 pr_err("%s: Couldn't enable clock %s\n", __func__,
209 rk3288_ddr_clk_names[i]);
214 if (rk3288_regulator_pwm_addr)
215 rk3288_ddr_reg_save(rk3288_regulator_pwm_addr, rk3288_pwm_reg,
216 NUM_PWM_REGS, ddr_save->pwm_vals);
218 rk3288_ddr_reg_save(rk3288_ddr_ctrl_addr[0], rk3288_ddr_ctrl_reg,
219 NUM_DDR_CTRL_REGS, ddr_save->ctrl_vals);
221 /* TODO: need to support only one channel of DDR? */
222 for (i = 0; i < RK3288_NUM_DDR_PORTS; i++) {
223 rk3288_ddr_reg_save(rk3288_phy_addr[i], rk3288_ddr_phy_reg,
224 NUM_DDR_PHY_REGS, ddr_save->phy_vals[i]);
225 rk3288_ddr_reg_save(rk3288_phy_addr[i], rk3288_ddr_phy_dll_reg,
226 NUM_DDR_PHY_DLL_REGS,
227 ddr_save->phy_dll_vals[i]);
228 rk3288_ddr_reg_save(rk3288_msch_addr[i], rk3288_ddr_msch_reg,
229 NUM_DDR_MSCH_REGS, ddr_save->msch_vals[i]);
232 rk3288_ddr_reg_save(rk3288_phy_addr[0], rk3288_ddr_phy_zqcr_reg,
233 NUM_DDR_PHY_ZQCR_REGS, ddr_save->phy_zqcr_vals);
239 clk_disable(rk3288_ddr_clks[i - 1]);
244 void rk3288_ddr_resume(void)
248 for (i = NUM_DDR_CLK_NAMES; i > 0; i--)
249 clk_disable(rk3288_ddr_clks[i - 1]);
253 * rk3288_get_regulator_pwm_np - Get the PWM regulator node, if present
255 * It's common (but not required) that an rk3288 board uses one of the
256 * PWMs on the rk3288 as a regulator. We'll see if we're in that case. If we
257 * are we'll return a "np" for the PWM to save. If not, we'll return NULL.
258 * If we have an unexpected error we'll return an ERR_PTR.
260 * NOTE: this whole concept of needing to restore the voltage immediately after
261 * resume only makes sense for the PWMs built into rk3288. Any external
262 * regulators or external PWMs ought to keep their state.
264 static struct device_node * __init rk3288_get_regulator_pwm_np(
265 struct device_node *dmc_np)
267 struct device_node *np;
268 struct of_phandle_args args;
271 /* Look for the supply to the memory controller; OK if not there */
272 np = of_parse_phandle(dmc_np, "logic-supply", 0);
276 /* Check to see if it's a PWM regulator; OK if it's not */
277 if (!of_device_is_compatible(np, "pwm-regulator")) {
282 /* If it's a PWM regulator, we'd better be able to get the PWM */
283 ret = of_parse_phandle_with_args(np, "pwms", "#pwm-cells", 0, &args);
286 pr_err("%s(): can't parse \"pwms\" property\n", __func__);
291 * It seems highly unlikely that we'd have a PWM supplying a PWM
292 * regulator on an rk3288 that isn't a rk3288 PWM. In such a case
293 * it's unlikely that the PWM will lose its state. We'll throw up a
294 * warning just because this is so strange, but we won't treat it as
297 if (!of_device_is_compatible(args.np, "rockchip,rk3288-pwm")) {
298 pr_warn("%s(): unexpected PWM for regulator\n", __func__);
299 of_node_put(args.np);
306 int __init rk3288_ddr_suspend_init(struct rk3288_ddr_save_data *ddr_save)
308 struct device_node *dmc_np = NULL, *noc_np = NULL, *pwm_np = NULL;
312 dmc_np = of_find_compatible_node(NULL, NULL, "rockchip,rk3288-dmc");
314 pr_err("%s: could not find dmc dt node\n", __func__);
319 noc_np = of_find_compatible_node(NULL, NULL, "rockchip,rk3288-noc");
321 pr_err("%s: could not find noc node\n", __func__);
326 pwm_np = rk3288_get_regulator_pwm_np(dmc_np);
327 if (IS_ERR(pwm_np)) {
328 ret = PTR_ERR(pwm_np);
332 /* Do the offsets and saving of the PWM together */
336 rk3288_regulator_pwm_addr = of_iomap(pwm_np, 0);
337 if (!rk3288_regulator_pwm_addr) {
338 pr_err("%s: could not map PWM\n", __func__);
343 ret = of_address_to_resource(pwm_np, 0, &res);
345 pr_err("%s: could not get PWM phy addr\n", __func__);
349 BUILD_BUG_ON(NUM_PWM_REGS > RK3288_MAX_PWM_REGS);
350 rk3288_ddr_save_offsets(ddr_save->pwm_addrs,
353 RK3288_MAX_PWM_REGS);
355 /* Adjust to store full address, since there are many PWMs */
356 for (i = 0; i < NUM_PWM_REGS; i++)
357 ddr_save->pwm_addrs[i] += res.start;
360 /* Copy offsets in */
361 BUILD_BUG_ON(NUM_DDR_PHY_DLL_REGS > RK3288_MAX_DDR_PHY_DLL_REGS);
362 rk3288_ddr_save_offsets(ddr_save->phy_dll_offsets,
363 rk3288_ddr_phy_dll_reg,
364 NUM_DDR_PHY_DLL_REGS,
365 RK3288_MAX_DDR_PHY_DLL_REGS);
367 BUILD_BUG_ON(NUM_DDR_CTRL_REGS > RK3288_MAX_DDR_CTRL_REGS);
368 rk3288_ddr_save_offsets(ddr_save->ctrl_offsets,
371 RK3288_MAX_DDR_CTRL_REGS);
373 BUILD_BUG_ON(NUM_DDR_PHY_REGS > RK3288_MAX_DDR_PHY_REGS);
374 rk3288_ddr_save_offsets(ddr_save->phy_offsets,
377 RK3288_MAX_DDR_PHY_REGS);
379 BUILD_BUG_ON(ARRAY_SIZE(rk3288_ddr_msch_reg) >
380 RK3288_MAX_DDR_MSCH_REGS);
381 rk3288_ddr_save_offsets(ddr_save->msch_offsets,
384 RK3288_MAX_DDR_MSCH_REGS);
386 BUILD_BUG_ON(NUM_DDR_PHY_ZQCR_REGS > RK3288_MAX_DDR_PHY_ZQCR_REGS);
387 rk3288_ddr_save_offsets(ddr_save->phy_zqcr_offsets,
388 rk3288_ddr_phy_zqcr_reg,
389 NUM_DDR_PHY_ZQCR_REGS,
390 RK3288_MAX_DDR_PHY_ZQCR_REGS);
392 for (i = 0; i < RK3288_NUM_DDR_PORTS; i++) {
393 rk3288_ddr_ctrl_addr[i] = of_iomap(dmc_np, i * 2);
394 if (!rk3288_ddr_ctrl_addr[i]) {
395 pr_err("%s: could not map ddr ctrl\n", __func__);
400 rk3288_phy_addr[i] = of_iomap(dmc_np, i * 2 + 1);
401 if (!rk3288_phy_addr[i]) {
402 pr_err("%s: could not map phy\n", __func__);
408 for (i = 0; i < NUM_DDR_CLK_NAMES; i++) {
410 of_clk_get_by_name(dmc_np, rk3288_ddr_clk_names[i]);
412 if (IS_ERR(rk3288_ddr_clks[i])) {
413 pr_err("%s: couldn't get clock %s\n", __func__,
414 rk3288_ddr_clk_names[i]);
415 ret = PTR_ERR(rk3288_ddr_clks[i]);
419 ret = clk_prepare(rk3288_ddr_clks[i]);
421 pr_err("%s: couldn't prepare clock %s\n", __func__,
422 rk3288_ddr_clk_names[i]);
423 clk_put(rk3288_ddr_clks[i]);
424 rk3288_ddr_clks[i] = NULL;
429 rk3288_msch_addr[0] = of_iomap(noc_np, 0);
430 if (!rk3288_msch_addr[0]) {
431 pr_err("%s: could not map msch base\n", __func__);
435 rk3288_msch_addr[1] = rk3288_msch_addr[0] + 0x80;
441 if (rk3288_msch_addr[0]) {
442 iounmap(rk3288_msch_addr[0]);
443 rk3288_msch_addr[0] = NULL;
446 for (i = 0; i < NUM_DDR_CLK_NAMES; i++)
447 if (!IS_ERR_OR_NULL(rk3288_ddr_clks[i])) {
448 clk_unprepare(rk3288_ddr_clks[i]);
449 clk_put(rk3288_ddr_clks[i]);
450 rk3288_ddr_clks[i] = NULL;
453 for (i = 0; i < RK3288_NUM_DDR_PORTS; i++) {
454 if (rk3288_phy_addr[i]) {
455 iounmap(rk3288_phy_addr[i]);
456 rk3288_phy_addr[i] = NULL;
458 if (rk3288_ddr_ctrl_addr[i]) {
459 iounmap(rk3288_ddr_ctrl_addr[i]);
460 rk3288_ddr_ctrl_addr[i] = NULL;
464 if (rk3288_regulator_pwm_addr) {
465 iounmap(rk3288_regulator_pwm_addr);
466 rk3288_regulator_pwm_addr = NULL;