io.c 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * This file is part of wl18xx
  4. *
  5. * Copyright (C) 2011 Texas Instruments
  6. */
  7. #include "../wlcore/wlcore.h"
  8. #include "../wlcore/io.h"
  9. #include "io.h"
  10. int wl18xx_top_reg_write(struct wl1271 *wl, int addr, u16 val)
  11. {
  12. u32 tmp;
  13. int ret;
  14. if (WARN_ON(addr % 2))
  15. return -EINVAL;
  16. if ((addr % 4) == 0) {
  17. ret = wlcore_read32(wl, addr, &tmp);
  18. if (ret < 0)
  19. goto out;
  20. tmp = (tmp & 0xffff0000) | val;
  21. ret = wlcore_write32(wl, addr, tmp);
  22. } else {
  23. ret = wlcore_read32(wl, addr - 2, &tmp);
  24. if (ret < 0)
  25. goto out;
  26. tmp = (tmp & 0xffff) | (val << 16);
  27. ret = wlcore_write32(wl, addr - 2, tmp);
  28. }
  29. out:
  30. return ret;
  31. }
  32. int wl18xx_top_reg_read(struct wl1271 *wl, int addr, u16 *out)
  33. {
  34. u32 val = 0;
  35. int ret;
  36. if (WARN_ON(addr % 2))
  37. return -EINVAL;
  38. if ((addr % 4) == 0) {
  39. /* address is 4-bytes aligned */
  40. ret = wlcore_read32(wl, addr, &val);
  41. if (ret >= 0 && out)
  42. *out = val & 0xffff;
  43. } else {
  44. ret = wlcore_read32(wl, addr - 2, &val);
  45. if (ret >= 0 && out)
  46. *out = (val & 0xffff0000) >> 16;
  47. }
  48. return ret;
  49. }