axi_clkgen
static void axi_clkgen_write(struct axi_clkgen *axi_clkgen,
writel(val, axi_clkgen->base + reg);
static void axi_clkgen_read(struct axi_clkgen *axi_clkgen,
*val = readl(axi_clkgen->base + reg);
static int axi_clkgen_wait_non_busy(struct axi_clkgen *axi_clkgen)
axi_clkgen_read(axi_clkgen, AXI_CLKGEN_V2_REG_DRP_STATUS, &val);
static int axi_clkgen_mmcm_read(struct axi_clkgen *axi_clkgen,
ret = axi_clkgen_wait_non_busy(axi_clkgen);
axi_clkgen_write(axi_clkgen, AXI_CLKGEN_V2_REG_DRP_CNTRL, reg_val);
ret = axi_clkgen_wait_non_busy(axi_clkgen);
static int axi_clkgen_mmcm_write(struct axi_clkgen *axi_clkgen,
ret = axi_clkgen_wait_non_busy(axi_clkgen);
axi_clkgen_mmcm_read(axi_clkgen, reg, ®_val);
axi_clkgen_write(axi_clkgen, AXI_CLKGEN_V2_REG_DRP_CNTRL, reg_val);
static void axi_clkgen_mmcm_enable(struct axi_clkgen *axi_clkgen, bool enable)
axi_clkgen_write(axi_clkgen, AXI_CLKGEN_V2_REG_RESET, val);
static struct axi_clkgen *clk_hw_to_axi_clkgen(struct clk_hw *clk_hw)
return container_of(clk_hw, struct axi_clkgen, clk_hw);
static void axi_clkgen_set_div(struct axi_clkgen *axi_clkgen,
axi_clkgen_mmcm_write(axi_clkgen, reg1,
axi_clkgen_mmcm_write(axi_clkgen, reg2,
axi_clkgen_mmcm_write(axi_clkgen, reg3,
struct axi_clkgen *axi_clkgen = clk_hw_to_axi_clkgen(clk_hw);
const struct axi_clkgen_limits *limits = &axi_clkgen->limits;
axi_clkgen_mmcm_write(axi_clkgen, MMCM_REG_POWER, power, 0x9800);
axi_clkgen_set_div(axi_clkgen, MMCM_REG_CLKOUT0_1, MMCM_REG_CLKOUT0_2,
axi_clkgen_mmcm_write(axi_clkgen, MMCM_REG_CLK_DIV,
axi_clkgen_set_div(axi_clkgen, MMCM_REG_CLK_FB1, MMCM_REG_CLK_FB2,
axi_clkgen_mmcm_write(axi_clkgen, MMCM_REG_LOCK1, lock & 0x3ff, 0x3ff);
axi_clkgen_mmcm_write(axi_clkgen, MMCM_REG_LOCK2,
axi_clkgen_mmcm_write(axi_clkgen, MMCM_REG_LOCK3,
axi_clkgen_mmcm_write(axi_clkgen, MMCM_REG_FILTER1, filter >> 16, 0x9900);
axi_clkgen_mmcm_write(axi_clkgen, MMCM_REG_FILTER2, filter, 0x9900);
struct axi_clkgen *axi_clkgen = clk_hw_to_axi_clkgen(hw);
const struct axi_clkgen_limits *limits = &axi_clkgen->limits;
static unsigned int axi_clkgen_get_div(struct axi_clkgen *axi_clkgen,
axi_clkgen_mmcm_read(axi_clkgen, reg2, &val2);
axi_clkgen_mmcm_read(axi_clkgen, reg1, &val1);
struct axi_clkgen *axi_clkgen = clk_hw_to_axi_clkgen(clk_hw);
dout = axi_clkgen_get_div(axi_clkgen, MMCM_REG_CLKOUT0_1,
m = axi_clkgen_get_div(axi_clkgen, MMCM_REG_CLK_FB1,
axi_clkgen_mmcm_read(axi_clkgen, MMCM_REG_CLK_DIV, &val);
struct axi_clkgen *axi_clkgen = clk_hw_to_axi_clkgen(clk_hw);
axi_clkgen_mmcm_enable(axi_clkgen, true);
struct axi_clkgen *axi_clkgen = clk_hw_to_axi_clkgen(clk_hw);
axi_clkgen_mmcm_enable(axi_clkgen, false);
struct axi_clkgen *axi_clkgen = clk_hw_to_axi_clkgen(clk_hw);
axi_clkgen_write(axi_clkgen, AXI_CLKGEN_V2_REG_CLKSEL, index);
struct axi_clkgen *axi_clkgen = clk_hw_to_axi_clkgen(clk_hw);
axi_clkgen_read(axi_clkgen, AXI_CLKGEN_V2_REG_CLKSEL, &parent);
static int axi_clkgen_setup_limits(struct axi_clkgen *axi_clkgen,
axi_clkgen_read(axi_clkgen, ADI_AXI_REG_FPGA_INFO, ®_value);
axi_clkgen->limits.fpfd_min = 10000;
axi_clkgen->limits.fvco_min = 600000;
axi_clkgen->limits.fvco_max = 1200000;
axi_clkgen->limits.fpfd_max = 450000;
axi_clkgen->limits.fvco_max = 1440000;
axi_clkgen->limits.fpfd_max = 500000;
axi_clkgen_read(axi_clkgen, ADI_CLKGEN_REG_FPGA_VOLTAGE,
axi_clkgen->limits.fvco_max = 1200000;
axi_clkgen->limits.fpfd_max = 450000;
axi_clkgen->limits.fvco_max = 1600000;
axi_clkgen->limits.fpfd_max = 550000;
axi_clkgen->limits.fvco_max = 1600000;
axi_clkgen->limits.fvco_min = 800000;
struct axi_clkgen *axi_clkgen;
axi_clkgen = devm_kzalloc(&pdev->dev, sizeof(*axi_clkgen), GFP_KERNEL);
if (!axi_clkgen)
axi_clkgen->base = devm_platform_ioremap_resource(pdev, 0);
if (IS_ERR(axi_clkgen->base))
return PTR_ERR(axi_clkgen->base);
axi_clkgen_read(axi_clkgen, ADI_AXI_REG_VERSION, &pcore_version);
ret = axi_clkgen_setup_limits(axi_clkgen, &pdev->dev);
memcpy(&axi_clkgen->limits, dflt_limits,
sizeof(axi_clkgen->limits));
axi_clkgen_mmcm_enable(axi_clkgen, false);
axi_clkgen->clk_hw.init = &init;
ret = devm_clk_hw_register(&pdev->dev, &axi_clkgen->clk_hw);
&axi_clkgen->clk_hw);