On Wed, May 20, 2020 at 12:02:25AM -0700, Jeff Kirsher wrote:
> From: Ranjani Sridharan <ranjani.sridha...@linux.intel.com>
> 
> A client in the SOF (Sound Open Firmware) context is a
> device that needs to communicate with the DSP via IPC
> messages. The SOF core is responsible for serializing the
> IPC messages to the DSP from the different clients. One
> example of an SOF client would be an IPC test client that
> floods the DSP with test IPC messages to validate if the
> serialization works as expected. Multi-client support will
> also add the ability to split the existing audio cards
> into multiple ones, so as to e.g. to deal with HDMI with a
> dedicated client instead of adding HDMI to all cards.
> 
> This patch introduces descriptors for SOF client driver
> and SOF client device along with APIs for registering
> and unregistering a SOF client driver, sending IPCs from
> a client device and accessing the SOF core debugfs root entry.
> 
> Along with this, add a couple of new members to struct
> snd_sof_dev that will be used for maintaining the list of
> clients.

If you want to use sound as the rational for virtual bus then drop the
networking stuff and present a complete device/driver pairing based on
this sound stuff instead.

> +int sof_client_dev_register(struct snd_sof_dev *sdev,
> +                         const char *name)
> +{
> +     struct sof_client_dev *cdev;
> +     struct virtbus_device *vdev;
> +     unsigned long time, timeout;
> +     int ret;
> +
> +     cdev = kzalloc(sizeof(*cdev), GFP_KERNEL);
> +     if (!cdev)
> +             return -ENOMEM;
> +
> +     cdev->sdev = sdev;
> +     init_completion(&cdev->probe_complete);
> +     vdev = &cdev->vdev;
> +     vdev->match_name = name;
> +     vdev->dev.parent = sdev->dev;
> +     vdev->release = sof_client_virtdev_release;
> +
> +     /*
> +      * Register virtbus device for the client.
> +      * The error path in virtbus_register_device() calls put_device(),
> +      * which will free cdev in the release callback.
> +      */
> +     ret = virtbus_register_device(vdev);
> +     if (ret < 0)
> +             return ret;
> +
> +     /* make sure the probe is complete before updating client list */
> +     timeout = msecs_to_jiffies(SOF_CLIENT_PROBE_TIMEOUT_MS);
> +     time = wait_for_completion_timeout(&cdev->probe_complete, timeout);

This seems bonkers - the whole point of something like virtual bus is
to avoid madness like this.

> +     if (!time) {
> +             dev_err(sdev->dev, "error: probe of virtbus dev %s timed out\n",
> +                     name);
> +             virtbus_unregister_device(vdev);

Unregister does kfree? In general I've found that to be a bad idea,
many drivers need to free up resources after unregistering from their
subsystem.

> +#define virtbus_dev_to_sof_client_dev(virtbus_dev) \
> +     container_of(virtbus_dev, struct sof_client_dev, vdev)

Use static inline

Jason

Reply via email to