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