regmap: Add a config option for hwspinlock
authorMark Brown <broonie@kernel.org>
Fri, 3 Nov 2017 11:38:04 +0000 (12:38 +0100)
committerMark Brown <broonie@kernel.org>
Fri, 3 Nov 2017 11:38:04 +0000 (12:38 +0100)
Unlike other lock types hwspinlocks are optional and can be built
modular so we can't use them unconditionally in regmap so add a config
option that drivers that want to use hwspinlocks with regmap can select
which will ensure that hwspinlock is built in.

Signed-off-by: Mark Brown <broonie@kernel.org>
drivers/base/regmap/Kconfig
drivers/base/regmap/regmap.c

index 073c0b77e5b301f263fca13cd869cc20aef74d77..2d5e849f79c951607619b54d2d889475a0079ee4 100644 (file)
@@ -5,6 +5,7 @@
 config REGMAP
        default y if (REGMAP_I2C || REGMAP_SPI || REGMAP_SPMI || REGMAP_W1 || REGMAP_AC97 || REGMAP_MMIO || REGMAP_IRQ)
        select IRQ_DOMAIN if REGMAP_IRQ
+       select HWSPINLOCK if REGMAP_HWSPINLOCK
        bool
 
 config REGCACHE_COMPRESSED
@@ -36,3 +37,6 @@ config REGMAP_MMIO
 
 config REGMAP_IRQ
        bool
+
+config REGMAP_HWSPINLOCK
+       bool
index 999e981a174af3e64ef2ad3125d473b66ba98297..ff6ef6a579c6151bdc799447b6ccdad8928d1e2b 100644 (file)
@@ -414,6 +414,7 @@ static unsigned int regmap_parse_64_native(const void *buf)
 }
 #endif
 
+#ifdef REGMAP_HWSPINLOCK
 static void regmap_lock_hwlock(void *__map)
 {
        struct regmap *map = __map;
@@ -456,6 +457,7 @@ static void regmap_unlock_hwlock_irqrestore(void *__map)
 
        hwspin_unlock_irqrestore(map->hwlock, &map->spinlock_flags);
 }
+#endif
 
 static void regmap_lock_mutex(void *__map)
 {
@@ -672,6 +674,7 @@ struct regmap *__regmap_init(struct device *dev,
                map->unlock = config->unlock;
                map->lock_arg = config->lock_arg;
        } else if (config->hwlock_id) {
+#ifdef REGMAP_HWSPINLOCK
                map->hwlock = hwspin_lock_request_specific(config->hwlock_id);
                if (!map->hwlock) {
                        ret = -ENXIO;
@@ -694,6 +697,10 @@ struct regmap *__regmap_init(struct device *dev,
                }
 
                map->lock_arg = map;
+#else
+               ret = -EINVAL;
+               goto err;
+#endif
        } else {
                if ((bus && bus->fast_io) ||
                    config->fast_io) {