/* Find the next record, taking into account the 4-byte alignment */
 static inline const struct ihex_binrec *
-ihex_next_binrec(const struct ihex_binrec *rec)
+__ihex_next_binrec(const struct ihex_binrec *rec)
 {
        int next = ((be16_to_cpu(rec->len) + 5) & ~3) - 2;
        rec = (void *)&rec->data[next];
 
+       return rec;
+}
+
+static inline const struct ihex_binrec *
+ihex_next_binrec(const struct ihex_binrec *rec)
+{
+       rec = __ihex_next_binrec(rec);
+
        return be16_to_cpu(rec->len) ? rec : NULL;
 }
 
 /* Check that ihex_next_binrec() won't take us off the end of the image... */
 static inline int ihex_validate_fw(const struct firmware *fw)
 {
-       const struct ihex_binrec *rec;
-       size_t ofs = 0;
+       const struct ihex_binrec *end, *rec;
 
-       while (ofs <= fw->size - sizeof(*rec)) {
-               rec = (void *)&fw->data[ofs];
+       rec = (const void *)fw->data;
+       end = (const void *)&fw->data[fw->size - sizeof(*end)];
 
+       for (; rec <= end; rec = __ihex_next_binrec(rec)) {
                /* Zero length marks end of records */
                if (!be16_to_cpu(rec->len))
                        return 0;
-
-               /* Point to next record... */
-               ofs += (sizeof(*rec) + be16_to_cpu(rec->len) + 3) & ~3;
        }
        return -EINVAL;
 }