On Thu, Oct 19, 2017 at 08:33:18AM +0530, Vinod Koul wrote: > diff --git a/drivers/soundwire/bus_type.c b/drivers/soundwire/bus_type.c > new file mode 100644 > index 000000000000..a14d1de80afa > --- /dev/null > +++ b/drivers/soundwire/bus_type.c > @@ -0,0 +1,229 @@ > +/* > + * This file is provided under a dual BSD/GPLv2 license. When using or > + * redistributing this file, you may do so under either license. > + * > + * GPL LICENSE SUMMARY > + * > + * Copyright(c) 2015-17 Intel Corporation. > + * > + * This program is free software; you can redistribute it and/or modify > + * it under the terms of version 2 of the GNU General Public License as > + * published by the Free Software Foundation. > + * > + * This program is distributed in the hope that it will be useful, but > + * WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + * General Public License for more details. > + * > + * BSD LICENSE > + * > + * Copyright(c) 2015-17 Intel Corporation. > + * > + * Redistribution and use in source and binary forms, with or without > + * modification, are permitted provided that the following conditions > + * are met: > + * > + * * Redistributions of source code must retain the above copyright > + * notice, this list of conditions and the following disclaimer. > + * * Redistributions in binary form must reproduce the above copyright > + * notice, this list of conditions and the following disclaimer in > + * the documentation and/or other materials provided with the > + * distribution. > + * * Neither the name of Intel Corporation nor the names of its > + * contributors may be used to endorse or promote products derived > + * from this software without specific prior written permission. > + * > + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS > + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT > + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR > + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT > + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, > + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT > + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, > + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY > + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT > + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE > + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Are you _sure_ that code that interacts with the driver core can have a dual-license here? Have you explained to lawyers what you are doing here (wrapping gpl-only symbols with non-gpl-only exports)? And why dual license something that will only ever work on Linux? And finally, put a real SPDX header up there so that people don't have to parse that horrid amount of text to try to determine exactly what that license is. > + * > + */ > + > +#include <linux/acpi.h> > +#include <linux/device.h> > +#include <linux/init.h> > +#include <linux/module.h> > +#include <linux/mod_devicetable.h> > +#include <linux/pm_domain.h> > +#include <linux/pm_runtime.h> > +#include <linux/soundwire/sdw.h> > +#include "bus.h" > + > +/** > + * sdw_get_device_id: find the matching SoundWire device id > + * > + * @slave: SoundWire Slave device > + * @drv: SoundWire Slave Driver > + * > + * The match is done by comparing the mfg_id and part_id from the > + * struct sdw_device_id. class_id is unused, as it is a placeholder > + * in MIPI Spec. > + */ > +static const struct sdw_device_id * > +sdw_get_device_id(struct sdw_slave *slave, struct sdw_driver *drv) > +{ > + const struct sdw_device_id *id = drv->id_table; > + > + while (id && id->mfg_id) { > + if (slave->id.mfg_id == id->mfg_id && > + slave->id.part_id == id->part_id) { > + return id; > + } > + id++; > + } > + > + return NULL; > +} > + > +static int sdw_bus_match(struct device *dev, struct device_driver *ddrv) > +{ > + struct sdw_slave *slave = dev_to_sdw_dev(dev); > + struct sdw_driver *drv = drv_to_sdw_driver(ddrv); > + > + return !!sdw_get_device_id(slave, drv); > +} > + > +int sdw_slave_modalias(struct sdw_slave *slave, char *buf, size_t size) > +{ > + /* modalias is sdw:m<mfg_id>p<part_id> */ > + > + return snprintf(buf, size, "sdw:m%04Xp%04X\n", > + slave->id.mfg_id, slave->id.part_id); > +} > + > +static int sdw_uevent(struct device *dev, struct kobj_uevent_env *env) > +{ > + struct sdw_slave *slave = dev_to_sdw_dev(dev); > + char modalias[32]; > + > + sdw_slave_modalias(slave, modalias, sizeof(modalias)); > + > + if (add_uevent_var(env, "MODALIAS=%s", modalias)) > + return -ENOMEM; > + > + return 0; > +} > + > +struct bus_type sdw_bus_type = { > + .name = "soundwire", > + .match = sdw_bus_match, > + .uevent = sdw_uevent, > +}; > +EXPORT_SYMBOL(sdw_bus_type); EXPORT_SYMBOL_GPL()? No release callback? Who frees the device? > + > +static int sdw_drv_probe(struct device *dev) > +{ > + struct sdw_slave *slave = dev_to_sdw_dev(dev); > + struct sdw_driver *drv = drv_to_sdw_driver(dev->driver); > + const struct sdw_device_id *id; > + int ret; > + > + id = sdw_get_device_id(slave, drv); > + if (!id) > + return -ENODEV; > + > + /* > + * attach to power domain but don't turn on (last arg) > + */ > + ret = dev_pm_domain_attach(dev, false); > + if (ret) { > + dev_err(dev, "Failed to attach PM domain: %d\n", ret); > + return ret; > + } > + > + ret = drv->probe(slave, id); > + if (ret) { > + dev_err(dev, "Probe of %s failed: %d\n", drv->name, ret); > + return ret; > + } > + > + return 0; > +} > + > +static int sdw_drv_remove(struct device *dev) > +{ > + struct sdw_slave *slave = dev_to_sdw_dev(dev); > + struct sdw_driver *drv = drv_to_sdw_driver(dev->driver); > + > + if (drv->remove) > + drv->remove(slave); No catching the error value? > + > + dev_pm_domain_detach(dev, false); > + > + return 0; > +} > + > +static void sdw_drv_shutdown(struct device *dev) > +{ > + struct sdw_slave *slave = dev_to_sdw_dev(dev); > + struct sdw_driver *drv = drv_to_sdw_driver(dev->driver); > + > + if (drv->shutdown) > + drv->shutdown(slave); > +} > + > +/** > + * __sdw_register_driver - register a SoundWire Slave driver > + * > + * @drv: driver to register > + * @owner: owning module/driver > + * > + * Return: zero on success, else a negative error code. > + */ > +int __sdw_register_driver(struct sdw_driver *drv, struct module *owner) > +{ > + drv->driver.bus = &sdw_bus_type; > + > + if (!drv->probe) { > + pr_err("driver %s didn't provide SDW probe routine\n", > + drv->name); > + return -EINVAL; > + } > + > + drv->driver.owner = owner; > + drv->driver.probe = sdw_drv_probe; > + > + if (drv->remove) > + drv->driver.remove = sdw_drv_remove; > + > + if (drv->shutdown) > + drv->driver.shutdown = sdw_drv_shutdown; > + > + return driver_register(&drv->driver); > +} > +EXPORT_SYMBOL(__sdw_register_driver); > + > +/* > + * sdw_unregister_driver: unregisters the SoundWire Slave driver > + * > + * @drv: driver to unregister > + */ > +void sdw_unregister_driver(struct sdw_driver *drv) > +{ > + driver_unregister(&drv->driver); > +} > +EXPORT_SYMBOL(sdw_unregister_driver); EXPORT_SYMBOL_GPL()? Same for all the exports here (I have to ask, especially given what you are wrapping...) thanks, greg k-h _______________________________________________ Alsa-devel mailing list Alsa-devel@xxxxxxxxxxxxxxxx http://mailman.alsa-project.org/mailman/listinfo/alsa-devel