mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00

The clock tree of K1 SoC contains three main types of clock hardware (PLL/DDN/MIX) and has control registers split into several multifunction devices: APBS (PLLs), MPMU, APBC and APMU. All register operations are done through regmap to ensure atomicity between concurrent operations of clock driver and reset, power-domain driver that will be introduced in the future. Signed-off-by: Haylen Chu <heylenay@4d2.org> Reviewed-by: Alex Elder <elder@riscstar.com> Reviewed-by: Inochi Amaoto <inochiama@outlook.com> Reviewed-by: Yixun Lan <dlan@gentoo.org> Link: https://lore.kernel.org/r/20250416135406.16284-4-heylenay@4d2.org Signed-off-by: Yixun Lan <dlan@gentoo.org>
48 lines
1.2 KiB
C
48 lines
1.2 KiB
C
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
/*
|
|
* Copyright (c) 2024 SpacemiT Technology Co. Ltd
|
|
* Copyright (c) 2024-2025 Haylen Chu <heylenay@4d2.org>
|
|
*/
|
|
|
|
#ifndef _CCU_DDN_H_
|
|
#define _CCU_DDN_H_
|
|
|
|
#include <linux/bitops.h>
|
|
#include <linux/clk-provider.h>
|
|
|
|
#include "ccu_common.h"
|
|
|
|
struct ccu_ddn {
|
|
struct ccu_common common;
|
|
unsigned int num_mask;
|
|
unsigned int num_shift;
|
|
unsigned int den_mask;
|
|
unsigned int den_shift;
|
|
};
|
|
|
|
#define CCU_DDN_INIT(_name, _parent, _flags) \
|
|
CLK_HW_INIT_HW(#_name, &_parent.common.hw, &spacemit_ccu_ddn_ops, _flags)
|
|
|
|
#define CCU_DDN_DEFINE(_name, _parent, _reg_ctrl, _num_shift, _num_width, \
|
|
_den_shift, _den_width, _flags) \
|
|
static struct ccu_ddn _name = { \
|
|
.common = { \
|
|
.reg_ctrl = _reg_ctrl, \
|
|
.hw.init = CCU_DDN_INIT(_name, _parent, _flags), \
|
|
}, \
|
|
.num_mask = GENMASK(_num_shift + _num_width - 1, _num_shift), \
|
|
.num_shift = _num_shift, \
|
|
.den_mask = GENMASK(_den_shift + _den_width - 1, _den_shift), \
|
|
.den_shift = _den_shift, \
|
|
}
|
|
|
|
static inline struct ccu_ddn *hw_to_ccu_ddn(struct clk_hw *hw)
|
|
{
|
|
struct ccu_common *common = hw_to_ccu_common(hw);
|
|
|
|
return container_of(common, struct ccu_ddn, common);
|
|
}
|
|
|
|
extern const struct clk_ops spacemit_ccu_ddn_ops;
|
|
|
|
#endif
|