aboutsummaryrefslogtreecommitdiffstats
path: root/sound/soc/tegra
diff options
context:
space:
mode:
authorMark Brown <broonie@opensource.wolfsonmicro.com>2013-04-12 08:57:21 -0400
committerMark Brown <broonie@opensource.wolfsonmicro.com>2013-04-12 08:57:21 -0400
commitd14bc151a4f66871fd02fd9b28d8464859ca3ae2 (patch)
tree0d868863b8a00960bc1d40a495fed8759be36951 /sound/soc/tegra
parent5b9fd76972836272afba57404d2662627926165b (diff)
parenta7fc5d256be9fda27bb69e872e6a212542a84230 (diff)
Merge remote-tracking branch 'asoc/topic/tegra' into asoc-next
Diffstat (limited to 'sound/soc/tegra')
-rw-r--r--sound/soc/tegra/tegra30_ahub.c64
-rw-r--r--sound/soc/tegra/tegra30_ahub.h16
-rw-r--r--sound/soc/tegra/tegra_alc5632.c15
-rw-r--r--sound/soc/tegra/tegra_asoc_utils.c34
-rw-r--r--sound/soc/tegra/tegra_asoc_utils.h1
-rw-r--r--sound/soc/tegra/tegra_wm8753.c15
-rw-r--r--sound/soc/tegra/tegra_wm8903.c179
-rw-r--r--sound/soc/tegra/tegra_wm9712.c5
-rw-r--r--sound/soc/tegra/trimslice.c56
9 files changed, 193 insertions, 192 deletions
diff --git a/sound/soc/tegra/tegra30_ahub.c b/sound/soc/tegra/tegra30_ahub.c
index 5e08f3e7e6cf..23e592f453fa 100644
--- a/sound/soc/tegra/tegra30_ahub.c
+++ b/sound/soc/tegra/tegra30_ahub.c
@@ -287,16 +287,27 @@ int tegra30_ahub_unset_rx_cif_source(enum tegra30_ahub_rxcif rxcif)
287} 287}
288EXPORT_SYMBOL_GPL(tegra30_ahub_unset_rx_cif_source); 288EXPORT_SYMBOL_GPL(tegra30_ahub_unset_rx_cif_source);
289 289
290static const char * const configlink_clocks[] = { 290#define CLK_LIST_MASK_TEGRA30 BIT(0)
291 "i2s0", 291#define CLK_LIST_MASK_TEGRA114 BIT(1)
292 "i2s1", 292
293 "i2s2", 293#define CLK_LIST_MASK_TEGRA30_OR_LATER \
294 "i2s3", 294 (CLK_LIST_MASK_TEGRA30 | CLK_LIST_MASK_TEGRA114)
295 "i2s4", 295
296 "dam0", 296static const struct {
297 "dam1", 297 const char *clk_name;
298 "dam2", 298 u32 clk_list_mask;
299 "spdif_in", 299} configlink_clocks[] = {
300 { "i2s0", CLK_LIST_MASK_TEGRA30_OR_LATER },
301 { "i2s1", CLK_LIST_MASK_TEGRA30_OR_LATER },
302 { "i2s2", CLK_LIST_MASK_TEGRA30_OR_LATER },
303 { "i2s3", CLK_LIST_MASK_TEGRA30_OR_LATER },
304 { "i2s4", CLK_LIST_MASK_TEGRA30_OR_LATER },
305 { "dam0", CLK_LIST_MASK_TEGRA30_OR_LATER },
306 { "dam1", CLK_LIST_MASK_TEGRA30_OR_LATER },
307 { "dam2", CLK_LIST_MASK_TEGRA30_OR_LATER },
308 { "spdif_in", CLK_LIST_MASK_TEGRA30_OR_LATER },
309 { "amx", CLK_LIST_MASK_TEGRA114 },
310 { "adx", CLK_LIST_MASK_TEGRA114 },
300}; 311};
301 312
302#define LAST_REG(name) \ 313#define LAST_REG(name) \
@@ -424,8 +435,24 @@ static const struct regmap_config tegra30_ahub_ahub_regmap_config = {
424 .cache_type = REGCACHE_RBTREE, 435 .cache_type = REGCACHE_RBTREE,
425}; 436};
426 437
438static struct tegra30_ahub_soc_data soc_data_tegra30 = {
439 .clk_list_mask = CLK_LIST_MASK_TEGRA30,
440};
441
442static struct tegra30_ahub_soc_data soc_data_tegra114 = {
443 .clk_list_mask = CLK_LIST_MASK_TEGRA114,
444};
445
446static const struct of_device_id tegra30_ahub_of_match[] = {
447 { .compatible = "nvidia,tegra114-ahub", .data = &soc_data_tegra114 },
448 { .compatible = "nvidia,tegra30-ahub", .data = &soc_data_tegra30 },
449 {},
450};
451
427static int tegra30_ahub_probe(struct platform_device *pdev) 452static int tegra30_ahub_probe(struct platform_device *pdev)
428{ 453{
454 const struct of_device_id *match;
455 const struct tegra30_ahub_soc_data *soc_data;
429 struct clk *clk; 456 struct clk *clk;
430 int i; 457 int i;
431 struct resource *res0, *res1, *region; 458 struct resource *res0, *res1, *region;
@@ -436,16 +463,24 @@ static int tegra30_ahub_probe(struct platform_device *pdev)
436 if (ahub) 463 if (ahub)
437 return -ENODEV; 464 return -ENODEV;
438 465
466 match = of_match_device(tegra30_ahub_of_match, &pdev->dev);
467 if (!match)
468 return -EINVAL;
469 soc_data = match->data;
470
439 /* 471 /*
440 * The AHUB hosts a register bus: the "configlink". For this to 472 * The AHUB hosts a register bus: the "configlink". For this to
441 * operate correctly, all devices on this bus must be out of reset. 473 * operate correctly, all devices on this bus must be out of reset.
442 * Ensure that here. 474 * Ensure that here.
443 */ 475 */
444 for (i = 0; i < ARRAY_SIZE(configlink_clocks); i++) { 476 for (i = 0; i < ARRAY_SIZE(configlink_clocks); i++) {
445 clk = clk_get(&pdev->dev, configlink_clocks[i]); 477 if (!(configlink_clocks[i].clk_list_mask &
478 soc_data->clk_list_mask))
479 continue;
480 clk = clk_get(&pdev->dev, configlink_clocks[i].clk_name);
446 if (IS_ERR(clk)) { 481 if (IS_ERR(clk)) {
447 dev_err(&pdev->dev, "Can't get clock %s\n", 482 dev_err(&pdev->dev, "Can't get clock %s\n",
448 configlink_clocks[i]); 483 configlink_clocks[i].clk_name);
449 ret = PTR_ERR(clk); 484 ret = PTR_ERR(clk);
450 goto err; 485 goto err;
451 } 486 }
@@ -592,11 +627,6 @@ static int tegra30_ahub_remove(struct platform_device *pdev)
592 return 0; 627 return 0;
593} 628}
594 629
595static const struct of_device_id tegra30_ahub_of_match[] = {
596 { .compatible = "nvidia,tegra30-ahub", },
597 {},
598};
599
600static const struct dev_pm_ops tegra30_ahub_pm_ops = { 630static const struct dev_pm_ops tegra30_ahub_pm_ops = {
601 SET_RUNTIME_PM_OPS(tegra30_ahub_runtime_suspend, 631 SET_RUNTIME_PM_OPS(tegra30_ahub_runtime_suspend,
602 tegra30_ahub_runtime_resume, NULL) 632 tegra30_ahub_runtime_resume, NULL)
diff --git a/sound/soc/tegra/tegra30_ahub.h b/sound/soc/tegra/tegra30_ahub.h
index b7d7c1a30302..09766cdc45ca 100644
--- a/sound/soc/tegra/tegra30_ahub.h
+++ b/sound/soc/tegra/tegra30_ahub.h
@@ -468,7 +468,23 @@ extern int tegra30_ahub_set_rx_cif_source(enum tegra30_ahub_rxcif rxcif,
468 enum tegra30_ahub_txcif txcif); 468 enum tegra30_ahub_txcif txcif);
469extern int tegra30_ahub_unset_rx_cif_source(enum tegra30_ahub_rxcif rxcif); 469extern int tegra30_ahub_unset_rx_cif_source(enum tegra30_ahub_rxcif rxcif);
470 470
471struct tegra30_ahub_soc_data {
472 u32 clk_list_mask;
473 /*
474 * FIXME: There are many more differences in HW, such as:
475 * - More APBIF channels.
476 * - Extra separate chunks of register address space to represent
477 * the extra APBIF channels.
478 * - More units connected to the AHUB, so that tegra30_ahub_[rt]xcif
479 * need expansion, coupled with there being more defined bits in
480 * the AHUB routing registers.
481 * However, the driver doesn't support those new features yet, so we
482 * don't represent them here yet.
483 */
484};
485
471struct tegra30_ahub { 486struct tegra30_ahub {
487 const struct tegra30_ahub_soc_data *soc_data;
472 struct device *dev; 488 struct device *dev;
473 struct clk *clk_d_audio; 489 struct clk *clk_d_audio;
474 struct clk *clk_apbif; 490 struct clk *clk_apbif;
diff --git a/sound/soc/tegra/tegra_alc5632.c b/sound/soc/tegra/tegra_alc5632.c
index c80adb9da472..48d05d9e1002 100644
--- a/sound/soc/tegra/tegra_alc5632.c
+++ b/sound/soc/tegra/tegra_alc5632.c
@@ -161,20 +161,13 @@ static int tegra_alc5632_probe(struct platform_device *pdev)
161 sizeof(struct tegra_alc5632), GFP_KERNEL); 161 sizeof(struct tegra_alc5632), GFP_KERNEL);
162 if (!alc5632) { 162 if (!alc5632) {
163 dev_err(&pdev->dev, "Can't allocate tegra_alc5632\n"); 163 dev_err(&pdev->dev, "Can't allocate tegra_alc5632\n");
164 ret = -ENOMEM; 164 return -ENOMEM;
165 goto err;
166 } 165 }
167 166
168 card->dev = &pdev->dev; 167 card->dev = &pdev->dev;
169 platform_set_drvdata(pdev, card); 168 platform_set_drvdata(pdev, card);
170 snd_soc_card_set_drvdata(card, alc5632); 169 snd_soc_card_set_drvdata(card, alc5632);
171 170
172 if (!(pdev->dev.of_node)) {
173 dev_err(&pdev->dev, "Must be instantiated using device tree\n");
174 ret = -EINVAL;
175 goto err;
176 }
177
178 alc5632->gpio_hp_det = of_get_named_gpio(np, "nvidia,hp-det-gpios", 0); 171 alc5632->gpio_hp_det = of_get_named_gpio(np, "nvidia,hp-det-gpios", 0);
179 if (alc5632->gpio_hp_det == -EPROBE_DEFER) 172 if (alc5632->gpio_hp_det == -EPROBE_DEFER)
180 return -EPROBE_DEFER; 173 return -EPROBE_DEFER;
@@ -197,11 +190,11 @@ static int tegra_alc5632_probe(struct platform_device *pdev)
197 goto err; 190 goto err;
198 } 191 }
199 192
200 tegra_alc5632_dai.cpu_of_node = of_parse_phandle( 193 tegra_alc5632_dai.cpu_of_node = of_parse_phandle(np,
201 pdev->dev.of_node, "nvidia,i2s-controller", 0); 194 "nvidia,i2s-controller", 0);
202 if (!tegra_alc5632_dai.cpu_of_node) { 195 if (!tegra_alc5632_dai.cpu_of_node) {
203 dev_err(&pdev->dev, 196 dev_err(&pdev->dev,
204 "Property 'nvidia,i2s-controller' missing or invalid\n"); 197 "Property 'nvidia,i2s-controller' missing or invalid\n");
205 ret = -EINVAL; 198 ret = -EINVAL;
206 goto err; 199 goto err;
207 } 200 }
diff --git a/sound/soc/tegra/tegra_asoc_utils.c b/sound/soc/tegra/tegra_asoc_utils.c
index ba419f86384d..24fb001be7f4 100644
--- a/sound/soc/tegra/tegra_asoc_utils.c
+++ b/sound/soc/tegra/tegra_asoc_utils.c
@@ -43,8 +43,10 @@ int tegra_asoc_utils_set_rate(struct tegra_asoc_utils_data *data, int srate,
43 case 88200: 43 case 88200:
44 if (data->soc == TEGRA_ASOC_UTILS_SOC_TEGRA20) 44 if (data->soc == TEGRA_ASOC_UTILS_SOC_TEGRA20)
45 new_baseclock = 56448000; 45 new_baseclock = 56448000;
46 else 46 else if (data->soc == TEGRA_ASOC_UTILS_SOC_TEGRA30)
47 new_baseclock = 564480000; 47 new_baseclock = 564480000;
48 else
49 new_baseclock = 282240000;
48 break; 50 break;
49 case 8000: 51 case 8000:
50 case 16000: 52 case 16000:
@@ -54,8 +56,10 @@ int tegra_asoc_utils_set_rate(struct tegra_asoc_utils_data *data, int srate,
54 case 96000: 56 case 96000:
55 if (data->soc == TEGRA_ASOC_UTILS_SOC_TEGRA20) 57 if (data->soc == TEGRA_ASOC_UTILS_SOC_TEGRA20)
56 new_baseclock = 73728000; 58 new_baseclock = 73728000;
57 else 59 else if (data->soc == TEGRA_ASOC_UTILS_SOC_TEGRA30)
58 new_baseclock = 552960000; 60 new_baseclock = 552960000;
61 else
62 new_baseclock = 368640000;
59 break; 63 break;
60 default: 64 default:
61 return -EINVAL; 65 return -EINVAL;
@@ -169,6 +173,7 @@ int tegra_asoc_utils_init(struct tegra_asoc_utils_data *data,
169 struct device *dev) 173 struct device *dev)
170{ 174{
171 int ret; 175 int ret;
176 bool new_clocks = false;
172 177
173 data->dev = dev; 178 data->dev = dev;
174 179
@@ -176,28 +181,37 @@ int tegra_asoc_utils_init(struct tegra_asoc_utils_data *data,
176 data->soc = TEGRA_ASOC_UTILS_SOC_TEGRA20; 181 data->soc = TEGRA_ASOC_UTILS_SOC_TEGRA20;
177 else if (of_machine_is_compatible("nvidia,tegra30")) 182 else if (of_machine_is_compatible("nvidia,tegra30"))
178 data->soc = TEGRA_ASOC_UTILS_SOC_TEGRA30; 183 data->soc = TEGRA_ASOC_UTILS_SOC_TEGRA30;
179 else if (!dev->of_node) 184 else if (of_machine_is_compatible("nvidia,tegra114")) {
180 /* non-DT is always Tegra20 */ 185 data->soc = TEGRA_ASOC_UTILS_SOC_TEGRA114;
181 data->soc = TEGRA_ASOC_UTILS_SOC_TEGRA20; 186 new_clocks = true;
182 else 187 } else {
183 /* DT boot, but unknown SoC */ 188 dev_err(data->dev, "SoC unknown to Tegra ASoC utils\n");
184 return -EINVAL; 189 return -EINVAL;
190 }
185 191
186 data->clk_pll_a = clk_get_sys(NULL, "pll_a"); 192 if (new_clocks)
193 data->clk_pll_a = clk_get(dev, "pll_a");
194 else
195 data->clk_pll_a = clk_get_sys(NULL, "pll_a");
187 if (IS_ERR(data->clk_pll_a)) { 196 if (IS_ERR(data->clk_pll_a)) {
188 dev_err(data->dev, "Can't retrieve clk pll_a\n"); 197 dev_err(data->dev, "Can't retrieve clk pll_a\n");
189 ret = PTR_ERR(data->clk_pll_a); 198 ret = PTR_ERR(data->clk_pll_a);
190 goto err; 199 goto err;
191 } 200 }
192 201
193 data->clk_pll_a_out0 = clk_get_sys(NULL, "pll_a_out0"); 202 if (new_clocks)
203 data->clk_pll_a_out0 = clk_get(dev, "pll_a_out0");
204 else
205 data->clk_pll_a_out0 = clk_get_sys(NULL, "pll_a_out0");
194 if (IS_ERR(data->clk_pll_a_out0)) { 206 if (IS_ERR(data->clk_pll_a_out0)) {
195 dev_err(data->dev, "Can't retrieve clk pll_a_out0\n"); 207 dev_err(data->dev, "Can't retrieve clk pll_a_out0\n");
196 ret = PTR_ERR(data->clk_pll_a_out0); 208 ret = PTR_ERR(data->clk_pll_a_out0);
197 goto err_put_pll_a; 209 goto err_put_pll_a;
198 } 210 }
199 211
200 if (data->soc == TEGRA_ASOC_UTILS_SOC_TEGRA20) 212 if (new_clocks)
213 data->clk_cdev1 = clk_get(dev, "mclk");
214 else if (data->soc == TEGRA_ASOC_UTILS_SOC_TEGRA20)
201 data->clk_cdev1 = clk_get_sys(NULL, "cdev1"); 215 data->clk_cdev1 = clk_get_sys(NULL, "cdev1");
202 else 216 else
203 data->clk_cdev1 = clk_get_sys("extern1", NULL); 217 data->clk_cdev1 = clk_get_sys("extern1", NULL);
diff --git a/sound/soc/tegra/tegra_asoc_utils.h b/sound/soc/tegra/tegra_asoc_utils.h
index 974c9f8830f9..19fdcafed32f 100644
--- a/sound/soc/tegra/tegra_asoc_utils.h
+++ b/sound/soc/tegra/tegra_asoc_utils.h
@@ -29,6 +29,7 @@ struct device;
29enum tegra_asoc_utils_soc { 29enum tegra_asoc_utils_soc {
30 TEGRA_ASOC_UTILS_SOC_TEGRA20, 30 TEGRA_ASOC_UTILS_SOC_TEGRA20,
31 TEGRA_ASOC_UTILS_SOC_TEGRA30, 31 TEGRA_ASOC_UTILS_SOC_TEGRA30,
32 TEGRA_ASOC_UTILS_SOC_TEGRA114,
32}; 33};
33 34
34struct tegra_asoc_utils_data { 35struct tegra_asoc_utils_data {
diff --git a/sound/soc/tegra/tegra_wm8753.c b/sound/soc/tegra/tegra_wm8753.c
index c8ef88a67c59..f87fc53e9b8c 100644
--- a/sound/soc/tegra/tegra_wm8753.c
+++ b/sound/soc/tegra/tegra_wm8753.c
@@ -124,6 +124,7 @@ static struct snd_soc_card snd_soc_tegra_wm8753 = {
124 124
125static int tegra_wm8753_driver_probe(struct platform_device *pdev) 125static int tegra_wm8753_driver_probe(struct platform_device *pdev)
126{ 126{
127 struct device_node *np = pdev->dev.of_node;
127 struct snd_soc_card *card = &snd_soc_tegra_wm8753; 128 struct snd_soc_card *card = &snd_soc_tegra_wm8753;
128 struct tegra_wm8753 *machine; 129 struct tegra_wm8753 *machine;
129 int ret; 130 int ret;
@@ -132,8 +133,7 @@ static int tegra_wm8753_driver_probe(struct platform_device *pdev)
132 GFP_KERNEL); 133 GFP_KERNEL);
133 if (!machine) { 134 if (!machine) {
134 dev_err(&pdev->dev, "Can't allocate tegra_wm8753 struct\n"); 135 dev_err(&pdev->dev, "Can't allocate tegra_wm8753 struct\n");
135 ret = -ENOMEM; 136 return -ENOMEM;
136 goto err;
137 } 137 }
138 138
139 card->dev = &pdev->dev; 139 card->dev = &pdev->dev;
@@ -148,8 +148,8 @@ static int tegra_wm8753_driver_probe(struct platform_device *pdev)
148 if (ret) 148 if (ret)
149 goto err; 149 goto err;
150 150
151 tegra_wm8753_dai.codec_of_node = of_parse_phandle( 151 tegra_wm8753_dai.codec_of_node = of_parse_phandle(np,
152 pdev->dev.of_node, "nvidia,audio-codec", 0); 152 "nvidia,audio-codec", 0);
153 if (!tegra_wm8753_dai.codec_of_node) { 153 if (!tegra_wm8753_dai.codec_of_node) {
154 dev_err(&pdev->dev, 154 dev_err(&pdev->dev,
155 "Property 'nvidia,audio-codec' missing or invalid\n"); 155 "Property 'nvidia,audio-codec' missing or invalid\n");
@@ -157,8 +157,8 @@ static int tegra_wm8753_driver_probe(struct platform_device *pdev)
157 goto err; 157 goto err;
158 } 158 }
159 159
160 tegra_wm8753_dai.cpu_of_node = of_parse_phandle( 160 tegra_wm8753_dai.cpu_of_node = of_parse_phandle(np,
161 pdev->dev.of_node, "nvidia,i2s-controller", 0); 161 "nvidia,i2s-controller", 0);
162 if (!tegra_wm8753_dai.cpu_of_node) { 162 if (!tegra_wm8753_dai.cpu_of_node) {
163 dev_err(&pdev->dev, 163 dev_err(&pdev->dev,
164 "Property 'nvidia,i2s-controller' missing or invalid\n"); 164 "Property 'nvidia,i2s-controller' missing or invalid\n");
@@ -166,8 +166,7 @@ static int tegra_wm8753_driver_probe(struct platform_device *pdev)
166 goto err; 166 goto err;
167 } 167 }
168 168
169 tegra_wm8753_dai.platform_of_node = 169 tegra_wm8753_dai.platform_of_node = tegra_wm8753_dai.cpu_of_node;
170 tegra_wm8753_dai.cpu_of_node;
171 170
172 ret = tegra_asoc_utils_init(&machine->util_data, &pdev->dev); 171 ret = tegra_asoc_utils_init(&machine->util_data, &pdev->dev);
173 if (ret) 172 if (ret)
diff --git a/sound/soc/tegra/tegra_wm8903.c b/sound/soc/tegra/tegra_wm8903.c
index bbd79bf56303..4ac73730d79a 100644
--- a/sound/soc/tegra/tegra_wm8903.c
+++ b/sound/soc/tegra/tegra_wm8903.c
@@ -39,7 +39,6 @@
39#include <sound/pcm.h> 39#include <sound/pcm.h>
40#include <sound/pcm_params.h> 40#include <sound/pcm_params.h>
41#include <sound/soc.h> 41#include <sound/soc.h>
42#include <sound/tegra_wm8903.h>
43 42
44#include "../codecs/wm8903.h" 43#include "../codecs/wm8903.h"
45 44
@@ -48,7 +47,11 @@
48#define DRV_NAME "tegra-snd-wm8903" 47#define DRV_NAME "tegra-snd-wm8903"
49 48
50struct tegra_wm8903 { 49struct tegra_wm8903 {
51 struct tegra_wm8903_platform_data pdata; 50 int gpio_spkr_en;
51 int gpio_hp_det;
52 int gpio_hp_mute;
53 int gpio_int_mic_en;
54 int gpio_ext_mic_en;
52 struct tegra_asoc_utils_data util_data; 55 struct tegra_asoc_utils_data util_data;
53}; 56};
54 57
@@ -129,12 +132,11 @@ static int tegra_wm8903_event_int_spk(struct snd_soc_dapm_widget *w,
129 struct snd_soc_dapm_context *dapm = w->dapm; 132 struct snd_soc_dapm_context *dapm = w->dapm;
130 struct snd_soc_card *card = dapm->card; 133 struct snd_soc_card *card = dapm->card;
131 struct tegra_wm8903 *machine = snd_soc_card_get_drvdata(card); 134 struct tegra_wm8903 *machine = snd_soc_card_get_drvdata(card);
132 struct tegra_wm8903_platform_data *pdata = &machine->pdata;
133 135
134 if (!gpio_is_valid(pdata->gpio_spkr_en)) 136 if (!gpio_is_valid(machine->gpio_spkr_en))
135 return 0; 137 return 0;
136 138
137 gpio_set_value_cansleep(pdata->gpio_spkr_en, 139 gpio_set_value_cansleep(machine->gpio_spkr_en,
138 SND_SOC_DAPM_EVENT_ON(event)); 140 SND_SOC_DAPM_EVENT_ON(event));
139 141
140 return 0; 142 return 0;
@@ -146,12 +148,11 @@ static int tegra_wm8903_event_hp(struct snd_soc_dapm_widget *w,
146 struct snd_soc_dapm_context *dapm = w->dapm; 148 struct snd_soc_dapm_context *dapm = w->dapm;
147 struct snd_soc_card *card = dapm->card; 149 struct snd_soc_card *card = dapm->card;
148 struct tegra_wm8903 *machine = snd_soc_card_get_drvdata(card); 150 struct tegra_wm8903 *machine = snd_soc_card_get_drvdata(card);
149 struct tegra_wm8903_platform_data *pdata = &machine->pdata;
150 151
151 if (!gpio_is_valid(pdata->gpio_hp_mute)) 152 if (!gpio_is_valid(machine->gpio_hp_mute))
152 return 0; 153 return 0;
153 154
154 gpio_set_value_cansleep(pdata->gpio_hp_mute, 155 gpio_set_value_cansleep(machine->gpio_hp_mute,
155 !SND_SOC_DAPM_EVENT_ON(event)); 156 !SND_SOC_DAPM_EVENT_ON(event));
156 157
157 return 0; 158 return 0;
@@ -163,17 +164,6 @@ static const struct snd_soc_dapm_widget tegra_wm8903_dapm_widgets[] = {
163 SND_SOC_DAPM_MIC("Mic Jack", NULL), 164 SND_SOC_DAPM_MIC("Mic Jack", NULL),
164}; 165};
165 166
166static const struct snd_soc_dapm_route harmony_audio_map[] = {
167 {"Headphone Jack", NULL, "HPOUTR"},
168 {"Headphone Jack", NULL, "HPOUTL"},
169 {"Int Spk", NULL, "ROP"},
170 {"Int Spk", NULL, "RON"},
171 {"Int Spk", NULL, "LOP"},
172 {"Int Spk", NULL, "LON"},
173 {"Mic Jack", NULL, "MICBIAS"},
174 {"IN1L", NULL, "Mic Jack"},
175};
176
177static const struct snd_kcontrol_new tegra_wm8903_controls[] = { 167static const struct snd_kcontrol_new tegra_wm8903_controls[] = {
178 SOC_DAPM_PIN_SWITCH("Int Spk"), 168 SOC_DAPM_PIN_SWITCH("Int Spk"),
179}; 169};
@@ -185,10 +175,9 @@ static int tegra_wm8903_init(struct snd_soc_pcm_runtime *rtd)
185 struct snd_soc_dapm_context *dapm = &codec->dapm; 175 struct snd_soc_dapm_context *dapm = &codec->dapm;
186 struct snd_soc_card *card = codec->card; 176 struct snd_soc_card *card = codec->card;
187 struct tegra_wm8903 *machine = snd_soc_card_get_drvdata(card); 177 struct tegra_wm8903 *machine = snd_soc_card_get_drvdata(card);
188 struct tegra_wm8903_platform_data *pdata = &machine->pdata;
189 178
190 if (gpio_is_valid(pdata->gpio_hp_det)) { 179 if (gpio_is_valid(machine->gpio_hp_det)) {
191 tegra_wm8903_hp_jack_gpio.gpio = pdata->gpio_hp_det; 180 tegra_wm8903_hp_jack_gpio.gpio = machine->gpio_hp_det;
192 snd_soc_jack_new(codec, "Headphone Jack", SND_JACK_HEADPHONE, 181 snd_soc_jack_new(codec, "Headphone Jack", SND_JACK_HEADPHONE,
193 &tegra_wm8903_hp_jack); 182 &tegra_wm8903_hp_jack);
194 snd_soc_jack_add_pins(&tegra_wm8903_hp_jack, 183 snd_soc_jack_add_pins(&tegra_wm8903_hp_jack,
@@ -226,9 +215,6 @@ static int tegra_wm8903_remove(struct snd_soc_card *card)
226static struct snd_soc_dai_link tegra_wm8903_dai = { 215static struct snd_soc_dai_link tegra_wm8903_dai = {
227 .name = "WM8903", 216 .name = "WM8903",
228 .stream_name = "WM8903 PCM", 217 .stream_name = "WM8903 PCM",
229 .codec_name = "wm8903.0-001a",
230 .platform_name = "tegra20-i2s.0",
231 .cpu_dai_name = "tegra20-i2s.0",
232 .codec_dai_name = "wm8903-hifi", 218 .codec_dai_name = "wm8903-hifi",
233 .init = tegra_wm8903_init, 219 .init = tegra_wm8903_init,
234 .ops = &tegra_wm8903_ops, 220 .ops = &tegra_wm8903_ops,
@@ -257,96 +243,25 @@ static int tegra_wm8903_driver_probe(struct platform_device *pdev)
257 struct device_node *np = pdev->dev.of_node; 243 struct device_node *np = pdev->dev.of_node;
258 struct snd_soc_card *card = &snd_soc_tegra_wm8903; 244 struct snd_soc_card *card = &snd_soc_tegra_wm8903;
259 struct tegra_wm8903 *machine; 245 struct tegra_wm8903 *machine;
260 struct tegra_wm8903_platform_data *pdata;
261 int ret; 246 int ret;
262 247
263 if (!pdev->dev.platform_data && !pdev->dev.of_node) {
264 dev_err(&pdev->dev, "No platform data supplied\n");
265 return -EINVAL;
266 }
267
268 machine = devm_kzalloc(&pdev->dev, sizeof(struct tegra_wm8903), 248 machine = devm_kzalloc(&pdev->dev, sizeof(struct tegra_wm8903),
269 GFP_KERNEL); 249 GFP_KERNEL);
270 if (!machine) { 250 if (!machine) {
271 dev_err(&pdev->dev, "Can't allocate tegra_wm8903 struct\n"); 251 dev_err(&pdev->dev, "Can't allocate tegra_wm8903 struct\n");
272 ret = -ENOMEM; 252 return -ENOMEM;
273 goto err;
274 } 253 }
275 pdata = &machine->pdata;
276 254
277 card->dev = &pdev->dev; 255 card->dev = &pdev->dev;
278 platform_set_drvdata(pdev, card); 256 platform_set_drvdata(pdev, card);
279 snd_soc_card_set_drvdata(card, machine); 257 snd_soc_card_set_drvdata(card, machine);
280 258
281 if (pdev->dev.platform_data) { 259 machine->gpio_spkr_en = of_get_named_gpio(np, "nvidia,spkr-en-gpios",
282 memcpy(pdata, card->dev->platform_data, sizeof(*pdata)); 260 0);
283 } else if (np) { 261 if (machine->gpio_spkr_en == -EPROBE_DEFER)
284 pdata->gpio_spkr_en = of_get_named_gpio(np, 262 return -EPROBE_DEFER;
285 "nvidia,spkr-en-gpios", 0); 263 if (gpio_is_valid(machine->gpio_spkr_en)) {
286 if (pdata->gpio_spkr_en == -EPROBE_DEFER) 264 ret = devm_gpio_request_one(&pdev->dev, machine->gpio_spkr_en,
287 return -EPROBE_DEFER;
288
289 pdata->gpio_hp_mute = of_get_named_gpio(np,
290 "nvidia,hp-mute-gpios", 0);
291 if (pdata->gpio_hp_mute == -EPROBE_DEFER)
292 return -EPROBE_DEFER;
293
294 pdata->gpio_hp_det = of_get_named_gpio(np,
295 "nvidia,hp-det-gpios", 0);
296 if (pdata->gpio_hp_det == -EPROBE_DEFER)
297 return -EPROBE_DEFER;
298
299 pdata->gpio_int_mic_en = of_get_named_gpio(np,
300 "nvidia,int-mic-en-gpios", 0);
301 if (pdata->gpio_int_mic_en == -EPROBE_DEFER)
302 return -EPROBE_DEFER;
303
304 pdata->gpio_ext_mic_en = of_get_named_gpio(np,
305 "nvidia,ext-mic-en-gpios", 0);
306 if (pdata->gpio_ext_mic_en == -EPROBE_DEFER)
307 return -EPROBE_DEFER;
308 }
309
310 if (np) {
311 ret = snd_soc_of_parse_card_name(card, "nvidia,model");
312 if (ret)
313 goto err;
314
315 ret = snd_soc_of_parse_audio_routing(card,
316 "nvidia,audio-routing");
317 if (ret)
318 goto err;
319
320 tegra_wm8903_dai.codec_name = NULL;
321 tegra_wm8903_dai.codec_of_node = of_parse_phandle(np,
322 "nvidia,audio-codec", 0);
323 if (!tegra_wm8903_dai.codec_of_node) {
324 dev_err(&pdev->dev,
325 "Property 'nvidia,audio-codec' missing or invalid\n");
326 ret = -EINVAL;
327 goto err;
328 }
329
330 tegra_wm8903_dai.cpu_dai_name = NULL;
331 tegra_wm8903_dai.cpu_of_node = of_parse_phandle(np,
332 "nvidia,i2s-controller", 0);
333 if (!tegra_wm8903_dai.cpu_of_node) {
334 dev_err(&pdev->dev,
335 "Property 'nvidia,i2s-controller' missing or invalid\n");
336 ret = -EINVAL;
337 goto err;
338 }
339
340 tegra_wm8903_dai.platform_name = NULL;
341 tegra_wm8903_dai.platform_of_node =
342 tegra_wm8903_dai.cpu_of_node;
343 } else {
344 card->dapm_routes = harmony_audio_map;
345 card->num_dapm_routes = ARRAY_SIZE(harmony_audio_map);
346 }
347
348 if (gpio_is_valid(pdata->gpio_spkr_en)) {
349 ret = devm_gpio_request_one(&pdev->dev, pdata->gpio_spkr_en,
350 GPIOF_OUT_INIT_LOW, "spkr_en"); 265 GPIOF_OUT_INIT_LOW, "spkr_en");
351 if (ret) { 266 if (ret) {
352 dev_err(card->dev, "cannot get spkr_en gpio\n"); 267 dev_err(card->dev, "cannot get spkr_en gpio\n");
@@ -354,8 +269,12 @@ static int tegra_wm8903_driver_probe(struct platform_device *pdev)
354 } 269 }
355 } 270 }
356 271
357 if (gpio_is_valid(pdata->gpio_hp_mute)) { 272 machine->gpio_hp_mute = of_get_named_gpio(np, "nvidia,hp-mute-gpios",
358 ret = devm_gpio_request_one(&pdev->dev, pdata->gpio_hp_mute, 273 0);
274 if (machine->gpio_hp_mute == -EPROBE_DEFER)
275 return -EPROBE_DEFER;
276 if (gpio_is_valid(machine->gpio_hp_mute)) {
277 ret = devm_gpio_request_one(&pdev->dev, machine->gpio_hp_mute,
359 GPIOF_OUT_INIT_HIGH, "hp_mute"); 278 GPIOF_OUT_INIT_HIGH, "hp_mute");
360 if (ret) { 279 if (ret) {
361 dev_err(card->dev, "cannot get hp_mute gpio\n"); 280 dev_err(card->dev, "cannot get hp_mute gpio\n");
@@ -363,9 +282,18 @@ static int tegra_wm8903_driver_probe(struct platform_device *pdev)
363 } 282 }
364 } 283 }
365 284
366 if (gpio_is_valid(pdata->gpio_int_mic_en)) { 285 machine->gpio_hp_det = of_get_named_gpio(np, "nvidia,hp-det-gpios", 0);
286 if (machine->gpio_hp_det == -EPROBE_DEFER)
287 return -EPROBE_DEFER;
288
289 machine->gpio_int_mic_en = of_get_named_gpio(np,
290 "nvidia,int-mic-en-gpios", 0);
291 if (machine->gpio_int_mic_en == -EPROBE_DEFER)
292 return -EPROBE_DEFER;
293 if (gpio_is_valid(machine->gpio_int_mic_en)) {
367 /* Disable int mic; enable signal is active-high */ 294 /* Disable int mic; enable signal is active-high */
368 ret = devm_gpio_request_one(&pdev->dev, pdata->gpio_int_mic_en, 295 ret = devm_gpio_request_one(&pdev->dev,
296 machine->gpio_int_mic_en,
369 GPIOF_OUT_INIT_LOW, "int_mic_en"); 297 GPIOF_OUT_INIT_LOW, "int_mic_en");
370 if (ret) { 298 if (ret) {
371 dev_err(card->dev, "cannot get int_mic_en gpio\n"); 299 dev_err(card->dev, "cannot get int_mic_en gpio\n");
@@ -373,9 +301,14 @@ static int tegra_wm8903_driver_probe(struct platform_device *pdev)
373 } 301 }
374 } 302 }
375 303
376 if (gpio_is_valid(pdata->gpio_ext_mic_en)) { 304 machine->gpio_ext_mic_en = of_get_named_gpio(np,
305 "nvidia,ext-mic-en-gpios", 0);
306 if (machine->gpio_ext_mic_en == -EPROBE_DEFER)
307 return -EPROBE_DEFER;
308 if (gpio_is_valid(machine->gpio_ext_mic_en)) {
377 /* Enable ext mic; enable signal is active-low */ 309 /* Enable ext mic; enable signal is active-low */
378 ret = devm_gpio_request_one(&pdev->dev, pdata->gpio_ext_mic_en, 310 ret = devm_gpio_request_one(&pdev->dev,
311 machine->gpio_ext_mic_en,
379 GPIOF_OUT_INIT_LOW, "ext_mic_en"); 312 GPIOF_OUT_INIT_LOW, "ext_mic_en");
380 if (ret) { 313 if (ret) {
381 dev_err(card->dev, "cannot get ext_mic_en gpio\n"); 314 dev_err(card->dev, "cannot get ext_mic_en gpio\n");
@@ -383,6 +316,34 @@ static int tegra_wm8903_driver_probe(struct platform_device *pdev)
383 } 316 }
384 } 317 }
385 318
319 ret = snd_soc_of_parse_card_name(card, "nvidia,model");
320 if (ret)
321 goto err;
322
323 ret = snd_soc_of_parse_audio_routing(card, "nvidia,audio-routing");
324 if (ret)
325 goto err;
326
327 tegra_wm8903_dai.codec_of_node = of_parse_phandle(np,
328 "nvidia,audio-codec", 0);
329 if (!tegra_wm8903_dai.codec_of_node) {
330 dev_err(&pdev->dev,
331 "Property 'nvidia,audio-codec' missing or invalid\n");
332 ret = -EINVAL;
333 goto err;
334 }
335
336 tegra_wm8903_dai.cpu_of_node = of_parse_phandle(np,
337 "nvidia,i2s-controller", 0);
338 if (!tegra_wm8903_dai.cpu_of_node) {
339 dev_err(&pdev->dev,
340 "Property 'nvidia,i2s-controller' missing or invalid\n");
341 ret = -EINVAL;
342 goto err;
343 }
344
345 tegra_wm8903_dai.platform_of_node = tegra_wm8903_dai.cpu_of_node;
346
386 ret = tegra_asoc_utils_init(&machine->util_data, &pdev->dev); 347 ret = tegra_asoc_utils_init(&machine->util_data, &pdev->dev);
387 if (ret) 348 if (ret)
388 goto err; 349 goto err;
diff --git a/sound/soc/tegra/tegra_wm9712.c b/sound/soc/tegra/tegra_wm9712.c
index 6839f88167d0..5e119630b0e0 100644
--- a/sound/soc/tegra/tegra_wm9712.c
+++ b/sound/soc/tegra/tegra_wm9712.c
@@ -79,11 +79,6 @@ static int tegra_wm9712_driver_probe(struct platform_device *pdev)
79 struct tegra_wm9712 *machine; 79 struct tegra_wm9712 *machine;
80 int ret; 80 int ret;
81 81
82 if (!pdev->dev.of_node) {
83 dev_err(&pdev->dev, "No platform data supplied\n");
84 return -EINVAL;
85 }
86
87 machine = devm_kzalloc(&pdev->dev, sizeof(struct tegra_wm9712), 82 machine = devm_kzalloc(&pdev->dev, sizeof(struct tegra_wm9712),
88 GFP_KERNEL); 83 GFP_KERNEL);
89 if (!machine) { 84 if (!machine) {
diff --git a/sound/soc/tegra/trimslice.c b/sound/soc/tegra/trimslice.c
index 7fcf6c2297db..05c68aab5cf0 100644
--- a/sound/soc/tegra/trimslice.c
+++ b/sound/soc/tegra/trimslice.c
@@ -97,9 +97,6 @@ static const struct snd_soc_dapm_route trimslice_audio_map[] = {
97static struct snd_soc_dai_link trimslice_tlv320aic23_dai = { 97static struct snd_soc_dai_link trimslice_tlv320aic23_dai = {
98 .name = "TLV320AIC23", 98 .name = "TLV320AIC23",
99 .stream_name = "AIC23", 99 .stream_name = "AIC23",
100 .codec_name = "tlv320aic23-codec.2-001a",
101 .platform_name = "tegra20-i2s.0",
102 .cpu_dai_name = "tegra20-i2s.0",
103 .codec_dai_name = "tlv320aic23-hifi", 100 .codec_dai_name = "tlv320aic23-hifi",
104 .ops = &trimslice_asoc_ops, 101 .ops = &trimslice_asoc_ops,
105 .dai_fmt = SND_SOC_DAIFMT_I2S | 102 .dai_fmt = SND_SOC_DAIFMT_I2S |
@@ -122,6 +119,7 @@ static struct snd_soc_card snd_soc_trimslice = {
122 119
123static int tegra_snd_trimslice_probe(struct platform_device *pdev) 120static int tegra_snd_trimslice_probe(struct platform_device *pdev)
124{ 121{
122 struct device_node *np = pdev->dev.of_node;
125 struct snd_soc_card *card = &snd_soc_trimslice; 123 struct snd_soc_card *card = &snd_soc_trimslice;
126 struct tegra_trimslice *trimslice; 124 struct tegra_trimslice *trimslice;
127 int ret; 125 int ret;
@@ -130,44 +128,38 @@ static int tegra_snd_trimslice_probe(struct platform_device *pdev)
130 GFP_KERNEL); 128 GFP_KERNEL);
131 if (!trimslice) { 129 if (!trimslice) {
132 dev_err(&pdev->dev, "Can't allocate tegra_trimslice\n"); 130 dev_err(&pdev->dev, "Can't allocate tegra_trimslice\n");
133 ret = -ENOMEM; 131 return -ENOMEM;
132 }
133
134 card->dev = &pdev->dev;
135 platform_set_drvdata(pdev, card);
136 snd_soc_card_set_drvdata(card, trimslice);
137
138 trimslice_tlv320aic23_dai.codec_of_node = of_parse_phandle(np,
139 "nvidia,audio-codec", 0);
140 if (!trimslice_tlv320aic23_dai.codec_of_node) {
141 dev_err(&pdev->dev,
142 "Property 'nvidia,audio-codec' missing or invalid\n");
143 ret = -EINVAL;
134 goto err; 144 goto err;
135 } 145 }
136 146
137 if (pdev->dev.of_node) { 147 trimslice_tlv320aic23_dai.cpu_of_node = of_parse_phandle(np,
138 trimslice_tlv320aic23_dai.codec_name = NULL; 148 "nvidia,i2s-controller", 0);
139 trimslice_tlv320aic23_dai.codec_of_node = of_parse_phandle( 149 if (!trimslice_tlv320aic23_dai.cpu_of_node) {
140 pdev->dev.of_node, "nvidia,audio-codec", 0); 150 dev_err(&pdev->dev,
141 if (!trimslice_tlv320aic23_dai.codec_of_node) { 151 "Property 'nvidia,i2s-controller' missing or invalid\n");
142 dev_err(&pdev->dev, 152 ret = -EINVAL;
143 "Property 'nvidia,audio-codec' missing or invalid\n"); 153 goto err;
144 ret = -EINVAL;
145 goto err;
146 }
147
148 trimslice_tlv320aic23_dai.cpu_dai_name = NULL;
149 trimslice_tlv320aic23_dai.cpu_of_node = of_parse_phandle(
150 pdev->dev.of_node, "nvidia,i2s-controller", 0);
151 if (!trimslice_tlv320aic23_dai.cpu_of_node) {
152 dev_err(&pdev->dev,
153 "Property 'nvidia,i2s-controller' missing or invalid\n");
154 ret = -EINVAL;
155 goto err;
156 }
157
158 trimslice_tlv320aic23_dai.platform_name = NULL;
159 trimslice_tlv320aic23_dai.platform_of_node =
160 trimslice_tlv320aic23_dai.cpu_of_node;
161 } 154 }
162 155
156 trimslice_tlv320aic23_dai.platform_of_node =
157 trimslice_tlv320aic23_dai.cpu_of_node;
158
163 ret = tegra_asoc_utils_init(&trimslice->util_data, &pdev->dev); 159 ret = tegra_asoc_utils_init(&trimslice->util_data, &pdev->dev);
164 if (ret) 160 if (ret)
165 goto err; 161 goto err;
166 162
167 card->dev = &pdev->dev;
168 platform_set_drvdata(pdev, card);
169 snd_soc_card_set_drvdata(card, trimslice);
170
171 ret = snd_soc_register_card(card); 163 ret = snd_soc_register_card(card);
172 if (ret) { 164 if (ret) {
173 dev_err(&pdev->dev, "snd_soc_register_card failed (%d)\n", 165 dev_err(&pdev->dev, "snd_soc_register_card failed (%d)\n",