@@ -1152,6 +1152,7 @@ static void __spi_pump_messages(struct spi_master *master, bool in_kthread)
1152
1152
}
1153
1153
}
1154
1154
1155
+ mutex_lock (& master -> bus_lock_mutex );
1155
1156
trace_spi_message_start (master -> cur_msg );
1156
1157
1157
1158
if (master -> prepare_message ) {
@@ -1161,6 +1162,7 @@ static void __spi_pump_messages(struct spi_master *master, bool in_kthread)
1161
1162
"failed to prepare message: %d\n" , ret );
1162
1163
master -> cur_msg -> status = ret ;
1163
1164
spi_finalize_current_message (master );
1165
+ mutex_unlock (& master -> bus_lock_mutex );
1164
1166
return ;
1165
1167
}
1166
1168
master -> cur_msg_prepared = true;
@@ -1170,15 +1172,21 @@ static void __spi_pump_messages(struct spi_master *master, bool in_kthread)
1170
1172
if (ret ) {
1171
1173
master -> cur_msg -> status = ret ;
1172
1174
spi_finalize_current_message (master );
1175
+ mutex_unlock (& master -> bus_lock_mutex );
1173
1176
return ;
1174
1177
}
1175
1178
1176
1179
ret = master -> transfer_one_message (master , master -> cur_msg );
1177
1180
if (ret ) {
1178
1181
dev_err (& master -> dev ,
1179
1182
"failed to transfer one message from queue\n" );
1183
+ mutex_unlock (& master -> bus_lock_mutex );
1180
1184
return ;
1181
1185
}
1186
+ mutex_unlock (& master -> bus_lock_mutex );
1187
+
1188
+ /* Prod the scheduler in case transfer_one() was busy waiting */
1189
+ cond_resched ();
1182
1190
}
1183
1191
1184
1192
/**
@@ -2351,6 +2359,46 @@ int spi_async_locked(struct spi_device *spi, struct spi_message *message)
2351
2359
EXPORT_SYMBOL_GPL (spi_async_locked );
2352
2360
2353
2361
2362
+ int spi_flash_read (struct spi_device * spi ,
2363
+ struct spi_flash_read_message * msg )
2364
+
2365
+ {
2366
+ struct spi_master * master = spi -> master ;
2367
+ int ret ;
2368
+
2369
+ if ((msg -> opcode_nbits == SPI_NBITS_DUAL ||
2370
+ msg -> addr_nbits == SPI_NBITS_DUAL ) &&
2371
+ !(spi -> mode & (SPI_TX_DUAL | SPI_TX_QUAD )))
2372
+ return - EINVAL ;
2373
+ if ((msg -> opcode_nbits == SPI_NBITS_QUAD ||
2374
+ msg -> addr_nbits == SPI_NBITS_QUAD ) &&
2375
+ !(spi -> mode & SPI_TX_QUAD ))
2376
+ return - EINVAL ;
2377
+ if (msg -> data_nbits == SPI_NBITS_DUAL &&
2378
+ !(spi -> mode & (SPI_RX_DUAL | SPI_RX_QUAD )))
2379
+ return - EINVAL ;
2380
+ if (msg -> data_nbits == SPI_NBITS_QUAD &&
2381
+ !(spi -> mode & SPI_RX_QUAD ))
2382
+ return - EINVAL ;
2383
+
2384
+ if (master -> auto_runtime_pm ) {
2385
+ ret = pm_runtime_get_sync (master -> dev .parent );
2386
+ if (ret < 0 ) {
2387
+ dev_err (& master -> dev , "Failed to power device: %d\n" ,
2388
+ ret );
2389
+ return ret ;
2390
+ }
2391
+ }
2392
+ mutex_lock (& master -> bus_lock_mutex );
2393
+ ret = master -> spi_flash_read (spi , msg );
2394
+ mutex_unlock (& master -> bus_lock_mutex );
2395
+ if (master -> auto_runtime_pm )
2396
+ pm_runtime_put (master -> dev .parent );
2397
+
2398
+ return ret ;
2399
+ }
2400
+ EXPORT_SYMBOL_GPL (spi_flash_read );
2401
+
2354
2402
/*-------------------------------------------------------------------------*/
2355
2403
2356
2404
/* Utility methods for SPI master protocol drivers, layered on
0 commit comments