aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorBartosz Golaszewski <bgolaszewski@baylibre.com>2018-03-23 09:04:48 -0400
committerPhilipp Zabel <p.zabel@pengutronix.de>2018-03-27 04:39:47 -0400
commite2749bb998701e21cdb8b34486b82fc1c051ab41 (patch)
treec556d6f584df155e4ab6f56f88f4a4f928f4e836 /drivers
parent6691dffab0ab6301bb7b489b1dcf9f5efdef202f (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.c38
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 */
160void reset_controller_add_lookup(struct reset_controller_dev *rcdev, 159void 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}
527EXPORT_SYMBOL_GPL(__of_reset_control_get); 524EXPORT_SYMBOL_GPL(__of_reset_control_get);
528 525
526static 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
529static struct reset_control * 544static 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);