@@ -1011,6 +1011,43 @@ static int i2c_imx_dma_write(struct imx_i2c_struct *i2c_imx,
1011
1011
return i2c_imx_acked (i2c_imx );
1012
1012
}
1013
1013
1014
+ static int i2c_imx_prepare_read (struct imx_i2c_struct * i2c_imx ,
1015
+ struct i2c_msg * msgs , bool atomic ,
1016
+ bool use_dma )
1017
+ {
1018
+ int result ;
1019
+ unsigned int temp = 0 ;
1020
+
1021
+ /* write slave address */
1022
+ imx_i2c_write_reg (i2c_8bit_addr_from_msg (msgs ), i2c_imx , IMX_I2C_I2DR );
1023
+ result = i2c_imx_trx_complete (i2c_imx , atomic );
1024
+ if (result )
1025
+ return result ;
1026
+ result = i2c_imx_acked (i2c_imx );
1027
+ if (result )
1028
+ return result ;
1029
+
1030
+ dev_dbg (& i2c_imx -> adapter .dev , "<%s> setup bus\n" , __func__ );
1031
+
1032
+ /* setup bus to read data */
1033
+ temp = imx_i2c_read_reg (i2c_imx , IMX_I2C_I2CR );
1034
+ temp &= ~I2CR_MTX ;
1035
+
1036
+ /*
1037
+ * Reset the I2CR_TXAK flag initially for SMBus block read since the
1038
+ * length is unknown
1039
+ */
1040
+ if (msgs -> len - 1 )
1041
+ temp &= ~I2CR_TXAK ;
1042
+ if (use_dma )
1043
+ temp |= I2CR_DMAEN ;
1044
+
1045
+ imx_i2c_write_reg (temp , i2c_imx , IMX_I2C_I2CR );
1046
+ imx_i2c_read_reg (i2c_imx , IMX_I2C_I2DR ); /* dummy read */
1047
+
1048
+ return 0 ;
1049
+ }
1050
+
1014
1051
static int i2c_imx_dma_read (struct imx_i2c_struct * i2c_imx ,
1015
1052
struct i2c_msg * msgs , bool is_lastmsg )
1016
1053
{
@@ -1021,6 +1058,11 @@ static int i2c_imx_dma_read(struct imx_i2c_struct *i2c_imx,
1021
1058
struct imx_i2c_dma * dma = i2c_imx -> dma ;
1022
1059
struct device * dev = & i2c_imx -> adapter .dev ;
1023
1060
1061
+ result = i2c_imx_prepare_read (i2c_imx , msgs , false, true);
1062
+ if (result )
1063
+ return result ;
1064
+
1065
+ dev_dbg (& i2c_imx -> adapter .dev , "<%s> read data\n" , __func__ );
1024
1066
1025
1067
dma -> chan_using = dma -> chan_rx ;
1026
1068
dma -> dma_transfer_dir = DMA_DEV_TO_MEM ;
@@ -1131,50 +1173,24 @@ static int i2c_imx_write(struct imx_i2c_struct *i2c_imx, struct i2c_msg *msgs,
1131
1173
return 0 ;
1132
1174
}
1133
1175
1176
+ static int i2c_imx_atomic_write (struct imx_i2c_struct * i2c_imx , struct i2c_msg * msgs )
1177
+ {
1178
+ return i2c_imx_write (i2c_imx , msgs , true);
1179
+ }
1180
+
1134
1181
static int i2c_imx_read (struct imx_i2c_struct * i2c_imx , struct i2c_msg * msgs ,
1135
1182
bool is_lastmsg , bool atomic )
1136
1183
{
1137
1184
int i , result ;
1138
1185
unsigned int temp ;
1139
1186
int block_data = msgs -> flags & I2C_M_RECV_LEN ;
1140
- int use_dma = i2c_imx -> dma && msgs -> flags & I2C_M_DMA_SAFE &&
1141
- msgs -> len >= DMA_THRESHOLD && !block_data ;
1142
1187
1143
- dev_dbg (& i2c_imx -> adapter .dev ,
1144
- "<%s> write slave address: addr=0x%x\n" ,
1145
- __func__ , i2c_8bit_addr_from_msg (msgs ));
1146
-
1147
- /* write slave address */
1148
- imx_i2c_write_reg (i2c_8bit_addr_from_msg (msgs ), i2c_imx , IMX_I2C_I2DR );
1149
- result = i2c_imx_trx_complete (i2c_imx , atomic );
1188
+ result = i2c_imx_prepare_read (i2c_imx , msgs , atomic , false);
1150
1189
if (result )
1151
1190
return result ;
1152
- result = i2c_imx_acked (i2c_imx );
1153
- if (result )
1154
- return result ;
1155
-
1156
- dev_dbg (& i2c_imx -> adapter .dev , "<%s> setup bus\n" , __func__ );
1157
-
1158
- /* setup bus to read data */
1159
- temp = imx_i2c_read_reg (i2c_imx , IMX_I2C_I2CR );
1160
- temp &= ~I2CR_MTX ;
1161
-
1162
- /*
1163
- * Reset the I2CR_TXAK flag initially for SMBus block read since the
1164
- * length is unknown
1165
- */
1166
- if ((msgs -> len - 1 ) || block_data )
1167
- temp &= ~I2CR_TXAK ;
1168
- if (use_dma )
1169
- temp |= I2CR_DMAEN ;
1170
- imx_i2c_write_reg (temp , i2c_imx , IMX_I2C_I2CR );
1171
- imx_i2c_read_reg (i2c_imx , IMX_I2C_I2DR ); /* dummy read */
1172
1191
1173
1192
dev_dbg (& i2c_imx -> adapter .dev , "<%s> read data\n" , __func__ );
1174
1193
1175
- if (use_dma )
1176
- return i2c_imx_dma_read (i2c_imx , msgs , is_lastmsg );
1177
-
1178
1194
/* read data */
1179
1195
for (i = 0 ; i < msgs -> len ; i ++ ) {
1180
1196
u8 len = 0 ;
@@ -1241,13 +1257,20 @@ static int i2c_imx_read(struct imx_i2c_struct *i2c_imx, struct i2c_msg *msgs,
1241
1257
return 0 ;
1242
1258
}
1243
1259
1260
+ static int i2c_imx_atomic_read (struct imx_i2c_struct * i2c_imx , struct i2c_msg * msgs ,
1261
+ bool is_lastmsg )
1262
+ {
1263
+ return i2c_imx_read (i2c_imx , msgs , is_lastmsg , true);
1264
+ }
1265
+
1244
1266
static int i2c_imx_xfer_common (struct i2c_adapter * adapter ,
1245
1267
struct i2c_msg * msgs , int num , bool atomic )
1246
1268
{
1247
1269
unsigned int i , temp ;
1248
1270
int result ;
1249
1271
bool is_lastmsg = false;
1250
1272
struct imx_i2c_struct * i2c_imx = i2c_get_adapdata (adapter );
1273
+ int use_dma = 0 ;
1251
1274
1252
1275
/* Start I2C transfer */
1253
1276
result = i2c_imx_start (i2c_imx , atomic );
@@ -1300,15 +1323,25 @@ static int i2c_imx_xfer_common(struct i2c_adapter *adapter,
1300
1323
(temp & I2SR_SRW ? 1 : 0 ), (temp & I2SR_IIF ? 1 : 0 ),
1301
1324
(temp & I2SR_RXAK ? 1 : 0 ));
1302
1325
#endif
1326
+
1327
+ use_dma = i2c_imx -> dma && msgs [i ].len >= DMA_THRESHOLD &&
1328
+ msgs [i ].flags & I2C_M_DMA_SAFE ;
1303
1329
if (msgs [i ].flags & I2C_M_RD ) {
1304
- result = i2c_imx_read (i2c_imx , & msgs [i ], is_lastmsg , atomic );
1330
+ int block_data = msgs -> flags & I2C_M_RECV_LEN ;
1331
+
1332
+ if (atomic )
1333
+ result = i2c_imx_atomic_read (i2c_imx , & msgs [i ], is_lastmsg );
1334
+ else if (use_dma && !block_data )
1335
+ result = i2c_imx_dma_read (i2c_imx , & msgs [i ], is_lastmsg );
1336
+ else
1337
+ result = i2c_imx_read (i2c_imx , & msgs [i ], is_lastmsg , false);
1305
1338
} else {
1306
- if (! atomic &&
1307
- i2c_imx -> dma && msgs [i ]. len >= DMA_THRESHOLD &&
1308
- msgs [ i ]. flags & I2C_M_DMA_SAFE )
1339
+ if (atomic )
1340
+ result = i2c_imx_atomic_write ( i2c_imx , & msgs [i ]);
1341
+ else if ( use_dma )
1309
1342
result = i2c_imx_dma_write (i2c_imx , & msgs [i ]);
1310
1343
else
1311
- result = i2c_imx_write (i2c_imx , & msgs [i ], atomic );
1344
+ result = i2c_imx_write (i2c_imx , & msgs [i ], false );
1312
1345
}
1313
1346
if (result )
1314
1347
goto fail0 ;
0 commit comments