nvmem: core: fix read buffer in place
When the bit_offset in the cell is zero, the pointer to the msb will not be properly initialized (ie, will still be pointing to the first byte in the buffer). This being the case, if there are bits to clear in the msb, those will be left untouched while the mask will incorrectly clear bit positions on the first byte. This commit also makes sure that any byte unused in the cell is cleared. Signed-off-by: Jorge Ramirez-Ortiz <jorge.ramirez-ortiz@linaro.org> Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
0a9b2d1ce4
commit
2fe518fecb
|
@ -1166,7 +1166,7 @@ EXPORT_SYMBOL_GPL(nvmem_cell_put);
|
|||
static void nvmem_shift_read_buffer_in_place(struct nvmem_cell *cell, void *buf)
|
||||
{
|
||||
u8 *p, *b;
|
||||
int i, bit_offset = cell->bit_offset;
|
||||
int i, extra, bit_offset = cell->bit_offset;
|
||||
|
||||
p = b = buf;
|
||||
if (bit_offset) {
|
||||
|
@ -1181,11 +1181,16 @@ static void nvmem_shift_read_buffer_in_place(struct nvmem_cell *cell, void *buf)
|
|||
p = b;
|
||||
*b++ >>= bit_offset;
|
||||
}
|
||||
|
||||
/* result fits in less bytes */
|
||||
if (cell->bytes != DIV_ROUND_UP(cell->nbits, BITS_PER_BYTE))
|
||||
*p-- = 0;
|
||||
} else {
|
||||
/* point to the msb */
|
||||
p += cell->bytes - 1;
|
||||
}
|
||||
|
||||
/* result fits in less bytes */
|
||||
extra = cell->bytes - DIV_ROUND_UP(cell->nbits, BITS_PER_BYTE);
|
||||
while (--extra >= 0)
|
||||
*p-- = 0;
|
||||
|
||||
/* clear msb bits if any leftover in the last byte */
|
||||
*p &= GENMASK((cell->nbits%BITS_PER_BYTE) - 1, 0);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user