31
31
struct imx8_soc_data {
32
32
char * name ;
33
33
const char * ocotp_compatible ;
34
- int (* soc_revision )(struct platform_device * pdev , u32 * socrev , u64 * socuid );
34
+ int (* soc_revision )(struct platform_device * pdev , u32 * socrev );
35
+ int (* soc_uid )(struct platform_device * pdev , u64 * socuid );
35
36
};
36
37
37
38
struct imx8_soc_drvdata {
@@ -55,7 +56,19 @@ static u32 imx8mq_soc_revision_from_atf(void)
55
56
static inline u32 imx8mq_soc_revision_from_atf (void ) { return 0 ; };
56
57
#endif
57
58
58
- static int imx8mq_soc_revision (struct platform_device * pdev , u32 * socrev , u64 * socuid )
59
+ static int imx8m_soc_uid (struct platform_device * pdev , u64 * socuid )
60
+ {
61
+ struct imx8_soc_drvdata * drvdata = platform_get_drvdata (pdev );
62
+ void __iomem * ocotp_base = drvdata -> ocotp_base ;
63
+
64
+ * socuid = readl_relaxed (ocotp_base + OCOTP_UID_HIGH );
65
+ * socuid <<= 32 ;
66
+ * socuid |= readl_relaxed (ocotp_base + OCOTP_UID_LOW );
67
+
68
+ return 0 ;
69
+ }
70
+
71
+ static int imx8mq_soc_revision (struct platform_device * pdev , u32 * socrev )
59
72
{
60
73
struct imx8_soc_drvdata * drvdata = platform_get_drvdata (pdev );
61
74
void __iomem * ocotp_base = drvdata -> ocotp_base ;
@@ -73,30 +86,24 @@ static int imx8mq_soc_revision(struct platform_device *pdev, u32 *socrev, u64 *s
73
86
rev = REV_B1 ;
74
87
}
75
88
76
- * socuid = readl_relaxed (ocotp_base + OCOTP_UID_HIGH );
77
- * socuid <<= 32 ;
78
- * socuid |= readl_relaxed (ocotp_base + OCOTP_UID_LOW );
79
-
80
89
* socrev = rev ;
81
90
82
91
return 0 ;
83
92
}
84
93
85
- static int imx8mm_soc_uid (struct platform_device * pdev , u64 * socuid )
94
+ static int imx8mp_soc_uid (struct platform_device * pdev , u64 * socuid )
86
95
{
87
96
struct imx8_soc_drvdata * drvdata = platform_get_drvdata (pdev );
88
97
void __iomem * ocotp_base = drvdata -> ocotp_base ;
89
- u32 offset = of_machine_is_compatible ("fsl,imx8mp" ) ?
90
- IMX8MP_OCOTP_UID_OFFSET : 0 ;
91
98
92
- * socuid = readl_relaxed (ocotp_base + OCOTP_UID_HIGH + offset );
99
+ * socuid = readl_relaxed (ocotp_base + OCOTP_UID_HIGH + IMX8MP_OCOTP_UID_OFFSET );
93
100
* socuid <<= 32 ;
94
- * socuid |= readl_relaxed (ocotp_base + OCOTP_UID_LOW + offset );
101
+ * socuid |= readl_relaxed (ocotp_base + OCOTP_UID_LOW + IMX8MP_OCOTP_UID_OFFSET );
95
102
96
103
return 0 ;
97
104
}
98
105
99
- static int imx8mm_soc_revision (struct platform_device * pdev , u32 * socrev , u64 * socuid )
106
+ static int imx8mm_soc_revision (struct platform_device * pdev , u32 * socrev )
100
107
{
101
108
struct device_node * np __free (device_node ) =
102
109
of_find_compatible_node (NULL , NULL , "fsl,imx8mm-anatop" );
@@ -113,7 +120,7 @@ static int imx8mm_soc_revision(struct platform_device *pdev, u32 *socrev, u64 *s
113
120
114
121
iounmap (anatop_base );
115
122
116
- return imx8mm_soc_uid ( pdev , socuid ) ;
123
+ return 0 ;
117
124
}
118
125
119
126
static int imx8m_soc_prepare (struct platform_device * pdev , const char * ocotp_compatible )
@@ -156,24 +163,28 @@ static const struct imx8_soc_data imx8mq_soc_data = {
156
163
.name = "i.MX8MQ" ,
157
164
.ocotp_compatible = "fsl,imx8mq-ocotp" ,
158
165
.soc_revision = imx8mq_soc_revision ,
166
+ .soc_uid = imx8m_soc_uid ,
159
167
};
160
168
161
169
static const struct imx8_soc_data imx8mm_soc_data = {
162
170
.name = "i.MX8MM" ,
163
171
.ocotp_compatible = "fsl,imx8mm-ocotp" ,
164
172
.soc_revision = imx8mm_soc_revision ,
173
+ .soc_uid = imx8m_soc_uid ,
165
174
};
166
175
167
176
static const struct imx8_soc_data imx8mn_soc_data = {
168
177
.name = "i.MX8MN" ,
169
178
.ocotp_compatible = "fsl,imx8mm-ocotp" ,
170
179
.soc_revision = imx8mm_soc_revision ,
180
+ .soc_uid = imx8m_soc_uid ,
171
181
};
172
182
173
183
static const struct imx8_soc_data imx8mp_soc_data = {
174
184
.name = "i.MX8MP" ,
175
185
.ocotp_compatible = "fsl,imx8mm-ocotp" ,
176
186
.soc_revision = imx8mm_soc_revision ,
187
+ .soc_uid = imx8mp_soc_uid ,
177
188
};
178
189
179
190
static __maybe_unused const struct of_device_id imx8_soc_match [] = {
@@ -240,7 +251,14 @@ static int imx8m_soc_probe(struct platform_device *pdev)
240
251
return ret ;
241
252
242
253
if (data -> soc_revision ) {
243
- ret = data -> soc_revision (pdev , & soc_rev , & soc_uid );
254
+ ret = data -> soc_revision (pdev , & soc_rev );
255
+ if (ret ) {
256
+ imx8m_soc_unprepare (pdev );
257
+ return ret ;
258
+ }
259
+ }
260
+ if (data -> soc_uid ) {
261
+ ret = data -> soc_uid (pdev , & soc_uid );
244
262
if (ret ) {
245
263
imx8m_soc_unprepare (pdev );
246
264
return ret ;
0 commit comments