[PATCH] clk: clk_versaclock: Add support for versaclock driver
Luca Ceresoli
luca at lucaceresoli.net
Thu Jun 3 10:34:02 CEST 2021
On 24/05/21 19:53, Adam Ford wrote:
> The driver is based on the Versaclock driver from the Linux code, but
> do differences in the clock API between them, some pieces had to change.
s/do/due to/ ?
s/had to change/had to be changed/
> This driver creates a mux, pfd, pll, and a series of fod ouputs.
> Rate Usecnt Name
> ------------------------------------------
> 25000000 0 `-- x304-clock
> 25000000 0 `-- clock-controller at 6a.mux
> 25000000 0 |-- clock-controller at 6a.pfd
> 2800000000 0 | `-- clock-controller at 6a.pll
> 33333333 0 | |-- clock-controller at 6a.fod0
> 33333333 0 | | `-- clock-controller at 6a.out1
> 33333333 0 | |-- clock-controller at 6a.fod1
> 33333333 0 | | `-- clock-controller at 6a.out2
> 50000000 0 | |-- clock-controller at 6a.fod2
> 50000000 0 | | `-- clock-controller at 6a.out3
> 125000000 0 | `-- clock-controller at 6a.fod3
> 125000000 0 | `-- clock-controller at 6a.out4
> 25000000 0 `-- clock-controller at 6a.out0_sel_i2cb
>
> A translation function is added so the references to <&versaclock X> get routed
> to the corresponding clock-controller at 6a.outX.
>
> Signed-off-by: Adam Ford <aford173 at gmail.com>
I've been reviewing this patch and it looks mostly OK to me except for a
few notes below, mostly minor ones. However my knowledge of the U-Boot
driver model is minimal, thus I couldn't go in depth in the most
interesting and critical part of Adam's work, i.e. the adaptations for
the U-Boot codebase. I'm afraid I cannot do more.
> diff --git a/drivers/clk/Makefile b/drivers/clk/Makefile
> index 645709b855..2a9ebec860 100644
> --- a/drivers/clk/Makefile
> +++ b/drivers/clk/Makefile
> @@ -51,3 +51,4 @@ obj-$(CONFIG_SANDBOX_CLK_CCF) += clk_sandbox_ccf.o
> obj-$(CONFIG_STM32H7) += clk_stm32h7.o
> obj-$(CONFIG_CLK_VERSAL) += clk_versal.o
> obj-$(CONFIG_CLK_CDCE9XX) += clk-cdce9xx.o
> +obj-$(CONFIG_CLK_VERSACLOCK) +=clk_versaclock.o
Nit: space after '+='.
> diff --git a/drivers/clk/clk_versaclock.c b/drivers/clk/clk_versaclock.c
> new file mode 100644
> index 0000000000..30e49fad31
> --- /dev/null
> +++ b/drivers/clk/clk_versaclock.c
> @@ -0,0 +1,1025 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later
> +/*
> + * Driver for IDT Versaclock 5/6
> + *
> + * Derived from code Copyright (C) 2017 Marek Vasut <marek.vasut at gmail.com>
> + */
> +
> +#include <common.h>
> +#include <clk.h>
> +#include <clk-uclass.h>
> +#include <dm.h>
> +#include <errno.h>
> +#include <i2c.h>
> +#include <dm/device_compat.h>
> +#include <log.h>
> +#include <linux/clk-provider.h>
> +#include <linux/kernel.h>
> +#include <linux/math64.h>
> +
> +#include <dt-bindings/clk/versaclock.h>
Missing file?
> +
> +/* VersaClock5 registers */
> +#define VC5_OTP_CONTROL 0x00
> +
> +/* Factory-reserved register block */
> +#define VC5_RSVD_DEVICE_ID 0x01
> +#define VC5_RSVD_ADC_GAIN_7_0 0x02
> +#define VC5_RSVD_ADC_GAIN_15_8 0x03
> +#define VC5_RSVD_ADC_OFFSET_7_0 0x04
> +#define VC5_RSVD_ADC_OFFSET_15_8 0x05
> +#define VC5_RSVD_TEMPY 0x06
> +#define VC5_RSVD_OFFSET_TBIN 0x07
> +#define VC5_RSVD_GAIN 0x08
> +#define VC5_RSVD_TEST_NP 0x09
> +#define VC5_RSVD_UNUSED 0x0a
> +#define VC5_RSVD_BANDGAP_TRIM_UP 0x0b
> +#define VC5_RSVD_BANDGAP_TRIM_DN 0x0c
> +#define VC5_RSVD_CLK_R_12_CLK_AMP_4 0x0d
> +#define VC5_RSVD_CLK_R_34_CLK_AMP_4 0x0e
> +#define VC5_RSVD_CLK_AMP_123 0x0f
I wonder whether it really makes sense to define so many registers that
are not used in the driver. But it's done the same way in the Linux
driver, and it doesn't hurt much, so I'll be fine with or without them.
[...]
> +static const struct udevice_id versaclock_ids[] = {
> + { .compatible = "idt,5p49v5923", .data = (ulong)&idt_5p49v5923_info },
> + { .compatible = "idt,5p49v5925", .data = (ulong)&idt_5p49v5925_info },
> + { .compatible = "idt,5p49v5933", .data = (ulong)&idt_5p49v5933_info },
> + { .compatible = "idt,5p49v5935", .data = (ulong)&idt_5p49v5935_info },
> + { .compatible = "idt,5p49v6901", .data = (ulong)&idt_5p49v6901_info },
> + { .compatible = "idt,5p49v6965", .data = (ulong)&idt_5p49v6965_info },
> + {},
> +};
Why not putting this array below, right before the U_BOOT_DRIVER() call
where it is used, similarly to the Linux driver?
--
Luca
More information about the U-Boot
mailing list