dm: ahci: Unwind the confusing init code
authorSimon Glass <sjg@chromium.org>
Thu, 15 Jun 2017 03:28:37 +0000 (21:28 -0600)
committerSimon Glass <sjg@chromium.org>
Tue, 11 Jul 2017 16:08:19 +0000 (10:08 -0600)
Two AHCI drivers use SCSI with CONFIG_DM_SCSI. The SCSI uclass calls
scsi_low_level_init() which is implemented by ahci.c. If
CONFIG_SCSI_AHCI_PLAT is defined it does one thing and if it is not
it does something else.

We don't need to call through scsi_low_level_init() to get the init
completed. Instead, adjust the two drivers to call into AHCI directly.
Drop the post-probe init in the SCSI uclass. This means that driver model
doesn't need to use scsi_low_level_init(). It is a legacy function and
driver model should use a driver's probe() method instead.

While we are here, add a comment to the top of the file explaining what
ahci.c does.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
drivers/ata/ahci.c
drivers/ata/dwc_ahci.c
drivers/ata/sata_ceva.c
drivers/scsi/scsi-uclass.c
include/ahci.h
include/scsi.h

index 4830bcdca00665a7d5d376c60cf3588c40f83967..e9867656a9e00b03c30a1e254d8d1949e8676cdf 100644 (file)
@@ -6,6 +6,8 @@
  * SPDX-License-Identifier:    GPL-2.0+
  *
  * with the reference on libata and ahci drvier in kernel
+ *
+ * This driver provides a SCSI interface to SATA.
  */
 #include <common.h>
 
@@ -990,11 +992,8 @@ static int ahci_start_ports(struct ahci_uc_priv *uc_priv)
        return 0;
 }
 
-#if defined(CONFIG_DM_SCSI)
-void scsi_low_level_init(int busdevfunc, struct udevice *dev)
-#else
+#ifndef CONFIG_DM_SCSI
 void scsi_low_level_init(int busdevfunc)
-#endif
 {
        struct ahci_uc_priv *uc_priv;
 
@@ -1007,8 +1006,6 @@ void scsi_low_level_init(int busdevfunc)
        if (ret)
                return;
        ahci_init_one(dev);
-# elif defined(CONFIG_DM_SCSI)
-       ahci_init_one(dev);
 # else
        ahci_init_one(busdevfunc);
 # endif
@@ -1017,6 +1014,23 @@ void scsi_low_level_init(int busdevfunc)
 
        ahci_start_ports(uc_priv);
 }
+#endif
+
+#ifndef CONFIG_SCSI_AHCI_PLAT
+# if defined(CONFIG_DM_PCI) || defined(CONFIG_DM_SCSI)
+int achi_init_one_dm(struct udevice *dev)
+{
+       return ahci_init_one(dev);
+}
+#endif
+#endif
+
+int achi_start_ports_dm(struct udevice *dev)
+{
+       struct ahci_uc_priv *uc_priv = probe_ent;
+
+       return ahci_start_ports(uc_priv);
+}
 
 #ifdef CONFIG_SCSI_AHCI_PLAT
 int ahci_init(void __iomem *base)
index e634df5e3ceb05877eec4d73e948c60aa783be5a..eadd77944c12448300f065c189aa87492099547e 100644 (file)
@@ -81,7 +81,11 @@ static int dwc_ahci_probe(struct udevice *dev)
                writel(val, priv->wrapper_base + TI_SATA_SYSCONFIG);
        }
 
-       return ahci_init(priv->base);
+       ret = ahci_init(priv->base);
+       if (ret)
+               return ret;
+
+       return achi_start_ports_dm(dev);
 }
 
 static const struct udevice_id dwc_ahci_ids[] = {
index f55ba5966607b73476a454951698eec33f6cf586..7d61a546d757045d79daaa727e45badb00f4815d 100644 (file)
@@ -116,7 +116,8 @@ static int sata_ceva_probe(struct udevice *dev)
        struct scsi_platdata *plat = dev_get_uclass_platdata(dev);
 
        ceva_init_sata(plat->base);
-       return 0;
+
+       return achi_init_one_dm(dev);
 }
 
 static const struct udevice_id sata_ceva_ids[] = {
index e4ee44bb4c312405ab6291423d0e8d16adbdcc9f..40c5044f093194f11d9c84e0a76d535c155ada41 100644 (file)
 #include <dm.h>
 #include <scsi.h>
 
-static int scsi_post_probe(struct udevice *dev)
-{
-       debug("%s: device %p\n", __func__, dev);
-       scsi_low_level_init(0, dev);
-       return 0;
-}
-
 UCLASS_DRIVER(scsi) = {
        .id             = UCLASS_SCSI,
        .name           = "scsi",
-       .post_probe      = scsi_post_probe,
        .per_device_platdata_auto_alloc_size = sizeof(struct scsi_platdata),
 };
index 4262ab75c8886bed260b9c3ef4b8ded3a24efaa2..ec5b0c7d9d781c1f1a3b4ced7382f1b605ba69a7 100644 (file)
@@ -179,4 +179,18 @@ struct ahci_uc_priv {
 int ahci_init(void __iomem *base);
 int ahci_reset(void __iomem *base);
 
+/**
+ * achi_init_one_dm() - set up a single AHCI port
+ *
+ * @dev: Controller to init
+ */
+int achi_init_one_dm(struct udevice *dev);
+
+/**
+ * achi_start_ports_dm() - start all AHCI ports for a controller
+ *
+ * @dev: Controller containing ports to start
+ */
+int achi_start_ports_dm(struct udevice *dev);
+
 #endif
index bc5be974655bdeba5399a45f49030ded3b1ea943..cd1b240855f7a3259e5ad42c99c25aa92fc22e95 100644 (file)
@@ -171,9 +171,7 @@ struct scsi_platdata {
        unsigned long max_id;
 };
 
-#if defined(CONFIG_DM_SCSI)
-void scsi_low_level_init(int busdevfunc, struct udevice *dev);
-#else
+#ifndef CONFIG_DM_SCSI
 void scsi_low_level_init(int busdevfunc);
 void scsi_init(void);
 #endif