Re: [PATCH 2/4] i2c: mux: add basic support for calling i2c_register_spd on muxed bus segments

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Heiner,

kernel test robot noticed the following build errors:

[auto build test ERROR on wsa/i2c/for-next]
[also build test ERROR on next-20240111]
[cannot apply to linus/master v6.7]
[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#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Heiner-Kallweit/i2c-smbus-Prepare-i2c_register_spd-for-usage-on-muxed-segments/20240111-042152
base:   https://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux.git i2c/for-next
patch link:    https://lore.kernel.org/r/53e5c71a-d954-4211-91a1-de067451d532%40gmail.com
patch subject: [PATCH 2/4] i2c: mux: add basic support for calling i2c_register_spd on muxed bus segments
config: i386-randconfig-053-20240111 (https://download.01.org/0day-ci/archive/20240111/202401112333.GUpSFOuc-lkp@xxxxxxxxx/config)
compiler: gcc-12 (Debian 12.2.0-14) 12.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240111/202401112333.GUpSFOuc-lkp@xxxxxxxxx/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@xxxxxxxxx>
| Closes: https://lore.kernel.org/oe-kbuild-all/202401112333.GUpSFOuc-lkp@xxxxxxxxx/

All errors (new ones prefixed by >>):

   ld: drivers/i2c/i2c-mux.o: in function `i2c_mux_add_adapter':
>> drivers/i2c/i2c-mux.c:434: undefined reference to `i2c_register_spd'


vim +434 drivers/i2c/i2c-mux.c

   283	
   284	int i2c_mux_add_adapter(struct i2c_mux_core *muxc,
   285				u32 force_nr, u32 chan_id,
   286				unsigned int class)
   287	{
   288		struct i2c_adapter *parent = muxc->parent;
   289		struct i2c_mux_priv *priv;
   290		char symlink_name[20];
   291		int ret;
   292	
   293		if (muxc->num_adapters >= muxc->max_adapters) {
   294			dev_err(muxc->dev, "No room for more i2c-mux adapters\n");
   295			return -EINVAL;
   296		}
   297	
   298		priv = kzalloc(sizeof(*priv), GFP_KERNEL);
   299		if (!priv)
   300			return -ENOMEM;
   301	
   302		/* Set up private adapter data */
   303		priv->muxc = muxc;
   304		priv->chan_id = chan_id;
   305	
   306		/* Need to do algo dynamically because we don't know ahead
   307		 * of time what sort of physical adapter we'll be dealing with.
   308		 */
   309		if (parent->algo->master_xfer) {
   310			if (muxc->mux_locked)
   311				priv->algo.master_xfer = i2c_mux_master_xfer;
   312			else
   313				priv->algo.master_xfer = __i2c_mux_master_xfer;
   314		}
   315		if (parent->algo->master_xfer_atomic)
   316			priv->algo.master_xfer_atomic = priv->algo.master_xfer;
   317	
   318		if (parent->algo->smbus_xfer) {
   319			if (muxc->mux_locked)
   320				priv->algo.smbus_xfer = i2c_mux_smbus_xfer;
   321			else
   322				priv->algo.smbus_xfer = __i2c_mux_smbus_xfer;
   323		}
   324		if (parent->algo->smbus_xfer_atomic)
   325			priv->algo.smbus_xfer_atomic = priv->algo.smbus_xfer;
   326	
   327		priv->algo.functionality = i2c_mux_functionality;
   328	
   329		/* Now fill out new adapter structure */
   330		snprintf(priv->adap.name, sizeof(priv->adap.name),
   331			 "i2c-%d-mux (chan_id %d)", i2c_adapter_id(parent), chan_id);
   332		priv->adap.owner = THIS_MODULE;
   333		priv->adap.algo = &priv->algo;
   334		priv->adap.algo_data = priv;
   335		priv->adap.dev.parent = &parent->dev;
   336		priv->adap.retries = parent->retries;
   337		priv->adap.timeout = parent->timeout;
   338		priv->adap.quirks = parent->quirks;
   339		if (muxc->mux_locked)
   340			priv->adap.lock_ops = &i2c_mux_lock_ops;
   341		else
   342			priv->adap.lock_ops = &i2c_parent_lock_ops;
   343	
   344		/* Sanity check on class */
   345		if (i2c_mux_parent_classes(parent) & class & ~I2C_CLASS_DEPRECATED)
   346			dev_err(&parent->dev,
   347				"Segment %d behind mux can't share classes with ancestors\n",
   348				chan_id);
   349		else
   350			priv->adap.class = class;
   351	
   352		/*
   353		 * Try to populate the mux adapter's of_node, expands to
   354		 * nothing if !CONFIG_OF.
   355		 */
   356		if (muxc->dev->of_node) {
   357			struct device_node *dev_node = muxc->dev->of_node;
   358			struct device_node *mux_node, *child = NULL;
   359			u32 reg;
   360	
   361			if (muxc->arbitrator)
   362				mux_node = of_get_child_by_name(dev_node, "i2c-arb");
   363			else if (muxc->gate)
   364				mux_node = of_get_child_by_name(dev_node, "i2c-gate");
   365			else
   366				mux_node = of_get_child_by_name(dev_node, "i2c-mux");
   367	
   368			if (mux_node) {
   369				/* A "reg" property indicates an old-style DT entry */
   370				if (!of_property_read_u32(mux_node, "reg", &reg)) {
   371					of_node_put(mux_node);
   372					mux_node = NULL;
   373				}
   374			}
   375	
   376			if (!mux_node)
   377				mux_node = of_node_get(dev_node);
   378			else if (muxc->arbitrator || muxc->gate)
   379				child = of_node_get(mux_node);
   380	
   381			if (!child) {
   382				for_each_child_of_node(mux_node, child) {
   383					ret = of_property_read_u32(child, "reg", &reg);
   384					if (ret)
   385						continue;
   386					if (chan_id == reg)
   387						break;
   388				}
   389			}
   390	
   391			priv->adap.dev.of_node = child;
   392			of_node_put(mux_node);
   393		}
   394	
   395		/*
   396		 * Associate the mux channel with an ACPI node.
   397		 */
   398		if (has_acpi_companion(muxc->dev))
   399			acpi_preset_companion(&priv->adap.dev,
   400					      ACPI_COMPANION(muxc->dev),
   401					      chan_id);
   402	
   403		if (force_nr) {
   404			priv->adap.nr = force_nr;
   405			ret = i2c_add_numbered_adapter(&priv->adap);
   406			if (ret < 0) {
   407				dev_err(&parent->dev,
   408					"failed to add mux-adapter %u as bus %u (error=%d)\n",
   409					chan_id, force_nr, ret);
   410				goto err_free_priv;
   411			}
   412		} else {
   413			ret = i2c_add_adapter(&priv->adap);
   414			if (ret < 0) {
   415				dev_err(&parent->dev,
   416					"failed to add mux-adapter %u (error=%d)\n",
   417					chan_id, ret);
   418				goto err_free_priv;
   419			}
   420		}
   421	
   422		WARN(sysfs_create_link(&priv->adap.dev.kobj, &muxc->dev->kobj,
   423				       "mux_device"),
   424		     "can't create symlink to mux device\n");
   425	
   426		snprintf(symlink_name, sizeof(symlink_name), "channel-%u", chan_id);
   427		WARN(sysfs_create_link(&muxc->dev->kobj, &priv->adap.dev.kobj,
   428				       symlink_name),
   429		     "can't create symlink to channel %u\n", chan_id);
   430		dev_info(&parent->dev, "Added multiplexed i2c bus %d\n",
   431			 i2c_adapter_id(&priv->adap));
   432	
   433		if (muxc->register_spd)
 > 434			i2c_register_spd(&priv->adap);
   435	
   436		muxc->adapter[muxc->num_adapters++] = &priv->adap;
   437		return 0;
   438	
   439	err_free_priv:
   440		kfree(priv);
   441		return ret;
   442	}
   443	EXPORT_SYMBOL_GPL(i2c_mux_add_adapter);
   444	

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki




[Index of Archives]     [Linux GPIO]     [Linux SPI]     [Linux Hardward Monitoring]     [LM Sensors]     [Linux USB Devel]     [Linux Media]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux