mirror of
https://github.com/adulau/aha.git
synced 2024-12-28 03:36:19 +00:00
ALSA: cs5535audio: free OLPC quirks from reliance on MGEODE_LX cpu optimization
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: Andres 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: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
1ea3fa7bbf
commit
3c55494670
6 changed files with 25 additions and 11 deletions
|
@ -2024,6 +2024,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);
|
||||||
|
|
||||||
/* 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 @@
|
||||||
|
|
||||||
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:
|
||||||
|
|
||||||
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);
|
||||||
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)
|
||||||
{
|
{
|
||||||
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 @@
|
||||||
#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)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 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,
|
||||||
|
|
||||||
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)
|
||||||
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)
|
||||||
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);
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue