Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2304b473 authored by Stephen Warren's avatar Stephen Warren Committed by Linus Walleij
Browse files

pinctrl: remove pin and hogs locks from struct pinctrl_dev



struct pinctrl_dev's pin_desc_tree_lock and pinctrl_hogs_lock aren't
useful; the data they protect is read-only except when registering or
unregistering a pinctrl_dev, and at those times, it doesn't make sense to
protect one part of the structure independently from the rest.

Move pinctrl_init_device_debugfs() to the end of pinctrl_register() so
that debugfs can't access the struct pinctrl_dev until it's fully
initialized, i.e. after the hogs are set up.

Signed-off-by: default avatarStephen Warren <swarren@nvidia.com>
Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
parent 02f5b989
Loading
Loading
Loading
Loading
+2 −23
Original line number Original line Diff line number Diff line
@@ -115,18 +115,6 @@ struct pinctrl_dev *get_pinctrl_dev_from_devname(const char *devname)
	return found ? pctldev : NULL;
	return found ? pctldev : NULL;
}
}


struct pin_desc *pin_desc_get(struct pinctrl_dev *pctldev, unsigned int pin)
{
	struct pin_desc *pindesc;
	unsigned long flags;

	spin_lock_irqsave(&pctldev->pin_desc_tree_lock, flags);
	pindesc = radix_tree_lookup(&pctldev->pin_desc_tree, pin);
	spin_unlock_irqrestore(&pctldev->pin_desc_tree_lock, flags);

	return pindesc;
}

/**
/**
 * pin_get_from_name() - look up a pin number from a name
 * pin_get_from_name() - look up a pin number from a name
 * @pctldev: the pin control device to lookup the pin on
 * @pctldev: the pin control device to lookup the pin on
@@ -182,7 +170,6 @@ static void pinctrl_free_pindescs(struct pinctrl_dev *pctldev,
{
{
	int i;
	int i;


	spin_lock(&pctldev->pin_desc_tree_lock);
	for (i = 0; i < num_pins; i++) {
	for (i = 0; i < num_pins; i++) {
		struct pin_desc *pindesc;
		struct pin_desc *pindesc;


@@ -196,7 +183,6 @@ static void pinctrl_free_pindescs(struct pinctrl_dev *pctldev,
		}
		}
		kfree(pindesc);
		kfree(pindesc);
	}
	}
	spin_unlock(&pctldev->pin_desc_tree_lock);
}
}


static int pinctrl_register_one_pin(struct pinctrl_dev *pctldev,
static int pinctrl_register_one_pin(struct pinctrl_dev *pctldev,
@@ -232,9 +218,7 @@ static int pinctrl_register_one_pin(struct pinctrl_dev *pctldev,
		pindesc->dynamic_name = true;
		pindesc->dynamic_name = true;
	}
	}


	spin_lock(&pctldev->pin_desc_tree_lock);
	radix_tree_insert(&pctldev->pin_desc_tree, number, pindesc);
	radix_tree_insert(&pctldev->pin_desc_tree, number, pindesc);
	spin_unlock(&pctldev->pin_desc_tree_lock);
	pr_debug("registered pin %d (%s) on %s\n",
	pr_debug("registered pin %d (%s) on %s\n",
		 number, pindesc->name, pctldev->desc->name);
		 number, pindesc->name, pctldev->desc->name);
	return 0;
	return 0;
@@ -756,9 +740,7 @@ static int pinctrl_hog_map(struct pinctrl_dev *pctldev,


	dev_info(pctldev->dev, "hogged map %s, function %s\n", map->name,
	dev_info(pctldev->dev, "hogged map %s, function %s\n", map->name,
		 map->function);
		 map->function);
	mutex_lock(&pctldev->pinctrl_hogs_lock);
	list_add_tail(&hog->node, &pctldev->pinctrl_hogs);
	list_add_tail(&hog->node, &pctldev->pinctrl_hogs);
	mutex_unlock(&pctldev->pinctrl_hogs_lock);


	return 0;
	return 0;
}
}
@@ -781,7 +763,6 @@ static int pinctrl_hog_maps(struct pinctrl_dev *pctldev)
	struct pinctrl_map const *map;
	struct pinctrl_map const *map;


	INIT_LIST_HEAD(&pctldev->pinctrl_hogs);
	INIT_LIST_HEAD(&pctldev->pinctrl_hogs);
	mutex_init(&pctldev->pinctrl_hogs_lock);


	mutex_lock(&pinctrl_maps_mutex);
	mutex_lock(&pinctrl_maps_mutex);
	for_each_maps(maps_node, i, map) {
	for_each_maps(maps_node, i, map) {
@@ -808,7 +789,6 @@ static void pinctrl_unhog_maps(struct pinctrl_dev *pctldev)
{
{
	struct list_head *node, *tmp;
	struct list_head *node, *tmp;


	mutex_lock(&pctldev->pinctrl_hogs_lock);
	list_for_each_safe(node, tmp, &pctldev->pinctrl_hogs) {
	list_for_each_safe(node, tmp, &pctldev->pinctrl_hogs) {
		struct pinctrl_hog *hog =
		struct pinctrl_hog *hog =
			list_entry(node, struct pinctrl_hog, node);
			list_entry(node, struct pinctrl_hog, node);
@@ -817,7 +797,6 @@ static void pinctrl_unhog_maps(struct pinctrl_dev *pctldev)
		list_del(node);
		list_del(node);
		kfree(hog);
		kfree(hog);
	}
	}
	mutex_unlock(&pctldev->pinctrl_hogs_lock);
}
}


#ifdef CONFIG_DEBUG_FS
#ifdef CONFIG_DEBUG_FS
@@ -1171,7 +1150,6 @@ struct pinctrl_dev *pinctrl_register(struct pinctrl_desc *pctldesc,
	pctldev->desc = pctldesc;
	pctldev->desc = pctldesc;
	pctldev->driver_data = driver_data;
	pctldev->driver_data = driver_data;
	INIT_RADIX_TREE(&pctldev->pin_desc_tree, GFP_KERNEL);
	INIT_RADIX_TREE(&pctldev->pin_desc_tree, GFP_KERNEL);
	spin_lock_init(&pctldev->pin_desc_tree_lock);
	INIT_LIST_HEAD(&pctldev->gpio_ranges);
	INIT_LIST_HEAD(&pctldev->gpio_ranges);
	mutex_init(&pctldev->gpio_ranges_lock);
	mutex_init(&pctldev->gpio_ranges_lock);
	pctldev->dev = dev;
	pctldev->dev = dev;
@@ -1207,11 +1185,12 @@ struct pinctrl_dev *pinctrl_register(struct pinctrl_desc *pctldesc,
		goto out_err;
		goto out_err;
	}
	}


	pinctrl_init_device_debugfs(pctldev);
	mutex_lock(&pinctrldev_list_mutex);
	mutex_lock(&pinctrldev_list_mutex);
	list_add_tail(&pctldev->node, &pinctrldev_list);
	list_add_tail(&pctldev->node, &pinctrldev_list);
	mutex_unlock(&pinctrldev_list_mutex);
	mutex_unlock(&pinctrldev_list_mutex);
	pinctrl_hog_maps(pctldev);
	pinctrl_hog_maps(pctldev);
	pinctrl_init_device_debugfs(pctldev);

	return pctldev;
	return pctldev;


out_err:
out_err:
+6 −5
Original line number Original line Diff line number Diff line
@@ -20,7 +20,6 @@ struct pinctrl_gpio_range;
 *	controller
 *	controller
 * @pin_desc_tree: each pin descriptor for this pin controller is stored in
 * @pin_desc_tree: each pin descriptor for this pin controller is stored in
 *	this radix tree
 *	this radix tree
 * @pin_desc_tree_lock: lock for the descriptor tree
 * @gpio_ranges: a list of GPIO ranges that is handled by this pin controller,
 * @gpio_ranges: a list of GPIO ranges that is handled by this pin controller,
 *	ranges are added to this list at runtime
 *	ranges are added to this list at runtime
 * @gpio_ranges_lock: lock for the GPIO ranges list
 * @gpio_ranges_lock: lock for the GPIO ranges list
@@ -28,7 +27,6 @@ struct pinctrl_gpio_range;
 * @owner: module providing the pin controller, used for refcounting
 * @owner: module providing the pin controller, used for refcounting
 * @driver_data: driver data for drivers registering to the pin controller
 * @driver_data: driver data for drivers registering to the pin controller
 *	subsystem
 *	subsystem
 * @pinctrl_hogs_lock: lock for the pin control hog list
 * @pinctrl_hogs: list of pin control maps hogged by this device
 * @pinctrl_hogs: list of pin control maps hogged by this device
 * @device_root: debugfs root for this device
 * @device_root: debugfs root for this device
 */
 */
@@ -36,13 +34,11 @@ struct pinctrl_dev {
	struct list_head node;
	struct list_head node;
	struct pinctrl_desc *desc;
	struct pinctrl_desc *desc;
	struct radix_tree_root pin_desc_tree;
	struct radix_tree_root pin_desc_tree;
	spinlock_t pin_desc_tree_lock;
	struct list_head gpio_ranges;
	struct list_head gpio_ranges;
	struct mutex gpio_ranges_lock;
	struct mutex gpio_ranges_lock;
	struct device *dev;
	struct device *dev;
	struct module *owner;
	struct module *owner;
	void *driver_data;
	void *driver_data;
	struct mutex pinctrl_hogs_lock;
	struct list_head pinctrl_hogs;
	struct list_head pinctrl_hogs;
#ifdef CONFIG_DEBUG_FS
#ifdef CONFIG_DEBUG_FS
	struct dentry *device_root;
	struct dentry *device_root;
@@ -99,7 +95,12 @@ struct pin_desc {
};
};


struct pinctrl_dev *get_pinctrl_dev_from_devname(const char *dev_name);
struct pinctrl_dev *get_pinctrl_dev_from_devname(const char *dev_name);
struct pin_desc *pin_desc_get(struct pinctrl_dev *pctldev, unsigned int pin);
int pin_get_from_name(struct pinctrl_dev *pctldev, const char *name);
int pin_get_from_name(struct pinctrl_dev *pctldev, const char *name);
int pinctrl_get_group_selector(struct pinctrl_dev *pctldev,
int pinctrl_get_group_selector(struct pinctrl_dev *pctldev,
			       const char *pin_group);
			       const char *pin_group);

static inline struct pin_desc *pin_desc_get(struct pinctrl_dev *pctldev,
					    unsigned int pin)
{
	return radix_tree_lookup(&pctldev->pin_desc_tree, pin);
}