dm: sata: Update the AHCI uclass to support operations
At present the AHCI uclass is just a shell and we still use the global functions to access SATA. Fix this by adding operations to the uclass. Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
parent
7e0712b26e
commit
b8341f1c39
@ -11,17 +11,52 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <common.h>
|
#include <common.h>
|
||||||
|
#include <ahci.h>
|
||||||
#include <dm.h>
|
#include <dm.h>
|
||||||
#include <sata.h>
|
#include <sata.h>
|
||||||
|
|
||||||
|
#ifndef CONFIG_AHCI
|
||||||
struct blk_desc sata_dev_desc[CONFIG_SYS_SATA_MAX_DEVICE];
|
struct blk_desc sata_dev_desc[CONFIG_SYS_SATA_MAX_DEVICE];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int sata_reset(struct udevice *dev)
|
||||||
|
{
|
||||||
|
struct ahci_ops *ops = ahci_get_ops(dev);
|
||||||
|
|
||||||
|
if (!ops->reset)
|
||||||
|
return -ENOSYS;
|
||||||
|
|
||||||
|
return ops->reset(dev);
|
||||||
|
}
|
||||||
|
|
||||||
|
int sata_dm_port_status(struct udevice *dev, int port)
|
||||||
|
{
|
||||||
|
struct ahci_ops *ops = ahci_get_ops(dev);
|
||||||
|
|
||||||
|
if (!ops->port_status)
|
||||||
|
return -ENOSYS;
|
||||||
|
|
||||||
|
return ops->port_status(dev, port);
|
||||||
|
}
|
||||||
|
|
||||||
|
int sata_scan(struct udevice *dev)
|
||||||
|
{
|
||||||
|
struct ahci_ops *ops = ahci_get_ops(dev);
|
||||||
|
|
||||||
|
if (!ops->scan)
|
||||||
|
return -ENOSYS;
|
||||||
|
|
||||||
|
return ops->scan(dev);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef CONFIG_AHCI
|
||||||
#ifdef CONFIG_PARTITIONS
|
#ifdef CONFIG_PARTITIONS
|
||||||
struct blk_desc *sata_get_dev(int dev)
|
struct blk_desc *sata_get_dev(int dev)
|
||||||
{
|
{
|
||||||
return (dev < CONFIG_SYS_SATA_MAX_DEVICE) ? &sata_dev_desc[dev] : NULL;
|
return (dev < CONFIG_SYS_SATA_MAX_DEVICE) ? &sata_dev_desc[dev] : NULL;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_BLK
|
#ifdef CONFIG_BLK
|
||||||
static unsigned long sata_bread(struct udevice *dev, lbaint_t start,
|
static unsigned long sata_bread(struct udevice *dev, lbaint_t start,
|
||||||
@ -49,6 +84,7 @@ static unsigned long sata_bwrite(struct blk_desc *block_dev, lbaint_t start,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef CONFIG_AHCI
|
||||||
int __sata_initialize(void)
|
int __sata_initialize(void)
|
||||||
{
|
{
|
||||||
int rc, ret = -1;
|
int rc, ret = -1;
|
||||||
@ -95,6 +131,7 @@ __weak int __sata_stop(void)
|
|||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
int sata_stop(void) __attribute__((weak, alias("__sata_stop")));
|
int sata_stop(void) __attribute__((weak, alias("__sata_stop")));
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_BLK
|
#ifdef CONFIG_BLK
|
||||||
static const struct blk_ops sata_blk_ops = {
|
static const struct blk_ops sata_blk_ops = {
|
||||||
|
@ -176,6 +176,60 @@ struct ahci_uc_priv {
|
|||||||
u32 link_port_map; /*linkup port map*/
|
u32 link_port_map; /*linkup port map*/
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct ahci_ops {
|
||||||
|
/**
|
||||||
|
* reset() - reset the controller
|
||||||
|
*
|
||||||
|
* @dev: Controller to reset
|
||||||
|
* @return 0 if OK, -ve on error
|
||||||
|
*/
|
||||||
|
int (*reset)(struct udevice *dev);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* port_status() - get the status of a SATA port
|
||||||
|
*
|
||||||
|
* @dev: Controller to reset
|
||||||
|
* @port: Port number to check (0 for first)
|
||||||
|
* @return 0 if detected, -ENXIO if nothing on port, other -ve on error
|
||||||
|
*/
|
||||||
|
int (*port_status)(struct udevice *dev, int port);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* scan() - scan SATA ports
|
||||||
|
*
|
||||||
|
* @dev: Controller to scan
|
||||||
|
* @return 0 if OK, -ve on error
|
||||||
|
*/
|
||||||
|
int (*scan)(struct udevice *dev);
|
||||||
|
};
|
||||||
|
|
||||||
|
#define ahci_get_ops(dev) ((struct ahci_ops *)(dev)->driver->ops)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* sata_reset() - reset the controller
|
||||||
|
*
|
||||||
|
* @dev: Controller to reset
|
||||||
|
* @return 0 if OK, -ve on error
|
||||||
|
*/
|
||||||
|
int sata_reset(struct udevice *dev);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* sata_port_status() - get the status of a SATA port
|
||||||
|
*
|
||||||
|
* @dev: Controller to reset
|
||||||
|
* @port: Port number to check (0 for first)
|
||||||
|
* @return 0 if detected, -ENXIO if nothin on port, other -ve on error
|
||||||
|
*/
|
||||||
|
int sata_dm_port_status(struct udevice *dev, int port);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* sata_scan() - scan SATA ports
|
||||||
|
*
|
||||||
|
* @dev: Controller to scan
|
||||||
|
* @return 0 if OK, -ve on error
|
||||||
|
*/
|
||||||
|
int sata_scan(struct udevice *dev);
|
||||||
|
|
||||||
int ahci_init(void __iomem *base);
|
int ahci_init(void __iomem *base);
|
||||||
int ahci_reset(void __iomem *base);
|
int ahci_reset(void __iomem *base);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user