diff mbox

[U-Boot,v2,21/26] dm: ahci: Convert to use new DM PCI API

Message ID 1448828291-12660-22-git-send-email-sjg@chromium.org
State Accepted
Commit ff758ccc8a237f7a4b14be7271b55b1d611b1250
Delegated to: Simon Glass
Headers show

Commit Message

Simon Glass Nov. 29, 2015, 8:18 p.m. UTC
Convert this driver to use the new driver model PCI API.

Signed-off-by: Simon Glass <sjg@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(-)

Comments

Bin Meng Dec. 7, 2015, 11:27 a.m. UTC | #1
On Mon, Nov 30, 2015 at 4:18 AM, Simon Glass <sjg@chromium.org> wrote:
> Convert this driver to use the new driver model PCI API.
>
> Signed-off-by: Simon Glass <sjg@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.cn@gmail.com>
Simon Glass Dec. 14, 2015, 3:46 a.m. UTC | #2
Applied to u-boot-dm/next.
diff mbox

Patch

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;