omap-ulpi-viewport.c 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. /*
  2. * OMAP ulpi viewport support
  3. * Based on drivers/usb/ulpi/ulpi-viewport.c
  4. *
  5. * Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com
  6. * Author: Govindraj R <govindraj.raja@ti.com>
  7. *
  8. * SPDX-License-Identifier: GPL-2.0
  9. */
  10. #include <common.h>
  11. #include <asm/io.h>
  12. #include <usb/ulpi.h>
  13. #define OMAP_ULPI_WR_OPSEL (2 << 22)
  14. #define OMAP_ULPI_RD_OPSEL (3 << 22)
  15. #define OMAP_ULPI_START (1 << 31)
  16. /*
  17. * Wait for having ulpi in done state
  18. */
  19. static int ulpi_wait(struct ulpi_viewport *ulpi_vp, u32 mask)
  20. {
  21. int timeout = CONFIG_USB_ULPI_TIMEOUT;
  22. while (--timeout) {
  23. if (!(readl(ulpi_vp->viewport_addr) & mask))
  24. return 0;
  25. udelay(1);
  26. }
  27. return ULPI_ERROR;
  28. }
  29. /*
  30. * Issue a ULPI read/write request
  31. */
  32. static int ulpi_request(struct ulpi_viewport *ulpi_vp, u32 value)
  33. {
  34. int err;
  35. writel(value, ulpi_vp->viewport_addr);
  36. err = ulpi_wait(ulpi_vp, OMAP_ULPI_START);
  37. if (err)
  38. debug("ULPI request timed out\n");
  39. return err;
  40. }
  41. int ulpi_write(struct ulpi_viewport *ulpi_vp, u8 *reg, u32 value)
  42. {
  43. u32 val = OMAP_ULPI_START | (((ulpi_vp->port_num + 1) & 0xf) << 24) |
  44. OMAP_ULPI_WR_OPSEL | ((u32)reg << 16) | (value & 0xff);
  45. return ulpi_request(ulpi_vp, val);
  46. }
  47. u32 ulpi_read(struct ulpi_viewport *ulpi_vp, u8 *reg)
  48. {
  49. int err;
  50. u32 val = OMAP_ULPI_START | (((ulpi_vp->port_num + 1) & 0xf) << 24) |
  51. OMAP_ULPI_RD_OPSEL | ((u32)reg << 16);
  52. err = ulpi_request(ulpi_vp, val);
  53. if (err)
  54. return err;
  55. return readl(ulpi_vp->viewport_addr) & 0xff;
  56. }