clkgen.h 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. /************************************************************************
  2. File : Clock H/w specific Information
  3. Author: Pankaj Dev <pankaj.dev@st.com>
  4. Copyright (C) 2014 STMicroelectronics
  5. ************************************************************************/
  6. #ifndef __CLKGEN_INFO_H
  7. #define __CLKGEN_INFO_H
  8. struct clkgen_field {
  9. unsigned int offset;
  10. unsigned int mask;
  11. unsigned int shift;
  12. };
  13. static inline unsigned long clkgen_read(void __iomem *base,
  14. struct clkgen_field *field)
  15. {
  16. return (readl(base + field->offset) >> field->shift) & field->mask;
  17. }
  18. static inline void clkgen_write(void __iomem *base, struct clkgen_field *field,
  19. unsigned long val)
  20. {
  21. writel((readl(base + field->offset) &
  22. ~(field->mask << field->shift)) | (val << field->shift),
  23. base + field->offset);
  24. return;
  25. }
  26. #define CLKGEN_FIELD(_offset, _mask, _shift) { \
  27. .offset = _offset, \
  28. .mask = _mask, \
  29. .shift = _shift, \
  30. }
  31. #define CLKGEN_READ(pll, field) clkgen_read(pll->regs_base, \
  32. &pll->data->field)
  33. #define CLKGEN_WRITE(pll, field, val) clkgen_write(pll->regs_base, \
  34. &pll->data->field, val)
  35. #endif /*__CLKGEN_INFO_H*/