diff options
Diffstat (limited to 'sound/soc/sh/siu_dai.c')
-rw-r--r-- | sound/soc/sh/siu_dai.c | 66 |
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 | ||
74 | struct siu_info *siu_i2s_data = NULL; | ||
75 | EXPORT_SYMBOL_GPL(siu_i2s_data); | ||
76 | |||
74 | static struct port_flag siu_flags[SIU_PORT_NUM] = { | 77 | static 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 | ||
105 | static void siu_dai_start(struct siu_port *port_info) | 108 | static 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 | ||
151 | static void siu_dai_stop(void) | 154 | static 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 | ||
163 | static void siu_dai_spbAselect(struct siu_port *port_info) | 166 | static 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 | ||
188 | static void siu_dai_spbBselect(struct siu_port *port_info) | 191 | static 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 | ||
208 | static void siu_dai_open(struct siu_stream *siu_stream) | 211 | static 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 | */ |
239 | static void siu_dai_pcmdatapack(struct siu_stream *siu_stream) | 242 | static 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 | ||
259 | static int siu_dai_spbstart(struct siu_port *port_info) | 262 | static 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 | ||
324 | static void siu_dai_spbstop(struct siu_port *port_info) | 327 | static 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) | |||
510 | static int siu_dai_startup(struct snd_pcm_substream *substream, | 513 | static 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, | |||
532 | static void siu_dai_shutdown(struct snd_pcm_substream *substream, | 535 | static 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, | |||
556 | static int siu_dai_prepare(struct snd_pcm_substream *substream, | 559 | static 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: | |||
605 | static int siu_dai_set_fmt(struct snd_soc_dai *dai, | 608 | static 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 | ||
699 | struct snd_soc_dai siu_i2s_dai = { | 702 | static 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 | }; |
716 | EXPORT_SYMBOL_GPL(siu_i2s_dai); | ||
717 | 718 | ||
718 | static int __devinit siu_probe(struct platform_device *pdev) | 719 | static 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 | ||
785 | esocregp: | 787 | esocregp: |
786 | snd_soc_unregister_dais(&siu_i2s_dai, 1); | 788 | snd_soc_unregister_dai(&pdev->dev); |
787 | edaiinit: | 789 | edaiinit: |
788 | iounmap(info->reg); | 790 | iounmap(info->reg); |
789 | emapreg: | 791 | emapreg: |
@@ -804,13 +806,13 @@ ereqfw: | |||
804 | 806 | ||
805 | static int __devexit siu_remove(struct platform_device *pdev) | 807 | static 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 | ||
827 | static struct platform_driver siu_driver = { | 829 | static 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), |