Skip to content

Commit

Permalink
dm: ahci: Unwind the confusing init code
Browse files Browse the repository at this point in the history
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 <[email protected]>
Reviewed-by: Bin Meng <[email protected]>
  • Loading branch information
sjg20 committed Jul 11, 2017
1 parent 62b4ec8 commit 7cf1afc
Show file tree
Hide file tree
Showing 6 changed files with 42 additions and 19 deletions.
26 changes: 20 additions & 6 deletions drivers/ata/ahci.c
Original file line number Diff line number Diff line change
Expand Up @@ -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>

Expand Down Expand Up @@ -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;

Expand All @@ -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
Expand All @@ -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)
Expand Down
6 changes: 5 additions & 1 deletion drivers/ata/dwc_ahci.c
Original file line number Diff line number Diff line change
Expand Up @@ -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[] = {
Expand Down
3 changes: 2 additions & 1 deletion drivers/ata/sata_ceva.c
Original file line number Diff line number Diff line change
Expand Up @@ -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[] = {
Expand Down
8 changes: 0 additions & 8 deletions drivers/scsi/scsi-uclass.c
Original file line number Diff line number Diff line change
Expand Up @@ -13,16 +13,8 @@
#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),
};
14 changes: 14 additions & 0 deletions include/ahci.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
4 changes: 1 addition & 3 deletions include/scsi.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 7cf1afc

Please sign in to comment.