/* SPDX-License-Identifier: GPL-2.0+ */ #ifndef _CLK_NPCM_H_ #define _CLK_NPCM_H_ #include /* Register offsets */ #define CLKSEL 0x04 /* clock source selection */ #define CLKDIV1 0x08 /* clock divider 1 */ #define CLKDIV2 0x2C /* clock divider 2 */ #define CLKDIV3 0x58 /* clock divider 3 */ #define PLLCON0 0x0C /* pll0 control */ #define PLLCON1 0x10 /* pll1 control */ #define PLLCON2 0x54 /* pll2 control */ /* CLKSEL bit filed */ #define NPCM7XX_CPUCKSEL GENMASK(1, 0) #define NPCM8XX_CPUCKSEL GENMASK(2, 0) #define SDCKSEL GENMASK(7, 6) #define UARTCKSEL GENMASK(9, 8) #define TIMCKSEL GENMASK(15, 14) /* CLKDIV1 bit filed */ #define SPI3CKDIV GENMASK(10, 6) #define MMCCKDIV GENMASK(15, 11) #define UARTDIV1 GENMASK(20, 16) #define TIMCKDIV GENMASK(25, 21) #define CLK4DIV GENMASK(27, 26) /* CLKDIV2 bit filed */ #define APB5CKDIV GENMASK(23, 22) #define APB2CKDIV GENMASK(27, 26) /* CLKDIV3 bit filed */ #define SPIXCKDIV GENMASK(5, 1) #define SPI0CKDIV GENMASK(10, 6) #define UARTDIV2 GENMASK(15, 11) #define SPI1CKDIV GENMASK(23, 16) /* PLLCON bit filed */ #define PLLCON_INDV GENMASK(5, 0) #define PLLCON_OTDV1 GENMASK(10, 8) #define PLLCON_OTDV2 GENMASK(15, 13) #define PLLCON_FBDV GENMASK(27, 16) /* Flags */ #define DIV_TYPE1 BIT(0) /* div = clkdiv + 1 */ #define DIV_TYPE2 BIT(1) /* div = 1 << clkdiv */ #define PRE_DIV2 BIT(2) /* Pre divisor = 2 */ #define POST_DIV2 BIT(3) /* Post divisor = 2 */ #define FIXED_PARENT BIT(4) /* clock source is fixed */ /* Parameters of PLL configuration */ struct npcm_clk_pll { const int id; const int parent_id; u32 reg; u32 flags; }; /* Parent clock id to clksel mapping */ struct parent_data { int id; int clksel; }; /* Parameters of parent selection */ struct npcm_clk_select { const int id; const struct parent_data *parents; u32 reg; u32 mask; u8 num_parents; u32 flags; }; /* Parameters of clock divider */ struct npcm_clk_div { const int id; u32 reg; u32 mask; u32 flags; }; struct npcm_clk_data { struct npcm_clk_pll *clk_plls; int num_plls; struct npcm_clk_select *clk_selectors; int num_selectors; struct npcm_clk_div *clk_dividers; int num_dividers; int refclk_id; int pll0_id; }; struct npcm_clk_priv { void __iomem *base; struct npcm_clk_data *clk_data; int num_clks; }; extern const struct clk_ops npcm_clk_ops; #endif