@@ -565,8 +565,8 @@ static int nvmem_cell_info_to_nvmem_cell_entry_nodup(struct nvmem_device *nvmem,
565565 cell -> np = info -> np ;
566566
567567 if (cell -> nbits )
568- cell -> bytes = DIV_ROUND_UP (cell -> nbits + cell -> bit_offset ,
569- BITS_PER_BYTE );
568+ cell -> bytes = round_up ( DIV_ROUND_UP (cell -> nbits + cell -> bit_offset ,
569+ BITS_PER_BYTE ), nvmem -> word_size ) ;
570570
571571 if (!IS_ALIGNED (cell -> offset , nvmem -> stride )) {
572572 dev_err (& nvmem -> dev ,
@@ -807,11 +807,6 @@ static int nvmem_add_cells_from_dt(struct nvmem_device *nvmem, struct device_nod
807807 if (addr && len == (2 * sizeof (u32 ))) {
808808 info .bit_offset = be32_to_cpup (addr ++ );
809809 info .nbits = be32_to_cpup (addr );
810- if (info .bit_offset >= BITS_PER_BYTE || info .nbits < 1 ) {
811- dev_err (dev , "nvmem: invalid bits on %pOF\n" , child );
812- of_node_put (child );
813- return - EINVAL ;
814- }
815810 }
816811
817812 info .np = of_node_get (child );
@@ -1600,15 +1595,23 @@ EXPORT_SYMBOL_GPL(nvmem_cell_put);
16001595static void nvmem_shift_read_buffer_in_place (struct nvmem_cell_entry * cell , void * buf )
16011596{
16021597 u8 * p , * b ;
1603- int i , extra , bit_offset = cell -> bit_offset ;
1598+ int i , padding , extra , bit_offset = cell -> bit_offset ;
1599+ int bytes = cell -> bytes ;
16041600
16051601 p = b = buf ;
16061602 if (bit_offset ) {
1603+ padding = bit_offset /8 ;
1604+ if (padding ) {
1605+ memmove (buf , buf + padding , bytes - padding );
1606+ bit_offset -= BITS_PER_BYTE * padding ;
1607+ bytes -= padding ;
1608+ }
1609+
16071610 /* First shift */
16081611 * b ++ >>= bit_offset ;
16091612
16101613 /* setup rest of the bytes if any */
1611- for (i = 1 ; i < cell -> bytes ; i ++ ) {
1614+ for (i = 1 ; i < bytes ; i ++ ) {
16121615 /* Get bits from next byte and shift them towards msb */
16131616 * p |= * b << (BITS_PER_BYTE - bit_offset );
16141617
@@ -1621,7 +1624,7 @@ static void nvmem_shift_read_buffer_in_place(struct nvmem_cell_entry *cell, void
16211624 }
16221625
16231626 /* result fits in less bytes */
1624- extra = cell -> bytes - DIV_ROUND_UP (cell -> nbits , BITS_PER_BYTE );
1627+ extra = bytes - DIV_ROUND_UP (cell -> nbits , BITS_PER_BYTE );
16251628 while (-- extra >= 0 )
16261629 * p -- = 0 ;
16271630
0 commit comments