Merge tag 'drm-misc-fixes-2025-01-02' of https://gitlab.freedesktop.org/drm/misc/kernel into drm-fixes

drm-misc-fixes for v6.13-rc6:
- Only fixes for adv7511 driver, including a use-after-free.

Signed-off-by: Dave Airlie <airlied@redhat.com>
From: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/f58429b7-5f11-4b78-b577-de32b41299ea@linux.intel.com
This commit is contained in:
Dave Airlie 2025-01-03 10:43:36 +10:00
commit 198c653edf
4 changed files with 22 additions and 8 deletions

View File

@ -90,7 +90,7 @@ properties:
adi,dsi-lanes: adi,dsi-lanes:
description: Number of DSI data lanes connected to the DSI host. description: Number of DSI data lanes connected to the DSI host.
$ref: /schemas/types.yaml#/definitions/uint32 $ref: /schemas/types.yaml#/definitions/uint32
enum: [ 1, 2, 3, 4 ] enum: [ 2, 3, 4 ]
"#sound-dai-cells": "#sound-dai-cells":
const: 0 const: 0

View File

@ -153,7 +153,16 @@ static int adv7511_hdmi_hw_params(struct device *dev, void *data,
ADV7511_AUDIO_CFG3_LEN_MASK, len); ADV7511_AUDIO_CFG3_LEN_MASK, len);
regmap_update_bits(adv7511->regmap, ADV7511_REG_I2C_FREQ_ID_CFG, regmap_update_bits(adv7511->regmap, ADV7511_REG_I2C_FREQ_ID_CFG,
ADV7511_I2C_FREQ_ID_CFG_RATE_MASK, rate << 4); ADV7511_I2C_FREQ_ID_CFG_RATE_MASK, rate << 4);
regmap_write(adv7511->regmap, 0x73, 0x1);
/* send current Audio infoframe values while updating */
regmap_update_bits(adv7511->regmap, ADV7511_REG_INFOFRAME_UPDATE,
BIT(5), BIT(5));
regmap_write(adv7511->regmap, ADV7511_REG_AUDIO_INFOFRAME(0), 0x1);
/* use Audio infoframe updated info */
regmap_update_bits(adv7511->regmap, ADV7511_REG_INFOFRAME_UPDATE,
BIT(5), 0);
return 0; return 0;
} }
@ -184,8 +193,9 @@ static int audio_startup(struct device *dev, void *data)
regmap_update_bits(adv7511->regmap, ADV7511_REG_GC(0), regmap_update_bits(adv7511->regmap, ADV7511_REG_GC(0),
BIT(7) | BIT(6), BIT(7)); BIT(7) | BIT(6), BIT(7));
/* use Audio infoframe updated info */ /* use Audio infoframe updated info */
regmap_update_bits(adv7511->regmap, ADV7511_REG_GC(1), regmap_update_bits(adv7511->regmap, ADV7511_REG_INFOFRAME_UPDATE,
BIT(5), 0); BIT(5), 0);
/* enable SPDIF receiver */ /* enable SPDIF receiver */
if (adv7511->audio_source == ADV7511_AUDIO_SOURCE_SPDIF) if (adv7511->audio_source == ADV7511_AUDIO_SOURCE_SPDIF)
regmap_update_bits(adv7511->regmap, ADV7511_REG_AUDIO_CONFIG, regmap_update_bits(adv7511->regmap, ADV7511_REG_AUDIO_CONFIG,

View File

@ -1241,8 +1241,10 @@ static int adv7511_probe(struct i2c_client *i2c)
return ret; return ret;
ret = adv7511_init_regulators(adv7511); ret = adv7511_init_regulators(adv7511);
if (ret) if (ret) {
return dev_err_probe(dev, ret, "failed to init regulators\n"); dev_err_probe(dev, ret, "failed to init regulators\n");
goto err_of_node_put;
}
/* /*
* The power down GPIO is optional. If present, toggle it from active to * The power down GPIO is optional. If present, toggle it from active to
@ -1363,6 +1365,8 @@ err_i2c_unregister_edid:
i2c_unregister_device(adv7511->i2c_edid); i2c_unregister_device(adv7511->i2c_edid);
uninit_regulators: uninit_regulators:
adv7511_uninit_regulators(adv7511); adv7511_uninit_regulators(adv7511);
err_of_node_put:
of_node_put(adv7511->host_node);
return ret; return ret;
} }
@ -1371,6 +1375,8 @@ static void adv7511_remove(struct i2c_client *i2c)
{ {
struct adv7511 *adv7511 = i2c_get_clientdata(i2c); struct adv7511 *adv7511 = i2c_get_clientdata(i2c);
of_node_put(adv7511->host_node);
adv7511_uninit_regulators(adv7511); adv7511_uninit_regulators(adv7511);
drm_bridge_remove(&adv7511->bridge); drm_bridge_remove(&adv7511->bridge);

View File

@ -172,7 +172,7 @@ int adv7533_parse_dt(struct device_node *np, struct adv7511 *adv)
of_property_read_u32(np, "adi,dsi-lanes", &num_lanes); of_property_read_u32(np, "adi,dsi-lanes", &num_lanes);
if (num_lanes < 1 || num_lanes > 4) if (num_lanes < 2 || num_lanes > 4)
return -EINVAL; return -EINVAL;
adv->num_dsi_lanes = num_lanes; adv->num_dsi_lanes = num_lanes;
@ -181,8 +181,6 @@ int adv7533_parse_dt(struct device_node *np, struct adv7511 *adv)
if (!adv->host_node) if (!adv->host_node)
return -ENODEV; return -ENODEV;
of_node_put(adv->host_node);
adv->use_timing_gen = !of_property_read_bool(np, adv->use_timing_gen = !of_property_read_bool(np,
"adi,disable-timing-generator"); "adi,disable-timing-generator");