parm.h 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. /*
  3. * Copyright (c) 2015 Endless Mobile, Inc.
  4. * Author: Carlo Caione <[email protected]>
  5. */
  6. #ifndef __MESON_PARM_H
  7. #define __MESON_PARM_H
  8. #include <linux/bits.h>
  9. #include <linux/regmap.h>
  10. #define PMASK(width) GENMASK(width - 1, 0)
  11. #define SETPMASK(width, shift) GENMASK(shift + width - 1, shift)
  12. #define CLRPMASK(width, shift) (~SETPMASK(width, shift))
  13. #define PARM_GET(width, shift, reg) \
  14. (((reg) & SETPMASK(width, shift)) >> (shift))
  15. #define PARM_SET(width, shift, reg, val) \
  16. (((reg) & CLRPMASK(width, shift)) | ((val) << (shift)))
  17. #define MESON_PARM_APPLICABLE(p) (!!((p)->width))
  18. struct parm {
  19. u16 reg_off;
  20. u8 shift;
  21. u8 width;
  22. };
  23. static inline unsigned int meson_parm_read(struct regmap *map, struct parm *p)
  24. {
  25. unsigned int val;
  26. regmap_read(map, p->reg_off, &val);
  27. return PARM_GET(p->width, p->shift, val);
  28. }
  29. static inline void meson_parm_write(struct regmap *map, struct parm *p,
  30. unsigned int val)
  31. {
  32. regmap_update_bits(map, p->reg_off, SETPMASK(p->width, p->shift),
  33. val << p->shift);
  34. }
  35. #endif /* __MESON_PARM_H */