[PATCH v2] i2c: s3c2410: change return type of 'i2c_s3c_irq_nextbyte' from 'int' to 'void'

kernel test robot lkp at intel.com
Fri May 6 20:31:54 PDT 2022


Hi Yihao,

Thank you for the patch! Yet something to improve:

[auto build test ERROR on krzk/for-next]
[also build test ERROR on v5.18-rc5 next-20220506]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/intel-lab-lkp/linux/commits/Yihao-Han/i2c-s3c2410-change-return-type-of-i2c_s3c_irq_nextbyte-from-int-to-void/20220506-202923
base:   https://git.kernel.org/pub/scm/linux/kernel/git/krzk/linux.git for-next
config: arm-randconfig-c002-20220506 (https://download.01.org/0day-ci/archive/20220507/202205071109.36SjNuHG-lkp@intel.com/config)
compiler: clang version 15.0.0 (https://github.com/llvm/llvm-project 5e004fb787698440a387750db7f8028e7cb14cfc)
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # install arm cross compiling tool for clang build
        # apt-get install binutils-arm-linux-gnueabi
        # https://github.com/intel-lab-lkp/linux/commit/fdefdf435e27cd445a10a77f475e6d316245ed2b
        git remote add linux-review https://github.com/intel-lab-lkp/linux
        git fetch --no-tags linux-review Yihao-Han/i2c-s3c2410-change-return-type-of-i2c_s3c_irq_nextbyte-from-int-to-void/20220506-202923
        git checkout fdefdf435e27cd445a10a77f475e6d316245ed2b
        # save the config file
        mkdir build_dir && cp config build_dir/.config
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=arm SHELL=/bin/bash drivers/i2c/busses/

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp at intel.com>

All errors (new ones prefixed by >>):

>> drivers/i2c/busses/i2c-s3c2410.c:384:13: error: conflicting types for 'i2c_s3c_irq_nextbyte'
   static void i2c_s3c_irq_nextbyte(struct s3c24xx_i2c *i2c, unsigned long iicstat)
               ^
   drivers/i2c/busses/i2c-s3c2410.c:140:12: note: previous declaration is here
   static int i2c_s3c_irq_nextbyte(struct s3c24xx_i2c *i2c, unsigned long iicstat);
              ^
   1 error generated.


vim +/i2c_s3c_irq_nextbyte +384 drivers/i2c/busses/i2c-s3c2410.c

   380	
   381	/*
   382	 * process an interrupt and work out what to do
   383	 */
 > 384	static void i2c_s3c_irq_nextbyte(struct s3c24xx_i2c *i2c, unsigned long iicstat)
   385	{
   386		unsigned long tmp;
   387		unsigned char byte;
   388	
   389		switch (i2c->state) {
   390	
   391		case STATE_IDLE:
   392			dev_err(i2c->dev, "%s: called in STATE_IDLE\n", __func__);
   393			return;
   394	
   395		case STATE_STOP:
   396			dev_err(i2c->dev, "%s: called in STATE_STOP\n", __func__);
   397			s3c24xx_i2c_disable_irq(i2c);
   398			goto out_ack;
   399	
   400		case STATE_START:
   401			/*
   402			 * last thing we did was send a start condition on the
   403			 * bus, or started a new i2c message
   404			 */
   405			if (iicstat & S3C2410_IICSTAT_LASTBIT &&
   406			    !(i2c->msg->flags & I2C_M_IGNORE_NAK)) {
   407				/* ack was not received... */
   408				dev_dbg(i2c->dev, "ack was not received\n");
   409				s3c24xx_i2c_stop(i2c, -ENXIO);
   410				goto out_ack;
   411			}
   412	
   413			if (i2c->msg->flags & I2C_M_RD)
   414				i2c->state = STATE_READ;
   415			else
   416				i2c->state = STATE_WRITE;
   417	
   418			/*
   419			 * Terminate the transfer if there is nothing to do
   420			 * as this is used by the i2c probe to find devices.
   421			 */
   422			if (is_lastmsg(i2c) && i2c->msg->len == 0) {
   423				s3c24xx_i2c_stop(i2c, 0);
   424				goto out_ack;
   425			}
   426	
   427			if (i2c->state == STATE_READ)
   428				goto prepare_read;
   429	
   430			/*
   431			 * fall through to the write state, as we will need to
   432			 * send a byte as well
   433			 */
   434			fallthrough;
   435		case STATE_WRITE:
   436			/*
   437			 * we are writing data to the device... check for the
   438			 * end of the message, and if so, work out what to do
   439			 */
   440			if (!(i2c->msg->flags & I2C_M_IGNORE_NAK)) {
   441				if (iicstat & S3C2410_IICSTAT_LASTBIT) {
   442					dev_dbg(i2c->dev, "WRITE: No Ack\n");
   443	
   444					s3c24xx_i2c_stop(i2c, -ECONNREFUSED);
   445					goto out_ack;
   446				}
   447			}
   448	
   449	 retry_write:
   450	
   451			if (!is_msgend(i2c)) {
   452				byte = i2c->msg->buf[i2c->msg_ptr++];
   453				writeb(byte, i2c->regs + S3C2410_IICDS);
   454	
   455				/*
   456				 * delay after writing the byte to allow the
   457				 * data setup time on the bus, as writing the
   458				 * data to the register causes the first bit
   459				 * to appear on SDA, and SCL will change as
   460				 * soon as the interrupt is acknowledged
   461				 */
   462				ndelay(i2c->tx_setup);
   463	
   464			} else if (!is_lastmsg(i2c)) {
   465				/* we need to go to the next i2c message */
   466	
   467				dev_dbg(i2c->dev, "WRITE: Next Message\n");
   468	
   469				i2c->msg_ptr = 0;
   470				i2c->msg_idx++;
   471				i2c->msg++;
   472	
   473				/* check to see if we need to do another message */
   474				if (i2c->msg->flags & I2C_M_NOSTART) {
   475	
   476					if (i2c->msg->flags & I2C_M_RD) {
   477						/*
   478						 * cannot do this, the controller
   479						 * forces us to send a new START
   480						 * when we change direction
   481						 */
   482						dev_dbg(i2c->dev,
   483							"missing START before write->read\n");
   484						s3c24xx_i2c_stop(i2c, -EINVAL);
   485						break;
   486					}
   487	
   488					goto retry_write;
   489				} else {
   490					/* send the new start */
   491					s3c24xx_i2c_message_start(i2c, i2c->msg);
   492					i2c->state = STATE_START;
   493				}
   494	
   495			} else {
   496				/* send stop */
   497				s3c24xx_i2c_stop(i2c, 0);
   498			}
   499			break;
   500	
   501		case STATE_READ:
   502			/*
   503			 * we have a byte of data in the data register, do
   504			 * something with it, and then work out whether we are
   505			 * going to do any more read/write
   506			 */
   507			byte = readb(i2c->regs + S3C2410_IICDS);
   508			i2c->msg->buf[i2c->msg_ptr++] = byte;
   509	
   510			/* Add actual length to read for smbus block read */
   511			if (i2c->msg->flags & I2C_M_RECV_LEN && i2c->msg->len == 1)
   512				i2c->msg->len += byte;
   513	 prepare_read:
   514			if (is_msglast(i2c)) {
   515				/* last byte of buffer */
   516	
   517				if (is_lastmsg(i2c))
   518					s3c24xx_i2c_disable_ack(i2c);
   519	
   520			} else if (is_msgend(i2c)) {
   521				/*
   522				 * ok, we've read the entire buffer, see if there
   523				 * is anything else we need to do
   524				 */
   525				if (is_lastmsg(i2c)) {
   526					/* last message, send stop and complete */
   527					dev_dbg(i2c->dev, "READ: Send Stop\n");
   528	
   529					s3c24xx_i2c_stop(i2c, 0);
   530				} else {
   531					/* go to the next transfer */
   532					dev_dbg(i2c->dev, "READ: Next Transfer\n");
   533	
   534					i2c->msg_ptr = 0;
   535					i2c->msg_idx++;
   536					i2c->msg++;
   537				}
   538			}
   539	
   540			break;
   541		}
   542	
   543		/* acknowlegde the IRQ and get back on with the work */
   544	
   545	 out_ack:
   546		tmp = readl(i2c->regs + S3C2410_IICCON);
   547		tmp &= ~S3C2410_IICCON_IRQPEND;
   548		writel(tmp, i2c->regs + S3C2410_IICCON);
   549	}
   550	

-- 
0-DAY CI Kernel Test Service
https://01.org/lkp



More information about the linux-arm-kernel mailing list