Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 176349
b: refs/heads/master
c: 3c55494
h: refs/heads/master
i:
  176347: e9124f2
v: v3
  • Loading branch information
Andres Salomon authored and Linus Torvalds committed Dec 15, 2009
1 parent 9a82c6c commit 53949cc
Show file tree
Hide file tree
Showing 7 changed files with 26 additions and 12 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 1ea3fa7bbfbe81cfbdcc35748a57c35f9b32c5d6
refs/heads/master: 3c55494670745e523f69b56edb66ca0b50a470c2
1 change: 1 addition & 0 deletions trunk/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 trunk/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 trunk/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 trunk/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 trunk/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 trunk/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 53949cc

Please sign in to comment.