Merge branch 'for-linus' into for-next
Signed-off-by: Takashi Iwai <tiwai@suse.de>pull/476/head
commit
891667cefd
|
|
@ -3190,6 +3190,9 @@ static void alc287_fixup_yoga9_14iap7_bass_spk_pin(struct hda_codec *codec,
|
|||
};
|
||||
struct alc_spec *spec = codec->spec;
|
||||
|
||||
/* Support Audio mute LED and Mic mute LED on keyboard */
|
||||
hda_fixup_ideapad_acpi(codec, fix, action);
|
||||
|
||||
switch (action) {
|
||||
case HDA_FIXUP_ACT_PRE_PROBE:
|
||||
snd_hda_apply_pincfgs(codec, pincfgs);
|
||||
|
|
|
|||
|
|
@ -872,6 +872,52 @@ static int cs35l56_hda_system_resume(struct device *dev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int cs35l56_hda_fixup_yoga9(struct cs35l56_hda *cs35l56, int *bus_addr)
|
||||
{
|
||||
/* The cirrus,dev-index property has the wrong values */
|
||||
switch (*bus_addr) {
|
||||
case 0x30:
|
||||
cs35l56->index = 1;
|
||||
return 0;
|
||||
case 0x31:
|
||||
cs35l56->index = 0;
|
||||
return 0;
|
||||
default:
|
||||
/* There is a pseudo-address for broadcast to both amps - ignore it */
|
||||
dev_dbg(cs35l56->base.dev, "Ignoring I2C address %#x\n", *bus_addr);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
static const struct {
|
||||
const char *sub;
|
||||
int (*fixup_fn)(struct cs35l56_hda *cs35l56, int *bus_addr);
|
||||
} cs35l56_hda_fixups[] = {
|
||||
{
|
||||
.sub = "17AA390B", /* Lenovo Yoga Book 9i GenX */
|
||||
.fixup_fn = cs35l56_hda_fixup_yoga9,
|
||||
},
|
||||
};
|
||||
|
||||
static int cs35l56_hda_apply_platform_fixups(struct cs35l56_hda *cs35l56, const char *sub,
|
||||
int *bus_addr)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (IS_ERR(sub))
|
||||
return 0;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(cs35l56_hda_fixups); i++) {
|
||||
if (strcasecmp(cs35l56_hda_fixups[i].sub, sub) == 0) {
|
||||
dev_dbg(cs35l56->base.dev, "Applying fixup for %s\n",
|
||||
cs35l56_hda_fixups[i].sub);
|
||||
return (cs35l56_hda_fixups[i].fixup_fn)(cs35l56, bus_addr);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cs35l56_hda_read_acpi(struct cs35l56_hda *cs35l56, int hid, int id)
|
||||
{
|
||||
u32 values[HDA_MAX_COMPONENTS];
|
||||
|
|
@ -896,39 +942,47 @@ static int cs35l56_hda_read_acpi(struct cs35l56_hda *cs35l56, int hid, int id)
|
|||
ACPI_COMPANION_SET(cs35l56->base.dev, adev);
|
||||
}
|
||||
|
||||
property = "cirrus,dev-index";
|
||||
ret = device_property_count_u32(cs35l56->base.dev, property);
|
||||
if (ret <= 0)
|
||||
goto err;
|
||||
|
||||
if (ret > ARRAY_SIZE(values)) {
|
||||
ret = -EINVAL;
|
||||
goto err;
|
||||
}
|
||||
nval = ret;
|
||||
|
||||
ret = device_property_read_u32_array(cs35l56->base.dev, property, values, nval);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
/* Initialize things that could be overwritten by a fixup */
|
||||
cs35l56->index = -1;
|
||||
for (i = 0; i < nval; i++) {
|
||||
if (values[i] == id) {
|
||||
cs35l56->index = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
/*
|
||||
* It's not an error for the ID to be missing: for I2C there can be
|
||||
* an alias address that is not a real device. So reject silently.
|
||||
*/
|
||||
if (cs35l56->index == -1) {
|
||||
dev_dbg(cs35l56->base.dev, "No index found in %s\n", property);
|
||||
ret = -ENODEV;
|
||||
goto err;
|
||||
}
|
||||
|
||||
sub = acpi_get_subsystem_id(ACPI_HANDLE(cs35l56->base.dev));
|
||||
ret = cs35l56_hda_apply_platform_fixups(cs35l56, sub, &id);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (cs35l56->index == -1) {
|
||||
property = "cirrus,dev-index";
|
||||
ret = device_property_count_u32(cs35l56->base.dev, property);
|
||||
if (ret <= 0)
|
||||
goto err;
|
||||
|
||||
if (ret > ARRAY_SIZE(values)) {
|
||||
ret = -EINVAL;
|
||||
goto err;
|
||||
}
|
||||
nval = ret;
|
||||
|
||||
ret = device_property_read_u32_array(cs35l56->base.dev, property, values, nval);
|
||||
if (ret)
|
||||
goto err;
|
||||
|
||||
for (i = 0; i < nval; i++) {
|
||||
if (values[i] == id) {
|
||||
cs35l56->index = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* It's not an error for the ID to be missing: for I2C there can be
|
||||
* an alias address that is not a real device. So reject silently.
|
||||
*/
|
||||
if (cs35l56->index == -1) {
|
||||
dev_dbg(cs35l56->base.dev, "No index found in %s\n", property);
|
||||
ret = -ENODEV;
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
|
||||
if (IS_ERR(sub)) {
|
||||
dev_info(cs35l56->base.dev,
|
||||
|
|
|
|||
Loading…
Reference in New Issue