On Mon, Nov 30, 2015 at 4:18 AM, Simon Glass <s...@chromium.org> wrote: > Convert this driver to use the new driver model PCI API. > > Signed-off-by: Simon Glass <s...@chromium.org> > --- > > Changes in v2: > - Fix use of 'pdev' instead of 'dev' > - Get the vendor from the PCI parent platdata > - Use pci_bus_find_bdf() > > drivers/block/ahci.c | 70 > ++++++++++++++++++++++++++++++++++++++++++++++------ > include/ahci.h | 4 +++ > 2 files changed, 67 insertions(+), 7 deletions(-) > > diff --git a/drivers/block/ahci.c b/drivers/block/ahci.c > index 1ad638e..e5f4a04 100644 > --- a/drivers/block/ahci.c > +++ b/drivers/block/ahci.c > @@ -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, > +#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 > + */ > + dm_pci_read_config16(dev, PCI_VENDOR_ID, &vendor); > + if (vendor == 0x197b) > + dm_pci_write_config8(dev, 0x41, 0xa1); > +#else > + probe_ent->mmio_base = pci_map_bar(dev, PCI_BASE_ADDRESS_5, > PCI_REGION_MEM); > - debug("ahci mmio_base=0x%p\n", probe_ent->mmio_base); > > /* Take from kernel: > * JMicron-specific fixup: > * make sure we're in AHCI mode > */ > - pci_read_config_word(pdev, PCI_VENDOR_ID, &vendor); > + pci_read_config_word(dev, PCI_VENDOR_ID, &vendor); > if (vendor == 0x197b) > - pci_write_config_byte(pdev, 0x41, 0xa1); > + 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; > diff --git a/include/ahci.h b/include/ahci.h > index 0bdedac..a956c6f 100644 > --- a/include/ahci.h > +++ b/include/ahci.h > @@ -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; > --
Reviewed-by: Bin Meng <bmeng...@gmail.com> _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot