lkml.org 
[lkml]   [2020]   [Nov]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v4 04/10] ASoC: SOF: ops: Add ops for client registration
    Date
    From: Ranjani Sridharan <ranjani.sridharan@linux.intel.com>

    Add new ops for registering/unregistering clients based
    on DSP capabilities and/or DT information.

    Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
    Signed-off-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com>
    Signed-off-by: Dave Ertman <david.m.ertman@intel.com>
    ---
    sound/soc/sof/core.c | 10 ++++++++++
    sound/soc/sof/ops.h | 14 ++++++++++++++
    sound/soc/sof/sof-priv.h | 4 ++++
    3 files changed, 28 insertions(+)

    diff --git a/sound/soc/sof/core.c b/sound/soc/sof/core.c
    index 72a97219395f..ddb9a12d5aac 100644
    --- a/sound/soc/sof/core.c
    +++ b/sound/soc/sof/core.c
    @@ -246,8 +246,17 @@ static int sof_probe_continue(struct snd_sof_dev *sdev)
    if (plat_data->sof_probe_complete)
    plat_data->sof_probe_complete(sdev->dev);

    + /* If registering certain clients fails, unregister the previously registered clients. */
    + ret = snd_sof_register_clients(sdev);
    + if (ret < 0) {
    + dev_err(sdev->dev, "error: failed to register clients %d\n", ret);
    + goto client_reg_err;
    + }
    +
    return 0;

    +client_reg_err:
    + snd_sof_unregister_clients(sdev);
    fw_trace_err:
    snd_sof_free_trace(sdev);
    fw_run_err:
    @@ -356,6 +365,7 @@ int snd_sof_device_remove(struct device *dev)
    dev_warn(dev, "error: %d failed to prepare DSP for device removal",
    ret);

    + snd_sof_unregister_clients(sdev);
    snd_sof_fw_unload(sdev);
    snd_sof_ipc_free(sdev);
    snd_sof_free_debug(sdev);
    diff --git a/sound/soc/sof/ops.h b/sound/soc/sof/ops.h
    index b21632f5511a..00370f8bcd75 100644
    --- a/sound/soc/sof/ops.h
    +++ b/sound/soc/sof/ops.h
    @@ -470,6 +470,20 @@ snd_sof_set_mach_params(const struct snd_soc_acpi_mach *mach,
    sof_ops(sdev)->set_mach_params(mach, dev);
    }

    +static inline int snd_sof_register_clients(struct snd_sof_dev *sdev)
    +{
    + if (sof_ops(sdev) && sof_ops(sdev)->register_clients)
    + return sof_ops(sdev)->register_clients(sdev);
    +
    + return 0;
    +}
    +
    +static inline void snd_sof_unregister_clients(struct snd_sof_dev *sdev)
    +{
    + if (sof_ops(sdev) && sof_ops(sdev)->unregister_clients)
    + sof_ops(sdev)->unregister_clients(sdev);
    +}
    +
    static inline const struct snd_sof_dsp_ops
    *sof_get_ops(const struct sof_dev_desc *d,
    const struct sof_ops_table mach_ops[], int asize)
    diff --git a/sound/soc/sof/sof-priv.h b/sound/soc/sof/sof-priv.h
    index dceac73b858f..cca239c09d0e 100644
    --- a/sound/soc/sof/sof-priv.h
    +++ b/sound/soc/sof/sof-priv.h
    @@ -252,6 +252,10 @@ struct snd_sof_dsp_ops {
    void (*set_mach_params)(const struct snd_soc_acpi_mach *mach,
    struct device *dev); /* optional */

    + /* client ops */
    + int (*register_clients)(struct snd_sof_dev *sdev); /* optional */
    + void (*unregister_clients)(struct snd_sof_dev *sdev); /* optional */
    +
    /* DAI ops */
    struct snd_soc_dai_driver *drv;
    int num_drv;
    --
    2.26.2
    \
     
     \ /
      Last update: 2020-11-13 17:23    [W:2.770 / U:0.568 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site