diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2016-05-18 16:14:02 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2016-05-18 16:14:02 -0400 |
commit | 4a5219edcdae52bfb5eea0dfc2a7bd575961dad7 (patch) | |
tree | 863f6efeac5fe9ba4f1f8d23b32b2947130ed510 /drivers/soc/mediatek | |
parent | 9797f6b0504122e4ad9ff047a3d0521ad6706386 (diff) | |
parent | 5420f9fd159761b88978c312c3b350546f8615bb (diff) |
Merge tag 'armsoc-drivers' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc
Pull ARM SoC driver updates from Arnd Bergmann:
"Driver updates for ARM SoCs, these contain various things that touch
the drivers/ directory but got merged through arm-soc for practical
reasons.
For the most part, this is now related to power management
controllers, which have not yet been abstracted into a separate
subsystem, and typically require some code in drivers/soc or arch/arm
to control the power domains.
Another large chunk here is a rework of the NVIDIA Tegra USB3.0
support, which was surprisingly tricky and took a long time to get
done.
Finally, reset controller handling as always gets merged through here
as well"
* tag 'armsoc-drivers' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc: (97 commits)
arm-ccn: Enable building as module
soc/tegra: pmc: Add generic PM domain support
usb: xhci: tegra: Add Tegra210 support
usb: xhci: Add NVIDIA Tegra XUSB controller driver
dt-bindings: usb: xhci-tegra: Add Tegra210 XUSB controller support
dt-bindings: usb: Add NVIDIA Tegra XUSB controller binding
PCI: tegra: Support per-lane PHYs
dt-bindings: pci: tegra: Update for per-lane PHYs
phy: tegra: Add Tegra210 support
phy: Add Tegra XUSB pad controller support
dt-bindings: phy: tegra-xusb-padctl: Add Tegra210 support
dt-bindings: phy: Add NVIDIA Tegra XUSB pad controller binding
phy: core: Allow children node to be overridden
clk: tegra: Add interface to enable hardware control of SATA/XUSB PLLs
drivers: firmware: psci: make two helper functions inline
soc: renesas: rcar-sysc: Add support for R-Car H3 power areas
soc: renesas: rcar-sysc: Add support for R-Car E2 power areas
soc: renesas: rcar-sysc: Add support for R-Car M2-N power areas
soc: renesas: rcar-sysc: Add support for R-Car M2-W power areas
soc: renesas: rcar-sysc: Add support for R-Car H2 power areas
...
Diffstat (limited to 'drivers/soc/mediatek')
-rw-r--r-- | drivers/soc/mediatek/mtk-pmic-wrap.c | 544 |
1 files changed, 413 insertions, 131 deletions
diff --git a/drivers/soc/mediatek/mtk-pmic-wrap.c b/drivers/soc/mediatek/mtk-pmic-wrap.c index 0d9b19a78d27..3c3e56df526e 100644 --- a/drivers/soc/mediatek/mtk-pmic-wrap.c +++ b/drivers/soc/mediatek/mtk-pmic-wrap.c | |||
@@ -52,6 +52,7 @@ | |||
52 | #define PWRAP_DEW_WRITE_TEST_VAL 0xa55a | 52 | #define PWRAP_DEW_WRITE_TEST_VAL 0xa55a |
53 | 53 | ||
54 | /* macro for manual command */ | 54 | /* macro for manual command */ |
55 | #define PWRAP_MAN_CMD_SPI_WRITE_NEW (1 << 14) | ||
55 | #define PWRAP_MAN_CMD_SPI_WRITE (1 << 13) | 56 | #define PWRAP_MAN_CMD_SPI_WRITE (1 << 13) |
56 | #define PWRAP_MAN_CMD_OP_CSH (0x0 << 8) | 57 | #define PWRAP_MAN_CMD_OP_CSH (0x0 << 8) |
57 | #define PWRAP_MAN_CMD_OP_CSL (0x1 << 8) | 58 | #define PWRAP_MAN_CMD_OP_CSL (0x1 << 8) |
@@ -69,33 +70,75 @@ | |||
69 | PWRAP_WDT_SRC_EN_HARB_STAUPD_DLE | \ | 70 | PWRAP_WDT_SRC_EN_HARB_STAUPD_DLE | \ |
70 | PWRAP_WDT_SRC_EN_HARB_STAUPD_ALE) | 71 | PWRAP_WDT_SRC_EN_HARB_STAUPD_ALE) |
71 | 72 | ||
72 | /* macro for slave device wrapper registers */ | 73 | /* defines for slave device wrapper registers */ |
73 | #define PWRAP_DEW_BASE 0xbc00 | 74 | enum dew_regs { |
74 | #define PWRAP_DEW_EVENT_OUT_EN (PWRAP_DEW_BASE + 0x0) | 75 | PWRAP_DEW_BASE, |
75 | #define PWRAP_DEW_DIO_EN (PWRAP_DEW_BASE + 0x2) | 76 | PWRAP_DEW_DIO_EN, |
76 | #define PWRAP_DEW_EVENT_SRC_EN (PWRAP_DEW_BASE + 0x4) | 77 | PWRAP_DEW_READ_TEST, |
77 | #define PWRAP_DEW_EVENT_SRC (PWRAP_DEW_BASE + 0x6) | 78 | PWRAP_DEW_WRITE_TEST, |
78 | #define PWRAP_DEW_EVENT_FLAG (PWRAP_DEW_BASE + 0x8) | 79 | PWRAP_DEW_CRC_EN, |
79 | #define PWRAP_DEW_READ_TEST (PWRAP_DEW_BASE + 0xa) | 80 | PWRAP_DEW_CRC_VAL, |
80 | #define PWRAP_DEW_WRITE_TEST (PWRAP_DEW_BASE + 0xc) | 81 | PWRAP_DEW_MON_GRP_SEL, |
81 | #define PWRAP_DEW_CRC_EN (PWRAP_DEW_BASE + 0xe) | 82 | PWRAP_DEW_CIPHER_KEY_SEL, |
82 | #define PWRAP_DEW_CRC_VAL (PWRAP_DEW_BASE + 0x10) | 83 | PWRAP_DEW_CIPHER_IV_SEL, |
83 | #define PWRAP_DEW_MON_GRP_SEL (PWRAP_DEW_BASE + 0x12) | 84 | PWRAP_DEW_CIPHER_RDY, |
84 | #define PWRAP_DEW_MON_FLAG_SEL (PWRAP_DEW_BASE + 0x14) | 85 | PWRAP_DEW_CIPHER_MODE, |
85 | #define PWRAP_DEW_EVENT_TEST (PWRAP_DEW_BASE + 0x16) | 86 | PWRAP_DEW_CIPHER_SWRST, |
86 | #define PWRAP_DEW_CIPHER_KEY_SEL (PWRAP_DEW_BASE + 0x18) | 87 | |
87 | #define PWRAP_DEW_CIPHER_IV_SEL (PWRAP_DEW_BASE + 0x1a) | 88 | /* MT6397 only regs */ |
88 | #define PWRAP_DEW_CIPHER_LOAD (PWRAP_DEW_BASE + 0x1c) | 89 | PWRAP_DEW_EVENT_OUT_EN, |
89 | #define PWRAP_DEW_CIPHER_START (PWRAP_DEW_BASE + 0x1e) | 90 | PWRAP_DEW_EVENT_SRC_EN, |
90 | #define PWRAP_DEW_CIPHER_RDY (PWRAP_DEW_BASE + 0x20) | 91 | PWRAP_DEW_EVENT_SRC, |
91 | #define PWRAP_DEW_CIPHER_MODE (PWRAP_DEW_BASE + 0x22) | 92 | PWRAP_DEW_EVENT_FLAG, |
92 | #define PWRAP_DEW_CIPHER_SWRST (PWRAP_DEW_BASE + 0x24) | 93 | PWRAP_DEW_MON_FLAG_SEL, |
93 | #define PWRAP_MT8173_DEW_CIPHER_IV0 (PWRAP_DEW_BASE + 0x26) | 94 | PWRAP_DEW_EVENT_TEST, |
94 | #define PWRAP_MT8173_DEW_CIPHER_IV1 (PWRAP_DEW_BASE + 0x28) | 95 | PWRAP_DEW_CIPHER_LOAD, |
95 | #define PWRAP_MT8173_DEW_CIPHER_IV2 (PWRAP_DEW_BASE + 0x2a) | 96 | PWRAP_DEW_CIPHER_START, |
96 | #define PWRAP_MT8173_DEW_CIPHER_IV3 (PWRAP_DEW_BASE + 0x2c) | 97 | |
97 | #define PWRAP_MT8173_DEW_CIPHER_IV4 (PWRAP_DEW_BASE + 0x2e) | 98 | /* MT6323 only regs */ |
98 | #define PWRAP_MT8173_DEW_CIPHER_IV5 (PWRAP_DEW_BASE + 0x30) | 99 | PWRAP_DEW_CIPHER_EN, |
100 | PWRAP_DEW_RDDMY_NO, | ||
101 | }; | ||
102 | |||
103 | static const u32 mt6323_regs[] = { | ||
104 | [PWRAP_DEW_BASE] = 0x0000, | ||
105 | [PWRAP_DEW_DIO_EN] = 0x018a, | ||
106 | [PWRAP_DEW_READ_TEST] = 0x018c, | ||
107 | [PWRAP_DEW_WRITE_TEST] = 0x018e, | ||
108 | [PWRAP_DEW_CRC_EN] = 0x0192, | ||
109 | [PWRAP_DEW_CRC_VAL] = 0x0194, | ||
110 | [PWRAP_DEW_MON_GRP_SEL] = 0x0196, | ||
111 | [PWRAP_DEW_CIPHER_KEY_SEL] = 0x0198, | ||
112 | [PWRAP_DEW_CIPHER_IV_SEL] = 0x019a, | ||
113 | [PWRAP_DEW_CIPHER_EN] = 0x019c, | ||
114 | [PWRAP_DEW_CIPHER_RDY] = 0x019e, | ||
115 | [PWRAP_DEW_CIPHER_MODE] = 0x01a0, | ||
116 | [PWRAP_DEW_CIPHER_SWRST] = 0x01a2, | ||
117 | [PWRAP_DEW_RDDMY_NO] = 0x01a4, | ||
118 | }; | ||
119 | |||
120 | static const u32 mt6397_regs[] = { | ||
121 | [PWRAP_DEW_BASE] = 0xbc00, | ||
122 | [PWRAP_DEW_EVENT_OUT_EN] = 0xbc00, | ||
123 | [PWRAP_DEW_DIO_EN] = 0xbc02, | ||
124 | [PWRAP_DEW_EVENT_SRC_EN] = 0xbc04, | ||
125 | [PWRAP_DEW_EVENT_SRC] = 0xbc06, | ||
126 | [PWRAP_DEW_EVENT_FLAG] = 0xbc08, | ||
127 | [PWRAP_DEW_READ_TEST] = 0xbc0a, | ||
128 | [PWRAP_DEW_WRITE_TEST] = 0xbc0c, | ||
129 | [PWRAP_DEW_CRC_EN] = 0xbc0e, | ||
130 | [PWRAP_DEW_CRC_VAL] = 0xbc10, | ||
131 | [PWRAP_DEW_MON_GRP_SEL] = 0xbc12, | ||
132 | [PWRAP_DEW_MON_FLAG_SEL] = 0xbc14, | ||
133 | [PWRAP_DEW_EVENT_TEST] = 0xbc16, | ||
134 | [PWRAP_DEW_CIPHER_KEY_SEL] = 0xbc18, | ||
135 | [PWRAP_DEW_CIPHER_IV_SEL] = 0xbc1a, | ||
136 | [PWRAP_DEW_CIPHER_LOAD] = 0xbc1c, | ||
137 | [PWRAP_DEW_CIPHER_START] = 0xbc1e, | ||
138 | [PWRAP_DEW_CIPHER_RDY] = 0xbc20, | ||
139 | [PWRAP_DEW_CIPHER_MODE] = 0xbc22, | ||
140 | [PWRAP_DEW_CIPHER_SWRST] = 0xbc24, | ||
141 | }; | ||
99 | 142 | ||
100 | enum pwrap_regs { | 143 | enum pwrap_regs { |
101 | PWRAP_MUX_SEL, | 144 | PWRAP_MUX_SEL, |
@@ -158,6 +201,13 @@ enum pwrap_regs { | |||
158 | PWRAP_DCM_EN, | 201 | PWRAP_DCM_EN, |
159 | PWRAP_DCM_DBC_PRD, | 202 | PWRAP_DCM_DBC_PRD, |
160 | 203 | ||
204 | /* MT2701 only regs */ | ||
205 | PWRAP_ADC_CMD_ADDR, | ||
206 | PWRAP_PWRAP_ADC_CMD, | ||
207 | PWRAP_ADC_RDY_ADDR, | ||
208 | PWRAP_ADC_RDATA_ADDR1, | ||
209 | PWRAP_ADC_RDATA_ADDR2, | ||
210 | |||
161 | /* MT8135 only regs */ | 211 | /* MT8135 only regs */ |
162 | PWRAP_CSHEXT, | 212 | PWRAP_CSHEXT, |
163 | PWRAP_EVENT_IN_EN, | 213 | PWRAP_EVENT_IN_EN, |
@@ -194,6 +244,92 @@ enum pwrap_regs { | |||
194 | PWRAP_CIPHER_EN, | 244 | PWRAP_CIPHER_EN, |
195 | }; | 245 | }; |
196 | 246 | ||
247 | static int mt2701_regs[] = { | ||
248 | [PWRAP_MUX_SEL] = 0x0, | ||
249 | [PWRAP_WRAP_EN] = 0x4, | ||
250 | [PWRAP_DIO_EN] = 0x8, | ||
251 | [PWRAP_SIDLY] = 0xc, | ||
252 | [PWRAP_RDDMY] = 0x18, | ||
253 | [PWRAP_SI_CK_CON] = 0x1c, | ||
254 | [PWRAP_CSHEXT_WRITE] = 0x20, | ||
255 | [PWRAP_CSHEXT_READ] = 0x24, | ||
256 | [PWRAP_CSLEXT_START] = 0x28, | ||
257 | [PWRAP_CSLEXT_END] = 0x2c, | ||
258 | [PWRAP_STAUPD_PRD] = 0x30, | ||
259 | [PWRAP_STAUPD_GRPEN] = 0x34, | ||
260 | [PWRAP_STAUPD_MAN_TRIG] = 0x38, | ||
261 | [PWRAP_STAUPD_STA] = 0x3c, | ||
262 | [PWRAP_WRAP_STA] = 0x44, | ||
263 | [PWRAP_HARB_INIT] = 0x48, | ||
264 | [PWRAP_HARB_HPRIO] = 0x4c, | ||
265 | [PWRAP_HIPRIO_ARB_EN] = 0x50, | ||
266 | [PWRAP_HARB_STA0] = 0x54, | ||
267 | [PWRAP_HARB_STA1] = 0x58, | ||
268 | [PWRAP_MAN_EN] = 0x5c, | ||
269 | [PWRAP_MAN_CMD] = 0x60, | ||
270 | [PWRAP_MAN_RDATA] = 0x64, | ||
271 | [PWRAP_MAN_VLDCLR] = 0x68, | ||
272 | [PWRAP_WACS0_EN] = 0x6c, | ||
273 | [PWRAP_INIT_DONE0] = 0x70, | ||
274 | [PWRAP_WACS0_CMD] = 0x74, | ||
275 | [PWRAP_WACS0_RDATA] = 0x78, | ||
276 | [PWRAP_WACS0_VLDCLR] = 0x7c, | ||
277 | [PWRAP_WACS1_EN] = 0x80, | ||
278 | [PWRAP_INIT_DONE1] = 0x84, | ||
279 | [PWRAP_WACS1_CMD] = 0x88, | ||
280 | [PWRAP_WACS1_RDATA] = 0x8c, | ||
281 | [PWRAP_WACS1_VLDCLR] = 0x90, | ||
282 | [PWRAP_WACS2_EN] = 0x94, | ||
283 | [PWRAP_INIT_DONE2] = 0x98, | ||
284 | [PWRAP_WACS2_CMD] = 0x9c, | ||
285 | [PWRAP_WACS2_RDATA] = 0xa0, | ||
286 | [PWRAP_WACS2_VLDCLR] = 0xa4, | ||
287 | [PWRAP_INT_EN] = 0xa8, | ||
288 | [PWRAP_INT_FLG_RAW] = 0xac, | ||
289 | [PWRAP_INT_FLG] = 0xb0, | ||
290 | [PWRAP_INT_CLR] = 0xb4, | ||
291 | [PWRAP_SIG_ADR] = 0xb8, | ||
292 | [PWRAP_SIG_MODE] = 0xbc, | ||
293 | [PWRAP_SIG_VALUE] = 0xc0, | ||
294 | [PWRAP_SIG_ERRVAL] = 0xc4, | ||
295 | [PWRAP_CRC_EN] = 0xc8, | ||
296 | [PWRAP_TIMER_EN] = 0xcc, | ||
297 | [PWRAP_TIMER_STA] = 0xd0, | ||
298 | [PWRAP_WDT_UNIT] = 0xd4, | ||
299 | [PWRAP_WDT_SRC_EN] = 0xd8, | ||
300 | [PWRAP_WDT_FLG] = 0xdc, | ||
301 | [PWRAP_DEBUG_INT_SEL] = 0xe0, | ||
302 | [PWRAP_DVFS_ADR0] = 0xe4, | ||
303 | [PWRAP_DVFS_WDATA0] = 0xe8, | ||
304 | [PWRAP_DVFS_ADR1] = 0xec, | ||
305 | [PWRAP_DVFS_WDATA1] = 0xf0, | ||
306 | [PWRAP_DVFS_ADR2] = 0xf4, | ||
307 | [PWRAP_DVFS_WDATA2] = 0xf8, | ||
308 | [PWRAP_DVFS_ADR3] = 0xfc, | ||
309 | [PWRAP_DVFS_WDATA3] = 0x100, | ||
310 | [PWRAP_DVFS_ADR4] = 0x104, | ||
311 | [PWRAP_DVFS_WDATA4] = 0x108, | ||
312 | [PWRAP_DVFS_ADR5] = 0x10c, | ||
313 | [PWRAP_DVFS_WDATA5] = 0x110, | ||
314 | [PWRAP_DVFS_ADR6] = 0x114, | ||
315 | [PWRAP_DVFS_WDATA6] = 0x118, | ||
316 | [PWRAP_DVFS_ADR7] = 0x11c, | ||
317 | [PWRAP_DVFS_WDATA7] = 0x120, | ||
318 | [PWRAP_CIPHER_KEY_SEL] = 0x124, | ||
319 | [PWRAP_CIPHER_IV_SEL] = 0x128, | ||
320 | [PWRAP_CIPHER_EN] = 0x12c, | ||
321 | [PWRAP_CIPHER_RDY] = 0x130, | ||
322 | [PWRAP_CIPHER_MODE] = 0x134, | ||
323 | [PWRAP_CIPHER_SWRST] = 0x138, | ||
324 | [PWRAP_DCM_EN] = 0x13c, | ||
325 | [PWRAP_DCM_DBC_PRD] = 0x140, | ||
326 | [PWRAP_ADC_CMD_ADDR] = 0x144, | ||
327 | [PWRAP_PWRAP_ADC_CMD] = 0x148, | ||
328 | [PWRAP_ADC_RDY_ADDR] = 0x14c, | ||
329 | [PWRAP_ADC_RDATA_ADDR1] = 0x150, | ||
330 | [PWRAP_ADC_RDATA_ADDR2] = 0x154, | ||
331 | }; | ||
332 | |||
197 | static int mt8173_regs[] = { | 333 | static int mt8173_regs[] = { |
198 | [PWRAP_MUX_SEL] = 0x0, | 334 | [PWRAP_MUX_SEL] = 0x0, |
199 | [PWRAP_WRAP_EN] = 0x4, | 335 | [PWRAP_WRAP_EN] = 0x4, |
@@ -349,36 +485,28 @@ static int mt8135_regs[] = { | |||
349 | [PWRAP_DCM_DBC_PRD] = 0x160, | 485 | [PWRAP_DCM_DBC_PRD] = 0x160, |
350 | }; | 486 | }; |
351 | 487 | ||
488 | enum pmic_type { | ||
489 | PMIC_MT6323, | ||
490 | PMIC_MT6397, | ||
491 | }; | ||
492 | |||
352 | enum pwrap_type { | 493 | enum pwrap_type { |
494 | PWRAP_MT2701, | ||
353 | PWRAP_MT8135, | 495 | PWRAP_MT8135, |
354 | PWRAP_MT8173, | 496 | PWRAP_MT8173, |
355 | }; | 497 | }; |
356 | 498 | ||
357 | struct pmic_wrapper_type { | 499 | struct pwrap_slv_type { |
358 | int *regs; | 500 | const u32 *dew_regs; |
359 | enum pwrap_type type; | 501 | enum pmic_type type; |
360 | u32 arb_en_all; | ||
361 | }; | ||
362 | |||
363 | static struct pmic_wrapper_type pwrap_mt8135 = { | ||
364 | .regs = mt8135_regs, | ||
365 | .type = PWRAP_MT8135, | ||
366 | .arb_en_all = 0x1ff, | ||
367 | }; | ||
368 | |||
369 | static struct pmic_wrapper_type pwrap_mt8173 = { | ||
370 | .regs = mt8173_regs, | ||
371 | .type = PWRAP_MT8173, | ||
372 | .arb_en_all = 0x3f, | ||
373 | }; | 502 | }; |
374 | 503 | ||
375 | struct pmic_wrapper { | 504 | struct pmic_wrapper { |
376 | struct device *dev; | 505 | struct device *dev; |
377 | void __iomem *base; | 506 | void __iomem *base; |
378 | struct regmap *regmap; | 507 | struct regmap *regmap; |
379 | int *regs; | 508 | const struct pmic_wrapper_type *master; |
380 | enum pwrap_type type; | 509 | const struct pwrap_slv_type *slave; |
381 | u32 arb_en_all; | ||
382 | struct clk *clk_spi; | 510 | struct clk *clk_spi; |
383 | struct clk *clk_wrap; | 511 | struct clk *clk_wrap; |
384 | struct reset_control *rstc; | 512 | struct reset_control *rstc; |
@@ -387,24 +515,26 @@ struct pmic_wrapper { | |||
387 | void __iomem *bridge_base; | 515 | void __iomem *bridge_base; |
388 | }; | 516 | }; |
389 | 517 | ||
390 | static inline int pwrap_is_mt8135(struct pmic_wrapper *wrp) | 518 | struct pmic_wrapper_type { |
391 | { | 519 | int *regs; |
392 | return wrp->type == PWRAP_MT8135; | 520 | enum pwrap_type type; |
393 | } | 521 | u32 arb_en_all; |
394 | 522 | u32 int_en_all; | |
395 | static inline int pwrap_is_mt8173(struct pmic_wrapper *wrp) | 523 | u32 spi_w; |
396 | { | 524 | u32 wdt_src; |
397 | return wrp->type == PWRAP_MT8173; | 525 | int has_bridge:1; |
398 | } | 526 | int (*init_reg_clock)(struct pmic_wrapper *wrp); |
527 | int (*init_soc_specific)(struct pmic_wrapper *wrp); | ||
528 | }; | ||
399 | 529 | ||
400 | static u32 pwrap_readl(struct pmic_wrapper *wrp, enum pwrap_regs reg) | 530 | static u32 pwrap_readl(struct pmic_wrapper *wrp, enum pwrap_regs reg) |
401 | { | 531 | { |
402 | return readl(wrp->base + wrp->regs[reg]); | 532 | return readl(wrp->base + wrp->master->regs[reg]); |
403 | } | 533 | } |
404 | 534 | ||
405 | static void pwrap_writel(struct pmic_wrapper *wrp, u32 val, enum pwrap_regs reg) | 535 | static void pwrap_writel(struct pmic_wrapper *wrp, u32 val, enum pwrap_regs reg) |
406 | { | 536 | { |
407 | writel(val, wrp->base + wrp->regs[reg]); | 537 | writel(val, wrp->base + wrp->master->regs[reg]); |
408 | } | 538 | } |
409 | 539 | ||
410 | static bool pwrap_is_fsm_idle(struct pmic_wrapper *wrp) | 540 | static bool pwrap_is_fsm_idle(struct pmic_wrapper *wrp) |
@@ -522,15 +652,15 @@ static int pwrap_reset_spislave(struct pmic_wrapper *wrp) | |||
522 | pwrap_writel(wrp, 1, PWRAP_MAN_EN); | 652 | pwrap_writel(wrp, 1, PWRAP_MAN_EN); |
523 | pwrap_writel(wrp, 0, PWRAP_DIO_EN); | 653 | pwrap_writel(wrp, 0, PWRAP_DIO_EN); |
524 | 654 | ||
525 | pwrap_writel(wrp, PWRAP_MAN_CMD_SPI_WRITE | PWRAP_MAN_CMD_OP_CSL, | 655 | pwrap_writel(wrp, wrp->master->spi_w | PWRAP_MAN_CMD_OP_CSL, |
526 | PWRAP_MAN_CMD); | 656 | PWRAP_MAN_CMD); |
527 | pwrap_writel(wrp, PWRAP_MAN_CMD_SPI_WRITE | PWRAP_MAN_CMD_OP_OUTS, | 657 | pwrap_writel(wrp, wrp->master->spi_w | PWRAP_MAN_CMD_OP_OUTS, |
528 | PWRAP_MAN_CMD); | 658 | PWRAP_MAN_CMD); |
529 | pwrap_writel(wrp, PWRAP_MAN_CMD_SPI_WRITE | PWRAP_MAN_CMD_OP_CSH, | 659 | pwrap_writel(wrp, wrp->master->spi_w | PWRAP_MAN_CMD_OP_CSH, |
530 | PWRAP_MAN_CMD); | 660 | PWRAP_MAN_CMD); |
531 | 661 | ||
532 | for (i = 0; i < 4; i++) | 662 | for (i = 0; i < 4; i++) |
533 | pwrap_writel(wrp, PWRAP_MAN_CMD_SPI_WRITE | PWRAP_MAN_CMD_OP_OUTS, | 663 | pwrap_writel(wrp, wrp->master->spi_w | PWRAP_MAN_CMD_OP_OUTS, |
534 | PWRAP_MAN_CMD); | 664 | PWRAP_MAN_CMD); |
535 | 665 | ||
536 | ret = pwrap_wait_for_state(wrp, pwrap_is_sync_idle); | 666 | ret = pwrap_wait_for_state(wrp, pwrap_is_sync_idle); |
@@ -562,7 +692,8 @@ static int pwrap_init_sidly(struct pmic_wrapper *wrp) | |||
562 | 692 | ||
563 | for (i = 0; i < 4; i++) { | 693 | for (i = 0; i < 4; i++) { |
564 | pwrap_writel(wrp, i, PWRAP_SIDLY); | 694 | pwrap_writel(wrp, i, PWRAP_SIDLY); |
565 | pwrap_read(wrp, PWRAP_DEW_READ_TEST, &rdata); | 695 | pwrap_read(wrp, wrp->slave->dew_regs[PWRAP_DEW_READ_TEST], |
696 | &rdata); | ||
566 | if (rdata == PWRAP_DEW_READ_TEST_VAL) { | 697 | if (rdata == PWRAP_DEW_READ_TEST_VAL) { |
567 | dev_dbg(wrp->dev, "[Read Test] pass, SIDLY=%x\n", i); | 698 | dev_dbg(wrp->dev, "[Read Test] pass, SIDLY=%x\n", i); |
568 | pass |= 1 << i; | 699 | pass |= 1 << i; |
@@ -580,19 +711,47 @@ static int pwrap_init_sidly(struct pmic_wrapper *wrp) | |||
580 | return 0; | 711 | return 0; |
581 | } | 712 | } |
582 | 713 | ||
583 | static int pwrap_init_reg_clock(struct pmic_wrapper *wrp) | 714 | static int pwrap_mt8135_init_reg_clock(struct pmic_wrapper *wrp) |
715 | { | ||
716 | pwrap_writel(wrp, 0x4, PWRAP_CSHEXT); | ||
717 | pwrap_writel(wrp, 0x0, PWRAP_CSHEXT_WRITE); | ||
718 | pwrap_writel(wrp, 0x4, PWRAP_CSHEXT_READ); | ||
719 | pwrap_writel(wrp, 0x0, PWRAP_CSLEXT_START); | ||
720 | pwrap_writel(wrp, 0x0, PWRAP_CSLEXT_END); | ||
721 | |||
722 | return 0; | ||
723 | } | ||
724 | |||
725 | static int pwrap_mt8173_init_reg_clock(struct pmic_wrapper *wrp) | ||
584 | { | 726 | { |
585 | if (pwrap_is_mt8135(wrp)) { | 727 | pwrap_writel(wrp, 0x0, PWRAP_CSHEXT_WRITE); |
586 | pwrap_writel(wrp, 0x4, PWRAP_CSHEXT); | 728 | pwrap_writel(wrp, 0x4, PWRAP_CSHEXT_READ); |
587 | pwrap_writel(wrp, 0x0, PWRAP_CSHEXT_WRITE); | 729 | pwrap_writel(wrp, 0x2, PWRAP_CSLEXT_START); |
588 | pwrap_writel(wrp, 0x4, PWRAP_CSHEXT_READ); | 730 | pwrap_writel(wrp, 0x2, PWRAP_CSLEXT_END); |
589 | pwrap_writel(wrp, 0x0, PWRAP_CSLEXT_START); | 731 | |
590 | pwrap_writel(wrp, 0x0, PWRAP_CSLEXT_END); | 732 | return 0; |
591 | } else { | 733 | } |
592 | pwrap_writel(wrp, 0x0, PWRAP_CSHEXT_WRITE); | 734 | |
593 | pwrap_writel(wrp, 0x4, PWRAP_CSHEXT_READ); | 735 | static int pwrap_mt2701_init_reg_clock(struct pmic_wrapper *wrp) |
736 | { | ||
737 | switch (wrp->slave->type) { | ||
738 | case PMIC_MT6397: | ||
739 | pwrap_writel(wrp, 0xc, PWRAP_RDDMY); | ||
740 | pwrap_writel(wrp, 0x4, PWRAP_CSHEXT_WRITE); | ||
741 | pwrap_writel(wrp, 0x0, PWRAP_CSHEXT_READ); | ||
742 | pwrap_writel(wrp, 0x2, PWRAP_CSLEXT_START); | ||
743 | pwrap_writel(wrp, 0x2, PWRAP_CSLEXT_END); | ||
744 | break; | ||
745 | |||
746 | case PMIC_MT6323: | ||
747 | pwrap_writel(wrp, 0x8, PWRAP_RDDMY); | ||
748 | pwrap_write(wrp, wrp->slave->dew_regs[PWRAP_DEW_RDDMY_NO], | ||
749 | 0x8); | ||
750 | pwrap_writel(wrp, 0x5, PWRAP_CSHEXT_WRITE); | ||
751 | pwrap_writel(wrp, 0x0, PWRAP_CSHEXT_READ); | ||
594 | pwrap_writel(wrp, 0x2, PWRAP_CSLEXT_START); | 752 | pwrap_writel(wrp, 0x2, PWRAP_CSLEXT_START); |
595 | pwrap_writel(wrp, 0x2, PWRAP_CSLEXT_END); | 753 | pwrap_writel(wrp, 0x2, PWRAP_CSLEXT_END); |
754 | break; | ||
596 | } | 755 | } |
597 | 756 | ||
598 | return 0; | 757 | return 0; |
@@ -608,7 +767,8 @@ static bool pwrap_is_pmic_cipher_ready(struct pmic_wrapper *wrp) | |||
608 | u32 rdata; | 767 | u32 rdata; |
609 | int ret; | 768 | int ret; |
610 | 769 | ||
611 | ret = pwrap_read(wrp, PWRAP_DEW_CIPHER_RDY, &rdata); | 770 | ret = pwrap_read(wrp, wrp->slave->dew_regs[PWRAP_DEW_CIPHER_RDY], |
771 | &rdata); | ||
612 | if (ret) | 772 | if (ret) |
613 | return 0; | 773 | return 0; |
614 | 774 | ||
@@ -625,20 +785,37 @@ static int pwrap_init_cipher(struct pmic_wrapper *wrp) | |||
625 | pwrap_writel(wrp, 0x1, PWRAP_CIPHER_KEY_SEL); | 785 | pwrap_writel(wrp, 0x1, PWRAP_CIPHER_KEY_SEL); |
626 | pwrap_writel(wrp, 0x2, PWRAP_CIPHER_IV_SEL); | 786 | pwrap_writel(wrp, 0x2, PWRAP_CIPHER_IV_SEL); |
627 | 787 | ||
628 | if (pwrap_is_mt8135(wrp)) { | 788 | switch (wrp->master->type) { |
789 | case PWRAP_MT8135: | ||
629 | pwrap_writel(wrp, 1, PWRAP_CIPHER_LOAD); | 790 | pwrap_writel(wrp, 1, PWRAP_CIPHER_LOAD); |
630 | pwrap_writel(wrp, 1, PWRAP_CIPHER_START); | 791 | pwrap_writel(wrp, 1, PWRAP_CIPHER_START); |
631 | } else { | 792 | break; |
793 | case PWRAP_MT2701: | ||
794 | case PWRAP_MT8173: | ||
632 | pwrap_writel(wrp, 1, PWRAP_CIPHER_EN); | 795 | pwrap_writel(wrp, 1, PWRAP_CIPHER_EN); |
796 | break; | ||
633 | } | 797 | } |
634 | 798 | ||
635 | /* Config cipher mode @PMIC */ | 799 | /* Config cipher mode @PMIC */ |
636 | pwrap_write(wrp, PWRAP_DEW_CIPHER_SWRST, 0x1); | 800 | pwrap_write(wrp, wrp->slave->dew_regs[PWRAP_DEW_CIPHER_SWRST], 0x1); |
637 | pwrap_write(wrp, PWRAP_DEW_CIPHER_SWRST, 0x0); | 801 | pwrap_write(wrp, wrp->slave->dew_regs[PWRAP_DEW_CIPHER_SWRST], 0x0); |
638 | pwrap_write(wrp, PWRAP_DEW_CIPHER_KEY_SEL, 0x1); | 802 | pwrap_write(wrp, wrp->slave->dew_regs[PWRAP_DEW_CIPHER_KEY_SEL], 0x1); |
639 | pwrap_write(wrp, PWRAP_DEW_CIPHER_IV_SEL, 0x2); | 803 | pwrap_write(wrp, wrp->slave->dew_regs[PWRAP_DEW_CIPHER_IV_SEL], 0x2); |
640 | pwrap_write(wrp, PWRAP_DEW_CIPHER_LOAD, 0x1); | 804 | pwrap_write(wrp, wrp->slave->dew_regs[PWRAP_DEW_CIPHER_LOAD], 0x1); |
641 | pwrap_write(wrp, PWRAP_DEW_CIPHER_START, 0x1); | 805 | pwrap_write(wrp, wrp->slave->dew_regs[PWRAP_DEW_CIPHER_START], 0x1); |
806 | |||
807 | switch (wrp->slave->type) { | ||
808 | case PMIC_MT6397: | ||
809 | pwrap_write(wrp, wrp->slave->dew_regs[PWRAP_DEW_CIPHER_LOAD], | ||
810 | 0x1); | ||
811 | pwrap_write(wrp, wrp->slave->dew_regs[PWRAP_DEW_CIPHER_START], | ||
812 | 0x1); | ||
813 | break; | ||
814 | case PMIC_MT6323: | ||
815 | pwrap_write(wrp, wrp->slave->dew_regs[PWRAP_DEW_CIPHER_EN], | ||
816 | 0x1); | ||
817 | break; | ||
818 | } | ||
642 | 819 | ||
643 | /* wait for cipher data ready@AP */ | 820 | /* wait for cipher data ready@AP */ |
644 | ret = pwrap_wait_for_state(wrp, pwrap_is_cipher_ready); | 821 | ret = pwrap_wait_for_state(wrp, pwrap_is_cipher_ready); |
@@ -655,7 +832,7 @@ static int pwrap_init_cipher(struct pmic_wrapper *wrp) | |||
655 | } | 832 | } |
656 | 833 | ||
657 | /* wait for cipher mode idle */ | 834 | /* wait for cipher mode idle */ |
658 | pwrap_write(wrp, PWRAP_DEW_CIPHER_MODE, 0x1); | 835 | pwrap_write(wrp, wrp->slave->dew_regs[PWRAP_DEW_CIPHER_MODE], 0x1); |
659 | ret = pwrap_wait_for_state(wrp, pwrap_is_fsm_idle_and_sync_idle); | 836 | ret = pwrap_wait_for_state(wrp, pwrap_is_fsm_idle_and_sync_idle); |
660 | if (ret) { | 837 | if (ret) { |
661 | dev_err(wrp->dev, "cipher mode idle fail, ret=%d\n", ret); | 838 | dev_err(wrp->dev, "cipher mode idle fail, ret=%d\n", ret); |
@@ -665,9 +842,11 @@ static int pwrap_init_cipher(struct pmic_wrapper *wrp) | |||
665 | pwrap_writel(wrp, 1, PWRAP_CIPHER_MODE); | 842 | pwrap_writel(wrp, 1, PWRAP_CIPHER_MODE); |
666 | 843 | ||
667 | /* Write Test */ | 844 | /* Write Test */ |
668 | if (pwrap_write(wrp, PWRAP_DEW_WRITE_TEST, PWRAP_DEW_WRITE_TEST_VAL) || | 845 | if (pwrap_write(wrp, wrp->slave->dew_regs[PWRAP_DEW_WRITE_TEST], |
669 | pwrap_read(wrp, PWRAP_DEW_WRITE_TEST, &rdata) || | 846 | PWRAP_DEW_WRITE_TEST_VAL) || |
670 | (rdata != PWRAP_DEW_WRITE_TEST_VAL)) { | 847 | pwrap_read(wrp, wrp->slave->dew_regs[PWRAP_DEW_WRITE_TEST], |
848 | &rdata) || | ||
849 | (rdata != PWRAP_DEW_WRITE_TEST_VAL)) { | ||
671 | dev_err(wrp->dev, "rdata=0x%04X\n", rdata); | 850 | dev_err(wrp->dev, "rdata=0x%04X\n", rdata); |
672 | return -EFAULT; | 851 | return -EFAULT; |
673 | } | 852 | } |
@@ -675,6 +854,63 @@ static int pwrap_init_cipher(struct pmic_wrapper *wrp) | |||
675 | return 0; | 854 | return 0; |
676 | } | 855 | } |
677 | 856 | ||
857 | static int pwrap_mt8135_init_soc_specific(struct pmic_wrapper *wrp) | ||
858 | { | ||
859 | /* enable pwrap events and pwrap bridge in AP side */ | ||
860 | pwrap_writel(wrp, 0x1, PWRAP_EVENT_IN_EN); | ||
861 | pwrap_writel(wrp, 0xffff, PWRAP_EVENT_DST_EN); | ||
862 | writel(0x7f, wrp->bridge_base + PWRAP_MT8135_BRIDGE_IORD_ARB_EN); | ||
863 | writel(0x1, wrp->bridge_base + PWRAP_MT8135_BRIDGE_WACS3_EN); | ||
864 | writel(0x1, wrp->bridge_base + PWRAP_MT8135_BRIDGE_WACS4_EN); | ||
865 | writel(0x1, wrp->bridge_base + PWRAP_MT8135_BRIDGE_WDT_UNIT); | ||
866 | writel(0xffff, wrp->bridge_base + PWRAP_MT8135_BRIDGE_WDT_SRC_EN); | ||
867 | writel(0x1, wrp->bridge_base + PWRAP_MT8135_BRIDGE_TIMER_EN); | ||
868 | writel(0x7ff, wrp->bridge_base + PWRAP_MT8135_BRIDGE_INT_EN); | ||
869 | |||
870 | /* enable PMIC event out and sources */ | ||
871 | if (pwrap_write(wrp, wrp->slave->dew_regs[PWRAP_DEW_EVENT_OUT_EN], | ||
872 | 0x1) || | ||
873 | pwrap_write(wrp, wrp->slave->dew_regs[PWRAP_DEW_EVENT_SRC_EN], | ||
874 | 0xffff)) { | ||
875 | dev_err(wrp->dev, "enable dewrap fail\n"); | ||
876 | return -EFAULT; | ||
877 | } | ||
878 | |||
879 | return 0; | ||
880 | } | ||
881 | |||
882 | static int pwrap_mt8173_init_soc_specific(struct pmic_wrapper *wrp) | ||
883 | { | ||
884 | /* PMIC_DEWRAP enables */ | ||
885 | if (pwrap_write(wrp, wrp->slave->dew_regs[PWRAP_DEW_EVENT_OUT_EN], | ||
886 | 0x1) || | ||
887 | pwrap_write(wrp, wrp->slave->dew_regs[PWRAP_DEW_EVENT_SRC_EN], | ||
888 | 0xffff)) { | ||
889 | dev_err(wrp->dev, "enable dewrap fail\n"); | ||
890 | return -EFAULT; | ||
891 | } | ||
892 | |||
893 | return 0; | ||
894 | } | ||
895 | |||
896 | static int pwrap_mt2701_init_soc_specific(struct pmic_wrapper *wrp) | ||
897 | { | ||
898 | /* GPS_INTF initialization */ | ||
899 | switch (wrp->slave->type) { | ||
900 | case PMIC_MT6323: | ||
901 | pwrap_writel(wrp, 0x076c, PWRAP_ADC_CMD_ADDR); | ||
902 | pwrap_writel(wrp, 0x8000, PWRAP_PWRAP_ADC_CMD); | ||
903 | pwrap_writel(wrp, 0x072c, PWRAP_ADC_RDY_ADDR); | ||
904 | pwrap_writel(wrp, 0x072e, PWRAP_ADC_RDATA_ADDR1); | ||
905 | pwrap_writel(wrp, 0x0730, PWRAP_ADC_RDATA_ADDR2); | ||
906 | break; | ||
907 | default: | ||
908 | break; | ||
909 | } | ||
910 | |||
911 | return 0; | ||
912 | } | ||
913 | |||
678 | static int pwrap_init(struct pmic_wrapper *wrp) | 914 | static int pwrap_init(struct pmic_wrapper *wrp) |
679 | { | 915 | { |
680 | int ret; | 916 | int ret; |
@@ -684,7 +920,7 @@ static int pwrap_init(struct pmic_wrapper *wrp) | |||
684 | if (wrp->rstc_bridge) | 920 | if (wrp->rstc_bridge) |
685 | reset_control_reset(wrp->rstc_bridge); | 921 | reset_control_reset(wrp->rstc_bridge); |
686 | 922 | ||
687 | if (pwrap_is_mt8173(wrp)) { | 923 | if (wrp->master->type == PWRAP_MT8173) { |
688 | /* Enable DCM */ | 924 | /* Enable DCM */ |
689 | pwrap_writel(wrp, 3, PWRAP_DCM_EN); | 925 | pwrap_writel(wrp, 3, PWRAP_DCM_EN); |
690 | pwrap_writel(wrp, 0, PWRAP_DCM_DBC_PRD); | 926 | pwrap_writel(wrp, 0, PWRAP_DCM_DBC_PRD); |
@@ -697,11 +933,11 @@ static int pwrap_init(struct pmic_wrapper *wrp) | |||
697 | 933 | ||
698 | pwrap_writel(wrp, 1, PWRAP_WRAP_EN); | 934 | pwrap_writel(wrp, 1, PWRAP_WRAP_EN); |
699 | 935 | ||
700 | pwrap_writel(wrp, wrp->arb_en_all, PWRAP_HIPRIO_ARB_EN); | 936 | pwrap_writel(wrp, wrp->master->arb_en_all, PWRAP_HIPRIO_ARB_EN); |
701 | 937 | ||
702 | pwrap_writel(wrp, 1, PWRAP_WACS2_EN); | 938 | pwrap_writel(wrp, 1, PWRAP_WACS2_EN); |
703 | 939 | ||
704 | ret = pwrap_init_reg_clock(wrp); | 940 | ret = wrp->master->init_reg_clock(wrp); |
705 | if (ret) | 941 | if (ret) |
706 | return ret; | 942 | return ret; |
707 | 943 | ||
@@ -711,7 +947,7 @@ static int pwrap_init(struct pmic_wrapper *wrp) | |||
711 | return ret; | 947 | return ret; |
712 | 948 | ||
713 | /* Enable dual IO mode */ | 949 | /* Enable dual IO mode */ |
714 | pwrap_write(wrp, PWRAP_DEW_DIO_EN, 1); | 950 | pwrap_write(wrp, wrp->slave->dew_regs[PWRAP_DEW_DIO_EN], 1); |
715 | 951 | ||
716 | /* Check IDLE & INIT_DONE in advance */ | 952 | /* Check IDLE & INIT_DONE in advance */ |
717 | ret = pwrap_wait_for_state(wrp, pwrap_is_fsm_idle_and_sync_idle); | 953 | ret = pwrap_wait_for_state(wrp, pwrap_is_fsm_idle_and_sync_idle); |
@@ -723,7 +959,7 @@ static int pwrap_init(struct pmic_wrapper *wrp) | |||
723 | pwrap_writel(wrp, 1, PWRAP_DIO_EN); | 959 | pwrap_writel(wrp, 1, PWRAP_DIO_EN); |
724 | 960 | ||
725 | /* Read Test */ | 961 | /* Read Test */ |
726 | pwrap_read(wrp, PWRAP_DEW_READ_TEST, &rdata); | 962 | pwrap_read(wrp, wrp->slave->dew_regs[PWRAP_DEW_READ_TEST], &rdata); |
727 | if (rdata != PWRAP_DEW_READ_TEST_VAL) { | 963 | if (rdata != PWRAP_DEW_READ_TEST_VAL) { |
728 | dev_err(wrp->dev, "Read test failed after switch to DIO mode: 0x%04x != 0x%04x\n", | 964 | dev_err(wrp->dev, "Read test failed after switch to DIO mode: 0x%04x != 0x%04x\n", |
729 | PWRAP_DEW_READ_TEST_VAL, rdata); | 965 | PWRAP_DEW_READ_TEST_VAL, rdata); |
@@ -736,15 +972,16 @@ static int pwrap_init(struct pmic_wrapper *wrp) | |||
736 | return ret; | 972 | return ret; |
737 | 973 | ||
738 | /* Signature checking - using CRC */ | 974 | /* Signature checking - using CRC */ |
739 | if (pwrap_write(wrp, PWRAP_DEW_CRC_EN, 0x1)) | 975 | if (pwrap_write(wrp, wrp->slave->dew_regs[PWRAP_DEW_CRC_EN], 0x1)) |
740 | return -EFAULT; | 976 | return -EFAULT; |
741 | 977 | ||
742 | pwrap_writel(wrp, 0x1, PWRAP_CRC_EN); | 978 | pwrap_writel(wrp, 0x1, PWRAP_CRC_EN); |
743 | pwrap_writel(wrp, 0x0, PWRAP_SIG_MODE); | 979 | pwrap_writel(wrp, 0x0, PWRAP_SIG_MODE); |
744 | pwrap_writel(wrp, PWRAP_DEW_CRC_VAL, PWRAP_SIG_ADR); | 980 | pwrap_writel(wrp, wrp->slave->dew_regs[PWRAP_DEW_CRC_VAL], |
745 | pwrap_writel(wrp, wrp->arb_en_all, PWRAP_HIPRIO_ARB_EN); | 981 | PWRAP_SIG_ADR); |
982 | pwrap_writel(wrp, wrp->master->arb_en_all, PWRAP_HIPRIO_ARB_EN); | ||
746 | 983 | ||
747 | if (pwrap_is_mt8135(wrp)) | 984 | if (wrp->master->type == PWRAP_MT8135) |
748 | pwrap_writel(wrp, 0x7, PWRAP_RRARB_EN); | 985 | pwrap_writel(wrp, 0x7, PWRAP_RRARB_EN); |
749 | 986 | ||
750 | pwrap_writel(wrp, 0x1, PWRAP_WACS0_EN); | 987 | pwrap_writel(wrp, 0x1, PWRAP_WACS0_EN); |
@@ -753,31 +990,10 @@ static int pwrap_init(struct pmic_wrapper *wrp) | |||
753 | pwrap_writel(wrp, 0x5, PWRAP_STAUPD_PRD); | 990 | pwrap_writel(wrp, 0x5, PWRAP_STAUPD_PRD); |
754 | pwrap_writel(wrp, 0xff, PWRAP_STAUPD_GRPEN); | 991 | pwrap_writel(wrp, 0xff, PWRAP_STAUPD_GRPEN); |
755 | 992 | ||
756 | if (pwrap_is_mt8135(wrp)) { | 993 | if (wrp->master->init_soc_specific) { |
757 | /* enable pwrap events and pwrap bridge in AP side */ | 994 | ret = wrp->master->init_soc_specific(wrp); |
758 | pwrap_writel(wrp, 0x1, PWRAP_EVENT_IN_EN); | 995 | if (ret) |
759 | pwrap_writel(wrp, 0xffff, PWRAP_EVENT_DST_EN); | 996 | return ret; |
760 | writel(0x7f, wrp->bridge_base + PWRAP_MT8135_BRIDGE_IORD_ARB_EN); | ||
761 | writel(0x1, wrp->bridge_base + PWRAP_MT8135_BRIDGE_WACS3_EN); | ||
762 | writel(0x1, wrp->bridge_base + PWRAP_MT8135_BRIDGE_WACS4_EN); | ||
763 | writel(0x1, wrp->bridge_base + PWRAP_MT8135_BRIDGE_WDT_UNIT); | ||
764 | writel(0xffff, wrp->bridge_base + PWRAP_MT8135_BRIDGE_WDT_SRC_EN); | ||
765 | writel(0x1, wrp->bridge_base + PWRAP_MT8135_BRIDGE_TIMER_EN); | ||
766 | writel(0x7ff, wrp->bridge_base + PWRAP_MT8135_BRIDGE_INT_EN); | ||
767 | |||
768 | /* enable PMIC event out and sources */ | ||
769 | if (pwrap_write(wrp, PWRAP_DEW_EVENT_OUT_EN, 0x1) || | ||
770 | pwrap_write(wrp, PWRAP_DEW_EVENT_SRC_EN, 0xffff)) { | ||
771 | dev_err(wrp->dev, "enable dewrap fail\n"); | ||
772 | return -EFAULT; | ||
773 | } | ||
774 | } else { | ||
775 | /* PMIC_DEWRAP enables */ | ||
776 | if (pwrap_write(wrp, PWRAP_DEW_EVENT_OUT_EN, 0x1) || | ||
777 | pwrap_write(wrp, PWRAP_DEW_EVENT_SRC_EN, 0xffff)) { | ||
778 | dev_err(wrp->dev, "enable dewrap fail\n"); | ||
779 | return -EFAULT; | ||
780 | } | ||
781 | } | 997 | } |
782 | 998 | ||
783 | /* Setup the init done registers */ | 999 | /* Setup the init done registers */ |
@@ -785,7 +1001,7 @@ static int pwrap_init(struct pmic_wrapper *wrp) | |||
785 | pwrap_writel(wrp, 1, PWRAP_INIT_DONE0); | 1001 | pwrap_writel(wrp, 1, PWRAP_INIT_DONE0); |
786 | pwrap_writel(wrp, 1, PWRAP_INIT_DONE1); | 1002 | pwrap_writel(wrp, 1, PWRAP_INIT_DONE1); |
787 | 1003 | ||
788 | if (pwrap_is_mt8135(wrp)) { | 1004 | if (wrp->master->has_bridge) { |
789 | writel(1, wrp->bridge_base + PWRAP_MT8135_BRIDGE_INIT_DONE3); | 1005 | writel(1, wrp->bridge_base + PWRAP_MT8135_BRIDGE_INIT_DONE3); |
790 | writel(1, wrp->bridge_base + PWRAP_MT8135_BRIDGE_INIT_DONE4); | 1006 | writel(1, wrp->bridge_base + PWRAP_MT8135_BRIDGE_INIT_DONE4); |
791 | } | 1007 | } |
@@ -816,8 +1032,70 @@ static const struct regmap_config pwrap_regmap_config = { | |||
816 | .max_register = 0xffff, | 1032 | .max_register = 0xffff, |
817 | }; | 1033 | }; |
818 | 1034 | ||
1035 | static const struct pwrap_slv_type pmic_mt6323 = { | ||
1036 | .dew_regs = mt6323_regs, | ||
1037 | .type = PMIC_MT6323, | ||
1038 | }; | ||
1039 | |||
1040 | static const struct pwrap_slv_type pmic_mt6397 = { | ||
1041 | .dew_regs = mt6397_regs, | ||
1042 | .type = PMIC_MT6397, | ||
1043 | }; | ||
1044 | |||
1045 | static const struct of_device_id of_slave_match_tbl[] = { | ||
1046 | { | ||
1047 | .compatible = "mediatek,mt6323", | ||
1048 | .data = &pmic_mt6323, | ||
1049 | }, { | ||
1050 | .compatible = "mediatek,mt6397", | ||
1051 | .data = &pmic_mt6397, | ||
1052 | }, { | ||
1053 | /* sentinel */ | ||
1054 | } | ||
1055 | }; | ||
1056 | MODULE_DEVICE_TABLE(of, of_slave_match_tbl); | ||
1057 | |||
1058 | static const struct pmic_wrapper_type pwrap_mt2701 = { | ||
1059 | .regs = mt2701_regs, | ||
1060 | .type = PWRAP_MT2701, | ||
1061 | .arb_en_all = 0x3f, | ||
1062 | .int_en_all = ~(BIT(31) | BIT(2)), | ||
1063 | .spi_w = PWRAP_MAN_CMD_SPI_WRITE_NEW, | ||
1064 | .wdt_src = PWRAP_WDT_SRC_MASK_ALL, | ||
1065 | .has_bridge = 0, | ||
1066 | .init_reg_clock = pwrap_mt2701_init_reg_clock, | ||
1067 | .init_soc_specific = pwrap_mt2701_init_soc_specific, | ||
1068 | }; | ||
1069 | |||
1070 | static struct pmic_wrapper_type pwrap_mt8135 = { | ||
1071 | .regs = mt8135_regs, | ||
1072 | .type = PWRAP_MT8135, | ||
1073 | .arb_en_all = 0x1ff, | ||
1074 | .int_en_all = ~(BIT(31) | BIT(1)), | ||
1075 | .spi_w = PWRAP_MAN_CMD_SPI_WRITE, | ||
1076 | .wdt_src = PWRAP_WDT_SRC_MASK_ALL, | ||
1077 | .has_bridge = 1, | ||
1078 | .init_reg_clock = pwrap_mt8135_init_reg_clock, | ||
1079 | .init_soc_specific = pwrap_mt8135_init_soc_specific, | ||
1080 | }; | ||
1081 | |||
1082 | static struct pmic_wrapper_type pwrap_mt8173 = { | ||
1083 | .regs = mt8173_regs, | ||
1084 | .type = PWRAP_MT8173, | ||
1085 | .arb_en_all = 0x3f, | ||
1086 | .int_en_all = ~(BIT(31) | BIT(1)), | ||
1087 | .spi_w = PWRAP_MAN_CMD_SPI_WRITE, | ||
1088 | .wdt_src = PWRAP_WDT_SRC_MASK_NO_STAUPD, | ||
1089 | .has_bridge = 0, | ||
1090 | .init_reg_clock = pwrap_mt8173_init_reg_clock, | ||
1091 | .init_soc_specific = pwrap_mt8173_init_soc_specific, | ||
1092 | }; | ||
1093 | |||
819 | static struct of_device_id of_pwrap_match_tbl[] = { | 1094 | static struct of_device_id of_pwrap_match_tbl[] = { |
820 | { | 1095 | { |
1096 | .compatible = "mediatek,mt2701-pwrap", | ||
1097 | .data = &pwrap_mt2701, | ||
1098 | }, { | ||
821 | .compatible = "mediatek,mt8135-pwrap", | 1099 | .compatible = "mediatek,mt8135-pwrap", |
822 | .data = &pwrap_mt8135, | 1100 | .data = &pwrap_mt8135, |
823 | }, { | 1101 | }, { |
@@ -831,24 +1109,30 @@ MODULE_DEVICE_TABLE(of, of_pwrap_match_tbl); | |||
831 | 1109 | ||
832 | static int pwrap_probe(struct platform_device *pdev) | 1110 | static int pwrap_probe(struct platform_device *pdev) |
833 | { | 1111 | { |
834 | int ret, irq, wdt_src; | 1112 | int ret, irq; |
835 | struct pmic_wrapper *wrp; | 1113 | struct pmic_wrapper *wrp; |
836 | struct device_node *np = pdev->dev.of_node; | 1114 | struct device_node *np = pdev->dev.of_node; |
837 | const struct of_device_id *of_id = | 1115 | const struct of_device_id *of_id = |
838 | of_match_device(of_pwrap_match_tbl, &pdev->dev); | 1116 | of_match_device(of_pwrap_match_tbl, &pdev->dev); |
839 | const struct pmic_wrapper_type *type; | 1117 | const struct of_device_id *of_slave_id = NULL; |
840 | struct resource *res; | 1118 | struct resource *res; |
841 | 1119 | ||
1120 | if (pdev->dev.of_node->child) | ||
1121 | of_slave_id = of_match_node(of_slave_match_tbl, | ||
1122 | pdev->dev.of_node->child); | ||
1123 | if (!of_slave_id) { | ||
1124 | dev_dbg(&pdev->dev, "slave pmic should be defined in dts\n"); | ||
1125 | return -EINVAL; | ||
1126 | } | ||
1127 | |||
842 | wrp = devm_kzalloc(&pdev->dev, sizeof(*wrp), GFP_KERNEL); | 1128 | wrp = devm_kzalloc(&pdev->dev, sizeof(*wrp), GFP_KERNEL); |
843 | if (!wrp) | 1129 | if (!wrp) |
844 | return -ENOMEM; | 1130 | return -ENOMEM; |
845 | 1131 | ||
846 | platform_set_drvdata(pdev, wrp); | 1132 | platform_set_drvdata(pdev, wrp); |
847 | 1133 | ||
848 | type = of_id->data; | 1134 | wrp->master = of_id->data; |
849 | wrp->regs = type->regs; | 1135 | wrp->slave = of_slave_id->data; |
850 | wrp->type = type->type; | ||
851 | wrp->arb_en_all = type->arb_en_all; | ||
852 | wrp->dev = &pdev->dev; | 1136 | wrp->dev = &pdev->dev; |
853 | 1137 | ||
854 | res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "pwrap"); | 1138 | res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "pwrap"); |
@@ -863,7 +1147,7 @@ static int pwrap_probe(struct platform_device *pdev) | |||
863 | return ret; | 1147 | return ret; |
864 | } | 1148 | } |
865 | 1149 | ||
866 | if (pwrap_is_mt8135(wrp)) { | 1150 | if (wrp->master->has_bridge) { |
867 | res = platform_get_resource_byname(pdev, IORESOURCE_MEM, | 1151 | res = platform_get_resource_byname(pdev, IORESOURCE_MEM, |
868 | "pwrap-bridge"); | 1152 | "pwrap-bridge"); |
869 | wrp->bridge_base = devm_ioremap_resource(wrp->dev, res); | 1153 | wrp->bridge_base = devm_ioremap_resource(wrp->dev, res); |
@@ -925,11 +1209,9 @@ static int pwrap_probe(struct platform_device *pdev) | |||
925 | * Since STAUPD was not used on mt8173 platform, | 1209 | * Since STAUPD was not used on mt8173 platform, |
926 | * so STAUPD of WDT_SRC which should be turned off | 1210 | * so STAUPD of WDT_SRC which should be turned off |
927 | */ | 1211 | */ |
928 | wdt_src = pwrap_is_mt8173(wrp) ? | 1212 | pwrap_writel(wrp, wrp->master->wdt_src, PWRAP_WDT_SRC_EN); |
929 | PWRAP_WDT_SRC_MASK_NO_STAUPD : PWRAP_WDT_SRC_MASK_ALL; | ||
930 | pwrap_writel(wrp, wdt_src, PWRAP_WDT_SRC_EN); | ||
931 | pwrap_writel(wrp, 0x1, PWRAP_TIMER_EN); | 1213 | pwrap_writel(wrp, 0x1, PWRAP_TIMER_EN); |
932 | pwrap_writel(wrp, ~((1 << 31) | (1 << 1)), PWRAP_INT_EN); | 1214 | pwrap_writel(wrp, wrp->master->int_en_all, PWRAP_INT_EN); |
933 | 1215 | ||
934 | irq = platform_get_irq(pdev, 0); | 1216 | irq = platform_get_irq(pdev, 0); |
935 | ret = devm_request_irq(wrp->dev, irq, pwrap_interrupt, IRQF_TRIGGER_HIGH, | 1217 | ret = devm_request_irq(wrp->dev, irq, pwrap_interrupt, IRQF_TRIGGER_HIGH, |