]> www.infradead.org Git - users/willy/xarray.git/commitdiff
i2c: Convert i2c_adapter_idr to XArray
authorMatthew Wilcox <willy@infradead.org>
Mon, 18 Feb 2019 18:39:27 +0000 (13:39 -0500)
committerMatthew Wilcox (Oracle) <willy@infradead.org>
Fri, 9 Aug 2019 01:38:17 +0000 (21:38 -0400)
Signed-off-by: Matthew Wilcox <willy@infradead.org>
drivers/i2c/i2c-core-base.c

index f26ed495d38420b3864c997945940941dcf5e754..e0bb339fdd3413d1c5b67da2223348be547fa8c9 100644 (file)
@@ -22,7 +22,6 @@
 #include <linux/gpio/consumer.h>
 #include <linux/i2c.h>
 #include <linux/i2c-smbus.h>
-#include <linux/idr.h>
 #include <linux/init.h>
 #include <linux/irqflags.h>
 #include <linux/jump_label.h>
@@ -38,6 +37,7 @@
 #include <linux/property.h>
 #include <linux/rwsem.h>
 #include <linux/slab.h>
+#include <linux/xarray.h>
 
 #include "i2c-core.h"
 
 #define I2C_ADDR_DEVICE_ID     0x7c
 
 /*
- * core_lock protects i2c_adapter_idr, and guarantees that device detection,
- * deletion of detected devices are serialized
+ * core_lock guarantees that device detection and deletion of detected
+ * devices are serialized
  */
 static DEFINE_MUTEX(core_lock);
-static DEFINE_IDR(i2c_adapter_idr);
+static DEFINE_XARRAY_ALLOC(i2c_adapters);
 
 static int i2c_detect(struct i2c_adapter *adapter, struct i2c_driver *driver);
 
@@ -1389,7 +1389,7 @@ out_reg:
        wait_for_completion(&adap->dev_released);
 out_list:
        mutex_lock(&core_lock);
-       idr_remove(&i2c_adapter_idr, adap->nr);
+       xa_erase(&i2c_adapters, adap->nr);
        mutex_unlock(&core_lock);
        return res;
 }
@@ -1403,13 +1403,13 @@ out_list:
  */
 static int __i2c_add_numbered_adapter(struct i2c_adapter *adap)
 {
-       int id;
+       int err;
 
        mutex_lock(&core_lock);
-       id = idr_alloc(&i2c_adapter_idr, adap, adap->nr, adap->nr + 1, GFP_KERNEL);
+       err = xa_insert(&i2c_adapters, adap->nr, adap, GFP_KERNEL);
        mutex_unlock(&core_lock);
-       if (WARN(id < 0, "couldn't get idr"))
-               return id == -ENOSPC ? -EBUSY : id;
+       if (WARN(err < 0, "couldn't allocate adapter id"))
+               return err;
 
        return i2c_register_adapter(adap);
 }
@@ -1431,24 +1431,23 @@ static int __i2c_add_numbered_adapter(struct i2c_adapter *adap)
 int i2c_add_adapter(struct i2c_adapter *adapter)
 {
        struct device *dev = &adapter->dev;
-       int id;
+       int err;
 
        if (dev->of_node) {
-               id = of_alias_get_id(dev->of_node, "i2c");
-               if (id >= 0) {
-                       adapter->nr = id;
+               err = of_alias_get_id(dev->of_node, "i2c");
+               if (err >= 0) {
+                       adapter->nr = err;
                        return __i2c_add_numbered_adapter(adapter);
                }
        }
 
        mutex_lock(&core_lock);
-       id = idr_alloc(&i2c_adapter_idr, adapter,
-                      __i2c_first_dynamic_bus_num, 0, GFP_KERNEL);
+       err = xa_alloc(&i2c_adapters, &adapter->nr, adapter,
+                      XA_LIMIT(__i2c_first_dynamic_bus_num, UINT_MAX),
+                      GFP_KERNEL);
        mutex_unlock(&core_lock);
-       if (WARN(id < 0, "couldn't get idr"))
-               return id;
-
-       adapter->nr = id;
+       if (WARN(err < 0, "couldn't allocate adapter id"))
+               return err;
 
        return i2c_register_adapter(adapter);
 }
@@ -1537,10 +1536,8 @@ void i2c_del_adapter(struct i2c_adapter *adap)
        struct i2c_adapter *found;
        struct i2c_client *client, *next;
 
-       /* First make sure that this adapter was ever added */
-       mutex_lock(&core_lock);
-       found = idr_find(&i2c_adapter_idr, adap->nr);
-       mutex_unlock(&core_lock);
+       /* First make sure that this adapter was never added */
+       found = xa_load(&i2c_adapters, adap->nr);
        if (found != adap) {
                pr_debug("attempting to delete unregistered adapter [%s]\n", adap->name);
                return;
@@ -1598,7 +1595,7 @@ void i2c_del_adapter(struct i2c_adapter *adap)
 
        /* free bus id */
        mutex_lock(&core_lock);
-       idr_remove(&i2c_adapter_idr, adap->nr);
+       xa_erase(&i2c_adapters, adap->nr);
        mutex_unlock(&core_lock);
 
        /* Clear the device structure in case this adapter is ever going to be
@@ -2319,7 +2316,7 @@ struct i2c_adapter *i2c_get_adapter(int nr)
        struct i2c_adapter *adapter;
 
        mutex_lock(&core_lock);
-       adapter = idr_find(&i2c_adapter_idr, nr);
+       adapter = xa_load(&i2c_adapters, nr);
        if (!adapter)
                goto exit;