|
@@ -22,7 +22,7 @@
|
|
|
*
|
|
|
*/
|
|
|
|
|
|
-#include <linux/gpio.h>
|
|
|
+#include <linux/gpio/consumer.h>
|
|
|
#include <linux/spinlock.h>
|
|
|
#include <linux/tty.h>
|
|
|
#include <linux/module.h>
|
|
@@ -32,7 +32,6 @@
|
|
|
|
|
|
#include <asm/mach-types.h>
|
|
|
|
|
|
-#include <mach/board-ams-delta.h>
|
|
|
#include <linux/platform_data/asoc-ti-mcbsp.h>
|
|
|
|
|
|
#include "omap-mcbsp.h"
|
|
@@ -213,7 +212,6 @@ static const struct snd_kcontrol_new ams_delta_audio_controls[] = {
|
|
|
static struct snd_soc_jack ams_delta_hook_switch;
|
|
|
static struct snd_soc_jack_gpio ams_delta_hook_switch_gpios[] = {
|
|
|
{
|
|
|
- .gpio = 4,
|
|
|
.name = "hook_switch",
|
|
|
.report = SND_JACK_HEADSET,
|
|
|
.invert = 1,
|
|
@@ -259,6 +257,7 @@ static struct timer_list cx81801_timer;
|
|
|
static bool cx81801_cmd_pending;
|
|
|
static bool ams_delta_muted;
|
|
|
static DEFINE_SPINLOCK(ams_delta_lock);
|
|
|
+static struct gpio_desc *gpiod_modem_codec;
|
|
|
|
|
|
static void cx81801_timeout(struct timer_list *unused)
|
|
|
{
|
|
@@ -272,7 +271,7 @@ static void cx81801_timeout(struct timer_list *unused)
|
|
|
/* Reconnect the codec DAI back from the modem to the CPU DAI
|
|
|
* only if digital mute still off */
|
|
|
if (!muted)
|
|
|
- ams_delta_latch2_write(AMS_DELTA_LATCH2_MODEM_CODEC, 0);
|
|
|
+ gpiod_set_value(gpiod_modem_codec, 0);
|
|
|
}
|
|
|
|
|
|
/* Line discipline .open() */
|
|
@@ -381,8 +380,7 @@ static void cx81801_receive(struct tty_struct *tty,
|
|
|
/* Apply config pulse by connecting the codec to the modem
|
|
|
* if not already done */
|
|
|
if (apply)
|
|
|
- ams_delta_latch2_write(AMS_DELTA_LATCH2_MODEM_CODEC,
|
|
|
- AMS_DELTA_LATCH2_MODEM_CODEC);
|
|
|
+ gpiod_set_value(gpiod_modem_codec, 1);
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
@@ -432,8 +430,7 @@ static int ams_delta_digital_mute(struct snd_soc_dai *dai, int mute)
|
|
|
spin_unlock_bh(&ams_delta_lock);
|
|
|
|
|
|
if (apply)
|
|
|
- ams_delta_latch2_write(AMS_DELTA_LATCH2_MODEM_CODEC,
|
|
|
- mute ? AMS_DELTA_LATCH2_MODEM_CODEC : 0);
|
|
|
+ gpiod_set_value(gpiod_modem_codec, !!mute);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -469,14 +466,6 @@ static int ams_delta_cx20442_init(struct snd_soc_pcm_runtime *rtd)
|
|
|
/* Store a pointer to the codec structure for tty ldisc use */
|
|
|
cx20442_codec = rtd->codec_dai->component;
|
|
|
|
|
|
- /* Set up digital mute if not provided by the codec */
|
|
|
- if (!codec_dai->driver->ops) {
|
|
|
- codec_dai->driver->ops = &ams_delta_dai_ops;
|
|
|
- } else {
|
|
|
- ams_delta_ops.startup = ams_delta_startup;
|
|
|
- ams_delta_ops.shutdown = ams_delta_shutdown;
|
|
|
- }
|
|
|
-
|
|
|
/* Add hook switch - can be used to control the codec from userspace
|
|
|
* even if line discipline fails */
|
|
|
ret = snd_soc_card_jack_new(card, "hook_switch", SND_JACK_HEADSET,
|
|
@@ -486,7 +475,7 @@ static int ams_delta_cx20442_init(struct snd_soc_pcm_runtime *rtd)
|
|
|
"Failed to allocate resources for hook switch, "
|
|
|
"will continue without one.\n");
|
|
|
else {
|
|
|
- ret = snd_soc_jack_add_gpios(&ams_delta_hook_switch,
|
|
|
+ ret = snd_soc_jack_add_gpiods(card->dev, &ams_delta_hook_switch,
|
|
|
ARRAY_SIZE(ams_delta_hook_switch_gpios),
|
|
|
ams_delta_hook_switch_gpios);
|
|
|
if (ret)
|
|
@@ -495,6 +484,21 @@ static int ams_delta_cx20442_init(struct snd_soc_pcm_runtime *rtd)
|
|
|
"will continue with hook switch inactive.\n");
|
|
|
}
|
|
|
|
|
|
+ gpiod_modem_codec = devm_gpiod_get(card->dev, "modem_codec",
|
|
|
+ GPIOD_OUT_HIGH);
|
|
|
+ if (IS_ERR(gpiod_modem_codec)) {
|
|
|
+ dev_warn(card->dev, "Failed to obtain modem_codec GPIO\n");
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Set up digital mute if not provided by the codec */
|
|
|
+ if (!codec_dai->driver->ops) {
|
|
|
+ codec_dai->driver->ops = &ams_delta_dai_ops;
|
|
|
+ } else {
|
|
|
+ ams_delta_ops.startup = ams_delta_startup;
|
|
|
+ ams_delta_ops.shutdown = ams_delta_shutdown;
|
|
|
+ }
|
|
|
+
|
|
|
/* Register optional line discipline for over the modem control */
|
|
|
ret = tty_register_ldisc(N_V253, &cx81801_ops);
|
|
|
if (ret) {
|