u16 n;
 };
 
+#define C(s, h, m, n) { (s), (2 * (h) - 1), (m), (n) }
+#define FM(f, confs) { (f), ARRAY_SIZE(confs), (confs) }
+#define FMS(f, s, h, m, n) { (f), 1, (const struct freq_conf []){ C(s, h, m, n) } }
+
+struct freq_conf {
+       u8 src;
+       u8 pre_div;
+       u16 m;
+       u16 n;
+};
+
+struct freq_multi_tbl {
+       unsigned long freq;
+       size_t num_confs;
+       const struct freq_conf *confs;
+};
+
 /**
  * struct mn - M/N:D counter
  * @mnctr_en_bit: bit to enable mn counter
  * @safe_src_index: safe src index value
  * @parent_map: map from software's parent index to hardware's src_sel field
  * @freq_tbl: frequency table
+ * @freq_multi_tbl: frequency table for clocks reachable with multiple RCGs conf
  * @clkr: regmap clock handle
  * @cfg_off: defines the cfg register offset from the CMD_RCGR + CFG_REG
  * @parked_cfg: cached value of the CFG register for parked RCGs
        u8                      hid_width;
        u8                      safe_src_index;
        const struct parent_map *parent_map;
-       const struct freq_tbl   *freq_tbl;
+       union {
+               const struct freq_tbl           *freq_tbl;
+               const struct freq_multi_tbl     *freq_multi_tbl;
+       };
        struct clk_regmap       clkr;
        u8                      cfg_off;
        u32                     parked_cfg;