Loading sound/soc/sh/rcar/core.c +23 −1 Original line number Diff line number Diff line Loading @@ -145,16 +145,29 @@ struct dma_chan *rsnd_mod_dma_req(struct rsnd_mod *mod) return mod->ops->dma_req(mod); } void rsnd_mod_init(struct rsnd_mod *mod, int rsnd_mod_init(struct rsnd_mod *mod, struct rsnd_mod_ops *ops, struct clk *clk, enum rsnd_mod_type type, int id) { int ret = clk_prepare(clk); if (ret) return ret; mod->id = id; mod->ops = ops; mod->type = type; mod->clk = clk; return ret; } void rsnd_mod_quit(struct rsnd_mod *mod) { if (mod->clk) clk_unprepare(mod->clk); } /* Loading Loading @@ -1073,6 +1086,12 @@ static int rsnd_remove(struct platform_device *pdev) { struct rsnd_priv *priv = dev_get_drvdata(&pdev->dev); struct rsnd_dai *rdai; void (*remove_func[])(struct platform_device *pdev, struct rsnd_priv *priv) = { rsnd_ssi_remove, rsnd_src_remove, rsnd_dvc_remove, }; int ret = 0, i; pm_runtime_disable(&pdev->dev); Loading @@ -1082,6 +1101,9 @@ static int rsnd_remove(struct platform_device *pdev) ret |= rsnd_dai_call(remove, &rdai->capture, priv); } for (i = 0; i < ARRAY_SIZE(remove_func); i++) remove_func[i](pdev, priv); snd_soc_unregister_component(&pdev->dev); snd_soc_unregister_platform(&pdev->dev); Loading sound/soc/sh/rcar/dvc.c +15 −2 Original line number Diff line number Diff line Loading @@ -345,7 +345,7 @@ int rsnd_dvc_probe(struct platform_device *pdev, struct rsnd_dvc *dvc; struct clk *clk; char name[RSND_DVC_NAME_SIZE]; int i, nr; int i, nr, ret; rsnd_of_parse_dvc(pdev, of_data, priv); Loading Loading @@ -378,11 +378,24 @@ int rsnd_dvc_probe(struct platform_device *pdev, dvc->info = &info->dvc_info[i]; rsnd_mod_init(&dvc->mod, &rsnd_dvc_ops, ret = rsnd_mod_init(&dvc->mod, &rsnd_dvc_ops, clk, RSND_MOD_DVC, i); if (ret) return ret; dev_dbg(dev, "CMD%d probed\n", i); } return 0; } void rsnd_dvc_remove(struct platform_device *pdev, struct rsnd_priv *priv) { struct rsnd_dvc *dvc; int i; for_each_rsnd_dvc(dvc, priv, i) { rsnd_mod_quit(&dvc->mod); } } sound/soc/sh/rcar/rsnd.h +8 −3 Original line number Diff line number Diff line Loading @@ -285,14 +285,15 @@ struct rsnd_mod { #define rsnd_mod_to_dma(mod) (&(mod)->dma) #define rsnd_mod_to_io(mod) ((mod)->io) #define rsnd_mod_id(mod) ((mod)->id) #define rsnd_mod_hw_start(mod) clk_prepare_enable((mod)->clk) #define rsnd_mod_hw_stop(mod) clk_disable_unprepare((mod)->clk) #define rsnd_mod_hw_start(mod) clk_enable((mod)->clk) #define rsnd_mod_hw_stop(mod) clk_disable((mod)->clk) void rsnd_mod_init(struct rsnd_mod *mod, int rsnd_mod_init(struct rsnd_mod *mod, struct rsnd_mod_ops *ops, struct clk *clk, enum rsnd_mod_type type, int id); void rsnd_mod_quit(struct rsnd_mod *mod); char *rsnd_mod_name(struct rsnd_mod *mod); struct dma_chan *rsnd_mod_dma_req(struct rsnd_mod *mod); Loading Loading @@ -496,6 +497,8 @@ int rsnd_kctrl_new_e(struct rsnd_mod *mod, int rsnd_src_probe(struct platform_device *pdev, const struct rsnd_of_data *of_data, struct rsnd_priv *priv); void rsnd_src_remove(struct platform_device *pdev, struct rsnd_priv *priv); struct rsnd_mod *rsnd_src_mod_get(struct rsnd_priv *priv, int id); unsigned int rsnd_src_get_ssi_rate(struct rsnd_priv *priv, struct rsnd_dai_stream *io, Loading @@ -514,6 +517,8 @@ int rsnd_src_ssi_irq_disable(struct rsnd_mod *ssi_mod); int rsnd_ssi_probe(struct platform_device *pdev, const struct rsnd_of_data *of_data, struct rsnd_priv *priv); void rsnd_ssi_remove(struct platform_device *pdev, struct rsnd_priv *priv); struct rsnd_mod *rsnd_ssi_mod_get(struct rsnd_priv *priv, int id); int rsnd_ssi_is_pin_sharing(struct rsnd_mod *mod); int rsnd_ssi_is_dma_mode(struct rsnd_mod *mod); Loading sound/soc/sh/rcar/src.c +15 −2 Original line number Diff line number Diff line Loading @@ -867,7 +867,7 @@ int rsnd_src_probe(struct platform_device *pdev, struct rsnd_mod_ops *ops; struct clk *clk; char name[RSND_SRC_NAME_SIZE]; int i, nr; int i, nr, ret; ops = NULL; if (rsnd_is_gen1(priv)) Loading Loading @@ -907,10 +907,23 @@ int rsnd_src_probe(struct platform_device *pdev, src->info = &info->src_info[i]; rsnd_mod_init(&src->mod, ops, clk, RSND_MOD_SRC, i); ret = rsnd_mod_init(&src->mod, ops, clk, RSND_MOD_SRC, i); if (ret) return ret; dev_dbg(dev, "SRC%d probed\n", i); } return 0; } void rsnd_src_remove(struct platform_device *pdev, struct rsnd_priv *priv) { struct rsnd_src *src; int i; for_each_rsnd_src(src, priv, i) { rsnd_mod_quit(&src->mod); } } sound/soc/sh/rcar/ssi.c +15 −2 Original line number Diff line number Diff line Loading @@ -710,7 +710,7 @@ int rsnd_ssi_probe(struct platform_device *pdev, struct clk *clk; struct rsnd_ssi *ssi; char name[RSND_SSI_NAME_SIZE]; int i, nr; int i, nr, ret; rsnd_of_parse_ssi(pdev, of_data, priv); Loading Loading @@ -745,10 +745,23 @@ int rsnd_ssi_probe(struct platform_device *pdev, else if (rsnd_ssi_pio_available(ssi)) ops = &rsnd_ssi_pio_ops; rsnd_mod_init(&ssi->mod, ops, clk, RSND_MOD_SSI, i); ret = rsnd_mod_init(&ssi->mod, ops, clk, RSND_MOD_SSI, i); if (ret) return ret; rsnd_ssi_parent_clk_setup(priv, ssi); } return 0; } void rsnd_ssi_remove(struct platform_device *pdev, struct rsnd_priv *priv) { struct rsnd_ssi *ssi; int i; for_each_rsnd_ssi(ssi, priv, i) { rsnd_mod_quit(&ssi->mod); } } Loading
sound/soc/sh/rcar/core.c +23 −1 Original line number Diff line number Diff line Loading @@ -145,16 +145,29 @@ struct dma_chan *rsnd_mod_dma_req(struct rsnd_mod *mod) return mod->ops->dma_req(mod); } void rsnd_mod_init(struct rsnd_mod *mod, int rsnd_mod_init(struct rsnd_mod *mod, struct rsnd_mod_ops *ops, struct clk *clk, enum rsnd_mod_type type, int id) { int ret = clk_prepare(clk); if (ret) return ret; mod->id = id; mod->ops = ops; mod->type = type; mod->clk = clk; return ret; } void rsnd_mod_quit(struct rsnd_mod *mod) { if (mod->clk) clk_unprepare(mod->clk); } /* Loading Loading @@ -1073,6 +1086,12 @@ static int rsnd_remove(struct platform_device *pdev) { struct rsnd_priv *priv = dev_get_drvdata(&pdev->dev); struct rsnd_dai *rdai; void (*remove_func[])(struct platform_device *pdev, struct rsnd_priv *priv) = { rsnd_ssi_remove, rsnd_src_remove, rsnd_dvc_remove, }; int ret = 0, i; pm_runtime_disable(&pdev->dev); Loading @@ -1082,6 +1101,9 @@ static int rsnd_remove(struct platform_device *pdev) ret |= rsnd_dai_call(remove, &rdai->capture, priv); } for (i = 0; i < ARRAY_SIZE(remove_func); i++) remove_func[i](pdev, priv); snd_soc_unregister_component(&pdev->dev); snd_soc_unregister_platform(&pdev->dev); Loading
sound/soc/sh/rcar/dvc.c +15 −2 Original line number Diff line number Diff line Loading @@ -345,7 +345,7 @@ int rsnd_dvc_probe(struct platform_device *pdev, struct rsnd_dvc *dvc; struct clk *clk; char name[RSND_DVC_NAME_SIZE]; int i, nr; int i, nr, ret; rsnd_of_parse_dvc(pdev, of_data, priv); Loading Loading @@ -378,11 +378,24 @@ int rsnd_dvc_probe(struct platform_device *pdev, dvc->info = &info->dvc_info[i]; rsnd_mod_init(&dvc->mod, &rsnd_dvc_ops, ret = rsnd_mod_init(&dvc->mod, &rsnd_dvc_ops, clk, RSND_MOD_DVC, i); if (ret) return ret; dev_dbg(dev, "CMD%d probed\n", i); } return 0; } void rsnd_dvc_remove(struct platform_device *pdev, struct rsnd_priv *priv) { struct rsnd_dvc *dvc; int i; for_each_rsnd_dvc(dvc, priv, i) { rsnd_mod_quit(&dvc->mod); } }
sound/soc/sh/rcar/rsnd.h +8 −3 Original line number Diff line number Diff line Loading @@ -285,14 +285,15 @@ struct rsnd_mod { #define rsnd_mod_to_dma(mod) (&(mod)->dma) #define rsnd_mod_to_io(mod) ((mod)->io) #define rsnd_mod_id(mod) ((mod)->id) #define rsnd_mod_hw_start(mod) clk_prepare_enable((mod)->clk) #define rsnd_mod_hw_stop(mod) clk_disable_unprepare((mod)->clk) #define rsnd_mod_hw_start(mod) clk_enable((mod)->clk) #define rsnd_mod_hw_stop(mod) clk_disable((mod)->clk) void rsnd_mod_init(struct rsnd_mod *mod, int rsnd_mod_init(struct rsnd_mod *mod, struct rsnd_mod_ops *ops, struct clk *clk, enum rsnd_mod_type type, int id); void rsnd_mod_quit(struct rsnd_mod *mod); char *rsnd_mod_name(struct rsnd_mod *mod); struct dma_chan *rsnd_mod_dma_req(struct rsnd_mod *mod); Loading Loading @@ -496,6 +497,8 @@ int rsnd_kctrl_new_e(struct rsnd_mod *mod, int rsnd_src_probe(struct platform_device *pdev, const struct rsnd_of_data *of_data, struct rsnd_priv *priv); void rsnd_src_remove(struct platform_device *pdev, struct rsnd_priv *priv); struct rsnd_mod *rsnd_src_mod_get(struct rsnd_priv *priv, int id); unsigned int rsnd_src_get_ssi_rate(struct rsnd_priv *priv, struct rsnd_dai_stream *io, Loading @@ -514,6 +517,8 @@ int rsnd_src_ssi_irq_disable(struct rsnd_mod *ssi_mod); int rsnd_ssi_probe(struct platform_device *pdev, const struct rsnd_of_data *of_data, struct rsnd_priv *priv); void rsnd_ssi_remove(struct platform_device *pdev, struct rsnd_priv *priv); struct rsnd_mod *rsnd_ssi_mod_get(struct rsnd_priv *priv, int id); int rsnd_ssi_is_pin_sharing(struct rsnd_mod *mod); int rsnd_ssi_is_dma_mode(struct rsnd_mod *mod); Loading
sound/soc/sh/rcar/src.c +15 −2 Original line number Diff line number Diff line Loading @@ -867,7 +867,7 @@ int rsnd_src_probe(struct platform_device *pdev, struct rsnd_mod_ops *ops; struct clk *clk; char name[RSND_SRC_NAME_SIZE]; int i, nr; int i, nr, ret; ops = NULL; if (rsnd_is_gen1(priv)) Loading Loading @@ -907,10 +907,23 @@ int rsnd_src_probe(struct platform_device *pdev, src->info = &info->src_info[i]; rsnd_mod_init(&src->mod, ops, clk, RSND_MOD_SRC, i); ret = rsnd_mod_init(&src->mod, ops, clk, RSND_MOD_SRC, i); if (ret) return ret; dev_dbg(dev, "SRC%d probed\n", i); } return 0; } void rsnd_src_remove(struct platform_device *pdev, struct rsnd_priv *priv) { struct rsnd_src *src; int i; for_each_rsnd_src(src, priv, i) { rsnd_mod_quit(&src->mod); } }
sound/soc/sh/rcar/ssi.c +15 −2 Original line number Diff line number Diff line Loading @@ -710,7 +710,7 @@ int rsnd_ssi_probe(struct platform_device *pdev, struct clk *clk; struct rsnd_ssi *ssi; char name[RSND_SSI_NAME_SIZE]; int i, nr; int i, nr, ret; rsnd_of_parse_ssi(pdev, of_data, priv); Loading Loading @@ -745,10 +745,23 @@ int rsnd_ssi_probe(struct platform_device *pdev, else if (rsnd_ssi_pio_available(ssi)) ops = &rsnd_ssi_pio_ops; rsnd_mod_init(&ssi->mod, ops, clk, RSND_MOD_SSI, i); ret = rsnd_mod_init(&ssi->mod, ops, clk, RSND_MOD_SSI, i); if (ret) return ret; rsnd_ssi_parent_clk_setup(priv, ssi); } return 0; } void rsnd_ssi_remove(struct platform_device *pdev, struct rsnd_priv *priv) { struct rsnd_ssi *ssi; int i; for_each_rsnd_ssi(ssi, priv, i) { rsnd_mod_quit(&ssi->mod); } }