diff options
-rw-r--r-- | drivers/Kconfig | 2 | ||||
-rw-r--r-- | drivers/Makefile | 3 | ||||
-rw-r--r-- | drivers/soc/Kconfig | 5 | ||||
-rw-r--r-- | drivers/soc/Makefile | 5 | ||||
-rw-r--r-- | drivers/soc/qcom/Kconfig | 11 | ||||
-rw-r--r-- | drivers/soc/qcom/Makefile | 1 | ||||
-rw-r--r-- | drivers/soc/qcom/qcom_gsbi.c | 84 |
7 files changed, 111 insertions, 0 deletions
diff --git a/drivers/Kconfig b/drivers/Kconfig index 0a0a90f52d26..0e87a34b6472 100644 --- a/drivers/Kconfig +++ b/drivers/Kconfig | |||
@@ -132,6 +132,8 @@ source "drivers/staging/Kconfig" | |||
132 | 132 | ||
133 | source "drivers/platform/Kconfig" | 133 | source "drivers/platform/Kconfig" |
134 | 134 | ||
135 | source "drivers/soc/Kconfig" | ||
136 | |||
135 | source "drivers/clk/Kconfig" | 137 | source "drivers/clk/Kconfig" |
136 | 138 | ||
137 | source "drivers/hwspinlock/Kconfig" | 139 | source "drivers/hwspinlock/Kconfig" |
diff --git a/drivers/Makefile b/drivers/Makefile index d05d81b19b50..e0c64454b96d 100644 --- a/drivers/Makefile +++ b/drivers/Makefile | |||
@@ -33,6 +33,9 @@ obj-y += amba/ | |||
33 | # really early. | 33 | # really early. |
34 | obj-$(CONFIG_DMADEVICES) += dma/ | 34 | obj-$(CONFIG_DMADEVICES) += dma/ |
35 | 35 | ||
36 | # SOC specific infrastructure drivers. | ||
37 | obj-y += soc/ | ||
38 | |||
36 | obj-$(CONFIG_VIRTIO) += virtio/ | 39 | obj-$(CONFIG_VIRTIO) += virtio/ |
37 | obj-$(CONFIG_XEN) += xen/ | 40 | obj-$(CONFIG_XEN) += xen/ |
38 | 41 | ||
diff --git a/drivers/soc/Kconfig b/drivers/soc/Kconfig new file mode 100644 index 000000000000..c8543855aa82 --- /dev/null +++ b/drivers/soc/Kconfig | |||
@@ -0,0 +1,5 @@ | |||
1 | menu "SOC (System On Chip) specific Drivers" | ||
2 | |||
3 | source "drivers/soc/qcom/Kconfig" | ||
4 | |||
5 | endmenu | ||
diff --git a/drivers/soc/Makefile b/drivers/soc/Makefile new file mode 100644 index 000000000000..0f7c44793b29 --- /dev/null +++ b/drivers/soc/Makefile | |||
@@ -0,0 +1,5 @@ | |||
1 | # | ||
2 | # Makefile for the Linux Kernel SOC specific device drivers. | ||
3 | # | ||
4 | |||
5 | obj-$(CONFIG_ARCH_QCOM) += qcom/ | ||
diff --git a/drivers/soc/qcom/Kconfig b/drivers/soc/qcom/Kconfig new file mode 100644 index 000000000000..7bd2c94f54a4 --- /dev/null +++ b/drivers/soc/qcom/Kconfig | |||
@@ -0,0 +1,11 @@ | |||
1 | # | ||
2 | # QCOM Soc drivers | ||
3 | # | ||
4 | config QCOM_GSBI | ||
5 | tristate "QCOM General Serial Bus Interface" | ||
6 | depends on ARCH_QCOM | ||
7 | help | ||
8 | Say y here to enable GSBI support. The GSBI provides control | ||
9 | functions for connecting the underlying serial UART, SPI, and I2C | ||
10 | devices to the output pins. | ||
11 | |||
diff --git a/drivers/soc/qcom/Makefile b/drivers/soc/qcom/Makefile new file mode 100644 index 000000000000..438901257ac1 --- /dev/null +++ b/drivers/soc/qcom/Makefile | |||
@@ -0,0 +1 @@ | |||
obj-$(CONFIG_QCOM_GSBI) += qcom_gsbi.o | |||
diff --git a/drivers/soc/qcom/qcom_gsbi.c b/drivers/soc/qcom/qcom_gsbi.c new file mode 100644 index 000000000000..061dd0632dbd --- /dev/null +++ b/drivers/soc/qcom/qcom_gsbi.c | |||
@@ -0,0 +1,84 @@ | |||
1 | /* | ||
2 | * Copyright (c) 2014, The Linux foundation. All rights reserved. | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify | ||
5 | * it under the terms of the GNU General Public License rev 2 and | ||
6 | * only rev 2 as published by the free Software foundation. | ||
7 | * | ||
8 | * This program is distributed in the hope that it will be useful, | ||
9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
10 | * MERCHANTABILITY or fITNESS fOR A PARTICULAR PURPOSE. See the | ||
11 | * GNU General Public License for more details. | ||
12 | */ | ||
13 | |||
14 | #include <linux/clk.h> | ||
15 | #include <linux/err.h> | ||
16 | #include <linux/io.h> | ||
17 | #include <linux/module.h> | ||
18 | #include <linux/of.h> | ||
19 | #include <linux/of_platform.h> | ||
20 | #include <linux/platform_device.h> | ||
21 | |||
22 | #define GSBI_CTRL_REG 0x0000 | ||
23 | #define GSBI_PROTOCOL_SHIFT 4 | ||
24 | |||
25 | static int gsbi_probe(struct platform_device *pdev) | ||
26 | { | ||
27 | struct device_node *node = pdev->dev.of_node; | ||
28 | struct resource *res; | ||
29 | void __iomem *base; | ||
30 | struct clk *hclk; | ||
31 | u32 mode, crci = 0; | ||
32 | |||
33 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
34 | base = devm_ioremap_resource(&pdev->dev, res); | ||
35 | if (IS_ERR(base)) | ||
36 | return PTR_ERR(base); | ||
37 | |||
38 | if (of_property_read_u32(node, "qcom,mode", &mode)) { | ||
39 | dev_err(&pdev->dev, "missing mode configuration\n"); | ||
40 | return -EINVAL; | ||
41 | } | ||
42 | |||
43 | /* not required, so default to 0 if not present */ | ||
44 | of_property_read_u32(node, "qcom,crci", &crci); | ||
45 | |||
46 | dev_info(&pdev->dev, "GSBI port protocol: %d crci: %d\n", mode, crci); | ||
47 | |||
48 | hclk = devm_clk_get(&pdev->dev, "iface"); | ||
49 | if (IS_ERR(hclk)) | ||
50 | return PTR_ERR(hclk); | ||
51 | |||
52 | clk_prepare_enable(hclk); | ||
53 | |||
54 | writel_relaxed((mode << GSBI_PROTOCOL_SHIFT) | crci, | ||
55 | base + GSBI_CTRL_REG); | ||
56 | |||
57 | /* make sure the gsbi control write is not reordered */ | ||
58 | wmb(); | ||
59 | |||
60 | clk_disable_unprepare(hclk); | ||
61 | |||
62 | return of_platform_populate(pdev->dev.of_node, NULL, NULL, &pdev->dev); | ||
63 | } | ||
64 | |||
65 | static const struct of_device_id gsbi_dt_match[] = { | ||
66 | { .compatible = "qcom,gsbi-v1.0.0", }, | ||
67 | }; | ||
68 | |||
69 | MODULE_DEVICE_TABLE(of, gsbi_dt_match); | ||
70 | |||
71 | static struct platform_driver gsbi_driver = { | ||
72 | .driver = { | ||
73 | .name = "gsbi", | ||
74 | .owner = THIS_MODULE, | ||
75 | .of_match_table = gsbi_dt_match, | ||
76 | }, | ||
77 | .probe = gsbi_probe, | ||
78 | }; | ||
79 | |||
80 | module_platform_driver(gsbi_driver); | ||
81 | |||
82 | MODULE_AUTHOR("Andy Gross <agross@codeaurora.org>"); | ||
83 | MODULE_DESCRIPTION("QCOM GSBI driver"); | ||
84 | MODULE_LICENSE("GPL v2"); | ||