aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/soc/mediatek
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2016-05-18 16:14:02 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2016-05-18 16:14:02 -0400
commit4a5219edcdae52bfb5eea0dfc2a7bd575961dad7 (patch)
tree863f6efeac5fe9ba4f1f8d23b32b2947130ed510 /drivers/soc/mediatek
parent9797f6b0504122e4ad9ff047a3d0521ad6706386 (diff)
parent5420f9fd159761b88978c312c3b350546f8615bb (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.c544
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 74enum 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
103static 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
120static 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
100enum pwrap_regs { 143enum 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
247static 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
197static int mt8173_regs[] = { 333static 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
488enum pmic_type {
489 PMIC_MT6323,
490 PMIC_MT6397,
491};
492
352enum pwrap_type { 493enum pwrap_type {
494 PWRAP_MT2701,
353 PWRAP_MT8135, 495 PWRAP_MT8135,
354 PWRAP_MT8173, 496 PWRAP_MT8173,
355}; 497};
356 498
357struct pmic_wrapper_type { 499struct 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
363static struct pmic_wrapper_type pwrap_mt8135 = {
364 .regs = mt8135_regs,
365 .type = PWRAP_MT8135,
366 .arb_en_all = 0x1ff,
367};
368
369static struct pmic_wrapper_type pwrap_mt8173 = {
370 .regs = mt8173_regs,
371 .type = PWRAP_MT8173,
372 .arb_en_all = 0x3f,
373}; 502};
374 503
375struct pmic_wrapper { 504struct 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
390static inline int pwrap_is_mt8135(struct pmic_wrapper *wrp) 518struct 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;
395static 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
400static u32 pwrap_readl(struct pmic_wrapper *wrp, enum pwrap_regs reg) 530static 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
405static void pwrap_writel(struct pmic_wrapper *wrp, u32 val, enum pwrap_regs reg) 535static 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
410static bool pwrap_is_fsm_idle(struct pmic_wrapper *wrp) 540static 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
583static int pwrap_init_reg_clock(struct pmic_wrapper *wrp) 714static 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
725static 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); 735static 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
857static 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
882static 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
896static 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
678static int pwrap_init(struct pmic_wrapper *wrp) 914static 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
1035static const struct pwrap_slv_type pmic_mt6323 = {
1036 .dew_regs = mt6323_regs,
1037 .type = PMIC_MT6323,
1038};
1039
1040static const struct pwrap_slv_type pmic_mt6397 = {
1041 .dew_regs = mt6397_regs,
1042 .type = PMIC_MT6397,
1043};
1044
1045static 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};
1056MODULE_DEVICE_TABLE(of, of_slave_match_tbl);
1057
1058static 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
1070static 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
1082static 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
819static struct of_device_id of_pwrap_match_tbl[] = { 1094static 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
832static int pwrap_probe(struct platform_device *pdev) 1110static 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,