blob: b2d600f149377a9570014e6b9139860e444239f3 [file] [log] [blame]
Anson Huange95dddb2013-03-20 19:39:42 -04001/*
2 * Copyright (C) 2013 Freescale Semiconductor, Inc.
3 *
4 * The code contained herein is licensed under the GNU General Public
5 * License. You may obtain a copy of the GNU General Public License
6 * Version 2 or later at the following locations:
7 *
8 * http://www.opensource.org/licenses/gpl-license.html
9 * http://www.gnu.org/copyleft/gpl.html
10 */
11
12#include <linux/err.h>
13#include <linux/io.h>
14#include <linux/of.h>
15#include <linux/of_address.h>
16#include <linux/mfd/syscon.h>
17#include <linux/regmap.h>
Fabio Estevamfcc4f9f2013-03-25 09:20:41 -030018#include "common.h"
Shawn Guof1c6f312013-08-13 14:59:43 +080019#include "hardware.h"
Anson Huange95dddb2013-03-20 19:39:42 -040020
21#define REG_SET 0x4
22#define REG_CLR 0x8
23
Anson Huang263475d2013-03-21 10:58:06 -040024#define ANADIG_REG_2P5 0x130
Anson Huange95dddb2013-03-20 19:39:42 -040025#define ANADIG_REG_CORE 0x140
Anson Huang263475d2013-03-21 10:58:06 -040026#define ANADIG_ANA_MISC0 0x150
Anson Huange95dddb2013-03-20 19:39:42 -040027#define ANADIG_USB1_CHRG_DETECT 0x1b0
28#define ANADIG_USB2_CHRG_DETECT 0x210
29#define ANADIG_DIGPROG 0x260
30
Anson Huang263475d2013-03-21 10:58:06 -040031#define BM_ANADIG_REG_2P5_ENABLE_WEAK_LINREG 0x40000
Anson Huange95dddb2013-03-20 19:39:42 -040032#define BM_ANADIG_REG_CORE_FET_ODRIVE 0x20000000
Anson Huang263475d2013-03-21 10:58:06 -040033#define BM_ANADIG_ANA_MISC0_STOP_MODE_CONFIG 0x1000
Anson Huange95dddb2013-03-20 19:39:42 -040034#define BM_ANADIG_USB_CHRG_DETECT_CHK_CHRG_B 0x80000
35#define BM_ANADIG_USB_CHRG_DETECT_EN_B 0x100000
36
37static struct regmap *anatop;
38
Anson Huang263475d2013-03-21 10:58:06 -040039static void imx_anatop_enable_weak2p5(bool enable)
40{
41 u32 reg, val;
42
43 regmap_read(anatop, ANADIG_ANA_MISC0, &val);
44
45 /* can only be enabled when stop_mode_config is clear. */
46 reg = ANADIG_REG_2P5;
47 reg += (enable && (val & BM_ANADIG_ANA_MISC0_STOP_MODE_CONFIG) == 0) ?
48 REG_SET : REG_CLR;
49 regmap_write(anatop, reg, BM_ANADIG_REG_2P5_ENABLE_WEAK_LINREG);
50}
51
Anson Huange95dddb2013-03-20 19:39:42 -040052static void imx_anatop_enable_fet_odrive(bool enable)
53{
54 regmap_write(anatop, ANADIG_REG_CORE + (enable ? REG_SET : REG_CLR),
55 BM_ANADIG_REG_CORE_FET_ODRIVE);
56}
57
58void imx_anatop_pre_suspend(void)
59{
Anson Huang263475d2013-03-21 10:58:06 -040060 imx_anatop_enable_weak2p5(true);
Anson Huange95dddb2013-03-20 19:39:42 -040061 imx_anatop_enable_fet_odrive(true);
62}
63
64void imx_anatop_post_resume(void)
65{
66 imx_anatop_enable_fet_odrive(false);
Anson Huang263475d2013-03-21 10:58:06 -040067 imx_anatop_enable_weak2p5(false);
Anson Huange95dddb2013-03-20 19:39:42 -040068}
69
Peter Chenddcb9aa2013-08-14 11:40:56 +080070static void imx_anatop_usb_chrg_detect_disable(void)
Anson Huange95dddb2013-03-20 19:39:42 -040071{
72 regmap_write(anatop, ANADIG_USB1_CHRG_DETECT,
73 BM_ANADIG_USB_CHRG_DETECT_EN_B
74 | BM_ANADIG_USB_CHRG_DETECT_CHK_CHRG_B);
75 regmap_write(anatop, ANADIG_USB2_CHRG_DETECT,
76 BM_ANADIG_USB_CHRG_DETECT_EN_B |
77 BM_ANADIG_USB_CHRG_DETECT_CHK_CHRG_B);
78}
79
Shawn Guof1c6f312013-08-13 14:59:43 +080080void __init imx_init_revision_from_anatop(void)
Anson Huange95dddb2013-03-20 19:39:42 -040081{
Shawn Guo7006ba22013-03-31 22:39:22 +080082 struct device_node *np;
83 void __iomem *anatop_base;
Shawn Guof1c6f312013-08-13 14:59:43 +080084 unsigned int revision;
85 u32 digprog;
Shawn Guo7006ba22013-03-31 22:39:22 +080086
87 np = of_find_compatible_node(NULL, NULL, "fsl,imx6q-anatop");
88 anatop_base = of_iomap(np, 0);
89 WARN_ON(!anatop_base);
90 digprog = readl_relaxed(anatop_base + ANADIG_DIGPROG);
Shawn Guof1c6f312013-08-13 14:59:43 +080091 iounmap(anatop_base);
Shawn Guo7006ba22013-03-31 22:39:22 +080092
Shawn Guof1c6f312013-08-13 14:59:43 +080093 switch (digprog & 0xff) {
94 case 0:
95 revision = IMX_CHIP_REVISION_1_0;
96 break;
97 case 1:
98 revision = IMX_CHIP_REVISION_1_1;
99 break;
100 case 2:
101 revision = IMX_CHIP_REVISION_1_2;
102 break;
103 default:
104 revision = IMX_CHIP_REVISION_UNKNOWN;
105 }
106
107 mxc_set_cpu_type(digprog >> 16 & 0xff);
108 imx_set_soc_revision(revision);
Anson Huange95dddb2013-03-20 19:39:42 -0400109}
110
111void __init imx_anatop_init(void)
112{
113 anatop = syscon_regmap_lookup_by_compatible("fsl,imx6q-anatop");
114 if (IS_ERR(anatop)) {
115 pr_err("%s: failed to find imx6q-anatop regmap!\n", __func__);
116 return;
117 }
Peter Chenddcb9aa2013-08-14 11:40:56 +0800118
119 imx_anatop_usb_chrg_detect_disable();
Anson Huange95dddb2013-03-20 19:39:42 -0400120}