int b2;
 };
 
+struct rcar_gen3_thermal_priv;
+
 struct rcar_thermal_info {
        int ths_tj_1;
+       void (*read_fuses)(struct rcar_gen3_thermal_priv *priv);
 };
 
 struct rcar_gen3_thermal_tsc {
        return IRQ_HANDLED;
 }
 
+static void rcar_gen3_thermal_read_fuses_gen3(struct rcar_gen3_thermal_priv *priv)
+{
+       unsigned int i;
+
+       /*
+        * Set the pseudo calibration points with fused values.
+        * PTAT is shared between all TSCs but only fused for the first
+        * TSC while THCODEs are fused for each TSC.
+        */
+       priv->ptat[0] = rcar_gen3_thermal_read(priv->tscs[0], REG_GEN3_PTAT1) &
+               GEN3_FUSE_MASK;
+       priv->ptat[1] = rcar_gen3_thermal_read(priv->tscs[0], REG_GEN3_PTAT2) &
+               GEN3_FUSE_MASK;
+       priv->ptat[2] = rcar_gen3_thermal_read(priv->tscs[0], REG_GEN3_PTAT3) &
+               GEN3_FUSE_MASK;
+
+       for (i = 0; i < priv->num_tscs; i++) {
+               struct rcar_gen3_thermal_tsc *tsc = priv->tscs[i];
+
+               tsc->thcode[0] = rcar_gen3_thermal_read(tsc, REG_GEN3_THCODE1) &
+                       GEN3_FUSE_MASK;
+               tsc->thcode[1] = rcar_gen3_thermal_read(tsc, REG_GEN3_THCODE2) &
+                       GEN3_FUSE_MASK;
+               tsc->thcode[2] = rcar_gen3_thermal_read(tsc, REG_GEN3_THCODE3) &
+                       GEN3_FUSE_MASK;
+       }
+}
+
 static bool rcar_gen3_thermal_read_fuses(struct rcar_gen3_thermal_priv *priv)
 {
        unsigned int i;
 
        /* If fuses are not set, fallback to pseudo values. */
        thscp = rcar_gen3_thermal_read(priv->tscs[0], REG_GEN3_THSCP);
-       if ((thscp & THSCP_COR_PARA_VLD) != THSCP_COR_PARA_VLD) {
+       if (!priv->info->read_fuses ||
+           (thscp & THSCP_COR_PARA_VLD) != THSCP_COR_PARA_VLD) {
                /* Default THCODE values in case FUSEs are not set. */
                static const int thcodes[TSC_MAX_NUM][3] = {
                        { 3397, 2800, 2221 },
                return false;
        }
 
-       /*
-        * Set the pseudo calibration points with fused values.
-        * PTAT is shared between all TSCs but only fused for the first
-        * TSC while THCODEs are fused for each TSC.
-        */
-       priv->ptat[0] = rcar_gen3_thermal_read(priv->tscs[0], REG_GEN3_PTAT1) &
-               GEN3_FUSE_MASK;
-       priv->ptat[1] = rcar_gen3_thermal_read(priv->tscs[0], REG_GEN3_PTAT2) &
-               GEN3_FUSE_MASK;
-       priv->ptat[2] = rcar_gen3_thermal_read(priv->tscs[0], REG_GEN3_PTAT3) &
-               GEN3_FUSE_MASK;
-
-       for (i = 0; i < priv->num_tscs; i++) {
-               struct rcar_gen3_thermal_tsc *tsc = priv->tscs[i];
-
-               tsc->thcode[0] = rcar_gen3_thermal_read(tsc, REG_GEN3_THCODE1) &
-                       GEN3_FUSE_MASK;
-               tsc->thcode[1] = rcar_gen3_thermal_read(tsc, REG_GEN3_THCODE2) &
-                       GEN3_FUSE_MASK;
-               tsc->thcode[2] = rcar_gen3_thermal_read(tsc, REG_GEN3_THCODE3) &
-                       GEN3_FUSE_MASK;
-       }
-
+       priv->info->read_fuses(priv);
        return true;
 }
 
 
 static const struct rcar_thermal_info rcar_m3w_thermal_info = {
        .ths_tj_1 = 116,
+       .read_fuses = rcar_gen3_thermal_read_fuses_gen3,
 };
 
 static const struct rcar_thermal_info rcar_gen3_thermal_info = {
        .ths_tj_1 = 126,
+       .read_fuses = rcar_gen3_thermal_read_fuses_gen3,
 };
 
 static const struct of_device_id rcar_gen3_thermal_dt_ids[] = {