pll_info
const struct ccu_pll_info *info = &pll_info[idx];
if (!!(pll_info[idx].features & CCU_PLL_BASIC) ^ defer)
if (!!(pll_info[idx].features & CCU_PLL_BASIC) ^ defer)
#define CCU_PLL_NUM ARRAY_SIZE(pll_info)
static const struct ccu_pll_info pll_info[] = {
if (pll_info[idx].id == clk_id)
if (pll_info->od_bits > 0) {
od_enc = ctl >> pll_info->od_shift;
od_enc &= GENMASK(pll_info->od_bits - 1, 0);
if (pll_info->bypass_bit >= 0) {
ctl = readl(cgu->base + pll_info->bypass_reg);
bypass = !!(ctl & BIT(pll_info->bypass_bit));
for (od = 0; od < pll_info->od_max; od++)
if (pll_info->od_encoding[od] == od_enc)
if (pll_info->od_max == 0)
BUG_ON(pll_info->od_bits != 0);
BUG_ON(od == pll_info->od_max);
return div_u64((u64)parent_rate * m * pll_info->rate_multiplier,
ingenic_pll_calc_m_n_od(const struct ingenic_cgu_pll_info *pll_info,
n = min_t(unsigned int, n, 1 << pll_info->n_bits);
n = max_t(unsigned int, n, pll_info->n_offset);
m = min_t(unsigned int, m, 1 << pll_info->m_bits);
m = max_t(unsigned int, m, pll_info->m_offset);
const struct ingenic_cgu_pll_info *pll_info = &clk_info->pll;
if (pll_info->calc_m_n_od)
(*pll_info->calc_m_n_od)(pll_info, rate, parent_rate, &m, &n, &od);
ingenic_pll_calc_m_n_od(pll_info, rate, parent_rate, &m, &n, &od);
return div_u64((u64)parent_rate * m * pll_info->rate_multiplier,
const struct ingenic_cgu_pll_info *pll_info)
if (pll_info->stable_bit < 0)
return readl_poll_timeout(cgu->base + pll_info->reg, ctl,
ctl & BIT(pll_info->stable_bit),
const struct ingenic_cgu_pll_info *pll_info = &clk_info->pll;
ctl = readl(cgu->base + pll_info->reg);
ctl &= ~(GENMASK(pll_info->m_bits - 1, 0) << pll_info->m_shift);
ctl |= (m - pll_info->m_offset) << pll_info->m_shift;
ctl &= ~(GENMASK(pll_info->n_bits - 1, 0) << pll_info->n_shift);
ctl |= (n - pll_info->n_offset) << pll_info->n_shift;
if (pll_info->od_bits > 0) {
ctl &= ~(GENMASK(pll_info->od_bits - 1, 0) << pll_info->od_shift);
ctl |= pll_info->od_encoding[od - 1] << pll_info->od_shift;
writel(ctl, cgu->base + pll_info->reg);
if (pll_info->set_rate_hook)
pll_info->set_rate_hook(pll_info, rate, parent_rate);
if (pll_info->enable_bit >= 0 && (ctl & BIT(pll_info->enable_bit)))
ret = ingenic_pll_check_stable(cgu, pll_info);
const struct ingenic_cgu_pll_info *pll_info = &clk_info->pll;
if (pll_info->enable_bit < 0)
if (pll_info->bypass_bit >= 0) {
ctl = readl(cgu->base + pll_info->bypass_reg);
ctl &= ~BIT(pll_info->bypass_bit);
writel(ctl, cgu->base + pll_info->bypass_reg);
ctl = readl(cgu->base + pll_info->reg);
ctl |= BIT(pll_info->enable_bit);
writel(ctl, cgu->base + pll_info->reg);
ret = ingenic_pll_check_stable(cgu, pll_info);
const struct ingenic_cgu_pll_info *pll_info = &clk_info->pll;
if (pll_info->enable_bit < 0)
ctl = readl(cgu->base + pll_info->reg);
ctl &= ~BIT(pll_info->enable_bit);
writel(ctl, cgu->base + pll_info->reg);
const struct ingenic_cgu_pll_info *pll_info = &clk_info->pll;
if (pll_info->enable_bit < 0)
ctl = readl(cgu->base + pll_info->reg);
return !!(ctl & BIT(pll_info->enable_bit));
const struct ingenic_cgu_pll_info *pll_info;
pll_info = &clk_info->pll;
ctl = readl(cgu->base + pll_info->reg);
m = (ctl >> pll_info->m_shift) & GENMASK(pll_info->m_bits - 1, 0);
m += pll_info->m_offset;
n = (ctl >> pll_info->n_shift) & GENMASK(pll_info->n_bits - 1, 0);
n += pll_info->n_offset;
void (*calc_m_n_od)(const struct ingenic_cgu_pll_info *pll_info,
void (*set_rate_hook)(const struct ingenic_cgu_pll_info *pll_info,
jz4760_cgu_calc_m_n_od(const struct ingenic_cgu_pll_info *pll_info,
unsigned int m, n, od, m_max = (1 << pll_info->m_bits) - 1;
n = clamp_val(n, 2, 1 << pll_info->n_bits);
x1000_i2spll_calc_m_n_od(const struct ingenic_cgu_pll_info *pll_info,
const unsigned long m_max = GENMASK(pll_info->m_bits - 1, 0);
const unsigned long n_max = GENMASK(pll_info->n_bits - 1, 0);
x1000_i2spll_set_rate_hook(const struct ingenic_cgu_pll_info *pll_info,
static const struct visconti_pll_info pll_info[] __initconst = {
visconti_register_plls(ctx, pll_info, ARRAY_SIZE(pll_info), &tmpv770x_pll_lock);
info->pll_info.crystal_frequency =
info->pll_info.min_input_pxl_clk_pll_frequency =
info->pll_info.max_input_pxl_clk_pll_frequency =
info->pll_info.min_output_pxl_clk_pll_frequency =
info->pll_info.max_output_pxl_clk_pll_frequency =
info->pll_info.crystal_frequency =
info->pll_info.min_input_pxl_clk_pll_frequency =
info->pll_info.max_input_pxl_clk_pll_frequency =
info->pll_info.min_output_pxl_clk_pll_frequency =
info->pll_info.max_output_pxl_clk_pll_frequency =
info->pll_info.crystal_frequency =
info->pll_info.min_input_pxl_clk_pll_frequency =
info->pll_info.max_input_pxl_clk_pll_frequency =
info->pll_info.min_output_pxl_clk_pll_frequency =
info->pll_info.max_output_pxl_clk_pll_frequency =
info->pll_info.crystal_frequency = dce_info->dce_refclk_10khz * 10;
if (info->pll_info.crystal_frequency == 0)
info->pll_info.crystal_frequency = 27000;
info->pll_info.crystal_frequency = dce_info->dce_refclk_10khz * 10;
if (info->pll_info.crystal_frequency == 0) {
info->pll_info.crystal_frequency = 27000;
info->pll_info.crystal_frequency = 100000;
info->pll_info.crystal_frequency = dce_info_v4_5->dce_refclk_10khz * 10;
info->pll_info.crystal_frequency = dce_info_v4_4->dce_refclk_10khz * 10;
info->pll_info.crystal_frequency = dce_info_v4_1->dce_refclk_10khz * 10;
info->pll_info.crystal_frequency = dce_info_v4_5->dce_refclk_10khz * 10;
dc->ctx->dc_bios->fw_info.pll_info.crystal_frequency;
const struct audio_pll_info *pll_info,
pll_info->audio_dto_source_clock_in_khz * 10;
const struct audio_pll_info *pll_info)
src_sel = pll_info->dto_source - DTO_SOURCE_ID0;
pll_info,
const struct audio_pll_info *pll_info)
src_sel = pll_info->dto_source - DTO_SOURCE_ID0;
pll_info,
const struct audio_pll_info *pll_info);
calc_pll_cs->ref_freq_khz = fw_info->pll_info.crystal_frequency;
fw_info->pll_info.min_output_pxl_clk_pll_frequency;
fw_info->pll_info.max_output_pxl_clk_pll_frequency;
fw_info->pll_info.max_input_pxl_clk_pll_frequency;
fw_info->pll_info.min_input_pxl_clk_pll_frequency;
clk_src->ref_freq_khz = clk_src->bios->fw_info.pll_info.crystal_frequency;
dce_i2c_hw->reference_frequency = (ctx->dc_bios->fw_info.pll_info.crystal_frequency) >> 1;
dc->dml2_options.bbox_overrides.xtalclk_mhz = dc->ctx->dc_bios->fw_info.pll_info.crystal_frequency / 1000.0;
dc->dml2_options.bbox_overrides.xtalclk_mhz = dc->ctx->dc_bios->fw_info.pll_info.crystal_frequency / 1000.0;
audio_output->pll_info.audio_dto_source_clock_in_khz =
audio_output->pll_info.dto_source =
audio_output->pll_info.ss_enabled = true;
audio_output->pll_info.ss_percentage =
&audio_output.pll_info);
&audio_output.pll_info);
&audio_output.pll_info);
dc->ctx->dc_bios->fw_info.pll_info.crystal_frequency;
dc->ctx->dc_bios->fw_info.pll_info.crystal_frequency,
dc->ctx->dc_bios->fw_info.pll_info.crystal_frequency;
dc->ctx->dc_bios->fw_info.pll_info.crystal_frequency,
dc->ctx->dc_bios->fw_info.pll_info.crystal_frequency;
dc->ctx->dc_bios->fw_info.pll_info.crystal_frequency,
dc->ctx->dc_bios->fw_info.pll_info.crystal_frequency;
dc->ctx->dc_bios->fw_info.pll_info.crystal_frequency,
dc->ctx->dc_bios->fw_info.pll_info.crystal_frequency;
dc->ctx->dc_bios->fw_info.pll_info.crystal_frequency,
dc->ctx->dc_bios->fw_info.pll_info.crystal_frequency;
dc->ctx->dc_bios->fw_info.pll_info.crystal_frequency,
dc->ctx->dc_bios->fw_info.pll_info.crystal_frequency;
dc->ctx->dc_bios->fw_info.pll_info.crystal_frequency,
const struct audio_pll_info *pll_info);
soc_bb->xtalclk_mhz = dc->ctx->dc_bios->fw_info.pll_info.crystal_frequency / 1000;
struct audio_pll_info pll_info;
} pll_info;
uint16_t pll_info;
pll_info = combios_get_table_offset(dev, COMBIOS_PLL_INFO_TABLE);
if (pll_info) {
rev = RBIOS8(pll_info);
p1pll->reference_freq = RBIOS16(pll_info + 0xe);
p1pll->reference_div = RBIOS16(pll_info + 0x10);
p1pll->pll_out_min = RBIOS32(pll_info + 0x12);
p1pll->pll_out_max = RBIOS32(pll_info + 0x16);
p1pll->pll_in_min = RBIOS32(pll_info + 0x36);
p1pll->pll_in_max = RBIOS32(pll_info + 0x3a);
spll->reference_freq = RBIOS16(pll_info + 0x1a);
spll->reference_div = RBIOS16(pll_info + 0x1c);
spll->pll_out_min = RBIOS32(pll_info + 0x1e);
spll->pll_out_max = RBIOS32(pll_info + 0x22);
spll->pll_in_min = RBIOS32(pll_info + 0x48);
spll->pll_in_max = RBIOS32(pll_info + 0x4c);
mpll->reference_freq = RBIOS16(pll_info + 0x26);
mpll->reference_div = RBIOS16(pll_info + 0x28);
mpll->pll_out_min = RBIOS32(pll_info + 0x2a);
mpll->pll_out_max = RBIOS32(pll_info + 0x2e);
mpll->pll_in_min = RBIOS32(pll_info + 0x5a);
mpll->pll_in_max = RBIOS32(pll_info + 0x5e);
sclk = RBIOS16(pll_info + 0xa);
mclk = RBIOS16(pll_info + 0x8);
if (RBIOS32(pll_info + 0x16))
rdev->clock.max_pixel_clock = RBIOS32(pll_info + 0x16);
unsigned long target, struct pll_info *pll,
struct pll_info pll = { .diff = (unsigned long)-1 };
struct pll_info pll_limits;
struct pll_info pll;