ata: add ata logical device to defer probe
ata device usually take a long time to spin up, so it makes sense to only spend this time when the device is actually used. This adds a logical ata device and attaches a 'probe' parameter to it, similar to what MMC does. Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
This commit is contained in:
parent
d80505569d
commit
a2063d1015
|
@ -255,17 +255,11 @@ static struct block_device_ops ata_ops = {
|
|||
#endif
|
||||
};
|
||||
|
||||
/**
|
||||
* Register an ATA drive behind an IDE like interface
|
||||
* @param dev The interface device
|
||||
* @param io ATA register file description
|
||||
* @return 0 on success
|
||||
*/
|
||||
int ata_port_register(struct ata_port *port)
|
||||
static int ata_port_init(struct ata_port *port)
|
||||
{
|
||||
int rc;
|
||||
struct ata_port_operations *ops = port->ops;
|
||||
struct device_d *dev = port->dev;
|
||||
struct device_d *dev = &port->class_dev;
|
||||
|
||||
port->id = dma_alloc(SECTOR_SIZE);
|
||||
|
||||
|
@ -325,6 +319,53 @@ on_error:
|
|||
return rc;
|
||||
}
|
||||
|
||||
static int ata_set_probe(struct device_d *class_dev, struct param_d *param,
|
||||
const char *val)
|
||||
{
|
||||
struct ata_port *port = container_of(class_dev, struct ata_port, class_dev);
|
||||
int ret, probe;
|
||||
|
||||
if (port->initialized) {
|
||||
dev_info(class_dev, "already initialized\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
probe = !!simple_strtoul(val, NULL, 0);
|
||||
if (!probe)
|
||||
return 0;
|
||||
|
||||
ret = ata_port_init(port);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
port->initialized = 1;
|
||||
|
||||
return dev_param_set_generic(class_dev, param, "1");
|
||||
}
|
||||
|
||||
/**
|
||||
* Register an ATA drive behind an IDE like interface
|
||||
* @param dev The interface device
|
||||
* @param io ATA register file description
|
||||
* @return 0 on success
|
||||
*/
|
||||
int ata_port_register(struct ata_port *port)
|
||||
{
|
||||
int ret;
|
||||
|
||||
port->class_dev.id = DEVICE_ID_DYNAMIC;
|
||||
strcpy(port->class_dev.name, "ata");
|
||||
port->class_dev.parent = port->dev;
|
||||
|
||||
ret = register_device(&port->class_dev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
dev_add_param(&port->class_dev, "probe", ata_set_probe, NULL, 0);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* @file
|
||||
* @brief Generic ATA disk drive support
|
||||
|
|
|
@ -89,9 +89,11 @@ struct ata_port_operations {
|
|||
struct ata_port {
|
||||
struct ata_port_operations *ops;
|
||||
struct device_d *dev;
|
||||
struct device_d class_dev;
|
||||
void *drvdata;
|
||||
struct block_device blk;
|
||||
uint16_t *id;
|
||||
int initialized;
|
||||
};
|
||||
|
||||
int ide_port_register(struct device_d *, struct ata_ioports *);
|
||||
|
|
Loading…
Reference in New Issue