diff options
author | Bartosz Golaszewski <bgolaszewski@baylibre.com> | 2018-03-23 09:04:48 -0400 |
---|---|---|
committer | Philipp Zabel <p.zabel@pengutronix.de> | 2018-03-27 04:39:47 -0400 |
commit | e2749bb998701e21cdb8b34486b82fc1c051ab41 (patch) | |
tree | c556d6f584df155e4ab6f56f88f4a4f928f4e836 /drivers | |
parent | 6691dffab0ab6301bb7b489b1dcf9f5efdef202f (diff) |
reset: modify the way reset lookup works for board files
Commit 7af1bb19f1d7 ("reset: add support for non-DT systems")
introduced reset control lookup mechanism for boards that still use
board files.
The routine used to register lookup entries takes the corresponding
reset_controlled_dev structure as argument.
It's been determined however that for the first user of this new
interface - davinci psc driver - it will be easier to register the
lookup entries using the reset controller device name.
This patch changes the way lookup entries are added.
Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
[p.zabel@pengutronix.de: added missing ERR_PTR]
Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/reset/core.c | 38 |
1 files changed, 31 insertions, 7 deletions
diff --git a/drivers/reset/core.c b/drivers/reset/core.c index 06fa4907afc4..6488292e129c 100644 --- a/drivers/reset/core.c +++ b/drivers/reset/core.c | |||
@@ -153,12 +153,10 @@ EXPORT_SYMBOL_GPL(devm_reset_controller_register); | |||
153 | 153 | ||
154 | /** | 154 | /** |
155 | * reset_controller_add_lookup - register a set of lookup entries | 155 | * reset_controller_add_lookup - register a set of lookup entries |
156 | * @rcdev: initialized reset controller device owning the reset line | ||
157 | * @lookup: array of reset lookup entries | 156 | * @lookup: array of reset lookup entries |
158 | * @num_entries: number of entries in the lookup array | 157 | * @num_entries: number of entries in the lookup array |
159 | */ | 158 | */ |
160 | void reset_controller_add_lookup(struct reset_controller_dev *rcdev, | 159 | void reset_controller_add_lookup(struct reset_control_lookup *lookup, |
161 | struct reset_control_lookup *lookup, | ||
162 | unsigned int num_entries) | 160 | unsigned int num_entries) |
163 | { | 161 | { |
164 | struct reset_control_lookup *entry; | 162 | struct reset_control_lookup *entry; |
@@ -168,13 +166,12 @@ void reset_controller_add_lookup(struct reset_controller_dev *rcdev, | |||
168 | for (i = 0; i < num_entries; i++) { | 166 | for (i = 0; i < num_entries; i++) { |
169 | entry = &lookup[i]; | 167 | entry = &lookup[i]; |
170 | 168 | ||
171 | if (!entry->dev_id) { | 169 | if (!entry->dev_id || !entry->provider) { |
172 | pr_warn("%s(): reset lookup entry has no dev_id, skipping\n", | 170 | pr_warn("%s(): reset lookup entry badly specified, skipping\n", |
173 | __func__); | 171 | __func__); |
174 | continue; | 172 | continue; |
175 | } | 173 | } |
176 | 174 | ||
177 | entry->rcdev = rcdev; | ||
178 | list_add_tail(&entry->list, &reset_lookup_list); | 175 | list_add_tail(&entry->list, &reset_lookup_list); |
179 | } | 176 | } |
180 | mutex_unlock(&reset_lookup_mutex); | 177 | mutex_unlock(&reset_lookup_mutex); |
@@ -526,11 +523,30 @@ struct reset_control *__of_reset_control_get(struct device_node *node, | |||
526 | } | 523 | } |
527 | EXPORT_SYMBOL_GPL(__of_reset_control_get); | 524 | EXPORT_SYMBOL_GPL(__of_reset_control_get); |
528 | 525 | ||
526 | static struct reset_controller_dev * | ||
527 | __reset_controller_by_name(const char *name) | ||
528 | { | ||
529 | struct reset_controller_dev *rcdev; | ||
530 | |||
531 | lockdep_assert_held(&reset_list_mutex); | ||
532 | |||
533 | list_for_each_entry(rcdev, &reset_controller_list, list) { | ||
534 | if (!rcdev->dev) | ||
535 | continue; | ||
536 | |||
537 | if (!strcmp(name, dev_name(rcdev->dev))) | ||
538 | return rcdev; | ||
539 | } | ||
540 | |||
541 | return NULL; | ||
542 | } | ||
543 | |||
529 | static struct reset_control * | 544 | static struct reset_control * |
530 | __reset_control_get_from_lookup(struct device *dev, const char *con_id, | 545 | __reset_control_get_from_lookup(struct device *dev, const char *con_id, |
531 | bool shared, bool optional) | 546 | bool shared, bool optional) |
532 | { | 547 | { |
533 | const struct reset_control_lookup *lookup; | 548 | const struct reset_control_lookup *lookup; |
549 | struct reset_controller_dev *rcdev; | ||
534 | const char *dev_id = dev_name(dev); | 550 | const char *dev_id = dev_name(dev); |
535 | struct reset_control *rstc = NULL; | 551 | struct reset_control *rstc = NULL; |
536 | 552 | ||
@@ -547,7 +563,15 @@ __reset_control_get_from_lookup(struct device *dev, const char *con_id, | |||
547 | ((con_id && lookup->con_id) && | 563 | ((con_id && lookup->con_id) && |
548 | !strcmp(con_id, lookup->con_id))) { | 564 | !strcmp(con_id, lookup->con_id))) { |
549 | mutex_lock(&reset_list_mutex); | 565 | mutex_lock(&reset_list_mutex); |
550 | rstc = __reset_control_get_internal(lookup->rcdev, | 566 | rcdev = __reset_controller_by_name(lookup->provider); |
567 | if (!rcdev) { | ||
568 | mutex_unlock(&reset_list_mutex); | ||
569 | mutex_unlock(&reset_lookup_mutex); | ||
570 | /* Reset provider may not be ready yet. */ | ||
571 | return ERR_PTR(-EPROBE_DEFER); | ||
572 | } | ||
573 | |||
574 | rstc = __reset_control_get_internal(rcdev, | ||
551 | lookup->index, | 575 | lookup->index, |
552 | shared); | 576 | shared); |
553 | mutex_unlock(&reset_list_mutex); | 577 | mutex_unlock(&reset_list_mutex); |