linux-next: manual merge of the kthread tree with the i2c-host-fixes tree
From: Mark Brown
Date: Tue Jun 09 2026 - 11:40:15 EST
Hi all,
Today's linux-next merge of the kthread tree got a conflict in:
drivers/i2c/i2c-core-base.c
between commit:
84762906e2666d ("i2c: core: fix adapter debugfs creation")
from the i2c-host-fixes tree and commits:
07d5fb537928aa ("i2c: core: fix adapter debugfs creation")
a378a2bc73e3b7 ("i2c: core: clean up bus id allocation")
from the kthread tree.
I fixed it up (see below) and can carry the fix as necessary. This
is now fixed as far as linux-next is concerned, but any non trivial
conflicts should be mentioned to your upstream maintainer when your tree
is submitted for merging. You may also want to consider cooperating
with the maintainer of the conflicting tree to minimise any particularly
complex conflicts.
diff --combined drivers/i2c/i2c-core-base.c
index 764e293236b572,31e956bb3b7222..00000000000000
--- a/drivers/i2c/i2c-core-base.c
+++ b/drivers/i2c/i2c-core-base.c
@@@ -1516,23 -1516,48 +1516,48 @@@ int i2c_handle_smbus_host_notify(struc
}
EXPORT_SYMBOL_GPL(i2c_handle_smbus_host_notify);
+ static int i2c_allocate_adapter_id(struct i2c_adapter *adap)
+ {
+ int id, start, end;
+
+ if (adap->nr == -1) {
+ start = __i2c_first_dynamic_bus_num;
+ end = 0;
+ } else {
+ start = adap->nr;
+ end = adap->nr + 1;
+ }
+
+ mutex_lock(&core_lock);
+ id = idr_alloc(&i2c_adapter_idr, NULL, start, end, GFP_KERNEL);
+ mutex_unlock(&core_lock);
+ if (id < 0) {
+ if (adap->nr != -1 && id == -ENOSPC)
+ id = -EBUSY;
+ pr_err("adapter '%s': failed to allocate id: %d\n", adap->name, id);
+ return id;
+ }
+
+ adap->nr = id;
+
+ return 0;
+ }
+
static int i2c_register_adapter(struct i2c_adapter *adap)
{
- int res = -EINVAL;
+ int res;
/* Can't register until after driver model init */
- if (WARN_ON(!is_registered)) {
- res = -EAGAIN;
- goto out_list;
- }
+ if (WARN_ON(!is_registered))
+ return -EAGAIN;
/* Sanity checks */
if (WARN(!adap->name[0], "i2c adapter has no name"))
- goto out_list;
+ return -EINVAL;
if (!adap->algo) {
pr_err("adapter '%s': no algo supplied!\n", adap->name);
- goto out_list;
+ return -EINVAL;
}
if (!adap->lock_ops)
@@@ -1553,12 -1578,16 +1578,16 @@@
if (res) {
pr_err("adapter '%s': can't create Host Notify IRQs (%d)\n",
adap->name, res);
- goto out_list;
+ return res;
}
+ res = i2c_allocate_adapter_id(adap);
+ if (res)
+ goto err_remove_irq_domain;
+
res = dev_set_name(&adap->dev, "i2c-%d", adap->nr);
if (res)
- goto err_remove_irq_domain;
+ goto err_free_id;
adap->dev.bus = &i2c_bus_type;
adap->dev.type = &i2c_adapter_type;
@@@ -1591,7 -1620,7 +1620,11 @@@
res = i2c_setup_smbus_alert(adap);
if (res)
++<<<<<<< HEAD
+ goto out_reg;
++=======
+ goto err_deregister_clients;
++>>>>>>> i2c/i2c/for-next
dev_dbg(&adap->dev, "adapter [%s] registered\n", adap->name);
@@@ -1610,7 -1639,7 +1643,11 @@@
return 0;
++<<<<<<< HEAD
+out_reg:
++=======
+ err_deregister_clients:
++>>>>>>> i2c/i2c/for-next
i2c_deregister_clients(adap);
device_del(&adap->dev);
err_replace_id:
@@@ -1623,36 -1652,17 +1660,46 @@@ err_put_adap
init_completion(&adap->dev_released);
put_device(&adap->dev);
wait_for_completion(&adap->dev_released);
++<<<<<<< HEAD
+err_remove_irq_domain:
+ i2c_host_notify_irq_teardown(adap);
+out_list:
++=======
+ err_free_id:
++>>>>>>> i2c/i2c/for-next
mutex_lock(&core_lock);
idr_remove(&i2c_adapter_idr, adap->nr);
mutex_unlock(&core_lock);
+ err_remove_irq_domain:
+ i2c_host_notify_irq_teardown(adap);
+
return res;
}
/**
++<<<<<<< HEAD
+ * __i2c_add_numbered_adapter - i2c_add_numbered_adapter where nr is never -1
+ * @adap: the adapter to register (with adap->nr initialized)
+ * Context: can sleep
+ *
+ * See i2c_add_numbered_adapter() for details.
+ */
+static int __i2c_add_numbered_adapter(struct i2c_adapter *adap)
+{
+ int id;
+
+ mutex_lock(&core_lock);
+ id = idr_alloc(&i2c_adapter_idr, NULL, adap->nr, adap->nr + 1, GFP_KERNEL);
+ mutex_unlock(&core_lock);
+ if (WARN(id < 0, "couldn't get idr"))
+ return id == -ENOSPC ? -EBUSY : id;
+
+ return i2c_register_adapter(adap);
+}
+
+/**
++=======
++>>>>>>> i2c/i2c/for-next
* i2c_add_adapter - declare i2c adapter, use dynamic bus number
* @adapter: the adapter to add
* Context: can sleep
@@@ -1672,17 -1682,8 +1719,22 @@@ int i2c_add_adapter(struct i2c_adapter
int id;
id = of_alias_get_id(dev->of_node, "i2c");
++<<<<<<< HEAD
+ if (id >= 0) {
+ adapter->nr = id;
+ return __i2c_add_numbered_adapter(adapter);
+ }
+
+ mutex_lock(&core_lock);
+ id = idr_alloc(&i2c_adapter_idr, NULL,
+ __i2c_first_dynamic_bus_num, 0, GFP_KERNEL);
+ mutex_unlock(&core_lock);
+ if (WARN(id < 0, "couldn't get idr"))
+ return id;
++=======
+ if (id < 0)
+ id = -1;
++>>>>>>> i2c/i2c/for-next
adapter->nr = id;
@@@ -1718,7 -1719,7 +1770,7 @@@ int i2c_add_numbered_adapter(struct i2c
if (adap->nr == -1) /* -1 means dynamically assign bus id */
return i2c_add_adapter(adap);
- return __i2c_add_numbered_adapter(adap);
+ return i2c_register_adapter(adap);
}
EXPORT_SYMBOL_GPL(i2c_add_numbered_adapter);
Attachment:
signature.asc
Description: PGP signature