| .. | .. |
|---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-or-later |
|---|
| 1 | 2 | /* |
|---|
| 2 | 3 | * Copyright (C) 2013-2015 Freescale Semiconductor, Inc. |
|---|
| 3 | 4 | * Copyright 2017-2018 NXP. |
|---|
| 4 | | - * |
|---|
| 5 | | - * The code contained herein is licensed under the GNU General Public |
|---|
| 6 | | - * License. You may obtain a copy of the GNU General Public License |
|---|
| 7 | | - * Version 2 or later at the following locations: |
|---|
| 8 | | - * |
|---|
| 9 | | - * http://www.opensource.org/licenses/gpl-license.html |
|---|
| 10 | | - * http://www.gnu.org/copyleft/gpl.html |
|---|
| 11 | 5 | */ |
|---|
| 12 | 6 | |
|---|
| 13 | 7 | #include <linux/err.h> |
|---|
| .. | .. |
|---|
| 25 | 19 | #define ANADIG_REG_2P5 0x130 |
|---|
| 26 | 20 | #define ANADIG_REG_CORE 0x140 |
|---|
| 27 | 21 | #define ANADIG_ANA_MISC0 0x150 |
|---|
| 28 | | -#define ANADIG_USB1_CHRG_DETECT 0x1b0 |
|---|
| 29 | | -#define ANADIG_USB2_CHRG_DETECT 0x210 |
|---|
| 30 | 22 | #define ANADIG_DIGPROG 0x260 |
|---|
| 31 | 23 | #define ANADIG_DIGPROG_IMX6SL 0x280 |
|---|
| 32 | 24 | #define ANADIG_DIGPROG_IMX7D 0x800 |
|---|
| 25 | + |
|---|
| 26 | +#define SRC_SBMR2 0x1c |
|---|
| 33 | 27 | |
|---|
| 34 | 28 | #define BM_ANADIG_REG_2P5_ENABLE_WEAK_LINREG 0x40000 |
|---|
| 35 | 29 | #define BM_ANADIG_REG_2P5_ENABLE_PULLDOWN 0x8 |
|---|
| .. | .. |
|---|
| 37 | 31 | #define BM_ANADIG_ANA_MISC0_STOP_MODE_CONFIG 0x1000 |
|---|
| 38 | 32 | /* Below MISC0_DISCON_HIGH_SNVS is only for i.MX6SL */ |
|---|
| 39 | 33 | #define BM_ANADIG_ANA_MISC0_DISCON_HIGH_SNVS 0x2000 |
|---|
| 40 | | -#define BM_ANADIG_USB_CHRG_DETECT_CHK_CHRG_B 0x80000 |
|---|
| 41 | | -#define BM_ANADIG_USB_CHRG_DETECT_EN_B 0x100000 |
|---|
| 42 | 34 | |
|---|
| 43 | 35 | static struct regmap *anatop; |
|---|
| 44 | 36 | |
|---|
| .. | .. |
|---|
| 97 | 89 | |
|---|
| 98 | 90 | if (cpu_is_imx6sl()) |
|---|
| 99 | 91 | imx_anatop_disconnect_high_snvs(false); |
|---|
| 100 | | - |
|---|
| 101 | | -} |
|---|
| 102 | | - |
|---|
| 103 | | -static void imx_anatop_usb_chrg_detect_disable(void) |
|---|
| 104 | | -{ |
|---|
| 105 | | - regmap_write(anatop, ANADIG_USB1_CHRG_DETECT, |
|---|
| 106 | | - BM_ANADIG_USB_CHRG_DETECT_EN_B |
|---|
| 107 | | - | BM_ANADIG_USB_CHRG_DETECT_CHK_CHRG_B); |
|---|
| 108 | | - regmap_write(anatop, ANADIG_USB2_CHRG_DETECT, |
|---|
| 109 | | - BM_ANADIG_USB_CHRG_DETECT_EN_B | |
|---|
| 110 | | - BM_ANADIG_USB_CHRG_DETECT_CHK_CHRG_B); |
|---|
| 111 | 92 | } |
|---|
| 112 | 93 | |
|---|
| 113 | 94 | void __init imx_init_revision_from_anatop(void) |
|---|
| 114 | 95 | { |
|---|
| 115 | | - struct device_node *np; |
|---|
| 96 | + struct device_node *np, *src_np; |
|---|
| 116 | 97 | void __iomem *anatop_base; |
|---|
| 117 | 98 | unsigned int revision; |
|---|
| 118 | 99 | u32 digprog; |
|---|
| .. | .. |
|---|
| 148 | 129 | major_part = (digprog >> 8) & 0xf; |
|---|
| 149 | 130 | minor_part = digprog & 0xf; |
|---|
| 150 | 131 | revision = ((major_part + 1) << 4) | minor_part; |
|---|
| 132 | + |
|---|
| 133 | + if ((digprog >> 16) == MXC_CPU_IMX6ULL) { |
|---|
| 134 | + void __iomem *src_base; |
|---|
| 135 | + u32 sbmr2; |
|---|
| 136 | + |
|---|
| 137 | + src_np = of_find_compatible_node(NULL, NULL, |
|---|
| 138 | + "fsl,imx6ul-src"); |
|---|
| 139 | + src_base = of_iomap(src_np, 0); |
|---|
| 140 | + of_node_put(src_np); |
|---|
| 141 | + WARN_ON(!src_base); |
|---|
| 142 | + sbmr2 = readl_relaxed(src_base + SRC_SBMR2); |
|---|
| 143 | + iounmap(src_base); |
|---|
| 144 | + |
|---|
| 145 | + /* src_sbmr2 bit 6 is to identify if it is i.MX6ULZ */ |
|---|
| 146 | + if (sbmr2 & (1 << 6)) { |
|---|
| 147 | + digprog &= ~(0xff << 16); |
|---|
| 148 | + digprog |= (MXC_CPU_IMX6ULZ << 16); |
|---|
| 149 | + } |
|---|
| 150 | + } |
|---|
| 151 | 151 | } |
|---|
| 152 | + of_node_put(np); |
|---|
| 152 | 153 | |
|---|
| 153 | 154 | mxc_set_cpu_type(digprog >> 16 & 0xff); |
|---|
| 154 | 155 | imx_set_soc_revision(revision); |
|---|
| .. | .. |
|---|
| 157 | 158 | void __init imx_anatop_init(void) |
|---|
| 158 | 159 | { |
|---|
| 159 | 160 | anatop = syscon_regmap_lookup_by_compatible("fsl,imx6q-anatop"); |
|---|
| 160 | | - if (IS_ERR(anatop)) { |
|---|
| 161 | + if (IS_ERR(anatop)) |
|---|
| 161 | 162 | pr_err("%s: failed to find imx6q-anatop regmap!\n", __func__); |
|---|
| 162 | | - return; |
|---|
| 163 | | - } |
|---|
| 164 | | - |
|---|
| 165 | | - imx_anatop_usb_chrg_detect_disable(); |
|---|
| 166 | 163 | } |
|---|