]> Git Repo - J-u-boot.git/blame - drivers/clk/clk-fixed-factor.c
Merge tag 'u-boot-imx-master-20250127' of https://gitlab.denx.de/u-boot/custodians...
[J-u-boot.git] / drivers / clk / clk-fixed-factor.c
CommitLineData
1d7993d1
LM
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * Copyright (C) 2019 DENX Software Engineering
4 * Lukasz Majewski, DENX Software Engineering, [email protected]
5 *
6 * Copyright (C) 2011 Sascha Hauer, Pengutronix <[email protected]>
7 */
560e1e00
PD
8
9#define LOG_CATEGORY UCLASS_CLK
10
572c446e 11#include <clk.h>
1d7993d1 12#include <clk-uclass.h>
572c446e 13#include <div64.h>
560e1e00 14#include <log.h>
572c446e 15#include <malloc.h>
1d7993d1 16#include <dm/device.h>
61b29b82 17#include <dm/devres.h>
1d7993d1 18#include <linux/clk-provider.h>
61b29b82 19#include <linux/err.h>
1d7993d1 20
572c446e
PD
21#include "clk.h"
22
1d7993d1
LM
23#define UBOOT_DM_CLK_IMX_FIXED_FACTOR "ccf_clk_fixed_factor"
24
25static ulong clk_factor_recalc_rate(struct clk *clk)
26{
78ce0bd3 27 struct clk_fixed_factor *fix = to_clk_fixed_factor(clk);
1d7993d1
LM
28 unsigned long parent_rate = clk_get_parent_rate(clk);
29 unsigned long long int rate;
30
31 rate = (unsigned long long int)parent_rate * fix->mult;
32 do_div(rate, fix->div);
33 return (ulong)rate;
34}
35
36const struct clk_ops ccf_clk_fixed_factor_ops = {
37 .get_rate = clk_factor_recalc_rate,
38};
39
40struct clk *clk_hw_register_fixed_factor(struct device *dev,
41 const char *name, const char *parent_name, unsigned long flags,
42 unsigned int mult, unsigned int div)
43{
44 struct clk_fixed_factor *fix;
45 struct clk *clk;
46 int ret;
47
48 fix = kzalloc(sizeof(*fix), GFP_KERNEL);
49 if (!fix)
50 return ERR_PTR(-ENOMEM);
51
52 /* struct clk_fixed_factor assignments */
53 fix->mult = mult;
54 fix->div = div;
55 clk = &fix->clk;
16bdc85b 56 clk->flags = flags;
1d7993d1
LM
57
58 ret = clk_register(clk, UBOOT_DM_CLK_IMX_FIXED_FACTOR, name,
59 parent_name);
60 if (ret) {
61 kfree(fix);
62 return ERR_PTR(ret);
63 }
64
65 return clk;
66}
67
68struct clk *clk_register_fixed_factor(struct device *dev, const char *name,
69 const char *parent_name, unsigned long flags,
70 unsigned int mult, unsigned int div)
71{
72 struct clk *clk;
73
74 clk = clk_hw_register_fixed_factor(dev, name, parent_name, flags, mult,
75 div);
76 if (IS_ERR(clk))
77 return ERR_CAST(clk);
78 return clk;
79}
80
81U_BOOT_DRIVER(imx_clk_fixed_factor) = {
82 .name = UBOOT_DM_CLK_IMX_FIXED_FACTOR,
83 .id = UCLASS_CLK,
84 .ops = &ccf_clk_fixed_factor_ops,
85 .flags = DM_FLAG_PRE_RELOC,
86};
This page took 0.154973 seconds and 4 git commands to generate.