diff options
| -rw-r--r-- | drivers/soc/Kconfig | 2 | ||||
| -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 |
5 files changed, 103 insertions, 0 deletions
diff --git a/drivers/soc/Kconfig b/drivers/soc/Kconfig index 339baa87336f..c8543855aa82 100644 --- a/drivers/soc/Kconfig +++ b/drivers/soc/Kconfig | |||
| @@ -1,3 +1,5 @@ | |||
| 1 | menu "SOC (System On Chip) specific Drivers" | 1 | menu "SOC (System On Chip) specific Drivers" |
| 2 | 2 | ||
| 3 | source "drivers/soc/qcom/Kconfig" | ||
| 4 | |||
| 3 | endmenu | 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"); | ||
