Skip to content

Commit

Permalink
ALSA: cs5535audio: free OLPC quirks from reliance on MGEODE_LX cpu op…
Browse files Browse the repository at this point in the history
…timization

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 <[email protected]>
Cc: Takashi Iwai <[email protected]>
Cc: Jordan Crouse <[email protected]>
Cc: David Brownell <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
Andres Salomon authored and torvalds committed Dec 15, 2009
1 parent 1ea3fa7 commit 3c55494
Show file tree
Hide file tree
Showing 6 changed files with 25 additions and 11 deletions.
1 change: 1 addition & 0 deletions arch/x86/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -2024,6 +2024,7 @@ config GEODE_MFGPT_TIMER

config OLPC
bool "One Laptop Per Child support"
select GPIOLIB
default n
---help---
Add support for detecting the unique features of the OLPC
Expand Down
2 changes: 1 addition & 1 deletion arch/x86/include/asm/olpc.h
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,7 @@ extern int olpc_ec_mask_unset(uint8_t bits);

/* 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_THRM_ALRM geode_gpio(10)
#define OLPC_GPIO_SMB_CLK geode_gpio(14)
Expand Down
2 changes: 0 additions & 2 deletions sound/pci/cs5535audio/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,7 @@

snd-cs5535audio-y := cs5535audio.o cs5535audio_pcm.o
snd-cs5535audio-$(CONFIG_PM) += cs5535audio_pm.o
ifdef CONFIG_MGEODE_LX
snd-cs5535audio-$(CONFIG_OLPC) += cs5535audio_olpc.o
endif

# Toplevel Module Dependency
obj-$(CONFIG_SND_CS5535AUDIO) += snd-cs5535audio.o
1 change: 1 addition & 0 deletions sound/pci/cs5535audio/cs5535audio.c
Original file line number Diff line number Diff line change
Expand Up @@ -389,6 +389,7 @@ static int __devinit snd_cs5535audio_probe(struct pci_dev *pci,

static void __devexit snd_cs5535audio_remove(struct pci_dev *pci)
{
olpc_quirks_cleanup();
snd_card_free(pci_get_drvdata(pci));
pci_set_drvdata(pci, NULL);
}
Expand Down
4 changes: 3 additions & 1 deletion sound/pci/cs5535audio/cs5535audio.h
Original file line number Diff line number Diff line change
Expand Up @@ -99,10 +99,11 @@ int snd_cs5535audio_suspend(struct pci_dev *pci, pm_message_t state);
int snd_cs5535audio_resume(struct pci_dev *pci);
#endif

#if defined(CONFIG_OLPC) && defined(CONFIG_MGEODE_LX)
#ifdef CONFIG_OLPC
void __devinit olpc_prequirks(struct snd_card *card,
struct snd_ac97_template *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_mic_bias(struct snd_ac97 *ac97, int on);

Expand All @@ -128,6 +129,7 @@ static inline int olpc_quirks(struct snd_card *card, struct snd_ac97 *ac97)
{
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_mic_bias(struct snd_ac97 *ac97, int on) { }
static inline void olpc_capture_open(struct snd_ac97 *ac97) { }
Expand Down
26 changes: 19 additions & 7 deletions sound/pci/cs5535audio/cs5535audio_olpc.c
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,13 @@
#include <sound/info.h>
#include <sound/control.h>
#include <sound/ac97_codec.h>
#include <linux/gpio.h>

#include <asm/olpc.h>
#include "cs5535audio.h"

#define DRV_NAME "cs5535audio-olpc"

/*
* 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
Expand All @@ -38,10 +41,7 @@ void olpc_analog_input(struct snd_ac97 *ac97, int on)
}

/* set Analog Input through GPIO */
if (on)
geode_gpio_set(OLPC_GPIO_MIC_AC, GPIO_OUTPUT_VAL);
else
geode_gpio_clear(OLPC_GPIO_MIC_AC, GPIO_OUTPUT_VAL);
gpio_set_value(OLPC_GPIO_MIC_AC, on);
}

/*
Expand Down Expand Up @@ -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)
{
v->value.integer.value[0] = geode_gpio_isset(OLPC_GPIO_MIC_AC,
GPIO_OUTPUT_VAL);
v->value.integer.value[0] = gpio_get_value(OLPC_GPIO_MIC_AC);
return 0;
}

Expand Down Expand Up @@ -153,6 +152,12 @@ int __devinit olpc_quirks(struct snd_card *card, struct snd_ac97 *ac97)
if (!machine_is_olpc())
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 */
memset(&elem, 0, sizeof(elem));
elem.iface = SNDRV_CTL_ELEM_IFACE_MIXER;
Expand All @@ -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++) {
err = snd_ctl_add(card, snd_ctl_new1(&olpc_cs5535audio_ctls[i],
ac97->private_data));
if (err < 0)
if (err < 0) {
gpio_free(OLPC_GPIO_MIC_AC);
return err;
}
}

/* turn off the mic by default */
olpc_mic_bias(ac97, 0);
return 0;
}

void __devexit olpc_quirks_cleanup(void)
{
gpio_free(OLPC_GPIO_MIC_AC);
}

0 comments on commit 3c55494

Please sign in to comment.