Skip to content

Commit 5a394f1

Browse files
committed
Merge tag 'imx-drm-next-2020-07-20' of git://git.pengutronix.de/pza/linux into drm-next
drm/imx: error path fixes and cleanups - Fix use after free issue in component bind error path by keeping memory allocated as long as the driver is bound. This will be replaced with drm managed memory in the next round. - Fix bus_flags overriding logic in parallel-display. - Disable regulator in imx-tve bind error path. - Drop unnecessary best_encoder callback. - Remove an unused enum in imx-ldb. - Bail out early on missing panel or bridge in parallel-display to speed up -EPROBE_DEFER path. - Disable both LDB channels in split mode. - Restore RGB32, BGR32 format support. - Fix tiled image conversion in case of out of order interrupts. - Remove a superfluous error message in imx-tve. Signed-off-by: Dave Airlie <[email protected]> From: Philipp Zabel <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
2 parents fa07634 + 408a85e commit 5a394f1

File tree

8 files changed

+167
-141
lines changed

8 files changed

+167
-141
lines changed

drivers/gpu/drm/imx/dw_hdmi-imx.c

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -211,9 +211,8 @@ static int dw_hdmi_imx_bind(struct device *dev, struct device *master,
211211
if (!pdev->dev.of_node)
212212
return -ENODEV;
213213

214-
hdmi = devm_kzalloc(&pdev->dev, sizeof(*hdmi), GFP_KERNEL);
215-
if (!hdmi)
216-
return -ENOMEM;
214+
hdmi = dev_get_drvdata(dev);
215+
memset(hdmi, 0, sizeof(*hdmi));
217216

218217
match = of_match_node(dw_hdmi_imx_dt_ids, pdev->dev.of_node);
219218
plat_data = match->data;
@@ -237,8 +236,6 @@ static int dw_hdmi_imx_bind(struct device *dev, struct device *master,
237236
drm_encoder_helper_add(encoder, &dw_hdmi_imx_encoder_helper_funcs);
238237
drm_simple_encoder_init(drm, encoder, DRM_MODE_ENCODER_TMDS);
239238

240-
platform_set_drvdata(pdev, hdmi);
241-
242239
hdmi->hdmi = dw_hdmi_bind(pdev, encoder, plat_data);
243240

244241
/*
@@ -268,6 +265,14 @@ static const struct component_ops dw_hdmi_imx_ops = {
268265

269266
static int dw_hdmi_imx_probe(struct platform_device *pdev)
270267
{
268+
struct imx_hdmi *hdmi;
269+
270+
hdmi = devm_kzalloc(&pdev->dev, sizeof(*hdmi), GFP_KERNEL);
271+
if (!hdmi)
272+
return -ENOMEM;
273+
274+
platform_set_drvdata(pdev, hdmi);
275+
271276
return component_add(&pdev->dev, &dw_hdmi_imx_ops);
272277
}
273278

drivers/gpu/drm/imx/imx-drm-core.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -265,9 +265,10 @@ static void imx_drm_unbind(struct device *dev)
265265

266266
drm_kms_helper_poll_fini(drm);
267267

268+
component_unbind_all(drm->dev, drm);
269+
268270
drm_mode_config_cleanup(drm);
269271

270-
component_unbind_all(drm->dev, drm);
271272
dev_set_drvdata(dev, NULL);
272273

273274
drm_dev_put(drm);

drivers/gpu/drm/imx/imx-ldb.c

Lines changed: 14 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -156,14 +156,6 @@ static int imx_ldb_connector_get_modes(struct drm_connector *connector)
156156
return num_modes;
157157
}
158158

159-
static struct drm_encoder *imx_ldb_connector_best_encoder(
160-
struct drm_connector *connector)
161-
{
162-
struct imx_ldb_channel *imx_ldb_ch = con_to_imx_ldb_ch(connector);
163-
164-
return &imx_ldb_ch->encoder;
165-
}
166-
167159
static void imx_ldb_set_clock(struct imx_ldb *ldb, int mux, int chno,
168160
unsigned long serial_clk, unsigned long di_clk)
169161
{
@@ -304,18 +296,19 @@ static void imx_ldb_encoder_disable(struct drm_encoder *encoder)
304296
{
305297
struct imx_ldb_channel *imx_ldb_ch = enc_to_imx_ldb_ch(encoder);
306298
struct imx_ldb *ldb = imx_ldb_ch->ldb;
299+
int dual = ldb->ldb_ctrl & LDB_SPLIT_MODE_EN;
307300
int mux, ret;
308301

309302
drm_panel_disable(imx_ldb_ch->panel);
310303

311-
if (imx_ldb_ch == &ldb->channel[0])
304+
if (imx_ldb_ch == &ldb->channel[0] || dual)
312305
ldb->ldb_ctrl &= ~LDB_CH0_MODE_EN_MASK;
313-
else if (imx_ldb_ch == &ldb->channel[1])
306+
if (imx_ldb_ch == &ldb->channel[1] || dual)
314307
ldb->ldb_ctrl &= ~LDB_CH1_MODE_EN_MASK;
315308

316309
regmap_write(ldb->regmap, IOMUXC_GPR2, ldb->ldb_ctrl);
317310

318-
if (ldb->ldb_ctrl & LDB_SPLIT_MODE_EN) {
311+
if (dual) {
319312
clk_disable_unprepare(ldb->clk[0]);
320313
clk_disable_unprepare(ldb->clk[1]);
321314
}
@@ -391,7 +384,6 @@ static const struct drm_connector_funcs imx_ldb_connector_funcs = {
391384

392385
static const struct drm_connector_helper_funcs imx_ldb_connector_helper_funcs = {
393386
.get_modes = imx_ldb_connector_get_modes,
394-
.best_encoder = imx_ldb_connector_best_encoder,
395387
};
396388

397389
static const struct drm_encoder_helper_funcs imx_ldb_encoder_helper_funcs = {
@@ -473,11 +465,6 @@ static int imx_ldb_register(struct drm_device *drm,
473465
return 0;
474466
}
475467

476-
enum {
477-
LVDS_BIT_MAP_SPWG,
478-
LVDS_BIT_MAP_JEIDA
479-
};
480-
481468
struct imx_ldb_bit_mapping {
482469
u32 bus_format;
483470
u32 datawidth;
@@ -590,9 +577,8 @@ static int imx_ldb_bind(struct device *dev, struct device *master, void *data)
590577
int ret;
591578
int i;
592579

593-
imx_ldb = devm_kzalloc(dev, sizeof(*imx_ldb), GFP_KERNEL);
594-
if (!imx_ldb)
595-
return -ENOMEM;
580+
imx_ldb = dev_get_drvdata(dev);
581+
memset(imx_ldb, 0, sizeof(*imx_ldb));
596582

597583
imx_ldb->regmap = syscon_regmap_lookup_by_phandle(np, "gpr");
598584
if (IS_ERR(imx_ldb->regmap)) {
@@ -700,8 +686,6 @@ static int imx_ldb_bind(struct device *dev, struct device *master, void *data)
700686
}
701687
}
702688

703-
dev_set_drvdata(dev, imx_ldb);
704-
705689
return 0;
706690

707691
free_child:
@@ -733,6 +717,14 @@ static const struct component_ops imx_ldb_ops = {
733717

734718
static int imx_ldb_probe(struct platform_device *pdev)
735719
{
720+
struct imx_ldb *imx_ldb;
721+
722+
imx_ldb = devm_kzalloc(&pdev->dev, sizeof(*imx_ldb), GFP_KERNEL);
723+
if (!imx_ldb)
724+
return -ENOMEM;
725+
726+
platform_set_drvdata(pdev, imx_ldb);
727+
736728
return component_add(&pdev->dev, &imx_ldb_ops);
737729
}
738730

drivers/gpu/drm/imx/imx-tve.c

Lines changed: 21 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -260,14 +260,6 @@ static int imx_tve_connector_mode_valid(struct drm_connector *connector,
260260
return MODE_BAD;
261261
}
262262

263-
static struct drm_encoder *imx_tve_connector_best_encoder(
264-
struct drm_connector *connector)
265-
{
266-
struct imx_tve *tve = con_to_tve(connector);
267-
268-
return &tve->encoder;
269-
}
270-
271263
static void imx_tve_encoder_mode_set(struct drm_encoder *encoder,
272264
struct drm_display_mode *orig_mode,
273265
struct drm_display_mode *mode)
@@ -345,7 +337,6 @@ static const struct drm_connector_funcs imx_tve_connector_funcs = {
345337

346338
static const struct drm_connector_helper_funcs imx_tve_connector_helper_funcs = {
347339
.get_modes = imx_tve_connector_get_modes,
348-
.best_encoder = imx_tve_connector_best_encoder,
349340
.mode_valid = imx_tve_connector_mode_valid,
350341
};
351342

@@ -490,6 +481,13 @@ static int imx_tve_register(struct drm_device *drm, struct imx_tve *tve)
490481
return 0;
491482
}
492483

484+
static void imx_tve_disable_regulator(void *data)
485+
{
486+
struct imx_tve *tve = data;
487+
488+
regulator_disable(tve->dac_reg);
489+
}
490+
493491
static bool imx_tve_readable_reg(struct device *dev, unsigned int reg)
494492
{
495493
return (reg % 4 == 0) && (reg <= 0xdc);
@@ -542,9 +540,8 @@ static int imx_tve_bind(struct device *dev, struct device *master, void *data)
542540
int irq;
543541
int ret;
544542

545-
tve = devm_kzalloc(dev, sizeof(*tve), GFP_KERNEL);
546-
if (!tve)
547-
return -ENOMEM;
543+
tve = dev_get_drvdata(dev);
544+
memset(tve, 0, sizeof(*tve));
548545

549546
tve->dev = dev;
550547
spin_lock_init(&tve->lock);
@@ -594,10 +591,8 @@ static int imx_tve_bind(struct device *dev, struct device *master, void *data)
594591
}
595592

596593
irq = platform_get_irq(pdev, 0);
597-
if (irq < 0) {
598-
dev_err(dev, "failed to get irq\n");
594+
if (irq < 0)
599595
return irq;
600-
}
601596

602597
ret = devm_request_threaded_irq(dev, irq, NULL,
603598
imx_tve_irq_handler, IRQF_ONESHOT,
@@ -614,6 +609,9 @@ static int imx_tve_bind(struct device *dev, struct device *master, void *data)
614609
ret = regulator_enable(tve->dac_reg);
615610
if (ret)
616611
return ret;
612+
ret = devm_add_action_or_reset(dev, imx_tve_disable_regulator, tve);
613+
if (ret)
614+
return ret;
617615
}
618616

619617
tve->clk = devm_clk_get(dev, "tve");
@@ -655,27 +653,23 @@ static int imx_tve_bind(struct device *dev, struct device *master, void *data)
655653
if (ret)
656654
return ret;
657655

658-
dev_set_drvdata(dev, tve);
659-
660656
return 0;
661657
}
662658

663-
static void imx_tve_unbind(struct device *dev, struct device *master,
664-
void *data)
665-
{
666-
struct imx_tve *tve = dev_get_drvdata(dev);
667-
668-
if (!IS_ERR(tve->dac_reg))
669-
regulator_disable(tve->dac_reg);
670-
}
671-
672659
static const struct component_ops imx_tve_ops = {
673660
.bind = imx_tve_bind,
674-
.unbind = imx_tve_unbind,
675661
};
676662

677663
static int imx_tve_probe(struct platform_device *pdev)
678664
{
665+
struct imx_tve *tve;
666+
667+
tve = devm_kzalloc(&pdev->dev, sizeof(*tve), GFP_KERNEL);
668+
if (!tve)
669+
return -ENOMEM;
670+
671+
platform_set_drvdata(pdev, tve);
672+
679673
return component_add(&pdev->dev, &imx_tve_ops);
680674
}
681675

drivers/gpu/drm/imx/ipuv3-crtc.c

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -433,21 +433,13 @@ static int ipu_drm_bind(struct device *dev, struct device *master, void *data)
433433
struct ipu_client_platformdata *pdata = dev->platform_data;
434434
struct drm_device *drm = data;
435435
struct ipu_crtc *ipu_crtc;
436-
int ret;
437436

438-
ipu_crtc = devm_kzalloc(dev, sizeof(*ipu_crtc), GFP_KERNEL);
439-
if (!ipu_crtc)
440-
return -ENOMEM;
437+
ipu_crtc = dev_get_drvdata(dev);
438+
memset(ipu_crtc, 0, sizeof(*ipu_crtc));
441439

442440
ipu_crtc->dev = dev;
443441

444-
ret = ipu_crtc_init(ipu_crtc, pdata, drm);
445-
if (ret)
446-
return ret;
447-
448-
dev_set_drvdata(dev, ipu_crtc);
449-
450-
return 0;
442+
return ipu_crtc_init(ipu_crtc, pdata, drm);
451443
}
452444

453445
static void ipu_drm_unbind(struct device *dev, struct device *master,
@@ -469,6 +461,7 @@ static const struct component_ops ipu_crtc_ops = {
469461
static int ipu_drm_probe(struct platform_device *pdev)
470462
{
471463
struct device *dev = &pdev->dev;
464+
struct ipu_crtc *ipu_crtc;
472465
int ret;
473466

474467
if (!dev->platform_data)
@@ -478,6 +471,12 @@ static int ipu_drm_probe(struct platform_device *pdev)
478471
if (ret)
479472
return ret;
480473

474+
ipu_crtc = devm_kzalloc(dev, sizeof(*ipu_crtc), GFP_KERNEL);
475+
if (!ipu_crtc)
476+
return -ENOMEM;
477+
478+
dev_set_drvdata(dev, ipu_crtc);
479+
481480
return component_add(dev, &ipu_crtc_ops);
482481
}
483482

drivers/gpu/drm/imx/parallel-display.c

Lines changed: 17 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -88,14 +88,6 @@ static int imx_pd_connector_get_modes(struct drm_connector *connector)
8888
return num_modes;
8989
}
9090

91-
static struct drm_encoder *imx_pd_connector_best_encoder(
92-
struct drm_connector *connector)
93-
{
94-
struct imx_parallel_display *imxpd = con_to_imxpd(connector);
95-
96-
return &imxpd->encoder;
97-
}
98-
9991
static void imx_pd_bridge_enable(struct drm_bridge *bridge)
10092
{
10193
struct imx_parallel_display *imxpd = bridge_to_imxpd(bridge);
@@ -217,7 +209,7 @@ static int imx_pd_bridge_atomic_check(struct drm_bridge *bridge,
217209

218210
if (next_bridge_state)
219211
bus_flags = next_bridge_state->input_bus_cfg.flags;
220-
else if (!imxpd->bus_format && di->num_bus_formats)
212+
else if (di->num_bus_formats)
221213
bus_flags = di->bus_flags;
222214
else
223215
bus_flags = imxpd->bus_flags;
@@ -254,7 +246,6 @@ static const struct drm_connector_funcs imx_pd_connector_funcs = {
254246

255247
static const struct drm_connector_helper_funcs imx_pd_connector_helper_funcs = {
256248
.get_modes = imx_pd_connector_get_modes,
257-
.best_encoder = imx_pd_connector_best_encoder,
258249
};
259250

260251
static const struct drm_bridge_funcs imx_pd_bridge_funcs = {
@@ -326,9 +317,14 @@ static int imx_pd_bind(struct device *dev, struct device *master, void *data)
326317
u32 bus_format = 0;
327318
const char *fmt;
328319

329-
imxpd = devm_kzalloc(dev, sizeof(*imxpd), GFP_KERNEL);
330-
if (!imxpd)
331-
return -ENOMEM;
320+
imxpd = dev_get_drvdata(dev);
321+
memset(imxpd, 0, sizeof(*imxpd));
322+
323+
/* port@1 is the output port */
324+
ret = drm_of_find_panel_or_bridge(np, 1, 0, &imxpd->panel,
325+
&imxpd->next_bridge);
326+
if (ret && ret != -ENODEV)
327+
return ret;
332328

333329
edidp = of_get_property(np, "edid", &imxpd->edid_len);
334330
if (edidp)
@@ -347,20 +343,12 @@ static int imx_pd_bind(struct device *dev, struct device *master, void *data)
347343
}
348344
imxpd->bus_format = bus_format;
349345

350-
/* port@1 is the output port */
351-
ret = drm_of_find_panel_or_bridge(np, 1, 0, &imxpd->panel,
352-
&imxpd->next_bridge);
353-
if (ret && ret != -ENODEV)
354-
return ret;
355-
356346
imxpd->dev = dev;
357347

358348
ret = imx_pd_register(drm, imxpd);
359349
if (ret)
360350
return ret;
361351

362-
dev_set_drvdata(dev, imxpd);
363-
364352
return 0;
365353
}
366354

@@ -382,6 +370,14 @@ static const struct component_ops imx_pd_ops = {
382370

383371
static int imx_pd_probe(struct platform_device *pdev)
384372
{
373+
struct imx_parallel_display *imxpd;
374+
375+
imxpd = devm_kzalloc(&pdev->dev, sizeof(*imxpd), GFP_KERNEL);
376+
if (!imxpd)
377+
return -ENOMEM;
378+
379+
platform_set_drvdata(pdev, imxpd);
380+
385381
return component_add(&pdev->dev, &imx_pd_ops);
386382
}
387383

drivers/gpu/ipu-v3/ipu-common.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,8 @@ enum ipu_color_space ipu_pixelformat_to_colorspace(u32 pixelformat)
124124
case V4L2_PIX_FMT_RGBX32:
125125
case V4L2_PIX_FMT_ARGB32:
126126
case V4L2_PIX_FMT_XRGB32:
127+
case V4L2_PIX_FMT_RGB32:
128+
case V4L2_PIX_FMT_BGR32:
127129
return IPUV3_COLORSPACE_RGB;
128130
default:
129131
return IPUV3_COLORSPACE_UNKNOWN;

0 commit comments

Comments
 (0)