#include <linux/bitops.h>
#include <linux/clk.h>
#include <linux/clk-provider.h>
#include <linux/delay.h>
#include <linux/err.h>
#include <linux/log2.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/platform_device.h>
#include <linux/regmap.h>
#include <linux/slab.h>
#include <linux/types.h>
#define REG_DIV_CTL1 …
#define DIV_CTL1_DIV_FACTOR_MASK …
#define REG_EN_CTL …
#define REG_EN_MASK …
struct clkdiv { … };
static inline struct clkdiv *to_clkdiv(struct clk_hw *hw)
{ … }
static inline unsigned int div_factor_to_div(unsigned int div_factor)
{ … }
static inline unsigned int div_to_div_factor(unsigned int div)
{ … }
static bool is_spmi_pmic_clkdiv_enabled(struct clkdiv *clkdiv)
{ … }
static int
__spmi_pmic_clkdiv_set_enable_state(struct clkdiv *clkdiv, bool enable,
unsigned int div_factor)
{ … }
static int spmi_pmic_clkdiv_set_enable_state(struct clkdiv *clkdiv, bool enable)
{ … }
static int clk_spmi_pmic_div_enable(struct clk_hw *hw)
{ … }
static void clk_spmi_pmic_div_disable(struct clk_hw *hw)
{ … }
static long clk_spmi_pmic_div_round_rate(struct clk_hw *hw, unsigned long rate,
unsigned long *parent_rate)
{ … }
static unsigned long
clk_spmi_pmic_div_recalc_rate(struct clk_hw *hw, unsigned long parent_rate)
{ … }
static int clk_spmi_pmic_div_set_rate(struct clk_hw *hw, unsigned long rate,
unsigned long parent_rate)
{ … }
static const struct clk_ops clk_spmi_pmic_div_ops = …;
struct spmi_pmic_div_clk_cc { … };
static struct clk_hw *
spmi_pmic_div_clk_hw_get(struct of_phandle_args *clkspec, void *data)
{ … }
static int spmi_pmic_clkdiv_probe(struct platform_device *pdev)
{ … }
static const struct of_device_id spmi_pmic_clkdiv_match_table[] = …;
MODULE_DEVICE_TABLE(of, spmi_pmic_clkdiv_match_table);
static struct platform_driver spmi_pmic_clkdiv_driver = …;
module_platform_driver(…) …;
MODULE_DESCRIPTION(…) …;
MODULE_LICENSE(…) …;