feat(nxp-clk): add partitions objects

The S32CC-based SoCs are organized in partitions. These are
software-resettable domains in which configuration participates in
MC_CGM, MC_ME, and RDC modules. A partition is an island that may
contain multiple blocks, each of which corresponds to a peripheral or a
core and can, in most cases, be reset individually. This reset structure
results in better device availability. If a fault is detected in a
software reset domain, that domain can be reset separately without
impacting the operation of the rest of the chip.

Change-Id: Ie60dbe151309209e377aa71356dbbd6a4f376a8c
Signed-off-by: Ghennadi Procopciuc <ghennadi.procopciuc@nxp.com>
This commit is contained in:
Ghennadi Procopciuc 2024-09-11 15:09:43 +03:00
parent ba790730ea
commit af3020e2ae

View file

@ -22,6 +22,9 @@ enum s32cc_clkm_type {
s32cc_clkmux_t,
s32cc_shared_clkmux_t,
s32cc_fixed_div_t,
s32cc_part_t,
s32cc_part_block_t,
s32cc_part_block_link_t,
};
enum s32cc_clk_source {
@ -208,6 +211,76 @@ struct s32cc_clk_array {
#define S32CC_CHILD_CLK(PARENT, MIN_F, MAX_F) \
S32CC_FREQ_CLK(NULL, &(PARENT), MIN_F, MAX_F)
struct s32cc_part {
struct s32cc_clk_obj desc;
uint32_t partition_id;
};
#define S32CC_PART(PART_NUM) \
{ \
.desc = { \
.type = s32cc_part_t, \
}, \
.partition_id = (PART_NUM), \
}
enum s32cc_part_block_type {
s32cc_part_block0,
s32cc_part_block1,
s32cc_part_block2,
s32cc_part_block3,
s32cc_part_block4,
s32cc_part_block5,
s32cc_part_block6,
s32cc_part_block7,
s32cc_part_block8,
s32cc_part_block9,
s32cc_part_block10,
s32cc_part_block11,
s32cc_part_block12,
s32cc_part_block13,
s32cc_part_block14,
s32cc_part_block15,
};
struct s32cc_part_block {
struct s32cc_clk_obj desc;
struct s32cc_part *part;
enum s32cc_part_block_type block;
bool status;
};
#define S32CC_PART_BLOCK_STATUS(PART_META, BLOCK_TYPE, STATUS) \
{ \
.desc = { \
.type = s32cc_part_block_t, \
}, \
.part = (PART_META), \
.block = (BLOCK_TYPE), \
.status = (STATUS), \
}
#define S32CC_PART_BLOCK(PARENT, BLOCK_TYPE) \
S32CC_PART_BLOCK_STATUS(PARENT, BLOCK_TYPE, true)
#define S32CC_PART_BLOCK_NO_STATUS(PARENT, BLOCK_TYPE) \
S32CC_PART_BLOCK_STATUS(PARENT, BLOCK_TYPE, false)
struct s32cc_part_block_link {
struct s32cc_clk_obj desc;
struct s32cc_clk_obj *parent;
struct s32cc_part_block *block;
};
#define S32CC_PART_BLOCK_LINK(PARENT, BLOCK) \
{ \
.desc = { \
.type = s32cc_part_block_link_t, \
}, \
.parent = &(PARENT).desc, \
.block = (BLOCK), \
}
static inline struct s32cc_osc *s32cc_obj2osc(const struct s32cc_clk_obj *mod)
{
uintptr_t osc_addr;
@ -294,4 +367,30 @@ static inline struct s32cc_dfs_div *s32cc_obj2dfsdiv(const struct s32cc_clk_obj
return (struct s32cc_dfs_div *)dfs_div_addr;
}
static inline struct s32cc_part *s32cc_obj2part(const struct s32cc_clk_obj *mod)
{
uintptr_t part_addr;
part_addr = ((uintptr_t)mod) - offsetof(struct s32cc_part, desc);
return (struct s32cc_part *)part_addr;
}
static inline struct s32cc_part_block *
s32cc_obj2partblock(const struct s32cc_clk_obj *mod)
{
uintptr_t part_blk_addr;
part_blk_addr = ((uintptr_t)mod) - offsetof(struct s32cc_part_block, desc);
return (struct s32cc_part_block *)part_blk_addr;
}
static inline struct s32cc_part_block_link *
s32cc_obj2partblocklink(const struct s32cc_clk_obj *mod)
{
uintptr_t blk_link;
blk_link = ((uintptr_t)mod) - offsetof(struct s32cc_part_block_link, desc);
return (struct s32cc_part_block_link *)blk_link;
}
#endif /* S32CC_CLK_MODULES_H */