mirror of
https://github.com/torvalds/linux.git
synced 2024-12-25 20:32:22 +00:00
staging: most: remove device from interface structure
This patch makes the adapter drivers use their own device structures when registering a most interface with the core module. With this the module that actually operates the physical device is the owner of the device. Signed-off-by: Christian Gromm <christian.gromm@microchip.com> Link: https://lore.kernel.org/r/1579793906-5054-2-git-send-email-christian.gromm@microchip.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
2893c67832
commit
723de0f917
@ -402,7 +402,7 @@ static ssize_t description_show(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct most_interface *iface = to_most_interface(dev);
|
||||
struct most_interface *iface = dev_get_drvdata(dev);
|
||||
|
||||
return snprintf(buf, PAGE_SIZE, "%s\n", iface->description);
|
||||
}
|
||||
@ -411,7 +411,7 @@ static ssize_t interface_show(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct most_interface *iface = to_most_interface(dev);
|
||||
struct most_interface *iface = dev_get_drvdata(dev);
|
||||
|
||||
switch (iface->interface) {
|
||||
case ITYPE_LOOPBACK:
|
||||
@ -476,7 +476,7 @@ static int print_links(struct device *dev, void *data)
|
||||
int offs = d->offs;
|
||||
char *buf = d->buf;
|
||||
struct most_channel *c;
|
||||
struct most_interface *iface = to_most_interface(dev);
|
||||
struct most_interface *iface = dev_get_drvdata(dev);
|
||||
|
||||
list_for_each_entry(c, &iface->p->channel_list, list) {
|
||||
if (c->pipe0.comp) {
|
||||
@ -484,7 +484,7 @@ static int print_links(struct device *dev, void *data)
|
||||
PAGE_SIZE - offs,
|
||||
"%s:%s:%s\n",
|
||||
c->pipe0.comp->name,
|
||||
dev_name(&iface->dev),
|
||||
dev_name(iface->dev),
|
||||
dev_name(&c->dev));
|
||||
}
|
||||
if (c->pipe1.comp) {
|
||||
@ -492,7 +492,7 @@ static int print_links(struct device *dev, void *data)
|
||||
PAGE_SIZE - offs,
|
||||
"%s:%s:%s\n",
|
||||
c->pipe1.comp->name,
|
||||
dev_name(&iface->dev),
|
||||
dev_name(iface->dev),
|
||||
dev_name(&c->dev));
|
||||
}
|
||||
}
|
||||
@ -534,7 +534,7 @@ static struct most_channel *get_channel(char *mdev, char *mdev_ch)
|
||||
dev = bus_find_device_by_name(&mc.bus, NULL, mdev);
|
||||
if (!dev)
|
||||
return NULL;
|
||||
iface = to_most_interface(dev);
|
||||
iface = dev_get_drvdata(dev);
|
||||
list_for_each_entry_safe(c, tmp, &iface->p->channel_list, list) {
|
||||
if (!strcmp(dev_name(&c->dev), mdev_ch))
|
||||
return c;
|
||||
@ -1232,7 +1232,7 @@ static int disconnect_channels(struct device *dev, void *data)
|
||||
struct most_channel *c, *tmp;
|
||||
struct most_component *comp = data;
|
||||
|
||||
iface = to_most_interface(dev);
|
||||
iface = dev_get_drvdata(dev);
|
||||
list_for_each_entry_safe(c, tmp, &iface->p->channel_list, list) {
|
||||
if (c->pipe0.comp == comp || c->pipe1.comp == comp)
|
||||
comp->disconnect_channel(c->iface, c->channel_id);
|
||||
@ -1261,14 +1261,11 @@ int most_deregister_component(struct most_component *comp)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(most_deregister_component);
|
||||
|
||||
static void release_interface(struct device *dev)
|
||||
{
|
||||
dev_info(&mc.dev, "releasing interface dev %s...\n", dev_name(dev));
|
||||
}
|
||||
|
||||
static void release_channel(struct device *dev)
|
||||
{
|
||||
dev_info(&mc.dev, "releasing channel dev %s...\n", dev_name(dev));
|
||||
struct most_channel *c = to_channel(dev);
|
||||
|
||||
kfree(c);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1305,14 +1302,14 @@ int most_register_interface(struct most_interface *iface)
|
||||
INIT_LIST_HEAD(&iface->p->channel_list);
|
||||
iface->p->dev_id = id;
|
||||
strscpy(iface->p->name, iface->description, sizeof(iface->p->name));
|
||||
iface->dev.init_name = iface->p->name;
|
||||
iface->dev.bus = &mc.bus;
|
||||
iface->dev.parent = &mc.dev;
|
||||
iface->dev.groups = interface_attr_groups;
|
||||
iface->dev.release = release_interface;
|
||||
if (device_register(&iface->dev)) {
|
||||
iface->dev->bus = &mc.bus;
|
||||
iface->dev->parent = &mc.dev;
|
||||
iface->dev->groups = interface_attr_groups;
|
||||
dev_set_drvdata(iface->dev, iface);
|
||||
if (device_register(iface->dev)) {
|
||||
dev_err(&mc.dev, "registering iface->dev failed\n");
|
||||
kfree(iface->p);
|
||||
put_device(iface->dev);
|
||||
ida_simple_remove(&mdev_id, id);
|
||||
return -ENOMEM;
|
||||
}
|
||||
@ -1328,7 +1325,7 @@ int most_register_interface(struct most_interface *iface)
|
||||
else
|
||||
snprintf(c->name, STRING_SIZE, "%s", name_suffix);
|
||||
c->dev.init_name = c->name;
|
||||
c->dev.parent = &iface->dev;
|
||||
c->dev.parent = iface->dev;
|
||||
c->dev.groups = channel_attr_groups;
|
||||
c->dev.release = release_channel;
|
||||
iface->p->channel[i] = c;
|
||||
@ -1362,16 +1359,15 @@ int most_register_interface(struct most_interface *iface)
|
||||
return 0;
|
||||
|
||||
err_free_most_channel:
|
||||
kfree(c);
|
||||
put_device(&c->dev);
|
||||
|
||||
err_free_resources:
|
||||
while (i > 0) {
|
||||
c = iface->p->channel[--i];
|
||||
device_unregister(&c->dev);
|
||||
kfree(c);
|
||||
}
|
||||
kfree(iface->p);
|
||||
device_unregister(&iface->dev);
|
||||
device_unregister(iface->dev);
|
||||
ida_simple_remove(&mdev_id, id);
|
||||
return -ENOMEM;
|
||||
}
|
||||
@ -1401,12 +1397,11 @@ void most_deregister_interface(struct most_interface *iface)
|
||||
c->pipe1.comp = NULL;
|
||||
list_del(&c->list);
|
||||
device_unregister(&c->dev);
|
||||
kfree(c);
|
||||
}
|
||||
|
||||
ida_simple_remove(&mdev_id, iface->p->dev_id);
|
||||
kfree(iface->p);
|
||||
device_unregister(&iface->dev);
|
||||
device_unregister(iface->dev);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(most_deregister_interface);
|
||||
|
||||
|
@ -854,8 +854,8 @@ static int dim2_probe(struct platform_device *pdev)
|
||||
dev->most_iface.poison_channel = poison_channel;
|
||||
dev->most_iface.request_netinfo = request_netinfo;
|
||||
dev->most_iface.driver_dev = &pdev->dev;
|
||||
dev->most_iface.dev = &dev->dev;
|
||||
dev->dev.init_name = "dim2_state";
|
||||
dev->dev.parent = &dev->most_iface.dev;
|
||||
|
||||
ret = most_register_interface(&dev->most_iface);
|
||||
if (ret) {
|
||||
|
@ -229,7 +229,7 @@ struct mbo {
|
||||
* @priv Private field used by mostcore to store context information.
|
||||
*/
|
||||
struct most_interface {
|
||||
struct device dev;
|
||||
struct device *dev;
|
||||
struct device *driver_dev;
|
||||
struct module *mod;
|
||||
enum most_interface_type interface;
|
||||
@ -251,8 +251,6 @@ struct most_interface {
|
||||
struct interface_private *p;
|
||||
};
|
||||
|
||||
#define to_most_interface(d) container_of(d, struct most_interface, dev)
|
||||
|
||||
/**
|
||||
* struct most_component - identifies a loadable component for the mostcore
|
||||
* @list: list_head
|
||||
|
@ -102,6 +102,7 @@ struct clear_hold_work {
|
||||
* @poll_work_obj: work for polling link status
|
||||
*/
|
||||
struct most_dev {
|
||||
struct device dev;
|
||||
struct usb_device *usb_device;
|
||||
struct most_interface iface;
|
||||
struct most_channel_capability *cap;
|
||||
@ -123,6 +124,7 @@ struct most_dev {
|
||||
};
|
||||
|
||||
#define to_mdev(d) container_of(d, struct most_dev, iface)
|
||||
#define to_mdev_from_dev(d) container_of(d, struct most_dev, dev)
|
||||
#define to_mdev_from_work(w) container_of(w, struct most_dev, poll_work_obj)
|
||||
|
||||
static void wq_clear_halt(struct work_struct *wq_obj);
|
||||
@ -1023,6 +1025,12 @@ static void release_dci(struct device *dev)
|
||||
kfree(dci);
|
||||
}
|
||||
|
||||
static void release_mdev(struct device *dev)
|
||||
{
|
||||
struct most_dev *mdev = to_mdev_from_dev(dev);
|
||||
|
||||
kfree(mdev);
|
||||
}
|
||||
/**
|
||||
* hdm_probe - probe function of USB device driver
|
||||
* @interface: Interface of the attached USB device
|
||||
@ -1061,6 +1069,7 @@ hdm_probe(struct usb_interface *interface, const struct usb_device_id *id)
|
||||
mdev->link_stat_timer.expires = jiffies + (2 * HZ);
|
||||
|
||||
mdev->iface.mod = hdm_usb_fops.owner;
|
||||
mdev->iface.dev = &mdev->dev;
|
||||
mdev->iface.driver_dev = &interface->dev;
|
||||
mdev->iface.interface = ITYPE_USB;
|
||||
mdev->iface.configure = hdm_configure_channel;
|
||||
@ -1079,6 +1088,9 @@ hdm_probe(struct usb_interface *interface, const struct usb_device_id *id)
|
||||
usb_dev->config->desc.bConfigurationValue,
|
||||
usb_iface_desc->desc.bInterfaceNumber);
|
||||
|
||||
mdev->dev.init_name = mdev->description;
|
||||
mdev->dev.parent = &interface->dev;
|
||||
mdev->dev.release = release_mdev;
|
||||
mdev->conf = kcalloc(num_endpoints, sizeof(*mdev->conf), GFP_KERNEL);
|
||||
if (!mdev->conf)
|
||||
goto err_free_mdev;
|
||||
@ -1152,7 +1164,7 @@ hdm_probe(struct usb_interface *interface, const struct usb_device_id *id)
|
||||
}
|
||||
|
||||
mdev->dci->dev.init_name = "dci";
|
||||
mdev->dci->dev.parent = &mdev->iface.dev;
|
||||
mdev->dci->dev.parent = get_device(mdev->iface.dev);
|
||||
mdev->dci->dev.groups = dci_attr_groups;
|
||||
mdev->dci->dev.release = release_dci;
|
||||
if (device_register(&mdev->dci->dev)) {
|
||||
@ -1166,7 +1178,7 @@ hdm_probe(struct usb_interface *interface, const struct usb_device_id *id)
|
||||
mutex_unlock(&mdev->io_mutex);
|
||||
return 0;
|
||||
err_free_dci:
|
||||
kfree(mdev->dci);
|
||||
put_device(&mdev->dci->dev);
|
||||
err_free_busy_urbs:
|
||||
kfree(mdev->busy_urbs);
|
||||
err_free_ep_address:
|
||||
@ -1176,7 +1188,7 @@ err_free_cap:
|
||||
err_free_conf:
|
||||
kfree(mdev->conf);
|
||||
err_free_mdev:
|
||||
kfree(mdev);
|
||||
put_device(&mdev->dev);
|
||||
err_out_of_memory:
|
||||
if (ret == 0 || ret == -ENOMEM) {
|
||||
ret = -ENOMEM;
|
||||
@ -1213,7 +1225,7 @@ static void hdm_disconnect(struct usb_interface *interface)
|
||||
kfree(mdev->cap);
|
||||
kfree(mdev->conf);
|
||||
kfree(mdev->ep_address);
|
||||
kfree(mdev);
|
||||
put_device(&mdev->dev);
|
||||
}
|
||||
|
||||
static struct usb_driver hdm_usb = {
|
||||
|
Loading…
Reference in New Issue
Block a user