At Sat, 2 May 2015 04:51:34 +0000, Jie, Yang wrote:
-----Original Message----- From: Takashi Iwai [mailto:tiwai@suse.de] Sent: Friday, May 01, 2015 3:11 PM To: Jie, Yang Cc: broonie@kernel.org; alsa-devel@alsa-project.org; Girdwood, Liam R Subject: Re: [PATCH] ALSA: jack: fix a randconfig build issue
At Fri, 1 May 2015 11:10:29 +0800, Jie Yang wrote:
There may be no input_dev for jack(e.g. phantom jack), when CONFIG_INPUT is not selected, building errors such as: undefined reference to `input_xxx'...
Here add #ifdef judgement to fix the issue.
Well, the standard idiom so far is to enable SND_JACK selectively. Take a look at the comment in sound/core/Kconfig.
# To be effective this also requires INPUT - users should say: # select SND_JACK if INPUT=y || INPUT=SND # to avoid having to force INPUT on. config SND_JACK bool
And, looking at sound/pci/hda/Kconfig, there is still SND_HDA_INPUT_JACK.
So, what you need to fix is:
Remove SND_HDA_INPUT_JACK from sound/pci/hda/Kconfig and the last ifdef in hda_codec.h
Replace the line "select SND_JACK" with select SND_JACK if INPUT=y || INPUT=SND_HDA
OK, will follow this. What I only concern is that if user want SND_JACk when INPUT=N(e.g. phantom jack?), it becomes impossible.
Right, it's impossible now. But this is the case really no one would care much (who wants the jack detection on a system without any input capability?).
Takashi
~Keyon
thanks,
Takashi
Signed-off-by: Jie Yang yang.jie@intel.com
include/sound/jack.h | 2 ++ sound/core/jack.c | 40 ++++++++++++++++++++++++++-------------- 2 files changed, 28 insertions(+), 14 deletions(-)
diff --git a/include/sound/jack.h b/include/sound/jack.h index 23bede1..c1010f9 100644 --- a/include/sound/jack.h +++ b/include/sound/jack.h @@ -72,7 +72,9 @@ enum snd_jack_types { #define
SND_JACK_SWITCH_TYPES
6
struct snd_jack { +#ifdef CONFIG_INPUT struct input_dev *input_dev; +#endif struct list_head kctl_list; struct snd_card *card; int registered; diff --git a/sound/core/jack.c b/sound/core/jack.c index eb66327..3a1901e 100644 --- a/sound/core/jack.c +++ b/sound/core/jack.c @@ -32,6 +32,7 @@ struct snd_jack_kctl { unsigned int mask_bits; /* only masked status bits are reported via kctl */ };
+#ifdef CONFIG_INPUT static int jack_switch_types[SND_JACK_SWITCH_TYPES] = { SW_HEADPHONE_INSERT, SW_MICROPHONE_INSERT, @@ -40,9 +41,11 @@ static int
jack_switch_types[SND_JACK_SWITCH_TYPES] = {
SW_VIDEOOUT_INSERT, SW_LINEIN_INSERT, }; +#endif
static int snd_jack_dev_disconnect(struct snd_device *device) { +#ifdef CONFIG_INPUT struct snd_jack *jack = device->device_data;
if (!jack->input_dev) @@ -54,7 +57,9 @@ static int snd_jack_dev_disconnect(struct snd_device
*device)
input_unregister_device(jack->input_dev);
else input_free_device(jack->input_dev);
- jack->input_dev = NULL;
+#endif return 0; }
@@ -83,11 +88,12 @@ static int snd_jack_dev_register(struct snd_device *device) { struct snd_jack *jack = device->device_data; struct snd_card *card = device->card;
- int err, i;
int err = 0;
snprintf(jack->name, sizeof(jack->name), "%s %s", card->shortname, jack->id);
+#ifdef CONFIG_INPUT if (!jack->input_dev) return 0;
@@ -98,7 +104,7 @@ static int snd_jack_dev_register(struct snd_device
*device)
jack->input_dev->dev.parent =
snd_card_get_device_link(card);
/* Add capabilities for any keys that are enabled */
- for (i = 0; i < ARRAY_SIZE(jack->key); i++) {
for (int i = 0; i < ARRAY_SIZE(jack->key); i++) { int testbit = SND_JACK_BTN_0 >> i;
if (!(jack->type & testbit))
@@ -113,6 +119,7 @@ static int snd_jack_dev_register(struct snd_device
*device)
err = input_register_device(jack->input_dev); if (err == 0) jack->registered = 1; +#endif
return err; } @@ -209,7 +216,6 @@ int snd_jack_new(struct snd_card *card, const char
*id, int type,
struct snd_jack *jack; struct snd_jack_kctl *jack_kctl = NULL; int err;
- int i; static struct snd_device_ops ops = { .dev_free = snd_jack_dev_free, .dev_register = snd_jack_dev_register, @@ -230,26 +236,31
@@ int
snd_jack_new(struct snd_card *card, const char *id, int type,
/* don't creat input device for phantom jack */ if (!phantom_jack) { +#ifdef CONFIG_INPUT jack->input_dev = input_allocate_device(); if (jack->input_dev == NULL) { err = -ENOMEM;
goto fail_input;
goto error;
}
jack->input_dev->phys = "ALSA";
jack->type = type;
for (i = 0; i < SND_JACK_SWITCH_TYPES; i++)
for (int i = 0; i < SND_JACK_SWITCH_TYPES; i++) if (type & (1 << i)) input_set_capability(jack->input_dev,
EV_SW,
jack_switch_types[i]);
+#endif
jack->type = type;
}
err = snd_device_new(card, SNDRV_DEV_JACK, jack, &ops);
- if (err < 0)
goto fail_input;
- if (err < 0) {
+#ifdef CONFIG_INPUT
input_free_device(jack->input_dev);
+#endif
goto error;
}
jack->card = card; INIT_LIST_HEAD(&jack->kctl_list);
@@ -261,8 +272,7 @@ int snd_jack_new(struct snd_card *card, const char *id, int type,
return 0;
-fail_input:
- input_free_device(jack->input_dev);
+error: kfree(jack->id); kfree(jack); return err; @@ -281,11 +291,13 @@ EXPORT_SYMBOL(snd_jack_new); */ void snd_jack_set_parent(struct snd_jack *jack, struct device *parent) { +#ifdef CONFIG_INPUT WARN_ON(jack->registered); if (!jack->input_dev) return;
jack->input_dev->dev.parent = parent; +#endif } EXPORT_SYMBOL(snd_jack_set_parent);
@@ -340,7 +352,6 @@ EXPORT_SYMBOL(snd_jack_set_key); void snd_jack_report(struct snd_jack *jack, int status) { struct snd_jack_kctl *jack_kctl;
int i;
if (!jack) return;
@@ -349,10 +360,11 @@ void snd_jack_report(struct snd_jack *jack, int
status)
snd_kctl_jack_report(jack->card, jack_kctl->kctl, status & jack_kctl->mask_bits);
+#ifdef CONFIG_INPUT if (!jack->input_dev) return;
- for (i = 0; i < ARRAY_SIZE(jack->key); i++) {
for (int i = 0; i < ARRAY_SIZE(jack->key); i++) { int testbit = SND_JACK_BTN_0 >> i;
if (jack->type & testbit)
@@ -369,7 +381,7 @@ void snd_jack_report(struct snd_jack *jack, int
status)
}
input_sync(jack->input_dev);
+#endif } EXPORT_SYMBOL(snd_jack_report);
-- 1.9.1