linux/drivers/clk/clk-si514.c

// SPDX-License-Identifier: GPL-2.0-or-later
/*
 * Driver for Silicon Labs Si514 Programmable Oscillator
 *
 * Copyright (C) 2015 Topic Embedded Products
 *
 * Author: Mike Looijmans <[email protected]>
 */

#include <linux/clk-provider.h>
#include <linux/delay.h>
#include <linux/module.h>
#include <linux/i2c.h>
#include <linux/regmap.h>
#include <linux/slab.h>

/* I2C registers */
#define SI514_REG_LP
#define SI514_REG_M_FRAC1
#define SI514_REG_M_FRAC2
#define SI514_REG_M_FRAC3
#define SI514_REG_M_INT_FRAC
#define SI514_REG_M_INT
#define SI514_REG_HS_DIV
#define SI514_REG_LS_HS_DIV
#define SI514_REG_OE_STATE
#define SI514_REG_RESET
#define SI514_REG_CONTROL

/* Register values */
#define SI514_RESET_RST

#define SI514_CONTROL_FCAL
#define SI514_CONTROL_OE

#define SI514_MIN_FREQ
#define SI514_MAX_FREQ

#define FXO

#define FVCO_MIN
#define FVCO_MAX

#define HS_DIV_MAX

struct clk_si514 {};
#define to_clk_si514(_hw)

/* Multiplier/divider settings */
struct clk_si514_muldiv {};

/* Enables or disables the output driver */
static int si514_enable_output(struct clk_si514 *data, bool enable)
{}

static int si514_prepare(struct clk_hw *hw)
{}

static void si514_unprepare(struct clk_hw *hw)
{}

static int si514_is_prepared(struct clk_hw *hw)
{}

/* Retrieve clock multiplier and dividers from hardware */
static int si514_get_muldiv(struct clk_si514 *data,
	struct clk_si514_muldiv *settings)
{}

static int si514_set_muldiv(struct clk_si514 *data,
	struct clk_si514_muldiv *settings)
{}

/* Calculate divider settings for a given frequency */
static int si514_calc_muldiv(struct clk_si514_muldiv *settings,
	unsigned long frequency)
{}

/* Calculate resulting frequency given the register settings */
static unsigned long si514_calc_rate(struct clk_si514_muldiv *settings)
{}

static unsigned long si514_recalc_rate(struct clk_hw *hw,
		unsigned long parent_rate)
{}

static long si514_round_rate(struct clk_hw *hw, unsigned long rate,
		unsigned long *parent_rate)
{}

/*
 * Update output frequency for big frequency changes (> 1000 ppm).
 * The chip supports <1000ppm changes "on the fly", we haven't implemented
 * that here.
 */
static int si514_set_rate(struct clk_hw *hw, unsigned long rate,
		unsigned long parent_rate)
{}

static const struct clk_ops si514_clk_ops =;

static bool si514_regmap_is_volatile(struct device *dev, unsigned int reg)
{}

static bool si514_regmap_is_writeable(struct device *dev, unsigned int reg)
{}

static const struct regmap_config si514_regmap_config =;

static int si514_probe(struct i2c_client *client)
{}

static const struct i2c_device_id si514_id[] =;
MODULE_DEVICE_TABLE(i2c, si514_id);

static const struct of_device_id clk_si514_of_match[] =;
MODULE_DEVICE_TABLE(of, clk_si514_of_match);

static struct i2c_driver si514_driver =;
module_i2c_driver();

MODULE_AUTHOR();
MODULE_DESCRIPTION();
MODULE_LICENSE();