[PATCH v7 15/20] tegra: fdt: Add function to return peripheral/clock ID
Tom Warren
TWarren at nvidia.com
Fri Mar 2 05:21:07 EST 2012
Simon,
> -----Original Message-----
> From: Simon Glass [mailto:sjg at chromium.org]
> Sent: Tuesday, February 28, 2012 11:08 AM
> To: U-Boot Mailing List
> Cc: Tom Warren; Stephen Warren; Simon Glass; linux-tegra at vger.kernel.org;
> Jerry Van Baren; Devicetree Discuss
> Subject: [PATCH v7 15/20] tegra: fdt: Add function to return
> peripheral/clock ID
>
> A common requirement is to find the clock ID for a peripheral. This is the
> second cell of the 'clocks' property (the first being the phandle itself).
>
> Signed-off-by: Simon Glass <sjg at chromium.org>
> ---
> Changes in v4:
> - Add fdtdec function to return peripheral ID
>
> Changes in v6:
> - Move peripheral decode function into Tegra's clock.c
>
> Changes in v7:
> - Add belts and braces checking of device tree clock ID
>
> arch/arm/cpu/armv7/tegra2/clock.c | 56
> ++++++++++++++++++++++++++++++
> arch/arm/include/asm/arch-tegra2/clock.h | 13 +++++++
> 2 files changed, 69 insertions(+), 0 deletions(-)
>
> diff --git a/arch/arm/cpu/armv7/tegra2/clock.c
> b/arch/arm/cpu/armv7/tegra2/clock.c
> index 11d2346..959322b 100644
> --- a/arch/arm/cpu/armv7/tegra2/clock.c
> +++ b/arch/arm/cpu/armv7/tegra2/clock.c
> @@ -28,6 +28,7 @@
> #include <asm/arch/tegra2.h>
> #include <common.h>
> #include <div64.h>
> +#include <fdtdec.h>
>
> /*
> * This is our record of the current clock rate of each clock. We don't @@
> -918,6 +919,61 @@ void clock_ll_start_uart(enum periph_id periph_id)
> reset_set_enable(periph_id, 0);
> }
>
> +/*
> + * Convert a device tree clock ID to our peripheral ID. They are mostly
> + * the same but we are very cautious so we check that a valid clock ID
> +is
> + * provided.
> + *
> + * @param clk_id Clock ID according to tegra2 device tree binding
> + * @return peripheral ID, or PERIPH_ID_NONE if the clock ID is invalid
> +*/ static enum periph_id clk_id_to_periph_id(int clk_id) {
> + if (clk_id > 95)
> + return PERIPH_ID_NONE;
> +
> + switch (clk_id) {
> + case 1:
> + case 2:
> + case 7:
> + case 10:
> + case 20:
> + case 30:
> + case 35:
> + case 49:
> + case 56:
> + case 74:
> + case 76:
> + case 77:
> + case 78:
> + case 79:
> + case 80:
> + case 81:
> + case 82:
> + case 83:
> + case 91:
> + case 95:
> + return PERIPH_ID_NONE;
> + default:
> + return clk_id;
> + }
> +}
> +
> +int clock_decode_periph_id(const void *blob, int node) {
> + enum periph_id id;
> + u32 cell[2];
> + int err;
> +
> + err = fdtdec_get_int_array(blob, node, "clocks", cell,
> + ARRAY_SIZE(cell));
This call to fdtdec_get_int_array() breaks Harmony and Ventana builds, since they're not yet DT-enabled (CONFIG_OF_CONTROL isn't #defined).
I'd fix this myself, but I'm not sure what the correct fix is to keep Harmony/Ventana building & booting.
Please fix, test on all Tegra2 builds (MAKEALL -s tegra2) and resend. Thanks.
Tom
> + if (err)
> + return -1;
> + id = clk_id_to_periph_id(cell[1]);
> + assert(clock_periph_id_isvalid(id));
> + return id;
> +}
> +
> int clock_verify(void)
> {
> struct clk_pll *pll = get_pll(CLOCK_ID_PERIPH); diff --git
> a/arch/arm/include/asm/arch-tegra2/clock.h b/arch/arm/include/asm/arch-
> tegra2/clock.h
> index 080ef18..6b12c76 100644
> --- a/arch/arm/include/asm/arch-tegra2/clock.h
> +++ b/arch/arm/include/asm/arch-tegra2/clock.h
> @@ -177,6 +177,7 @@ enum periph_id {
> PERIPH_ID_CRAM2,
>
> PERIPH_ID_COUNT,
> + PERIPH_ID_NONE = -1,
> };
>
> /* Converts a clock number to a clock register: 0=L, 1=H, 2=U */ @@ -355,6
> +356,18 @@ unsigned clock_get_rate(enum clock_id clkid);
> */
> void clock_ll_start_uart(enum periph_id periph_id);
>
> +/**
> + * Decode a peripheral ID from a device tree node.
> + *
> + * This works by looking up the peripheral's 'clocks' node and reading
> +out
> + * the second cell, which is the clock number / peripheral ID.
> + *
> + * @param blob FDT blob to use
> + * @param node Node to look at
> + * @return peripheral ID, or PERIPH_ID_NONE if none */ enum periph_id
> +clock_decode_periph_id(const void *blob, int node);
> +
> /*
> * Checks that clocks are valid and prints a warning if not
> *
> --
> 1.7.7.3
--
nvpublic
More information about the devicetree-discuss
mailing list