clk-lpt.c 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. /*
  2. * Intel Lynxpoint LPSS clocks.
  3. *
  4. * Copyright (C) 2013, Intel Corporation
  5. * Authors: Mika Westerberg <mika.westerberg@linux.intel.com>
  6. * Heikki Krogerus <heikki.krogerus@linux.intel.com>
  7. *
  8. * This program is free software; you can redistribute it and/or modify
  9. * it under the terms of the GNU General Public License version 2 as
  10. * published by the Free Software Foundation.
  11. */
  12. #include <linux/acpi.h>
  13. #include <linux/clk.h>
  14. #include <linux/clkdev.h>
  15. #include <linux/clk-provider.h>
  16. #include <linux/err.h>
  17. #include <linux/module.h>
  18. #include <linux/platform_device.h>
  19. #include "clk-lpss.h"
  20. #define PRV_CLOCK_PARAMS 0x800
  21. static int lpt_clk_probe(struct platform_device *pdev)
  22. {
  23. struct clk *clk;
  24. /* LPSS free running clock */
  25. clk = clk_register_fixed_rate(&pdev->dev, "lpss_clk", NULL, CLK_IS_ROOT,
  26. 100000000);
  27. if (IS_ERR(clk))
  28. return PTR_ERR(clk);
  29. /* Shared DMA clock */
  30. clk_register_clkdev(clk, "hclk", "INTL9C60.0.auto");
  31. /* SPI clocks */
  32. clk = clk_register_lpss_gate("spi0_clk", "lpss_clk", "INT33C0", NULL,
  33. PRV_CLOCK_PARAMS);
  34. if (!IS_ERR(clk))
  35. clk_register_clkdev(clk, NULL, "INT33C0:00");
  36. clk = clk_register_lpss_gate("spi1_clk", "lpss_clk", "INT33C1", NULL,
  37. PRV_CLOCK_PARAMS);
  38. if (!IS_ERR(clk))
  39. clk_register_clkdev(clk, NULL, "INT33C1:00");
  40. /* I2C clocks */
  41. clk = clk_register_lpss_gate("i2c0_clk", "lpss_clk", "INT33C2", NULL,
  42. PRV_CLOCK_PARAMS);
  43. if (!IS_ERR(clk))
  44. clk_register_clkdev(clk, NULL, "INT33C2:00");
  45. clk = clk_register_lpss_gate("i2c1_clk", "lpss_clk", "INT33C3", NULL,
  46. PRV_CLOCK_PARAMS);
  47. if (!IS_ERR(clk))
  48. clk_register_clkdev(clk, NULL, "INT33C3:00");
  49. /* UART clocks */
  50. clk = clk_register_lpss_gate("uart0_clk", "lpss_clk", "INT33C4", NULL,
  51. PRV_CLOCK_PARAMS);
  52. if (!IS_ERR(clk))
  53. clk_register_clkdev(clk, NULL, "INT33C4:00");
  54. clk = clk_register_lpss_gate("uart1_clk", "lpss_clk", "INT33C5", NULL,
  55. PRV_CLOCK_PARAMS);
  56. if (!IS_ERR(clk))
  57. clk_register_clkdev(clk, NULL, "INT33C5:00");
  58. return 0;
  59. }
  60. static struct platform_driver lpt_clk_driver = {
  61. .driver = {
  62. .name = "clk-lpt",
  63. .owner = THIS_MODULE,
  64. },
  65. .probe = lpt_clk_probe,
  66. };
  67. static int __init lpt_clk_init(void)
  68. {
  69. return platform_driver_register(&lpt_clk_driver);
  70. }
  71. arch_initcall(lpt_clk_init);