Skip to content

Commit

Permalink
ahci_platform: Provide for vendor specific init
Browse files Browse the repository at this point in the history
Some AHCI implementations may use Vendor Specific HBA[A0h, FFh]
and/or Port[70h, 7Fh] registers to 'prepare' for initialization.
For that, the platform needs memory mapped address of AHCI registers.

This patch adds the 'mmio' argument and reorders the call to
platform init function.

Signed-off-by: Jassi Brar <jassi.brar@samsung.com>
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
  • Loading branch information
Jassi Brar authored and Jeff Garzik committed Aug 1, 2010
1 parent 9fe6206 commit 0835480
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 11 deletions.
25 changes: 15 additions & 10 deletions drivers/ata/ahci_platform.c
Original file line number Diff line number Diff line change
Expand Up @@ -54,28 +54,33 @@ static int __init ahci_probe(struct platform_device *pdev)
return -EINVAL;
}

if (pdata && pdata->init) {
rc = pdata->init(dev);
if (rc)
return rc;
}

if (pdata && pdata->ata_port_info)
pi = *pdata->ata_port_info;

hpriv = devm_kzalloc(dev, sizeof(*hpriv), GFP_KERNEL);
if (!hpriv) {
rc = -ENOMEM;
goto err0;
dev_err(dev, "can't alloc ahci_host_priv\n");
return -ENOMEM;
}

hpriv->flags |= (unsigned long)pi.private_data;

hpriv->mmio = devm_ioremap(dev, mem->start, resource_size(mem));
if (!hpriv->mmio) {
dev_err(dev, "can't map %pR\n", mem);
rc = -ENOMEM;
goto err0;
return -ENOMEM;
}

/*
* Some platforms might need to prepare for mmio region access,
* which could be done in the following init call. So, the mmio
* region shouldn't be accessed before init (if provided) has
* returned successfully.
*/
if (pdata && pdata->init) {
rc = pdata->init(dev, hpriv->mmio);
if (rc)
return rc;
}

ahci_save_initial_config(dev, hpriv,
Expand Down
4 changes: 3 additions & 1 deletion include/linux/ahci_platform.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,13 @@
#ifndef _AHCI_PLATFORM_H
#define _AHCI_PLATFORM_H

#include <linux/compiler.h>

struct device;
struct ata_port_info;

struct ahci_platform_data {
int (*init)(struct device *dev);
int (*init)(struct device *dev, void __iomem *addr);
void (*exit)(struct device *dev);
const struct ata_port_info *ata_port_info;
unsigned int force_port_map;
Expand Down

0 comments on commit 0835480

Please sign in to comment.