aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>2013-03-06 17:46:20 -0500
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>2013-03-21 17:44:38 -0400
commitf58b082aed43400c03e53beacc50a9f9eb23ac91 (patch)
tree044ce964e1a619b33181f1d4c80504e7d6219844
parentf6161aa153581da4a3867a2d1a7caf4be19b6ec9 (diff)
ACPI / scan: Add special handler for Intel Lynxpoint LPSS devices
Devices on the Intel Lynxpoint Low Power Subsystem (LPSS) have some common features that aren't shared with any other platform devices, including the clock and LTR (Latency Tolerance Reporting) registers. It is better to handle those features in common code than to bother device drivers with doing that (I/O functionality-wise the LPSS devices are generally compatible with other devices that don't have those special registers and may be handled by the same drivers). The clock registers of the LPSS devices are now taken care of by the special clk-x86-lpss driver, but the MMIO mappings used for accessing those registers can also be used for accessing the LTR registers on those devices (LTR support for the Lynxpoint LPSS is going to be added by a subsequent patch). Thus it is convenient to add a special ACPI scan handler for the Lynxpoint LPSS devices that will create the MMIO mappings for accessing the clock (and LTR in the future) registers and will register the LPSS devices' clocks, so the clk-x86-lpss driver will only need to take care of the main Lynxpoint LPSS clock. Introduce a special ACPI scan handler for Intel Lynxpoint LPSS devices as described above. This also reduces overhead related to browsing the ACPI namespace in search of the LPSS devices before the registration of their clocks, removes some LPSS-specific (and somewhat ugly) code from acpi_platform.c and shrinks the overall code size slightly. Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> Acked-by: Mike Turquette <mturquette@linaro.org>
-rw-r--r--drivers/acpi/Makefile1
-rw-r--r--drivers/acpi/acpi_lpss.c163
-rw-r--r--drivers/acpi/acpi_platform.c40
-rw-r--r--drivers/acpi/internal.h8
-rw-r--r--drivers/acpi/scan.c1
-rw-r--r--drivers/clk/x86/Makefile2
-rw-r--r--drivers/clk/x86/clk-lpss.c99
-rw-r--r--drivers/clk/x86/clk-lpss.h36
-rw-r--r--drivers/clk/x86/clk-lpt.c40
-rw-r--r--include/linux/platform_data/clk-lpss.h18
10 files changed, 195 insertions, 213 deletions
diff --git a/drivers/acpi/Makefile b/drivers/acpi/Makefile
index 474fcfeba66c..ecb743bf05a5 100644
--- a/drivers/acpi/Makefile
+++ b/drivers/acpi/Makefile
@@ -39,6 +39,7 @@ acpi-y += ec.o
39acpi-$(CONFIG_ACPI_DOCK) += dock.o 39acpi-$(CONFIG_ACPI_DOCK) += dock.o
40acpi-y += pci_root.o pci_link.o pci_irq.o 40acpi-y += pci_root.o pci_link.o pci_irq.o
41acpi-y += csrt.o 41acpi-y += csrt.o
42acpi-$(CONFIG_X86_INTEL_LPSS) += acpi_lpss.o
42acpi-y += acpi_platform.o 43acpi-y += acpi_platform.o
43acpi-y += power.o 44acpi-y += power.o
44acpi-y += event.o 45acpi-y += event.o
diff --git a/drivers/acpi/acpi_lpss.c b/drivers/acpi/acpi_lpss.c
new file mode 100644
index 000000000000..823df46a3deb
--- /dev/null
+++ b/drivers/acpi/acpi_lpss.c
@@ -0,0 +1,163 @@
1/*
2 * ACPI support for Intel Lynxpoint LPSS.
3 *
4 * Copyright (C) 2013, Intel Corporation
5 * Authors: Mika Westerberg <mika.westerberg@linux.intel.com>
6 * Rafael J. Wysocki <rafael.j.wysocki@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
13#include <linux/acpi.h>
14#include <linux/clk.h>
15#include <linux/clkdev.h>
16#include <linux/clk-provider.h>
17#include <linux/err.h>
18#include <linux/io.h>
19#include <linux/platform_device.h>
20#include <linux/platform_data/clk-lpss.h>
21
22#include "internal.h"
23
24ACPI_MODULE_NAME("acpi_lpss");
25
26#define LPSS_CLK_OFFSET 0x800
27#define LPSS_CLK_SIZE 0x04
28
29struct lpss_device_desc {
30 bool clk_required;
31 const char *clk_parent;
32};
33
34struct lpss_private_data {
35 void __iomem *mmio_base;
36 resource_size_t mmio_size;
37 struct clk *clk;
38 const struct lpss_device_desc *dev_desc;
39};
40
41static struct lpss_device_desc lpt_dev_desc = {
42 .clk_required = true,
43 .clk_parent = "lpss_clk",
44};
45
46static const struct acpi_device_id acpi_lpss_device_ids[] = {
47 /* Lynxpoint LPSS devices */
48 { "INT33C0", (unsigned long)&lpt_dev_desc },
49 { "INT33C1", (unsigned long)&lpt_dev_desc },
50 { "INT33C2", (unsigned long)&lpt_dev_desc },
51 { "INT33C3", (unsigned long)&lpt_dev_desc },
52 { "INT33C4", (unsigned long)&lpt_dev_desc },
53 { "INT33C5", (unsigned long)&lpt_dev_desc },
54 { "INT33C6", },
55 { "INT33C7", },
56
57 { }
58};
59
60static int is_memory(struct acpi_resource *res, void *not_used)
61{
62 struct resource r;
63 return !acpi_dev_resource_memory(res, &r);
64}
65
66/* LPSS main clock device. */
67static struct platform_device *lpss_clk_dev;
68
69static inline void lpt_register_clock_device(void)
70{
71 lpss_clk_dev = platform_device_register_simple("clk-lpt", -1, NULL, 0);
72}
73
74static int register_device_clock(struct acpi_device *adev,
75 struct lpss_private_data *pdata)
76{
77 const struct lpss_device_desc *dev_desc = pdata->dev_desc;
78
79 if (!lpss_clk_dev)
80 lpt_register_clock_device();
81
82 if (!dev_desc->clk_parent || !pdata->mmio_base
83 || pdata->mmio_size < LPSS_CLK_OFFSET + LPSS_CLK_SIZE)
84 return -ENODATA;
85
86 pdata->clk = clk_register_gate(NULL, dev_name(&adev->dev),
87 dev_desc->clk_parent, 0,
88 pdata->mmio_base + LPSS_CLK_OFFSET,
89 0, 0, NULL);
90 if (IS_ERR(pdata->clk))
91 return PTR_ERR(pdata->clk);
92
93 clk_register_clkdev(pdata->clk, NULL, dev_name(&adev->dev));
94 return 0;
95}
96
97static int acpi_lpss_create_device(struct acpi_device *adev,
98 const struct acpi_device_id *id)
99{
100 struct lpss_device_desc *dev_desc;
101 struct lpss_private_data *pdata;
102 struct resource_list_entry *rentry;
103 struct list_head resource_list;
104 int ret;
105
106 dev_desc = (struct lpss_device_desc *)id->driver_data;
107 if (!dev_desc)
108 return acpi_create_platform_device(adev, id);
109
110 pdata = kzalloc(sizeof(*pdata), GFP_KERNEL);
111 if (!pdata)
112 return -ENOMEM;
113
114 INIT_LIST_HEAD(&resource_list);
115 ret = acpi_dev_get_resources(adev, &resource_list, is_memory, NULL);
116 if (ret < 0)
117 goto err_out;
118
119 list_for_each_entry(rentry, &resource_list, node)
120 if (resource_type(&rentry->res) == IORESOURCE_MEM) {
121 pdata->mmio_size = resource_size(&rentry->res);
122 pdata->mmio_base = ioremap(rentry->res.start,
123 pdata->mmio_size);
124 pdata->dev_desc = dev_desc;
125 break;
126 }
127
128 acpi_dev_free_resource_list(&resource_list);
129
130 if (dev_desc->clk_required) {
131 ret = register_device_clock(adev, pdata);
132 if (ret) {
133 /*
134 * Skip the device, but don't terminate the namespace
135 * scan.
136 */
137 ret = 0;
138 goto err_out;
139 }
140 }
141
142 adev->driver_data = pdata;
143 ret = acpi_create_platform_device(adev, id);
144 if (ret > 0)
145 return ret;
146
147 adev->driver_data = NULL;
148
149 err_out:
150 kfree(pdata);
151 return ret;
152}
153
154static struct acpi_scan_handler lpss_handler = {
155 .ids = acpi_lpss_device_ids,
156 .attach = acpi_lpss_create_device,
157};
158
159void __init acpi_lpss_init(void)
160{
161 if (!lpt_clk_init())
162 acpi_scan_add_handler(&lpss_handler);
163}
diff --git a/drivers/acpi/acpi_platform.c b/drivers/acpi/acpi_platform.c
index 26fce4b8a632..fafec5ddf17f 100644
--- a/drivers/acpi/acpi_platform.c
+++ b/drivers/acpi/acpi_platform.c
@@ -22,9 +22,6 @@
22 22
23ACPI_MODULE_NAME("platform"); 23ACPI_MODULE_NAME("platform");
24 24
25/* Flags for acpi_create_platform_device */
26#define ACPI_PLATFORM_CLK BIT(0)
27
28/* 25/*
29 * The following ACPI IDs are known to be suitable for representing as 26 * The following ACPI IDs are known to be suitable for representing as
30 * platform devices. 27 * platform devices.
@@ -33,33 +30,9 @@ static const struct acpi_device_id acpi_platform_device_ids[] = {
33 30
34 { "PNP0D40" }, 31 { "PNP0D40" },
35 32
36 /* Haswell LPSS devices */
37 { "INT33C0", ACPI_PLATFORM_CLK },
38 { "INT33C1", ACPI_PLATFORM_CLK },
39 { "INT33C2", ACPI_PLATFORM_CLK },
40 { "INT33C3", ACPI_PLATFORM_CLK },
41 { "INT33C4", ACPI_PLATFORM_CLK },
42 { "INT33C5", ACPI_PLATFORM_CLK },
43 { "INT33C6", ACPI_PLATFORM_CLK },
44 { "INT33C7", ACPI_PLATFORM_CLK },
45
46 { } 33 { }
47}; 34};
48 35
49static int acpi_create_platform_clks(struct acpi_device *adev)
50{
51 static struct platform_device *pdev;
52
53 /* Create Lynxpoint LPSS clocks */
54 if (!pdev && !strncmp(acpi_device_hid(adev), "INT33C", 6)) {
55 pdev = platform_device_register_simple("clk-lpt", -1, NULL, 0);
56 if (IS_ERR(pdev))
57 return PTR_ERR(pdev);
58 }
59
60 return 0;
61}
62
63/** 36/**
64 * acpi_create_platform_device - Create platform device for ACPI device node 37 * acpi_create_platform_device - Create platform device for ACPI device node
65 * @adev: ACPI device node to create a platform device for. 38 * @adev: ACPI device node to create a platform device for.
@@ -71,10 +44,9 @@ static int acpi_create_platform_clks(struct acpi_device *adev)
71 * 44 *
72 * Name of the platform device will be the same as @adev's. 45 * Name of the platform device will be the same as @adev's.
73 */ 46 */
74static int acpi_create_platform_device(struct acpi_device *adev, 47int acpi_create_platform_device(struct acpi_device *adev,
75 const struct acpi_device_id *id) 48 const struct acpi_device_id *id)
76{ 49{
77 unsigned long flags = id->driver_data;
78 struct platform_device *pdev = NULL; 50 struct platform_device *pdev = NULL;
79 struct acpi_device *acpi_parent; 51 struct acpi_device *acpi_parent;
80 struct platform_device_info pdevinfo; 52 struct platform_device_info pdevinfo;
@@ -83,14 +55,6 @@ static int acpi_create_platform_device(struct acpi_device *adev,
83 struct resource *resources; 55 struct resource *resources;
84 int count; 56 int count;
85 57
86 if (flags & ACPI_PLATFORM_CLK) {
87 int ret = acpi_create_platform_clks(adev);
88 if (ret) {
89 dev_err(&adev->dev, "failed to create clocks\n");
90 return ret;
91 }
92 }
93
94 /* If the ACPI node already has a physical device attached, skip it. */ 58 /* If the ACPI node already has a physical device attached, skip it. */
95 if (adev->physical_node_count) 59 if (adev->physical_node_count)
96 return 0; 60 return 0;
diff --git a/drivers/acpi/internal.h b/drivers/acpi/internal.h
index 3c94a732b4b3..e227819217fb 100644
--- a/drivers/acpi/internal.h
+++ b/drivers/acpi/internal.h
@@ -48,6 +48,11 @@ int acpi_debugfs_init(void);
48#else 48#else
49static inline void acpi_debugfs_init(void) { return; } 49static inline void acpi_debugfs_init(void) { return; }
50#endif 50#endif
51#ifdef CONFIG_X86_INTEL_LPSS
52void acpi_lpss_init(void);
53#else
54static inline void acpi_lpss_init(void) {}
55#endif
51 56
52/* -------------------------------------------------------------------------- 57/* --------------------------------------------------------------------------
53 Device Node Initialization / Removal 58 Device Node Initialization / Removal
@@ -131,4 +136,7 @@ static inline void suspend_nvs_restore(void) {}
131 -------------------------------------------------------------------------- */ 136 -------------------------------------------------------------------------- */
132struct platform_device; 137struct platform_device;
133 138
139int acpi_create_platform_device(struct acpi_device *adev,
140 const struct acpi_device_id *id);
141
134#endif /* _ACPI_INTERNAL_H_ */ 142#endif /* _ACPI_INTERNAL_H_ */
diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c
index 5e7e991717d7..433a4e15019c 100644
--- a/drivers/acpi/scan.c
+++ b/drivers/acpi/scan.c
@@ -1788,6 +1788,7 @@ int __init acpi_scan_init(void)
1788 acpi_pci_root_init(); 1788 acpi_pci_root_init();
1789 acpi_pci_link_init(); 1789 acpi_pci_link_init();
1790 acpi_platform_init(); 1790 acpi_platform_init();
1791 acpi_lpss_init();
1791 acpi_csrt_init(); 1792 acpi_csrt_init();
1792 acpi_container_init(); 1793 acpi_container_init();
1793 acpi_pci_slot_init(); 1794 acpi_pci_slot_init();
diff --git a/drivers/clk/x86/Makefile b/drivers/clk/x86/Makefile
index f9ba4fab0ddc..04781389d0fb 100644
--- a/drivers/clk/x86/Makefile
+++ b/drivers/clk/x86/Makefile
@@ -1,2 +1,2 @@
1clk-x86-lpss-objs := clk-lpss.o clk-lpt.o 1clk-x86-lpss-objs := clk-lpt.o
2obj-$(CONFIG_X86_INTEL_LPSS) += clk-x86-lpss.o 2obj-$(CONFIG_X86_INTEL_LPSS) += clk-x86-lpss.o
diff --git a/drivers/clk/x86/clk-lpss.c b/drivers/clk/x86/clk-lpss.c
deleted file mode 100644
index b5e229f3c3d9..000000000000
--- a/drivers/clk/x86/clk-lpss.c
+++ /dev/null
@@ -1,99 +0,0 @@
1/*
2 * Intel Low Power Subsystem 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
13#include <linux/acpi.h>
14#include <linux/clk.h>
15#include <linux/clk-provider.h>
16#include <linux/err.h>
17#include <linux/io.h>
18#include <linux/module.h>
19
20static int clk_lpss_is_mmio_resource(struct acpi_resource *res, void *data)
21{
22 struct resource r;
23 return !acpi_dev_resource_memory(res, &r);
24}
25
26static acpi_status clk_lpss_find_mmio(acpi_handle handle, u32 level,
27 void *data, void **retval)
28{
29 struct resource_list_entry *rentry;
30 struct list_head resource_list;
31 struct acpi_device *adev;
32 const char *uid = data;
33 int ret;
34
35 if (acpi_bus_get_device(handle, &adev))
36 return AE_OK;
37
38 if (uid) {
39 if (!adev->pnp.unique_id)
40 return AE_OK;
41 if (strcmp(uid, adev->pnp.unique_id))
42 return AE_OK;
43 }
44
45 INIT_LIST_HEAD(&resource_list);
46 ret = acpi_dev_get_resources(adev, &resource_list,
47 clk_lpss_is_mmio_resource, NULL);
48 if (ret < 0)
49 return AE_NO_MEMORY;
50
51 list_for_each_entry(rentry, &resource_list, node)
52 if (resource_type(&rentry->res) == IORESOURCE_MEM) {
53 *(struct resource *)retval = rentry->res;
54 break;
55 }
56
57 acpi_dev_free_resource_list(&resource_list);
58 return AE_OK;
59}
60
61/**
62 * clk_register_lpss_gate - register LPSS clock gate
63 * @name: name of this clock gate
64 * @parent_name: parent clock name
65 * @hid: ACPI _HID of the device
66 * @uid: ACPI _UID of the device (optional)
67 * @offset: LPSS PRV_CLOCK_PARAMS offset
68 *
69 * Creates and registers LPSS clock gate.
70 */
71struct clk *clk_register_lpss_gate(const char *name, const char *parent_name,
72 const char *hid, const char *uid,
73 unsigned offset)
74{
75 struct resource res = { };
76 void __iomem *mmio_base;
77 acpi_status status;
78 struct clk *clk;
79
80 /*
81 * First try to look the device and its mmio resource from the
82 * ACPI namespace.
83 */
84 status = acpi_get_devices(hid, clk_lpss_find_mmio, (void *)uid,
85 (void **)&res);
86 if (ACPI_FAILURE(status) || !res.start)
87 return ERR_PTR(-ENODEV);
88
89 mmio_base = ioremap(res.start, resource_size(&res));
90 if (!mmio_base)
91 return ERR_PTR(-ENOMEM);
92
93 clk = clk_register_gate(NULL, name, parent_name, 0, mmio_base + offset,
94 0, 0, NULL);
95 if (IS_ERR(clk))
96 iounmap(mmio_base);
97
98 return clk;
99}
diff --git a/drivers/clk/x86/clk-lpss.h b/drivers/clk/x86/clk-lpss.h
deleted file mode 100644
index e9460f442297..000000000000
--- a/drivers/clk/x86/clk-lpss.h
+++ /dev/null
@@ -1,36 +0,0 @@
1/*
2 * Intel Low Power Subsystem clock.
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
13#ifndef __CLK_LPSS_H
14#define __CLK_LPSS_H
15
16#include <linux/err.h>
17#include <linux/errno.h>
18#include <linux/clk.h>
19
20#ifdef CONFIG_ACPI
21extern struct clk *clk_register_lpss_gate(const char *name,
22 const char *parent_name,
23 const char *hid, const char *uid,
24 unsigned offset);
25#else
26static inline struct clk *clk_register_lpss_gate(const char *name,
27 const char *parent_name,
28 const char *hid,
29 const char *uid,
30 unsigned offset)
31{
32 return ERR_PTR(-ENODEV);
33}
34#endif
35
36#endif /* __CLK_LPSS_H */
diff --git a/drivers/clk/x86/clk-lpt.c b/drivers/clk/x86/clk-lpt.c
index 81298aeef7e3..5cf4f4686406 100644
--- a/drivers/clk/x86/clk-lpt.c
+++ b/drivers/clk/x86/clk-lpt.c
@@ -10,7 +10,6 @@
10 * published by the Free Software Foundation. 10 * published by the Free Software Foundation.
11 */ 11 */
12 12
13#include <linux/acpi.h>
14#include <linux/clk.h> 13#include <linux/clk.h>
15#include <linux/clkdev.h> 14#include <linux/clkdev.h>
16#include <linux/clk-provider.h> 15#include <linux/clk-provider.h>
@@ -18,8 +17,6 @@
18#include <linux/module.h> 17#include <linux/module.h>
19#include <linux/platform_device.h> 18#include <linux/platform_device.h>
20 19
21#include "clk-lpss.h"
22
23#define PRV_CLOCK_PARAMS 0x800 20#define PRV_CLOCK_PARAMS 0x800
24 21
25static int lpt_clk_probe(struct platform_device *pdev) 22static int lpt_clk_probe(struct platform_device *pdev)
@@ -34,40 +31,6 @@ static int lpt_clk_probe(struct platform_device *pdev)
34 31
35 /* Shared DMA clock */ 32 /* Shared DMA clock */
36 clk_register_clkdev(clk, "hclk", "INTL9C60.0.auto"); 33 clk_register_clkdev(clk, "hclk", "INTL9C60.0.auto");
37
38 /* SPI clocks */
39 clk = clk_register_lpss_gate("spi0_clk", "lpss_clk", "INT33C0", NULL,
40 PRV_CLOCK_PARAMS);
41 if (!IS_ERR(clk))
42 clk_register_clkdev(clk, NULL, "INT33C0:00");
43
44 clk = clk_register_lpss_gate("spi1_clk", "lpss_clk", "INT33C1", NULL,
45 PRV_CLOCK_PARAMS);
46 if (!IS_ERR(clk))
47 clk_register_clkdev(clk, NULL, "INT33C1:00");
48
49 /* I2C clocks */
50 clk = clk_register_lpss_gate("i2c0_clk", "lpss_clk", "INT33C2", NULL,
51 PRV_CLOCK_PARAMS);
52 if (!IS_ERR(clk))
53 clk_register_clkdev(clk, NULL, "INT33C2:00");
54
55 clk = clk_register_lpss_gate("i2c1_clk", "lpss_clk", "INT33C3", NULL,
56 PRV_CLOCK_PARAMS);
57 if (!IS_ERR(clk))
58 clk_register_clkdev(clk, NULL, "INT33C3:00");
59
60 /* UART clocks */
61 clk = clk_register_lpss_gate("uart0_clk", "lpss_clk", "INT33C4", NULL,
62 PRV_CLOCK_PARAMS);
63 if (!IS_ERR(clk))
64 clk_register_clkdev(clk, NULL, "INT33C4:00");
65
66 clk = clk_register_lpss_gate("uart1_clk", "lpss_clk", "INT33C5", NULL,
67 PRV_CLOCK_PARAMS);
68 if (!IS_ERR(clk))
69 clk_register_clkdev(clk, NULL, "INT33C5:00");
70
71 return 0; 34 return 0;
72} 35}
73 36
@@ -79,8 +42,7 @@ static struct platform_driver lpt_clk_driver = {
79 .probe = lpt_clk_probe, 42 .probe = lpt_clk_probe,
80}; 43};
81 44
82static int __init lpt_clk_init(void) 45int __init lpt_clk_init(void)
83{ 46{
84 return platform_driver_register(&lpt_clk_driver); 47 return platform_driver_register(&lpt_clk_driver);
85} 48}
86arch_initcall(lpt_clk_init);
diff --git a/include/linux/platform_data/clk-lpss.h b/include/linux/platform_data/clk-lpss.h
new file mode 100644
index 000000000000..528e73ce46d2
--- /dev/null
+++ b/include/linux/platform_data/clk-lpss.h
@@ -0,0 +1,18 @@
1/*
2 * Intel Low Power Subsystem clocks.
3 *
4 * Copyright (C) 2013, Intel Corporation
5 * Authors: Mika Westerberg <mika.westerberg@linux.intel.com>
6 * Rafael J. Wysocki <rafael.j.wysocki@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
13#ifndef __CLK_LPSS_H
14#define __CLK_LPSS_H
15
16extern int lpt_clk_init(void);
17
18#endif /* __CLK_LPSS_H */