Re: [v3] i2c: imx: support slave mode for imx I2C driver

From: kbuild test robot
Date: Mon Oct 28 2019 - 03:23:55 EST


Hi Biwen,

Thank you for the patch! Yet something to improve:

[auto build test ERROR on wsa/i2c/for-next]
[also build test ERROR on v5.4-rc5 next-20191025]
[if your patch is applied to the wrong git tree, please drop us a note to help
improve the system. BTW, we also suggest to use '--base' option to specify the
base tree in git format-patch, please see https://stackoverflow.com/a/37406982]

url: https://github.com/0day-ci/linux/commits/Biwen-Li/i2c-imx-support-slave-mode-for-imx-I2C-driver/20191028-135008
base: https://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux.git i2c/for-next
config: arm-imx_v6_v7_defconfig (attached as .config)
compiler: arm-linux-gnueabi-gcc (GCC) 7.4.0
reproduce:
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# save the attached .config to linux build tree
GCC_VERSION=7.4.0 make.cross ARCH=arm

If you fix the issue, kindly add following tag
Reported-by: kbuild test robot <lkp@xxxxxxxxx>

All error/warnings (new ones prefixed by >>):

drivers/i2c/busses/i2c-imx.c: In function 'i2c_imx_slave_isr':
>> drivers/i2c/busses/i2c-imx.c:1121:4: error: implicit declaration of function 'i2c_slave_event'; did you mean 'io_wait_event'? [-Werror=implicit-function-declaration]
i2c_slave_event(i2c_imx->slave, I2C_SLAVE_READ_REQUESTED, &value);
^~~~~~~~~~~~~~~
io_wait_event
>> drivers/i2c/busses/i2c-imx.c:1121:36: error: 'I2C_SLAVE_READ_REQUESTED' undeclared (first use in this function); did you mean 'I2C_CLASS_DEPRECATED'?
i2c_slave_event(i2c_imx->slave, I2C_SLAVE_READ_REQUESTED, &value);
^~~~~~~~~~~~~~~~~~~~~~~~
I2C_CLASS_DEPRECATED
drivers/i2c/busses/i2c-imx.c:1121:36: note: each undeclared identifier is reported only once for each function it appears in
>> drivers/i2c/busses/i2c-imx.c:1131:36: error: 'I2C_SLAVE_WRITE_REQUESTED' undeclared (first use in this function); did you mean 'I2C_SLAVE_READ_REQUESTED'?
i2c_slave_event(i2c_imx->slave, I2C_SLAVE_WRITE_REQUESTED, &value);
^~~~~~~~~~~~~~~~~~~~~~~~~
I2C_SLAVE_READ_REQUESTED
>> drivers/i2c/busses/i2c-imx.c:1145:37: error: 'I2C_SLAVE_WRITE_RECEIVED' undeclared (first use in this function); did you mean 'I2C_SLAVE_WRITE_REQUESTED'?
i2c_slave_event(i2c_imx->slave, I2C_SLAVE_WRITE_RECEIVED, &value);
^~~~~~~~~~~~~~~~~~~~~~~~
I2C_SLAVE_WRITE_REQUESTED
>> drivers/i2c/busses/i2c-imx.c:1149:37: error: 'I2C_SLAVE_STOP' undeclared (first use in this function); did you mean 'I2C_M_STOP'?
i2c_slave_event(i2c_imx->slave, I2C_SLAVE_STOP, &value);
^~~~~~~~~~~~~~
I2C_M_STOP
>> drivers/i2c/busses/i2c-imx.c:1155:35: error: 'I2C_SLAVE_READ_PROCESSED' undeclared (first use in this function); did you mean 'I2C_SLAVE_READ_REQUESTED'?
i2c_slave_event(i2c_imx->slave, I2C_SLAVE_READ_PROCESSED, &value);
^~~~~~~~~~~~~~~~~~~~~~~~
I2C_SLAVE_READ_REQUESTED
drivers/i2c/busses/i2c-imx.c: At top level:
>> drivers/i2c/busses/i2c-imx.c:1208:3: error: 'const struct i2c_algorithm' has no member named 'reg_slave'
.reg_slave = i2c_imx_reg_slave,
^~~~~~~~~
>> drivers/i2c/busses/i2c-imx.c:1208:15: warning: excess elements in struct initializer
.reg_slave = i2c_imx_reg_slave,
^~~~~~~~~~~~~~~~~
drivers/i2c/busses/i2c-imx.c:1208:15: note: (near initialization for 'i2c_imx_algo')
>> drivers/i2c/busses/i2c-imx.c:1209:3: error: 'const struct i2c_algorithm' has no member named 'unreg_slave'
.unreg_slave = i2c_imx_unreg_slave,
^~~~~~~~~~~
drivers/i2c/busses/i2c-imx.c:1209:17: warning: excess elements in struct initializer
.unreg_slave = i2c_imx_unreg_slave,
^~~~~~~~~~~~~~~~~~~
drivers/i2c/busses/i2c-imx.c:1209:17: note: (near initialization for 'i2c_imx_algo')
cc1: some warnings being treated as errors

vim +1121 drivers/i2c/busses/i2c-imx.c

1103
1104 static irqreturn_t i2c_imx_slave_isr(struct imx_i2c_struct *i2c_imx)
1105 {
1106 unsigned int status, ctl;
1107 u8 value;
1108
1109 if (!i2c_imx->slave) {
1110 dev_err(&i2c_imx->adapter.dev, "cannot deal with slave irq,i2c_imx->slave is null");
1111 return IRQ_NONE;
1112 }
1113
1114 status = imx_i2c_read_reg(i2c_imx, IMX_I2C_I2SR);
1115 ctl = imx_i2c_read_reg(i2c_imx, IMX_I2C_I2CR);
1116 if (status & I2SR_IAL) { /* Arbitration lost */
1117 i2c_imx_clr_al_bit(status, i2c_imx);
1118 } else if (status & I2SR_IAAS) { /* Addressed as a slave */
1119 if (status & I2SR_SRW) { /* Master wants to read from us*/
1120 dev_dbg(&i2c_imx->adapter.dev, "read requested");
> 1121 i2c_slave_event(i2c_imx->slave, I2C_SLAVE_READ_REQUESTED, &value);
1122
1123 /* Slave transmit */
1124 ctl |= I2CR_MTX;
1125 imx_i2c_write_reg(ctl, i2c_imx, IMX_I2C_I2CR);
1126
1127 /* Send data */
1128 imx_i2c_write_reg(value, i2c_imx, IMX_I2C_I2DR);
1129 } else { /* Master wants to write to us */
1130 dev_dbg(&i2c_imx->adapter.dev, "write requested");
> 1131 i2c_slave_event(i2c_imx->slave, I2C_SLAVE_WRITE_REQUESTED, &value);
1132
1133 /* Slave receive */
1134 ctl &= ~I2CR_MTX;
1135 imx_i2c_write_reg(ctl, i2c_imx, IMX_I2C_I2CR);
1136 /* Dummy read */
1137 imx_i2c_read_reg(i2c_imx, IMX_I2C_I2DR);
1138 }
1139 } else if (!(ctl & I2CR_MTX)) { /* Receive mode */
1140 if (status & I2SR_IBB) { /* No STOP signal detected */
1141 ctl &= ~I2CR_MTX;
1142 imx_i2c_write_reg(ctl, i2c_imx, IMX_I2C_I2CR);
1143
1144 value = imx_i2c_read_reg(i2c_imx, IMX_I2C_I2DR);
> 1145 i2c_slave_event(i2c_imx->slave, I2C_SLAVE_WRITE_RECEIVED, &value);
1146 } else { /* STOP signal is detected */
1147 dev_dbg(&i2c_imx->adapter.dev,
1148 "STOP signal detected");
> 1149 i2c_slave_event(i2c_imx->slave, I2C_SLAVE_STOP, &value);
1150 }
1151 } else if (!(status & I2SR_RXAK)) { /* Transmit mode received ACK */
1152 ctl |= I2CR_MTX;
1153 imx_i2c_write_reg(ctl, i2c_imx, IMX_I2C_I2CR);
1154
> 1155 i2c_slave_event(i2c_imx->slave, I2C_SLAVE_READ_PROCESSED, &value);
1156
1157 imx_i2c_write_reg(value, i2c_imx, IMX_I2C_I2DR);
1158 } else { /* Transmit mode received NAK */
1159 ctl &= ~I2CR_MTX;
1160 imx_i2c_write_reg(ctl, i2c_imx, IMX_I2C_I2CR);
1161 imx_i2c_read_reg(i2c_imx, IMX_I2C_I2DR);
1162 }
1163 return IRQ_HANDLED;
1164 }
1165
1166 static int i2c_imx_reg_slave(struct i2c_client *client)
1167 {
1168 struct imx_i2c_struct *i2c_imx = i2c_get_adapdata(client->adapter);
1169 int ret;
1170 if (i2c_imx->slave)
1171 return -EBUSY;
1172
1173 i2c_imx->slave = client;
1174
1175 ret = i2c_imx_slave_init(i2c_imx);
1176 if (ret < 0)
1177 dev_err(&i2c_imx->adapter.dev, "failed to switch to slave mode");
1178
1179 return ret;
1180 }
1181
1182 static int i2c_imx_unreg_slave(struct i2c_client *client)
1183 {
1184 struct imx_i2c_struct *i2c_imx = i2c_get_adapdata(client->adapter);
1185 int ret;
1186
1187 if (!i2c_imx->slave)
1188 return -EINVAL;
1189
1190 /* Reset slave address. */
1191 imx_i2c_write_reg(0, i2c_imx, IMX_I2C_IADR);
1192
1193 i2c_imx_reset_regs(i2c_imx);
1194
1195 i2c_imx->slave = NULL;
1196
1197 /* Suspend */
1198 ret = pm_runtime_put_sync(i2c_imx->adapter.dev.parent);
1199 if (ret < 0)
1200 dev_err(&i2c_imx->adapter.dev, "failed to suspend i2c controller");
1201
1202 return ret;
1203 }
1204
1205 static const struct i2c_algorithm i2c_imx_algo = {
1206 .master_xfer = i2c_imx_xfer,
1207 .functionality = i2c_imx_func,
> 1208 .reg_slave = i2c_imx_reg_slave,
> 1209 .unreg_slave = i2c_imx_unreg_slave,
1210 };
1211

---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation

Attachment: .config.gz
Description: application/gzip