mei: bus: Add bus related structures to mei_cl
We keep track of all MEI devices on the bus through a specific linked list. We also have a mei_device instance in the mei_cl structure. Signed-off-by: Samuel Ortiz <sameo@linux.intel.com> Signed-off-by: Tomas Winkler <tomas.winkler@intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
3e8332952d
commit
a7b71bc043
|
@ -140,36 +140,53 @@ static struct device_type mei_cl_device_type = {
|
||||||
.release = mei_cl_dev_release,
|
.release = mei_cl_dev_release,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct mei_cl_device *mei_cl_add_device(struct mei_device *mei_device,
|
static struct mei_cl *mei_bus_find_mei_cl_by_uuid(struct mei_device *dev,
|
||||||
|
uuid_le uuid)
|
||||||
|
{
|
||||||
|
struct mei_cl *cl, *next;
|
||||||
|
|
||||||
|
list_for_each_entry_safe(cl, next, &dev->device_list, device_link) {
|
||||||
|
if (!uuid_le_cmp(uuid, cl->device_uuid))
|
||||||
|
return cl;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
struct mei_cl_device *mei_cl_add_device(struct mei_device *dev,
|
||||||
uuid_le uuid, char *name)
|
uuid_le uuid, char *name)
|
||||||
{
|
{
|
||||||
struct mei_cl_device *device;
|
struct mei_cl_device *device;
|
||||||
|
struct mei_cl *cl;
|
||||||
int status;
|
int status;
|
||||||
|
|
||||||
|
cl = mei_bus_find_mei_cl_by_uuid(dev, uuid);
|
||||||
|
if (cl == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
device = kzalloc(sizeof(struct mei_cl_device), GFP_KERNEL);
|
device = kzalloc(sizeof(struct mei_cl_device), GFP_KERNEL);
|
||||||
if (!device)
|
if (!device)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
device->dev.parent = &mei_device->pdev->dev;
|
device->cl = cl;
|
||||||
|
|
||||||
|
device->dev.parent = &dev->pdev->dev;
|
||||||
device->dev.bus = &mei_cl_bus_type;
|
device->dev.bus = &mei_cl_bus_type;
|
||||||
device->dev.type = &mei_cl_device_type;
|
device->dev.type = &mei_cl_device_type;
|
||||||
|
|
||||||
dev_set_name(&device->dev, "%s", name);
|
dev_set_name(&device->dev, "%s", name);
|
||||||
|
|
||||||
status = device_register(&device->dev);
|
status = device_register(&device->dev);
|
||||||
if (status)
|
if (status) {
|
||||||
goto out_err;
|
dev_err(&dev->pdev->dev, "Failed to register MEI device\n");
|
||||||
|
kfree(device);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
cl->device = device;
|
||||||
|
|
||||||
dev_dbg(&device->dev, "client %s registered\n", name);
|
dev_dbg(&device->dev, "client %s registered\n", name);
|
||||||
|
|
||||||
return device;
|
return device;
|
||||||
|
|
||||||
out_err:
|
|
||||||
dev_err(device->dev.parent, "Failed to register MEI client\n");
|
|
||||||
|
|
||||||
kfree(device);
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(mei_cl_add_device);
|
EXPORT_SYMBOL_GPL(mei_cl_add_device);
|
||||||
|
|
||||||
|
@ -367,9 +384,10 @@ out:
|
||||||
|
|
||||||
int mei_cl_send(struct mei_cl_device *device, u8 *buf, size_t length)
|
int mei_cl_send(struct mei_cl_device *device, u8 *buf, size_t length)
|
||||||
{
|
{
|
||||||
struct mei_cl *cl = NULL;
|
struct mei_cl *cl = device->cl;
|
||||||
|
|
||||||
/* TODO: hook between mei_bus_client and mei_cl */
|
if (cl == NULL)
|
||||||
|
return -ENODEV;
|
||||||
|
|
||||||
if (device->ops && device->ops->send)
|
if (device->ops && device->ops->send)
|
||||||
return device->ops->send(device, buf, length);
|
return device->ops->send(device, buf, length);
|
||||||
|
@ -380,9 +398,10 @@ EXPORT_SYMBOL_GPL(mei_cl_send);
|
||||||
|
|
||||||
int mei_cl_recv(struct mei_cl_device *device, u8 *buf, size_t length)
|
int mei_cl_recv(struct mei_cl_device *device, u8 *buf, size_t length)
|
||||||
{
|
{
|
||||||
struct mei_cl *cl = NULL;
|
struct mei_cl *cl = device->cl;
|
||||||
|
|
||||||
/* TODO: hook between mei_bus_client and mei_cl */
|
if (cl == NULL)
|
||||||
|
return -ENODEV;
|
||||||
|
|
||||||
if (device->ops && device->ops->recv)
|
if (device->ops && device->ops->recv)
|
||||||
return device->ops->recv(device, buf, length);
|
return device->ops->recv(device, buf, length);
|
||||||
|
|
|
@ -216,6 +216,7 @@ void mei_cl_init(struct mei_cl *cl, struct mei_device *dev)
|
||||||
init_waitqueue_head(&cl->rx_wait);
|
init_waitqueue_head(&cl->rx_wait);
|
||||||
init_waitqueue_head(&cl->tx_wait);
|
init_waitqueue_head(&cl->tx_wait);
|
||||||
INIT_LIST_HEAD(&cl->link);
|
INIT_LIST_HEAD(&cl->link);
|
||||||
|
INIT_LIST_HEAD(&cl->device_link);
|
||||||
cl->reading_state = MEI_IDLE;
|
cl->reading_state = MEI_IDLE;
|
||||||
cl->writing_state = MEI_IDLE;
|
cl->writing_state = MEI_IDLE;
|
||||||
cl->dev = dev;
|
cl->dev = dev;
|
||||||
|
|
|
@ -47,6 +47,7 @@ void mei_device_init(struct mei_device *dev)
|
||||||
{
|
{
|
||||||
/* setup our list array */
|
/* setup our list array */
|
||||||
INIT_LIST_HEAD(&dev->file_list);
|
INIT_LIST_HEAD(&dev->file_list);
|
||||||
|
INIT_LIST_HEAD(&dev->device_list);
|
||||||
mutex_init(&dev->device_lock);
|
mutex_init(&dev->device_lock);
|
||||||
init_waitqueue_head(&dev->wait_hw_ready);
|
init_waitqueue_head(&dev->wait_hw_ready);
|
||||||
init_waitqueue_head(&dev->wait_recvd_msg);
|
init_waitqueue_head(&dev->wait_recvd_msg);
|
||||||
|
|
|
@ -209,6 +209,11 @@ struct mei_cl {
|
||||||
enum mei_file_transaction_states writing_state;
|
enum mei_file_transaction_states writing_state;
|
||||||
int sm_state;
|
int sm_state;
|
||||||
struct mei_cl_cb *read_cb;
|
struct mei_cl_cb *read_cb;
|
||||||
|
|
||||||
|
/* MEI CL bus data */
|
||||||
|
struct mei_cl_device *device;
|
||||||
|
struct list_head device_link;
|
||||||
|
uuid_le device_uuid;
|
||||||
};
|
};
|
||||||
|
|
||||||
/** struct mei_hw_ops
|
/** struct mei_hw_ops
|
||||||
|
@ -423,6 +428,9 @@ struct mei_device {
|
||||||
|
|
||||||
struct work_struct init_work;
|
struct work_struct init_work;
|
||||||
|
|
||||||
|
/* List of bus devices */
|
||||||
|
struct list_head device_list;
|
||||||
|
|
||||||
const struct mei_hw_ops *ops;
|
const struct mei_hw_ops *ops;
|
||||||
char hw[0] __aligned(sizeof(void *));
|
char hw[0] __aligned(sizeof(void *));
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue