67
67
SPI_FSI_STATUS_RDR_OVERRUN)
68
68
#define SPI_FSI_PORT_CTRL 0x9
69
69
70
+ struct fsi2spi {
71
+ struct fsi_device * fsi ; /* FSI2SPI CFAM engine device */
72
+ struct mutex lock ; /* lock access to the device */
73
+ };
74
+
70
75
struct fsi_spi {
71
76
struct device * dev ; /* SPI controller device */
72
- struct fsi_device * fsi ; /* FSI2SPI CFAM engine device */
77
+ struct fsi2spi * bridge ; /* FSI2SPI device */
73
78
u32 base ;
74
79
};
75
80
@@ -104,7 +109,7 @@ static int fsi_spi_check_status(struct fsi_spi *ctx)
104
109
u32 sts ;
105
110
__be32 sts_be ;
106
111
107
- rc = fsi_device_read (ctx -> fsi , FSI2SPI_STATUS , & sts_be ,
112
+ rc = fsi_device_read (ctx -> bridge -> fsi , FSI2SPI_STATUS , & sts_be ,
108
113
sizeof (sts_be ));
109
114
if (rc )
110
115
return rc ;
@@ -120,73 +125,91 @@ static int fsi_spi_check_status(struct fsi_spi *ctx)
120
125
121
126
static int fsi_spi_read_reg (struct fsi_spi * ctx , u32 offset , u64 * value )
122
127
{
123
- int rc ;
128
+ int rc = 0 ;
124
129
__be32 cmd_be ;
125
130
__be32 data_be ;
126
131
u32 cmd = offset + ctx -> base ;
132
+ struct fsi2spi * bridge = ctx -> bridge ;
127
133
128
134
* value = 0ULL ;
129
135
130
136
if (cmd & FSI2SPI_CMD_WRITE )
131
137
return - EINVAL ;
132
138
133
- cmd_be = cpu_to_be32 (cmd );
134
- rc = fsi_device_write (ctx -> fsi , FSI2SPI_CMD , & cmd_be , sizeof (cmd_be ));
139
+ rc = mutex_lock_interruptible (& bridge -> lock );
135
140
if (rc )
136
141
return rc ;
137
142
143
+ cmd_be = cpu_to_be32 (cmd );
144
+ rc = fsi_device_write (bridge -> fsi , FSI2SPI_CMD , & cmd_be ,
145
+ sizeof (cmd_be ));
146
+ if (rc )
147
+ goto unlock ;
148
+
138
149
rc = fsi_spi_check_status (ctx );
139
150
if (rc )
140
- return rc ;
151
+ goto unlock ;
141
152
142
- rc = fsi_device_read (ctx -> fsi , FSI2SPI_DATA0 , & data_be ,
153
+ rc = fsi_device_read (bridge -> fsi , FSI2SPI_DATA0 , & data_be ,
143
154
sizeof (data_be ));
144
155
if (rc )
145
- return rc ;
156
+ goto unlock ;
146
157
147
158
* value |= (u64 )be32_to_cpu (data_be ) << 32 ;
148
159
149
- rc = fsi_device_read (ctx -> fsi , FSI2SPI_DATA1 , & data_be ,
160
+ rc = fsi_device_read (bridge -> fsi , FSI2SPI_DATA1 , & data_be ,
150
161
sizeof (data_be ));
151
162
if (rc )
152
- return rc ;
163
+ goto unlock ;
153
164
154
165
* value |= (u64 )be32_to_cpu (data_be );
155
166
dev_dbg (ctx -> dev , "Read %02x[%016llx].\n" , offset , * value );
156
167
157
- return 0 ;
168
+ unlock :
169
+ mutex_unlock (& bridge -> lock );
170
+ return rc ;
158
171
}
159
172
160
173
static int fsi_spi_write_reg (struct fsi_spi * ctx , u32 offset , u64 value )
161
174
{
162
- int rc ;
175
+ int rc = 0 ;
163
176
__be32 cmd_be ;
164
177
__be32 data_be ;
165
178
u32 cmd = offset + ctx -> base ;
179
+ struct fsi2spi * bridge = ctx -> bridge ;
166
180
167
181
if (cmd & FSI2SPI_CMD_WRITE )
168
182
return - EINVAL ;
169
183
184
+ rc = mutex_lock_interruptible (& bridge -> lock );
185
+ if (rc )
186
+ return rc ;
187
+
170
188
dev_dbg (ctx -> dev , "Write %02x[%016llx].\n" , offset , value );
171
189
172
190
data_be = cpu_to_be32 (upper_32_bits (value ));
173
- rc = fsi_device_write (ctx -> fsi , FSI2SPI_DATA0 , & data_be ,
191
+ rc = fsi_device_write (bridge -> fsi , FSI2SPI_DATA0 , & data_be ,
174
192
sizeof (data_be ));
175
193
if (rc )
176
- return rc ;
194
+ goto unlock ;
177
195
178
196
data_be = cpu_to_be32 (lower_32_bits (value ));
179
- rc = fsi_device_write (ctx -> fsi , FSI2SPI_DATA1 , & data_be ,
197
+ rc = fsi_device_write (bridge -> fsi , FSI2SPI_DATA1 , & data_be ,
180
198
sizeof (data_be ));
181
199
if (rc )
182
- return rc ;
200
+ goto unlock ;
183
201
184
202
cmd_be = cpu_to_be32 (cmd | FSI2SPI_CMD_WRITE );
185
- rc = fsi_device_write (ctx -> fsi , FSI2SPI_CMD , & cmd_be , sizeof (cmd_be ));
203
+ rc = fsi_device_write (bridge -> fsi , FSI2SPI_CMD , & cmd_be ,
204
+ sizeof (cmd_be ));
186
205
if (rc )
187
- return rc ;
206
+ goto unlock ;
207
+
208
+ rc = fsi_spi_check_status (ctx );
188
209
189
- return fsi_spi_check_status (ctx );
210
+ unlock :
211
+ mutex_unlock (& bridge -> lock );
212
+ return rc ;
190
213
}
191
214
192
215
static int fsi_spi_data_in (u64 in , u8 * rx , int len )
@@ -242,7 +265,7 @@ static int fsi_spi_status(struct fsi_spi *ctx, u64 *status, const char *dir)
242
265
return rc ;
243
266
244
267
if (* status & SPI_FSI_STATUS_ANY_ERROR ) {
245
- dev_err (ctx -> dev , "%s error: %08llx \n" , dir , * status );
268
+ dev_err (ctx -> dev , "%s error: %016llx \n" , dir , * status );
246
269
247
270
rc = fsi_spi_reset (ctx );
248
271
if (rc )
@@ -394,7 +417,7 @@ static int fsi_spi_transfer_one_message(struct spi_controller *ctlr,
394
417
struct spi_transfer * transfer ;
395
418
struct fsi_spi * ctx = spi_controller_get_devdata (ctlr );
396
419
397
- rc = fsi_spi_check_mux (ctx -> fsi , ctx -> dev );
420
+ rc = fsi_spi_check_mux (ctx -> bridge -> fsi , ctx -> dev );
398
421
if (rc )
399
422
goto error ;
400
423
@@ -484,12 +507,20 @@ static int fsi_spi_probe(struct device *dev)
484
507
int rc ;
485
508
struct device_node * np ;
486
509
int num_controllers_registered = 0 ;
510
+ struct fsi2spi * bridge ;
487
511
struct fsi_device * fsi = to_fsi_dev (dev );
488
512
489
513
rc = fsi_spi_check_mux (fsi , dev );
490
514
if (rc )
491
515
return - ENODEV ;
492
516
517
+ bridge = devm_kzalloc (dev , sizeof (* bridge ), GFP_KERNEL );
518
+ if (!bridge )
519
+ return - ENOMEM ;
520
+
521
+ bridge -> fsi = fsi ;
522
+ mutex_init (& bridge -> lock );
523
+
493
524
for_each_available_child_of_node (dev -> of_node , np ) {
494
525
u32 base ;
495
526
struct fsi_spi * ctx ;
@@ -512,7 +543,7 @@ static int fsi_spi_probe(struct device *dev)
512
543
513
544
ctx = spi_controller_get_devdata (ctlr );
514
545
ctx -> dev = & ctlr -> dev ;
515
- ctx -> fsi = fsi ;
546
+ ctx -> bridge = bridge ;
516
547
ctx -> base = base + SPI_FSI_BASE ;
517
548
518
549
rc = devm_spi_register_controller (dev , ctlr );
0 commit comments