rule_payload = __rule_type + 1;
                rule_plen2 = rule_plen - sizeof(*__rule_type);
 
-               switch (*__rule_type) {
-               case CCS_DATA_BLOCK_RULE_ID_IF: {
+               if (*__rule_type == CCS_DATA_BLOCK_RULE_ID_IF) {
                        const struct __ccs_data_block_rule_if *__if_rules =
                                rule_payload;
                        const size_t __num_if_rules =
                                rules->if_rules = if_rule;
                                rules->num_if_rules = __num_if_rules;
                        }
-                       break;
-               }
-               case CCS_DATA_BLOCK_RULE_ID_READ_ONLY_REGS:
-                       rval = ccs_data_parse_reg_rules(bin, &rules->read_only_regs,
-                                                       &rules->num_read_only_regs,
-                                                       rule_payload,
-                                                       rule_payload + rule_plen2,
-                                                       dev);
-                       if (rval)
-                               return rval;
-                       break;
-               case CCS_DATA_BLOCK_RULE_ID_FFD:
-                       rval = ccs_data_parse_ffd(bin, &rules->frame_format,
-                                                 rule_payload,
-                                                 rule_payload + rule_plen2,
-                                                 dev);
-                       if (rval)
-                               return rval;
-                       break;
-               case CCS_DATA_BLOCK_RULE_ID_MSR:
-                       rval = ccs_data_parse_reg_rules(bin,
-                                                       &rules->manufacturer_regs,
-                                                       &rules->num_manufacturer_regs,
-                                                       rule_payload,
-                                                       rule_payload + rule_plen2,
-                                                       dev);
-                       if (rval)
-                               return rval;
-                       break;
-               case CCS_DATA_BLOCK_RULE_ID_PDAF_READOUT:
-                       rval = ccs_data_parse_pdaf_readout(bin,
-                                                          &rules->pdaf_readout,
-                                                          rule_payload,
-                                                          rule_payload + rule_plen2,
-                                                          dev);
-                       if (rval)
-                               return rval;
-                       break;
-               default:
-                       dev_dbg(dev,
-                               "Don't know how to handle rule type %u!\n",
-                               *__rule_type);
-                       return -EINVAL;
+               } else {
+                       /* Check there was an if rule before any other rules */
+                       if (bin->base && !rules)
+                               return -EINVAL;
+
+                       switch (*__rule_type) {
+                       case CCS_DATA_BLOCK_RULE_ID_READ_ONLY_REGS:
+                               rval = ccs_data_parse_reg_rules(bin,
+                                                               rules ?
+                                                               &rules->read_only_regs : NULL,
+                                                               rules ?
+                                                               &rules->num_read_only_regs : NULL,
+                                                               rule_payload,
+                                                               rule_payload + rule_plen2,
+                                                               dev);
+                               if (rval)
+                                       return rval;
+                               break;
+                       case CCS_DATA_BLOCK_RULE_ID_FFD:
+                               rval = ccs_data_parse_ffd(bin, rules ?
+                                                         &rules->frame_format : NULL,
+                                                         rule_payload,
+                                                         rule_payload + rule_plen2,
+                                                         dev);
+                               if (rval)
+                                       return rval;
+                               break;
+                       case CCS_DATA_BLOCK_RULE_ID_MSR:
+                               rval = ccs_data_parse_reg_rules(bin,
+                                                               rules ?
+                                                               &rules->manufacturer_regs : NULL,
+                                                               rules ?
+                                                               &rules->num_manufacturer_regs : NULL,
+                                                               rule_payload,
+                                                               rule_payload + rule_plen2,
+                                                               dev);
+                               if (rval)
+                                       return rval;
+                               break;
+                       case CCS_DATA_BLOCK_RULE_ID_PDAF_READOUT:
+                               rval = ccs_data_parse_pdaf_readout(bin,
+                                                                  rules ?
+                                                                  &rules->pdaf_readout : NULL,
+                                                                  rule_payload,
+                                                                  rule_payload + rule_plen2,
+                                                                  dev);
+                               if (rval)
+                                       return rval;
+                               break;
+                       default:
+                               dev_dbg(dev,
+                                       "Don't know how to handle rule type %u!\n",
+                                       *__rule_type);
+                               return -EINVAL;
+                       }
                }
                __next_rule = __next_rule + rule_hlen + rule_plen;
        }