dm: ahci: Convert to use new DM PCI API
Convert this driver to use the new driver model PCI API. Signed-off-by: Simon Glass <sjg@chromium.org> Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
This commit is contained in:
parent
7e78b9ef2c
commit
ff758ccc8a
2 changed files with 68 additions and 8 deletions
|
@ -10,6 +10,7 @@
|
|||
#include <common.h>
|
||||
|
||||
#include <command.h>
|
||||
#include <dm.h>
|
||||
#include <pci.h>
|
||||
#include <asm/processor.h>
|
||||
#include <asm/errno.h>
|
||||
|
@ -168,9 +169,14 @@ int ahci_reset(void __iomem *base)
|
|||
static int ahci_host_init(struct ahci_probe_ent *probe_ent)
|
||||
{
|
||||
#ifndef CONFIG_SCSI_AHCI_PLAT
|
||||
# ifdef CONFIG_DM_PCI
|
||||
struct udevice *dev = probe_ent->dev;
|
||||
struct pci_child_platdata *pplat = dev_get_parent_platdata(dev);
|
||||
# else
|
||||
pci_dev_t pdev = probe_ent->dev;
|
||||
u16 tmp16;
|
||||
unsigned short vendor;
|
||||
# endif
|
||||
u16 tmp16;
|
||||
#endif
|
||||
void __iomem *mmio = probe_ent->mmio_base;
|
||||
u32 tmp, cap_save, cmd;
|
||||
|
@ -193,6 +199,14 @@ static int ahci_host_init(struct ahci_probe_ent *probe_ent)
|
|||
writel_with_flush(0xf, mmio + HOST_PORTS_IMPL);
|
||||
|
||||
#ifndef CONFIG_SCSI_AHCI_PLAT
|
||||
# ifdef CONFIG_DM_PCI
|
||||
if (pplat->vendor == PCI_VENDOR_ID_INTEL) {
|
||||
u16 tmp16;
|
||||
|
||||
dm_pci_read_config16(dev, 0x92, &tmp16);
|
||||
dm_pci_write_config16(dev, 0x92, tmp16 | 0xf);
|
||||
}
|
||||
# else
|
||||
pci_read_config_word(pdev, PCI_VENDOR_ID, &vendor);
|
||||
|
||||
if (vendor == PCI_VENDOR_ID_INTEL) {
|
||||
|
@ -201,6 +215,7 @@ static int ahci_host_init(struct ahci_probe_ent *probe_ent)
|
|||
tmp16 |= 0xf;
|
||||
pci_write_config_word(pdev, 0x92, tmp16);
|
||||
}
|
||||
# endif
|
||||
#endif
|
||||
probe_ent->cap = readl(mmio + HOST_CAP);
|
||||
probe_ent->port_map = readl(mmio + HOST_PORTS_IMPL);
|
||||
|
@ -313,9 +328,15 @@ static int ahci_host_init(struct ahci_probe_ent *probe_ent)
|
|||
tmp = readl(mmio + HOST_CTL);
|
||||
debug("HOST_CTL 0x%x\n", tmp);
|
||||
#ifndef CONFIG_SCSI_AHCI_PLAT
|
||||
# ifdef CONFIG_DM_PCI
|
||||
dm_pci_read_config16(dev, PCI_COMMAND, &tmp16);
|
||||
tmp |= PCI_COMMAND_MASTER;
|
||||
dm_pci_write_config16(dev, PCI_COMMAND, tmp16);
|
||||
# else
|
||||
pci_read_config_word(pdev, PCI_COMMAND, &tmp16);
|
||||
tmp |= PCI_COMMAND_MASTER;
|
||||
pci_write_config_word(pdev, PCI_COMMAND, tmp16);
|
||||
# endif
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
@ -324,7 +345,11 @@ static int ahci_host_init(struct ahci_probe_ent *probe_ent)
|
|||
static void ahci_print_info(struct ahci_probe_ent *probe_ent)
|
||||
{
|
||||
#ifndef CONFIG_SCSI_AHCI_PLAT
|
||||
# ifdef CONFIG_DM_PCI
|
||||
struct udevice *dev = probe_ent->dev;
|
||||
# else
|
||||
pci_dev_t pdev = probe_ent->dev;
|
||||
# endif
|
||||
u16 cc;
|
||||
#endif
|
||||
void __iomem *mmio = probe_ent->mmio_base;
|
||||
|
@ -350,7 +375,11 @@ static void ahci_print_info(struct ahci_probe_ent *probe_ent)
|
|||
#ifdef CONFIG_SCSI_AHCI_PLAT
|
||||
scc_s = "SATA";
|
||||
#else
|
||||
# ifdef CONFIG_DM_PCI
|
||||
dm_pci_read_config16(dev, 0x0a, &cc);
|
||||
# else
|
||||
pci_read_config_word(pdev, 0x0a, &cc);
|
||||
# endif
|
||||
if (cc == 0x0101)
|
||||
scc_s = "IDE";
|
||||
else if (cc == 0x0106)
|
||||
|
@ -395,7 +424,11 @@ static void ahci_print_info(struct ahci_probe_ent *probe_ent)
|
|||
}
|
||||
|
||||
#ifndef CONFIG_SCSI_AHCI_PLAT
|
||||
static int ahci_init_one(pci_dev_t pdev)
|
||||
# ifdef CONFIG_DM_PCI
|
||||
static int ahci_init_one(struct udevice *dev)
|
||||
# else
|
||||
static int ahci_init_one(pci_dev_t dev)
|
||||
# endif
|
||||
{
|
||||
u16 vendor;
|
||||
int rc;
|
||||
|
@ -407,7 +440,7 @@ static int ahci_init_one(pci_dev_t pdev)
|
|||
}
|
||||
|
||||
memset(probe_ent, 0, sizeof(struct ahci_probe_ent));
|
||||
probe_ent->dev = pdev;
|
||||
probe_ent->dev = dev;
|
||||
|
||||
probe_ent->host_flags = ATA_FLAG_SATA
|
||||
| ATA_FLAG_NO_LEGACY
|
||||
|
@ -417,18 +450,31 @@ static int ahci_init_one(pci_dev_t pdev)
|
|||
probe_ent->pio_mask = 0x1f;
|
||||
probe_ent->udma_mask = 0x7f; /*Fixme,assume to support UDMA6 */
|
||||
|
||||
probe_ent->mmio_base = pci_map_bar(pdev, PCI_BASE_ADDRESS_5,
|
||||
PCI_REGION_MEM);
|
||||
debug("ahci mmio_base=0x%p\n", probe_ent->mmio_base);
|
||||
#ifdef CONFIG_DM_PCI
|
||||
probe_ent->mmio_base = dm_pci_map_bar(dev, PCI_BASE_ADDRESS_5,
|
||||
PCI_REGION_MEM);
|
||||
|
||||
/* Take from kernel:
|
||||
* JMicron-specific fixup:
|
||||
* make sure we're in AHCI mode
|
||||
*/
|
||||
pci_read_config_word(pdev, PCI_VENDOR_ID, &vendor);
|
||||
dm_pci_read_config16(dev, PCI_VENDOR_ID, &vendor);
|
||||
if (vendor == 0x197b)
|
||||
pci_write_config_byte(pdev, 0x41, 0xa1);
|
||||
dm_pci_write_config8(dev, 0x41, 0xa1);
|
||||
#else
|
||||
probe_ent->mmio_base = pci_map_bar(dev, PCI_BASE_ADDRESS_5,
|
||||
PCI_REGION_MEM);
|
||||
|
||||
/* Take from kernel:
|
||||
* JMicron-specific fixup:
|
||||
* make sure we're in AHCI mode
|
||||
*/
|
||||
pci_read_config_word(dev, PCI_VENDOR_ID, &vendor);
|
||||
if (vendor == 0x197b)
|
||||
pci_write_config_byte(dev, 0x41, 0xa1);
|
||||
#endif
|
||||
|
||||
debug("ahci mmio_base=0x%p\n", probe_ent->mmio_base);
|
||||
/* initialize adapter */
|
||||
rc = ahci_host_init(probe_ent);
|
||||
if (rc)
|
||||
|
@ -915,7 +961,17 @@ void scsi_low_level_init(int busdevfunc)
|
|||
u32 linkmap;
|
||||
|
||||
#ifndef CONFIG_SCSI_AHCI_PLAT
|
||||
# ifdef CONFIG_DM_PCI
|
||||
struct udevice *dev;
|
||||
int ret;
|
||||
|
||||
ret = dm_pci_bus_find_bdf(busdevfunc, &dev);
|
||||
if (ret)
|
||||
return;
|
||||
ahci_init_one(dev);
|
||||
# else
|
||||
ahci_init_one(busdevfunc);
|
||||
# endif
|
||||
#endif
|
||||
|
||||
linkmap = probe_ent->link_port_map;
|
||||
|
|
|
@ -145,7 +145,11 @@ struct ahci_ioports {
|
|||
};
|
||||
|
||||
struct ahci_probe_ent {
|
||||
#ifdef CONFIG_DM_PCI
|
||||
struct udevice *dev;
|
||||
#else
|
||||
pci_dev_t dev;
|
||||
#endif
|
||||
struct ahci_ioports port[AHCI_MAX_PORTS];
|
||||
u32 n_ports;
|
||||
u32 hard_port_no;
|
||||
|
|
Loading…
Reference in a new issue