[PATCH 7/7] ARM: Kirkwood: switch to DT clock providers

Gregory CLEMENT gregory.clement at free-electrons.com
Sat Nov 17 04: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 devicetree-discuss mailing list