1 // SPDX-License-Identifier: GPL-2.0-only
2 // SPDX-FileCopyrightText: Copyright (c) 2021-2024 NVIDIA CORPORATION & AFFILIATES.
3 // All rights reserved.
5 // tegra210_amx.c - Tegra210 AMX driver
8 #include <linux/device.h>
10 #include <linux/mod_devicetable.h>
11 #include <linux/module.h>
12 #include <linux/platform_device.h>
13 #include <linux/pm_runtime.h>
14 #include <linux/regmap.h>
15 #include <sound/core.h>
16 #include <sound/pcm.h>
17 #include <sound/pcm_params.h>
18 #include <sound/soc.h>
20 #include "tegra210_amx.h"
21 #include "tegra_cif.h"
24 * The counter is in terms of AHUB clock cycles. If a frame is not
25 * received within these clock cycles, the AMX input channel gets
26 * automatically disabled. For now the counter is calculated as a
27 * function of sample rate (8 kHz) and AHUB clock (49.152 MHz).
28 * If later an accurate number is needed, the counter needs to be
29 * calculated at runtime.
31 * count = ahub_clk / sample_rate
33 #define TEGRA194_MAX_FRAME_IDLE_COUNT 0x1800
35 #define AMX_CH_REG(id, reg) ((reg) + ((id) * TEGRA210_AMX_AUDIOCIF_CH_STRIDE))
37 static const struct reg_default tegra210_amx_reg_defaults
[] = {
38 { TEGRA210_AMX_RX_INT_MASK
, 0x0000000f},
39 { TEGRA210_AMX_RX1_CIF_CTRL
, 0x00007000},
40 { TEGRA210_AMX_RX2_CIF_CTRL
, 0x00007000},
41 { TEGRA210_AMX_RX3_CIF_CTRL
, 0x00007000},
42 { TEGRA210_AMX_RX4_CIF_CTRL
, 0x00007000},
43 { TEGRA210_AMX_TX_INT_MASK
, 0x00000001},
44 { TEGRA210_AMX_TX_CIF_CTRL
, 0x00007000},
45 { TEGRA210_AMX_CG
, 0x1},
46 { TEGRA210_AMX_CFG_RAM_CTRL
, 0x00004000},
49 static void tegra210_amx_write_map_ram(struct tegra210_amx
*amx
)
53 regmap_write(amx
->regmap
, TEGRA210_AMX_CFG_RAM_CTRL
,
54 TEGRA210_AMX_CFG_RAM_CTRL_SEQ_ACCESS_EN
|
55 TEGRA210_AMX_CFG_RAM_CTRL_ADDR_INIT_EN
|
56 TEGRA210_AMX_CFG_RAM_CTRL_RW_WRITE
);
58 for (i
= 0; i
< TEGRA210_AMX_RAM_DEPTH
; i
++)
59 regmap_write(amx
->regmap
, TEGRA210_AMX_CFG_RAM_DATA
,
62 regmap_write(amx
->regmap
, TEGRA210_AMX_OUT_BYTE_EN0
, amx
->byte_mask
[0]);
63 regmap_write(amx
->regmap
, TEGRA210_AMX_OUT_BYTE_EN1
, amx
->byte_mask
[1]);
66 static int tegra210_amx_startup(struct snd_pcm_substream
*substream
,
67 struct snd_soc_dai
*dai
)
69 struct tegra210_amx
*amx
= snd_soc_dai_get_drvdata(dai
);
73 /* Ensure if AMX is disabled */
74 err
= regmap_read_poll_timeout(amx
->regmap
, TEGRA210_AMX_STATUS
, val
,
75 !(val
& 0x1), 10, 10000);
77 dev_err(dai
->dev
, "failed to stop AMX, err = %d\n", err
);
82 * Soft Reset: Below performs module soft reset which clears
83 * all FSM logic, flushes flow control of FIFO and resets the
84 * state register. It also brings module back to disabled
85 * state (without flushing the data in the pipe).
87 regmap_update_bits(amx
->regmap
, TEGRA210_AMX_SOFT_RESET
,
88 TEGRA210_AMX_SOFT_RESET_SOFT_RESET_MASK
,
89 TEGRA210_AMX_SOFT_RESET_SOFT_EN
);
91 err
= regmap_read_poll_timeout(amx
->regmap
, TEGRA210_AMX_SOFT_RESET
,
92 val
, !(val
& 0x1), 10, 10000);
94 dev_err(dai
->dev
, "failed to reset AMX, err = %d\n", err
);
101 static int __maybe_unused
tegra210_amx_runtime_suspend(struct device
*dev
)
103 struct tegra210_amx
*amx
= dev_get_drvdata(dev
);
105 regcache_cache_only(amx
->regmap
, true);
106 regcache_mark_dirty(amx
->regmap
);
111 static int __maybe_unused
tegra210_amx_runtime_resume(struct device
*dev
)
113 struct tegra210_amx
*amx
= dev_get_drvdata(dev
);
115 regcache_cache_only(amx
->regmap
, false);
116 regcache_sync(amx
->regmap
);
118 regmap_update_bits(amx
->regmap
,
120 TEGRA210_AMX_CTRL_RX_DEP_MASK
,
121 TEGRA210_AMX_WAIT_ON_ANY
<< TEGRA210_AMX_CTRL_RX_DEP_SHIFT
);
123 tegra210_amx_write_map_ram(amx
);
128 static int tegra210_amx_set_audio_cif(struct snd_soc_dai
*dai
,
129 struct snd_pcm_hw_params
*params
,
132 struct tegra210_amx
*amx
= snd_soc_dai_get_drvdata(dai
);
133 int channels
, audio_bits
;
134 struct tegra_cif_conf cif_conf
;
136 memset(&cif_conf
, 0, sizeof(struct tegra_cif_conf
));
138 channels
= params_channels(params
);
140 switch (params_format(params
)) {
141 case SNDRV_PCM_FORMAT_S8
:
142 audio_bits
= TEGRA_ACIF_BITS_8
;
144 case SNDRV_PCM_FORMAT_S16_LE
:
145 audio_bits
= TEGRA_ACIF_BITS_16
;
147 case SNDRV_PCM_FORMAT_S24_LE
:
148 case SNDRV_PCM_FORMAT_S32_LE
:
149 audio_bits
= TEGRA_ACIF_BITS_32
;
155 cif_conf
.audio_ch
= channels
;
156 cif_conf
.client_ch
= channels
;
157 cif_conf
.audio_bits
= audio_bits
;
158 cif_conf
.client_bits
= audio_bits
;
160 tegra_set_cif(amx
->regmap
, reg
, &cif_conf
);
165 static int tegra210_amx_in_hw_params(struct snd_pcm_substream
*substream
,
166 struct snd_pcm_hw_params
*params
,
167 struct snd_soc_dai
*dai
)
169 struct tegra210_amx
*amx
= snd_soc_dai_get_drvdata(dai
);
171 if (amx
->soc_data
->auto_disable
) {
172 regmap_write(amx
->regmap
,
173 AMX_CH_REG(dai
->id
, TEGRA194_AMX_RX1_FRAME_PERIOD
),
174 TEGRA194_MAX_FRAME_IDLE_COUNT
);
175 regmap_write(amx
->regmap
, TEGRA210_AMX_CYA
, 1);
178 return tegra210_amx_set_audio_cif(dai
, params
,
179 AMX_CH_REG(dai
->id
, TEGRA210_AMX_RX1_CIF_CTRL
));
182 static int tegra210_amx_out_hw_params(struct snd_pcm_substream
*substream
,
183 struct snd_pcm_hw_params
*params
,
184 struct snd_soc_dai
*dai
)
186 return tegra210_amx_set_audio_cif(dai
, params
,
187 TEGRA210_AMX_TX_CIF_CTRL
);
190 static int tegra210_amx_get_byte_map(struct snd_kcontrol
*kcontrol
,
191 struct snd_ctl_elem_value
*ucontrol
)
193 struct snd_soc_component
*cmpnt
= snd_soc_kcontrol_component(kcontrol
);
194 struct soc_mixer_control
*mc
=
195 (struct soc_mixer_control
*)kcontrol
->private_value
;
196 struct tegra210_amx
*amx
= snd_soc_component_get_drvdata(cmpnt
);
197 unsigned char *bytes_map
= (unsigned char *)&amx
->map
;
202 enabled
= amx
->byte_mask
[1] & (1 << (reg
- 32));
204 enabled
= amx
->byte_mask
[0] & (1 << reg
);
207 * TODO: Simplify this logic to just return from bytes_map[]
209 * Presently below is required since bytes_map[] is
210 * tightly packed and cannot store the control value of 256.
211 * Byte mask state is used to know if 256 needs to be returned.
212 * Note that for control value of 256, the put() call stores 0
213 * in the bytes_map[] and disables the corresponding bit in
217 ucontrol
->value
.integer
.value
[0] = bytes_map
[reg
];
219 ucontrol
->value
.integer
.value
[0] = 256;
224 static int tegra210_amx_put_byte_map(struct snd_kcontrol
*kcontrol
,
225 struct snd_ctl_elem_value
*ucontrol
)
227 struct soc_mixer_control
*mc
=
228 (struct soc_mixer_control
*)kcontrol
->private_value
;
229 struct snd_soc_component
*cmpnt
= snd_soc_kcontrol_component(kcontrol
);
230 struct tegra210_amx
*amx
= snd_soc_component_get_drvdata(cmpnt
);
231 unsigned char *bytes_map
= (unsigned char *)&amx
->map
;
233 int value
= ucontrol
->value
.integer
.value
[0];
234 unsigned int mask_val
= amx
->byte_mask
[reg
/ 32];
236 if (value
>= 0 && value
<= 255)
237 mask_val
|= (1 << (reg
% 32));
239 mask_val
&= ~(1 << (reg
% 32));
241 if (mask_val
== amx
->byte_mask
[reg
/ 32])
244 /* Update byte map and slot */
245 bytes_map
[reg
] = value
% 256;
246 amx
->byte_mask
[reg
/ 32] = mask_val
;
251 static const struct snd_soc_dai_ops tegra210_amx_out_dai_ops
= {
252 .hw_params
= tegra210_amx_out_hw_params
,
253 .startup
= tegra210_amx_startup
,
256 static const struct snd_soc_dai_ops tegra210_amx_in_dai_ops
= {
257 .hw_params
= tegra210_amx_in_hw_params
,
262 .name = "AMX-RX-CIF" #id, \
264 .stream_name = "RX" #id "-CIF-Playback",\
266 .channels_max = 16, \
267 .rates = SNDRV_PCM_RATE_8000_192000, \
268 .formats = SNDRV_PCM_FMTBIT_S8 | \
269 SNDRV_PCM_FMTBIT_S16_LE | \
270 SNDRV_PCM_FMTBIT_S24_LE | \
271 SNDRV_PCM_FMTBIT_S32_LE, \
274 .stream_name = "RX" #id "-CIF-Capture", \
276 .channels_max = 16, \
277 .rates = SNDRV_PCM_RATE_8000_192000, \
278 .formats = SNDRV_PCM_FMTBIT_S8 | \
279 SNDRV_PCM_FMTBIT_S16_LE | \
280 SNDRV_PCM_FMTBIT_S24_LE | \
281 SNDRV_PCM_FMTBIT_S32_LE, \
283 .ops = &tegra210_amx_in_dai_ops, \
288 .name = "AMX-TX-CIF", \
290 .stream_name = "TX-CIF-Playback", \
292 .channels_max = 16, \
293 .rates = SNDRV_PCM_RATE_8000_192000, \
294 .formats = SNDRV_PCM_FMTBIT_S8 | \
295 SNDRV_PCM_FMTBIT_S16_LE | \
296 SNDRV_PCM_FMTBIT_S24_LE | \
297 SNDRV_PCM_FMTBIT_S32_LE, \
300 .stream_name = "TX-CIF-Capture", \
302 .channels_max = 16, \
303 .rates = SNDRV_PCM_RATE_8000_192000, \
304 .formats = SNDRV_PCM_FMTBIT_S8 | \
305 SNDRV_PCM_FMTBIT_S16_LE | \
306 SNDRV_PCM_FMTBIT_S24_LE | \
307 SNDRV_PCM_FMTBIT_S32_LE, \
309 .ops = &tegra210_amx_out_dai_ops, \
312 static struct snd_soc_dai_driver tegra210_amx_dais
[] = {
320 static const struct snd_soc_dapm_widget tegra210_amx_widgets
[] = {
321 SND_SOC_DAPM_AIF_IN("RX1", NULL
, 0, TEGRA210_AMX_CTRL
, 0, 0),
322 SND_SOC_DAPM_AIF_IN("RX2", NULL
, 0, TEGRA210_AMX_CTRL
, 1, 0),
323 SND_SOC_DAPM_AIF_IN("RX3", NULL
, 0, TEGRA210_AMX_CTRL
, 2, 0),
324 SND_SOC_DAPM_AIF_IN("RX4", NULL
, 0, TEGRA210_AMX_CTRL
, 3, 0),
325 SND_SOC_DAPM_AIF_OUT("TX", NULL
, 0, TEGRA210_AMX_ENABLE
,
326 TEGRA210_AMX_ENABLE_SHIFT
, 0),
329 #define STREAM_ROUTES(id, sname) \
330 { "RX" #id " XBAR-" sname, NULL, "RX" #id " XBAR-TX" }, \
331 { "RX" #id "-CIF-" sname, NULL, "RX" #id " XBAR-" sname },\
332 { "RX" #id, NULL, "RX" #id "-CIF-" sname }, \
333 { "TX", NULL, "RX" #id }, \
334 { "TX-CIF-" sname, NULL, "TX" }, \
335 { "XBAR-" sname, NULL, "TX-CIF-" sname }, \
336 { "XBAR-RX", NULL, "XBAR-" sname }
338 #define AMX_ROUTES(id) \
339 STREAM_ROUTES(id, "Playback"), \
340 STREAM_ROUTES(id, "Capture")
342 static const struct snd_soc_dapm_route tegra210_amx_routes
[] = {
349 #define TEGRA210_AMX_BYTE_MAP_CTRL(reg) \
350 SOC_SINGLE_EXT("Byte Map " #reg, reg, 0, 256, 0, \
351 tegra210_amx_get_byte_map, \
352 tegra210_amx_put_byte_map)
354 static struct snd_kcontrol_new tegra210_amx_controls
[] = {
355 TEGRA210_AMX_BYTE_MAP_CTRL(0),
356 TEGRA210_AMX_BYTE_MAP_CTRL(1),
357 TEGRA210_AMX_BYTE_MAP_CTRL(2),
358 TEGRA210_AMX_BYTE_MAP_CTRL(3),
359 TEGRA210_AMX_BYTE_MAP_CTRL(4),
360 TEGRA210_AMX_BYTE_MAP_CTRL(5),
361 TEGRA210_AMX_BYTE_MAP_CTRL(6),
362 TEGRA210_AMX_BYTE_MAP_CTRL(7),
363 TEGRA210_AMX_BYTE_MAP_CTRL(8),
364 TEGRA210_AMX_BYTE_MAP_CTRL(9),
365 TEGRA210_AMX_BYTE_MAP_CTRL(10),
366 TEGRA210_AMX_BYTE_MAP_CTRL(11),
367 TEGRA210_AMX_BYTE_MAP_CTRL(12),
368 TEGRA210_AMX_BYTE_MAP_CTRL(13),
369 TEGRA210_AMX_BYTE_MAP_CTRL(14),
370 TEGRA210_AMX_BYTE_MAP_CTRL(15),
371 TEGRA210_AMX_BYTE_MAP_CTRL(16),
372 TEGRA210_AMX_BYTE_MAP_CTRL(17),
373 TEGRA210_AMX_BYTE_MAP_CTRL(18),
374 TEGRA210_AMX_BYTE_MAP_CTRL(19),
375 TEGRA210_AMX_BYTE_MAP_CTRL(20),
376 TEGRA210_AMX_BYTE_MAP_CTRL(21),
377 TEGRA210_AMX_BYTE_MAP_CTRL(22),
378 TEGRA210_AMX_BYTE_MAP_CTRL(23),
379 TEGRA210_AMX_BYTE_MAP_CTRL(24),
380 TEGRA210_AMX_BYTE_MAP_CTRL(25),
381 TEGRA210_AMX_BYTE_MAP_CTRL(26),
382 TEGRA210_AMX_BYTE_MAP_CTRL(27),
383 TEGRA210_AMX_BYTE_MAP_CTRL(28),
384 TEGRA210_AMX_BYTE_MAP_CTRL(29),
385 TEGRA210_AMX_BYTE_MAP_CTRL(30),
386 TEGRA210_AMX_BYTE_MAP_CTRL(31),
387 TEGRA210_AMX_BYTE_MAP_CTRL(32),
388 TEGRA210_AMX_BYTE_MAP_CTRL(33),
389 TEGRA210_AMX_BYTE_MAP_CTRL(34),
390 TEGRA210_AMX_BYTE_MAP_CTRL(35),
391 TEGRA210_AMX_BYTE_MAP_CTRL(36),
392 TEGRA210_AMX_BYTE_MAP_CTRL(37),
393 TEGRA210_AMX_BYTE_MAP_CTRL(38),
394 TEGRA210_AMX_BYTE_MAP_CTRL(39),
395 TEGRA210_AMX_BYTE_MAP_CTRL(40),
396 TEGRA210_AMX_BYTE_MAP_CTRL(41),
397 TEGRA210_AMX_BYTE_MAP_CTRL(42),
398 TEGRA210_AMX_BYTE_MAP_CTRL(43),
399 TEGRA210_AMX_BYTE_MAP_CTRL(44),
400 TEGRA210_AMX_BYTE_MAP_CTRL(45),
401 TEGRA210_AMX_BYTE_MAP_CTRL(46),
402 TEGRA210_AMX_BYTE_MAP_CTRL(47),
403 TEGRA210_AMX_BYTE_MAP_CTRL(48),
404 TEGRA210_AMX_BYTE_MAP_CTRL(49),
405 TEGRA210_AMX_BYTE_MAP_CTRL(50),
406 TEGRA210_AMX_BYTE_MAP_CTRL(51),
407 TEGRA210_AMX_BYTE_MAP_CTRL(52),
408 TEGRA210_AMX_BYTE_MAP_CTRL(53),
409 TEGRA210_AMX_BYTE_MAP_CTRL(54),
410 TEGRA210_AMX_BYTE_MAP_CTRL(55),
411 TEGRA210_AMX_BYTE_MAP_CTRL(56),
412 TEGRA210_AMX_BYTE_MAP_CTRL(57),
413 TEGRA210_AMX_BYTE_MAP_CTRL(58),
414 TEGRA210_AMX_BYTE_MAP_CTRL(59),
415 TEGRA210_AMX_BYTE_MAP_CTRL(60),
416 TEGRA210_AMX_BYTE_MAP_CTRL(61),
417 TEGRA210_AMX_BYTE_MAP_CTRL(62),
418 TEGRA210_AMX_BYTE_MAP_CTRL(63),
421 static const struct snd_soc_component_driver tegra210_amx_cmpnt
= {
422 .dapm_widgets
= tegra210_amx_widgets
,
423 .num_dapm_widgets
= ARRAY_SIZE(tegra210_amx_widgets
),
424 .dapm_routes
= tegra210_amx_routes
,
425 .num_dapm_routes
= ARRAY_SIZE(tegra210_amx_routes
),
426 .controls
= tegra210_amx_controls
,
427 .num_controls
= ARRAY_SIZE(tegra210_amx_controls
),
430 static bool tegra210_amx_wr_reg(struct device
*dev
, unsigned int reg
)
433 case TEGRA210_AMX_RX_INT_MASK
... TEGRA210_AMX_RX4_CIF_CTRL
:
434 case TEGRA210_AMX_TX_INT_MASK
... TEGRA210_AMX_CG
:
435 case TEGRA210_AMX_CTRL
... TEGRA210_AMX_CYA
:
436 case TEGRA210_AMX_CFG_RAM_CTRL
... TEGRA210_AMX_CFG_RAM_DATA
:
443 static bool tegra194_amx_wr_reg(struct device
*dev
, unsigned int reg
)
446 case TEGRA194_AMX_RX1_FRAME_PERIOD
... TEGRA194_AMX_RX4_FRAME_PERIOD
:
449 return tegra210_amx_wr_reg(dev
, reg
);
453 static bool tegra210_amx_rd_reg(struct device
*dev
, unsigned int reg
)
456 case TEGRA210_AMX_RX_STATUS
... TEGRA210_AMX_CFG_RAM_DATA
:
463 static bool tegra194_amx_rd_reg(struct device
*dev
, unsigned int reg
)
466 case TEGRA194_AMX_RX1_FRAME_PERIOD
... TEGRA194_AMX_RX4_FRAME_PERIOD
:
469 return tegra210_amx_rd_reg(dev
, reg
);
473 static bool tegra210_amx_volatile_reg(struct device
*dev
, unsigned int reg
)
476 case TEGRA210_AMX_RX_STATUS
:
477 case TEGRA210_AMX_RX_INT_STATUS
:
478 case TEGRA210_AMX_RX_INT_SET
:
479 case TEGRA210_AMX_TX_STATUS
:
480 case TEGRA210_AMX_TX_INT_STATUS
:
481 case TEGRA210_AMX_TX_INT_SET
:
482 case TEGRA210_AMX_SOFT_RESET
:
483 case TEGRA210_AMX_STATUS
:
484 case TEGRA210_AMX_INT_STATUS
:
485 case TEGRA210_AMX_CFG_RAM_CTRL
:
486 case TEGRA210_AMX_CFG_RAM_DATA
:
495 static const struct regmap_config tegra210_amx_regmap_config
= {
499 .max_register
= TEGRA210_AMX_CFG_RAM_DATA
,
500 .writeable_reg
= tegra210_amx_wr_reg
,
501 .readable_reg
= tegra210_amx_rd_reg
,
502 .volatile_reg
= tegra210_amx_volatile_reg
,
503 .reg_defaults
= tegra210_amx_reg_defaults
,
504 .num_reg_defaults
= ARRAY_SIZE(tegra210_amx_reg_defaults
),
505 .cache_type
= REGCACHE_FLAT
,
508 static const struct regmap_config tegra194_amx_regmap_config
= {
512 .max_register
= TEGRA194_AMX_RX4_LAST_FRAME_PERIOD
,
513 .writeable_reg
= tegra194_amx_wr_reg
,
514 .readable_reg
= tegra194_amx_rd_reg
,
515 .volatile_reg
= tegra210_amx_volatile_reg
,
516 .reg_defaults
= tegra210_amx_reg_defaults
,
517 .num_reg_defaults
= ARRAY_SIZE(tegra210_amx_reg_defaults
),
518 .cache_type
= REGCACHE_FLAT
,
521 static const struct tegra210_amx_soc_data soc_data_tegra210
= {
522 .regmap_conf
= &tegra210_amx_regmap_config
,
525 static const struct tegra210_amx_soc_data soc_data_tegra194
= {
526 .regmap_conf
= &tegra194_amx_regmap_config
,
527 .auto_disable
= true,
530 static const struct of_device_id tegra210_amx_of_match
[] = {
531 { .compatible
= "nvidia,tegra210-amx", .data
= &soc_data_tegra210
},
532 { .compatible
= "nvidia,tegra194-amx", .data
= &soc_data_tegra194
},
535 MODULE_DEVICE_TABLE(of
, tegra210_amx_of_match
);
537 static int tegra210_amx_platform_probe(struct platform_device
*pdev
)
539 struct device
*dev
= &pdev
->dev
;
540 struct tegra210_amx
*amx
;
544 amx
= devm_kzalloc(dev
, sizeof(*amx
), GFP_KERNEL
);
548 amx
->soc_data
= device_get_match_data(dev
);
550 dev_set_drvdata(dev
, amx
);
552 regs
= devm_platform_ioremap_resource(pdev
, 0);
554 return PTR_ERR(regs
);
556 amx
->regmap
= devm_regmap_init_mmio(dev
, regs
,
557 amx
->soc_data
->regmap_conf
);
558 if (IS_ERR(amx
->regmap
)) {
559 dev_err(dev
, "regmap init failed\n");
560 return PTR_ERR(amx
->regmap
);
563 regcache_cache_only(amx
->regmap
, true);
565 err
= devm_snd_soc_register_component(dev
, &tegra210_amx_cmpnt
,
567 ARRAY_SIZE(tegra210_amx_dais
));
569 dev_err(dev
, "can't register AMX component, err: %d\n", err
);
573 pm_runtime_enable(dev
);
578 static void tegra210_amx_platform_remove(struct platform_device
*pdev
)
580 pm_runtime_disable(&pdev
->dev
);
583 static const struct dev_pm_ops tegra210_amx_pm_ops
= {
584 SET_RUNTIME_PM_OPS(tegra210_amx_runtime_suspend
,
585 tegra210_amx_runtime_resume
, NULL
)
586 SET_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend
,
587 pm_runtime_force_resume
)
590 static struct platform_driver tegra210_amx_driver
= {
592 .name
= "tegra210-amx",
593 .of_match_table
= tegra210_amx_of_match
,
594 .pm
= &tegra210_amx_pm_ops
,
596 .probe
= tegra210_amx_platform_probe
,
597 .remove
= tegra210_amx_platform_remove
,
599 module_platform_driver(tegra210_amx_driver
);
601 MODULE_AUTHOR("Songhee Baek <sbaek@nvidia.com>");
602 MODULE_DESCRIPTION("Tegra210 AMX ASoC driver");
603 MODULE_LICENSE("GPL v2");