diff options
Diffstat (limited to 'drivers/gpio/gpio-sim.c')
| -rw-r--r-- | drivers/gpio/gpio-sim.c | 60 | 
1 files changed, 37 insertions, 23 deletions
| diff --git a/drivers/gpio/gpio-sim.c b/drivers/gpio/gpio-sim.c index 2ed5cbe7c8a8..dcca1d7f173e 100644 --- a/drivers/gpio/gpio-sim.c +++ b/drivers/gpio/gpio-sim.c @@ -7,6 +7,7 @@  #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt +#include <linux/array_size.h>  #include <linux/bitmap.h>  #include <linux/cleanup.h>  #include <linux/completion.h> @@ -20,7 +21,6 @@  #include <linux/interrupt.h>  #include <linux/irq.h>  #include <linux/irq_sim.h> -#include <linux/kernel.h>  #include <linux/list.h>  #include <linux/lockdep.h>  #include <linux/minmax.h> @@ -227,6 +227,27 @@ static void gpio_sim_free(struct gpio_chip *gc, unsigned int offset)  	}  } +static int gpio_sim_irq_requested(struct irq_domain *domain, +				  irq_hw_number_t hwirq, void *data) +{ +	struct gpio_sim_chip *chip = data; + +	return gpiochip_lock_as_irq(&chip->gc, hwirq); +} + +static void gpio_sim_irq_released(struct irq_domain *domain, +				  irq_hw_number_t hwirq, void *data) +{ +	struct gpio_sim_chip *chip = data; + +	gpiochip_unlock_as_irq(&chip->gc, hwirq); +} + +static const struct irq_sim_ops gpio_sim_irq_sim_ops = { +	.irq_sim_irq_requested = gpio_sim_irq_requested, +	.irq_sim_irq_released = gpio_sim_irq_released, +}; +  static void gpio_sim_dbg_show(struct seq_file *seq, struct gpio_chip *gc)  {  	struct gpio_sim_chip *chip = gpiochip_get_data(gc); @@ -308,13 +329,6 @@ static ssize_t gpio_sim_sysfs_pull_store(struct device *dev,  	return len;  } -static void gpio_sim_mutex_destroy(void *data) -{ -	struct mutex *lock = data; - -	mutex_destroy(lock); -} -  static void gpio_sim_put_device(void *data)  {  	struct device *dev = data; @@ -450,7 +464,9 @@ static int gpio_sim_add_bank(struct fwnode_handle *swnode, struct device *dev)  	if (!chip->pull_map)  		return -ENOMEM; -	chip->irq_sim = devm_irq_domain_create_sim(dev, swnode, num_lines); +	chip->irq_sim = devm_irq_domain_create_sim_full(dev, swnode, num_lines, +							&gpio_sim_irq_sim_ops, +							chip);  	if (IS_ERR(chip->irq_sim))  		return PTR_ERR(chip->irq_sim); @@ -458,9 +474,7 @@ static int gpio_sim_add_bank(struct fwnode_handle *swnode, struct device *dev)  	if (ret)  		return ret; -	mutex_init(&chip->lock); -	ret = devm_add_action_or_reset(dev, gpio_sim_mutex_destroy, -				       &chip->lock); +	ret = devm_mutex_init(dev, &chip->lock);  	if (ret)  		return ret; @@ -581,19 +595,19 @@ static int gpio_sim_bus_notifier_call(struct notifier_block *nb,  	snprintf(devname, sizeof(devname), "gpio-sim.%u", simdev->id); -	if (strcmp(dev_name(dev), devname) == 0) { -		if (action == BUS_NOTIFY_BOUND_DRIVER) -			simdev->driver_bound = true; -		else if (action == BUS_NOTIFY_DRIVER_NOT_BOUND) -			simdev->driver_bound = false; -		else -			return NOTIFY_DONE; +	if (!device_match_name(dev, devname)) +		return NOTIFY_DONE; -		complete(&simdev->probe_completion); -		return NOTIFY_OK; -	} +	if (action == BUS_NOTIFY_BOUND_DRIVER) +		simdev->driver_bound = true; +	else if (action == BUS_NOTIFY_DRIVER_NOT_BOUND) +		simdev->driver_bound = false; +	else +		return NOTIFY_DONE; + +	complete(&simdev->probe_completion); -	return NOTIFY_DONE; +	return NOTIFY_OK;  }  static struct gpio_sim_device *to_gpio_sim_device(struct config_item *item) |