diff options
author | Srinivas Kandagatla <srinivas.kandagatla@linaro.org> | 2014-08-19 10:54:08 +0100 |
---|---|---|
committer | Srinivas Kandagatla <srinivas.kandagatla@linaro.org> | 2014-08-19 10:54:08 +0100 |
commit | c36824b5ecb2b568b17cf2bbc35ecc93f628ae9b (patch) | |
tree | 6aa4c00b4cf825fd42f92740225960ef5ed392dd | |
parent | f51055017f6102cca4799185e20367d04a16cfa7 (diff) | |
parent | 02956087e33d27d3b59484c4140fb66b73a2ddbb (diff) |
Merge branch 'tracking-qcomlt-sata' into integration-linux-qcomlt
* tracking-qcomlt-sata:
ahci: Increase AHCI_MAX_CLKS to 8
ata: Add Qualcomm ARM SoC AHCI SATA host controller driver
phy: qcom: Add device tree bindings information
-rw-r--r-- | Documentation/devicetree/bindings/phy/qcom-phy.txt | 23 | ||||
-rw-r--r-- | drivers/ata/Kconfig | 10 | ||||
-rw-r--r-- | drivers/ata/Makefile | 1 | ||||
-rw-r--r-- | drivers/ata/ahci.h | 2 | ||||
-rw-r--r-- | drivers/ata/ahci_qcom.c | 89 |
5 files changed, 124 insertions, 1 deletions
diff --git a/Documentation/devicetree/bindings/phy/qcom-phy.txt b/Documentation/devicetree/bindings/phy/qcom-phy.txt new file mode 100644 index 000000000000..76bfbd056202 --- /dev/null +++ b/Documentation/devicetree/bindings/phy/qcom-phy.txt @@ -0,0 +1,23 @@ +Qualcomm IPQ806x SATA PHY Controller +------------------------------------ + +SATA PHY nodes are defined to describe on-chip SATA Physical layer controllers. +Each SATA PHY controller should have its own node. + +Required properties: +- compatible: compatible list, contains "qcom,ipq806x-sata-phy" +- reg: offset and length of the SATA PHY register set; +- #phy-cells: must be zero +- clocks: must be exactly one entry +- clock-names: must be "cfg" + +Example: + sata_phy: sata-phy@1b400000 { + compatible = "qcom,ipq806x-sata-phy"; + reg = <0x1b400000 0x200>; + + clocks = <&gcc SATA_PHY_CFG_CLK>; + clock-names = "cfg"; + + #phy-cells = <0>; + }; diff --git a/drivers/ata/Kconfig b/drivers/ata/Kconfig index e1b92788c225..165d2faee9b3 100644 --- a/drivers/ata/Kconfig +++ b/drivers/ata/Kconfig @@ -133,6 +133,16 @@ config AHCI_MVEBU If unsure, say N. +config AHCI_QCOM + tristate "Qualcomm AHCI SATA support" + depends on ARCH_QCOM + help + This option enables support for AHCI SATA controller + integrated into Qualcomm ARM SoC chipsets. For more + information please refer to http://www.qualcomm.com/chipsets. + + If unsure, say N. + config AHCI_SUNXI tristate "Allwinner sunxi AHCI SATA support" depends on ARCH_SUNXI diff --git a/drivers/ata/Makefile b/drivers/ata/Makefile index ae41107afc1f..812435c59aec 100644 --- a/drivers/ata/Makefile +++ b/drivers/ata/Makefile @@ -13,6 +13,7 @@ obj-$(CONFIG_SATA_HIGHBANK) += sata_highbank.o libahci.o obj-$(CONFIG_AHCI_DA850) += ahci_da850.o libahci.o libahci_platform.o obj-$(CONFIG_AHCI_IMX) += ahci_imx.o libahci.o libahci_platform.o obj-$(CONFIG_AHCI_MVEBU) += ahci_mvebu.o libahci.o libahci_platform.o +obj-$(CONFIG_AHCI_QCOM) += ahci_qcom.o libahci.o libahci_platform.o obj-$(CONFIG_AHCI_SUNXI) += ahci_sunxi.o libahci.o libahci_platform.o obj-$(CONFIG_AHCI_ST) += ahci_st.o libahci.o libahci_platform.o obj-$(CONFIG_AHCI_TEGRA) += ahci_tegra.o libahci.o libahci_platform.o diff --git a/drivers/ata/ahci.h b/drivers/ata/ahci.h index 59ae0ee00149..36ae69a8e4e3 100644 --- a/drivers/ata/ahci.h +++ b/drivers/ata/ahci.h @@ -53,7 +53,7 @@ enum { AHCI_MAX_PORTS = 32, - AHCI_MAX_CLKS = 4, + AHCI_MAX_CLKS = 8, AHCI_MAX_SG = 168, /* hardware max is 64K */ AHCI_DMA_BOUNDARY = 0xffffffff, AHCI_MAX_CMDS = 32, diff --git a/drivers/ata/ahci_qcom.c b/drivers/ata/ahci_qcom.c new file mode 100644 index 000000000000..9cf144ab7a25 --- /dev/null +++ b/drivers/ata/ahci_qcom.c @@ -0,0 +1,89 @@ +/* + * Qualcomm ARM SoC AHCI SATA platform driver + * + * based on the AHCI SATA platform driver by Jeff Garzik and Anton Vorontsov + * + * Copyright (c) 2014, The Linux Foundation. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 and + * only version 2 as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include <linux/kernel.h> +#include <linux/module.h> +#include <linux/pm.h> +#include <linux/device.h> +#include <linux/platform_device.h> +#include <linux/libata.h> +#include <linux/ahci_platform.h> +#include "ahci.h" + +static const struct ata_port_info qcom_ahci_port_info = { + .flags = AHCI_FLAG_COMMON, + .pio_mask = ATA_PIO4, + .udma_mask = ATA_UDMA6, + .port_ops = &ahci_platform_ops, +}; + +static int qcom_ahci_probe(struct platform_device *pdev) +{ + struct ahci_host_priv *hpriv; + struct clk *rxoob_clk; + int rc; + + hpriv = ahci_platform_get_resources(pdev); + if (IS_ERR(hpriv)) + return PTR_ERR(hpriv); + + /* Try and set the rxoob clk to 100Mhz */ + rxoob_clk = devm_clk_get(&pdev->dev, "rxoob"); + if (IS_ERR(rxoob_clk)) + return PTR_ERR(rxoob_clk); + + rc = clk_set_rate(rxoob_clk, 100000000); + if (rc) + return rc; + + devm_clk_put(&pdev->dev, rxoob_clk); + + rc = ahci_platform_enable_resources(hpriv); + if (rc) + return rc; + + rc = ahci_platform_init_host(pdev, hpriv, &qcom_ahci_port_info); + if (rc) + goto disable_resources; + + return 0; +disable_resources: + ahci_platform_disable_resources(hpriv); + return rc; +} + +static const struct of_device_id qcom_ahci_of_match[] = { + { .compatible = "qcom,msm-ahci", }, + {}, +}; +MODULE_DEVICE_TABLE(of, qcom_ahci_of_match); + +static struct platform_driver qcom_ahci_driver = { + .probe = qcom_ahci_probe, + .remove = ata_platform_remove_one, + .driver = { + .name = "qcom_ahci_qcom", + .owner = THIS_MODULE, + .of_match_table = qcom_ahci_of_match, + }, + /* suspend/resume not currently supported */ +}; +module_platform_driver(qcom_ahci_driver); + +MODULE_DESCRIPTION("Qualcomm AHCI SATA platform driver"); +MODULE_LICENSE("GPL v2"); +MODULE_ALIAS("ahci:qcom"); |