diff --git a/sound/soc/sof/ops.h b/sound/soc/sof/ops.h index b0b7cc1e49392f..c6374f0210e987 100644 --- a/sound/soc/sof/ops.h +++ b/sound/soc/sof/ops.h @@ -27,7 +27,8 @@ static inline int snd_sof_probe(struct snd_sof_dev *sdev) if (sof_ops(sdev)->probe) return sof_ops(sdev)->probe(sdev); - return 0; + dev_err(sdev->dev, "error: %s not defined\n", __func__); + return -ENOTSUPP; } static inline int snd_sof_remove(struct snd_sof_dev *sdev) @@ -44,7 +45,8 @@ static inline int snd_sof_dsp_run(struct snd_sof_dev *sdev) if (sof_ops(sdev)->run) return sof_ops(sdev)->run(sdev); - return 0; + dev_err(sdev->dev, "error: %s not defined\n", __func__); + return -ENOTSUPP; } static inline int snd_sof_dsp_stall(struct snd_sof_dev *sdev) @@ -152,15 +154,23 @@ static inline void snd_sof_dsp_dbg_dump(struct snd_sof_dev *sdev, u32 flags) static inline void snd_sof_dsp_write(struct snd_sof_dev *sdev, u32 bar, u32 offset, u32 value) { - if (sof_ops(sdev)->write) + if (sof_ops(sdev)->write) { sof_ops(sdev)->write(sdev, sdev->bar[bar] + offset, value); + return; + } + + dev_err_ratelimited(sdev->dev, "error: %s not defined\n", __func__); } static inline void snd_sof_dsp_write64(struct snd_sof_dev *sdev, u32 bar, u32 offset, u64 value) { - if (sof_ops(sdev)->write64) + if (sof_ops(sdev)->write64) { sof_ops(sdev)->write64(sdev, sdev->bar[bar] + offset, value); + return; + } + + dev_err_ratelimited(sdev->dev, "error: %s not defined\n", __func__); } static inline u32 snd_sof_dsp_read(struct snd_sof_dev *sdev, u32 bar, @@ -169,7 +179,8 @@ static inline u32 snd_sof_dsp_read(struct snd_sof_dev *sdev, u32 bar, if (sof_ops(sdev)->read) return sof_ops(sdev)->read(sdev, sdev->bar[bar] + offset); - return 0; + dev_err(sdev->dev, "error: %s not defined\n", __func__); + return -ENOTSUPP; } static inline u64 snd_sof_dsp_read64(struct snd_sof_dev *sdev, u32 bar, @@ -178,22 +189,31 @@ static inline u64 snd_sof_dsp_read64(struct snd_sof_dev *sdev, u32 bar, if (sof_ops(sdev)->read64) return sof_ops(sdev)->read64(sdev, sdev->bar[bar] + offset); - return 0; + dev_err(sdev->dev, "error: %s not defined\n", __func__); + return -ENOTSUPP; } /* block IO */ static inline void snd_sof_dsp_block_read(struct snd_sof_dev *sdev, u32 bar, u32 offset, void *dest, size_t bytes) { - if (sof_ops(sdev)->block_read) + if (sof_ops(sdev)->block_read) { sof_ops(sdev)->block_read(sdev, bar, offset, dest, bytes); + return; + } + + dev_err_ratelimited(sdev->dev, "error: %s not defined\n", __func__); } static inline void snd_sof_dsp_block_write(struct snd_sof_dev *sdev, u32 bar, u32 offset, void *src, size_t bytes) { - if (sof_ops(sdev)->block_write) + if (sof_ops(sdev)->block_write) { sof_ops(sdev)->block_write(sdev, bar, offset, src, bytes); + return; + } + + dev_err_ratelimited(sdev->dev, "error: %s not defined\n", __func__); } /* mailbox */ @@ -201,16 +221,24 @@ static inline void snd_sof_dsp_mailbox_read(struct snd_sof_dev *sdev, u32 offset, void *message, size_t bytes) { - if (sof_ops(sdev)->mailbox_read) + if (sof_ops(sdev)->mailbox_read) { sof_ops(sdev)->mailbox_read(sdev, offset, message, bytes); + return; + } + + dev_err_ratelimited(sdev->dev, "error: %s not defined\n", __func__); } static inline void snd_sof_dsp_mailbox_write(struct snd_sof_dev *sdev, u32 offset, void *message, size_t bytes) { - if (sof_ops(sdev)->mailbox_write) + if (sof_ops(sdev)->mailbox_write) { sof_ops(sdev)->mailbox_write(sdev, offset, message, bytes); + return; + } + + dev_err_ratelimited(sdev->dev, "error: %s not defined\n", __func__); } /* ipc */ @@ -220,7 +248,8 @@ static inline int snd_sof_dsp_send_msg(struct snd_sof_dev *sdev, if (sof_ops(sdev)->send_msg) return sof_ops(sdev)->send_msg(sdev, msg); - return 0; + dev_err(sdev->dev, "error: %s not defined\n", __func__); + return -ENOTSUPP; } static inline int snd_sof_dsp_get_reply(struct snd_sof_dev *sdev, @@ -229,7 +258,8 @@ static inline int snd_sof_dsp_get_reply(struct snd_sof_dev *sdev, if (sof_ops(sdev)->get_reply) return sof_ops(sdev)->get_reply(sdev, msg); - return 0; + dev_err(sdev->dev, "error: %s not defined\n", __func__); + return -ENOTSUPP; } static inline int snd_sof_dsp_is_ipc_ready(struct snd_sof_dev *sdev) @@ -237,7 +267,8 @@ static inline int snd_sof_dsp_is_ipc_ready(struct snd_sof_dev *sdev) if (sof_ops(sdev)->is_ipc_ready) return sof_ops(sdev)->is_ipc_ready(sdev); - return 0; + dev_err(sdev->dev, "error: %s not defined\n", __func__); + return -ENOTSUPP; } static inline int snd_sof_dsp_cmd_done(struct snd_sof_dev *sdev, @@ -246,7 +277,8 @@ static inline int snd_sof_dsp_cmd_done(struct snd_sof_dev *sdev, if (sof_ops(sdev)->cmd_done) return sof_ops(sdev)->cmd_done(sdev, dir); - return 0; + dev_err(sdev->dev, "error: %s not defined\n", __func__); + return -ENOTSUPP; } /* host DMA trace */ diff --git a/sound/soc/sof/sof-priv.h b/sound/soc/sof/sof-priv.h index ed0a35d680c488..f0cd75213d5a3b 100644 --- a/sound/soc/sof/sof-priv.h +++ b/sound/soc/sof/sof-priv.h @@ -67,105 +67,114 @@ struct snd_sof_pdata; * and DSP device(s). */ struct snd_sof_dsp_ops { + /* probe and remove */ - int (*remove)(struct snd_sof_dev *sof_dev); - int (*probe)(struct snd_sof_dev *sof_dev); + int (*probe)(struct snd_sof_dev *sof_dev); /* mandatory */ + int (*remove)(struct snd_sof_dev *sof_dev); /* optional */ /* DSP core boot / reset */ - int (*run)(struct snd_sof_dev *sof_dev); - int (*stall)(struct snd_sof_dev *sof_dev); - int (*reset)(struct snd_sof_dev *sof_dev); + int (*run)(struct snd_sof_dev *sof_dev); /* mandatory */ + int (*stall)(struct snd_sof_dev *sof_dev); /* optional */ + int (*reset)(struct snd_sof_dev *sof_dev); /* optional */ int (*core_power_up)(struct snd_sof_dev *sof_dev, - unsigned int core_mask); + unsigned int core_mask); /* optional */ int (*core_power_down)(struct snd_sof_dev *sof_dev, - unsigned int core_mask); - - /* pre/post firmware run */ - int (*pre_fw_run)(struct snd_sof_dev *sof_dev); - int (*post_fw_run)(struct snd_sof_dev *sof_dev); - - /* DSP PM */ - int (*suspend)(struct snd_sof_dev *sof_dev, int state); - int (*resume)(struct snd_sof_dev *sof_dev); - int (*runtime_suspend)(struct snd_sof_dev *sof_dev, int state); - int (*runtime_resume)(struct snd_sof_dev *sof_dev); - - /* DSP clocking */ - int (*set_clk)(struct snd_sof_dev *sof_dev, u32 freq); + unsigned int core_mask); /* optional */ /* Register IO */ void (*write)(struct snd_sof_dev *sof_dev, void __iomem *addr, - u32 value); - u32 (*read)(struct snd_sof_dev *sof_dev, void __iomem *addr); + u32 value); /* mandatory */ + u32 (*read)(struct snd_sof_dev *sof_dev, + void __iomem *addr); /* mandatory */ void (*write64)(struct snd_sof_dev *sof_dev, void __iomem *addr, - u64 value); - u64 (*read64)(struct snd_sof_dev *sof_dev, void __iomem *addr); + u64 value); /* mandatory */ + u64 (*read64)(struct snd_sof_dev *sof_dev, + void __iomem *addr); /* mandatory */ /* memcpy IO */ void (*block_read)(struct snd_sof_dev *sof_dev, u32 bar, - u32 offset, void *dest, size_t size); + u32 offset, void *dest, + size_t size); /* mandatory */ void (*block_write)(struct snd_sof_dev *sof_dev, u32 bar, - u32 offset, void *src, size_t size); + u32 offset, void *src, + size_t size); /* mandatory */ /* doorbell */ - irqreturn_t (*irq_handler)(int irq, void *context); - irqreturn_t (*irq_thread)(int irq, void *context); + irqreturn_t (*irq_handler)(int irq, void *context); /* mandatory */ + irqreturn_t (*irq_thread)(int irq, void *context); /* mandatory */ /* mailbox */ void (*mailbox_read)(struct snd_sof_dev *sof_dev, u32 offset, - void *addr, size_t bytes); + void *addr, size_t bytes); /* mandatory */ void (*mailbox_write)(struct snd_sof_dev *sof_dev, u32 offset, - void *addr, size_t bytes); + void *addr, size_t bytes); /* mandatory */ /* ipc */ int (*send_msg)(struct snd_sof_dev *sof_dev, - struct snd_sof_ipc_msg *msg); + struct snd_sof_ipc_msg *msg); /* mandatory */ int (*get_reply)(struct snd_sof_dev *sof_dev, - struct snd_sof_ipc_msg *msg); - int (*is_ipc_ready)(struct snd_sof_dev *sof_dev); - int (*cmd_done)(struct snd_sof_dev *sof_dev, int dir); + struct snd_sof_ipc_msg *msg); /* mandatory */ + int (*is_ipc_ready)(struct snd_sof_dev *sof_dev); /* mandatory */ + int (*cmd_done)(struct snd_sof_dev *sof_dev, int dir); /* mandatory */ - /* debug */ - const struct snd_sof_debugfs_map *debug_map; - int debug_map_count; - void (*dbg_dump)(struct snd_sof_dev *sof_dev, u32 flags); + /* FW loading */ + int (*load_firmware)(struct snd_sof_dev *sof_dev); /* mandatory */ + int (*load_module)(struct snd_sof_dev *sof_dev, + struct snd_sof_mod_hdr *hdr); /* optional */ + /* + * FW ready checks for ABI compatibility and creates + * memory windows at first boot + */ + int (*fw_ready)(struct snd_sof_dev *sdev, u32 msg_id); /* mandatory */ /* connect pcm substream to a host stream */ int (*pcm_open)(struct snd_sof_dev *sdev, - struct snd_pcm_substream *substream); + struct snd_pcm_substream *substream); /* optional */ /* disconnect pcm substream to a host stream */ int (*pcm_close)(struct snd_sof_dev *sdev, - struct snd_pcm_substream *substream); + struct snd_pcm_substream *substream); /* optional */ /* host stream hw params */ int (*pcm_hw_params)(struct snd_sof_dev *sdev, struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, - struct sof_ipc_stream_params *ipc_params); + struct sof_ipc_stream_params *ipc_params); /* optional */ /* host stream trigger */ int (*pcm_trigger)(struct snd_sof_dev *sdev, - struct snd_pcm_substream *substream, int cmd); + struct snd_pcm_substream *substream, + int cmd); /* optional */ /* host stream pointer */ snd_pcm_uframes_t (*pcm_pointer)(struct snd_sof_dev *sdev, - struct snd_pcm_substream *substream); + struct snd_pcm_substream *substream); /* optional */ - /* FW loading */ - int (*load_firmware)(struct snd_sof_dev *sof_dev); - int (*load_module)(struct snd_sof_dev *sof_dev, - struct snd_sof_mod_hdr *hdr); + /* pre/post firmware run */ + int (*pre_fw_run)(struct snd_sof_dev *sof_dev); /* optional */ + int (*post_fw_run)(struct snd_sof_dev *sof_dev); /* optional */ - /* - * FW ready checks for ABI compatibility and creates - * memory windows at first boot - */ - int (*fw_ready)(struct snd_sof_dev *sdev, u32 msg_id); + /* DSP PM */ + int (*suspend)(struct snd_sof_dev *sof_dev, int state); /* optional */ + int (*resume)(struct snd_sof_dev *sof_dev); /* optional */ + int (*runtime_suspend)(struct snd_sof_dev *sof_dev, + int state); /* optional */ + int (*runtime_resume)(struct snd_sof_dev *sof_dev); /* optional */ + + /* DSP clocking */ + int (*set_clk)(struct snd_sof_dev *sof_dev, u32 freq); /* optional */ + + /* debug */ + const struct snd_sof_debugfs_map *debug_map; /* optional */ + int debug_map_count; /* optional */ + void (*dbg_dump)(struct snd_sof_dev *sof_dev, + u32 flags); /* optional */ /* host DMA trace initialization */ - int (*trace_init)(struct snd_sof_dev *sdev, u32 *stream_tag); - int (*trace_release)(struct snd_sof_dev *sdev); - int (*trace_trigger)(struct snd_sof_dev *sdev, int cmd); + int (*trace_init)(struct snd_sof_dev *sdev, + u32 *stream_tag); /* optional */ + int (*trace_release)(struct snd_sof_dev *sdev); /* optional */ + int (*trace_trigger)(struct snd_sof_dev *sdev, + int cmd); /* optional */ /* DAI ops */ struct snd_soc_dai_driver *drv;