2019-05-20 20:08:10 +03:00
// SPDX-License-Identifier: GPL-2.0-or-later
2010-03-04 20:06:06 +03:00
/*
* AHCI SATA platform driver
*
* Copyright 2004 - 2005 Red Hat , Inc .
* Jeff Garzik < jgarzik @ pobox . com >
* Copyright 2010 MontaVista Software , LLC .
* Anton Vorontsov < avorontsov @ ru . mvista . com >
*/
# include <linux/kernel.h>
# include <linux/module.h>
2012-03-16 14:19:55 +04:00
# include <linux/pm.h>
2010-03-04 20:06:06 +03:00
# include <linux/device.h>
2014-05-14 10:13:42 +04:00
# include <linux/of_device.h>
2010-03-04 20:06:06 +03:00
# include <linux/platform_device.h>
# include <linux/libata.h>
# include <linux/ahci_platform.h>
ata: ahci_platform: Add ACPI _CLS matching
This patch adds ACPI supports for AHCI platform driver, which uses _CLS
method to match the device.
The following is an example of ASL structure in DSDT for a SATA controller,
which contains _CLS package to be matched by the ahci_platform driver:
Device (AHC0) // AHCI Controller
{
Name(_HID, "AMDI0600")
Name (_CCA, 1)
Name (_CLS, Package (3)
{
0x01, // Base Class: Mass Storage
0x06, // Sub-Class: serial ATA
0x01, // Interface: AHCI
})
Name (_CRS, ResourceTemplate ()
{
Memory32Fixed (ReadWrite, 0xE0300000, 0x00010000)
Interrupt (ResourceConsumer, Level, ActiveHigh, Exclusive,,,) { 387 }
})
}
Also, since ATA driver should not require PCI support for ATA_ACPI,
this patch removes dependency in the driver/ata/Kconfig.
Acked-by: Tejun Heo <tj@kernel.org>
Acked-by: Mika Westerberg <mika.westerberg@linux.intel.com>
Reviewed-by: Hanjun Guo <hanjun.guo@linaro.org>
Signed-off-by: Suravee Suthikulpanit <Suravee.Suthikulpanit@amd.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
2015-07-07 02:55:21 +03:00
# include <linux/acpi.h>
# include <linux/pci_ids.h>
2010-03-04 20:06:06 +03:00
# include "ahci.h"
2015-01-29 02:30:29 +03:00
# define DRV_NAME "ahci"
2014-02-22 20:22:54 +04:00
static const struct ata_port_info ahci_port_info = {
. flags = AHCI_FLAG_COMMON ,
. pio_mask = ATA_PIO4 ,
. udma_mask = ATA_UDMA6 ,
. port_ops = & ahci_platform_ops ,
2011-09-28 11:41:54 +04:00
} ;
2018-09-07 17:32:17 +03:00
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 ,
} ;
2015-01-29 02:30:29 +03:00
static struct scsi_host_template ahci_platform_sht = {
AHCI_SHT ( DRV_NAME ) ,
} ;
2014-02-22 19:53:34 +04:00
static int ahci_probe ( struct platform_device * pdev )
{
struct device * dev = & pdev - > dev ;
struct ahci_host_priv * hpriv ;
2018-09-07 17:32:17 +03:00
const struct ata_port_info * port ;
2014-02-22 19:53:34 +04:00
int rc ;
2018-08-22 15:13:03 +03:00
hpriv = ahci_platform_get_resources ( pdev ,
AHCI_PLATFORM_GET_RESETS ) ;
2014-02-22 19:53:34 +04:00
if ( IS_ERR ( hpriv ) )
return PTR_ERR ( hpriv ) ;
rc = ahci_platform_enable_resources ( hpriv ) ;
if ( rc )
return rc ;
2016-04-01 10:52:57 +03:00
of_property_read_u32 ( dev - > of_node ,
" ports-implemented " , & hpriv - > force_port_map ) ;
2014-05-14 10:13:42 +04:00
if ( of_device_is_compatible ( dev - > of_node , " hisilicon,hisi-ahci " ) )
2014-07-30 22:13:56 +04:00
hpriv - > flags | = AHCI_HFLAG_NO_FBS | AHCI_HFLAG_NO_NCQ ;
2014-05-14 10:13:42 +04:00
2018-09-07 17:32:17 +03:00
port = acpi_device_get_match_data ( dev ) ;
if ( ! port )
port = & ahci_port_info ;
rc = ahci_platform_init_host ( pdev , hpriv , port ,
2015-01-29 02:30:29 +03:00
& ahci_platform_sht ) ;
2010-03-04 20:06:06 +03:00
if ( rc )
2014-08-12 20:22:27 +04:00
goto disable_resources ;
2010-03-04 20:06:06 +03:00
return 0 ;
2014-02-22 19:53:33 +04:00
disable_resources :
ahci_platform_disable_resources ( hpriv ) ;
2010-03-04 20:06:06 +03:00
return rc ;
}
2014-02-22 19:53:35 +04:00
static SIMPLE_DEV_PM_OPS ( ahci_pm_ops , ahci_platform_suspend ,
ahci_platform_resume ) ;
2012-03-16 14:19:55 +04:00
2010-11-04 05:04:59 +03:00
static const struct of_device_id ahci_of_match [ ] = {
2014-07-30 22:13:58 +04:00
{ . compatible = " generic-ahci " , } ,
/* Keep the following compatibles for device tree compatibility */
2012-04-21 16:10:12 +04:00
{ . compatible = " snps,spear-ahci " , } ,
2013-11-22 06:08:29 +04:00
{ . compatible = " ibm,476gtr-ahci " , } ,
2014-02-22 19:53:38 +04:00
{ . compatible = " snps,dwc-ahci " , } ,
2014-05-14 10:13:42 +04:00
{ . compatible = " hisilicon,hisi-ahci " , } ,
2016-02-11 16:53:08 +03:00
{ . compatible = " cavium,octeon-7130-ahci " , } ,
2010-11-04 05:04:59 +03:00
{ } ,
} ;
MODULE_DEVICE_TABLE ( of , ahci_of_match ) ;
ata: ahci_platform: Add ACPI _CLS matching
This patch adds ACPI supports for AHCI platform driver, which uses _CLS
method to match the device.
The following is an example of ASL structure in DSDT for a SATA controller,
which contains _CLS package to be matched by the ahci_platform driver:
Device (AHC0) // AHCI Controller
{
Name(_HID, "AMDI0600")
Name (_CCA, 1)
Name (_CLS, Package (3)
{
0x01, // Base Class: Mass Storage
0x06, // Sub-Class: serial ATA
0x01, // Interface: AHCI
})
Name (_CRS, ResourceTemplate ()
{
Memory32Fixed (ReadWrite, 0xE0300000, 0x00010000)
Interrupt (ResourceConsumer, Level, ActiveHigh, Exclusive,,,) { 387 }
})
}
Also, since ATA driver should not require PCI support for ATA_ACPI,
this patch removes dependency in the driver/ata/Kconfig.
Acked-by: Tejun Heo <tj@kernel.org>
Acked-by: Mika Westerberg <mika.westerberg@linux.intel.com>
Reviewed-by: Hanjun Guo <hanjun.guo@linaro.org>
Signed-off-by: Suravee Suthikulpanit <Suravee.Suthikulpanit@amd.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
2015-07-07 02:55:21 +03:00
static const struct acpi_device_id ahci_acpi_match [ ] = {
2018-09-07 17:32:17 +03:00
{ " APMC0D33 " , ( unsigned long ) & ahci_port_info_nolpm } ,
ata: ahci_platform: Add ACPI _CLS matching
This patch adds ACPI supports for AHCI platform driver, which uses _CLS
method to match the device.
The following is an example of ASL structure in DSDT for a SATA controller,
which contains _CLS package to be matched by the ahci_platform driver:
Device (AHC0) // AHCI Controller
{
Name(_HID, "AMDI0600")
Name (_CCA, 1)
Name (_CLS, Package (3)
{
0x01, // Base Class: Mass Storage
0x06, // Sub-Class: serial ATA
0x01, // Interface: AHCI
})
Name (_CRS, ResourceTemplate ()
{
Memory32Fixed (ReadWrite, 0xE0300000, 0x00010000)
Interrupt (ResourceConsumer, Level, ActiveHigh, Exclusive,,,) { 387 }
})
}
Also, since ATA driver should not require PCI support for ATA_ACPI,
this patch removes dependency in the driver/ata/Kconfig.
Acked-by: Tejun Heo <tj@kernel.org>
Acked-by: Mika Westerberg <mika.westerberg@linux.intel.com>
Reviewed-by: Hanjun Guo <hanjun.guo@linaro.org>
Signed-off-by: Suravee Suthikulpanit <Suravee.Suthikulpanit@amd.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
2015-07-07 02:55:21 +03:00
{ ACPI_DEVICE_CLASS ( PCI_CLASS_STORAGE_SATA_AHCI , 0xffffff ) } ,
{ } ,
} ;
MODULE_DEVICE_TABLE ( acpi , ahci_acpi_match ) ;
2010-03-04 20:06:06 +03:00
static struct platform_driver ahci_driver = {
2012-11-02 11:46:15 +04:00
. probe = ahci_probe ,
2012-11-02 11:46:19 +04:00
. remove = ata_platform_remove_one ,
2017-07-20 22:26:24 +03:00
. shutdown = ahci_platform_shutdown ,
2010-03-04 20:06:06 +03:00
. driver = {
2015-01-29 02:30:29 +03:00
. name = DRV_NAME ,
2010-11-04 05:04:59 +03:00
. of_match_table = ahci_of_match ,
ata: ahci_platform: Add ACPI _CLS matching
This patch adds ACPI supports for AHCI platform driver, which uses _CLS
method to match the device.
The following is an example of ASL structure in DSDT for a SATA controller,
which contains _CLS package to be matched by the ahci_platform driver:
Device (AHC0) // AHCI Controller
{
Name(_HID, "AMDI0600")
Name (_CCA, 1)
Name (_CLS, Package (3)
{
0x01, // Base Class: Mass Storage
0x06, // Sub-Class: serial ATA
0x01, // Interface: AHCI
})
Name (_CRS, ResourceTemplate ()
{
Memory32Fixed (ReadWrite, 0xE0300000, 0x00010000)
Interrupt (ResourceConsumer, Level, ActiveHigh, Exclusive,,,) { 387 }
})
}
Also, since ATA driver should not require PCI support for ATA_ACPI,
this patch removes dependency in the driver/ata/Kconfig.
Acked-by: Tejun Heo <tj@kernel.org>
Acked-by: Mika Westerberg <mika.westerberg@linux.intel.com>
Reviewed-by: Hanjun Guo <hanjun.guo@linaro.org>
Signed-off-by: Suravee Suthikulpanit <Suravee.Suthikulpanit@amd.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
2015-07-07 02:55:21 +03:00
. acpi_match_table = ahci_acpi_match ,
2011-11-18 23:10:10 +04:00
. pm = & ahci_pm_ops ,
2010-03-04 20:06:06 +03:00
} ,
} ;
2012-11-02 11:46:16 +04:00
module_platform_driver ( ahci_driver ) ;
2010-03-04 20:06:06 +03:00
MODULE_DESCRIPTION ( " AHCI SATA platform driver " ) ;
MODULE_AUTHOR ( " Anton Vorontsov <avorontsov@ru.mvista.com> " ) ;
MODULE_LICENSE ( " GPL " ) ;
MODULE_ALIAS ( " platform:ahci " ) ;