mirror of
https://github.com/torvalds/linux.git
synced 2026-05-29 17:43:52 +02:00
drm/sti: hdmi: convert to devm_drm_bridge_alloc() API
devm_drm_bridge_alloc() is the new API to be used for allocating (and partially initializing) a private driver struct embedding a struct drm_bridge. This driver was missed during the automated conversion in commit9c399719cf("drm: convert many bridge drivers from devm_kzalloc() to devm_drm_bridge_alloc() API") and following commits. The lack of conversion for this driver is a bug since commita7748dd127("drm/bridge: get/put the bridge reference in drm_bridge_add/remove()") which is the first commmit having added a drm_bridge_get/put() pair and thus exposing the incorrect initial refcount issue. Fix this by switching the driver to the new API. Reported-by: Marek Szyprowski <m.szyprowski@samsung.com> Closes: https://lore.kernel.org/all/ce9c6aa3-5372-468f-a4bf-5a261259e459@samsung.com/ Fixes:a7748dd127("drm/bridge: get/put the bridge reference in drm_bridge_add/remove()") Reviewed-by: Maxime Ripard <mripard@kernel.org> Link: https://lore.kernel.org/r/20250708-drm-bridge-convert-to-alloc-api-leftovers-v1-1-6285de8c3759@bootlin.com Signed-off-by: Luca Ceresoli <luca.ceresoli@bootlin.com>
This commit is contained in:
parent
03d5236014
commit
ac4531424d
|
|
@ -168,6 +168,11 @@ struct sti_hdmi_connector {
|
|||
#define to_sti_hdmi_connector(x) \
|
||||
container_of(x, struct sti_hdmi_connector, drm_connector)
|
||||
|
||||
static struct sti_hdmi *drm_bridge_to_sti_hdmi(struct drm_bridge *bridge)
|
||||
{
|
||||
return container_of(bridge, struct sti_hdmi, bridge);
|
||||
}
|
||||
|
||||
static const struct drm_prop_enum_list colorspace_mode_names[] = {
|
||||
{ HDMI_COLORSPACE_RGB, "rgb" },
|
||||
{ HDMI_COLORSPACE_YUV422, "yuv422" },
|
||||
|
|
@ -749,7 +754,7 @@ static void hdmi_debugfs_init(struct sti_hdmi *hdmi, struct drm_minor *minor)
|
|||
|
||||
static void sti_hdmi_disable(struct drm_bridge *bridge)
|
||||
{
|
||||
struct sti_hdmi *hdmi = bridge->driver_private;
|
||||
struct sti_hdmi *hdmi = drm_bridge_to_sti_hdmi(bridge);
|
||||
|
||||
u32 val = hdmi_read(hdmi, HDMI_CFG);
|
||||
|
||||
|
|
@ -881,7 +886,7 @@ static int hdmi_audio_configure(struct sti_hdmi *hdmi)
|
|||
|
||||
static void sti_hdmi_pre_enable(struct drm_bridge *bridge)
|
||||
{
|
||||
struct sti_hdmi *hdmi = bridge->driver_private;
|
||||
struct sti_hdmi *hdmi = drm_bridge_to_sti_hdmi(bridge);
|
||||
|
||||
DRM_DEBUG_DRIVER("\n");
|
||||
|
||||
|
|
@ -936,7 +941,7 @@ static void sti_hdmi_set_mode(struct drm_bridge *bridge,
|
|||
const struct drm_display_mode *mode,
|
||||
const struct drm_display_mode *adjusted_mode)
|
||||
{
|
||||
struct sti_hdmi *hdmi = bridge->driver_private;
|
||||
struct sti_hdmi *hdmi = drm_bridge_to_sti_hdmi(bridge);
|
||||
int ret;
|
||||
|
||||
DRM_DEBUG_DRIVER("\n");
|
||||
|
|
@ -1273,7 +1278,6 @@ static int sti_hdmi_bind(struct device *dev, struct device *master, void *data)
|
|||
struct sti_hdmi_connector *connector;
|
||||
struct cec_connector_info conn_info;
|
||||
struct drm_connector *drm_connector;
|
||||
struct drm_bridge *bridge;
|
||||
int err;
|
||||
|
||||
/* Set the drm device handle */
|
||||
|
|
@ -1289,13 +1293,7 @@ static int sti_hdmi_bind(struct device *dev, struct device *master, void *data)
|
|||
|
||||
connector->hdmi = hdmi;
|
||||
|
||||
bridge = devm_kzalloc(dev, sizeof(*bridge), GFP_KERNEL);
|
||||
if (!bridge)
|
||||
return -EINVAL;
|
||||
|
||||
bridge->driver_private = hdmi;
|
||||
bridge->funcs = &sti_hdmi_bridge_funcs;
|
||||
drm_bridge_attach(encoder, bridge, NULL, 0);
|
||||
drm_bridge_attach(encoder, &hdmi->bridge, NULL, 0);
|
||||
|
||||
connector->encoder = encoder;
|
||||
|
||||
|
|
@ -1385,9 +1383,9 @@ static int sti_hdmi_probe(struct platform_device *pdev)
|
|||
|
||||
DRM_INFO("%s\n", __func__);
|
||||
|
||||
hdmi = devm_kzalloc(dev, sizeof(*hdmi), GFP_KERNEL);
|
||||
if (!hdmi)
|
||||
return -ENOMEM;
|
||||
hdmi = devm_drm_bridge_alloc(dev, struct sti_hdmi, bridge, &sti_hdmi_bridge_funcs);
|
||||
if (IS_ERR(hdmi))
|
||||
return PTR_ERR(hdmi);
|
||||
|
||||
ddc = of_parse_phandle(pdev->dev.of_node, "ddc", 0);
|
||||
if (ddc) {
|
||||
|
|
|
|||
|
|
@ -12,6 +12,7 @@
|
|||
|
||||
#include <media/cec-notifier.h>
|
||||
|
||||
#include <drm/drm_bridge.h>
|
||||
#include <drm/drm_modes.h>
|
||||
#include <drm/drm_property.h>
|
||||
|
||||
|
|
@ -86,6 +87,7 @@ struct sti_hdmi {
|
|||
struct hdmi_audio_params audio;
|
||||
struct drm_connector *drm_connector;
|
||||
struct cec_notifier *notifier;
|
||||
struct drm_bridge bridge;
|
||||
};
|
||||
|
||||
u32 hdmi_read(struct sti_hdmi *hdmi, int offset);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user