xref: /kernel/linux/linux-6.6/drivers/clk/st/clkgen.h (revision 62306a36)
162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci/************************************************************************
362306a36Sopenharmony_ciFile  : Clock H/w specific Information
462306a36Sopenharmony_ci
562306a36Sopenharmony_ciAuthor: Pankaj Dev <pankaj.dev@st.com>
662306a36Sopenharmony_ci
762306a36Sopenharmony_ciCopyright (C) 2014 STMicroelectronics
862306a36Sopenharmony_ci************************************************************************/
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#ifndef __CLKGEN_INFO_H
1162306a36Sopenharmony_ci#define __CLKGEN_INFO_H
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ciextern spinlock_t clkgen_a9_lock;
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_cistruct clkgen_field {
1662306a36Sopenharmony_ci	unsigned int offset;
1762306a36Sopenharmony_ci	unsigned int mask;
1862306a36Sopenharmony_ci	unsigned int shift;
1962306a36Sopenharmony_ci};
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_cistatic inline unsigned long clkgen_read(void __iomem	*base,
2262306a36Sopenharmony_ci					  struct clkgen_field *field)
2362306a36Sopenharmony_ci{
2462306a36Sopenharmony_ci	return (readl(base + field->offset) >> field->shift) & field->mask;
2562306a36Sopenharmony_ci}
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_cistatic inline void clkgen_write(void __iomem *base, struct clkgen_field *field,
2962306a36Sopenharmony_ci				  unsigned long val)
3062306a36Sopenharmony_ci{
3162306a36Sopenharmony_ci	writel((readl(base + field->offset) &
3262306a36Sopenharmony_ci	       ~(field->mask << field->shift)) | (val << field->shift),
3362306a36Sopenharmony_ci	       base + field->offset);
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ci	return;
3662306a36Sopenharmony_ci}
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci#define CLKGEN_FIELD(_offset, _mask, _shift) {		\
3962306a36Sopenharmony_ci				.offset	= _offset,	\
4062306a36Sopenharmony_ci				.mask	= _mask,	\
4162306a36Sopenharmony_ci				.shift	= _shift,	\
4262306a36Sopenharmony_ci				}
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ci#define CLKGEN_READ(pll, field) clkgen_read(pll->regs_base, \
4562306a36Sopenharmony_ci		&pll->data->field)
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ci#define CLKGEN_WRITE(pll, field, val) clkgen_write(pll->regs_base, \
4862306a36Sopenharmony_ci		&pll->data->field, val)
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_ci#endif /*__CLKGEN_INFO_H*/
5162306a36Sopenharmony_ci
52