clk: npcm: add NPCM7xx clock driver
Subsystems (3)
Tomer Maimon
maintainercover clk: npcm: add NPCM7xx clock driver
This patch set adds clock support for the Nuvoton NPCM7xx Baseboard Management Controller (BMC).
Tomer Maimon (3):
dt-binding: clock: document NPCM7xx clock DT bindings
dt-binding: clock: add NPCM7XX clock include file
clk: npcm: add NPCM7xx clock driver
.../bindings/clock/nuvoton,npcm750-clk.txt | 84 +++ drivers/clk/Makefile | 2 + drivers/clk/clk-npcm7xx-pll.c | 102 +++ drivers/clk/clk-npcm7xx-pll.h | 27 + drivers/clk/clk-npcm7xx.c | 704 +++++++++++++++++++++ include/dt-bindings/clock/nuvoton,npcm7xx-clock.h | 46 ++ include/linux/clk/nuvoton.h | 13 + 7 files changed, 978 insertions(+) create mode 100644 Documentation/devicetree/bindings/clock/nuvoton,npcm750-clk.txt mode change 100644 => 100755 drivers/clk/Makefile create mode 100644 drivers/clk/clk-npcm7xx-pll.c create mode 100644 drivers/clk/clk-npcm7xx-pll.h create mode 100644 drivers/clk/clk-npcm7xx.c create mode 100644 include/dt-bindings/clock/nuvoton,npcm7xx-clock.h create mode 100644 include/linux/clk/nuvoton.h
Signature · 1 line
2.14.1
Tomer Maimon
maintainerPATCH 1/3 dt-binding: clock: document NPCM7xx clock DT bindings
Added device tree binding documentation for Nuvoton NPCM7xx clock.
--- .../bindings/clock/nuvoton,npcm750-clk.txt | 84 ++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 Documentation/devicetree/bindings/clock/nuvoton,npcm750-clk.txt
Documentation/devicetree/bindings/clock/nuvoton,npcm750-clk.txt new file +84 -0
@@ -0,0 +1,84 @@ +* Nuvoton NPCM7XX Clock Controller + +Nuvoton Poleg BMC NPCM7XX contain integrated clock +controller, which generates and supplies clock to all modules within the BMC. + +Required Properties: + +- compatible: should be one of following: + - "nuvoton,npcm750-clk" : for clock controller of Nuvoton + Poleg BMC NPCM750 + +- reg: physical base address of the controller and length of memory mapped + region. + + +- #clock-cells: should be 1. + +All available clocks are defined as preprocessor macros in +dt-bindings/clock/nuvoton,npcm7xx-clock.h header and can beused in device tree +sources. + +External clocks: + +There are several clocks that are generated outside the BMC. All clocks are of +a known fixed value that cannot be chagned. Therefor these values are hard coded +inside the driver and registered on init. + +The clock modules contains 4 PLL, 20 dividers and 11 muxes. All these settings +are set before Linux boot and are not to be altered by the Linux. This driver is +used only to read the values clocks, not to set them. + +In addition to the clock driver, there are 3 external clocks suppling the +network, which are of fixed values, set on on the device tree, but not used by + the clock module. Example can be found below. + +Example: Clock controller node: + + clk: clock-controller@f0801000 { + compatible = "nuvoton,npcm750-clk"; + #clock-cells = <1>; + clock-controller; + reg = <0xf0801000 0x1000>; + status = "okay"; + }; + +Example: Required external clocks for network: + + /* external clock signal rg1refck, supplied by the phy */ + clk_rg1refck: clk_rg1refck { + compatible = "fixed-clock"; + #clock-cells = <0>; + clock-frequency = <125000000>; + clock-output-names = "clk_rg1refck"; + }; + + /* external clock signal rg2refck, supplied by the phy */ + clk_rg2refck: clk_rg2refck { + compatible = "fixed-clock"; + #clock-cells = <0>; + clock-frequency = <125000000>; + clock-output-names = "clk_rg2refck"; + }; + + clk_xin: clk_xin { + compatible = "fixed-clock"; + #clock-cells = <0>; + clock-frequency = <50000000>; + clock-output-names = "clk_xin"; + }; + +Example: UART controller node that consumes the clock generated by the clock + controller (refer to the standard clock bindings for information about + "clocks" and "clock-names" properties): + + uart0: serial@e2900000 { + compatible = "Nuvoton,s5pv210-uart"; + reg = <0xe2900000 0x400>; + interrupt-parent = <&vic1>; + interrupts = <10>; + clock-names = "uart", "clk_uart_baud0", + "clk_uart_baud1"; + clocks = <&clocks UART0>, <&clocks UART0>, + <&clocks SCLK_UART0>; + };
Signature · 1 line
2.14.1
Tomer Maimon
maintainerPATCH 2/3 dt-binding: clock: add NPCM7XX clock include file
In reply to Tomer Maimonadd NPCM7XX clock include file for DTS use.
--- include/dt-bindings/clock/nuvoton,npcm7xx-clock.h | 46 +++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 include/dt-bindings/clock/nuvoton,npcm7xx-clock.h
include/dt-bindings/clock/nuvoton,npcm7xx-clock.h new file +46 -0
@@ -0,0 +1,46 @@ +/* +* Nuvoton NPCM7xx Clock Generator +* All the clocks are initialized by the bootloader, so this driver allow only +* reading of current settings directly from the hardware. +* +* Copyright (C) 2018 Nuvoton Technologies [email protected] +* +* Released under the GPLv2 only. +* SPDX-License-Identifier: GPL-2.0 +* http://www.opensource.org/licenses/gpl-license.html +* http://www.gnu.org/copyleft/gpl.html +*/ + +#ifndef __DT_BINDINGS_CLOCK_NPCM7XX_H +#define __DT_BINDINGS_CLOCK_NPCM7XX_H + + +#define NPCM7XX_CLK_CPU 0 +#define NPCM7XX_CLK_GFX_PIXEL 1 +#define NPCM7XX_CLK_MC 2 +#define NPCM7XX_CLK_ADC 3 +#define NPCM7XX_CLK_AHB 4 +#define NPCM7XX_CLK_TIMER 5 +#define NPCM7XX_CLK_UART 6 +#define NPCM7XX_CLK_MMC 7 +#define NPCM7XX_CLK_SPI3 8 +#define NPCM7XX_CLK_PCI 9 +#define NPCM7XX_CLK_AXI 10 +#define NPCM7XX_CLK_APB4 11 +#define NPCM7XX_CLK_APB3 12 +#define NPCM7XX_CLK_APB2 13 +#define NPCM7XX_CLK_APB1 14 +#define NPCM7XX_CLK_APB5 15 +#define NPCM7XX_CLK_CLKOUT 16 +#define NPCM7XX_CLK_GFX 17 +#define NPCM7XX_CLK_SU 18 +#define NPCM7XX_CLK_SU48 19 +#define NPCM7XX_CLK_SDHC 20 +#define NPCM7XX_CLK_SPI0 21 +#define NPCM7XX_CLK_SPIX 22 + +#define NPCM7XX_NUM_CLOCKS (NPCM7XX_CLK_SPIX+1) + + + +#endif
Signature · 1 line
2.14.1
Tomer Maimon
maintainerPATCH 3/3 clk: npcm: add NPCM7xx clock driver
In reply to Tomer MaimonAdd Nuvoton BMC NPCM7xx clock bus driver.
--- drivers/clk/Makefile | 2 + drivers/clk/clk-npcm7xx-pll.c | 102 ++++++ drivers/clk/clk-npcm7xx-pll.h | 27 ++ drivers/clk/clk-npcm7xx.c | 704 ++++++++++++++++++++++++++++++++++++++++++ include/linux/clk/nuvoton.h | 13 + 5 files changed, 848 insertions(+) mode change 100644 => 100755 drivers/clk/Makefile create mode 100644 drivers/clk/clk-npcm7xx-pll.c create mode 100644 drivers/clk/clk-npcm7xx-pll.h create mode 100644 drivers/clk/clk-npcm7xx.c create mode 100644 include/linux/clk/nuvoton.h
drivers/clk/Makefile +2 -0
@@ -20,6 +20,8 @@ endif obj-$(CONFIG_MACH_ASM9260) += clk-asm9260.o obj-$(CONFIG_COMMON_CLK_AXI_CLKGEN) += clk-axi-clkgen.o obj-$(CONFIG_ARCH_AXXIA) += clk-axm5516.o +obj-$(CONFIG_ARCH_NPCM7XX) += clk-npcm7xx-pll.o +obj-$(CONFIG_ARCH_NPCM7XX) += clk-npcm7xx.o obj-$(CONFIG_COMMON_CLK_CDCE706) += clk-cdce706.o obj-$(CONFIG_COMMON_CLK_CDCE925) += clk-cdce925.o obj-$(CONFIG_ARCH_CLPS711X) += clk-clps711x.o
drivers/clk/clk-npcm7xx-pll.c new file +102 -0
102 lines not on this page · raw message
drivers/clk/clk-npcm7xx-pll.h new file +27 -0
@@ -0,0 +1,27 @@ +/* +* Nuvoton NPCM7xx Clock Generator +* All the clocks are initialized by the bootloader, so this driver allow only +* reading of current settings directly from the hardware. +* +* Copyright (c) 2014-2018 Nuvoton Technology corporation. +* +* Released under the GPLv2 only. +* SPDX-License-Identifier: GPL-2.0 +*/ + +#ifndef __NPCM7XX_CLK_PLL_H +#define __NPCM7XX_CLK_PLL_H + +struct npcm7xx_clk_pll { +struct clk_hw hw; +void __iomem *pllcon; +u8 flags; +}; + +#define to_npcm7xx_clk_pll (_hw) container_of(_hw, struct npcm7xx_clk_pll, hw) + +struct clk_hw *npcm7xx_clk_register_pll (struct device *dev, +void __iomem *pllcon,const char *name,const char *parent_name, +unsigned long flags); + +#endif /* __NPCM7XX_CLK_PLL_H */
drivers/clk/clk-npcm7xx.c new file +704 -0
704 lines not on this page · raw message
include/linux/clk/nuvoton.h new file +13 -0
@@ -0,0 +1,13 @@ +/* +* Copyright (c) 2014-2018 Nuvoton Technology corporation. +* +* Released under the GPLv2 only. +* SPDX-License-Identifier: GPL-2.0 +*/ + +#ifndef __LINUX_CLK_NUVOTON_H_ +#define __LINUX_CLK_NUVOTON_H_ + +void nuvoton_npcm750_clock_init (void ); + +#endif
Signature · 1 line
2.14.1
Quoted 1 line · Tomer Maimon
Add Nuvoton BMC NPCM7xx clock bus driver.
Looks good. Please describe what the driver supports in a bit more detail (which clocks, what SoCs, how much work is TODO).
Please submit upstream once you've fixed these issues.
Quoted 36 lines
Signed-off-by Tomer Maimon <[email protected]>--- drivers/clk/Makefile | 2 + drivers/clk/clk-npcm7xx-pll.c | 102 ++++++ drivers/clk/clk-npcm7xx-pll.h | 27 ++ drivers/clk/clk-npcm7xx.c | 704 ++++++++++++++++++++++++++++++++++++++++++ include/linux/clk/nuvoton.h | 13 + 5 files changed, 848 insertions(+) mode change 100644 => 100755 drivers/clk/Makefile create mode 100644 drivers/clk/clk-npcm7xx-pll.c create mode 100644 drivers/clk/clk-npcm7xx-pll.h create mode 100644 drivers/clk/clk-npcm7xx.c create mode 100644 include/linux/clk/nuvoton.hdrivers/clk/Makefile +2
-0@@ -20,6 +20,8 @@ endif obj-$(CONFIG_MACH_ASM9260) += clk-asm9260.o obj-$(CONFIG_COMMON_CLK_AXI_CLKGEN) += clk-axi-clkgen.o obj-$(CONFIG_ARCH_AXXIA) += clk-axm5516.o +obj-$(CONFIG_ARCH_NPCM7XX) += clk-npcm7xx-pll.o +obj-$(CONFIG_ARCH_NPCM7XX) += clk-npcm7xx.o obj-$(CONFIG_COMMON_CLK_CDCE706) += clk-cdce706.o obj-$(CONFIG_COMMON_CLK_CDCE925) += clk-cdce925.o obj-$(CONFIG_ARCH_CLPS711X) += clk-clps711x.odrivers/clk/clk-npcm7xx-pll.c new file +0
-0
drivers/clk/clk-npcm7xx-pll.c line 9
Quoted 9 lines
drivers/clk/clk-npcm7xx-pll.c new file +9
-0@@ -0,0 +1,102 @@ +/* +* Nuvoton NPCM7xx Clock Generator +* All the clocks are initialized by the bootloader, so this driver allow only +* reading of current settings directly from the hardware. +* +* Copyright (c) 2014-2018 Nuvoton Technology corporation. +* +* Released under the GPLv2 only. +* SPDX-License-Identifier: GPL-2.0
This line goes first.
Quoted 30 lines
drivers/clk/clk-npcm7xx-pll.c new file +30
-0+*/ + +#include <linux/clk-provider.h> +#include <linux/device.h> +#include <linux/err.h> +#include <linux/slab.h> +#include <linux/rational.h> +#include <linux/bitfield.h> +#include "clk-npcm7xx-pll.h" + +#define PLLCON_LOKI BIT(31) +#define PLLCON_LOKS BIT(30) +#define PLLCON_FBDV GENMASK(27, 16) +#define PLLCON_OTDV2 GENMASK(15, 13) +#define PLLCON_PWDEN BIT(12) +#define PLLCON_OTDV1 GENMASK(10, 8) +#define PLLCON_INDV GENMASK(5, 0) + +static unsigned long npcm7xx_clk_pll_recalc_rate (struct clk_hw *hw, +unsigned long parent_rate) +{ +struct npcm7xx_clk_pll *pll =to_npcm7xx_clk_pll (hw); +unsigned long fbdv, indv, otdv1, otdv2; +unsigned int val; +u64 ret; + +if (parent_rate ==0 ) { +pr_err ("%s: parent rate is zero. reg=%x\n" , __func__, + (u32)(pll->pllcon)); +return 0 ;
drivers/clk/clk-npcm7xx-pll.c line 49
Quoted 10 lines
drivers/clk/clk-npcm7xx-pll.c new file +10
-0+ } + + val =readl_relaxed (pll->pllcon); + + indv =FIELD_GET (PLLCON_INDV , val); + fbdv =FIELD_GET (PLLCON_FBDV , val); + otdv1 =FIELD_GET (PLLCON_OTDV1 , val); + otdv2 =FIELD_GET (PLLCON_OTDV2 , val); + + ret = (u64 )parent_rate * fbdv;
What is the for here?
Quoted 4 lines
drivers/clk/clk-npcm7xx-pll.c new file +4
-0+do_div (ret, indv * otdv1 * otdv2); + + pr_debug("%s: reg=%x, ret=%lu, parent_rate=%lu MHz\n", __func__, + (u32)pll->pllcon, ret,
drivers/clk/clk-npcm7xx-pll.c line 63
Quoted 10 lines
drivers/clk/clk-npcm7xx-pll.c new file +10
-0+ (unsigned long)(parent_rate / 100000l)); + +return ret; +} + +const struct clk_ops npcm7xx_clk_pll_ops = { + .recalc_rate = npcm7xx_clk_pll_recalc_rate, +}; + +
Remove extra whitespace.
drivers/clk/clk-npcm7xx-pll.c line 74
Quoted 11 lines
drivers/clk/clk-npcm7xx-pll.c new file +11
-0+struct clk_hw *npcm7xx_clk_register_pll (struct device *dev, +void __iomem *pllcon,const char *name, +const char *parent_name,unsigned long flags) +{ +struct npcm7xx_clk_pll *pll; +struct clk_init_data init; +const char *parents[1 ]; +struct clk_hw *hw; +int ret; + + pll =kzalloc (sizeof (*pll),GFP_KERNEL );
devm_kzalloc
drivers/clk/clk-npcm7xx-pll.c line 85
Quoted 11 lines
drivers/clk/clk-npcm7xx-pll.c new file +11
-0+if (!pll) +return ERR_PTR (-ENOMEM ); + +pr_debug ("\tnpcm7xx_clk_register_pll reg, reg=0x%x, name=%s, p=%s\n" , + (unsigned int )pllcon, name, parent_name); + + init.name = name; + init.ops = &npcm7xx_clk_pll_ops; + + parents[0 ] = parent_name; + init.parent_names = parents;
Why the array of size one?
Quoted 85 lines
drivers/clk/clk-npcm7xx-pll.c new file +17
-0+ init.num_parents =1 ; + init.flags = flags; + + pll->pllcon = pllcon; + pll->hw.init = &init; + + hw = &pll->hw; + + ret =clk_hw_register (dev, hw); +if (ret) { +kfree (pll); + hw =ERR_PTR (ret); + } + +return hw; +} +drivers/clk/clk-npcm7xx-pll.h new file +27
-0@@ -0,0 +1,27 @@ +/* +* Nuvoton NPCM7xx Clock Generator +* All the clocks are initialized by the bootloader, so this driver allow only +* reading of current settings directly from the hardware. +* +* Copyright (c) 2014-2018 Nuvoton Technology corporation. +* +* Released under the GPLv2 only. +* SPDX-License-Identifier: GPL-2.0 +*/ + +#ifndef __NPCM7XX_CLK_PLL_H +#define __NPCM7XX_CLK_PLL_H + +struct npcm7xx_clk_pll { +struct clk_hw hw; +void __iomem *pllcon; +u8 flags; +}; + +#define to_npcm7xx_clk_pll (_hw) container_of(_hw, struct npcm7xx_clk_pll, hw) + +struct clk_hw *npcm7xx_clk_register_pll (struct device *dev, +void __iomem *pllcon,const char *name,const char *parent_name, +unsigned long flags); + +#endif /* __NPCM7XX_CLK_PLL_H */ drivers/clk/clk-npcm7xx.c new file +29
-0@@ -0,0 +1,704 @@ +/* +* Nuvoton NPCM7xx Clock Generator +* All the clocks are initialized by the bootloader, so this driver allow only +* reading of current settings directly from the hardware. +* +* Copyright (c) 2014-2018 Nuvoton Technology corporation. +* +* Released under the GPLv2 only. +* SPDX-License-Identifier: GPL-2.0 +*/ + +#include <linux/module.h> +#include <linux/clk.h> +#include <linux/clk-provider.h> +#include <linux/device.h> +#include <linux/io.h> +#include <linux/kernel.h> +#include <linux/of.h> +#include <linux/of_device.h> +#include <linux/of_platform.h> +#include <linux/of_address.h> +#include <linux/platform_device.h> +#include <linux/slab.h> + +#include <dt-bindings/clock/nuvoton,npcm7xx-clock.h> + +#include <asm/cp15.h> +#include "clk-npcm7xx-pll.h" +
drivers/clk/clk-npcm7xx.c line 39
Quoted 10 lines
drivers/clk/clk-npcm7xx.c new file +10
-0+/*------------------------------------------------------------------------*/ +/* Debug messages */ +/*------------------------------------------------------------------------*/ +//#define NPCM7XX_DEBUG_CLK + +#ifdef NPCM7XX_DEBUG_CLK +#define NPCM7XX_CLK_MSG(format, arg...) printk(format, ## arg) +#else +#define NPCM7XX_CLK_MSG(format, arg...) do { } while (0) +#endif
Remove these. use drv_dbg instead.
drivers/clk/clk-npcm7xx.c line 42
Quoted 3 lines
drivers/clk/clk-npcm7xx.c new file +3
-0+ + +#define NPCM7XX_CLKEN1 ((void __iomem *)0x00)
You don't need the cast to pointer in these defines.
Quoted 101 lines
drivers/clk/clk-npcm7xx.c new file +101
-0+#define NPCM7XX_CLKEN2 ((void __iomem *)0x28) +#define NPCM7XX_CLKEN3 ((void __iomem *)0x30) +#define NPCM7XX_CLKSEL ((void __iomem *)0x04) +#define NPCM7XX_CLKDIV1 ((void __iomem *)0x08) +#define NPCM7XX_CLKDIV2 ((void __iomem *)0x2C) +#define NPCM7XX_CLKDIV3 ((void __iomem *)0x58) +#define NPCM7XX_PLLCON0 ((void __iomem *)0x0C) +#define NPCM7XX_PLLCON1 ((void __iomem *)0x10) +#define NPCM7XX_PLLCON2 ((void __iomem *)0x54) +#define NPCM7XX_SWRSTR ((void __iomem *)0x14) +#define NPCM7XX_IRQWAKECON ((void __iomem *)0x18) +#define NPCM7XX_IRQWAKEFLAG ((void __iomem *)0x1C) +#define NPCM7XX_IPSRST1 ((void __iomem *)0x20) +#define NPCM7XX_IPSRST2 ((void __iomem *)0x24) +#define NPCM7XX_IPSRST3 ((void __iomem *)0x34) +#define NPCM7XX_WD0RCR ((void __iomem *)0x38) +#define NPCM7XX_WD1RCR ((void __iomem *)0x3C) +#define NPCM7XX_WD2RCR ((void __iomem *)0x40) +#define NPCM7XX_SWRSTC1 ((void __iomem *)0x44) +#define NPCM7XX_SWRSTC2 ((void __iomem *)0x48) +#define NPCM7XX_SWRSTC3 ((void __iomem *)0x4C) +#define NPCM7XX_SWRSTC4 ((void __iomem *)0x50) +#define NPCM7XX_CORSTC ((void __iomem *)0x5C) +#define NPCM7XX_PLLCONG ((void __iomem *)0x60) +#define NPCM7XX_AHBCKFI ((void __iomem *)0x64) +#define NPCM7XX_SECCNT ((void __iomem *)0x68) +#define NPCM7XX_CNTR25M ((void __iomem *)0x6C) + + +struct npcm7xx_clk_gate_data { +void __iomem *reg; +u8 bit_idx; +const char *name; +const char *parent_name; +unsigned long flags; +/* +* If this clock is exported via DT, set onecell_idx to constant +* defined in include/dt-bindings/clock/nuvoton, NPCM7XX-clock.h for +* this specific clock. Otherwise, set to -1. +*/ +int onecell_idx; +}; + +struct npcm7xx_clk_mux_data { +u8 shift; +u8 mask; +u32 *table; +const char *name; +const char *const *parent_names; +u8 num_parents; +unsigned long flags; +/* +* If this clock is exported via DT, set onecell_idx to constant +* defined in include/dt-bindings/clock/nuvoton, NPCM7XX-clock.h for +* this specific clock. Otherwise, set to -1. +*/ +int onecell_idx; + +}; + +struct npcm7xx_clk_div_fixed_data { +u8 mult; +u8 div; +const char *name; +const char *parent_name; +u8 clk_divider_flags; +/* +* If this clock is exported via DT, set onecell_idx to constant +* defined in include/dt-bindings/clock/nuvoton, NPCM7XX-clock.h for +* this specific clock. Otherwise, set to -1. +*/ +int onecell_idx; +}; + + +struct npcm7xx_clk_div_data { +void __iomem *reg; +u8 shift; +u8 width; +const char *name; +const char *parent_name; +u8 clk_divider_flags; +unsigned long flags; +/* +* If this clock is exported via DT, set onecell_idx to constant +* defined in include/dt-bindings/clock/nuvoton, NPCM7XX-clock.h for +* this specific clock. Otherwise, set to -1. +*/ +int onecell_idx; +}; + +struct npcm7xx_clk_pll_data { +void __iomem *reg; +const char *name; +const char *parent_name; +//u8 clk_divider_flags; +unsigned long flags; +/* +* If this clock is exported via DT, set onecell_idx to constant +* defined in include/dt-bindings/clock/nuvoton, NPCM7XX-clock.h for +* this specific clock. Otherwise, set to -1.
drivers/clk/clk-npcm7xx.c line 153
Quoted 10 lines
drivers/clk/clk-npcm7xx.c new file +10
-0+*/ +int onecell_idx; +}; + + +/* +* Single copy of strings used to refer to clocks within this driver indexed by +* above enum. +*/ +#define NPCM7XX_CLK_S_REFCLK "refclk"
What does the S mean?
Quoted 38 lines
drivers/clk/clk-npcm7xx.c new file +38
-0+#define NPCM7XX_CLK_S_SYSBYPCK "sysbypck" +#define NPCM7XX_CLK_S_MCBYPCK "mcbypck" +#define NPCM7XX_CLK_S_GFXBYPCK "gfxbypck" +#define NPCM7XX_CLK_S_PLL0 "pll0" +#define NPCM7XX_CLK_S_PLL1 "pll1" +#define NPCM7XX_CLK_S_PLL1_DIV2 "pll1_div2" +#define NPCM7XX_CLK_S_PLL2 "pll2" +#define NPCM7XX_CLK_S_PLL_GFX "pll_gfx" +#define NPCM7XX_CLK_S_PLL2_DIV2 "pll2_div2" +#define NPCM7XX_CLK_S_PIX_MUX "gfx_pixel" +#define NPCM7XX_CLK_S_GPRFSEL_MUX "gprfsel_mux" +#define NPCM7XX_CLK_S_MC_MUX "mc_phy" +#define NPCM7XX_CLK_S_CPU_MUX "cpu" //AKA system clock. +#define NPCM7XX_CLK_S_MC "mc" +#define NPCM7XX_CLK_S_AXI "axi" //AKA CLK2 +#define NPCM7XX_CLK_S_AHB "ahb" //AKA CLK4 +#define NPCM7XX_CLK_S_CLKOUT_MUX "clkout_mux" +#define NPCM7XX_CLK_S_UART_MUX "uart_mux" +#define NPCM7XX_CLK_S_TIM_MUX "timer_mux" +#define NPCM7XX_CLK_S_SD_MUX "sd_mux" +#define NPCM7XX_CLK_S_GFXM_MUX "gfxm_mux" +#define NPCM7XX_CLK_S_SU_MUX "serial_usb_mux" +#define NPCM7XX_CLK_S_DVC_MUX "dvc_mux" +#define NPCM7XX_CLK_S_GFX_MUX "gfx_mux" +#define NPCM7XX_CLK_S_GFX_PIXEL "gfx_pixel" +#define NPCM7XX_CLK_S_SPI0 "spi0" +#define NPCM7XX_CLK_S_SPI3 "spi3" +#define NPCM7XX_CLK_S_SPIX "spix" +#define NPCM7XX_CLK_S_APB1 "apb1" +#define NPCM7XX_CLK_S_APB2 "apb2" +#define NPCM7XX_CLK_S_APB3 "apb3" +#define NPCM7XX_CLK_S_APB4 "apb4" +#define NPCM7XX_CLK_S_APB5 "apb5" +#define NPCM7XX_CLK_S_TOCK "tock" +#define NPCM7XX_CLK_S_CLKOUT "clkout" +#define NPCM7XX_CLK_S_UART "uart" +#define NPCM7XX_CLK_S_TIMER "timer" +#define NPCM7XX_CLK_S_MMC "mmc"
drivers/clk/clk-npcm7xx.c line 201
Quoted 10 lines
drivers/clk/clk-npcm7xx.c new file +10
-0+#define NPCM7XX_CLK_S_SDHC "sdhc" +#define NPCM7XX_CLK_S_ADC "adc" +#define NPCM7XX_CLK_S_GFX "gfx0_gfx1_mem" +#define NPCM7XX_CLK_S_USBIF "serial_usbif" +#define NPCM7XX_CLK_S_USB_HOST "usb_host" +#define NPCM7XX_CLK_S_USB_BRIDGE "usb_bridge" +#define NPCM7XX_CLK_S_PCI "pci" + + +static u32 pll_mux_table[] = {0 ,1 ,2 ,3 };
const?
Quoted 99 lines
drivers/clk/clk-npcm7xx.c new file +99
-0+static const char *const pll_mux_parents[]__initconst = { +NPCM7XX_CLK_S_PLL0 , +NPCM7XX_CLK_S_PLL1_DIV2 , +NPCM7XX_CLK_S_REFCLK , +NPCM7XX_CLK_S_PLL2_DIV2 , +}; + +static u32 cpuck_mux_table[] = {0 ,1 ,2 ,3 }; +static const char *const cpuck_mux_parents[]__initconst = { +NPCM7XX_CLK_S_PLL0 , +NPCM7XX_CLK_S_PLL1_DIV2 , +NPCM7XX_CLK_S_REFCLK , +NPCM7XX_CLK_S_SYSBYPCK , +}; + +static u32 pixcksel_mux_table[] = {0 ,2 }; +static const char *const pixcksel_mux_parents[]__initconst = { +NPCM7XX_CLK_S_PLL_GFX , +NPCM7XX_CLK_S_REFCLK , +}; + +static u32 sucksel_mux_table[] = {2 ,3 }; +static const char *const sucksel_mux_parents[]__initconst = { +NPCM7XX_CLK_S_REFCLK , +NPCM7XX_CLK_S_PLL2_DIV2 , +}; + +static u32 mccksel_mux_table[] = {0 ,2 ,3 }; +static const char *const mccksel_mux_parents[]__initconst = { +NPCM7XX_CLK_S_PLL1_DIV2 , +NPCM7XX_CLK_S_REFCLK , +NPCM7XX_CLK_S_MCBYPCK , +}; + +static u32 clkoutsel_mux_table[] = {0 ,1 ,2 ,3 ,4 }; +static const char *const clkoutsel_mux_parents[]__initconst = { +NPCM7XX_CLK_S_PLL0 , +NPCM7XX_CLK_S_PLL1_DIV2 , +NPCM7XX_CLK_S_REFCLK , +NPCM7XX_CLK_S_PLL_GFX ,// divided by 2 +NPCM7XX_CLK_S_PLL2_DIV2 , +}; + +static u32 gfxmsel_mux_table[] = {2 ,3 }; +static const char *const gfxmsel_mux_parents[]__initconst = { +NPCM7XX_CLK_S_REFCLK , +NPCM7XX_CLK_S_PLL2_DIV2 , +}; + +static u32 dvcssel_mux_table[] = {2 ,3 }; +static const char *const dvcssel_mux_parents[]__initconst = { +NPCM7XX_CLK_S_REFCLK , +NPCM7XX_CLK_S_PLL2 , +}; + + +static const struct npcm7xx_clk_pll_data npcm7xx_plls[]__initconst = { + {NPCM7XX_PLLCON0 ,NPCM7XX_CLK_S_PLL0 , +NPCM7XX_CLK_S_REFCLK ,0 ,-1 }, + + {NPCM7XX_PLLCON1 ,NPCM7XX_CLK_S_PLL1 , +NPCM7XX_CLK_S_REFCLK ,0 ,-1 }, + + {NPCM7XX_PLLCON2 ,NPCM7XX_CLK_S_PLL2 , +NPCM7XX_CLK_S_REFCLK ,0 ,-1 }, + + {NPCM7XX_PLLCONG ,NPCM7XX_CLK_S_PLL_GFX , +NPCM7XX_CLK_S_REFCLK ,0 ,-1 }, +}; + + +static const struct npcm7xx_clk_mux_data npcm7xx_muxes[]__initconst = { + {0 ,GENMASK (1 ,0 ), cpuck_mux_table,NPCM7XX_CLK_S_CPU_MUX , + cpuck_mux_parents,ARRAY_SIZE (cpuck_mux_parents),CLK_IS_CRITICAL , +NPCM7XX_CLK_CPU }, + + {4 ,GENMASK (1 ,0 ), pixcksel_mux_table,NPCM7XX_CLK_S_PIX_MUX , + pixcksel_mux_parents,ARRAY_SIZE (pixcksel_mux_parents),0 , +NPCM7XX_CLK_GFX_PIXEL }, + + {6 ,GENMASK (1 ,0 ), pll_mux_table,NPCM7XX_CLK_S_SD_MUX , + pll_mux_parents,ARRAY_SIZE (pll_mux_parents),0 ,-1 }, + + {8 ,GENMASK (1 ,0 ), pll_mux_table,NPCM7XX_CLK_S_UART_MUX , + pll_mux_parents,ARRAY_SIZE (pll_mux_parents),0 ,-1 }, + + {10 ,GENMASK (1 ,0 ), sucksel_mux_table,NPCM7XX_CLK_S_SU_MUX , + sucksel_mux_parents,ARRAY_SIZE (sucksel_mux_parents),0 ,-1 }, + + {12 ,GENMASK (1 ,0 ), mccksel_mux_table,NPCM7XX_CLK_S_MC_MUX , + mccksel_mux_parents,ARRAY_SIZE (mccksel_mux_parents),0 ,-1 }, + + {14 ,GENMASK (1 ,0 ), pll_mux_table,NPCM7XX_CLK_S_TIM_MUX , + pll_mux_parents,ARRAY_SIZE (pll_mux_parents),0 ,-1 }, + + {16 ,GENMASK (1 ,0 ), pll_mux_table,NPCM7XX_CLK_S_GFX_MUX , + pll_mux_parents,ARRAY_SIZE (pll_mux_parents),0 ,-1 }, + + {18 ,GENMASK (2 ,0 ), clkoutsel_mux_table,NPCM7XX_CLK_S_CLKOUT_MUX ,
drivers/clk/clk-npcm7xx.c line 310
Quoted 10 lines
drivers/clk/clk-npcm7xx.c new file +10
-0+ clkoutsel_mux_parents, ARRAY_SIZE(clkoutsel_mux_parents), 0, -1}, + + {21 ,GENMASK (1 ,0 ), gfxmsel_mux_table,NPCM7XX_CLK_S_GFXM_MUX , + gfxmsel_mux_parents, ARRAY_SIZE(gfxmsel_mux_parents), 0, -1}, + + {23, GENMASK(1, 0), dvcssel_mux_table, NPCM7XX_CLK_S_DVC_MUX, + dvcssel_mux_parents, ARRAY_SIZE(dvcssel_mux_parents), 0, -1}, +}; + +// fixed ratio dividers (no register):
Use /* */ style comments.
drivers/clk/clk-npcm7xx.c line 318
Quoted 8 lines
drivers/clk/clk-npcm7xx.c new file +8
-0+static const struct npcm7xx_clk_div_fixed_data npcm7xx_divs_fx[]__initconst = { + {1 ,2 ,NPCM7XX_CLK_S_MC ,NPCM7XX_CLK_S_MC_MUX ,0 ,NPCM7XX_CLK_MC }, + {1 ,2 ,NPCM7XX_CLK_S_PLL1_DIV2 ,NPCM7XX_CLK_S_PLL1 ,0 ,-1 }, + {1 ,2 ,NPCM7XX_CLK_S_PLL2_DIV2 ,NPCM7XX_CLK_S_PLL2 ,0 ,-1 }, +}; + + +// configurable dividers:
Again.
Quoted 164 lines
drivers/clk/clk-npcm7xx.c new file +164
-0+static const struct npcm7xx_clk_div_data npcm7xx_divs[]__initconst = { + {NPCM7XX_CLKDIV1 ,28 ,3 ,NPCM7XX_CLK_S_ADC , +NPCM7XX_CLK_S_TIMER ,CLK_DIVIDER_POWER_OF_TWO ,0 ,NPCM7XX_CLK_ADC }, +/*30-28 ADCCKDIV*/ + {NPCM7XX_CLKDIV1 ,26 ,2 ,NPCM7XX_CLK_S_AHB , +NPCM7XX_CLK_S_AXI ,0 ,CLK_IS_CRITICAL ,NPCM7XX_CLK_AHB }, +/*27-26 CLK4DIV*/ + {NPCM7XX_CLKDIV1 ,21 ,5 ,NPCM7XX_CLK_S_TIMER , +NPCM7XX_CLK_S_TIM_MUX ,0 ,0 ,NPCM7XX_CLK_TIMER }, +/*25-21 TIMCKDIV*/ + {NPCM7XX_CLKDIV1 ,16 ,5 ,NPCM7XX_CLK_S_UART , +NPCM7XX_CLK_S_UART_MUX ,0 ,0 ,NPCM7XX_CLK_UART }, +/*20-16 UARTDIV*/ + {NPCM7XX_CLKDIV1 ,11 ,5 ,NPCM7XX_CLK_S_MMC , +NPCM7XX_CLK_S_SD_MUX ,0 ,0 ,NPCM7XX_CLK_MMC }, +/*15-11 MMCCKDIV*/ + {NPCM7XX_CLKDIV1 ,6 ,5 ,NPCM7XX_CLK_S_SPI3 , +NPCM7XX_CLK_S_AHB ,0 ,0 ,NPCM7XX_CLK_SPI3 }, +/*10-6 AHB3CKDIV*/ + {NPCM7XX_CLKDIV1 ,2 ,4 ,NPCM7XX_CLK_S_PCI , +NPCM7XX_CLK_S_GFX_MUX ,0 ,0 ,NPCM7XX_CLK_PCI }, +/*5-2 PCICKDIV*/ + {NPCM7XX_CLKDIV1 ,0 ,1 ,NPCM7XX_CLK_S_AXI , +NPCM7XX_CLK_S_CPU_MUX ,CLK_DIVIDER_POWER_OF_TWO ,CLK_IS_CRITICAL , +NPCM7XX_CLK_AXI },/*0 CLK2DIV*/ + + {NPCM7XX_CLKDIV2 ,30 ,2 ,NPCM7XX_CLK_S_APB4 , +NPCM7XX_CLK_S_AHB ,CLK_DIVIDER_POWER_OF_TWO ,0 ,NPCM7XX_CLK_APB4 }, +/*31-30 APB4CKDIV*/ + {NPCM7XX_CLKDIV2 ,28 ,2 ,NPCM7XX_CLK_S_APB3 , +NPCM7XX_CLK_S_AHB ,CLK_DIVIDER_POWER_OF_TWO ,0 ,NPCM7XX_CLK_APB3 }, +/*29-28 APB3CKDIV*/ + {NPCM7XX_CLKDIV2 ,26 ,2 ,NPCM7XX_CLK_S_APB2 , +NPCM7XX_CLK_S_AHB ,CLK_DIVIDER_POWER_OF_TWO ,0 ,NPCM7XX_CLK_APB2 }, +/*27-26 APB2CKDIV*/ + {NPCM7XX_CLKDIV2 ,24 ,2 ,NPCM7XX_CLK_S_APB1 , +NPCM7XX_CLK_S_AHB ,CLK_DIVIDER_POWER_OF_TWO ,0 ,NPCM7XX_CLK_APB1 }, +/*25-24 APB1CKDIV*/ + {NPCM7XX_CLKDIV2 ,22 ,2 ,NPCM7XX_CLK_S_APB5 , +NPCM7XX_CLK_S_AHB ,CLK_DIVIDER_POWER_OF_TWO ,0 ,NPCM7XX_CLK_APB5 }, +/*23-22 APB5CKDIV*/ + {NPCM7XX_CLKDIV2 ,16 ,5 ,NPCM7XX_CLK_S_CLKOUT , +NPCM7XX_CLK_S_CLKOUT_MUX ,0 ,0 ,NPCM7XX_CLK_CLKOUT }, +/*20-16 CLKOUTDIV*/ + {NPCM7XX_CLKDIV2 ,13 ,3 ,NPCM7XX_CLK_S_GFX , +NPCM7XX_CLK_S_GFX_MUX ,0 ,0 ,NPCM7XX_CLK_GFX }, +/*15-13 GFXCKDIV*/ + {NPCM7XX_CLKDIV2 ,8 ,5 ,NPCM7XX_CLK_S_USB_BRIDGE , +NPCM7XX_CLK_S_SU_MUX ,0 ,0 ,NPCM7XX_CLK_SU }, +/*12-8 SUCKDIV*/ + {NPCM7XX_CLKDIV2 ,4 ,4 ,NPCM7XX_CLK_S_USB_HOST , +NPCM7XX_CLK_S_SU_MUX ,0 ,0 ,NPCM7XX_CLK_SU48 }, +/*7-4 SU48CKDIV*/ + {NPCM7XX_CLKDIV2 ,0 ,4 ,NPCM7XX_CLK_S_SDHC , +NPCM7XX_CLK_S_SD_MUX ,0 ,0 ,NPCM7XX_CLK_SDHC } + ,/*3-0 SD1CKDIV*/ + + {NPCM7XX_CLKDIV3 ,6 ,5 ,NPCM7XX_CLK_S_SPI0 , +NPCM7XX_CLK_S_AHB ,0 ,0 ,NPCM7XX_CLK_SPI0 }, +/*10-6 SPI0CKDV*/ + {NPCM7XX_CLKDIV3 ,1 ,5 ,NPCM7XX_CLK_S_SPIX , +NPCM7XX_CLK_S_AHB ,0 ,0 ,NPCM7XX_CLK_SPIX }, +/*5-1 SPIXCKDV*/ + +}; + + +static const struct npcm7xx_clk_gate_data npcm7xx_gates[]__initconst = { + {NPCM7XX_CLKEN1 ,31 ,"smb1-gate" ,NPCM7XX_CLK_S_APB2 ,0 }, + {NPCM7XX_CLKEN1 ,30 ,"smb0-gate" ,NPCM7XX_CLK_S_APB2 ,0 }, + {NPCM7XX_CLKEN1 ,29 ,"smb7-gate" ,NPCM7XX_CLK_S_APB2 ,0 }, + {NPCM7XX_CLKEN1 ,28 ,"smb6-gate" ,NPCM7XX_CLK_S_APB2 ,0 }, + {NPCM7XX_CLKEN1 ,27 ,"adc-gate" ,NPCM7XX_CLK_S_APB1 ,0 }, + {NPCM7XX_CLKEN1 ,26 ,"wdt-gate" ,NPCM7XX_CLK_S_TIMER ,0 }, + {NPCM7XX_CLKEN1 ,25 ,"usbdev3-gate" ,NPCM7XX_CLK_S_AHB ,0 }, + {NPCM7XX_CLKEN1 ,24 ,"usbdev6-gate" ,NPCM7XX_CLK_S_AHB ,0 }, + {NPCM7XX_CLKEN1 ,23 ,"usbdev5-gate" ,NPCM7XX_CLK_S_AHB ,0 }, + {NPCM7XX_CLKEN1 ,22 ,"usbdev4-gate" ,NPCM7XX_CLK_S_AHB ,0 }, + {NPCM7XX_CLKEN1 ,21 ,"emc2-gate" ,NPCM7XX_CLK_S_AHB ,0 }, + {NPCM7XX_CLKEN1 ,20 ,"timer5_9-gate" ,NPCM7XX_CLK_S_APB1 ,0 }, + {NPCM7XX_CLKEN1 ,19 ,"timer0_4-gate" ,NPCM7XX_CLK_S_APB1 ,0 }, + {NPCM7XX_CLKEN1 ,18 ,"pwmm0-gate" ,NPCM7XX_CLK_S_APB3 ,0 }, + {NPCM7XX_CLKEN1 ,17 ,"huart-gate" ,NPCM7XX_CLK_S_UART ,0 }, + {NPCM7XX_CLKEN1 ,16 ,"smb5-gate" ,NPCM7XX_CLK_S_APB2 ,0 }, + {NPCM7XX_CLKEN1 ,15 ,"smb4-gate" ,NPCM7XX_CLK_S_APB2 ,0 }, + {NPCM7XX_CLKEN1 ,14 ,"smb3-gate" ,NPCM7XX_CLK_S_APB2 ,0 }, + {NPCM7XX_CLKEN1 ,13 ,"smb2-gate" ,NPCM7XX_CLK_S_APB2 ,0 }, + {NPCM7XX_CLKEN1 ,12 ,"mc-gate" ,NPCM7XX_CLK_S_MC ,0 }, + {NPCM7XX_CLKEN1 ,11 ,"uart01-gate" ,NPCM7XX_CLK_S_APB1 ,0 }, + {NPCM7XX_CLKEN1 ,10 ,"aes-gate" ,NPCM7XX_CLK_S_AHB ,0 }, + {NPCM7XX_CLKEN1 ,9 ,"peci-gate" ,NPCM7XX_CLK_S_APB3 ,0 }, + {NPCM7XX_CLKEN1 ,8 ,"usbdev2-gate" ,NPCM7XX_CLK_S_AHB ,0 }, + {NPCM7XX_CLKEN1 ,7 ,"uart23-gate" ,NPCM7XX_CLK_S_APB1 ,0 }, + {NPCM7XX_CLKEN1 ,6 ,"emc1-gate" ,NPCM7XX_CLK_S_AHB ,0 }, + {NPCM7XX_CLKEN1 ,5 ,"usbdev1-gate" ,NPCM7XX_CLK_S_AHB ,0 }, + {NPCM7XX_CLKEN1 ,4 ,"shm-gate" ,NPCM7XX_CLK_S_AHB ,0 }, +/* bit 3 is reserved */ + {NPCM7XX_CLKEN1 ,2 ,"kcs-gate" ,NPCM7XX_CLK_S_APB1 ,0 }, + {NPCM7XX_CLKEN1 ,1 ,"spi3-gate" ,NPCM7XX_CLK_S_AHB ,0 }, + {NPCM7XX_CLKEN1 ,0 ,"spi0-gate" ,NPCM7XX_CLK_S_AHB ,0 }, + + {NPCM7XX_CLKEN2 ,31 ,"cp-gate" ,NPCM7XX_CLK_S_AHB ,0 }, + {NPCM7XX_CLKEN2 ,30 ,"tock-gate" ,NPCM7XX_CLK_S_TOCK ,0 }, +/* bit 29 is reserved */ + {NPCM7XX_CLKEN2 ,28 ,"gmac1-gate" ,NPCM7XX_CLK_S_AHB ,0 }, + {NPCM7XX_CLKEN2 ,27 ,"usbif-gate" ,NPCM7XX_CLK_S_USBIF ,0 }, + {NPCM7XX_CLKEN2 ,26 ,"usbhost-gate" ,NPCM7XX_CLK_S_AHB ,0 }, + {NPCM7XX_CLKEN2 ,25 ,"gmac2-gate" ,NPCM7XX_CLK_S_AHB ,0 }, +/* bit 24 is reserved */ + {NPCM7XX_CLKEN2 ,23 ,"pspi2-gate" ,NPCM7XX_CLK_S_APB5 ,0 }, + {NPCM7XX_CLKEN2 ,22 ,"pspi1-gate" ,NPCM7XX_CLK_S_APB5 ,0 }, + {NPCM7XX_CLKEN2 ,21 ,"3des-gate" ,NPCM7XX_CLK_S_AHB ,0 }, +/* bit 20 is reserved */ + {NPCM7XX_CLKEN2 ,19 ,"siox2-gate" ,NPCM7XX_CLK_S_APB3 ,0 }, + {NPCM7XX_CLKEN2 ,18 ,"siox1-gate" ,NPCM7XX_CLK_S_APB3 ,0 }, +/* bit 17 is reserved */ + {NPCM7XX_CLKEN2 ,16 ,"fuse-gate" ,NPCM7XX_CLK_S_APB4 ,0 }, +/* bit 15 is reserved */ + {NPCM7XX_CLKEN2 ,14 ,"vcd-gate" ,NPCM7XX_CLK_S_AHB ,0 }, + {NPCM7XX_CLKEN2 ,13 ,"ece-gate" ,NPCM7XX_CLK_S_AHB ,0 }, + {NPCM7XX_CLKEN2 ,12 ,"vdma-gate" ,NPCM7XX_CLK_S_AHB ,0 }, + {NPCM7XX_CLKEN2 ,11 ,"ahbpcibrg-gate" ,NPCM7XX_CLK_S_AHB ,0 }, + {NPCM7XX_CLKEN2 ,10 ,"gfxsys-gate" ,NPCM7XX_CLK_S_APB1 ,0 }, + {NPCM7XX_CLKEN2 ,9 ,"sdhc-gate" ,NPCM7XX_CLK_S_AHB ,0 }, + {NPCM7XX_CLKEN2 ,8 ,"mmc-gate" ,NPCM7XX_CLK_S_AHB ,0 }, + {NPCM7XX_CLKEN2 ,7 ,"mft7-gate" ,NPCM7XX_CLK_S_APB4 ,0 }, + {NPCM7XX_CLKEN2 ,6 ,"mft6-gate" ,NPCM7XX_CLK_S_APB4 ,0 }, + {NPCM7XX_CLKEN2 ,5 ,"mft5-gate" ,NPCM7XX_CLK_S_APB4 ,0 }, + {NPCM7XX_CLKEN2 ,4 ,"mft4-gate" ,NPCM7XX_CLK_S_APB4 ,0 }, + {NPCM7XX_CLKEN2 ,3 ,"mft3-gate" ,NPCM7XX_CLK_S_APB4 ,0 }, + {NPCM7XX_CLKEN2 ,2 ,"mft2-gate" ,NPCM7XX_CLK_S_APB4 ,0 }, + {NPCM7XX_CLKEN2 ,1 ,"mft1-gate" ,NPCM7XX_CLK_S_APB4 ,0 }, + {NPCM7XX_CLKEN2 ,0 ,"mft0-gate" ,NPCM7XX_CLK_S_APB4 ,0 }, + + {NPCM7XX_CLKEN3 ,31 ,"gpiom7-gate" ,NPCM7XX_CLK_S_APB1 ,0 }, + {NPCM7XX_CLKEN3 ,30 ,"gpiom6-gate" ,NPCM7XX_CLK_S_APB1 ,0 }, + {NPCM7XX_CLKEN3 ,29 ,"gpiom5-gate" ,NPCM7XX_CLK_S_APB1 ,0 }, + {NPCM7XX_CLKEN3 ,28 ,"gpiom4-gate" ,NPCM7XX_CLK_S_APB1 ,0 }, + {NPCM7XX_CLKEN3 ,27 ,"gpiom3-gate" ,NPCM7XX_CLK_S_APB1 ,0 }, + {NPCM7XX_CLKEN3 ,26 ,"gpiom2-gate" ,NPCM7XX_CLK_S_APB1 ,0 }, + {NPCM7XX_CLKEN3 ,25 ,"gpiom1-gate" ,NPCM7XX_CLK_S_APB1 ,0 }, + {NPCM7XX_CLKEN3 ,24 ,"gpiom0-gate" ,NPCM7XX_CLK_S_APB1 ,0 }, + {NPCM7XX_CLKEN3 ,23 ,"espi-gate" ,NPCM7XX_CLK_S_APB2 ,0 }, + {NPCM7XX_CLKEN3 ,22 ,"smb11-gate" ,NPCM7XX_CLK_S_APB2 ,0 }, + {NPCM7XX_CLKEN3 ,21 ,"smb10-gate" ,NPCM7XX_CLK_S_APB2 ,0 }, + {NPCM7XX_CLKEN3 ,20 ,"smb9-gate" ,NPCM7XX_CLK_S_APB2 ,0 }, + {NPCM7XX_CLKEN3 ,19 ,"smb8-gate" ,NPCM7XX_CLK_S_APB2 ,0 }, + {NPCM7XX_CLKEN3 ,18 ,"smb15-gate" ,NPCM7XX_CLK_S_APB2 ,0 }, + {NPCM7XX_CLKEN3 ,17 ,"rng-gate" ,NPCM7XX_CLK_S_APB1 ,0 }, + {NPCM7XX_CLKEN3 ,16 ,"timer10_14-gate" ,NPCM7XX_CLK_S_APB1 ,0 }, + {NPCM7XX_CLKEN3 ,15 ,"pcirc-gate" ,NPCM7XX_CLK_S_AHB ,0 }, + {NPCM7XX_CLKEN3 ,14 ,"sececc-gate" ,NPCM7XX_CLK_S_AHB ,0 }, + {NPCM7XX_CLKEN3 ,13 ,"sha-gate" ,NPCM7XX_CLK_S_AHB ,0 }, + {NPCM7XX_CLKEN3 ,12 ,"smb14-gate" ,NPCM7XX_CLK_S_APB2 ,0 }, +/* bit 11 is reserved */ +/* bit 10 is reserved */ + {NPCM7XX_CLKEN3 ,9 ,"pcimbx-gate" ,NPCM7XX_CLK_S_AHB ,0 }, +/* bit 8 is reserved */ + {NPCM7XX_CLKEN3 ,7 ,"usbdev9-gate" ,NPCM7XX_CLK_S_AHB ,0 }, + {NPCM7XX_CLKEN3 ,6 ,"usbdev8-gate" ,NPCM7XX_CLK_S_AHB ,0 }, + {NPCM7XX_CLKEN3 ,5 ,"usbdev7-gate" ,NPCM7XX_CLK_S_AHB ,0 }, + {NPCM7XX_CLKEN3 ,4 ,"usbdev0-gate" ,NPCM7XX_CLK_S_AHB ,0 }, + {NPCM7XX_CLKEN3 ,3 ,"smb13-gate" ,NPCM7XX_CLK_S_APB2 ,0 }, + {NPCM7XX_CLKEN3 ,2 ,"spix-gate" ,NPCM7XX_CLK_S_AHB ,0 },
drivers/clk/clk-npcm7xx.c line 492
Quoted 10 lines
drivers/clk/clk-npcm7xx.c new file +10
-0+ {NPCM7XX_CLKEN3, 1, "smb12-gate", NPCM7XX_CLK_S_APB2, 0}, + {NPCM7XX_CLKEN3, 0, "pwmm1-gate", NPCM7XX_CLK_S_APB3, 0}, +}; + + +static struct clk_hw_onecell_data *npcm7xx_clk_data; +static void __iomem *clk_base; +static DEFINE_SPINLOCK (lock); + +
Whitespace.
drivers/clk/clk-npcm7xx.c line 503
Quoted 11 lines
drivers/clk/clk-npcm7xx.c new file +11
-0+static const struct of_device_id npcm7xx_clk_match_table[] = { + { .compatible ="nuvoton,npcm750-clk" }, + {}, +}; + +MODULE_DEVICE_TABLE (of, npcm7xx_clk_match_table); + + +static void __init npcm750clk_init (struct device_node *clk_np) +{ +
Whitespace.
drivers/clk/clk-npcm7xx.c line 511
Quoted 8 lines
drivers/clk/clk-npcm7xx.c new file +8
-0+struct resource res; +struct device *dev; +struct clk_hw *hw; +struct clk *clk; +int ret; +int i; + +printk ("NPCM750: clock init: " );
Remove this.
Quoted 10 lines
drivers/clk/clk-npcm7xx.c new file +10
-0+ + clk_base =NULL ; + + ret =of_address_to_resource (clk_np,0 , &res); +if (ret) { +pr_err ("\t%s: failed to get resource, ret %d\n" , clk_np->name, + ret); +return ; + } +
drivers/clk/clk-npcm7xx.c line 531
Quoted 10 lines
drivers/clk/clk-npcm7xx.c new file +10
-0+ + clk_base =ioremap (res.start,resource_size (&res)); +if (IS_ERR (clk_base)) { +pr_err ("\tnpcm750clk_init: resource error\n" ); + goto npcm7xx_init_error; + } + + + +/* allocate clk hws array*/
The comment is unnecessary.
drivers/clk/clk-npcm7xx.c line 532
Quoted 1 line
drivers/clk/clk-npcm7xx.c new file +1
-0+NPCM7XX_CLK_MSG ("\tclk kmalloc\n" );
Remove this.
Quoted 8 lines
drivers/clk/clk-npcm7xx.c new file +8
-0+ npcm7xx_clk_data =kzalloc (sizeof (*npcm7xx_clk_data->hws) * +NPCM7XX_NUM_CLOCKS +sizeof (npcm7xx_clk_data),GFP_KERNEL ); + + npcm7xx_clk_data->num =0 ; + +if (!npcm7xx_clk_data->hws) { +pr_err ("Can't alloc npcm7xx_clk_data\n" ); + goto npcm7xx_init_np_err;
drivers/clk/clk-npcm7xx.c line 550
Quoted 10 lines
drivers/clk/clk-npcm7xx.c new file +10
-0+ } + + npcm7xx_clk_data->num =NPCM7XX_NUM_CLOCKS ; + + +/* +* This way all clock fetched before the platform device probes, +* except those we assign here for early use, will be deferred. +*/ +NPCM7XX_CLK_MSG ("\tclk init hws\n" );
Remove this.
drivers/clk/clk-npcm7xx.c line 559
Quoted 9 lines
drivers/clk/clk-npcm7xx.c new file +9
-0+for (i =0 ; i <NPCM7XX_NUM_CLOCKS ; i++) + npcm7xx_clk_data->hws[i] =ERR_PTR (-EPROBE_DEFER ); + +/* +* TODO(raltherr): This assumes the clock is a child of a syscon +* device. This allows a separate reset driver to be added indepedent +* of the clock driver. Update device tree to have syscon w/ clock +* controller child. +*/
Is this TODO still relevant?
drivers/clk/clk-npcm7xx.c line 567
Quoted 8 lines
drivers/clk/clk-npcm7xx.c new file +8
-0+ + +/* Define fixed clocks. +* Notice: the following clocks are fixed value on NPCM7XX and should +* not be changed. +* therefor they are not exposed to the dev tree . +*/ +NPCM7XX_CLK_MSG ("\tclk register fixed clocks\n" );
Drop the print.
drivers/clk/clk-npcm7xx.c line 578
Quoted 11 lines
drivers/clk/clk-npcm7xx.c new file +11
-0+ hw =clk_hw_register_fixed_rate (dev,NPCM7XX_CLK_S_REFCLK , +NULL ,0 ,25000000 ); + hw =clk_hw_register_fixed_rate (dev,NPCM7XX_CLK_S_SYSBYPCK , +NULL ,0 ,800000000 );// rarely used. mostly testing. TBD: remove + hw =clk_hw_register_fixed_rate (dev,NPCM7XX_CLK_S_MCBYPCK , +NULL ,0 ,800000000 );// rarely used. mostly testing. TBD:remove + + +/* +* Register plls +*/
One line comments are like this:
/* Register PLLS */
drivers/clk/clk-npcm7xx.c line 588
Quoted 10 lines
drivers/clk/clk-npcm7xx.c new file +10
-0+NPCM7XX_CLK_MSG ("\tclk register pll\n" ); +for (i =0 ; i <ARRAY_SIZE (npcm7xx_plls); i++) { +const struct npcm7xx_clk_pll_data *pll_data = &npcm7xx_plls[i]; + +NPCM7XX_CLK_MSG ("\tclk reg pll%d, reg=0x%x, name=%s, p=%s\n" , i, + (unsigned int )pll_data->reg, pll_data->name, + pll_data->parent_name); + + hw = npcm7xx_clk_register_pll(dev, + (void __iomem *)((u32)clk_base + (u32)pll_data->reg),
Are these casts necessary?
Quoted 38 lines
drivers/clk/clk-npcm7xx.c new file +38
-0+ pll_data->name, pll_data->parent_name, pll_data->flags); +if (IS_ERR (hw)) { +pr_err ("npcm7xx_clk: Can't register pll\n" ); + goto npcm7xx_init_fail; + } + +if (pll_data->onecell_idx >=0 ) + npcm7xx_clk_data->hws[pll_data->onecell_idx] = hw; + } + +/* +* Register fixed dividers +*/ +NPCM7XX_CLK_MSG ("\tclk register fixed divs\n" ); + clk =clk_register_fixed_factor (dev,NPCM7XX_CLK_S_PLL1_DIV2 , +NPCM7XX_CLK_S_PLL1 ,0 ,1 ,2 ); +if (IS_ERR (clk)) { +pr_err ("npcm7xx_clk: Can't register fixed div\n" ); + goto npcm7xx_init_fail; + } + + + clk =clk_register_fixed_factor (dev,NPCM7XX_CLK_S_PLL2_DIV2 , +NPCM7XX_CLK_S_PLL2 ,0 ,1 ,2 ); + +if (IS_ERR (clk)) { +pr_err ("npcm7xx_clk: Can't register div2\n" ); + goto npcm7xx_init_fail; + } + +/* +* Register muxes +*/ +NPCM7XX_CLK_MSG ("\tclk register mux\n" ); + +/* Muxes to select which source to use for various system clocks. */ +for (i =0 ; i <ARRAY_SIZE (npcm7xx_muxes); i++) { +const struct npcm7xx_clk_mux_data *mux_data = &npcm7xx_muxes[i];
drivers/clk/clk-npcm7xx.c line 636
Quoted 10 lines
drivers/clk/clk-npcm7xx.c new file +10
-0+ +NPCM7XX_CLK_MSG ("\tadd mux%d reg=0x%x name=%s p=%s num_p=%d\n" , + i, ((u32 )clk_base + (u32 )NPCM7XX_CLKSEL ), mux_data->name, + mux_data->parent_names[0 ], mux_data->num_parents); + + hw = clk_hw_register_mux_table(dev, + mux_data->name, + mux_data->parent_names, mux_data->num_parents, + mux_data->flags, (void __iomem *)((u32)clk_base + + (u32)NPCM7XX_CLKSEL),
Is the cast necessary?
Quoted 44 lines
drivers/clk/clk-npcm7xx.c new file +44
-0+ mux_data->shift, mux_data->mask,0 , + mux_data->table, &lock); + +if (IS_ERR (hw)) { +pr_err ("npcm7xx_clk: Can't register mux\n" ); + goto npcm7xx_init_fail; + } + +if (mux_data->onecell_idx >=0 ) + npcm7xx_clk_data->hws[mux_data->onecell_idx] = hw; + } + +/* +* Register clock dividers specified in npcm7xx_divs. +*/ +NPCM7XX_CLK_MSG ("\tclk register divs\n" ); +for (i =0 ; i <ARRAY_SIZE (npcm7xx_divs); i++) { +const struct npcm7xx_clk_div_data *div_data = &npcm7xx_divs[i]; + +NPCM7XX_CLK_MSG ("\tadd div%d reg=0x%x name=%s, parent=%s\n" , + i, (unsigned int )div_data->reg, + div_data->name, div_data->parent_name); + + hw =clk_hw_register_divider (dev, div_data->name, + div_data->parent_name, + div_data->flags, + (void __iomem *)((u32 )clk_base + + (u32 )div_data->reg), + div_data->shift, div_data->width, + div_data->clk_divider_flags, &lock); +if (IS_ERR (hw)) { +pr_err ("npcm7xx_clk: Can't register div table\n" ); + goto npcm7xx_init_fail; + } + +if (div_data->onecell_idx >=0 ) + npcm7xx_clk_data->hws[div_data->onecell_idx] = hw; + } + + ret =of_clk_add_hw_provider (clk_np, of_clk_hw_onecell_get, + npcm7xx_clk_data); +if (ret) +pr_err ("failed to add DT provider: %d\n" , ret); +
drivers/clk/clk-npcm7xx.c line 690
Quoted 10 lines
drivers/clk/clk-npcm7xx.c new file +10
-0+pr_info ("%d dividers, %d muxes and %d plls registered.\n" , +ARRAY_SIZE (npcm7xx_divs),ARRAY_SIZE (npcm7xx_muxes), +ARRAY_SIZE (npcm7xx_plls)); + +of_node_put (clk_np); + +return ; + +npcm7xx_init_fail: +// unregister what was already registered.
C style comments, spelling. You can probably drop the comment.
drivers/clk/clk-npcm7xx.c line 699
Quoted 9 lines
drivers/clk/clk-npcm7xx.c new file +9
-0+NPCM7XX_CLK_MSG ("\tclk setup fail\n" ); +if (npcm7xx_clk_data->num) +kfree (npcm7xx_clk_data->hws); +npcm7xx_init_np_err: +if (clk_base !=NULL ) +iounmap (clk_base); +npcm7xx_init_error: +of_node_put (clk_np); +// BUG();
Delete the comment.
Quoted 12 lines
drivers/clk/clk-npcm7xx.c new file +5
-0+} + +CLK_OF_DECLARE (npcm750clk_init,"nuvoton,npcm750-clk" , npcm750clk_init); + +include/linux/clk/nuvoton.h new file +1
-0@@ -0,0 +1,13 @@ +/*
include/linux/clk/nuvoton.h line 11
Quoted 10 lines
include/linux/clk/nuvoton.h new file +10
-0+* Copyright (c) 2014-2018 Nuvoton Technology corporation. +* +* Released under the GPLv2 only. +* SPDX-License-Identifier: GPL-2.0 +*/ + +#ifndef __LINUX_CLK_NUVOTON_H_ +#define __LINUX_CLK_NUVOTON_H_ + +void nuvoton_npcm750_clock_init (void );
Do you need this header?
You could consider merging the two c files into one.
Quoted 5 lines
include/linux/clk/nuvoton.h new file +2
-1+ +#endif --2.14.1