xref: /openbmc/linux/drivers/clk/sunxi-ng/ccu_sdm.h (revision 9c92ab61)
19c92ab61SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
205d2eaacSChen-Yu Tsai /*
305d2eaacSChen-Yu Tsai  * Copyright (c) 2017 Chen-Yu Tsai. All rights reserved.
405d2eaacSChen-Yu Tsai  */
505d2eaacSChen-Yu Tsai 
605d2eaacSChen-Yu Tsai #ifndef _CCU_SDM_H
705d2eaacSChen-Yu Tsai #define _CCU_SDM_H
805d2eaacSChen-Yu Tsai 
905d2eaacSChen-Yu Tsai #include <linux/clk-provider.h>
1005d2eaacSChen-Yu Tsai 
1105d2eaacSChen-Yu Tsai #include "ccu_common.h"
1205d2eaacSChen-Yu Tsai 
1305d2eaacSChen-Yu Tsai struct ccu_sdm_setting {
1405d2eaacSChen-Yu Tsai 	unsigned long	rate;
1505d2eaacSChen-Yu Tsai 
1605d2eaacSChen-Yu Tsai 	/*
1705d2eaacSChen-Yu Tsai 	 * XXX We don't know what the step and bottom register fields
1805d2eaacSChen-Yu Tsai 	 * mean. Just copy the whole register value from the vendor
1905d2eaacSChen-Yu Tsai 	 * kernel for now.
2005d2eaacSChen-Yu Tsai 	 */
2105d2eaacSChen-Yu Tsai 	u32		pattern;
2205d2eaacSChen-Yu Tsai 
2305d2eaacSChen-Yu Tsai 	/*
2405d2eaacSChen-Yu Tsai 	 * M and N factors here should be the values used in
2505d2eaacSChen-Yu Tsai 	 * calculation, not the raw values written to registers
2605d2eaacSChen-Yu Tsai 	 */
2705d2eaacSChen-Yu Tsai 	u32		m;
2805d2eaacSChen-Yu Tsai 	u32		n;
2905d2eaacSChen-Yu Tsai };
3005d2eaacSChen-Yu Tsai 
3105d2eaacSChen-Yu Tsai struct ccu_sdm_internal {
3205d2eaacSChen-Yu Tsai 	struct ccu_sdm_setting	*table;
3305d2eaacSChen-Yu Tsai 	u32		table_size;
3405d2eaacSChen-Yu Tsai 	/* early SoCs don't have the SDM enable bit in the PLL register */
3505d2eaacSChen-Yu Tsai 	u32		enable;
3605d2eaacSChen-Yu Tsai 	/* second enable bit in tuning register */
3705d2eaacSChen-Yu Tsai 	u32		tuning_enable;
3805d2eaacSChen-Yu Tsai 	u16		tuning_reg;
3905d2eaacSChen-Yu Tsai };
4005d2eaacSChen-Yu Tsai 
4105d2eaacSChen-Yu Tsai #define _SUNXI_CCU_SDM(_table, _enable,			\
4205d2eaacSChen-Yu Tsai 		       _reg, _reg_enable)		\
4305d2eaacSChen-Yu Tsai 	{						\
4405d2eaacSChen-Yu Tsai 		.table		= _table,		\
4505d2eaacSChen-Yu Tsai 		.table_size	= ARRAY_SIZE(_table),	\
4605d2eaacSChen-Yu Tsai 		.enable		= _enable,		\
4705d2eaacSChen-Yu Tsai 		.tuning_enable	= _reg_enable,		\
4805d2eaacSChen-Yu Tsai 		.tuning_reg	= _reg,			\
4905d2eaacSChen-Yu Tsai 	}
5005d2eaacSChen-Yu Tsai 
5105d2eaacSChen-Yu Tsai bool ccu_sdm_helper_is_enabled(struct ccu_common *common,
5205d2eaacSChen-Yu Tsai 			       struct ccu_sdm_internal *sdm);
5305d2eaacSChen-Yu Tsai void ccu_sdm_helper_enable(struct ccu_common *common,
5405d2eaacSChen-Yu Tsai 			   struct ccu_sdm_internal *sdm,
5505d2eaacSChen-Yu Tsai 			   unsigned long rate);
5605d2eaacSChen-Yu Tsai void ccu_sdm_helper_disable(struct ccu_common *common,
5705d2eaacSChen-Yu Tsai 			    struct ccu_sdm_internal *sdm);
5805d2eaacSChen-Yu Tsai 
5905d2eaacSChen-Yu Tsai bool ccu_sdm_helper_has_rate(struct ccu_common *common,
6005d2eaacSChen-Yu Tsai 			     struct ccu_sdm_internal *sdm,
6105d2eaacSChen-Yu Tsai 			     unsigned long rate);
6205d2eaacSChen-Yu Tsai 
6305d2eaacSChen-Yu Tsai unsigned long ccu_sdm_helper_read_rate(struct ccu_common *common,
6405d2eaacSChen-Yu Tsai 				       struct ccu_sdm_internal *sdm,
6505d2eaacSChen-Yu Tsai 				       u32 m, u32 n);
6605d2eaacSChen-Yu Tsai 
6705d2eaacSChen-Yu Tsai int ccu_sdm_helper_get_factors(struct ccu_common *common,
6805d2eaacSChen-Yu Tsai 			       struct ccu_sdm_internal *sdm,
6905d2eaacSChen-Yu Tsai 			       unsigned long rate,
7005d2eaacSChen-Yu Tsai 			       unsigned long *m, unsigned long *n);
7105d2eaacSChen-Yu Tsai 
7205d2eaacSChen-Yu Tsai #endif
73