162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * linux/arch/arm/mach-omap1/clock.h 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 2004 - 2005, 2009 Nokia corporation 662306a36Sopenharmony_ci * Written by Tuukka Tikkanen <tuukka.tikkanen@elektrobit.com> 762306a36Sopenharmony_ci * Based on clocks.h by Tony Lindgren, Gordon McNutt and RidgeRun, Inc 862306a36Sopenharmony_ci */ 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#ifndef __ARCH_ARM_MACH_OMAP1_CLOCK_H 1162306a36Sopenharmony_ci#define __ARCH_ARM_MACH_OMAP1_CLOCK_H 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#include <linux/clk.h> 1462306a36Sopenharmony_ci#include <linux/clkdev.h> 1562306a36Sopenharmony_ci#include <linux/clk-provider.h> 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_cistruct module; 1862306a36Sopenharmony_cistruct omap1_clk; 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_cistruct omap_clk { 2162306a36Sopenharmony_ci u16 cpu; 2262306a36Sopenharmony_ci struct clk_lookup lk; 2362306a36Sopenharmony_ci}; 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ci#define CLK(dev, con, ck, cp) \ 2662306a36Sopenharmony_ci { \ 2762306a36Sopenharmony_ci .cpu = cp, \ 2862306a36Sopenharmony_ci .lk = { \ 2962306a36Sopenharmony_ci .dev_id = dev, \ 3062306a36Sopenharmony_ci .con_id = con, \ 3162306a36Sopenharmony_ci .clk_hw = ck, \ 3262306a36Sopenharmony_ci }, \ 3362306a36Sopenharmony_ci } 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci/* Platform flags for the clkdev-OMAP integration code */ 3662306a36Sopenharmony_ci#define CK_310 (1 << 0) 3762306a36Sopenharmony_ci#define CK_7XX (1 << 1) /* 7xx, 850 */ 3862306a36Sopenharmony_ci#define CK_1510 (1 << 2) 3962306a36Sopenharmony_ci#define CK_16XX (1 << 3) /* 16xx, 17xx, 5912 */ 4062306a36Sopenharmony_ci#define CK_1710 (1 << 4) /* 1710 extra for rate selection */ 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_ci/** 4362306a36Sopenharmony_ci * struct clkops - some clock function pointers 4462306a36Sopenharmony_ci * @enable: fn ptr that enables the current clock in hardware 4562306a36Sopenharmony_ci * @disable: fn ptr that enables the current clock in hardware 4662306a36Sopenharmony_ci * @allow_idle: fn ptr that enables autoidle for the current clock in hardware 4762306a36Sopenharmony_ci */ 4862306a36Sopenharmony_cistruct clkops { 4962306a36Sopenharmony_ci int (*enable)(struct omap1_clk *clk); 5062306a36Sopenharmony_ci void (*disable)(struct omap1_clk *clk); 5162306a36Sopenharmony_ci}; 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_ci/* 5462306a36Sopenharmony_ci * struct clk.flags possibilities 5562306a36Sopenharmony_ci * 5662306a36Sopenharmony_ci * XXX document the rest of the clock flags here 5762306a36Sopenharmony_ci */ 5862306a36Sopenharmony_ci#define ENABLE_REG_32BIT (1 << 0) /* Use 32-bit access */ 5962306a36Sopenharmony_ci#define CLOCK_IDLE_CONTROL (1 << 1) 6062306a36Sopenharmony_ci#define CLOCK_NO_IDLE_PARENT (1 << 2) 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_ci/** 6362306a36Sopenharmony_ci * struct omap1_clk - OMAP1 struct clk 6462306a36Sopenharmony_ci * @hw: struct clk_hw for common clock framework integration 6562306a36Sopenharmony_ci * @ops: struct clkops * for this clock 6662306a36Sopenharmony_ci * @rate: current clock rate 6762306a36Sopenharmony_ci * @enable_reg: register to write to enable the clock (see @enable_bit) 6862306a36Sopenharmony_ci * @recalc: fn ptr that returns the clock's current rate 6962306a36Sopenharmony_ci * @set_rate: fn ptr that can change the clock's current rate 7062306a36Sopenharmony_ci * @round_rate: fn ptr that can round the clock's current rate 7162306a36Sopenharmony_ci * @init: fn ptr to do clock-specific initialization 7262306a36Sopenharmony_ci * @enable_bit: bitshift to write to enable/disable the clock (see @enable_reg) 7362306a36Sopenharmony_ci * @fixed_div: when > 0, this clock's rate is its parent's rate / @fixed_div 7462306a36Sopenharmony_ci * @flags: see "struct clk.flags possibilities" above 7562306a36Sopenharmony_ci * @rate_offset: bitshift for rate selection bitfield (OMAP1 only) 7662306a36Sopenharmony_ci */ 7762306a36Sopenharmony_cistruct omap1_clk { 7862306a36Sopenharmony_ci struct clk_hw hw; 7962306a36Sopenharmony_ci const struct clkops *ops; 8062306a36Sopenharmony_ci unsigned long rate; 8162306a36Sopenharmony_ci void __iomem *enable_reg; 8262306a36Sopenharmony_ci unsigned long (*recalc)(struct omap1_clk *clk, unsigned long rate); 8362306a36Sopenharmony_ci int (*set_rate)(struct omap1_clk *clk, unsigned long rate, 8462306a36Sopenharmony_ci unsigned long p_rate); 8562306a36Sopenharmony_ci long (*round_rate)(struct omap1_clk *clk, unsigned long rate, 8662306a36Sopenharmony_ci unsigned long *p_rate); 8762306a36Sopenharmony_ci int (*init)(struct omap1_clk *clk); 8862306a36Sopenharmony_ci u8 enable_bit; 8962306a36Sopenharmony_ci u8 fixed_div; 9062306a36Sopenharmony_ci u8 flags; 9162306a36Sopenharmony_ci u8 rate_offset; 9262306a36Sopenharmony_ci}; 9362306a36Sopenharmony_ci#define to_omap1_clk(_hw) container_of(_hw, struct omap1_clk, hw) 9462306a36Sopenharmony_ci 9562306a36Sopenharmony_civoid propagate_rate(struct omap1_clk *clk); 9662306a36Sopenharmony_ciunsigned long followparent_recalc(struct omap1_clk *clk, unsigned long p_rate); 9762306a36Sopenharmony_ciunsigned long omap_fixed_divisor_recalc(struct omap1_clk *clk, unsigned long p_rate); 9862306a36Sopenharmony_ci 9962306a36Sopenharmony_ciextern struct omap1_clk dummy_ck; 10062306a36Sopenharmony_ci 10162306a36Sopenharmony_ciint omap1_clk_init(void); 10262306a36Sopenharmony_civoid omap1_clk_late_init(void); 10362306a36Sopenharmony_ciunsigned long omap1_ckctl_recalc(struct omap1_clk *clk, unsigned long p_rate); 10462306a36Sopenharmony_cilong omap1_round_sossi_rate(struct omap1_clk *clk, unsigned long rate, unsigned long *p_rate); 10562306a36Sopenharmony_ciint omap1_set_sossi_rate(struct omap1_clk *clk, unsigned long rate, unsigned long p_rate); 10662306a36Sopenharmony_ciunsigned long omap1_sossi_recalc(struct omap1_clk *clk, unsigned long p_rate); 10762306a36Sopenharmony_ciunsigned long omap1_ckctl_recalc_dsp_domain(struct omap1_clk *clk, unsigned long p_rate); 10862306a36Sopenharmony_ciint omap1_clk_set_rate_dsp_domain(struct omap1_clk *clk, unsigned long rate, 10962306a36Sopenharmony_ci unsigned long p_rate); 11062306a36Sopenharmony_cilong omap1_round_uart_rate(struct omap1_clk *clk, unsigned long rate, unsigned long *p_rate); 11162306a36Sopenharmony_ciint omap1_set_uart_rate(struct omap1_clk *clk, unsigned long rate, unsigned long p_rate); 11262306a36Sopenharmony_ciunsigned long omap1_uart_recalc(struct omap1_clk *clk, unsigned long p_rate); 11362306a36Sopenharmony_ciint omap1_set_ext_clk_rate(struct omap1_clk *clk, unsigned long rate, unsigned long p_rate); 11462306a36Sopenharmony_cilong omap1_round_ext_clk_rate(struct omap1_clk *clk, unsigned long rate, unsigned long *p_rate); 11562306a36Sopenharmony_ciint omap1_init_ext_clk(struct omap1_clk *clk); 11662306a36Sopenharmony_ciint omap1_select_table_rate(struct omap1_clk *clk, unsigned long rate, unsigned long p_rate); 11762306a36Sopenharmony_cilong omap1_round_to_table_rate(struct omap1_clk *clk, unsigned long rate, unsigned long *p_rate); 11862306a36Sopenharmony_ciint omap1_clk_set_rate_ckctl_arm(struct omap1_clk *clk, unsigned long rate, unsigned long p_rate); 11962306a36Sopenharmony_cilong omap1_clk_round_rate_ckctl_arm(struct omap1_clk *clk, unsigned long rate, 12062306a36Sopenharmony_ci unsigned long *p_rate); 12162306a36Sopenharmony_ci 12262306a36Sopenharmony_cistruct uart_clk { 12362306a36Sopenharmony_ci struct omap1_clk clk; 12462306a36Sopenharmony_ci unsigned long sysc_addr; 12562306a36Sopenharmony_ci}; 12662306a36Sopenharmony_ci 12762306a36Sopenharmony_ci/* Provide a method for preventing idling some ARM IDLECT clocks */ 12862306a36Sopenharmony_cistruct arm_idlect1_clk { 12962306a36Sopenharmony_ci struct omap1_clk clk; 13062306a36Sopenharmony_ci unsigned long no_idle_count; 13162306a36Sopenharmony_ci __u8 idlect_shift; 13262306a36Sopenharmony_ci}; 13362306a36Sopenharmony_ci 13462306a36Sopenharmony_ci/* ARM_CKCTL bit shifts */ 13562306a36Sopenharmony_ci#define CKCTL_PERDIV_OFFSET 0 13662306a36Sopenharmony_ci#define CKCTL_LCDDIV_OFFSET 2 13762306a36Sopenharmony_ci#define CKCTL_ARMDIV_OFFSET 4 13862306a36Sopenharmony_ci#define CKCTL_DSPDIV_OFFSET 6 13962306a36Sopenharmony_ci#define CKCTL_TCDIV_OFFSET 8 14062306a36Sopenharmony_ci#define CKCTL_DSPMMUDIV_OFFSET 10 14162306a36Sopenharmony_ci/*#define ARM_TIMXO 12*/ 14262306a36Sopenharmony_ci#define EN_DSPCK 13 14362306a36Sopenharmony_ci/*#define ARM_INTHCK_SEL 14*/ /* Divide-by-2 for mpu inth_ck */ 14462306a36Sopenharmony_ci/* DSP_CKCTL bit shifts */ 14562306a36Sopenharmony_ci#define CKCTL_DSPPERDIV_OFFSET 0 14662306a36Sopenharmony_ci 14762306a36Sopenharmony_ci/* ARM_IDLECT2 bit shifts */ 14862306a36Sopenharmony_ci#define EN_WDTCK 0 14962306a36Sopenharmony_ci#define EN_XORPCK 1 15062306a36Sopenharmony_ci#define EN_PERCK 2 15162306a36Sopenharmony_ci#define EN_LCDCK 3 15262306a36Sopenharmony_ci#define EN_LBCK 4 /* Not on 1610/1710 */ 15362306a36Sopenharmony_ci/*#define EN_HSABCK 5*/ 15462306a36Sopenharmony_ci#define EN_APICK 6 15562306a36Sopenharmony_ci#define EN_TIMCK 7 15662306a36Sopenharmony_ci#define DMACK_REQ 8 15762306a36Sopenharmony_ci#define EN_GPIOCK 9 /* Not on 1610/1710 */ 15862306a36Sopenharmony_ci/*#define EN_LBFREECK 10*/ 15962306a36Sopenharmony_ci#define EN_CKOUT_ARM 11 16062306a36Sopenharmony_ci 16162306a36Sopenharmony_ci/* ARM_IDLECT3 bit shifts */ 16262306a36Sopenharmony_ci#define EN_OCPI_CK 0 16362306a36Sopenharmony_ci#define EN_TC1_CK 2 16462306a36Sopenharmony_ci#define EN_TC2_CK 4 16562306a36Sopenharmony_ci 16662306a36Sopenharmony_ci/* DSP_IDLECT2 bit shifts (0,1,2 are same as for ARM_IDLECT2) */ 16762306a36Sopenharmony_ci#define EN_DSPTIMCK 5 16862306a36Sopenharmony_ci 16962306a36Sopenharmony_ci/* Various register defines for clock controls scattered around OMAP chip */ 17062306a36Sopenharmony_ci#define SDW_MCLK_INV_BIT 2 /* In ULPD_CLKC_CTRL */ 17162306a36Sopenharmony_ci#define USB_MCLK_EN_BIT 4 /* In ULPD_CLKC_CTRL */ 17262306a36Sopenharmony_ci#define USB_HOST_HHC_UHOST_EN 9 /* In MOD_CONF_CTRL_0 */ 17362306a36Sopenharmony_ci#define SWD_ULPD_PLL_CLK_REQ 1 /* In SWD_CLK_DIV_CTRL_SEL */ 17462306a36Sopenharmony_ci#define COM_ULPD_PLL_CLK_REQ 1 /* In COM_CLK_DIV_CTRL_SEL */ 17562306a36Sopenharmony_ci#define SWD_CLK_DIV_CTRL_SEL 0xfffe0874 17662306a36Sopenharmony_ci#define COM_CLK_DIV_CTRL_SEL 0xfffe0878 17762306a36Sopenharmony_ci#define SOFT_REQ_REG 0xfffe0834 17862306a36Sopenharmony_ci#define SOFT_REQ_REG2 0xfffe0880 17962306a36Sopenharmony_ci 18062306a36Sopenharmony_ciextern __u32 arm_idlect1_mask; 18162306a36Sopenharmony_ciextern struct omap1_clk *api_ck_p, *ck_dpll1_p, *ck_ref_p; 18262306a36Sopenharmony_ci 18362306a36Sopenharmony_ciextern const struct clkops clkops_dspck; 18462306a36Sopenharmony_ciextern const struct clkops clkops_uart_16xx; 18562306a36Sopenharmony_ciextern const struct clkops clkops_generic; 18662306a36Sopenharmony_ci 18762306a36Sopenharmony_ci/* used for passing SoC type to omap1_{select,round_to}_table_rate() */ 18862306a36Sopenharmony_ciextern u32 cpu_mask; 18962306a36Sopenharmony_ci 19062306a36Sopenharmony_ciextern const struct clk_ops omap1_clk_null_ops; 19162306a36Sopenharmony_ciextern const struct clk_ops omap1_clk_gate_ops; 19262306a36Sopenharmony_ciextern const struct clk_ops omap1_clk_rate_ops; 19362306a36Sopenharmony_ciextern const struct clk_ops omap1_clk_full_ops; 19462306a36Sopenharmony_ci 19562306a36Sopenharmony_ci#endif 196