Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1a5ba2e9 authored by Rafael Avila de Espindola's avatar Rafael Avila de Espindola Committed by Takashi Iwai
Browse files

ALSA: hda - Add support for the new 27 inch IMacs



With the attached patch I am able to use the sound on a new IMac 27.
What works:

*) Internal speakers
*) Internal microphone
*) Headphone

I don't have an external mic or a SPDIF device to test the rest.

Signed-off-by: default avatarRafael Avila de Espindola <rafael.espindola@gmail.com>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent d8d881dd
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -403,4 +403,5 @@ STAC9872
Cirrus Logic CS4206/4207
Cirrus Logic CS4206/4207
========================
========================
  mbp55		MacBook Pro 5,5
  mbp55		MacBook Pro 5,5
  imac27	IMac 27 Inch
  auto		BIOS setup (default)
  auto		BIOS setup (default)
+21 −1
Original line number Original line Diff line number Diff line
@@ -66,6 +66,7 @@ struct cs_spec {
/* available models */
/* available models */
enum {
enum {
	CS420X_MBP55,
	CS420X_MBP55,
	CS420X_IMAC27,
	CS420X_AUTO,
	CS420X_AUTO,
	CS420X_MODELS
	CS420X_MODELS
};
};
@@ -827,7 +828,8 @@ static void cs_automute(struct hda_codec *codec)
				    AC_VERB_SET_PIN_WIDGET_CONTROL,
				    AC_VERB_SET_PIN_WIDGET_CONTROL,
				    hp_present ? 0 : PIN_OUT);
				    hp_present ? 0 : PIN_OUT);
	}
	}
	if (spec->board_config == CS420X_MBP55) {
	if (spec->board_config == CS420X_MBP55 ||
	    spec->board_config == CS420X_IMAC27) {
		unsigned int gpio = hp_present ? 0x02 : 0x08;
		unsigned int gpio = hp_present ? 0x02 : 0x08;
		snd_hda_codec_write(codec, 0x01, 0,
		snd_hda_codec_write(codec, 0x01, 0,
				    AC_VERB_SET_GPIO_DATA, gpio);
				    AC_VERB_SET_GPIO_DATA, gpio);
@@ -1069,12 +1071,14 @@ static int cs_parse_auto_config(struct hda_codec *codec)


static const char *cs420x_models[CS420X_MODELS] = {
static const char *cs420x_models[CS420X_MODELS] = {
	[CS420X_MBP55] = "mbp55",
	[CS420X_MBP55] = "mbp55",
	[CS420X_IMAC27] = "imac27",
	[CS420X_AUTO] = "auto",
	[CS420X_AUTO] = "auto",
};
};




static struct snd_pci_quirk cs420x_cfg_tbl[] = {
static struct snd_pci_quirk cs420x_cfg_tbl[] = {
	SND_PCI_QUIRK(0x10de, 0xcb79, "MacBookPro 5,5", CS420X_MBP55),
	SND_PCI_QUIRK(0x10de, 0xcb79, "MacBookPro 5,5", CS420X_MBP55),
	SND_PCI_QUIRK(0x8086, 0x7270, "IMac 27 Inch", CS420X_IMAC27),
	{} /* terminator */
	{} /* terminator */
};
};


@@ -1097,8 +1101,23 @@ static struct cs_pincfg mbp55_pincfgs[] = {
	{} /* terminator */
	{} /* terminator */
};
};


static struct cs_pincfg imac27_pincfgs[] = {
	{ 0x09, 0x012b4050 },
	{ 0x0a, 0x90100140 },
	{ 0x0b, 0x90100142 },
	{ 0x0c, 0x018b3020 },
	{ 0x0d, 0x90a00110 },
	{ 0x0e, 0x400000f0 },
	{ 0x0f, 0x01cbe030 },
	{ 0x10, 0x014be060 },
	{ 0x12, 0x01ab9070 },
	{ 0x15, 0x400000f0 },
	{} /* terminator */
};

static struct cs_pincfg *cs_pincfgs[CS420X_MODELS] = {
static struct cs_pincfg *cs_pincfgs[CS420X_MODELS] = {
	[CS420X_MBP55] = mbp55_pincfgs,
	[CS420X_MBP55] = mbp55_pincfgs,
	[CS420X_IMAC27] = imac27_pincfgs,
};
};


static void fix_pincfg(struct hda_codec *codec, int model)
static void fix_pincfg(struct hda_codec *codec, int model)
@@ -1128,6 +1147,7 @@ static int patch_cs420x(struct hda_codec *codec)
		fix_pincfg(codec, spec->board_config);
		fix_pincfg(codec, spec->board_config);


	switch (spec->board_config) {
	switch (spec->board_config) {
	case CS420X_IMAC27:
	case CS420X_MBP55:
	case CS420X_MBP55:
		/* GPIO1 = headphones */
		/* GPIO1 = headphones */
		/* GPIO3 = speakers */
		/* GPIO3 = speakers */