aboutsummaryrefslogtreecommitdiffstats
path: root/sound/soc/sh/siu_dai.c
diff options
context:
space:
mode:
Diffstat (limited to 'sound/soc/sh/siu_dai.c')
-rw-r--r--sound/soc/sh/siu_dai.c66
1 files changed, 34 insertions, 32 deletions
diff --git a/sound/soc/sh/siu_dai.c b/sound/soc/sh/siu_dai.c
index eeed5edd722b..827940a8e248 100644
--- a/sound/soc/sh/siu_dai.c
+++ b/sound/soc/sh/siu_dai.c
@@ -71,6 +71,9 @@ struct port_flag {
71 struct format_flag capture; 71 struct format_flag capture;
72}; 72};
73 73
74struct siu_info *siu_i2s_data = NULL;
75EXPORT_SYMBOL_GPL(siu_i2s_data);
76
74static struct port_flag siu_flags[SIU_PORT_NUM] = { 77static struct port_flag siu_flags[SIU_PORT_NUM] = {
75 [SIU_PORT_A] = { 78 [SIU_PORT_A] = {
76 .playback = { 79 .playback = {
@@ -104,13 +107,13 @@ static struct port_flag siu_flags[SIU_PORT_NUM] = {
104 107
105static void siu_dai_start(struct siu_port *port_info) 108static void siu_dai_start(struct siu_port *port_info)
106{ 109{
107 struct siu_info *info = siu_i2s_dai.private_data; 110 struct siu_info *info = siu_i2s_data;
108 u32 __iomem *base = info->reg; 111 u32 __iomem *base = info->reg;
109 112
110 dev_dbg(port_info->pcm->card->dev, "%s\n", __func__); 113 dev_dbg(port_info->pcm->card->dev, "%s\n", __func__);
111 114
112 /* Turn on SIU clock */ 115 /* Turn on SIU clock */
113 pm_runtime_get_sync(siu_i2s_dai.dev); 116 pm_runtime_get_sync(port_info->pcm->card->dev);
114 117
115 /* Issue software reset to siu */ 118 /* Issue software reset to siu */
116 siu_write32(base + SIU_SRCTL, 0); 119 siu_write32(base + SIU_SRCTL, 0);
@@ -148,21 +151,21 @@ static void siu_dai_start(struct siu_port *port_info)
148 siu_write32(base + SIU_SBDVCB, port_info->capture.volume); 151 siu_write32(base + SIU_SBDVCB, port_info->capture.volume);
149} 152}
150 153
151static void siu_dai_stop(void) 154static void siu_dai_stop(struct siu_port *port_info)
152{ 155{
153 struct siu_info *info = siu_i2s_dai.private_data; 156 struct siu_info *info = siu_i2s_data;
154 u32 __iomem *base = info->reg; 157 u32 __iomem *base = info->reg;
155 158
156 /* SIU software reset */ 159 /* SIU software reset */
157 siu_write32(base + SIU_SRCTL, 0); 160 siu_write32(base + SIU_SRCTL, 0);
158 161
159 /* Turn off SIU clock */ 162 /* Turn off SIU clock */
160 pm_runtime_put_sync(siu_i2s_dai.dev); 163 pm_runtime_put_sync(port_info->pcm->card->dev);
161} 164}
162 165
163static void siu_dai_spbAselect(struct siu_port *port_info) 166static void siu_dai_spbAselect(struct siu_port *port_info)
164{ 167{
165 struct siu_info *info = siu_i2s_dai.private_data; 168 struct siu_info *info = siu_i2s_data;
166 struct siu_firmware *fw = &info->fw; 169 struct siu_firmware *fw = &info->fw;
167 u32 *ydef = fw->yram0; 170 u32 *ydef = fw->yram0;
168 u32 idx; 171 u32 idx;
@@ -187,7 +190,7 @@ static void siu_dai_spbAselect(struct siu_port *port_info)
187 190
188static void siu_dai_spbBselect(struct siu_port *port_info) 191static void siu_dai_spbBselect(struct siu_port *port_info)
189{ 192{
190 struct siu_info *info = siu_i2s_dai.private_data; 193 struct siu_info *info = siu_i2s_data;
191 struct siu_firmware *fw = &info->fw; 194 struct siu_firmware *fw = &info->fw;
192 u32 *ydef = fw->yram0; 195 u32 *ydef = fw->yram0;
193 u32 idx; 196 u32 idx;
@@ -207,7 +210,7 @@ static void siu_dai_spbBselect(struct siu_port *port_info)
207 210
208static void siu_dai_open(struct siu_stream *siu_stream) 211static void siu_dai_open(struct siu_stream *siu_stream)
209{ 212{
210 struct siu_info *info = siu_i2s_dai.private_data; 213 struct siu_info *info = siu_i2s_data;
211 u32 __iomem *base = info->reg; 214 u32 __iomem *base = info->reg;
212 u32 srctl, ifctl; 215 u32 srctl, ifctl;
213 216
@@ -238,7 +241,7 @@ static void siu_dai_open(struct siu_stream *siu_stream)
238 */ 241 */
239static void siu_dai_pcmdatapack(struct siu_stream *siu_stream) 242static void siu_dai_pcmdatapack(struct siu_stream *siu_stream)
240{ 243{
241 struct siu_info *info = siu_i2s_dai.private_data; 244 struct siu_info *info = siu_i2s_data;
242 u32 __iomem *base = info->reg; 245 u32 __iomem *base = info->reg;
243 u32 dpak; 246 u32 dpak;
244 247
@@ -258,7 +261,7 @@ static void siu_dai_pcmdatapack(struct siu_stream *siu_stream)
258 261
259static int siu_dai_spbstart(struct siu_port *port_info) 262static int siu_dai_spbstart(struct siu_port *port_info)
260{ 263{
261 struct siu_info *info = siu_i2s_dai.private_data; 264 struct siu_info *info = siu_i2s_data;
262 u32 __iomem *base = info->reg; 265 u32 __iomem *base = info->reg;
263 struct siu_firmware *fw = &info->fw; 266 struct siu_firmware *fw = &info->fw;
264 u32 *ydef = fw->yram0; 267 u32 *ydef = fw->yram0;
@@ -323,7 +326,7 @@ static int siu_dai_spbstart(struct siu_port *port_info)
323 326
324static void siu_dai_spbstop(struct siu_port *port_info) 327static void siu_dai_spbstop(struct siu_port *port_info)
325{ 328{
326 struct siu_info *info = siu_i2s_dai.private_data; 329 struct siu_info *info = siu_i2s_data;
327 u32 __iomem *base = info->reg; 330 u32 __iomem *base = info->reg;
328 331
329 siu_write32(base + SIU_SBACTIV, 0); 332 siu_write32(base + SIU_SBACTIV, 0);
@@ -402,7 +405,7 @@ static int siu_dai_put_volume(struct snd_kcontrol *kctrl,
402{ 405{
403 struct siu_port *port_info = snd_kcontrol_chip(kctrl); 406 struct siu_port *port_info = snd_kcontrol_chip(kctrl);
404 struct device *dev = port_info->pcm->card->dev; 407 struct device *dev = port_info->pcm->card->dev;
405 struct siu_info *info = siu_i2s_dai.private_data; 408 struct siu_info *info = siu_i2s_data;
406 u32 __iomem *base = info->reg; 409 u32 __iomem *base = info->reg;
407 u32 new_vol; 410 u32 new_vol;
408 u32 cur_vol; 411 u32 cur_vol;
@@ -510,7 +513,7 @@ void siu_free_port(struct siu_port *port_info)
510static int siu_dai_startup(struct snd_pcm_substream *substream, 513static int siu_dai_startup(struct snd_pcm_substream *substream,
511 struct snd_soc_dai *dai) 514 struct snd_soc_dai *dai)
512{ 515{
513 struct siu_info *info = siu_i2s_dai.private_data; 516 struct siu_info *info = snd_soc_dai_get_drvdata(dai);
514 struct snd_pcm_runtime *rt = substream->runtime; 517 struct snd_pcm_runtime *rt = substream->runtime;
515 struct siu_port *port_info = siu_port_info(substream); 518 struct siu_port *port_info = siu_port_info(substream);
516 int ret; 519 int ret;
@@ -532,7 +535,7 @@ static int siu_dai_startup(struct snd_pcm_substream *substream,
532static void siu_dai_shutdown(struct snd_pcm_substream *substream, 535static void siu_dai_shutdown(struct snd_pcm_substream *substream,
533 struct snd_soc_dai *dai) 536 struct snd_soc_dai *dai)
534{ 537{
535 struct siu_info *info = siu_i2s_dai.private_data; 538 struct siu_info *info = snd_soc_dai_get_drvdata(dai);
536 struct siu_port *port_info = siu_port_info(substream); 539 struct siu_port *port_info = siu_port_info(substream);
537 540
538 dev_dbg(substream->pcm->card->dev, "%s: port=%d@%p\n", __func__, 541 dev_dbg(substream->pcm->card->dev, "%s: port=%d@%p\n", __func__,
@@ -548,7 +551,7 @@ static void siu_dai_shutdown(struct snd_pcm_substream *substream,
548 /* during stmread or stmwrite ? */ 551 /* during stmread or stmwrite ? */
549 BUG_ON(port_info->playback.rw_flg || port_info->capture.rw_flg); 552 BUG_ON(port_info->playback.rw_flg || port_info->capture.rw_flg);
550 siu_dai_spbstop(port_info); 553 siu_dai_spbstop(port_info);
551 siu_dai_stop(); 554 siu_dai_stop(port_info);
552 } 555 }
553} 556}
554 557
@@ -556,7 +559,7 @@ static void siu_dai_shutdown(struct snd_pcm_substream *substream,
556static int siu_dai_prepare(struct snd_pcm_substream *substream, 559static int siu_dai_prepare(struct snd_pcm_substream *substream,
557 struct snd_soc_dai *dai) 560 struct snd_soc_dai *dai)
558{ 561{
559 struct siu_info *info = siu_i2s_dai.private_data; 562 struct siu_info *info = snd_soc_dai_get_drvdata(dai);
560 struct snd_pcm_runtime *rt = substream->runtime; 563 struct snd_pcm_runtime *rt = substream->runtime;
561 struct siu_port *port_info = siu_port_info(substream); 564 struct siu_port *port_info = siu_port_info(substream);
562 struct siu_stream *siu_stream; 565 struct siu_stream *siu_stream;
@@ -605,7 +608,7 @@ fail:
605static int siu_dai_set_fmt(struct snd_soc_dai *dai, 608static int siu_dai_set_fmt(struct snd_soc_dai *dai,
606 unsigned int fmt) 609 unsigned int fmt)
607{ 610{
608 struct siu_info *info = siu_i2s_dai.private_data; 611 struct siu_info *info = snd_soc_dai_get_drvdata(dai);
609 u32 __iomem *base = info->reg; 612 u32 __iomem *base = info->reg;
610 u32 ifctl; 613 u32 ifctl;
611 614
@@ -671,11 +674,11 @@ static int siu_dai_set_sysclk(struct snd_soc_dai *dai, int clk_id,
671 return -EINVAL; 674 return -EINVAL;
672 } 675 }
673 676
674 siu_clk = clk_get(siu_i2s_dai.dev, siu_name); 677 siu_clk = clk_get(dai->dev, siu_name);
675 if (IS_ERR(siu_clk)) 678 if (IS_ERR(siu_clk))
676 return PTR_ERR(siu_clk); 679 return PTR_ERR(siu_clk);
677 680
678 parent_clk = clk_get(siu_i2s_dai.dev, parent_name); 681 parent_clk = clk_get(dai->dev, parent_name);
679 if (!IS_ERR(parent_clk)) { 682 if (!IS_ERR(parent_clk)) {
680 ret = clk_set_parent(siu_clk, parent_clk); 683 ret = clk_set_parent(siu_clk, parent_clk);
681 if (!ret) 684 if (!ret)
@@ -696,9 +699,8 @@ static struct snd_soc_dai_ops siu_dai_ops = {
696 .set_fmt = siu_dai_set_fmt, 699 .set_fmt = siu_dai_set_fmt,
697}; 700};
698 701
699struct snd_soc_dai siu_i2s_dai = { 702static struct snd_soc_dai_driver siu_i2s_dai = {
700 .name = "sh-siu", 703 .name = "sui-i2s-dai",
701 .id = 0,
702 .playback = { 704 .playback = {
703 .channels_min = 2, 705 .channels_min = 2,
704 .channels_max = 2, 706 .channels_max = 2,
@@ -713,7 +715,6 @@ struct snd_soc_dai siu_i2s_dai = {
713 }, 715 },
714 .ops = &siu_dai_ops, 716 .ops = &siu_dai_ops,
715}; 717};
716EXPORT_SYMBOL_GPL(siu_i2s_dai);
717 718
718static int __devinit siu_probe(struct platform_device *pdev) 719static int __devinit siu_probe(struct platform_device *pdev)
719{ 720{
@@ -725,6 +726,7 @@ static int __devinit siu_probe(struct platform_device *pdev)
725 info = kmalloc(sizeof(*info), GFP_KERNEL); 726 info = kmalloc(sizeof(*info), GFP_KERNEL);
726 if (!info) 727 if (!info)
727 return -ENOMEM; 728 return -ENOMEM;
729 siu_i2s_data = info;
728 730
729 ret = request_firmware(&fw_entry, "siu_spb.bin", &pdev->dev); 731 ret = request_firmware(&fw_entry, "siu_spb.bin", &pdev->dev);
730 if (ret) 732 if (ret)
@@ -767,14 +769,14 @@ static int __devinit siu_probe(struct platform_device *pdev)
767 if (!info->reg) 769 if (!info->reg)
768 goto emapreg; 770 goto emapreg;
769 771
770 siu_i2s_dai.dev = &pdev->dev; 772 dev_set_drvdata(&pdev->dev, info);
771 siu_i2s_dai.private_data = info;
772 773
773 ret = snd_soc_register_dais(&siu_i2s_dai, 1); 774 /* register using ARRAY version so we can keep dai name */
775 ret = snd_soc_register_dais(&pdev->dev, &siu_i2s_dai, 1);
774 if (ret < 0) 776 if (ret < 0)
775 goto edaiinit; 777 goto edaiinit;
776 778
777 ret = snd_soc_register_platform(&siu_platform); 779 ret = snd_soc_register_platform(&pdev->dev, &siu_platform);
778 if (ret < 0) 780 if (ret < 0)
779 goto esocregp; 781 goto esocregp;
780 782
@@ -783,7 +785,7 @@ static int __devinit siu_probe(struct platform_device *pdev)
783 return ret; 785 return ret;
784 786
785esocregp: 787esocregp:
786 snd_soc_unregister_dais(&siu_i2s_dai, 1); 788 snd_soc_unregister_dai(&pdev->dev);
787edaiinit: 789edaiinit:
788 iounmap(info->reg); 790 iounmap(info->reg);
789emapreg: 791emapreg:
@@ -804,13 +806,13 @@ ereqfw:
804 806
805static int __devexit siu_remove(struct platform_device *pdev) 807static int __devexit siu_remove(struct platform_device *pdev)
806{ 808{
807 struct siu_info *info = siu_i2s_dai.private_data; 809 struct siu_info *info = dev_get_drvdata(&pdev->dev);
808 struct resource *res; 810 struct resource *res;
809 811
810 pm_runtime_disable(&pdev->dev); 812 pm_runtime_disable(&pdev->dev);
811 813
812 snd_soc_unregister_platform(&siu_platform); 814 snd_soc_unregister_platform(&pdev->dev);
813 snd_soc_unregister_dais(&siu_i2s_dai, 1); 815 snd_soc_unregister_dai(&pdev->dev);
814 816
815 iounmap(info->reg); 817 iounmap(info->reg);
816 iounmap(info->yram); 818 iounmap(info->yram);
@@ -826,7 +828,7 @@ static int __devexit siu_remove(struct platform_device *pdev)
826 828
827static struct platform_driver siu_driver = { 829static struct platform_driver siu_driver = {
828 .driver = { 830 .driver = {
829 .name = "sh_siu", 831 .name = "siu-pcm-audio",
830 }, 832 },
831 .probe = siu_probe, 833 .probe = siu_probe,
832 .remove = __devexit_p(siu_remove), 834 .remove = __devexit_p(siu_remove),