mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2026-04-14 09:57:39 +02:00
Convert the limited MIPI clock calculations to a full range of settings based on math including H/W limitation validation. Since the required DSI division setting must be specified from external sources before calculations, expose a new API to set it. Signed-off-by: Chris Brandt <chris.brandt@renesas.com> Reviewed-by: Biju Das <biju.das.jz@bp.renesas.com> Tested-by: Biju Das <biju.das.jz@bp.renesas.com> Reviewed-by: Hugo Villeneuve <hvilleneuve@dimonoff.com> Tested-by: Hugo Villeneuve <hvilleneuve@dimonoff.com> Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be> Link: https://patch.msgid.link/20251124131003.992554-2-chris.brandt@renesas.com Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
192 lines
4.8 KiB
C
192 lines
4.8 KiB
C
/* SPDX-License-Identifier: GPL-2.0+
|
|
*
|
|
* Copyright 2013 Ideas On Board SPRL
|
|
* Copyright 2013, 2014 Horms Solutions Ltd.
|
|
*
|
|
* Contact: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
|
|
* Contact: Simon Horman <horms@verge.net.au>
|
|
*/
|
|
|
|
#ifndef __LINUX_CLK_RENESAS_H_
|
|
#define __LINUX_CLK_RENESAS_H_
|
|
|
|
#include <linux/clk-provider.h>
|
|
#include <linux/types.h>
|
|
#include <linux/units.h>
|
|
|
|
struct device;
|
|
struct device_node;
|
|
struct generic_pm_domain;
|
|
|
|
void cpg_mstp_add_clk_domain(struct device_node *np);
|
|
#ifdef CONFIG_CLK_RENESAS_CPG_MSTP
|
|
int cpg_mstp_attach_dev(struct generic_pm_domain *unused, struct device *dev);
|
|
void cpg_mstp_detach_dev(struct generic_pm_domain *unused, struct device *dev);
|
|
#else
|
|
#define cpg_mstp_attach_dev NULL
|
|
#define cpg_mstp_detach_dev NULL
|
|
#endif
|
|
|
|
#ifdef CONFIG_CLK_RENESAS_CPG_MSSR
|
|
int cpg_mssr_attach_dev(struct generic_pm_domain *unused, struct device *dev);
|
|
void cpg_mssr_detach_dev(struct generic_pm_domain *unused, struct device *dev);
|
|
#else
|
|
#define cpg_mssr_attach_dev NULL
|
|
#define cpg_mssr_detach_dev NULL
|
|
#endif
|
|
|
|
enum {
|
|
PLL5_TARGET_DPI,
|
|
PLL5_TARGET_DSI
|
|
};
|
|
|
|
#ifdef CONFIG_CLK_RZG2L
|
|
void rzg2l_cpg_dsi_div_set_divider(u8 divider, int target);
|
|
#else
|
|
static inline void rzg2l_cpg_dsi_div_set_divider(u8 divider, int target) { }
|
|
#endif
|
|
|
|
/**
|
|
* struct rzv2h_pll_limits - PLL parameter constraints
|
|
*
|
|
* This structure defines the minimum and maximum allowed values for
|
|
* various parameters used to configure a PLL. These limits ensure
|
|
* the PLL operates within valid and stable ranges.
|
|
*
|
|
* @fout: Output frequency range (in MHz)
|
|
* @fout.min: Minimum allowed output frequency
|
|
* @fout.max: Maximum allowed output frequency
|
|
*
|
|
* @fvco: PLL oscillation frequency range (in MHz)
|
|
* @fvco.min: Minimum allowed VCO frequency
|
|
* @fvco.max: Maximum allowed VCO frequency
|
|
*
|
|
* @m: Main-divider range
|
|
* @m.min: Minimum main-divider value
|
|
* @m.max: Maximum main-divider value
|
|
*
|
|
* @p: Pre-divider range
|
|
* @p.min: Minimum pre-divider value
|
|
* @p.max: Maximum pre-divider value
|
|
*
|
|
* @s: Divider range
|
|
* @s.min: Minimum divider value
|
|
* @s.max: Maximum divider value
|
|
*
|
|
* @k: Delta-sigma modulator range (signed)
|
|
* @k.min: Minimum delta-sigma value
|
|
* @k.max: Maximum delta-sigma value
|
|
*/
|
|
struct rzv2h_pll_limits {
|
|
struct {
|
|
u32 min;
|
|
u32 max;
|
|
} fout;
|
|
|
|
struct {
|
|
u32 min;
|
|
u32 max;
|
|
} fvco;
|
|
|
|
struct {
|
|
u16 min;
|
|
u16 max;
|
|
} m;
|
|
|
|
struct {
|
|
u8 min;
|
|
u8 max;
|
|
} p;
|
|
|
|
struct {
|
|
u8 min;
|
|
u8 max;
|
|
} s;
|
|
|
|
struct {
|
|
s16 min;
|
|
s16 max;
|
|
} k;
|
|
};
|
|
|
|
/**
|
|
* struct rzv2h_pll_pars - PLL configuration parameters
|
|
*
|
|
* This structure contains the configuration parameters for the
|
|
* Phase-Locked Loop (PLL), used to achieve a specific output frequency.
|
|
*
|
|
* @m: Main divider value
|
|
* @p: Pre-divider value
|
|
* @s: Output divider value
|
|
* @k: Delta-sigma modulation value
|
|
* @freq_millihz: Calculated PLL output frequency in millihertz
|
|
* @error_millihz: Frequency error from target in millihertz (signed)
|
|
*/
|
|
struct rzv2h_pll_pars {
|
|
u16 m;
|
|
u8 p;
|
|
u8 s;
|
|
s16 k;
|
|
u64 freq_millihz;
|
|
s64 error_millihz;
|
|
};
|
|
|
|
/**
|
|
* struct rzv2h_pll_div_pars - PLL parameters with post-divider
|
|
*
|
|
* This structure is used for PLLs that include an additional post-divider
|
|
* stage after the main PLL block. It contains both the PLL configuration
|
|
* parameters and the resulting frequency/error values after the divider.
|
|
*
|
|
* @pll: Main PLL configuration parameters (see struct rzv2h_pll_pars)
|
|
*
|
|
* @div: Post-divider configuration and result
|
|
* @div.divider_value: Divider applied to the PLL output
|
|
* @div.freq_millihz: Output frequency after divider in millihertz
|
|
* @div.error_millihz: Frequency error from target in millihertz (signed)
|
|
*/
|
|
struct rzv2h_pll_div_pars {
|
|
struct rzv2h_pll_pars pll;
|
|
struct {
|
|
u8 divider_value;
|
|
u64 freq_millihz;
|
|
s64 error_millihz;
|
|
} div;
|
|
};
|
|
|
|
#define RZV2H_CPG_PLL_DSI_LIMITS(name) \
|
|
static const struct rzv2h_pll_limits (name) = { \
|
|
.fout = { .min = 25 * MEGA, .max = 375 * MEGA }, \
|
|
.fvco = { .min = 1600 * MEGA, .max = 3200 * MEGA }, \
|
|
.m = { .min = 64, .max = 533 }, \
|
|
.p = { .min = 1, .max = 4 }, \
|
|
.s = { .min = 0, .max = 6 }, \
|
|
.k = { .min = -32768, .max = 32767 }, \
|
|
} \
|
|
|
|
#ifdef CONFIG_CLK_RZV2H
|
|
bool rzv2h_get_pll_pars(const struct rzv2h_pll_limits *limits,
|
|
struct rzv2h_pll_pars *pars, u64 freq_millihz);
|
|
|
|
bool rzv2h_get_pll_divs_pars(const struct rzv2h_pll_limits *limits,
|
|
struct rzv2h_pll_div_pars *pars,
|
|
const u8 *table, u8 table_size, u64 freq_millihz);
|
|
#else
|
|
static inline bool rzv2h_get_pll_pars(const struct rzv2h_pll_limits *limits,
|
|
struct rzv2h_pll_pars *pars,
|
|
u64 freq_millihz)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
static inline bool rzv2h_get_pll_divs_pars(const struct rzv2h_pll_limits *limits,
|
|
struct rzv2h_pll_div_pars *pars,
|
|
const u8 *table, u8 table_size,
|
|
u64 freq_millihz)
|
|
{
|
|
return false;
|
|
}
|
|
#endif
|
|
|
|
#endif
|