1 /*
2 * Copyright (c) 2025, Mediatek Inc. All rights reserved.
3 * SPDX-License-Identifier: BSD-3-Clause
4 */
5
6 #include <errno.h>
7
8 #include <common/debug.h>
9 #include <lib/mmio.h>
10
11 #include "../mt6359p/registers.h"
12 #include <drivers/pmic/pmic_shutdown_cfg.h>
13 #include <drivers/spmi/spmi_common.h>
14 #include <drivers/spmi_api.h>
15 #include <lib/mtk_init/mtk_init.h>
16 #include <pmic_wrap_init_common.h>
17
18 #define MT6319_RG_SEQ_OFF 0x2d
19 #define MT6319_TOP_RST_MISC_CLR 0x128
20 #define MT6319_TOP_DIG_WPK_H 0x3a9
21 #define MT6319_TOP_DIG_WPK_H_MASK 0xFF
22 #define MT6319_TOP_DIG_WPK_H_SHIFT 0
23 #define MT6319_TOP_DIG_WPK 0x3a8
24 #define MT6319_TOP_DIG_WPK_MASK 0xFF
25 #define MT6319_TOP_DIG_WPK_SHIFT 0
26
27
pmic_shutdown_cfg(void)28 int pmic_shutdown_cfg(void)
29 {
30 /*
31 * In mt8189, the pmic_shutdown_cfg() api does not need to read and write the
32 * pmic register to determine the return value and in order not to modify the
33 * common code to affect other ICs, the pmic_shutdown_cfg() will directly
34 * return 1.
35 */
36 return 1;
37 }
38
shutdown_slave_dev(struct spmi_device * dev)39 static void shutdown_slave_dev(struct spmi_device *dev)
40 {
41 spmi_ext_register_writel_field(dev, MT6319_TOP_DIG_WPK_H, 0x63,
42 MT6319_TOP_DIG_WPK_H_MASK,
43 MT6319_TOP_DIG_WPK_H_SHIFT);
44 spmi_ext_register_writel_field(dev, MT6319_TOP_DIG_WPK, 0x15,
45 MT6319_TOP_DIG_WPK_MASK,
46 MT6319_TOP_DIG_WPK_SHIFT);
47
48 /* Disable WDTRSTB_EN */
49 spmi_ext_register_writel_field(dev, MT6319_TOP_RST_MISC_CLR, 1, 0x1, 0);
50 /* Normal sequence power off when PAD_EN falling */
51 spmi_ext_register_writel_field(dev, MT6319_RG_SEQ_OFF, 1, 0x1, 0);
52
53 spmi_ext_register_writel_field(dev, MT6319_TOP_DIG_WPK_H, 0,
54 MT6319_TOP_DIG_WPK_H_MASK,
55 MT6319_TOP_DIG_WPK_H_SHIFT);
56 spmi_ext_register_writel_field(dev, MT6319_TOP_DIG_WPK, 0,
57 MT6319_TOP_DIG_WPK_MASK,
58 MT6319_TOP_DIG_WPK_SHIFT);
59
60 }
61
spmi_shutdown(void)62 int spmi_shutdown(void)
63 {
64 struct spmi_device *mt6319_sdev;
65
66 mt6319_sdev = get_spmi_device(SPMI_MASTER_P_1, SPMI_SLAVE_7);
67 if (!mt6319_sdev)
68 return -ENODEV;
69 shutdown_slave_dev(mt6319_sdev);
70
71 if (mmio_read_32((uintptr_t)CHIP_ID_REG) == MTK_CPU_ID_MT8189 &&
72 mmio_read_32((uintptr_t)CPU_SEG_ID_REG) == MTK_CPU_SEG_ID_MT8189H) {
73 mt6319_sdev = get_spmi_device(SPMI_MASTER_P_1, SPMI_SLAVE_8);
74 if (!mt6319_sdev)
75 return -ENODEV;
76 shutdown_slave_dev(mt6319_sdev);
77 }
78
79 /* clear main pmic power hold */
80 pwrap_write_field(MT6359P_PPCCTL0, 0, 0x1, 0);
81
82 return 0;
83 }
84