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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
|
// SPDX-License-Identifier: GPL-2.0
/*
* RZ/V2H System controller (SYS) driver
*
* Copyright (C) 2025 Renesas Electronics Corp.
*/
#include <linux/bitfield.h>
#include <linux/bits.h>
#include <linux/device.h>
#include <linux/init.h>
#include <linux/io.h>
#include "rz-sysc.h"
/* Register Offsets */
#define SYS_LSI_MODE 0x300
/*
* BOOTPLLCA[1:0]
* [0,0] => 1.1GHZ
* [0,1] => 1.5GHZ
* [1,0] => 1.6GHZ
* [1,1] => 1.7GHZ
*/
#define SYS_LSI_MODE_STAT_BOOTPLLCA55 GENMASK(12, 11)
#define SYS_LSI_MODE_CA55_1_7GHZ 0x3
#define SYS_LSI_PRR 0x308
#define SYS_LSI_PRR_GPU_DIS BIT(0)
#define SYS_LSI_PRR_ISP_DIS BIT(4)
#define SYS_LSI_OTPTSU0TRMVAL0 0x320
#define SYS_LSI_OTPTSU0TRMVAL1 0x324
#define SYS_LSI_OTPTSU1TRMVAL0 0x330
#define SYS_LSI_OTPTSU1TRMVAL1 0x334
#define SYS_GBETH0_CFG 0xf00
#define SYS_GBETH1_CFG 0xf04
#define SYS_PCIE_INTX_CH0 0x1000
#define SYS_PCIE_MSI1_CH0 0x1004
#define SYS_PCIE_MSI2_CH0 0x1008
#define SYS_PCIE_MSI3_CH0 0x100c
#define SYS_PCIE_MSI4_CH0 0x1010
#define SYS_PCIE_MSI5_CH0 0x1014
#define SYS_PCIE_PME_CH0 0x1018
#define SYS_PCIE_ACK_CH0 0x101c
#define SYS_PCIE_MISC_CH0 0x1020
#define SYS_PCIE_MODE_CH0 0x1024
#define SYS_PCIE_INTX_CH1 0x1030
#define SYS_PCIE_MSI1_CH1 0x1034
#define SYS_PCIE_MSI2_CH1 0x1038
#define SYS_PCIE_MSI3_CH1 0x103c
#define SYS_PCIE_MSI4_CH1 0x1040
#define SYS_PCIE_MSI5_CH1 0x1044
#define SYS_PCIE_PME_CH1 0x1048
#define SYS_PCIE_ACK_CH1 0x104c
#define SYS_PCIE_MISC_CH1 0x1050
#define SYS_PCIE_MODE_CH1 0x1054
#define SYS_PCIE_MODE 0x1060
#define SYS_ADC_CFG 0x1600
static void rzv2h_sys_print_id(struct device *dev,
void __iomem *sysc_base,
struct soc_device_attribute *soc_dev_attr)
{
bool gpu_enabled, isp_enabled;
u32 prr_val, mode_val;
prr_val = readl(sysc_base + SYS_LSI_PRR);
mode_val = readl(sysc_base + SYS_LSI_MODE);
/* Check GPU and ISP configuration */
gpu_enabled = !(prr_val & SYS_LSI_PRR_GPU_DIS);
isp_enabled = !(prr_val & SYS_LSI_PRR_ISP_DIS);
dev_info(dev, "Detected Renesas %s %s Rev %s%s%s\n",
soc_dev_attr->family, soc_dev_attr->soc_id, soc_dev_attr->revision,
gpu_enabled ? " with GE3D (Mali-G31)" : "",
isp_enabled ? " with ISP (Mali-C55)" : "");
/* Check CA55 PLL configuration */
if (FIELD_GET(SYS_LSI_MODE_STAT_BOOTPLLCA55, mode_val) != SYS_LSI_MODE_CA55_1_7GHZ)
dev_warn(dev, "CA55 PLL is not set to 1.7GHz\n");
}
static const struct rz_sysc_soc_id_init_data rzv2h_sys_soc_id_init_data __initconst = {
.family = "RZ/V2H",
.id = 0x847a447,
.devid_offset = 0x304,
.revision_mask = GENMASK(31, 28),
.specific_id_mask = GENMASK(27, 0),
.print_id = rzv2h_sys_print_id,
};
static bool rzv2h_regmap_readable_reg(struct device *dev, unsigned int reg)
{
switch (reg) {
case SYS_LSI_OTPTSU0TRMVAL0:
case SYS_LSI_OTPTSU0TRMVAL1:
case SYS_LSI_OTPTSU1TRMVAL0:
case SYS_LSI_OTPTSU1TRMVAL1:
case SYS_GBETH0_CFG:
case SYS_GBETH1_CFG:
case SYS_PCIE_INTX_CH0:
case SYS_PCIE_MSI1_CH0:
case SYS_PCIE_MSI2_CH0:
case SYS_PCIE_MSI3_CH0:
case SYS_PCIE_MSI4_CH0:
case SYS_PCIE_MSI5_CH0:
case SYS_PCIE_PME_CH0:
case SYS_PCIE_ACK_CH0:
case SYS_PCIE_MISC_CH0:
case SYS_PCIE_MODE_CH0:
case SYS_PCIE_INTX_CH1:
case SYS_PCIE_MSI1_CH1:
case SYS_PCIE_MSI2_CH1:
case SYS_PCIE_MSI3_CH1:
case SYS_PCIE_MSI4_CH1:
case SYS_PCIE_MSI5_CH1:
case SYS_PCIE_PME_CH1:
case SYS_PCIE_ACK_CH1:
case SYS_PCIE_MISC_CH1:
case SYS_PCIE_MODE_CH1:
case SYS_PCIE_MODE:
case SYS_ADC_CFG:
return true;
default:
return false;
}
}
static bool rzv2h_regmap_writeable_reg(struct device *dev, unsigned int reg)
{
switch (reg) {
case SYS_GBETH0_CFG:
case SYS_GBETH1_CFG:
case SYS_PCIE_INTX_CH0:
case SYS_PCIE_MSI1_CH0:
case SYS_PCIE_MSI2_CH0:
case SYS_PCIE_MSI3_CH0:
case SYS_PCIE_MSI4_CH0:
case SYS_PCIE_MSI5_CH0:
case SYS_PCIE_PME_CH0:
case SYS_PCIE_ACK_CH0:
case SYS_PCIE_MISC_CH0:
case SYS_PCIE_MODE_CH0:
case SYS_PCIE_INTX_CH1:
case SYS_PCIE_MSI1_CH1:
case SYS_PCIE_MSI2_CH1:
case SYS_PCIE_MSI3_CH1:
case SYS_PCIE_MSI4_CH1:
case SYS_PCIE_MSI5_CH1:
case SYS_PCIE_PME_CH1:
case SYS_PCIE_ACK_CH1:
case SYS_PCIE_MISC_CH1:
case SYS_PCIE_MODE_CH1:
case SYS_PCIE_MODE:
case SYS_ADC_CFG:
return true;
default:
return false;
}
}
const struct rz_sysc_init_data rzv2h_sys_init_data = {
.soc_id_init_data = &rzv2h_sys_soc_id_init_data,
.readable_reg = rzv2h_regmap_readable_reg,
.writeable_reg = rzv2h_regmap_writeable_reg,
.max_register = 0x170c,
};
|