usb.c 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. /*
  2. * QE USB routines
  3. *
  4. * Copyright (c) Freescale Semicondutor, Inc. 2006.
  5. * Shlomi Gridish <gridish@freescale.com>
  6. * Jerry Huang <Chang-Ming.Huang@freescale.com>
  7. * Copyright (c) MontaVista Software, Inc. 2008.
  8. * Anton Vorontsov <avorontsov@ru.mvista.com>
  9. *
  10. * This program is free software; you can redistribute it and/or modify it
  11. * under the terms of the GNU General Public License as published by the
  12. * Free Software Foundation; either version 2 of the License, or (at your
  13. * option) any later version.
  14. */
  15. #include <linux/kernel.h>
  16. #include <linux/errno.h>
  17. #include <linux/io.h>
  18. #include <asm/immap_qe.h>
  19. #include <asm/qe.h>
  20. int qe_usb_clock_set(enum qe_clock clk, int rate)
  21. {
  22. struct qe_mux __iomem *mux = &qe_immr->qmx;
  23. unsigned long flags;
  24. u32 val;
  25. switch (clk) {
  26. case QE_CLK3: val = QE_CMXGCR_USBCS_CLK3; break;
  27. case QE_CLK5: val = QE_CMXGCR_USBCS_CLK5; break;
  28. case QE_CLK7: val = QE_CMXGCR_USBCS_CLK7; break;
  29. case QE_CLK9: val = QE_CMXGCR_USBCS_CLK9; break;
  30. case QE_CLK13: val = QE_CMXGCR_USBCS_CLK13; break;
  31. case QE_CLK17: val = QE_CMXGCR_USBCS_CLK17; break;
  32. case QE_CLK19: val = QE_CMXGCR_USBCS_CLK19; break;
  33. case QE_CLK21: val = QE_CMXGCR_USBCS_CLK21; break;
  34. case QE_BRG9: val = QE_CMXGCR_USBCS_BRG9; break;
  35. case QE_BRG10: val = QE_CMXGCR_USBCS_BRG10; break;
  36. default:
  37. pr_err("%s: requested unknown clock %d\n", __func__, clk);
  38. return -EINVAL;
  39. }
  40. if (qe_clock_is_brg(clk))
  41. qe_setbrg(clk, rate, 1);
  42. spin_lock_irqsave(&cmxgcr_lock, flags);
  43. clrsetbits_be32(&mux->cmxgcr, QE_CMXGCR_USBCS, val);
  44. spin_unlock_irqrestore(&cmxgcr_lock, flags);
  45. return 0;
  46. }
  47. EXPORT_SYMBOL(qe_usb_clock_set);