intel-lpss-acpi.c 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. /*
  2. * Intel LPSS ACPI support.
  3. *
  4. * Copyright (C) 2015, Intel Corporation
  5. *
  6. * Authors: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
  7. * Mika Westerberg <mika.westerberg@linux.intel.com>
  8. *
  9. * This program is free software; you can redistribute it and/or modify
  10. * it under the terms of the GNU General Public License version 2 as
  11. * published by the Free Software Foundation.
  12. */
  13. #include <linux/acpi.h>
  14. #include <linux/ioport.h>
  15. #include <linux/kernel.h>
  16. #include <linux/module.h>
  17. #include <linux/pm.h>
  18. #include <linux/pm_runtime.h>
  19. #include <linux/platform_device.h>
  20. #include "intel-lpss.h"
  21. static const struct intel_lpss_platform_info spt_info = {
  22. .clk_rate = 120000000,
  23. };
  24. static const struct intel_lpss_platform_info bxt_info = {
  25. .clk_rate = 100000000,
  26. };
  27. static const struct intel_lpss_platform_info bxt_i2c_info = {
  28. .clk_rate = 133000000,
  29. };
  30. static const struct acpi_device_id intel_lpss_acpi_ids[] = {
  31. /* SPT */
  32. { "INT3446", (kernel_ulong_t)&spt_info },
  33. { "INT3447", (kernel_ulong_t)&spt_info },
  34. /* BXT */
  35. { "80860AAC", (kernel_ulong_t)&bxt_i2c_info },
  36. { "80860ABC", (kernel_ulong_t)&bxt_info },
  37. { "80860AC2", (kernel_ulong_t)&bxt_info },
  38. /* APL */
  39. { "80865AAC", (kernel_ulong_t)&bxt_i2c_info },
  40. { "80865ABC", (kernel_ulong_t)&bxt_info },
  41. { "80865AC2", (kernel_ulong_t)&bxt_info },
  42. { }
  43. };
  44. MODULE_DEVICE_TABLE(acpi, intel_lpss_acpi_ids);
  45. static int intel_lpss_acpi_probe(struct platform_device *pdev)
  46. {
  47. struct intel_lpss_platform_info *info;
  48. const struct acpi_device_id *id;
  49. id = acpi_match_device(intel_lpss_acpi_ids, &pdev->dev);
  50. if (!id)
  51. return -ENODEV;
  52. info = devm_kmemdup(&pdev->dev, (void *)id->driver_data, sizeof(*info),
  53. GFP_KERNEL);
  54. if (!info)
  55. return -ENOMEM;
  56. info->mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
  57. info->irq = platform_get_irq(pdev, 0);
  58. pm_runtime_set_active(&pdev->dev);
  59. pm_runtime_enable(&pdev->dev);
  60. return intel_lpss_probe(&pdev->dev, info);
  61. }
  62. static int intel_lpss_acpi_remove(struct platform_device *pdev)
  63. {
  64. intel_lpss_remove(&pdev->dev);
  65. pm_runtime_disable(&pdev->dev);
  66. return 0;
  67. }
  68. static INTEL_LPSS_PM_OPS(intel_lpss_acpi_pm_ops);
  69. static struct platform_driver intel_lpss_acpi_driver = {
  70. .probe = intel_lpss_acpi_probe,
  71. .remove = intel_lpss_acpi_remove,
  72. .driver = {
  73. .name = "intel-lpss",
  74. .acpi_match_table = intel_lpss_acpi_ids,
  75. .pm = &intel_lpss_acpi_pm_ops,
  76. },
  77. };
  78. module_platform_driver(intel_lpss_acpi_driver);
  79. MODULE_AUTHOR("Andy Shevchenko <andriy.shevchenko@linux.intel.com>");
  80. MODULE_AUTHOR("Mika Westerberg <mika.westerberg@linux.intel.com>");
  81. MODULE_DESCRIPTION("Intel LPSS ACPI driver");
  82. MODULE_LICENSE("GPL v2");