MIPS: TXx9: Convert to Common Clock Framework
authorGeert Uytterhoeven <geert@linux-m68k.org>
Sun, 11 Sep 2016 08:59:58 +0000 (10:59 +0200)
committerRalf Baechle <ralf@linux-mips.org>
Tue, 4 Oct 2016 14:13:57 +0000 (16:13 +0200)
Replace the custom minimal clock implementation for Toshiba TXx9 by a
basic implementation using the Common Clock Framework.

The only clocks that are provided are those needed by TXx9-specific
drivers ("imbus" and "spi" (TX4938 only)), and their common parent
clock "gbus". Other clocks can be added when needed.

Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
Reviewed-by: Stephen Boyd <sboyd@codeaurora.org>
Reviewed-by: Atsushi Nemoto <anemo@mba.ocn.ne.jp>
Cc: Wim Van Sebroeck <wim@iguana.be>
Cc: Guenter Roeck <linux@roeck-us.net>
Cc: linux-clk@vger.kernel.org
Cc: linux-mips@linux-mips.org
Cc: linux-watchdog@vger.kernel.org
Patchwork: https://patchwork.linux-mips.org/patch/14239/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
arch/mips/txx9/Kconfig
arch/mips/txx9/generic/setup.c

index 8c337d60f790db9f0ae31c8a64872acfe734cb9b..42923478d45ca363b2c8eca403138dfa4aedcc61 100644 (file)
@@ -20,7 +20,7 @@ config MACH_TXX9
        select SYS_SUPPORTS_32BIT_KERNEL
        select SYS_SUPPORTS_LITTLE_ENDIAN
        select SYS_SUPPORTS_BIG_ENDIAN
-       select HAVE_CLK
+       select COMMON_CLK
 
 config TOSHIBA_JMR3927
        bool "Toshiba JMR-TX3927 board"
index ada92db92f87d91a68a32d8747313eaf20bed021..a1d98b5c8fd6757683d1e9c23196660676006a54 100644 (file)
@@ -15,7 +15,8 @@
 #include <linux/interrupt.h>
 #include <linux/string.h>
 #include <linux/module.h>
-#include <linux/clk.h>
+#include <linux/clk-provider.h>
+#include <linux/clkdev.h>
 #include <linux/err.h>
 #include <linux/gpio/driver.h>
 #include <linux/platform_device.h>
@@ -83,40 +84,6 @@ int txx9_ccfg_toeon __initdata;
 int txx9_ccfg_toeon __initdata = 1;
 #endif
 
-/* Minimum CLK support */
-
-struct clk *clk_get(struct device *dev, const char *id)
-{
-       if (!strcmp(id, "spi-baseclk"))
-               return (struct clk *)((unsigned long)txx9_gbus_clock / 2 / 2);
-       if (!strcmp(id, "imbus_clk"))
-               return (struct clk *)((unsigned long)txx9_gbus_clock / 2);
-       return ERR_PTR(-ENOENT);
-}
-EXPORT_SYMBOL(clk_get);
-
-int clk_enable(struct clk *clk)
-{
-       return 0;
-}
-EXPORT_SYMBOL(clk_enable);
-
-void clk_disable(struct clk *clk)
-{
-}
-EXPORT_SYMBOL(clk_disable);
-
-unsigned long clk_get_rate(struct clk *clk)
-{
-       return (unsigned long)clk;
-}
-EXPORT_SYMBOL(clk_get_rate);
-
-void clk_put(struct clk *clk)
-{
-}
-EXPORT_SYMBOL(clk_put);
-
 #define BOARD_VEC(board)       extern struct txx9_board_vec board;
 #include <asm/txx9/boards.h>
 #undef BOARD_VEC
@@ -560,8 +527,41 @@ void __init plat_time_init(void)
        txx9_board_vec->time_init();
 }
 
+static void txx9_clk_init(void)
+{
+       struct clk_hw *hw;
+       int error;
+
+       hw = clk_hw_register_fixed_rate(NULL, "gbus", NULL, 0, txx9_gbus_clock);
+       if (IS_ERR(hw)) {
+               error = PTR_ERR(hw);
+               goto fail;
+       }
+
+       hw = clk_hw_register_fixed_factor(NULL, "imbus", "gbus", 0, 1, 2);
+       error = clk_hw_register_clkdev(hw, "imbus_clk", NULL);
+       if (error)
+               goto fail;
+
+#ifdef CONFIG_CPU_TX49XX
+       if (TX4938_REV_PCODE() == 0x4938) {
+               hw = clk_hw_register_fixed_factor(NULL, "spi", "gbus", 0, 1, 4);
+               error = clk_hw_register_clkdev(hw, "spi-baseclk", NULL);
+               if (error)
+                       goto fail;
+       }
+#endif
+
+       return;
+
+fail:
+       pr_err("Failed to register clocks: %d\n", error);
+}
+
 static int __init _txx9_arch_init(void)
 {
+       txx9_clk_init();
+
        if (txx9_board_vec->arch_init)
                txx9_board_vec->arch_init();
        return 0;