static unsigned long ccu_nm_recalc_rate(struct clk_hw *hw, unsigned long parent_rate) { struct ccu_nm *nm = hw_to_ccu_nm(hw); unsigned long n, m; u32 reg; if (ccu_frac_helper_is_enabled(&nm->common, &nm->frac)) return ccu_frac_helper_read_rate(&nm->common, &nm->frac); reg = readl(nm->common.base + nm->common.reg); n = reg >> nm->n.shift; n &= (1 << nm->n.width) - 1; n += nm->n.offset; if (!n) n++; m = reg >> nm->m.shift; m &= (1 << nm->m.width) - 1; m += nm->m.offset; if (!m) m++; return parent_rate * n / m; }
static unsigned long ccu_mult_recalc_rate(struct clk_hw *hw, unsigned long parent_rate) { struct ccu_mult *cm = hw_to_ccu_mult(hw); unsigned long val; u32 reg; if (ccu_frac_helper_is_enabled(&cm->common, &cm->frac)) return ccu_frac_helper_read_rate(&cm->common, &cm->frac); reg = readl(cm->common.base + cm->common.reg); val = reg >> cm->mult.shift; val &= (1 << cm->mult.width) - 1; parent_rate = ccu_mux_helper_apply_prediv(&cm->common, &cm->mux, -1, parent_rate); return parent_rate * (val + cm->mult.offset); }
static unsigned long ccu_nm_recalc_rate(struct clk_hw *hw, unsigned long parent_rate) { struct ccu_nm *nm = hw_to_ccu_nm(hw); unsigned long rate; unsigned long n, m; u32 reg; if (ccu_frac_helper_is_enabled(&nm->common, &nm->frac)) { rate = ccu_frac_helper_read_rate(&nm->common, &nm->frac); if (nm->common.features & CCU_FEATURE_FIXED_POSTDIV) rate /= nm->fixed_post_div; return rate; } reg = readl(nm->common.base + nm->common.reg); n = reg >> nm->n.shift; n &= (1 << nm->n.width) - 1; n += nm->n.offset; if (!n) n++; m = reg >> nm->m.shift; m &= (1 << nm->m.width) - 1; m += nm->m.offset; if (!m) m++; if (ccu_sdm_helper_is_enabled(&nm->common, &nm->sdm)) rate = ccu_sdm_helper_read_rate(&nm->common, &nm->sdm, m, n); else rate = parent_rate * n / m; if (nm->common.features & CCU_FEATURE_FIXED_POSTDIV) rate /= nm->fixed_post_div; return rate; }