mirror of
https://github.com/torvalds/linux.git
synced 2024-11-01 09:41:44 +00:00
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,
|
||||
};
|
||||
|
||||
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)
|
||||
{
|
||||
struct mei_cl_device *device;
|
||||
struct mei_cl *cl;
|
||||
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);
|
||||
if (!device)
|
||||
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.type = &mei_cl_device_type;
|
||||
|
||||
dev_set_name(&device->dev, "%s", name);
|
||||
|
||||
status = device_register(&device->dev);
|
||||
if (status)
|
||||
goto out_err;
|
||||
if (status) {
|
||||
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);
|
||||
|
||||
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);
|
||||
|
||||
@ -367,9 +384,10 @@ out:
|
||||
|
||||
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)
|
||||
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)
|
||||
{
|
||||
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)
|
||||
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->tx_wait);
|
||||
INIT_LIST_HEAD(&cl->link);
|
||||
INIT_LIST_HEAD(&cl->device_link);
|
||||
cl->reading_state = MEI_IDLE;
|
||||
cl->writing_state = MEI_IDLE;
|
||||
cl->dev = dev;
|
||||
|
@ -47,6 +47,7 @@ void mei_device_init(struct mei_device *dev)
|
||||
{
|
||||
/* setup our list array */
|
||||
INIT_LIST_HEAD(&dev->file_list);
|
||||
INIT_LIST_HEAD(&dev->device_list);
|
||||
mutex_init(&dev->device_lock);
|
||||
init_waitqueue_head(&dev->wait_hw_ready);
|
||||
init_waitqueue_head(&dev->wait_recvd_msg);
|
||||
|
@ -209,6 +209,11 @@ struct mei_cl {
|
||||
enum mei_file_transaction_states writing_state;
|
||||
int sm_state;
|
||||
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
|
||||
@ -423,6 +428,9 @@ struct mei_device {
|
||||
|
||||
struct work_struct init_work;
|
||||
|
||||
/* List of bus devices */
|
||||
struct list_head device_list;
|
||||
|
||||
const struct mei_hw_ops *ops;
|
||||
char hw[0] __aligned(sizeof(void *));
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user