usb.c 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. /*
  2. * QE USB routines
  3. *
  4. * Copyright 2006 Freescale Semiconductor, Inc.
  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/export.h>
  18. #include <linux/io.h>
  19. #include <asm/immap_qe.h>
  20. #include <asm/qe.h>
  21. int qe_usb_clock_set(enum qe_clock clk, int rate)
  22. {
  23. struct qe_mux __iomem *mux = &qe_immr->qmx;
  24. unsigned long flags;
  25. u32 val;
  26. switch (clk) {
  27. case QE_CLK3: val = QE_CMXGCR_USBCS_CLK3; break;
  28. case QE_CLK5: val = QE_CMXGCR_USBCS_CLK5; break;
  29. case QE_CLK7: val = QE_CMXGCR_USBCS_CLK7; break;
  30. case QE_CLK9: val = QE_CMXGCR_USBCS_CLK9; break;
  31. case QE_CLK13: val = QE_CMXGCR_USBCS_CLK13; break;
  32. case QE_CLK17: val = QE_CMXGCR_USBCS_CLK17; break;
  33. case QE_CLK19: val = QE_CMXGCR_USBCS_CLK19; break;
  34. case QE_CLK21: val = QE_CMXGCR_USBCS_CLK21; break;
  35. case QE_BRG9: val = QE_CMXGCR_USBCS_BRG9; break;
  36. case QE_BRG10: val = QE_CMXGCR_USBCS_BRG10; break;
  37. default:
  38. pr_err("%s: requested unknown clock %d\n", __func__, clk);
  39. return -EINVAL;
  40. }
  41. if (qe_clock_is_brg(clk))
  42. qe_setbrg(clk, rate, 1);
  43. spin_lock_irqsave(&cmxgcr_lock, flags);
  44. clrsetbits_be32(&mux->cmxgcr, QE_CMXGCR_USBCS, val);
  45. spin_unlock_irqrestore(&cmxgcr_lock, flags);
  46. return 0;
  47. }
  48. EXPORT_SYMBOL(qe_usb_clock_set);