[PATCH v1 2/2] drm: bridge: add support for lontium LT9611UXC bridge
kernel test robot
lkp at intel.com
Fri Aug 28 13:49:04 UTC 2020
Hi Dmitry,
Thank you for the patch! Perhaps something to improve:
[auto build test WARNING on drm-tip/drm-tip]
[also build test WARNING on next-20200828]
[cannot apply to robh/for-next drm-intel/for-linux-next tegra-drm/drm/tegra/for-next linus/master drm-exynos/exynos-drm-next drm/drm-next v5.9-rc2]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]
url: https://github.com/0day-ci/linux/commits/Dmitry-Baryshkov/Add-LT9611UXC-DSI-to-HDMI-bridge-support/20200828-200735
base: git://anongit.freedesktop.org/drm/drm-tip drm-tip
config: i386-allyesconfig (attached as .config)
compiler: gcc-9 (Debian 9.3.0-15) 9.3.0
reproduce (this is a W=1 build):
# save the attached .config to linux build tree
make W=1 ARCH=i386
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp at intel.com>
All warnings (new ones prefixed by >>):
drivers/gpu/drm/bridge/lontium-lt9611uxc.c: In function 'lt9611uxc_video_setup':
>> drivers/gpu/drm/bridge/lontium-lt9611uxc.c:322:49: warning: variable 'vsync_porch' set but not used [-Wunused-but-set-variable]
322 | u32 v_total, vactive, vsync_len, vfront_porch, vsync_porch;
| ^~~~~~~~~~~
>> drivers/gpu/drm/bridge/lontium-lt9611uxc.c:321:49: warning: variable 'hsync_porch' set but not used [-Wunused-but-set-variable]
321 | u32 h_total, hactive, hsync_len, hfront_porch, hsync_porch;
| ^~~~~~~~~~~
drivers/gpu/drm/bridge/lontium-lt9611uxc.c: At top level:
>> drivers/gpu/drm/bridge/lontium-lt9611uxc.c:473:14: warning: no previous prototype for 'lt9611uxc_bridge_get_edid' [-Wmissing-prototypes]
473 | struct edid *lt9611uxc_bridge_get_edid(struct drm_bridge *bridge,
| ^~~~~~~~~~~~~~~~~~~~~~~~~
# https://github.com/0day-ci/linux/commit/f1b935d064fd8924137d420e75eb050c3d66c22b
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Dmitry-Baryshkov/Add-LT9611UXC-DSI-to-HDMI-bridge-support/20200828-200735
git checkout f1b935d064fd8924137d420e75eb050c3d66c22b
vim +/vsync_porch +322 drivers/gpu/drm/bridge/lontium-lt9611uxc.c
317
318 static void lt9611uxc_video_setup(struct lt9611uxc *lt9611uxc,
319 const struct drm_display_mode *mode)
320 {
> 321 u32 h_total, hactive, hsync_len, hfront_porch, hsync_porch;
> 322 u32 v_total, vactive, vsync_len, vfront_porch, vsync_porch;
323
324 h_total = mode->htotal;
325 v_total = mode->vtotal;
326
327 hactive = mode->hdisplay;
328 hsync_len = mode->hsync_end - mode->hsync_start;
329 hfront_porch = mode->hsync_start - mode->hdisplay;
330 hsync_porch = hsync_len + mode->htotal - mode->hsync_end;
331
332 vactive = mode->vdisplay;
333 vsync_len = mode->vsync_end - mode->vsync_start;
334 vfront_porch = mode->vsync_start - mode->vdisplay;
335 vsync_porch = vsync_len + mode->vtotal - mode->vsync_end;
336
337 regmap_write(lt9611uxc->regmap, 0xd00d, (u8)(v_total / 256));
338 regmap_write(lt9611uxc->regmap, 0xd00e, (u8)(v_total % 256));
339
340 regmap_write(lt9611uxc->regmap, 0xd00f, (u8)(vactive / 256));
341 regmap_write(lt9611uxc->regmap, 0xd010, (u8)(vactive % 256));
342
343 regmap_write(lt9611uxc->regmap, 0xd011, (u8)(h_total / 256));
344 regmap_write(lt9611uxc->regmap, 0xd012, (u8)(h_total % 256));
345
346 regmap_write(lt9611uxc->regmap, 0xd013, (u8)(hactive / 256));
347 regmap_write(lt9611uxc->regmap, 0xd014, (u8)(hactive % 256));
348
349 regmap_write(lt9611uxc->regmap, 0xd015, (u8)(vsync_len % 256));
350
351 regmap_update_bits(lt9611uxc->regmap, 0xd016, 0xf, (u8)(hsync_len / 256));
352 regmap_write(lt9611uxc->regmap, 0xd017, (u8)(hsync_len % 256));
353
354 regmap_update_bits(lt9611uxc->regmap, 0xd018, 0xf, (u8)(vfront_porch / 256));
355 regmap_write(lt9611uxc->regmap, 0xd019, (u8)(vfront_porch % 256));
356
357 regmap_update_bits(lt9611uxc->regmap, 0xd01a, 0xf, (u8)(hfront_porch / 256));
358 regmap_write(lt9611uxc->regmap, 0xd01b, (u8)(hfront_porch % 256));
359 }
360
361 static void lt9611uxc_bridge_mode_set(struct drm_bridge *bridge,
362 const struct drm_display_mode *mode,
363 const struct drm_display_mode *adj_mode)
364 {
365 struct lt9611uxc *lt9611uxc = bridge_to_lt9611uxc(bridge);
366
367 if (lt9611uxc->sleep)
368 lt9611uxc_reset(lt9611uxc);
369
370 lt9611uxc_lock(lt9611uxc);
371 lt9611uxc_video_setup(lt9611uxc, mode);
372 lt9611uxc_unlock(lt9611uxc);
373 }
374
375 static enum drm_connector_status lt9611uxc_bridge_detect(struct drm_bridge *bridge)
376 {
377 struct lt9611uxc *lt9611uxc = bridge_to_lt9611uxc(bridge);
378 unsigned int reg_val = 0;
379 int ret;
380 int connected = 1;
381
382 if (lt9611uxc->hpd_supported) {
383 lt9611uxc_lock(lt9611uxc);
384 ret = regmap_read(lt9611uxc->regmap, 0xb023, ®_val);
385 lt9611uxc_unlock(lt9611uxc);
386
387 if (ret)
388 dev_err(lt9611uxc->dev, "failed to read hpd status: %d\n", ret);
389 else
390 connected = reg_val & BIT(1);
391 }
392
393 return connected ? connector_status_connected :
394 connector_status_disconnected;
395 }
396
397 static int lt9611uxc_bridge_get_modes(struct drm_bridge *bridge,
398 struct drm_connector *connector)
399 {
400 struct lt9611uxc *lt9611uxc = bridge_to_lt9611uxc(bridge);
401 struct display_timings *timings = lt9611uxc->timings;
402 int i;
403
404 for (i = 0; i < timings->num_timings; i++) {
405 struct drm_display_mode *mode = drm_mode_create(bridge->dev);
406 struct videomode vm;
407
408 if (videomode_from_timings(timings, &vm, i))
409 break;
410
411 drm_display_mode_from_videomode(&vm, mode);
412
413 mode->type = DRM_MODE_TYPE_DRIVER;
414
415 if (timings->native_mode == i)
416 mode->type |= DRM_MODE_TYPE_PREFERRED;
417
418 drm_mode_set_name(mode);
419 drm_mode_probed_add(connector, mode);
420 }
421
422 return i;
423 }
424
425 static int lt9611uxc_read_edid(struct lt9611uxc *lt9611uxc)
426 {
427 int ret = 0;
428 int i;
429
430 /* memset to clear old buffer, if any */
431 memset(lt9611uxc->edid_buf, 0, sizeof(lt9611uxc->edid_buf));
432
433 lt9611uxc_lock(lt9611uxc);
434
435 regmap_write(lt9611uxc->regmap, 0xb00b, 0x10);
436
437 #define EDID_SEG 16
438 for (i = 0; i < 2 * EDID_BLOCK_SIZE; i += EDID_SEG) {
439 regmap_write(lt9611uxc->regmap, 0xb00a, i);
440 ret = regmap_noinc_read(lt9611uxc->regmap, 0xb0b0,
441 <9611uxc->edid_buf[i], EDID_SEG);
442 if (ret < 0)
443 break;
444 }
445
446 lt9611uxc_unlock(lt9611uxc);
447 return ret;
448 }
449
450 static int lt9611uxc_get_edid_block(void *data, u8 *buf, unsigned int block, size_t len)
451 {
452 struct lt9611uxc *lt9611uxc = data;
453 int ret;
454
455 if (len > EDID_BLOCK_SIZE)
456 return -EINVAL;
457
458 if (block >= EDID_NUM_BLOCKS)
459 return -EINVAL;
460
461 if (block == 0) {
462 ret = lt9611uxc_read_edid(lt9611uxc);
463 if (ret) {
464 dev_err(lt9611uxc->dev, "edid read failed\n");
465 return ret;
466 }
467 }
468
469 memcpy(buf, lt9611uxc->edid_buf + block * EDID_BLOCK_SIZE, len);
470 return 0;
471 };
472
> 473 struct edid *lt9611uxc_bridge_get_edid(struct drm_bridge *bridge,
474 struct drm_connector *connector)
475 {
476 struct lt9611uxc *lt9611uxc = bridge_to_lt9611uxc(bridge);
477
478 return drm_do_get_edid(connector, lt9611uxc_get_edid_block, lt9611uxc);
479 }
480
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
-------------- next part --------------
A non-text attachment was scrubbed...
Name: .config.gz
Type: application/gzip
Size: 74952 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/dri-devel/attachments/20200828/5679aabe/attachment-0001.gz>
More information about the dri-devel
mailing list