@@ -1011,6 +1011,43 @@ static int i2c_imx_dma_write(struct imx_i2c_struct *i2c_imx,
10111011 return i2c_imx_acked (i2c_imx );
10121012}
10131013
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+
10141051static int i2c_imx_dma_read (struct imx_i2c_struct * i2c_imx ,
10151052 struct i2c_msg * msgs , bool is_lastmsg )
10161053{
@@ -1021,6 +1058,11 @@ static int i2c_imx_dma_read(struct imx_i2c_struct *i2c_imx,
10211058 struct imx_i2c_dma * dma = i2c_imx -> dma ;
10221059 struct device * dev = & i2c_imx -> adapter .dev ;
10231060
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__ );
10241066
10251067 dma -> chan_using = dma -> chan_rx ;
10261068 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,
11311173 return 0 ;
11321174}
11331175
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+
11341181static int i2c_imx_read (struct imx_i2c_struct * i2c_imx , struct i2c_msg * msgs ,
11351182 bool is_lastmsg , bool atomic )
11361183{
11371184 int i , result ;
11381185 unsigned int temp ;
11391186 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 ;
11421187
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);
11501189 if (result )
11511190 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 */
11721191
11731192 dev_dbg (& i2c_imx -> adapter .dev , "<%s> read data\n" , __func__ );
11741193
1175- if (use_dma )
1176- return i2c_imx_dma_read (i2c_imx , msgs , is_lastmsg );
1177-
11781194 /* read data */
11791195 for (i = 0 ; i < msgs -> len ; i ++ ) {
11801196 u8 len = 0 ;
@@ -1241,13 +1257,20 @@ static int i2c_imx_read(struct imx_i2c_struct *i2c_imx, struct i2c_msg *msgs,
12411257 return 0 ;
12421258}
12431259
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+
12441266static int i2c_imx_xfer_common (struct i2c_adapter * adapter ,
12451267 struct i2c_msg * msgs , int num , bool atomic )
12461268{
12471269 unsigned int i , temp ;
12481270 int result ;
12491271 bool is_lastmsg = false;
12501272 struct imx_i2c_struct * i2c_imx = i2c_get_adapdata (adapter );
1273+ int use_dma = 0 ;
12511274
12521275 /* Start I2C transfer */
12531276 result = i2c_imx_start (i2c_imx , atomic );
@@ -1300,15 +1323,25 @@ static int i2c_imx_xfer_common(struct i2c_adapter *adapter,
13001323 (temp & I2SR_SRW ? 1 : 0 ), (temp & I2SR_IIF ? 1 : 0 ),
13011324 (temp & I2SR_RXAK ? 1 : 0 ));
13021325#endif
1326+
1327+ use_dma = i2c_imx -> dma && msgs [i ].len >= DMA_THRESHOLD &&
1328+ msgs [i ].flags & I2C_M_DMA_SAFE ;
13031329 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);
13051338 } 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 )
13091342 result = i2c_imx_dma_write (i2c_imx , & msgs [i ]);
13101343 else
1311- result = i2c_imx_write (i2c_imx , & msgs [i ], atomic );
1344+ result = i2c_imx_write (i2c_imx , & msgs [i ], false );
13121345 }
13131346 if (result )
13141347 goto fail0 ;
0 commit comments