Commit c4fc118a authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'drm-fixes-2022-03-04' of git://anongit.freedesktop.org/drm/drm

Pull drm fixes from Dave Airlie:
 "Things are quieting down as expected, just a small set of fixes, i915,
  exynos, amdgpu, vrr, bridge and hdlcd. Nothing scary at all.

  i915:
   - Fix GuC SLPC unset command
   - Fix misidentification of some Apple MacBook Pro laptops as Jasper Lake

  amdgpu:
   - Suspend regression fix

  exynos:
   - irq handling fixes
   - Fix two regressions to TE-gpio handling

  arm/hdlcd:
   - Select DRM_GEM_CMEA_HELPER for HDLCD

  bridge:
   - ti-sn65dsi86: Properly undo autosuspend

  vrr:
   - Fix potential NULL-pointer deref"

* tag 'drm-fixes-2022-03-04' of git://anongit.freedesktop.org/drm/drm:
  drm/amdgpu: fix suspend/resume hang regression
  drm/vrr: Set VRR capable prop only if it is attached to connector
  drm/arm: arm hdlcd select DRM_GEM_CMA_HELPER
  drm/bridge: ti-sn65dsi86: Properly undo autosuspend
  drm/i915: s/JSP2/ICP2/ PCH
  drm/i915/guc/slpc: Correct the param count for unset param
  drm/exynos: Search for TE-gpio in DSI panel's node
  drm/exynos: Don't fail if no TE-gpio is defined for DSI driver
  drm/exynos: gsc: Use platform_get_irq() to get the interrupt
  drm/exynos/fimc: Use platform_get_irq() to get the interrupt
  drm/exynos/exynos_drm_fimd: Use platform_get_irq_byname() to get the interrupt
  drm/exynos: mixer: Use platform_get_irq() to get the interrupt
  drm/exynos/exynos7_drm_decon: Use platform_get_irq_byname() to get the interrupt
parents 0b7344a6 8fdb1967
...@@ -777,7 +777,8 @@ bool amdgpu_vm_ready(struct amdgpu_vm *vm) ...@@ -777,7 +777,8 @@ bool amdgpu_vm_ready(struct amdgpu_vm *vm)
amdgpu_vm_eviction_lock(vm); amdgpu_vm_eviction_lock(vm);
ret = !vm->evicting; ret = !vm->evicting;
amdgpu_vm_eviction_unlock(vm); amdgpu_vm_eviction_unlock(vm);
return ret;
return ret && list_empty(&vm->evicted);
} }
/** /**
......
...@@ -6,6 +6,7 @@ config DRM_HDLCD ...@@ -6,6 +6,7 @@ config DRM_HDLCD
depends on DRM && OF && (ARM || ARM64 || COMPILE_TEST) depends on DRM && OF && (ARM || ARM64 || COMPILE_TEST)
depends on COMMON_CLK depends on COMMON_CLK
select DRM_KMS_HELPER select DRM_KMS_HELPER
select DRM_GEM_CMA_HELPER
help help
Choose this option if you have an ARM High Definition Colour LCD Choose this option if you have an ARM High Definition Colour LCD
controller. controller.
......
...@@ -1802,6 +1802,7 @@ static inline void ti_sn_gpio_unregister(void) {} ...@@ -1802,6 +1802,7 @@ static inline void ti_sn_gpio_unregister(void) {}
static void ti_sn65dsi86_runtime_disable(void *data) static void ti_sn65dsi86_runtime_disable(void *data)
{ {
pm_runtime_dont_use_autosuspend(data);
pm_runtime_disable(data); pm_runtime_disable(data);
} }
...@@ -1861,11 +1862,11 @@ static int ti_sn65dsi86_probe(struct i2c_client *client, ...@@ -1861,11 +1862,11 @@ static int ti_sn65dsi86_probe(struct i2c_client *client,
"failed to get reference clock\n"); "failed to get reference clock\n");
pm_runtime_enable(dev); pm_runtime_enable(dev);
pm_runtime_set_autosuspend_delay(pdata->dev, 500);
pm_runtime_use_autosuspend(pdata->dev);
ret = devm_add_action_or_reset(dev, ti_sn65dsi86_runtime_disable, dev); ret = devm_add_action_or_reset(dev, ti_sn65dsi86_runtime_disable, dev);
if (ret) if (ret)
return ret; return ret;
pm_runtime_set_autosuspend_delay(pdata->dev, 500);
pm_runtime_use_autosuspend(pdata->dev);
ti_sn65dsi86_debugfs_init(pdata); ti_sn65dsi86_debugfs_init(pdata);
......
...@@ -2330,6 +2330,9 @@ EXPORT_SYMBOL(drm_connector_atomic_hdr_metadata_equal); ...@@ -2330,6 +2330,9 @@ EXPORT_SYMBOL(drm_connector_atomic_hdr_metadata_equal);
void drm_connector_set_vrr_capable_property( void drm_connector_set_vrr_capable_property(
struct drm_connector *connector, bool capable) struct drm_connector *connector, bool capable)
{ {
if (!connector->vrr_capable_property)
return;
drm_object_property_set_value(&connector->base, drm_object_property_set_value(&connector->base,
connector->vrr_capable_property, connector->vrr_capable_property,
capable); capable);
......
...@@ -678,7 +678,6 @@ static int decon_probe(struct platform_device *pdev) ...@@ -678,7 +678,6 @@ static int decon_probe(struct platform_device *pdev)
struct device *dev = &pdev->dev; struct device *dev = &pdev->dev;
struct decon_context *ctx; struct decon_context *ctx;
struct device_node *i80_if_timings; struct device_node *i80_if_timings;
struct resource *res;
int ret; int ret;
if (!dev->of_node) if (!dev->of_node)
...@@ -728,16 +727,11 @@ static int decon_probe(struct platform_device *pdev) ...@@ -728,16 +727,11 @@ static int decon_probe(struct platform_device *pdev)
goto err_iounmap; goto err_iounmap;
} }
res = platform_get_resource_byname(pdev, IORESOURCE_IRQ, ret = platform_get_irq_byname(pdev, ctx->i80_if ? "lcd_sys" : "vsync");
ctx->i80_if ? "lcd_sys" : "vsync"); if (ret < 0)
if (!res) {
dev_err(dev, "irq request failed.\n");
ret = -ENXIO;
goto err_iounmap; goto err_iounmap;
}
ret = devm_request_irq(dev, res->start, decon_irq_handler, ret = devm_request_irq(dev, ret, decon_irq_handler, 0, "drm_decon", ctx);
0, "drm_decon", ctx);
if (ret) { if (ret) {
dev_err(dev, "irq request failed.\n"); dev_err(dev, "irq request failed.\n");
goto err_iounmap; goto err_iounmap;
......
...@@ -1334,8 +1334,10 @@ static int exynos_dsi_register_te_irq(struct exynos_dsi *dsi, ...@@ -1334,8 +1334,10 @@ static int exynos_dsi_register_te_irq(struct exynos_dsi *dsi,
int ret; int ret;
int te_gpio_irq; int te_gpio_irq;
dsi->te_gpio = devm_gpiod_get_optional(dsi->dev, "te", GPIOD_IN); dsi->te_gpio = gpiod_get_optional(panel, "te", GPIOD_IN);
if (IS_ERR(dsi->te_gpio)) { if (!dsi->te_gpio) {
return 0;
} else if (IS_ERR(dsi->te_gpio)) {
dev_err(dsi->dev, "gpio request failed with %ld\n", dev_err(dsi->dev, "gpio request failed with %ld\n",
PTR_ERR(dsi->te_gpio)); PTR_ERR(dsi->te_gpio));
return PTR_ERR(dsi->te_gpio); return PTR_ERR(dsi->te_gpio);
......
...@@ -1267,7 +1267,6 @@ static int fimc_probe(struct platform_device *pdev) ...@@ -1267,7 +1267,6 @@ static int fimc_probe(struct platform_device *pdev)
struct exynos_drm_ipp_formats *formats; struct exynos_drm_ipp_formats *formats;
struct device *dev = &pdev->dev; struct device *dev = &pdev->dev;
struct fimc_context *ctx; struct fimc_context *ctx;
struct resource *res;
int ret; int ret;
int i, j, num_limits, num_formats; int i, j, num_limits, num_formats;
...@@ -1330,14 +1329,12 @@ static int fimc_probe(struct platform_device *pdev) ...@@ -1330,14 +1329,12 @@ static int fimc_probe(struct platform_device *pdev)
return PTR_ERR(ctx->regs); return PTR_ERR(ctx->regs);
/* resource irq */ /* resource irq */
res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); ret = platform_get_irq(pdev, 0);
if (!res) { if (ret < 0)
dev_err(dev, "failed to request irq resource.\n"); return ret;
return -ENOENT;
}
ret = devm_request_irq(dev, res->start, fimc_irq_handler, ret = devm_request_irq(dev, ret, fimc_irq_handler,
0, dev_name(dev), ctx); 0, dev_name(dev), ctx);
if (ret < 0) { if (ret < 0) {
dev_err(dev, "failed to request irq.\n"); dev_err(dev, "failed to request irq.\n");
return ret; return ret;
......
...@@ -1133,7 +1133,6 @@ static int fimd_probe(struct platform_device *pdev) ...@@ -1133,7 +1133,6 @@ static int fimd_probe(struct platform_device *pdev)
struct device *dev = &pdev->dev; struct device *dev = &pdev->dev;
struct fimd_context *ctx; struct fimd_context *ctx;
struct device_node *i80_if_timings; struct device_node *i80_if_timings;
struct resource *res;
int ret; int ret;
if (!dev->of_node) if (!dev->of_node)
...@@ -1206,15 +1205,11 @@ static int fimd_probe(struct platform_device *pdev) ...@@ -1206,15 +1205,11 @@ static int fimd_probe(struct platform_device *pdev)
if (IS_ERR(ctx->regs)) if (IS_ERR(ctx->regs))
return PTR_ERR(ctx->regs); return PTR_ERR(ctx->regs);
res = platform_get_resource_byname(pdev, IORESOURCE_IRQ, ret = platform_get_irq_byname(pdev, ctx->i80_if ? "lcd_sys" : "vsync");
ctx->i80_if ? "lcd_sys" : "vsync"); if (ret < 0)
if (!res) { return ret;
dev_err(dev, "irq request failed.\n");
return -ENXIO;
}
ret = devm_request_irq(dev, res->start, fimd_irq_handler, ret = devm_request_irq(dev, ret, fimd_irq_handler, 0, "drm_fimd", ctx);
0, "drm_fimd", ctx);
if (ret) { if (ret) {
dev_err(dev, "irq request failed.\n"); dev_err(dev, "irq request failed.\n");
return ret; return ret;
......
...@@ -1220,7 +1220,6 @@ static int gsc_probe(struct platform_device *pdev) ...@@ -1220,7 +1220,6 @@ static int gsc_probe(struct platform_device *pdev)
struct gsc_driverdata *driver_data; struct gsc_driverdata *driver_data;
struct exynos_drm_ipp_formats *formats; struct exynos_drm_ipp_formats *formats;
struct gsc_context *ctx; struct gsc_context *ctx;
struct resource *res;
int num_formats, ret, i, j; int num_formats, ret, i, j;
ctx = devm_kzalloc(dev, sizeof(*ctx), GFP_KERNEL); ctx = devm_kzalloc(dev, sizeof(*ctx), GFP_KERNEL);
...@@ -1275,13 +1274,10 @@ static int gsc_probe(struct platform_device *pdev) ...@@ -1275,13 +1274,10 @@ static int gsc_probe(struct platform_device *pdev)
return PTR_ERR(ctx->regs); return PTR_ERR(ctx->regs);
/* resource irq */ /* resource irq */
res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); ctx->irq = platform_get_irq(pdev, 0);
if (!res) { if (ctx->irq < 0)
dev_err(dev, "failed to request irq resource.\n"); return ctx->irq;
return -ENOENT;
}
ctx->irq = res->start;
ret = devm_request_irq(dev, ctx->irq, gsc_irq_handler, 0, ret = devm_request_irq(dev, ctx->irq, gsc_irq_handler, 0,
dev_name(dev), ctx); dev_name(dev), ctx);
if (ret < 0) { if (ret < 0) {
......
...@@ -809,19 +809,17 @@ static int mixer_resources_init(struct mixer_context *mixer_ctx) ...@@ -809,19 +809,17 @@ static int mixer_resources_init(struct mixer_context *mixer_ctx)
return -ENXIO; return -ENXIO;
} }
res = platform_get_resource(mixer_ctx->pdev, IORESOURCE_IRQ, 0); ret = platform_get_irq(mixer_ctx->pdev, 0);
if (res == NULL) { if (ret < 0)
dev_err(dev, "get interrupt resource failed.\n"); return ret;
return -ENXIO; mixer_ctx->irq = ret;
}
ret = devm_request_irq(dev, res->start, mixer_irq_handler, ret = devm_request_irq(dev, mixer_ctx->irq, mixer_irq_handler,
0, "drm_mixer", mixer_ctx); 0, "drm_mixer", mixer_ctx);
if (ret) { if (ret) {
dev_err(dev, "request interrupt failed.\n"); dev_err(dev, "request interrupt failed.\n");
return ret; return ret;
} }
mixer_ctx->irq = res->start;
return 0; return 0;
} }
......
...@@ -110,7 +110,7 @@ static int guc_action_slpc_unset_param(struct intel_guc *guc, u8 id) ...@@ -110,7 +110,7 @@ static int guc_action_slpc_unset_param(struct intel_guc *guc, u8 id)
{ {
u32 request[] = { u32 request[] = {
GUC_ACTION_HOST2GUC_PC_SLPC_REQUEST, GUC_ACTION_HOST2GUC_PC_SLPC_REQUEST,
SLPC_EVENT(SLPC_EVENT_PARAMETER_UNSET, 2), SLPC_EVENT(SLPC_EVENT_PARAMETER_UNSET, 1),
id, id,
}; };
......
...@@ -108,6 +108,7 @@ intel_pch_type(const struct drm_i915_private *dev_priv, unsigned short id) ...@@ -108,6 +108,7 @@ intel_pch_type(const struct drm_i915_private *dev_priv, unsigned short id)
/* Comet Lake V PCH is based on KBP, which is SPT compatible */ /* Comet Lake V PCH is based on KBP, which is SPT compatible */
return PCH_SPT; return PCH_SPT;
case INTEL_PCH_ICP_DEVICE_ID_TYPE: case INTEL_PCH_ICP_DEVICE_ID_TYPE:
case INTEL_PCH_ICP2_DEVICE_ID_TYPE:
drm_dbg_kms(&dev_priv->drm, "Found Ice Lake PCH\n"); drm_dbg_kms(&dev_priv->drm, "Found Ice Lake PCH\n");
drm_WARN_ON(&dev_priv->drm, !IS_ICELAKE(dev_priv)); drm_WARN_ON(&dev_priv->drm, !IS_ICELAKE(dev_priv));
return PCH_ICP; return PCH_ICP;
...@@ -123,7 +124,6 @@ intel_pch_type(const struct drm_i915_private *dev_priv, unsigned short id) ...@@ -123,7 +124,6 @@ intel_pch_type(const struct drm_i915_private *dev_priv, unsigned short id)
!IS_GEN9_BC(dev_priv)); !IS_GEN9_BC(dev_priv));
return PCH_TGP; return PCH_TGP;
case INTEL_PCH_JSP_DEVICE_ID_TYPE: case INTEL_PCH_JSP_DEVICE_ID_TYPE:
case INTEL_PCH_JSP2_DEVICE_ID_TYPE:
drm_dbg_kms(&dev_priv->drm, "Found Jasper Lake PCH\n"); drm_dbg_kms(&dev_priv->drm, "Found Jasper Lake PCH\n");
drm_WARN_ON(&dev_priv->drm, !IS_JSL_EHL(dev_priv)); drm_WARN_ON(&dev_priv->drm, !IS_JSL_EHL(dev_priv));
return PCH_JSP; return PCH_JSP;
......
...@@ -50,11 +50,11 @@ enum intel_pch { ...@@ -50,11 +50,11 @@ enum intel_pch {
#define INTEL_PCH_CMP2_DEVICE_ID_TYPE 0x0680 #define INTEL_PCH_CMP2_DEVICE_ID_TYPE 0x0680
#define INTEL_PCH_CMP_V_DEVICE_ID_TYPE 0xA380 #define INTEL_PCH_CMP_V_DEVICE_ID_TYPE 0xA380
#define INTEL_PCH_ICP_DEVICE_ID_TYPE 0x3480 #define INTEL_PCH_ICP_DEVICE_ID_TYPE 0x3480
#define INTEL_PCH_ICP2_DEVICE_ID_TYPE 0x3880
#define INTEL_PCH_MCC_DEVICE_ID_TYPE 0x4B00 #define INTEL_PCH_MCC_DEVICE_ID_TYPE 0x4B00
#define INTEL_PCH_TGP_DEVICE_ID_TYPE 0xA080 #define INTEL_PCH_TGP_DEVICE_ID_TYPE 0xA080
#define INTEL_PCH_TGP2_DEVICE_ID_TYPE 0x4380 #define INTEL_PCH_TGP2_DEVICE_ID_TYPE 0x4380
#define INTEL_PCH_JSP_DEVICE_ID_TYPE 0x4D80 #define INTEL_PCH_JSP_DEVICE_ID_TYPE 0x4D80
#define INTEL_PCH_JSP2_DEVICE_ID_TYPE 0x3880
#define INTEL_PCH_ADP_DEVICE_ID_TYPE 0x7A80 #define INTEL_PCH_ADP_DEVICE_ID_TYPE 0x7A80
#define INTEL_PCH_ADP2_DEVICE_ID_TYPE 0x5180 #define INTEL_PCH_ADP2_DEVICE_ID_TYPE 0x5180
#define INTEL_PCH_ADP3_DEVICE_ID_TYPE 0x7A00 #define INTEL_PCH_ADP3_DEVICE_ID_TYPE 0x7A00
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment