@@ -64,6 +64,16 @@ enum tpm_nsc_cmd_mode {
64
64
NSC_COMMAND_EOC = 0x03 ,
65
65
NSC_COMMAND_CANCEL = 0x22
66
66
};
67
+
68
+ struct tpm_nsc_priv {
69
+ unsigned long base ;
70
+ };
71
+
72
+ static inline struct tpm_nsc_priv * nsc_get_priv (struct tpm_chip * chip )
73
+ {
74
+ return chip -> vendor .priv ;
75
+ }
76
+
67
77
/*
68
78
* Wait for a certain status to appear
69
79
*/
@@ -72,15 +82,15 @@ static int wait_for_stat(struct tpm_chip *chip, u8 mask, u8 val, u8 * data)
72
82
unsigned long stop ;
73
83
74
84
/* status immediately available check */
75
- * data = inb (chip -> vendor . base + NSC_STATUS );
85
+ * data = inb (nsc_get_priv ( chip ) -> base + NSC_STATUS );
76
86
if ((* data & mask ) == val )
77
87
return 0 ;
78
88
79
89
/* wait for status */
80
90
stop = jiffies + 10 * HZ ;
81
91
do {
82
92
msleep (TPM_TIMEOUT );
83
- * data = inb (chip -> vendor . base + 1 );
93
+ * data = inb (nsc_get_priv ( chip ) -> base + 1 );
84
94
if ((* data & mask ) == val )
85
95
return 0 ;
86
96
}
@@ -95,19 +105,19 @@ static int nsc_wait_for_ready(struct tpm_chip *chip)
95
105
unsigned long stop ;
96
106
97
107
/* status immediately available check */
98
- status = inb (chip -> vendor . base + NSC_STATUS );
108
+ status = inb (nsc_get_priv ( chip ) -> base + NSC_STATUS );
99
109
if (status & NSC_STATUS_OBF )
100
- status = inb (chip -> vendor . base + NSC_DATA );
110
+ status = inb (nsc_get_priv ( chip ) -> base + NSC_DATA );
101
111
if (status & NSC_STATUS_RDY )
102
112
return 0 ;
103
113
104
114
/* wait for status */
105
115
stop = jiffies + 100 ;
106
116
do {
107
117
msleep (TPM_TIMEOUT );
108
- status = inb (chip -> vendor . base + NSC_STATUS );
118
+ status = inb (nsc_get_priv ( chip ) -> base + NSC_STATUS );
109
119
if (status & NSC_STATUS_OBF )
110
- status = inb (chip -> vendor . base + NSC_DATA );
120
+ status = inb (nsc_get_priv ( chip ) -> base + NSC_DATA );
111
121
if (status & NSC_STATUS_RDY )
112
122
return 0 ;
113
123
}
@@ -132,8 +142,9 @@ static int tpm_nsc_recv(struct tpm_chip *chip, u8 * buf, size_t count)
132
142
dev_err (& chip -> dev , "F0 timeout\n" );
133
143
return - EIO ;
134
144
}
135
- if ((data =
136
- inb (chip -> vendor .base + NSC_DATA )) != NSC_COMMAND_NORMAL ) {
145
+
146
+ data = inb (nsc_get_priv (chip )-> base + NSC_DATA );
147
+ if (data != NSC_COMMAND_NORMAL ) {
137
148
dev_err (& chip -> dev , "not in normal mode (0x%x)\n" ,
138
149
data );
139
150
return - EIO ;
@@ -149,15 +160,17 @@ static int tpm_nsc_recv(struct tpm_chip *chip, u8 * buf, size_t count)
149
160
}
150
161
if (data & NSC_STATUS_F0 )
151
162
break ;
152
- * p = inb (chip -> vendor . base + NSC_DATA );
163
+ * p = inb (nsc_get_priv ( chip ) -> base + NSC_DATA );
153
164
}
154
165
155
166
if ((data & NSC_STATUS_F0 ) == 0 &&
156
167
(wait_for_stat (chip , NSC_STATUS_F0 , NSC_STATUS_F0 , & data ) < 0 )) {
157
168
dev_err (& chip -> dev , "F0 not set\n" );
158
169
return - EIO ;
159
170
}
160
- if ((data = inb (chip -> vendor .base + NSC_DATA )) != NSC_COMMAND_EOC ) {
171
+
172
+ data = inb (nsc_get_priv (chip )-> base + NSC_DATA );
173
+ if (data != NSC_COMMAND_EOC ) {
161
174
dev_err (& chip -> dev ,
162
175
"expected end of command(0x%x)\n" , data );
163
176
return - EIO ;
@@ -183,7 +196,7 @@ static int tpm_nsc_send(struct tpm_chip *chip, u8 * buf, size_t count)
183
196
* fix it. Not sure why this is needed, we followed the flow
184
197
* chart in the manual to the letter.
185
198
*/
186
- outb (NSC_COMMAND_CANCEL , chip -> vendor . base + NSC_COMMAND );
199
+ outb (NSC_COMMAND_CANCEL , nsc_get_priv ( chip ) -> base + NSC_COMMAND );
187
200
188
201
if (nsc_wait_for_ready (chip ) != 0 )
189
202
return - EIO ;
@@ -193,7 +206,7 @@ static int tpm_nsc_send(struct tpm_chip *chip, u8 * buf, size_t count)
193
206
return - EIO ;
194
207
}
195
208
196
- outb (NSC_COMMAND_NORMAL , chip -> vendor . base + NSC_COMMAND );
209
+ outb (NSC_COMMAND_NORMAL , nsc_get_priv ( chip ) -> base + NSC_COMMAND );
197
210
if (wait_for_stat (chip , NSC_STATUS_IBR , NSC_STATUS_IBR , & data ) < 0 ) {
198
211
dev_err (& chip -> dev , "IBR timeout\n" );
199
212
return - EIO ;
@@ -205,26 +218,26 @@ static int tpm_nsc_send(struct tpm_chip *chip, u8 * buf, size_t count)
205
218
"IBF timeout (while writing data)\n" );
206
219
return - EIO ;
207
220
}
208
- outb (buf [i ], chip -> vendor . base + NSC_DATA );
221
+ outb (buf [i ], nsc_get_priv ( chip ) -> base + NSC_DATA );
209
222
}
210
223
211
224
if (wait_for_stat (chip , NSC_STATUS_IBF , 0 , & data ) < 0 ) {
212
225
dev_err (& chip -> dev , "IBF timeout\n" );
213
226
return - EIO ;
214
227
}
215
- outb (NSC_COMMAND_EOC , chip -> vendor . base + NSC_COMMAND );
228
+ outb (NSC_COMMAND_EOC , nsc_get_priv ( chip ) -> base + NSC_COMMAND );
216
229
217
230
return count ;
218
231
}
219
232
220
233
static void tpm_nsc_cancel (struct tpm_chip * chip )
221
234
{
222
- outb (NSC_COMMAND_CANCEL , chip -> vendor . base + NSC_COMMAND );
235
+ outb (NSC_COMMAND_CANCEL , nsc_get_priv ( chip ) -> base + NSC_COMMAND );
223
236
}
224
237
225
238
static u8 tpm_nsc_status (struct tpm_chip * chip )
226
239
{
227
- return inb (chip -> vendor . base + NSC_STATUS );
240
+ return inb (nsc_get_priv ( chip ) -> base + NSC_STATUS );
228
241
}
229
242
230
243
static bool tpm_nsc_req_canceled (struct tpm_chip * chip , u8 status )
@@ -249,7 +262,7 @@ static void tpm_nsc_remove(struct device *dev)
249
262
struct tpm_chip * chip = dev_get_drvdata (dev );
250
263
251
264
tpm_chip_unregister (chip );
252
- release_region (chip -> vendor . base , 2 );
265
+ release_region (nsc_get_priv ( chip ) -> base , 2 );
253
266
}
254
267
255
268
static SIMPLE_DEV_PM_OPS (tpm_nsc_pm , tpm_pm_suspend , tpm_pm_resume ) ;
@@ -268,6 +281,7 @@ static int __init init_nsc(void)
268
281
int nscAddrBase = TPM_ADDR ;
269
282
struct tpm_chip * chip ;
270
283
unsigned long base ;
284
+ struct tpm_nsc_priv * priv ;
271
285
272
286
/* verify that it is a National part (SID) */
273
287
if (tpm_read_index (TPM_ADDR , NSC_SID_INDEX ) != 0xEF ) {
@@ -301,6 +315,14 @@ static int __init init_nsc(void)
301
315
if ((rc = platform_device_add (pdev )) < 0 )
302
316
goto err_put_dev ;
303
317
318
+ priv = devm_kzalloc (& pdev -> dev , sizeof (* priv ), GFP_KERNEL );
319
+ if (!priv ) {
320
+ rc = - ENOMEM ;
321
+ goto err_del_dev ;
322
+ }
323
+
324
+ priv -> base = base ;
325
+
304
326
if (request_region (base , 2 , "tpm_nsc0" ) == NULL ) {
305
327
rc = - EBUSY ;
306
328
goto err_del_dev ;
@@ -312,6 +334,8 @@ static int __init init_nsc(void)
312
334
goto err_rel_reg ;
313
335
}
314
336
337
+ chip -> vendor .priv = priv ;
338
+
315
339
rc = tpm_chip_register (chip );
316
340
if (rc )
317
341
goto err_rel_reg ;
@@ -349,8 +373,6 @@ static int __init init_nsc(void)
349
373
"NSC TPM revision %d\n" ,
350
374
tpm_read_index (nscAddrBase , 0x27 ) & 0x1F );
351
375
352
- chip -> vendor .base = base ;
353
-
354
376
return 0 ;
355
377
356
378
err_rel_reg :
0 commit comments