Commit 399984fe authored by Andres Salomon's avatar Andres Salomon Committed by james toy

Previously, OLPC support for the mic extensions was only enabled in the

ALSA driver if CONFIG_OLPC and CONFIG_MGEODE_LX were both set.  This was
because the old geode GPIO code was written in a manner that assumed
CONFIG_MGEODE_LX.  With the new cs553x-gpio driver, this is no longer the
case; as such, we can drop the requirement on CONFIG_MGEODE_LX and instead
include a requirement on GPIOLIB.

We use the generic GPIO API rather than the cs553x-specific API.
Signed-off-by: default avatarAndres Salomon <dilinger@collabora.co.uk>
Cc: Takashi Iwai <tiwai@suse.de>
Cc: Jordan Crouse <jordan@cosmicpenguin.net>
Cc: David Brownell <david-b@pacbell.net>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
parent fcc2daee
...@@ -2028,6 +2028,7 @@ config GEODE_MFGPT_TIMER ...@@ -2028,6 +2028,7 @@ config GEODE_MFGPT_TIMER
config OLPC config OLPC
bool "One Laptop Per Child support" bool "One Laptop Per Child support"
select GPIOLIB
default n default n
---help--- ---help---
Add support for detecting the unique features of the OLPC Add support for detecting the unique features of the OLPC
......
...@@ -120,7 +120,7 @@ extern int olpc_ec_mask_unset(uint8_t bits); ...@@ -120,7 +120,7 @@ extern int olpc_ec_mask_unset(uint8_t bits);
/* GPIO assignments */ /* GPIO assignments */
#define OLPC_GPIO_MIC_AC geode_gpio(1) #define OLPC_GPIO_MIC_AC 1
#define OLPC_GPIO_DCON_IRQ geode_gpio(7) #define OLPC_GPIO_DCON_IRQ geode_gpio(7)
#define OLPC_GPIO_THRM_ALRM geode_gpio(10) #define OLPC_GPIO_THRM_ALRM geode_gpio(10)
#define OLPC_GPIO_SMB_CLK geode_gpio(14) #define OLPC_GPIO_SMB_CLK geode_gpio(14)
......
...@@ -4,9 +4,7 @@ ...@@ -4,9 +4,7 @@
snd-cs5535audio-y := cs5535audio.o cs5535audio_pcm.o snd-cs5535audio-y := cs5535audio.o cs5535audio_pcm.o
snd-cs5535audio-$(CONFIG_PM) += cs5535audio_pm.o snd-cs5535audio-$(CONFIG_PM) += cs5535audio_pm.o
ifdef CONFIG_MGEODE_LX
snd-cs5535audio-$(CONFIG_OLPC) += cs5535audio_olpc.o snd-cs5535audio-$(CONFIG_OLPC) += cs5535audio_olpc.o
endif
# Toplevel Module Dependency # Toplevel Module Dependency
obj-$(CONFIG_SND_CS5535AUDIO) += snd-cs5535audio.o obj-$(CONFIG_SND_CS5535AUDIO) += snd-cs5535audio.o
...@@ -389,6 +389,7 @@ probefail_out: ...@@ -389,6 +389,7 @@ probefail_out:
static void __devexit snd_cs5535audio_remove(struct pci_dev *pci) static void __devexit snd_cs5535audio_remove(struct pci_dev *pci)
{ {
olpc_quirks_cleanup();
snd_card_free(pci_get_drvdata(pci)); snd_card_free(pci_get_drvdata(pci));
pci_set_drvdata(pci, NULL); pci_set_drvdata(pci, NULL);
} }
......
...@@ -99,10 +99,11 @@ int snd_cs5535audio_suspend(struct pci_dev *pci, pm_message_t state); ...@@ -99,10 +99,11 @@ int snd_cs5535audio_suspend(struct pci_dev *pci, pm_message_t state);
int snd_cs5535audio_resume(struct pci_dev *pci); int snd_cs5535audio_resume(struct pci_dev *pci);
#endif #endif
#if defined(CONFIG_OLPC) && defined(CONFIG_MGEODE_LX) #ifdef CONFIG_OLPC
void __devinit olpc_prequirks(struct snd_card *card, void __devinit olpc_prequirks(struct snd_card *card,
struct snd_ac97_template *ac97); struct snd_ac97_template *ac97);
int __devinit olpc_quirks(struct snd_card *card, struct snd_ac97 *ac97); int __devinit olpc_quirks(struct snd_card *card, struct snd_ac97 *ac97);
void __devexit olpc_quirks_cleanup(void);
void olpc_analog_input(struct snd_ac97 *ac97, int on); void olpc_analog_input(struct snd_ac97 *ac97, int on);
void olpc_mic_bias(struct snd_ac97 *ac97, int on); void olpc_mic_bias(struct snd_ac97 *ac97, int on);
...@@ -128,6 +129,7 @@ static inline int olpc_quirks(struct snd_card *card, struct snd_ac97 *ac97) ...@@ -128,6 +129,7 @@ static inline int olpc_quirks(struct snd_card *card, struct snd_ac97 *ac97)
{ {
return 0; return 0;
} }
static inline void olpc_quirks_cleanup(void) { }
static inline void olpc_analog_input(struct snd_ac97 *ac97, int on) { } static inline void olpc_analog_input(struct snd_ac97 *ac97, int on) { }
static inline void olpc_mic_bias(struct snd_ac97 *ac97, int on) { } static inline void olpc_mic_bias(struct snd_ac97 *ac97, int on) { }
static inline void olpc_capture_open(struct snd_ac97 *ac97) { } static inline void olpc_capture_open(struct snd_ac97 *ac97) { }
......
...@@ -13,10 +13,13 @@ ...@@ -13,10 +13,13 @@
#include <sound/info.h> #include <sound/info.h>
#include <sound/control.h> #include <sound/control.h>
#include <sound/ac97_codec.h> #include <sound/ac97_codec.h>
#include <linux/gpio.h>
#include <asm/olpc.h> #include <asm/olpc.h>
#include "cs5535audio.h" #include "cs5535audio.h"
#define DRV_NAME "cs5535audio-olpc"
/* /*
* OLPC has an additional feature on top of the regular AD1888 codec features. * OLPC has an additional feature on top of the regular AD1888 codec features.
* It has an Analog Input mode that is switched into (after disabling the * It has an Analog Input mode that is switched into (after disabling the
...@@ -38,10 +41,7 @@ void olpc_analog_input(struct snd_ac97 *ac97, int on) ...@@ -38,10 +41,7 @@ void olpc_analog_input(struct snd_ac97 *ac97, int on)
} }
/* set Analog Input through GPIO */ /* set Analog Input through GPIO */
if (on) gpio_set_value(OLPC_GPIO_MIC_AC, on);
geode_gpio_set(OLPC_GPIO_MIC_AC, GPIO_OUTPUT_VAL);
else
geode_gpio_clear(OLPC_GPIO_MIC_AC, GPIO_OUTPUT_VAL);
} }
/* /*
...@@ -73,8 +73,7 @@ static int olpc_dc_info(struct snd_kcontrol *kctl, ...@@ -73,8 +73,7 @@ static int olpc_dc_info(struct snd_kcontrol *kctl,
static int olpc_dc_get(struct snd_kcontrol *kctl, struct snd_ctl_elem_value *v) static int olpc_dc_get(struct snd_kcontrol *kctl, struct snd_ctl_elem_value *v)
{ {
v->value.integer.value[0] = geode_gpio_isset(OLPC_GPIO_MIC_AC, v->value.integer.value[0] = gpio_get_value(OLPC_GPIO_MIC_AC);
GPIO_OUTPUT_VAL);
return 0; return 0;
} }
...@@ -153,6 +152,12 @@ int __devinit olpc_quirks(struct snd_card *card, struct snd_ac97 *ac97) ...@@ -153,6 +152,12 @@ int __devinit olpc_quirks(struct snd_card *card, struct snd_ac97 *ac97)
if (!machine_is_olpc()) if (!machine_is_olpc())
return 0; return 0;
if (gpio_request(OLPC_GPIO_MIC_AC, DRV_NAME)) {
printk(KERN_ERR DRV_NAME ": unable to allocate MIC GPIO\n");
return -EIO;
}
gpio_direction_output(OLPC_GPIO_MIC_AC, 0);
/* drop the original AD1888 HPF control */ /* drop the original AD1888 HPF control */
memset(&elem, 0, sizeof(elem)); memset(&elem, 0, sizeof(elem));
elem.iface = SNDRV_CTL_ELEM_IFACE_MIXER; elem.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
...@@ -169,11 +174,18 @@ int __devinit olpc_quirks(struct snd_card *card, struct snd_ac97 *ac97) ...@@ -169,11 +174,18 @@ int __devinit olpc_quirks(struct snd_card *card, struct snd_ac97 *ac97)
for (i = 0; i < ARRAY_SIZE(olpc_cs5535audio_ctls); i++) { for (i = 0; i < ARRAY_SIZE(olpc_cs5535audio_ctls); i++) {
err = snd_ctl_add(card, snd_ctl_new1(&olpc_cs5535audio_ctls[i], err = snd_ctl_add(card, snd_ctl_new1(&olpc_cs5535audio_ctls[i],
ac97->private_data)); ac97->private_data));
if (err < 0) if (err < 0) {
gpio_free(OLPC_GPIO_MIC_AC);
return err; return err;
}
} }
/* turn off the mic by default */ /* turn off the mic by default */
olpc_mic_bias(ac97, 0); olpc_mic_bias(ac97, 0);
return 0; return 0;
} }
void __devexit olpc_quirks_cleanup(void)
{
gpio_free(OLPC_GPIO_MIC_AC);
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment