Merge branch 'topic/jack-mechanical' into to-push
[sfrench/cifs-2.6.git] / sound / core / jack.c
index bd2d9e6b55e94876af21c7c9894ce00a9df60847..dd4a12dc09aa44f4c50c5b60f2cf5584c5635589 100644 (file)
@@ -34,6 +34,7 @@ static int snd_jack_dev_free(struct snd_device *device)
        else
                input_free_device(jack->input_dev);
 
+       kfree(jack->id);
        kfree(jack);
 
        return 0;
@@ -87,7 +88,7 @@ int snd_jack_new(struct snd_card *card, const char *id, int type,
        if (jack == NULL)
                return -ENOMEM;
 
-       jack->id = id;
+       jack->id = kstrdup(id, GFP_KERNEL);
 
        jack->input_dev = input_allocate_device();
        if (jack->input_dev == NULL) {
@@ -102,9 +103,15 @@ int snd_jack_new(struct snd_card *card, const char *id, int type,
        if (type & SND_JACK_HEADPHONE)
                input_set_capability(jack->input_dev, EV_SW,
                                     SW_HEADPHONE_INSERT);
+       if (type & SND_JACK_LINEOUT)
+               input_set_capability(jack->input_dev, EV_SW,
+                                    SW_LINEOUT_INSERT);
        if (type & SND_JACK_MICROPHONE)
                input_set_capability(jack->input_dev, EV_SW,
                                     SW_MICROPHONE_INSERT);
+       if (type & SND_JACK_MECHANICAL)
+               input_set_capability(jack->input_dev, EV_SW,
+                                    SW_JACK_PHYSICAL_INSERT);
 
        err = snd_device_new(card, SNDRV_DEV_JACK, jack, &ops);
        if (err < 0)
@@ -153,9 +160,15 @@ void snd_jack_report(struct snd_jack *jack, int status)
        if (jack->type & SND_JACK_HEADPHONE)
                input_report_switch(jack->input_dev, SW_HEADPHONE_INSERT,
                                    status & SND_JACK_HEADPHONE);
+       if (jack->type & SND_JACK_LINEOUT)
+               input_report_switch(jack->input_dev, SW_LINEOUT_INSERT,
+                                   status & SND_JACK_LINEOUT);
        if (jack->type & SND_JACK_MICROPHONE)
                input_report_switch(jack->input_dev, SW_MICROPHONE_INSERT,
                                    status & SND_JACK_MICROPHONE);
+       if (jack->type & SND_JACK_MECHANICAL)
+               input_report_switch(jack->input_dev, SW_JACK_PHYSICAL_INSERT,
+                                   status & SND_JACK_MECHANICAL);
 
        input_sync(jack->input_dev);
 }