[PATCH 7/7] ARM: Kirkwood: switch to DT clock providers
Gregory CLEMENT
gregory.clement at free-electrons.com
Fri Nov 16 12:33:29 EST 2012
On 11/15/2012 10:28 PM, Andrew Lunn wrote:
> With true DT clock providers available switch Kirkwood clock setup in
> DT- enabled boards. While AUXDATA can be removed completely from bus
> probing, some devices still don't know about DT. Therefore, some clkdev
> aliases are created until these devices also move to DT.
>
> Signed-off-by: Andrew Lunn <andrew at lunn.ch>
> ---
> arch/arm/boot/dts/kirkwood.dtsi | 22 +++++++++
> arch/arm/mach-kirkwood/Kconfig | 2 +
> arch/arm/mach-kirkwood/board-dt.c | 72 +++++++++++++++++++++++------
> arch/arm/plat-orion/include/plat/common.h | 1 +
> 4 files changed, 84 insertions(+), 13 deletions(-)
>
> diff --git a/arch/arm/boot/dts/kirkwood.dtsi b/arch/arm/boot/dts/kirkwood.dtsi
> index 4e5b815..5c85a57 100644
> --- a/arch/arm/boot/dts/kirkwood.dtsi
> +++ b/arch/arm/boot/dts/kirkwood.dtsi
> @@ -19,6 +19,12 @@
> #address-cells = <1>;
> #size-cells = <1>;
>
> + core_clk: core-clocks at 10030 {
> + compatible = "marvell,kirkwood-core-clocks";
> + reg = <0x10030 0x4>;
> + #clock-cells = <1>;
> + };
> +
> gpio0: gpio at 10100 {
> compatible = "marvell,orion-gpio";
> #gpio-cells = <2>;
> @@ -42,6 +48,7 @@
> reg = <0x12000 0x100>;
> reg-shift = <2>;
> interrupts = <33>;
> + clocks = <&clk_gate 7>;
> /* set clock-frequency in board dts */
> status = "disabled";
> };
> @@ -51,6 +58,7 @@
> reg = <0x12100 0x100>;
> reg-shift = <2>;
> interrupts = <34>;
> + clocks = <&clk_gate 7>;
> /* set clock-frequency in board dts */
> status = "disabled";
> };
> @@ -68,12 +76,21 @@
> cell-index = <0>;
> interrupts = <23>;
> reg = <0x10600 0x28>;
> + clocks = <&clk_gate 7>;
> status = "disabled";
> };
>
> + clk_gate: clock-gating-control at 2011c {
> + compatible = "marvell,kirkwood-clock-gating";
> + reg = <0x2011c 0x4>;
> + clocks = <&core_clk 0>;
> + #clock-cells = <1>;
> + };
> +
> wdt at 20300 {
> compatible = "marvell,orion-wdt";
> reg = <0x20300 0x28>;
> + clocks = <&clk_gate 7>;
> status = "okay";
> };
>
> @@ -81,6 +98,8 @@
> compatible = "marvell,orion-sata";
> reg = <0x80000 0x5000>;
> interrupts = <21>;
> + clocks = <&clk_gate 14>, <&clk_gate 15>;
> + clock-names = "0", "1";
> status = "disabled";
> };
>
> @@ -94,6 +113,7 @@
> reg = <0x3000000 0x400>;
> chip-delay = <25>;
> /* set partition map and/or chip-delay in board dts */
> + clocks = <&clk_gate 7>;
> status = "disabled";
> };
>
> @@ -104,6 +124,7 @@
> #size-cells = <0>;
> interrupts = <29>;
> clock-frequency = <100000>;
> + clocks = <&clk_gate 7>;
> status = "disabled";
> };
>
> @@ -113,6 +134,7 @@
> <0xf5000000 0x800>;
> reg-names = "regs", "sram";
> interrupts = <22>;
> + clocks = <&clk_gate 17>;
> status = "okay";
> };
> };
> diff --git a/arch/arm/mach-kirkwood/Kconfig b/arch/arm/mach-kirkwood/Kconfig
> index 50bca50..2833492 100644
> --- a/arch/arm/mach-kirkwood/Kconfig
> +++ b/arch/arm/mach-kirkwood/Kconfig
> @@ -46,6 +46,8 @@ config MACH_GURUPLUG
>
> config ARCH_KIRKWOOD_DT
> bool "Marvell Kirkwood Flattened Device Tree"
> + select MVEBU_CLK_CORE
> + select MVEBU_CLK_GATING
> select USE_OF
> help
> Say 'Y' here if you want your kernel to support the
> diff --git a/arch/arm/mach-kirkwood/board-dt.c b/arch/arm/mach-kirkwood/board-dt.c
> index d94872f..0129cdc 100644
> --- a/arch/arm/mach-kirkwood/board-dt.c
> +++ b/arch/arm/mach-kirkwood/board-dt.c
> @@ -14,11 +14,15 @@
> #include <linux/init.h>
> #include <linux/of.h>
> #include <linux/of_platform.h>
> +#include <linux/clk-provider.h>
> +#include <linux/clk/mvebu.h>
> #include <linux/kexec.h>
> #include <asm/mach/arch.h>
> #include <asm/mach/map.h>
> #include <mach/bridge-regs.h>
> +#include <linux/platform_data/usb-ehci-orion.h>
> #include <plat/irq.h>
> +#include <plat/common.h>
> #include "common.h"
>
> static struct of_device_id kirkwood_dt_match_table[] __initdata = {
> @@ -26,16 +30,59 @@ static struct of_device_id kirkwood_dt_match_table[] __initdata = {
> { }
> };
>
> -struct of_dev_auxdata kirkwood_auxdata_lookup[] __initdata = {
> - OF_DEV_AUXDATA("marvell,orion-spi", 0xf1010600, "orion_spi.0", NULL),
> - OF_DEV_AUXDATA("marvell,mv64xxx-i2c", 0xf1011000, "mv64xxx_i2c.0",
> - NULL),
> - OF_DEV_AUXDATA("marvell,orion-wdt", 0xf1020300, "orion_wdt", NULL),
> - OF_DEV_AUXDATA("marvell,orion-sata", 0xf1080000, "sata_mv.0", NULL),
> - OF_DEV_AUXDATA("marvell,orion-nand", 0xf4000000, "orion_nand", NULL),
> - OF_DEV_AUXDATA("marvell,orion-crypto", 0xf1030000, "mv_crypto", NULL),
> - {},
> -};
> +/*
> + * There are still devices that doesn't know about DT yet. Get clock
> + * gates here and add a clock lookup alias, so that old platform
> + * devices still work.
> +*/
> +
> +static void __init kirkwood_legacy_clk_init(void)
> +{
> +
> + struct device_node *np = of_find_compatible_node(NULL, NULL,
> + "marvell,kirkwood-clock-gating");
> +
> + struct of_phandle_args clkspec;
> +
> + clkspec.np = np;
> + clkspec.args_count = 1;
> +
> + clkspec.args[0] = CGC_BIT_GE0;
> + orion_clkdev_add(NULL, "mv643xx_eth_port.0",
> + of_clk_get_from_provider(&clkspec));
> +
> + clkspec.args[0] = CGC_BIT_PEX0;
> + orion_clkdev_add("0", "pcie",
> + of_clk_get_from_provider(&clkspec));
> +
> + clkspec.args[0] = CGC_BIT_USB0;
> + orion_clkdev_add(NULL, "orion-ehci.0",
> + of_clk_get_from_provider(&clkspec));
> +
> + clkspec.args[0] = CGC_BIT_XOR0;
> + orion_clkdev_add(NULL, "mv_xor_shared.0",
> + of_clk_get_from_provider(&clkspec));
> +
> + clkspec.args[0] = CGC_BIT_XOR1;
> + orion_clkdev_add(NULL, "mv_xor_shared.1",
> + of_clk_get_from_provider(&clkspec));
> +
> + clkspec.args[0] = CGC_BIT_PEX1;
> + orion_clkdev_add("1", "pcie",
> + of_clk_get_from_provider(&clkspec));
> +
> + clkspec.args[0] = CGC_BIT_GE1;
> + orion_clkdev_add(NULL, "mv643xx_eth_port.1",
> + of_clk_get_from_provider(&clkspec));
> +
> +}
> +
> +static void __init kirkwood_of_clk_init(void)
> +{
> + mvebu_clocks_init();
> + mvebu_clk_gating_init();
What do you think about moving mvebu_clk_gating_init()
inside mvebu_clocks_init ?
It is what we have done for the cpu_clk.
> + kirkwood_legacy_clk_init();
> +}
>
> static void __init kirkwood_dt_init(void)
> {
> @@ -54,7 +101,7 @@ static void __init kirkwood_dt_init(void)
> kirkwood_l2_init();
>
> /* Setup root of clk tree */
> - kirkwood_clk_init();
> + kirkwood_of_clk_init();
>
> /* internal devices that every board has */
> kirkwood_xor0_init();
> @@ -94,8 +141,7 @@ static void __init kirkwood_dt_init(void)
> if (of_machine_is_compatible("keymile,km_kirkwood"))
> km_kirkwood_init();
>
> - of_platform_populate(NULL, kirkwood_dt_match_table,
> - kirkwood_auxdata_lookup, NULL);
> + of_platform_populate(NULL, kirkwood_dt_match_table, NULL, NULL);
> }
>
> static const char *kirkwood_dt_board_compat[] = {
> diff --git a/arch/arm/plat-orion/include/plat/common.h b/arch/arm/plat-orion/include/plat/common.h
> index 6bbc3fe..e06fc5f 100644
> --- a/arch/arm/plat-orion/include/plat/common.h
> +++ b/arch/arm/plat-orion/include/plat/common.h
> @@ -12,6 +12,7 @@
> #include <linux/mv643xx_eth.h>
>
> struct dsa_platform_data;
> +struct mv_sata_platform_data;
>
> void __init orion_uart0_init(void __iomem *membase,
> resource_size_t mapbase,
>
--
Gregory Clement, Free Electrons
Kernel, drivers, real-time and embedded Linux
development, consulting, training and support.
http://free-electrons.com
More information about the linux-arm-kernel
mailing list