[drm-tip:drm-tip 899/925] drivers/gpu/drm/sun4i/sun4i_hdmi_i2c.c:54:6: error: implicit declaration of function 'regmap_field_read_poll_timeout'

kbuild test robot fengguang.wu at intel.com
Wed Oct 11 12:42:13 UTC 2017


tree:   git://anongit.freedesktop.org/drm/drm-tip drm-tip
head:   36e0e803d3d7fb3d74e9086ad7c749123661589e
commit: 939d749ad6649c4123daf63a8bc053ea97ad2218 [899/925] drm/sun4i: hdmi: Add support for controller hardware variants
config: arm-defconfig (attached as .config)
compiler: arm-linux-gnueabi-gcc (Debian 6.1.1-9) 6.1.1 20160705
reproduce:
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        git checkout 939d749ad6649c4123daf63a8bc053ea97ad2218
        # save the attached .config to linux build tree
        make.cross ARCH=arm 

Note: the drm-tip/drm-tip HEAD 36e0e803d3d7fb3d74e9086ad7c749123661589e builds fine.
      It only hurts bisectibility.

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

   drivers/gpu/drm/sun4i/sun4i_hdmi_i2c.c: In function 'fifo_transfer':
>> drivers/gpu/drm/sun4i/sun4i_hdmi_i2c.c:54:6: error: implicit declaration of function 'regmap_field_read_poll_timeout' [-Werror=implicit-function-declaration]
     if (regmap_field_read_poll_timeout(hdmi->field_ddc_int_status, reg,
         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> drivers/gpu/drm/sun4i/sun4i_hdmi_i2c.c:54:6: warning: 'reg' is used uninitialized in this function [-Wuninitialized]
     if (regmap_field_read_poll_timeout(hdmi->field_ddc_int_status, reg,
         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            reg & mask, len * byte_time_ns,
            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            100000))
            ~~~~~~~
   drivers/gpu/drm/sun4i/sun4i_hdmi_i2c.c: In function 'sun4i_hdmi_i2c_xfer':
>> drivers/gpu/drm/sun4i/sun4i_hdmi_i2c.c:171:6: warning: 'reg' may be used uninitialized in this function [-Wmaybe-uninitialized]
     if (regmap_field_read_poll_timeout(hdmi->field_ddc_reset,
         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            reg, !reg, 100, 2000)) {
            ~~~~~~~~~~~~~~~~~~~~~
   cc1: some warnings being treated as errors

vim +/regmap_field_read_poll_timeout +54 drivers/gpu/drm/sun4i/sun4i_hdmi_i2c.c

    28	
    29	static int fifo_transfer(struct sun4i_hdmi *hdmi, u8 *buf, int len, bool read)
    30	{
    31		/*
    32		 * 1 byte takes 9 clock cycles (8 bits + 1 ACK) = 90 us for 100 kHz
    33		 * clock. As clock rate is fixed, just round it up to 100 us.
    34		 */
    35		const unsigned long byte_time_ns = 100;
    36		const u32 mask = SUN4I_HDMI_DDC_INT_STATUS_ERROR_MASK |
    37				 SUN4I_HDMI_DDC_INT_STATUS_FIFO_REQUEST |
    38				 SUN4I_HDMI_DDC_INT_STATUS_TRANSFER_COMPLETE;
    39		u32 reg;
    40		/*
    41		 * If threshold is inclusive, then the FIFO may only have
    42		 * RX_THRESHOLD number of bytes, instead of RX_THRESHOLD + 1.
    43		 */
    44		int read_len = RX_THRESHOLD +
    45			(hdmi->variant->ddc_fifo_thres_incl ? 0 : 1);
    46	
    47		/*
    48		 * Limit transfer length by FIFO threshold or FIFO size.
    49		 * For TX the threshold is for an empty FIFO.
    50		 */
    51		len = min_t(int, len, read ? read_len : SUN4I_HDMI_DDC_FIFO_SIZE);
    52	
    53		/* Wait until error, FIFO request bit set or transfer complete */
  > 54		if (regmap_field_read_poll_timeout(hdmi->field_ddc_int_status, reg,
    55						   reg & mask, len * byte_time_ns,
    56						   100000))
    57			return -ETIMEDOUT;
    58	
    59		if (reg & SUN4I_HDMI_DDC_INT_STATUS_ERROR_MASK)
    60			return -EIO;
    61	
    62		if (read)
    63			readsb(hdmi->base + hdmi->variant->ddc_fifo_reg, buf, len);
    64		else
    65			writesb(hdmi->base + hdmi->variant->ddc_fifo_reg, buf, len);
    66	
    67		/* Clear FIFO request bit by forcing a write to that bit */
    68		regmap_field_force_write(hdmi->field_ddc_int_status,
    69					 SUN4I_HDMI_DDC_INT_STATUS_FIFO_REQUEST);
    70	
    71		return len;
    72	}
    73	
    74	static int xfer_msg(struct sun4i_hdmi *hdmi, struct i2c_msg *msg)
    75	{
    76		int i, len;
    77		u32 reg;
    78	
    79		/* Set FIFO direction */
    80		if (hdmi->variant->ddc_fifo_has_dir) {
    81			reg = readl(hdmi->base + SUN4I_HDMI_DDC_CTRL_REG);
    82			reg &= ~SUN4I_HDMI_DDC_CTRL_FIFO_DIR_MASK;
    83			reg |= (msg->flags & I2C_M_RD) ?
    84			       SUN4I_HDMI_DDC_CTRL_FIFO_DIR_READ :
    85			       SUN4I_HDMI_DDC_CTRL_FIFO_DIR_WRITE;
    86			writel(reg, hdmi->base + SUN4I_HDMI_DDC_CTRL_REG);
    87		}
    88	
    89		/* Clear address register (not cleared by soft reset) */
    90		regmap_field_write(hdmi->field_ddc_addr_reg, 0);
    91	
    92		/* Set I2C address */
    93		regmap_field_write(hdmi->field_ddc_slave_addr, msg->addr);
    94	
    95		/*
    96		 * Set FIFO RX/TX thresholds and clear FIFO
    97		 *
    98		 * If threshold is inclusive, we can set the TX threshold to
    99		 * 0 instead of 1.
   100		 */
   101		regmap_field_write(hdmi->field_ddc_fifo_tx_thres,
   102				   hdmi->variant->ddc_fifo_thres_incl ? 0 : 1);
   103		regmap_field_write(hdmi->field_ddc_fifo_rx_thres, RX_THRESHOLD);
   104		regmap_field_write(hdmi->field_ddc_fifo_clear, 1);
   105		if (regmap_field_read_poll_timeout(hdmi->field_ddc_fifo_clear,
   106						   reg, !reg, 100, 2000))
   107			return -EIO;
   108	
   109		/* Set transfer length */
   110		regmap_field_write(hdmi->field_ddc_byte_count, msg->len);
   111	
   112		/* Set command */
   113		regmap_field_write(hdmi->field_ddc_cmd,
   114				   msg->flags & I2C_M_RD ?
   115				   SUN4I_HDMI_DDC_CMD_IMPLICIT_READ :
   116				   SUN4I_HDMI_DDC_CMD_IMPLICIT_WRITE);
   117	
   118		/* Clear interrupt status bits by forcing a write */
   119		regmap_field_force_write(hdmi->field_ddc_int_status,
   120					 SUN4I_HDMI_DDC_INT_STATUS_ERROR_MASK |
   121					 SUN4I_HDMI_DDC_INT_STATUS_FIFO_REQUEST |
   122					 SUN4I_HDMI_DDC_INT_STATUS_TRANSFER_COMPLETE);
   123	
   124		/* Start command */
   125		regmap_field_write(hdmi->field_ddc_start, 1);
   126	
   127		/* Transfer bytes */
   128		for (i = 0; i < msg->len; i += len) {
   129			len = fifo_transfer(hdmi, msg->buf + i, msg->len - i,
   130					    msg->flags & I2C_M_RD);
   131			if (len <= 0)
   132				return len;
   133		}
   134	
   135		/* Wait for command to finish */
   136		if (regmap_field_read_poll_timeout(hdmi->field_ddc_start,
   137						   reg, !reg, 100, 100000))
   138			return -EIO;
   139	
   140		/* Check for errors */
   141		regmap_field_read(hdmi->field_ddc_int_status, &reg);
   142		if ((reg & SUN4I_HDMI_DDC_INT_STATUS_ERROR_MASK) ||
   143		    !(reg & SUN4I_HDMI_DDC_INT_STATUS_TRANSFER_COMPLETE)) {
   144			return -EIO;
   145		}
   146	
   147		return 0;
   148	}
   149	
   150	static int sun4i_hdmi_i2c_xfer(struct i2c_adapter *adap,
   151				       struct i2c_msg *msgs, int num)
   152	{
   153		struct sun4i_hdmi *hdmi = i2c_get_adapdata(adap);
   154		u32 reg;
   155		int err, i, ret = num;
   156	
   157		for (i = 0; i < num; i++) {
   158			if (!msgs[i].len)
   159				return -EINVAL;
   160			if (msgs[i].len > SUN4I_HDMI_DDC_BYTE_COUNT_MAX)
   161				return -EINVAL;
   162		}
   163	
   164		/* DDC clock needs to be enabled for the module to work */
   165		clk_prepare_enable(hdmi->ddc_clk);
   166		clk_set_rate(hdmi->ddc_clk, 100000);
   167	
   168		/* Reset I2C controller */
   169		regmap_field_write(hdmi->field_ddc_en, 1);
   170		regmap_field_write(hdmi->field_ddc_reset, 1);
 > 171		if (regmap_field_read_poll_timeout(hdmi->field_ddc_reset,
   172						   reg, !reg, 100, 2000)) {
   173			clk_disable_unprepare(hdmi->ddc_clk);
   174			return -EIO;
   175		}
   176	
   177		regmap_field_write(hdmi->field_ddc_sck_en, 1);
   178		regmap_field_write(hdmi->field_ddc_sda_en, 1);
   179	
   180		for (i = 0; i < num; i++) {
   181			err = xfer_msg(hdmi, &msgs[i]);
   182			if (err) {
   183				ret = err;
   184				break;
   185			}
   186		}
   187	
   188		clk_disable_unprepare(hdmi->ddc_clk);
   189		return ret;
   190	}
   191	

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation
-------------- next part --------------
A non-text attachment was scrubbed...
Name: .config.gz
Type: application/gzip
Size: 42346 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/dri-devel/attachments/20171011/9ed1054a/attachment-0001.gz>


More information about the dri-devel mailing list