xref: /openbmc/linux/arch/arm/mach-imx/anatop.c (revision e95dddb3)
1e95dddb3SAnson Huang /*
2e95dddb3SAnson Huang  * Copyright (C) 2013 Freescale Semiconductor, Inc.
3e95dddb3SAnson Huang  *
4e95dddb3SAnson Huang  * The code contained herein is licensed under the GNU General Public
5e95dddb3SAnson Huang  * License. You may obtain a copy of the GNU General Public License
6e95dddb3SAnson Huang  * Version 2 or later at the following locations:
7e95dddb3SAnson Huang  *
8e95dddb3SAnson Huang  * http://www.opensource.org/licenses/gpl-license.html
9e95dddb3SAnson Huang  * http://www.gnu.org/copyleft/gpl.html
10e95dddb3SAnson Huang  */
11e95dddb3SAnson Huang 
12e95dddb3SAnson Huang #include <linux/err.h>
13e95dddb3SAnson Huang #include <linux/io.h>
14e95dddb3SAnson Huang #include <linux/of.h>
15e95dddb3SAnson Huang #include <linux/of_address.h>
16e95dddb3SAnson Huang #include <linux/mfd/syscon.h>
17e95dddb3SAnson Huang #include <linux/regmap.h>
18e95dddb3SAnson Huang 
19e95dddb3SAnson Huang #define REG_SET		0x4
20e95dddb3SAnson Huang #define REG_CLR		0x8
21e95dddb3SAnson Huang 
22e95dddb3SAnson Huang #define ANADIG_REG_CORE		0x140
23e95dddb3SAnson Huang #define ANADIG_USB1_CHRG_DETECT	0x1b0
24e95dddb3SAnson Huang #define ANADIG_USB2_CHRG_DETECT	0x210
25e95dddb3SAnson Huang #define ANADIG_DIGPROG		0x260
26e95dddb3SAnson Huang 
27e95dddb3SAnson Huang #define BM_ANADIG_REG_CORE_FET_ODRIVE		0x20000000
28e95dddb3SAnson Huang #define BM_ANADIG_USB_CHRG_DETECT_CHK_CHRG_B	0x80000
29e95dddb3SAnson Huang #define BM_ANADIG_USB_CHRG_DETECT_EN_B		0x100000
30e95dddb3SAnson Huang 
31e95dddb3SAnson Huang static struct regmap *anatop;
32e95dddb3SAnson Huang 
33e95dddb3SAnson Huang static void imx_anatop_enable_fet_odrive(bool enable)
34e95dddb3SAnson Huang {
35e95dddb3SAnson Huang 	regmap_write(anatop, ANADIG_REG_CORE + (enable ? REG_SET : REG_CLR),
36e95dddb3SAnson Huang 		BM_ANADIG_REG_CORE_FET_ODRIVE);
37e95dddb3SAnson Huang }
38e95dddb3SAnson Huang 
39e95dddb3SAnson Huang void imx_anatop_pre_suspend(void)
40e95dddb3SAnson Huang {
41e95dddb3SAnson Huang 	imx_anatop_enable_fet_odrive(true);
42e95dddb3SAnson Huang }
43e95dddb3SAnson Huang 
44e95dddb3SAnson Huang void imx_anatop_post_resume(void)
45e95dddb3SAnson Huang {
46e95dddb3SAnson Huang 	imx_anatop_enable_fet_odrive(false);
47e95dddb3SAnson Huang }
48e95dddb3SAnson Huang 
49e95dddb3SAnson Huang void imx_anatop_usb_chrg_detect_disable(void)
50e95dddb3SAnson Huang {
51e95dddb3SAnson Huang 	regmap_write(anatop, ANADIG_USB1_CHRG_DETECT,
52e95dddb3SAnson Huang 		BM_ANADIG_USB_CHRG_DETECT_EN_B
53e95dddb3SAnson Huang 		| BM_ANADIG_USB_CHRG_DETECT_CHK_CHRG_B);
54e95dddb3SAnson Huang 	regmap_write(anatop, ANADIG_USB2_CHRG_DETECT,
55e95dddb3SAnson Huang 		BM_ANADIG_USB_CHRG_DETECT_EN_B |
56e95dddb3SAnson Huang 		BM_ANADIG_USB_CHRG_DETECT_CHK_CHRG_B);
57e95dddb3SAnson Huang }
58e95dddb3SAnson Huang 
59e95dddb3SAnson Huang u32 imx_anatop_get_digprog(void)
60e95dddb3SAnson Huang {
61e95dddb3SAnson Huang 	u32  val;
62e95dddb3SAnson Huang 
63e95dddb3SAnson Huang 	regmap_read(anatop, ANADIG_DIGPROG, &val);
64e95dddb3SAnson Huang 	return val;
65e95dddb3SAnson Huang }
66e95dddb3SAnson Huang 
67e95dddb3SAnson Huang void __init imx_anatop_init(void)
68e95dddb3SAnson Huang {
69e95dddb3SAnson Huang 	anatop = syscon_regmap_lookup_by_compatible("fsl,imx6q-anatop");
70e95dddb3SAnson Huang 	if (IS_ERR(anatop)) {
71e95dddb3SAnson Huang 		pr_err("%s: failed to find imx6q-anatop regmap!\n", __func__);
72e95dddb3SAnson Huang 		return;
73e95dddb3SAnson Huang 	}
74e95dddb3SAnson Huang }
75