Hi Chris,
On Thu, 23 Oct 2025 at 01:59, Chris Brandt <[email protected]> wrote:
> 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 <[email protected]>
> Signed-off-by: hienhuynh <[email protected]>
> Signed-off-by: Nghia Vo <[email protected]>
> Reviewed-by: Biju Das <[email protected]>
> Tested-by: Biju Das <[email protected]>
> v2->v3:
> - Removed Empty lines (Hugo)
> - Add dummy for compile-testing CONFIG_CLK_RZG2L=n case (Geert)
> - Renamed label found_dsi_div to calc_pll_clk (Hugo)
> - Renamed label found_clk to clk_valid (Hugo)
> - Removed 'found' var because not needed
> - Move 'foutpostdiv_rate =' after if(foutvco_rate > 1500000000) (Hugo)
> - Move PLL5_TARGET_* for new API to renesas.h (Hugo,Geert)
> - Convert #define macros PLL5_TARGET_* to enum (Geert)
> - static {unsigned} int dsi_div_ab; (Geert)
> - {unsigned} int a, b; (Geert)
> - Change "((1 << a) * (b + 1))" to "(b + 1) << a" (Geert)
> - Change "foutvco_rate = rate * (1 << xxx ) * ..." to " = rate * ... * << xxx
> (Geert)
> - Move (u64) outside of modulo operation to avoid helper on 32-bit compiles
> (Geert)
> - Change DIV_ROUND_CLOSEST_ULL() to DIV_ROUND_CLOSEST() (Geert)
> - void rzg2l_cpg_dsi_div_set_divider({unsinged} int divider, int target)
> - Change "dsi_div_ab = (1 << AAA) * (BBB + 1)" to " = (BBB + 1) << AAA (Geert)
> - Added Reviewed-by and Tested-by (Biju)'
Thanks for the update!
> --- a/include/linux/clk/renesas.h
> +++ b/include/linux/clk/renesas.h
> @@ -16,6 +16,11 @@ struct device;
> struct device_node;
> struct generic_pm_domain;
>
> +enum {
> + PLL5_TARGET_DPI,
> + PLL5_TARGET_DSI
> +};
> +
> 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);
> @@ -32,4 +37,10 @@ void cpg_mssr_detach_dev(struct generic_pm_domain *unused,
> struct device *dev);
> #define cpg_mssr_attach_dev NULL
> #define cpg_mssr_detach_dev NULL
> #endif
> +
> +#ifdef CONFIG_CLK_RZG2L
> +void rzg2l_cpg_dsi_div_set_divider(unsigned int divider, int target);
> +#else
> +#define rzg2l_cpg_dsi_div_set_divider NULL
static inline void rzg2l_cpg_dsi_div_set_divider(int divider, int target) { }
For cpg_mssr_attach_dev and friends, NULL is suitable because these
are only used to populate function pointers.
> +#endif
Blank line please.
> #endif
Gr{oetje,eeting}s,
Geert
--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- [email protected]
In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds