Commit 53008315 authored by Dave Airlie's avatar Dave Airlie
Browse files

Merge tag 'drm-misc-fixes-2025-12-10' of...

Merge tag 'drm-misc-fixes-2025-12-10' of https://gitlab.freedesktop.org/drm/misc/kernel

 into drm-fixes

drm-misc-fixes for v6.19-rc1:
- Fix stack usage warning in novatek-nt35560.
- Fix s/r, i2c issues in nouveau and update string handling.
- Ignore spurious PLL_UNLOCK bit in ti-sn65dsi83.
- Handle IS_ERR vs NULL in drm_plane_create_hotspot_properties().
- Fix devcoredump crash on reading evicted bo's.
- Fix bigendian handling in mgag200.
- Fix probe failure in tilcdc.

Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
From: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Link: https://patch.msgid.link/6c371dc1-08bf-4a34-895c-9ef348b6061b@linux.intel.com
parents 7d0a66e4 6cb31fba
Loading
Loading
Loading
Loading
+9 −2
Original line number Diff line number Diff line
@@ -429,7 +429,14 @@ static void sn65dsi83_handle_errors(struct sn65dsi83 *ctx)
	 */

	ret = regmap_read(ctx->regmap, REG_IRQ_STAT, &irq_stat);
	if (ret || irq_stat) {

	/*
	 * Some hardware (Toradex Verdin AM62) is known to report the
	 * PLL_UNLOCK error interrupt while working without visible
	 * problems. In lack of a reliable way to discriminate such cases
	 * from user-visible PLL_UNLOCK cases, ignore that bit entirely.
	 */
	if (ret || irq_stat & ~REG_IRQ_STAT_CHA_PLL_UNLOCK) {
		/*
		 * IRQ acknowledged is not always possible (the bridge can be in
		 * a state where it doesn't answer anymore). To prevent an
@@ -654,7 +661,7 @@ static void sn65dsi83_atomic_enable(struct drm_bridge *bridge,
	if (ctx->irq) {
		/* Enable irq to detect errors */
		regmap_write(ctx->regmap, REG_IRQ_GLOBAL, REG_IRQ_GLOBAL_IRQ_EN);
		regmap_write(ctx->regmap, REG_IRQ_EN, 0xff);
		regmap_write(ctx->regmap, REG_IRQ_EN, 0xff & ~REG_IRQ_EN_CHA_PLL_UNLOCK_EN);
	} else {
		/* Use the polling task */
		sn65dsi83_monitor_start(ctx);
+4 −4
Original line number Diff line number Diff line
@@ -338,14 +338,14 @@ static int drm_plane_create_hotspot_properties(struct drm_plane *plane)

	prop_x = drm_property_create_signed_range(plane->dev, 0, "HOTSPOT_X",
						  INT_MIN, INT_MAX);
	if (IS_ERR(prop_x))
		return PTR_ERR(prop_x);
	if (!prop_x)
		return -ENOMEM;

	prop_y = drm_property_create_signed_range(plane->dev, 0, "HOTSPOT_Y",
						  INT_MIN, INT_MAX);
	if (IS_ERR(prop_y)) {
	if (!prop_y) {
		drm_property_destroy(plane->dev, prop_x);
		return PTR_ERR(prop_y);
		return -ENOMEM;
	}

	drm_object_attach_property(&plane->base, prop_x, 0);
+25 −0
Original line number Diff line number Diff line
@@ -161,6 +161,30 @@ static void mgag200_set_startadd(struct mga_device *mdev,
	WREG_ECRT(0x00, crtcext0);
}

/*
 * Set the opmode for the hardware swapper for Big-Endian processor
 * support for the frame buffer aperture and DMAWIN space.
 */
static void mgag200_set_datasiz(struct mga_device *mdev, u32 format)
{
#if defined(__BIG_ENDIAN)
	u32 opmode = RREG32(MGAREG_OPMODE);

	opmode &= ~(GENMASK(17, 16) | GENMASK(9, 8) | GENMASK(3, 2));

	/* Big-endian byte-swapping */
	switch (format) {
	case DRM_FORMAT_RGB565:
		opmode |= 0x10100;
		break;
	case DRM_FORMAT_XRGB8888:
		opmode |= 0x20200;
		break;
	}
	WREG32(MGAREG_OPMODE, opmode);
#endif
}

void mgag200_init_registers(struct mga_device *mdev)
{
	u8 crtc11, misc;
@@ -496,6 +520,7 @@ void mgag200_primary_plane_helper_atomic_update(struct drm_plane *plane,
	struct drm_atomic_helper_damage_iter iter;
	struct drm_rect damage;

	mgag200_set_datasiz(mdev, fb->format->format);
	drm_atomic_helper_damage_iter_init(&iter, old_plane_state, plane_state);
	drm_atomic_for_each_plane_damage(&iter, &damage) {
		mgag200_handle_damage(mdev, shadow_plane_state->data, fb, &damage);
+0 −20
Original line number Diff line number Diff line
@@ -94,26 +94,6 @@ int nouveau_i2c_encoder_init(struct drm_device *dev,
	return err;
}

/**
 * nouveau_i2c_encoder_destroy - Unregister the I2C device backing an encoder
 * @drm_encoder:	Encoder to be unregistered.
 *
 * This should be called from the @destroy method of an I2C slave
 * encoder driver once I2C access is no longer needed.
 */
void nouveau_i2c_encoder_destroy(struct drm_encoder *drm_encoder)
{
	struct nouveau_i2c_encoder *encoder = to_encoder_i2c(drm_encoder);
	struct i2c_client *client = nouveau_i2c_encoder_get_client(drm_encoder);
	struct module *module = client->dev.driver->owner;

	i2c_unregister_device(client);
	encoder->i2c_client = NULL;

	module_put(module);
}
EXPORT_SYMBOL(nouveau_i2c_encoder_destroy);

/*
 * Wrapper fxns which can be plugged in to drm_encoder_helper_funcs:
 */
+18 −1
Original line number Diff line number Diff line
@@ -202,7 +202,24 @@ static inline struct i2c_client *nouveau_i2c_encoder_get_client(struct drm_encod
	return to_encoder_i2c(encoder)->i2c_client;
}

void nouveau_i2c_encoder_destroy(struct drm_encoder *encoder);
/**
 * nouveau_i2c_encoder_destroy - Unregister the I2C device backing an encoder
 * @drm_encoder:        Encoder to be unregistered.
 *
 * This should be called from the @destroy method of an I2C slave
 * encoder driver once I2C access is no longer needed.
 */
static __always_inline void nouveau_i2c_encoder_destroy(struct drm_encoder *drm_encoder)
{
	struct nouveau_i2c_encoder *encoder = to_encoder_i2c(drm_encoder);
	struct i2c_client *client = nouveau_i2c_encoder_get_client(drm_encoder);
	struct module *module = client->dev.driver->owner;

	i2c_unregister_device(client);
	encoder->i2c_client = NULL;

	module_put(module);
}

/*
 * Wrapper fxns which can be plugged in to drm_encoder_helper_funcs:
Loading