summaryrefslogtreecommitdiff
path: root/drivers/power/domain/mtk-power-domain.h
blob: 5bf0ca850ec352b3194e4b398ac9ab8fa7819a73 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
/* SPDX-License-Identifier: GPL-2.0 */
/*
 * Copyright (C) 2018 MediaTek Inc.
 * Copyright (C) 2026 BayLibre, SAS
 * Author: Ryder Lee <[email protected]>
 *         Julien Stephan <[email protected]>
 */

#ifndef __MTK_POWER_DOMAIN_H
#define __MTK_POWER_DOMAIN_H

#include <clk.h>
#include <power-domain-uclass.h>
#include <linux/bitops.h>
#include <linux/compiler.h>
#include <linux/kernel.h>
#include <linux/types.h>

struct udevice;

#define SPM_EN			(0xb16 << 16 | 0x1)
#define SPM_VDE_PWR_CON		0x0210
#define SPM_MFG_PWR_CON		0x0214
#define SPM_ISP_PWR_CON		0x0238
#define SPM_DIS_PWR_CON		0x023c
#define SPM_CONN_PWR_CON	0x0280
#define SPM_BDP_PWR_CON		0x029c
#define SPM_ETH_PWR_CON		0x02a0
#define SPM_HIF_PWR_CON		0x02a4
#define SPM_IFR_MSC_PWR_CON	0x02a8
#define SPM_ETHSYS_PWR_CON	0x2e0
#define SPM_HIF0_PWR_CON	0x2e4
#define SPM_HIF1_PWR_CON	0x2e8
#define SPM_PWR_STATUS		0x60c
#define SPM_PWR_STATUS_2ND	0x610

#define PWR_RST_B_BIT		BIT(0)
#define PWR_ISO_BIT		BIT(1)
#define PWR_ON_BIT		BIT(2)
#define PWR_ON_2ND_BIT		BIT(3)
#define PWR_CLK_DIS_BIT		BIT(4)

#define PWR_STATUS_CONN		BIT(1)
#define PWR_STATUS_DISP		BIT(3)
#define PWR_STATUS_MFG		BIT(4)
#define PWR_STATUS_ISP		BIT(5)
#define PWR_STATUS_VDEC		BIT(7)
#define PWR_STATUS_BDP		BIT(14)
#define PWR_STATUS_ETH		BIT(15)
#define PWR_STATUS_HIF		BIT(16)
#define PWR_STATUS_IFR_MSC	BIT(17)
#define PWR_STATUS_ETHSYS	BIT(24)
#define PWR_STATUS_HIF0		BIT(25)
#define PWR_STATUS_HIF1		BIT(26)

/* Infrasys configuration */
#define INFRA_TOPDCM_CTRL	0x10
#define INFRA_TOPAXI_PROT_EN	0x220
#define INFRA_TOPAXI_PROT_STA1	0x228

#define DCM_TOP_EN		BIT(0)

#define SPM_MAX_BUS_PROT_DATA	6

struct mtk_scp_domain;

struct mtk_scpsys_bus_prot_data {
	u32 bus_prot_mask;
	u32 bus_prot_set;
	u32 bus_prot_clr;
	u32 bus_prot_sta;
	bool bus_prot_reg_update;
	bool ignore_clr_ack;
};

struct mtk_scp_domain_data {
	u32 sta_mask;
	int ctl_offs;
	u32 sram_pdn_bits;
	u32 sram_pdn_ack_bits;
	u32 bus_prot_mask;
	const struct mtk_scpsys_bus_prot_data bp_infracfg[SPM_MAX_BUS_PROT_DATA];
	int pwr_sta_offs;
	int pwr_sta2nd_offs;
};

struct mtk_scp_soc_data {
	const struct mtk_scp_domain_data *data;
	int num_domains;
};

#define MTK_SCP_SOC_DATA(_name, _domains)			\
static const struct mtk_scp_soc_data _name##_scp_soc_data = {	\
	.data = _domains,					\
	.num_domains = ARRAY_SIZE(_domains),			\
}

struct mtk_scp_domain {
	const struct mtk_scp_domain_data *data;
	void __iomem *infracfg;
	struct clk_bulk clks;
	struct clk_bulk subsys_clks;
	bool has_pd;
	struct power_domain parent_pd;
};

struct mtk_scpsys {
	void __iomem *base;
	void __iomem *infracfg;
	const struct mtk_scp_soc_data *soc_data;
	struct mtk_scp_domain *domains;
};

#define _BUS_PROT(_mask, _set, _clr, _sta, _update, _ignore) {	\
	.bus_prot_mask = (_mask),				\
	.bus_prot_set = (_set),					\
	.bus_prot_clr = (_clr),					\
	.bus_prot_sta = (_sta),					\
	.bus_prot_reg_update = (_update),			\
	.ignore_clr_ack = (_ignore),				\
}

#define BUS_PROT_WR(_mask, _set, _clr, _sta)			\
	_BUS_PROT(_mask, _set, _clr, _sta, false, false)

int mtk_scpsys_probe(struct udevice *dev);
int mtk_power_controller_probe(struct udevice *dev);

extern const struct power_domain_ops mtk_power_domain_ops;

#endif /* __MTK_POWER_DOMAIN_H */