Unverified Commit 6bbebcc1 authored by Mark Brown's avatar Mark Brown
Browse files

regmap: Merge up fix for window/paging issue

This was too late and could potentially impact too many drivers for me
to be comfortable sending it before the merge window.
parents 6a2e332c 0ec77316
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -453,7 +453,8 @@ static int regcache_rbtree_write(struct regmap *map, unsigned int reg,
		if (!rbnode)
			return -ENOMEM;
		regcache_rbtree_set_register(map, rbnode,
					     reg - rbnode->base_reg, value);
					     (reg - rbnode->base_reg) / map->reg_stride,
					     value);
		regcache_rbtree_insert(map, &rbtree_ctx->root, rbnode);
		rbtree_ctx->cached_rbnode = rbnode;
	}
+30 −0
Original line number Diff line number Diff line
@@ -334,6 +334,11 @@ static int regcache_default_sync(struct regmap *map, unsigned int min,
	return 0;
}

static int rbtree_all(const void *key, const struct rb_node *node)
{
	return 0;
}

/**
 * regcache_sync - Sync the register cache with the hardware.
 *
@@ -351,6 +356,7 @@ int regcache_sync(struct regmap *map)
	unsigned int i;
	const char *name;
	bool bypass;
	struct rb_node *node;

	if (WARN_ON(map->cache_type == REGCACHE_NONE))
		return -EINVAL;
@@ -392,6 +398,30 @@ int regcache_sync(struct regmap *map)
	/* Restore the bypass state */
	map->cache_bypass = bypass;
	map->no_sync_defaults = false;

	/*
	 * If we did any paging with cache bypassed and a cached
	 * paging register then the register and cache state might
	 * have gone out of sync, force writes of all the paging
	 * registers.
	 */
	rb_for_each(node, 0, &map->range_tree, rbtree_all) {
		struct regmap_range_node *this =
			rb_entry(node, struct regmap_range_node, node);

		/* If there's nothing in the cache there's nothing to sync */
		ret = regcache_read(map, this->selector_reg, &i);
		if (ret != 0)
			continue;

		ret = _regmap_write(map, this->selector_reg, i);
		if (ret != 0) {
			dev_err(map->dev, "Failed to write %x = %x: %d\n",
				this->selector_reg, i, ret);
			break;
		}
	}

	map->unlock(map->lock_arg);

	regmap_async_complete(map);
+1 −1
Original line number Diff line number Diff line
@@ -1478,7 +1478,7 @@ static int dev_get_regmap_match(struct device *dev, void *res, void *data)

	/* If the user didn't specify a name match any */
	if (data)
		return !strcmp((*r)->name, data);
		return (*r)->name && !strcmp((*r)->name, data);
	else
		return 1;
}