@@ -582,8 +582,8 @@ static int nvmem_cell_info_to_nvmem_cell_entry_nodup(struct nvmem_device *nvmem,
582582 cell -> np = info -> np ;
583583
584584 if (cell -> nbits )
585- cell -> bytes = DIV_ROUND_UP (cell -> nbits + cell -> bit_offset ,
586- BITS_PER_BYTE );
585+ cell -> bytes = round_up ( DIV_ROUND_UP (cell -> nbits + cell -> bit_offset ,
586+ BITS_PER_BYTE ), nvmem -> word_size ) ;
587587
588588 if (!IS_ALIGNED (cell -> offset , nvmem -> stride )) {
589589 dev_err (& nvmem -> dev ,
@@ -824,11 +824,6 @@ static int nvmem_add_cells_from_dt(struct nvmem_device *nvmem, struct device_nod
824824 if (addr && len == (2 * sizeof (u32 ))) {
825825 info .bit_offset = be32_to_cpup (addr ++ );
826826 info .nbits = be32_to_cpup (addr );
827- if (info .bit_offset >= BITS_PER_BYTE || info .nbits < 1 ) {
828- dev_err (dev , "nvmem: invalid bits on %pOF\n" , child );
829- of_node_put (child );
830- return - EINVAL ;
831- }
832827 }
833828
834829 info .np = of_node_get (child );
@@ -1617,15 +1612,23 @@ EXPORT_SYMBOL_GPL(nvmem_cell_put);
16171612static void nvmem_shift_read_buffer_in_place (struct nvmem_cell_entry * cell , void * buf )
16181613{
16191614 u8 * p , * b ;
1620- int i , extra , bit_offset = cell -> bit_offset ;
1615+ int i , padding , extra , bit_offset = cell -> bit_offset ;
1616+ int bytes = cell -> bytes ;
16211617
16221618 p = b = buf ;
16231619 if (bit_offset ) {
1620+ padding = bit_offset /8 ;
1621+ if (padding ) {
1622+ memmove (buf , buf + padding , bytes - padding );
1623+ bit_offset -= BITS_PER_BYTE * padding ;
1624+ bytes -= padding ;
1625+ }
1626+
16241627 /* First shift */
16251628 * b ++ >>= bit_offset ;
16261629
16271630 /* setup rest of the bytes if any */
1628- for (i = 1 ; i < cell -> bytes ; i ++ ) {
1631+ for (i = 1 ; i < bytes ; i ++ ) {
16291632 /* Get bits from next byte and shift them towards msb */
16301633 * p |= * b << (BITS_PER_BYTE - bit_offset );
16311634
@@ -1638,7 +1641,7 @@ static void nvmem_shift_read_buffer_in_place(struct nvmem_cell_entry *cell, void
16381641 }
16391642
16401643 /* result fits in less bytes */
1641- extra = cell -> bytes - DIV_ROUND_UP (cell -> nbits , BITS_PER_BYTE );
1644+ extra = bytes - DIV_ROUND_UP (cell -> nbits , BITS_PER_BYTE );
16421645 while (-- extra >= 0 )
16431646 * p -- = 0 ;
16441647
0 commit comments