Re: Using regmap_update_bits to update a write only register

From: Lars-Peter Clausen
Date: Fri Mar 06 2015 - 12:39:45 EST


On 03/06/2015 06:36 PM, Lars-Peter Clausen wrote:
On 03/06/2015 06:26 PM, Daniel Baluta wrote:
[...]
I can reproduce the problem with:

static struct reg_default xxx_reg_defaults[] = {
{ XXX_REG_CTRL0, 0x00 },
{ XXX_REG_CTRL1, 0x00 },
{ XXX_REG_STATUS, 0x00 },
};

but, not if the reg default definition is:

static struct reg_default xxx_reg_defaults[] = {
{ XXX_REG_STATUS, 0x00 },
{ XXX_REG_CTRL0, 0x00 },
{ XXX_REG_CTRL1, 0x00 },
};

Is this normal?

That's a rhetorical question, right?

It might be that there is a bug when growing a rbblock to the left. It
probably went unnoticed because everybody has their reg defaults ordered in
ascending order.

Try to put a few debug printks into regcache_rbtree_write() and
regcache_rbtree_insert_to_block() to see what exactly is going on when a new
register is inserted into the block. How do base_reg and top_reg change.

Try to replace the bitmap_shift_right() in regcache_rbtree_insert_to_block() with shift bitmap_shift_left(), I suspect that will do the trick.

- Lars

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/