Blame view

drivers/mfd/intel-lpss-acpi.c 3.11 KB
4b45efe85   Andy Shevchenko   mfd: Add support ...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
  /*
   * Intel LPSS ACPI support.
   *
   * Copyright (C) 2015, Intel Corporation
   *
   * Authors: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
   *          Mika Westerberg <mika.westerberg@linux.intel.com>
   *
   * This program is free software; you can redistribute it and/or modify
   * it under the terms of the GNU General Public License version 2 as
   * published by the Free Software Foundation.
   */
  
  #include <linux/acpi.h>
  #include <linux/ioport.h>
  #include <linux/kernel.h>
  #include <linux/module.h>
  #include <linux/pm.h>
  #include <linux/pm_runtime.h>
  #include <linux/platform_device.h>
028af5941   Mika Westerberg   mfd: intel-lpss: ...
21
  #include <linux/property.h>
4b45efe85   Andy Shevchenko   mfd: Add support ...
22
23
24
25
26
27
  
  #include "intel-lpss.h"
  
  static const struct intel_lpss_platform_info spt_info = {
  	.clk_rate = 120000000,
  };
028af5941   Mika Westerberg   mfd: intel-lpss: ...
28
29
30
31
  static struct property_entry spt_i2c_properties[] = {
  	PROPERTY_ENTRY_U32("i2c-sda-hold-time-ns", 230),
  	{ },
  };
028af5941   Mika Westerberg   mfd: intel-lpss: ...
32
33
  static const struct intel_lpss_platform_info spt_i2c_info = {
  	.clk_rate = 120000000,
f4d052660   Heikki Krogerus   device property: ...
34
  	.properties = spt_i2c_properties,
028af5941   Mika Westerberg   mfd: intel-lpss: ...
35
  };
6a636ec0a   Mika Westerberg   mfd: lpss: Add Br...
36
37
38
  static const struct intel_lpss_platform_info bxt_info = {
  	.clk_rate = 100000000,
  };
0343b2f4e   Mika Westerberg   mfd: intel-lpss: ...
39
40
41
42
43
44
  static struct property_entry bxt_i2c_properties[] = {
  	PROPERTY_ENTRY_U32("i2c-sda-hold-time-ns", 42),
  	PROPERTY_ENTRY_U32("i2c-sda-falling-time-ns", 171),
  	PROPERTY_ENTRY_U32("i2c-scl-falling-time-ns", 208),
  	{ },
  };
6a636ec0a   Mika Westerberg   mfd: lpss: Add Br...
45
46
  static const struct intel_lpss_platform_info bxt_i2c_info = {
  	.clk_rate = 133000000,
f4d052660   Heikki Krogerus   device property: ...
47
  	.properties = bxt_i2c_properties,
6a636ec0a   Mika Westerberg   mfd: lpss: Add Br...
48
  };
4b45efe85   Andy Shevchenko   mfd: Add support ...
49
50
  static const struct acpi_device_id intel_lpss_acpi_ids[] = {
  	/* SPT */
028af5941   Mika Westerberg   mfd: intel-lpss: ...
51
52
  	{ "INT3446", (kernel_ulong_t)&spt_i2c_info },
  	{ "INT3447", (kernel_ulong_t)&spt_i2c_info },
6a636ec0a   Mika Westerberg   mfd: lpss: Add Br...
53
54
55
56
57
58
59
60
  	/* BXT */
  	{ "80860AAC", (kernel_ulong_t)&bxt_i2c_info },
  	{ "80860ABC", (kernel_ulong_t)&bxt_info },
  	{ "80860AC2", (kernel_ulong_t)&bxt_info },
  	/* APL */
  	{ "80865AAC", (kernel_ulong_t)&bxt_i2c_info },
  	{ "80865ABC", (kernel_ulong_t)&bxt_info },
  	{ "80865AC2", (kernel_ulong_t)&bxt_info },
4b45efe85   Andy Shevchenko   mfd: Add support ...
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
  	{ }
  };
  MODULE_DEVICE_TABLE(acpi, intel_lpss_acpi_ids);
  
  static int intel_lpss_acpi_probe(struct platform_device *pdev)
  {
  	struct intel_lpss_platform_info *info;
  	const struct acpi_device_id *id;
  
  	id = acpi_match_device(intel_lpss_acpi_ids, &pdev->dev);
  	if (!id)
  		return -ENODEV;
  
  	info = devm_kmemdup(&pdev->dev, (void *)id->driver_data, sizeof(*info),
  			    GFP_KERNEL);
  	if (!info)
  		return -ENOMEM;
  
  	info->mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
  	info->irq = platform_get_irq(pdev, 0);
  
  	pm_runtime_set_active(&pdev->dev);
  	pm_runtime_enable(&pdev->dev);
  
  	return intel_lpss_probe(&pdev->dev, info);
  }
  
  static int intel_lpss_acpi_remove(struct platform_device *pdev)
  {
  	intel_lpss_remove(&pdev->dev);
  	pm_runtime_disable(&pdev->dev);
  
  	return 0;
  }
  
  static INTEL_LPSS_PM_OPS(intel_lpss_acpi_pm_ops);
  
  static struct platform_driver intel_lpss_acpi_driver = {
  	.probe = intel_lpss_acpi_probe,
  	.remove = intel_lpss_acpi_remove,
  	.driver = {
  		.name = "intel-lpss",
  		.acpi_match_table = intel_lpss_acpi_ids,
  		.pm = &intel_lpss_acpi_pm_ops,
  	},
  };
  
  module_platform_driver(intel_lpss_acpi_driver);
  
  MODULE_AUTHOR("Andy Shevchenko <andriy.shevchenko@linux.intel.com>");
  MODULE_AUTHOR("Mika Westerberg <mika.westerberg@linux.intel.com>");
  MODULE_DESCRIPTION("Intel LPSS ACPI driver");
  MODULE_LICENSE("GPL v2");