@@ -564,8 +564,8 @@ static int nvmem_cell_info_to_nvmem_cell_entry_nodup(struct nvmem_device *nvmem,
564564 cell -> np = info -> np ;
565565
566566 if (cell -> nbits )
567- cell -> bytes = DIV_ROUND_UP (cell -> nbits + cell -> bit_offset ,
568- BITS_PER_BYTE );
567+ cell -> bytes = round_up ( DIV_ROUND_UP (cell -> nbits + cell -> bit_offset ,
568+ BITS_PER_BYTE ), nvmem -> word_size ) ;
569569
570570 if (!IS_ALIGNED (cell -> offset , nvmem -> stride )) {
571571 dev_err (& nvmem -> dev ,
@@ -806,11 +806,6 @@ static int nvmem_add_cells_from_dt(struct nvmem_device *nvmem, struct device_nod
806806 if (addr && len == (2 * sizeof (u32 ))) {
807807 info .bit_offset = be32_to_cpup (addr ++ );
808808 info .nbits = be32_to_cpup (addr );
809- if (info .bit_offset >= BITS_PER_BYTE || info .nbits < 1 ) {
810- dev_err (dev , "nvmem: invalid bits on %pOF\n" , child );
811- of_node_put (child );
812- return - EINVAL ;
813- }
814809 }
815810
816811 info .np = of_node_get (child );
@@ -1599,15 +1594,23 @@ EXPORT_SYMBOL_GPL(nvmem_cell_put);
15991594static void nvmem_shift_read_buffer_in_place (struct nvmem_cell_entry * cell , void * buf )
16001595{
16011596 u8 * p , * b ;
1602- int i , extra , bit_offset = cell -> bit_offset ;
1597+ int i , padding , extra , bit_offset = cell -> bit_offset ;
1598+ int bytes = cell -> bytes ;
16031599
16041600 p = b = buf ;
16051601 if (bit_offset ) {
1602+ padding = bit_offset /8 ;
1603+ if (padding ) {
1604+ memmove (buf , buf + padding , bytes - padding );
1605+ bit_offset -= BITS_PER_BYTE * padding ;
1606+ bytes -= padding ;
1607+ }
1608+
16061609 /* First shift */
16071610 * b ++ >>= bit_offset ;
16081611
16091612 /* setup rest of the bytes if any */
1610- for (i = 1 ; i < cell -> bytes ; i ++ ) {
1613+ for (i = 1 ; i < bytes ; i ++ ) {
16111614 /* Get bits from next byte and shift them towards msb */
16121615 * p |= * b << (BITS_PER_BYTE - bit_offset );
16131616
@@ -1620,7 +1623,7 @@ static void nvmem_shift_read_buffer_in_place(struct nvmem_cell_entry *cell, void
16201623 }
16211624
16221625 /* result fits in less bytes */
1623- extra = cell -> bytes - DIV_ROUND_UP (cell -> nbits , BITS_PER_BYTE );
1626+ extra = bytes - DIV_ROUND_UP (cell -> nbits , BITS_PER_BYTE );
16241627 while (-- extra >= 0 )
16251628 * p -- = 0 ;
16261629
0 commit comments