Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'qcom-drivers-for-3.16' of git://git.kernel.org/pub/scm/linux/kernel/git/galak/linux-qcom into next/drivers

Qualcomm ARM Based driver Updates for v3.16

* Introduce drivers/soc directory for misc SoC specific code
* Add driver to configure GSBI device

* tag 'qcom-drivers-for-3.16' of git://git.kernel.org/pub/scm/linux/kernel/git/galak/linux-qcom:
soc: qcom: Add GSBI driver
soc: Introduce drivers/soc place-holder for SOC specific drivers

Signed-off-by: Arnd Bergmann <arnd@arndb.de>

+111
+2
drivers/Kconfig
··· 132 132 133 133 source "drivers/platform/Kconfig" 134 134 135 + source "drivers/soc/Kconfig" 136 + 135 137 source "drivers/clk/Kconfig" 136 138 137 139 source "drivers/hwspinlock/Kconfig"
+3
drivers/Makefile
··· 33 33 # really early. 34 34 obj-$(CONFIG_DMADEVICES) += dma/ 35 35 36 + # SOC specific infrastructure drivers. 37 + obj-y += soc/ 38 + 36 39 obj-$(CONFIG_VIRTIO) += virtio/ 37 40 obj-$(CONFIG_XEN) += xen/ 38 41
+5
drivers/soc/Kconfig
··· 1 + menu "SOC (System On Chip) specific Drivers" 2 + 3 + source "drivers/soc/qcom/Kconfig" 4 + 5 + endmenu
+5
drivers/soc/Makefile
··· 1 + # 2 + # Makefile for the Linux Kernel SOC specific device drivers. 3 + # 4 + 5 + obj-$(CONFIG_ARCH_QCOM) += qcom/
+11
drivers/soc/qcom/Kconfig
··· 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 +
+1
drivers/soc/qcom/Makefile
··· 1 + obj-$(CONFIG_QCOM_GSBI) += qcom_gsbi.o
+84
drivers/soc/qcom/qcom_gsbi.c
··· 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");