mirror of
https://github.com/linux-msm/laptops-kernel.git
synced 2026-08-13 14:19:53 -07:00
libata-sff: separate out BMDMA init
Separate out ata_pci_bmdma_prepare_host() and ata_pci_bmdma_init_one() from their SFF counterparts. SFF ones no longer try to initialize BMDMA or set PCI master. Signed-off-by: Tejun Heo <tj@kernel.org> Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
This commit is contained in:
1 parent
c3b2889424
commit
1c5afdf7a6
41 files changed
+166
-66
No files matched your search
@@ -155,7 +155,7 @@ static int ata_generic_init_one(struct pci_dev *dev, const struct pci_device_id
|
||||
return rc;
|
||||
pcim_pin_device(dev);
|
||||
}
|
||||
return ata_pci_sff_init_one(dev, ppi, &generic_sht, NULL, 0);
|
||||
return ata_pci_bmdma_init_one(dev, ppi, &generic_sht, NULL, 0);
|
||||
}
|
||||
|
||||
static struct pci_device_id ata_generic[] = {
|
||||
|
||||
@@ -1589,7 +1589,7 @@ static int __devinit piix_init_one(struct pci_dev *pdev,
|
||||
hpriv->map = piix_init_sata_map(pdev, port_info,
|
||||
piix_map_db_table[ent->driver_data]);
|
||||
|
||||
rc = ata_pci_sff_prepare_host(pdev, ppi, &host);
|
||||
rc = ata_pci_bmdma_prepare_host(pdev, ppi, &host);
|
||||
if (rc)
|
||||
return rc;
|
||||
host->private_data = hpriv;
|
||||
|
||||
+114
-24
@@ -2315,13 +2315,13 @@ int ata_pci_sff_init_host(struct ata_host *host)
|
||||
EXPORT_SYMBOL_GPL(ata_pci_sff_init_host);
|
||||
|
||||
/**
|
||||
* ata_pci_sff_prepare_host - helper to prepare native PCI ATA host
|
||||
* ata_pci_sff_prepare_host - helper to prepare PCI PIO-only SFF ATA host
|
||||
* @pdev: target PCI device
|
||||
* @ppi: array of port_info, must be enough for two ports
|
||||
* @r_host: out argument for the initialized ATA host
|
||||
*
|
||||
* Helper to allocate ATA host for @pdev, acquire all native PCI
|
||||
* resources and initialize it accordingly in one go.
|
||||
* Helper to allocate PIO-only SFF ATA host for @pdev, acquire
|
||||
* all PCI resources and initialize it accordingly in one go.
|
||||
*
|
||||
* LOCKING:
|
||||
* Inherited from calling layer (may sleep).
|
||||
@@ -2351,9 +2351,6 @@ int ata_pci_sff_prepare_host(struct pci_dev *pdev,
|
||||
if (rc)
|
||||
goto err_out;
|
||||
|
||||
/* init DMA related stuff */
|
||||
ata_pci_bmdma_init(host);
|
||||
|
||||
devres_remove_group(&pdev->dev, NULL);
|
||||
*r_host = host;
|
||||
return 0;
|
||||
@@ -2458,8 +2455,21 @@ out:
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ata_pci_sff_activate_host);
|
||||
|
||||
static const struct ata_port_info *ata_sff_find_valid_pi(
|
||||
const struct ata_port_info * const *ppi)
|
||||
{
|
||||
int i;
|
||||
|
||||
/* look up the first valid port_info */
|
||||
for (i = 0; i < 2 && ppi[i]; i++)
|
||||
if (ppi[i]->port_ops != &ata_dummy_port_ops)
|
||||
return ppi[i];
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* ata_pci_sff_init_one - Initialize/register PCI IDE host controller
|
||||
* ata_pci_sff_init_one - Initialize/register PIO-only PCI IDE controller
|
||||
* @pdev: Controller to be initialized
|
||||
* @ppi: array of port_info, must be enough for two ports
|
||||
* @sht: scsi_host_template to use when registering the host
|
||||
@@ -2468,11 +2478,7 @@ EXPORT_SYMBOL_GPL(ata_pci_sff_activate_host);
|
||||
*
|
||||
* This is a helper function which can be called from a driver's
|
||||
* xxx_init_one() probe function if the hardware uses traditional
|
||||
* IDE taskfile registers.
|
||||
*
|
||||
* This function calls pci_enable_device(), reserves its register
|
||||
* regions, sets the dma mask, enables bus master mode, and calls
|
||||
* ata_device_add()
|
||||
* IDE taskfile registers and is PIO only.
|
||||
*
|
||||
* ASSUMPTION:
|
||||
* Nobody makes a single channel controller that appears solely as
|
||||
@@ -2489,20 +2495,13 @@ int ata_pci_sff_init_one(struct pci_dev *pdev,
|
||||
struct scsi_host_template *sht, void *host_priv, int hflag)
|
||||
{
|
||||
struct device *dev = &pdev->dev;
|
||||
const struct ata_port_info *pi = NULL;
|
||||
const struct ata_port_info *pi;
|
||||
struct ata_host *host = NULL;
|
||||
int i, rc;
|
||||
int rc;
|
||||
|
||||
DPRINTK("ENTER\n");
|
||||
|
||||
/* look up the first valid port_info */
|
||||
for (i = 0; i < 2 && ppi[i]; i++) {
|
||||
if (ppi[i]->port_ops != &ata_dummy_port_ops) {
|
||||
pi = ppi[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
pi = ata_sff_find_valid_pi(ppi);
|
||||
if (!pi) {
|
||||
dev_printk(KERN_ERR, &pdev->dev,
|
||||
"no valid port_info specified\n");
|
||||
@@ -2523,8 +2522,7 @@ int ata_pci_sff_init_one(struct pci_dev *pdev,
|
||||
host->private_data = host_priv;
|
||||
host->flags |= hflag;
|
||||
|
||||
pci_set_master(pdev);
|
||||
rc = ata_pci_sff_activate_host(host, ata_bmdma_interrupt, sht);
|
||||
rc = ata_pci_sff_activate_host(host, ata_sff_interrupt, sht);
|
||||
out:
|
||||
if (rc == 0)
|
||||
devres_remove_group(&pdev->dev, NULL);
|
||||
@@ -3196,6 +3194,98 @@ void ata_pci_bmdma_init(struct ata_host *host)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ata_pci_bmdma_init);
|
||||
|
||||
/**
|
||||
* ata_pci_bmdma_prepare_host - helper to prepare PCI BMDMA ATA host
|
||||
* @pdev: target PCI device
|
||||
* @ppi: array of port_info, must be enough for two ports
|
||||
* @r_host: out argument for the initialized ATA host
|
||||
*
|
||||
* Helper to allocate BMDMA ATA host for @pdev, acquire all PCI
|
||||
* resources and initialize it accordingly in one go.
|
||||
*
|
||||
* LOCKING:
|
||||
* Inherited from calling layer (may sleep).
|
||||
*
|
||||
* RETURNS:
|
||||
* 0 on success, -errno otherwise.
|
||||
*/
|
||||
int ata_pci_bmdma_prepare_host(struct pci_dev *pdev,
|
||||
const struct ata_port_info * const * ppi,
|
||||
struct ata_host **r_host)
|
||||
{
|
||||
int rc;
|
||||
|
||||
rc = ata_pci_sff_prepare_host(pdev, ppi, r_host);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
ata_pci_bmdma_init(*r_host);
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ata_pci_bmdma_prepare_host);
|
||||
|
||||
/**
|
||||
* ata_pci_bmdma_init_one - Initialize/register BMDMA PCI IDE controller
|
||||
* @pdev: Controller to be initialized
|
||||
* @ppi: array of port_info, must be enough for two ports
|
||||
* @sht: scsi_host_template to use when registering the host
|
||||
* @host_priv: host private_data
|
||||
* @hflags: host flags
|
||||
*
|
||||
* This function is similar to ata_pci_sff_init_one() but also
|
||||
* takes care of BMDMA initialization.
|
||||
*
|
||||
* LOCKING:
|
||||
* Inherited from PCI layer (may sleep).
|
||||
*
|
||||
* RETURNS:
|
||||
* Zero on success, negative on errno-based value on error.
|
||||
*/
|
||||
int ata_pci_bmdma_init_one(struct pci_dev *pdev,
|
||||
const struct ata_port_info * const * ppi,
|
||||
struct scsi_host_template *sht, void *host_priv,
|
||||
int hflags)
|
||||
{
|
||||
struct device *dev = &pdev->dev;
|
||||
const struct ata_port_info *pi;
|
||||
struct ata_host *host = NULL;
|
||||
int rc;
|
||||
|
||||
DPRINTK("ENTER\n");
|
||||
|
||||
pi = ata_sff_find_valid_pi(ppi);
|
||||
if (!pi) {
|
||||
dev_printk(KERN_ERR, &pdev->dev,
|
||||
"no valid port_info specified\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (!devres_open_group(dev, NULL, GFP_KERNEL))
|
||||
return -ENOMEM;
|
||||
|
||||
rc = pcim_enable_device(pdev);
|
||||
if (rc)
|
||||
goto out;
|
||||
|
||||
/* prepare and activate BMDMA host */
|
||||
rc = ata_pci_bmdma_prepare_host(pdev, ppi, &host);
|
||||
if (rc)
|
||||
goto out;
|
||||
host->private_data = host_priv;
|
||||
host->flags |= hflags;
|
||||
|
||||
pci_set_master(pdev);
|
||||
rc = ata_pci_sff_activate_host(host, ata_bmdma_interrupt, sht);
|
||||
out:
|
||||
if (rc == 0)
|
||||
devres_remove_group(&pdev->dev, NULL);
|
||||
else
|
||||
devres_release_group(&pdev->dev, NULL);
|
||||
|
||||
return rc;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ata_pci_bmdma_init_one);
|
||||
|
||||
#endif /* CONFIG_PCI */
|
||||
|
||||
/**
|
||||
|
||||
@@ -260,7 +260,7 @@ static int pacpi_init_one (struct pci_dev *pdev, const struct pci_device_id *id)
|
||||
return rc;
|
||||
pcim_pin_device(pdev);
|
||||
}
|
||||
return ata_pci_sff_init_one(pdev, ppi, &pacpi_sht, NULL, 0);
|
||||
return ata_pci_bmdma_init_one(pdev, ppi, &pacpi_sht, NULL, 0);
|
||||
}
|
||||
|
||||
static const struct pci_device_id pacpi_pci_tbl[] = {
|
||||
|
||||
@@ -583,7 +583,10 @@ static int ali_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||
ppi[0] = &info_20_udma;
|
||||
}
|
||||
|
||||
return ata_pci_sff_init_one(pdev, ppi, &ali_sht, NULL, 0);
|
||||
if (!ppi[0]->mwdma_mask && !ppi[0]->udma_mask)
|
||||
return ata_pci_sff_init_one(pdev, ppi, &ali_sht, NULL, 0);
|
||||
else
|
||||
return ata_pci_bmdma_init_one(pdev, ppi, &ali_sht, NULL, 0);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
|
||||
@@ -574,7 +574,7 @@ static int amd_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||
}
|
||||
|
||||
/* And fire it up */
|
||||
return ata_pci_sff_init_one(pdev, ppi, &amd_sht, hpriv, 0);
|
||||
return ata_pci_bmdma_init_one(pdev, ppi, &amd_sht, hpriv, 0);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
|
||||
@@ -421,7 +421,7 @@ static int artop_init_one (struct pci_dev *pdev, const struct pci_device_id *id)
|
||||
|
||||
BUG_ON(ppi[0] == NULL);
|
||||
|
||||
return ata_pci_sff_init_one(pdev, ppi, &artop_sht, NULL, 0);
|
||||
return ata_pci_bmdma_init_one(pdev, ppi, &artop_sht, NULL, 0);
|
||||
}
|
||||
|
||||
static const struct pci_device_id artop_pci_tbl[] = {
|
||||
|
||||
@@ -246,8 +246,8 @@ static int atiixp_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||
if (!pci_test_config_bits(pdev, &atiixp_enable_bits[i]))
|
||||
ppi[i] = &ata_dummy_port_info;
|
||||
|
||||
return ata_pci_sff_init_one(pdev, ppi, &atiixp_sht, NULL,
|
||||
ATA_HOST_PARALLEL_SCAN);
|
||||
return ata_pci_bmdma_init_one(pdev, ppi, &atiixp_sht, NULL,
|
||||
ATA_HOST_PARALLEL_SCAN);
|
||||
}
|
||||
|
||||
static const struct pci_device_id atiixp[] = {
|
||||
|
||||
@@ -367,7 +367,7 @@ static int cmd64x_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||
pci_write_config_byte(pdev, UDIDETCR0, 0xF0);
|
||||
#endif
|
||||
|
||||
return ata_pci_sff_init_one(pdev, ppi, &cmd64x_sht, NULL, 0);
|
||||
return ata_pci_bmdma_init_one(pdev, ppi, &cmd64x_sht, NULL, 0);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
|
||||
@@ -324,7 +324,7 @@ static int cs5530_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||
ppi[1] = &info_palmax_secondary;
|
||||
|
||||
/* Now kick off ATA set up */
|
||||
return ata_pci_sff_init_one(pdev, ppi, &cs5530_sht, NULL, 0);
|
||||
return ata_pci_bmdma_init_one(pdev, ppi, &cs5530_sht, NULL, 0);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
|
||||
@@ -198,7 +198,7 @@ static int cs5535_init_one(struct pci_dev *dev, const struct pci_device_id *id)
|
||||
rdmsr(ATAC_CH0D1_PIO, timings, dummy);
|
||||
if (CS5535_BAD_PIO(timings))
|
||||
wrmsr(ATAC_CH0D1_PIO, 0xF7F4F7F4UL, 0);
|
||||
return ata_pci_sff_init_one(dev, ppi, &cs5535_sht, NULL, 0);
|
||||
return ata_pci_bmdma_init_one(dev, ppi, &cs5535_sht, NULL, 0);
|
||||
}
|
||||
|
||||
static const struct pci_device_id cs5535[] = {
|
||||
|
||||
@@ -260,7 +260,7 @@ static int cs5536_init_one(struct pci_dev *dev, const struct pci_device_id *id)
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
return ata_pci_sff_init_one(dev, ppi, &cs5536_sht, NULL, 0);
|
||||
return ata_pci_bmdma_init_one(dev, ppi, &cs5536_sht, NULL, 0);
|
||||
}
|
||||
|
||||
static const struct pci_device_id cs5536[] = {
|
||||
|
||||
@@ -138,7 +138,7 @@ static int cy82c693_init_one(struct pci_dev *pdev, const struct pci_device_id *i
|
||||
if (PCI_FUNC(pdev->devfn) != 1)
|
||||
return -ENODEV;
|
||||
|
||||
return ata_pci_sff_init_one(pdev, ppi, &cy82c693_sht, NULL, 0);
|
||||
return ata_pci_bmdma_init_one(pdev, ppi, &cy82c693_sht, NULL, 0);
|
||||
}
|
||||
|
||||
static const struct pci_device_id cy82c693[] = {
|
||||
|
||||
@@ -277,8 +277,8 @@ static int efar_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
dev_printk(KERN_DEBUG, &pdev->dev,
|
||||
"version " DRV_VERSION "\n");
|
||||
|
||||
return ata_pci_sff_init_one(pdev, ppi, &efar_sht, NULL,
|
||||
ATA_HOST_PARALLEL_SCAN);
|
||||
return ata_pci_bmdma_init_one(pdev, ppi, &efar_sht, NULL,
|
||||
ATA_HOST_PARALLEL_SCAN);
|
||||
}
|
||||
|
||||
static const struct pci_device_id efar_pci_tbl[] = {
|
||||
|
||||
@@ -361,7 +361,7 @@ static int hpt36x_init_one(struct pci_dev *dev, const struct pci_device_id *id)
|
||||
break;
|
||||
}
|
||||
/* Now kick off ATA set up */
|
||||
return ata_pci_sff_init_one(dev, ppi, &hpt36x_sht, hpriv, 0);
|
||||
return ata_pci_bmdma_init_one(dev, ppi, &hpt36x_sht, hpriv, 0);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
|
||||
@@ -987,7 +987,7 @@ static int hpt37x_init_one(struct pci_dev *dev, const struct pci_device_id *id)
|
||||
}
|
||||
|
||||
/* Now kick off ATA set up */
|
||||
return ata_pci_sff_init_one(dev, ppi, &hpt37x_sht, private_data, 0);
|
||||
return ata_pci_bmdma_init_one(dev, ppi, &hpt37x_sht, private_data, 0);
|
||||
}
|
||||
|
||||
static const struct pci_device_id hpt37x[] = {
|
||||
|
||||
@@ -548,7 +548,7 @@ static int hpt3x2n_init_one(struct pci_dev *dev, const struct pci_device_id *id)
|
||||
outb(inb(iobase + 0x9c) | 0x04, iobase + 0x9c);
|
||||
|
||||
/* Now kick off ATA set up */
|
||||
return ata_pci_sff_init_one(dev, ppi, &hpt3x2n_sht, hpriv, 0);
|
||||
return ata_pci_bmdma_init_one(dev, ppi, &hpt3x2n_sht, hpriv, 0);
|
||||
}
|
||||
|
||||
static const struct pci_device_id hpt3x2n[] = {
|
||||
|
||||
@@ -273,7 +273,7 @@ static int it8213_init_one (struct pci_dev *pdev, const struct pci_device_id *en
|
||||
dev_printk(KERN_DEBUG, &pdev->dev,
|
||||
"version " DRV_VERSION "\n");
|
||||
|
||||
return ata_pci_sff_init_one(pdev, ppi, &it8213_sht, NULL, 0);
|
||||
return ata_pci_bmdma_init_one(pdev, ppi, &it8213_sht, NULL, 0);
|
||||
}
|
||||
|
||||
static const struct pci_device_id it8213_pci_tbl[] = {
|
||||
|
||||
@@ -933,7 +933,7 @@ static int it821x_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
|
||||
else
|
||||
ppi[0] = &info_smart;
|
||||
}
|
||||
return ata_pci_sff_init_one(pdev, ppi, &it821x_sht, NULL, 0);
|
||||
return ata_pci_bmdma_init_one(pdev, ppi, &it821x_sht, NULL, 0);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
|
||||
@@ -144,7 +144,7 @@ static int jmicron_init_one (struct pci_dev *pdev, const struct pci_device_id *i
|
||||
};
|
||||
const struct ata_port_info *ppi[] = { &info, NULL };
|
||||
|
||||
return ata_pci_sff_init_one(pdev, ppi, &jmicron_sht, NULL, 0);
|
||||
return ata_pci_bmdma_init_one(pdev, ppi, &jmicron_sht, NULL, 0);
|
||||
}
|
||||
|
||||
static const struct pci_device_id jmicron_pci_tbl[] = {
|
||||
|
||||
Loaded 20 of 41 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user