mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-12 08:00:09 +00:00
for-4.20/libata-20181021
-----BEGIN PGP SIGNATURE----- iQJEBAABCAAuFiEEwPw5LcreJtl1+l5K99NY+ylx4KYFAlvNQMAQHGF4Ym9lQGtl cm5lbC5kawAKCRD301j7KXHgphwREACszKreKpeXYAq2Zkl9sEkwhIB10H5MLEY2 QnsCbRxAQzgAP6qsHbKFexLElCmjJI+UyIZfjKx8e2Xl0hG2upaWL10Y9vvVIgKI yfukWJ8u/xIVNmOGx6DUtwrIdt9pxKe2sHVrt7SQXrJtIACQTaQoOvYUsTCeTjsL Err6eIBNPso3t3fq3Pyc9Ifin12PRRbymuzU+8AHdpGxP3lmsB683ol+8Nvfhq1K 2U2LeS+AG2dOYqR4v2isT0eNZsqGRr63l6yv2vqOJfcCdeyqzZC//GLVL6TImy90 ucOm1p8PjcSWQg8dQ+JX4paCdij/N2rhB5I8icASaXeLdw2dQMveNUGvKUaABFRZ Y/ybPsH52iTHQJUjGnxgm87IXOwVbtPFbW+IdGXHjHearUMNE0j8kocrqHQDqdb8 RssN3RXmzlzoEOkH5lfh9zoLr2VQNUyh3jV4TPJDKRExnDvtUjURT9Jz/NdCvFxM aw/8CsLshM2YEGujBINrGeB/TtCaAbbhLkst962eG3nRB+/nwQY2+C0g9Vv6hSOn 4P2/j1zP+qPMqmxUoGQZ5mdNqOKdRyGoFYTvOHOilWkfJFmo8mRjJSxhbLiCHynN xLk5coNZF0Nx4/rcWYHvvXLEIpl0HX8HSb3ghDHNf0TDGqX7SKnk3ONnYGc/b5gP Iuc7uQvn4Q== =oK4l -----END PGP SIGNATURE----- Merge tag 'for-4.20/libata-20181021' of git://git.kernel.dk/linux-block Pull libata updates from Jens Axboe: "Here are the libata changes queued up for 4.20: - %pOFn device_node.name conversion (Rob Herring) - Use LBAM/LBAH password defines instead of hardcoding (Linus Walleij) - Series adding support for the allwinner R40 AHCI controller (Corentin Labbe) - Disable ALPM for Ampere Computing device (Suman Tripathi) - ahci bcrm fixes (Florian Fainelli) - Redundant Kconfig defaults (Bartlomiej Zolnierkiewicz) - Code cleanups (Nathan Chancellor)" * tag 'for-4.20/libata-20181021' of git://git.kernel.dk/linux-block: ata: remove redundant 'default n' from Kconfig ata: ep93xx: Use proper enums for directions ata: ahci_brcm: Allow using driver or DSL SoCs ata: ahci_brcm: Match BCM63138 compatible strings ata: ahci_brcm: Allow optional reset controller to be used dt-bindings: ata: Document BCM63138 compatible string pata_atiixp: Remove unnecessary parentheses ata: Disable AHCI ALPM feature for Ampere Computing eMAG SATA dt-bindings: ata: update ahci_sunxi bindings ata: ahci_sunxi: add support for r40 dt-bindings: ata: ahci-platform: document phy-supply ata: ahci_platform: add support for PHY controller regulator dt-bindings: ata: ahci-platform: document ahci-supply ata: ahci_platform: add support for AHCI controller regulator dt-bindings: ata: ahci-platform: fix indentation of target-supply libata: Use SMART LBAM/LBAH password defines ata: ahci: Convert to using %pOFn instead of device_node.name
This commit is contained in:
commit
13775dacca
@ -10,6 +10,7 @@ PHYs.
|
||||
Required properties:
|
||||
- compatible : compatible string, one of:
|
||||
- "allwinner,sun4i-a10-ahci"
|
||||
- "allwinner,sun8i-r40-ahci"
|
||||
- "brcm,iproc-ahci"
|
||||
- "hisilicon,hisi-ahci"
|
||||
- "cavium,octeon-7130-ahci"
|
||||
@ -31,8 +32,10 @@ Optional properties:
|
||||
- clocks : a list of phandle + clock specifier pairs
|
||||
- resets : a list of phandle + reset specifier pairs
|
||||
- target-supply : regulator for SATA target power
|
||||
- phy-supply : regulator for PHY power
|
||||
- phys : reference to the SATA PHY node
|
||||
- phy-names : must be "sata-phy"
|
||||
- ahci-supply : regulator for AHCI controller
|
||||
- ports-implemented : Mask that indicates which ports that the HBA supports
|
||||
are available for software to use. Useful if PORTS_IMPL
|
||||
is not programmed by the BIOS, which is true with
|
||||
@ -42,12 +45,13 @@ Required properties when using sub-nodes:
|
||||
- #address-cells : number of cells to encode an address
|
||||
- #size-cells : number of cells representing the size of an address
|
||||
|
||||
For allwinner,sun8i-r40-ahci, the reset propertie must be present.
|
||||
|
||||
Sub-nodes required properties:
|
||||
- reg : the port number
|
||||
And at least one of the following properties:
|
||||
- phys : reference to the SATA PHY node
|
||||
- target-supply : regulator for SATA target power
|
||||
- target-supply : regulator for SATA target power
|
||||
|
||||
Examples:
|
||||
sata@ffe08000 {
|
||||
|
@ -9,6 +9,7 @@ Required properties:
|
||||
"brcm,bcm7445-ahci"
|
||||
"brcm,bcm-nsp-ahci"
|
||||
"brcm,sata3-ahci"
|
||||
"brcm,bcm63138-ahci"
|
||||
- reg : register mappings for AHCI and SATA_TOP_CTRL
|
||||
- reg-names : "ahci" and "top-ctrl"
|
||||
- interrupts : interrupt mapping for SATA IRQ
|
||||
|
@ -33,7 +33,6 @@ if ATA
|
||||
|
||||
config ATA_NONSTANDARD
|
||||
bool
|
||||
default n
|
||||
|
||||
config ATA_VERBOSE_ERROR
|
||||
bool "Verbose ATA error reporting"
|
||||
@ -62,7 +61,6 @@ config ATA_ACPI
|
||||
config SATA_ZPODD
|
||||
bool "SATA Zero Power Optical Disc Drive (ZPODD) support"
|
||||
depends on ATA_ACPI && PM
|
||||
default n
|
||||
help
|
||||
This option adds support for SATA Zero Power Optical Disc
|
||||
Drive (ZPODD). It requires both the ODD and the platform
|
||||
@ -121,7 +119,8 @@ config SATA_AHCI_PLATFORM
|
||||
|
||||
config AHCI_BRCM
|
||||
tristate "Broadcom AHCI SATA support"
|
||||
depends on ARCH_BRCMSTB || BMIPS_GENERIC || ARCH_BCM_NSP
|
||||
depends on ARCH_BRCMSTB || BMIPS_GENERIC || ARCH_BCM_NSP || \
|
||||
ARCH_BCM_63XX
|
||||
help
|
||||
This option enables support for the AHCI SATA3 controller found on
|
||||
Broadcom SoC's.
|
||||
|
@ -352,6 +352,8 @@ struct ahci_host_priv {
|
||||
struct clk *clks[AHCI_MAX_CLKS]; /* Optional */
|
||||
struct reset_control *rsts; /* Optional */
|
||||
struct regulator **target_pwrs; /* Optional */
|
||||
struct regulator *ahci_regulator;/* Optional */
|
||||
struct regulator *phy_regulator;/* Optional */
|
||||
/*
|
||||
* If platform uses PHYs. There is a 1:1 relation between the port number and
|
||||
* the PHY position in this array.
|
||||
|
@ -25,6 +25,7 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/reset.h>
|
||||
#include <linux/string.h>
|
||||
|
||||
#include "ahci.h"
|
||||
@ -94,6 +95,7 @@ struct brcm_ahci_priv {
|
||||
u32 port_mask;
|
||||
u32 quirks;
|
||||
enum brcm_ahci_version version;
|
||||
struct reset_control *rcdev;
|
||||
};
|
||||
|
||||
static inline u32 brcm_sata_readreg(void __iomem *addr)
|
||||
@ -381,6 +383,7 @@ static struct scsi_host_template ahci_platform_sht = {
|
||||
static const struct of_device_id ahci_of_match[] = {
|
||||
{.compatible = "brcm,bcm7425-ahci", .data = (void *)BRCM_SATA_BCM7425},
|
||||
{.compatible = "brcm,bcm7445-ahci", .data = (void *)BRCM_SATA_BCM7445},
|
||||
{.compatible = "brcm,bcm63138-ahci", .data = (void *)BRCM_SATA_BCM7445},
|
||||
{.compatible = "brcm,bcm-nsp-ahci", .data = (void *)BRCM_SATA_NSP},
|
||||
{},
|
||||
};
|
||||
@ -411,6 +414,11 @@ static int brcm_ahci_probe(struct platform_device *pdev)
|
||||
if (IS_ERR(priv->top_ctrl))
|
||||
return PTR_ERR(priv->top_ctrl);
|
||||
|
||||
/* Reset is optional depending on platform */
|
||||
priv->rcdev = devm_reset_control_get(&pdev->dev, "ahci");
|
||||
if (!IS_ERR_OR_NULL(priv->rcdev))
|
||||
reset_control_deassert(priv->rcdev);
|
||||
|
||||
if ((priv->version == BRCM_SATA_BCM7425) ||
|
||||
(priv->version == BRCM_SATA_NSP)) {
|
||||
priv->quirks |= BRCM_AHCI_QUIRK_NO_NCQ;
|
||||
|
@ -33,6 +33,13 @@ static const struct ata_port_info ahci_port_info = {
|
||||
.port_ops = &ahci_platform_ops,
|
||||
};
|
||||
|
||||
static const struct ata_port_info ahci_port_info_nolpm = {
|
||||
.flags = AHCI_FLAG_COMMON | ATA_FLAG_NO_LPM,
|
||||
.pio_mask = ATA_PIO4,
|
||||
.udma_mask = ATA_UDMA6,
|
||||
.port_ops = &ahci_platform_ops,
|
||||
};
|
||||
|
||||
static struct scsi_host_template ahci_platform_sht = {
|
||||
AHCI_SHT(DRV_NAME),
|
||||
};
|
||||
@ -41,6 +48,7 @@ static int ahci_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct device *dev = &pdev->dev;
|
||||
struct ahci_host_priv *hpriv;
|
||||
const struct ata_port_info *port;
|
||||
int rc;
|
||||
|
||||
hpriv = ahci_platform_get_resources(pdev,
|
||||
@ -58,7 +66,11 @@ static int ahci_probe(struct platform_device *pdev)
|
||||
if (of_device_is_compatible(dev->of_node, "hisilicon,hisi-ahci"))
|
||||
hpriv->flags |= AHCI_HFLAG_NO_FBS | AHCI_HFLAG_NO_NCQ;
|
||||
|
||||
rc = ahci_platform_init_host(pdev, hpriv, &ahci_port_info,
|
||||
port = acpi_device_get_match_data(dev);
|
||||
if (!port)
|
||||
port = &ahci_port_info;
|
||||
|
||||
rc = ahci_platform_init_host(pdev, hpriv, port,
|
||||
&ahci_platform_sht);
|
||||
if (rc)
|
||||
goto disable_resources;
|
||||
@ -85,6 +97,7 @@ static const struct of_device_id ahci_of_match[] = {
|
||||
MODULE_DEVICE_TABLE(of, ahci_of_match);
|
||||
|
||||
static const struct acpi_device_id ahci_acpi_match[] = {
|
||||
{ "APMC0D33", (unsigned long)&ahci_port_info_nolpm },
|
||||
{ ACPI_DEVICE_CLASS(PCI_CLASS_STORAGE_SATA_AHCI, 0xffffff) },
|
||||
{},
|
||||
};
|
||||
|
@ -181,7 +181,7 @@ static int ahci_sunxi_probe(struct platform_device *pdev)
|
||||
struct ahci_host_priv *hpriv;
|
||||
int rc;
|
||||
|
||||
hpriv = ahci_platform_get_resources(pdev, 0);
|
||||
hpriv = ahci_platform_get_resources(pdev, AHCI_PLATFORM_GET_RESETS);
|
||||
if (IS_ERR(hpriv))
|
||||
return PTR_ERR(hpriv);
|
||||
|
||||
@ -250,6 +250,7 @@ static SIMPLE_DEV_PM_OPS(ahci_sunxi_pm_ops, ahci_platform_suspend,
|
||||
|
||||
static const struct of_device_id ahci_sunxi_of_match[] = {
|
||||
{ .compatible = "allwinner,sun4i-a10-ahci", },
|
||||
{ .compatible = "allwinner,sun8i-r40-ahci", },
|
||||
{ },
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, ahci_sunxi_of_match);
|
||||
|
@ -139,7 +139,7 @@ EXPORT_SYMBOL_GPL(ahci_platform_disable_clks);
|
||||
* ahci_platform_enable_regulators - Enable regulators
|
||||
* @hpriv: host private area to store config values
|
||||
*
|
||||
* This function enables all the regulators found in
|
||||
* This function enables all the regulators found in controller and
|
||||
* hpriv->target_pwrs, if any. If a regulator fails to be enabled, it
|
||||
* disables all the regulators already enabled in reverse order and
|
||||
* returns an error.
|
||||
@ -151,6 +151,18 @@ int ahci_platform_enable_regulators(struct ahci_host_priv *hpriv)
|
||||
{
|
||||
int rc, i;
|
||||
|
||||
if (hpriv->ahci_regulator) {
|
||||
rc = regulator_enable(hpriv->ahci_regulator);
|
||||
if (rc)
|
||||
return rc;
|
||||
}
|
||||
|
||||
if (hpriv->phy_regulator) {
|
||||
rc = regulator_enable(hpriv->phy_regulator);
|
||||
if (rc)
|
||||
goto disable_ahci_pwrs;
|
||||
}
|
||||
|
||||
for (i = 0; i < hpriv->nports; i++) {
|
||||
if (!hpriv->target_pwrs[i])
|
||||
continue;
|
||||
@ -167,6 +179,11 @@ disable_target_pwrs:
|
||||
if (hpriv->target_pwrs[i])
|
||||
regulator_disable(hpriv->target_pwrs[i]);
|
||||
|
||||
if (hpriv->phy_regulator)
|
||||
regulator_disable(hpriv->phy_regulator);
|
||||
disable_ahci_pwrs:
|
||||
if (hpriv->ahci_regulator)
|
||||
regulator_disable(hpriv->ahci_regulator);
|
||||
return rc;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ahci_platform_enable_regulators);
|
||||
@ -175,7 +192,8 @@ EXPORT_SYMBOL_GPL(ahci_platform_enable_regulators);
|
||||
* ahci_platform_disable_regulators - Disable regulators
|
||||
* @hpriv: host private area to store config values
|
||||
*
|
||||
* This function disables all regulators found in hpriv->target_pwrs.
|
||||
* This function disables all regulators found in hpriv->target_pwrs and
|
||||
* AHCI controller.
|
||||
*/
|
||||
void ahci_platform_disable_regulators(struct ahci_host_priv *hpriv)
|
||||
{
|
||||
@ -186,6 +204,11 @@ void ahci_platform_disable_regulators(struct ahci_host_priv *hpriv)
|
||||
continue;
|
||||
regulator_disable(hpriv->target_pwrs[i]);
|
||||
}
|
||||
|
||||
if (hpriv->ahci_regulator)
|
||||
regulator_disable(hpriv->ahci_regulator);
|
||||
if (hpriv->phy_regulator)
|
||||
regulator_disable(hpriv->phy_regulator);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ahci_platform_disable_regulators);
|
||||
/**
|
||||
@ -303,8 +326,8 @@ static int ahci_platform_get_phy(struct ahci_host_priv *hpriv, u32 port,
|
||||
/* No PHY support. Check if PHY is required. */
|
||||
if (of_find_property(node, "phys", NULL)) {
|
||||
dev_err(dev,
|
||||
"couldn't get PHY in node %s: ENOSYS\n",
|
||||
node->name);
|
||||
"couldn't get PHY in node %pOFn: ENOSYS\n",
|
||||
node);
|
||||
break;
|
||||
}
|
||||
/* fall through */
|
||||
@ -316,8 +339,8 @@ static int ahci_platform_get_phy(struct ahci_host_priv *hpriv, u32 port,
|
||||
|
||||
default:
|
||||
dev_err(dev,
|
||||
"couldn't get PHY in node %s: %d\n",
|
||||
node->name, rc);
|
||||
"couldn't get PHY in node %pOFn: %d\n",
|
||||
node, rc);
|
||||
|
||||
break;
|
||||
}
|
||||
@ -351,6 +374,7 @@ static int ahci_platform_get_regulator(struct ahci_host_priv *hpriv, u32 port,
|
||||
*
|
||||
* 1) mmio registers (IORESOURCE_MEM 0, mandatory)
|
||||
* 2) regulator for controlling the targets power (optional)
|
||||
* regulator for controlling the AHCI controller (optional)
|
||||
* 3) 0 - AHCI_MAX_CLKS clocks, as specified in the devs devicetree node,
|
||||
* or for non devicetree enabled platforms a single clock
|
||||
* 4) resets, if flags has AHCI_PLATFORM_GET_RESETS (optional)
|
||||
@ -408,6 +432,24 @@ struct ahci_host_priv *ahci_platform_get_resources(struct platform_device *pdev,
|
||||
hpriv->clks[i] = clk;
|
||||
}
|
||||
|
||||
hpriv->ahci_regulator = devm_regulator_get_optional(dev, "ahci");
|
||||
if (IS_ERR(hpriv->ahci_regulator)) {
|
||||
rc = PTR_ERR(hpriv->ahci_regulator);
|
||||
if (rc == -EPROBE_DEFER)
|
||||
goto err_out;
|
||||
rc = 0;
|
||||
hpriv->ahci_regulator = NULL;
|
||||
}
|
||||
|
||||
hpriv->phy_regulator = devm_regulator_get_optional(dev, "phy");
|
||||
if (IS_ERR(hpriv->phy_regulator)) {
|
||||
rc = PTR_ERR(hpriv->phy_regulator);
|
||||
if (rc == -EPROBE_DEFER)
|
||||
goto err_out;
|
||||
rc = 0;
|
||||
hpriv->phy_regulator = NULL;
|
||||
}
|
||||
|
||||
if (flags & AHCI_PLATFORM_GET_RESETS) {
|
||||
hpriv->rsts = devm_reset_control_array_get_optional_shared(dev);
|
||||
if (IS_ERR(hpriv->rsts)) {
|
||||
|
@ -639,8 +639,8 @@ int ata_cmd_ioctl(struct scsi_device *scsidev, void __user *arg)
|
||||
if (args[0] == ATA_CMD_SMART) { /* hack -- ide driver does this too */
|
||||
scsi_cmd[6] = args[3];
|
||||
scsi_cmd[8] = args[1];
|
||||
scsi_cmd[10] = 0x4f;
|
||||
scsi_cmd[12] = 0xc2;
|
||||
scsi_cmd[10] = ATA_SMART_LBAM_PASS;
|
||||
scsi_cmd[12] = ATA_SMART_LBAH_PASS;
|
||||
} else {
|
||||
scsi_cmd[6] = args[1];
|
||||
}
|
||||
|
@ -279,7 +279,7 @@ static int atiixp_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||
const struct ata_port_info *ppi[] = { &info, &info };
|
||||
|
||||
/* SB600 doesn't have secondary port wired */
|
||||
if((pdev->device == PCI_DEVICE_ID_ATI_IXP600_IDE))
|
||||
if (pdev->device == PCI_DEVICE_ID_ATI_IXP600_IDE)
|
||||
ppi[1] = &ata_dummy_port_info;
|
||||
|
||||
return ata_pci_bmdma_init_one(pdev, ppi, &atiixp_sht, NULL,
|
||||
|
@ -659,7 +659,7 @@ static void ep93xx_pata_dma_init(struct ep93xx_pata_data *drv_data)
|
||||
* start of new transfer.
|
||||
*/
|
||||
drv_data->dma_rx_data.port = EP93XX_DMA_IDE;
|
||||
drv_data->dma_rx_data.direction = DMA_FROM_DEVICE;
|
||||
drv_data->dma_rx_data.direction = DMA_DEV_TO_MEM;
|
||||
drv_data->dma_rx_data.name = "ep93xx-pata-rx";
|
||||
drv_data->dma_rx_channel = dma_request_channel(mask,
|
||||
ep93xx_pata_dma_filter, &drv_data->dma_rx_data);
|
||||
@ -667,7 +667,7 @@ static void ep93xx_pata_dma_init(struct ep93xx_pata_data *drv_data)
|
||||
return;
|
||||
|
||||
drv_data->dma_tx_data.port = EP93XX_DMA_IDE;
|
||||
drv_data->dma_tx_data.direction = DMA_TO_DEVICE;
|
||||
drv_data->dma_tx_data.direction = DMA_MEM_TO_DEV;
|
||||
drv_data->dma_tx_data.name = "ep93xx-pata-tx";
|
||||
drv_data->dma_tx_channel = dma_request_channel(mask,
|
||||
ep93xx_pata_dma_filter, &drv_data->dma_tx_data);
|
||||
@ -678,7 +678,7 @@ static void ep93xx_pata_dma_init(struct ep93xx_pata_data *drv_data)
|
||||
|
||||
/* Configure receive channel direction and source address */
|
||||
memset(&conf, 0, sizeof(conf));
|
||||
conf.direction = DMA_FROM_DEVICE;
|
||||
conf.direction = DMA_DEV_TO_MEM;
|
||||
conf.src_addr = drv_data->udma_in_phys;
|
||||
conf.src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
|
||||
if (dmaengine_slave_config(drv_data->dma_rx_channel, &conf)) {
|
||||
@ -689,7 +689,7 @@ static void ep93xx_pata_dma_init(struct ep93xx_pata_data *drv_data)
|
||||
|
||||
/* Configure transmit channel direction and destination address */
|
||||
memset(&conf, 0, sizeof(conf));
|
||||
conf.direction = DMA_TO_DEVICE;
|
||||
conf.direction = DMA_MEM_TO_DEV;
|
||||
conf.dst_addr = drv_data->udma_out_phys;
|
||||
conf.dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
|
||||
if (dmaengine_slave_config(drv_data->dma_tx_channel, &conf)) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user