summaryrefslogtreecommitdiffstats
path: root/drivers/gpu
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2015-02-11 00:33:02 -0500
committerDave Airlie <airlied@redhat.com>2015-02-11 00:33:02 -0500
commitae6d57d12ab3bc833a1a9ca252cc49280713181b (patch)
tree110434c4eb0720ab6e20b563c13309415cec20ca /drivers/gpu
parent2f8997902e64951228385ca1cebb0d2f16f99a23 (diff)
parent335f1a62c5a6334c4fc92c3c448d7648408d9b83 (diff)
Merge tag 'topic/drm-misc-2015-02-06' of git://anongit.freedesktop.org/drm-intel into drm-next
Flushing out my drm-misc queue with a few oddball things all over. * tag 'topic/drm-misc-2015-02-06' of git://anongit.freedesktop.org/drm-intel: drm: Use static attribute groups for managing connector sysfs entries drm: remove DRM_FORMAT_NV12MT drm/modes: Print the mode status in human readable form drm/irq: Don't disable vblank interrupts when already disabled
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/drm/drm_irq.c11
-rw-r--r--drivers/gpu/drm/drm_sysfs.c132
-rw-r--r--drivers/gpu/drm/exynos/exynos_drm_fimc.c14
-rw-r--r--drivers/gpu/drm/exynos/exynos_drm_gsc.c6
-rw-r--r--drivers/gpu/drm/exynos/exynos_drm_plane.c1
-rw-r--r--drivers/gpu/drm/exynos/exynos_mixer.c2
6 files changed, 78 insertions, 88 deletions
diff --git a/drivers/gpu/drm/drm_irq.c b/drivers/gpu/drm/drm_irq.c
index 75647e7f012b..10574a0c3a55 100644
--- a/drivers/gpu/drm/drm_irq.c
+++ b/drivers/gpu/drm/drm_irq.c
@@ -185,8 +185,15 @@ static void vblank_disable_and_save(struct drm_device *dev, int crtc)
185 return; 185 return;
186 } 186 }
187 187
188 dev->driver->disable_vblank(dev, crtc); 188 /*
189 vblank->enabled = false; 189 * Only disable vblank interrupts if they're enabled. This avoids
190 * calling the ->disable_vblank() operation in atomic context with the
191 * hardware potentially runtime suspended.
192 */
193 if (vblank->enabled) {
194 dev->driver->disable_vblank(dev, crtc);
195 vblank->enabled = false;
196 }
190 197
191 /* No further vblank irq's will be processed after 198 /* No further vblank irq's will be processed after
192 * this point. Get current hardware vblank count and 199 * this point. Get current hardware vblank count and
diff --git a/drivers/gpu/drm/drm_sysfs.c b/drivers/gpu/drm/drm_sysfs.c
index cc3d6d6d67e0..5c99d3773212 100644
--- a/drivers/gpu/drm/drm_sysfs.c
+++ b/drivers/gpu/drm/drm_sysfs.c
@@ -339,19 +339,51 @@ static ssize_t select_subconnector_show(struct device *device,
339 drm_get_dvi_i_select_name((int)subconnector)); 339 drm_get_dvi_i_select_name((int)subconnector));
340} 340}
341 341
342static struct device_attribute connector_attrs[] = { 342static DEVICE_ATTR_RO(status);
343 __ATTR_RO(status), 343static DEVICE_ATTR_RO(enabled);
344 __ATTR_RO(enabled), 344static DEVICE_ATTR_RO(dpms);
345 __ATTR_RO(dpms), 345static DEVICE_ATTR_RO(modes);
346 __ATTR_RO(modes), 346
347static struct attribute *connector_dev_attrs[] = {
348 &dev_attr_status.attr,
349 &dev_attr_enabled.attr,
350 &dev_attr_dpms.attr,
351 &dev_attr_modes.attr,
352 NULL
347}; 353};
348 354
349/* These attributes are for both DVI-I connectors and all types of tv-out. */ 355/* These attributes are for both DVI-I connectors and all types of tv-out. */
350static struct device_attribute connector_attrs_opt1[] = { 356static DEVICE_ATTR_RO(subconnector);
351 __ATTR_RO(subconnector), 357static DEVICE_ATTR_RO(select_subconnector);
352 __ATTR_RO(select_subconnector), 358
359static struct attribute *connector_opt_dev_attrs[] = {
360 &dev_attr_subconnector.attr,
361 &dev_attr_select_subconnector.attr,
362 NULL
353}; 363};
354 364
365static umode_t connector_opt_dev_is_visible(struct kobject *kobj,
366 struct attribute *attr, int idx)
367{
368 struct device *dev = kobj_to_dev(kobj);
369 struct drm_connector *connector = to_drm_connector(dev);
370
371 /*
372 * In the long run it maybe a good idea to make one set of
373 * optionals per connector type.
374 */
375 switch (connector->connector_type) {
376 case DRM_MODE_CONNECTOR_DVII:
377 case DRM_MODE_CONNECTOR_Composite:
378 case DRM_MODE_CONNECTOR_SVIDEO:
379 case DRM_MODE_CONNECTOR_Component:
380 case DRM_MODE_CONNECTOR_TV:
381 return attr->mode;
382 }
383
384 return 0;
385}
386
355static struct bin_attribute edid_attr = { 387static struct bin_attribute edid_attr = {
356 .attr.name = "edid", 388 .attr.name = "edid",
357 .attr.mode = 0444, 389 .attr.mode = 0444,
@@ -359,6 +391,27 @@ static struct bin_attribute edid_attr = {
359 .read = edid_show, 391 .read = edid_show,
360}; 392};
361 393
394static struct bin_attribute *connector_bin_attrs[] = {
395 &edid_attr,
396 NULL
397};
398
399static const struct attribute_group connector_dev_group = {
400 .attrs = connector_dev_attrs,
401 .bin_attrs = connector_bin_attrs,
402};
403
404static const struct attribute_group connector_opt_dev_group = {
405 .attrs = connector_opt_dev_attrs,
406 .is_visible = connector_opt_dev_is_visible,
407};
408
409static const struct attribute_group *connector_dev_groups[] = {
410 &connector_dev_group,
411 &connector_opt_dev_group,
412 NULL
413};
414
362/** 415/**
363 * drm_sysfs_connector_add - add a connector to sysfs 416 * drm_sysfs_connector_add - add a connector to sysfs
364 * @connector: connector to add 417 * @connector: connector to add
@@ -371,73 +424,27 @@ static struct bin_attribute edid_attr = {
371int drm_sysfs_connector_add(struct drm_connector *connector) 424int drm_sysfs_connector_add(struct drm_connector *connector)
372{ 425{
373 struct drm_device *dev = connector->dev; 426 struct drm_device *dev = connector->dev;
374 int attr_cnt = 0;
375 int opt_cnt = 0;
376 int i;
377 int ret;
378 427
379 if (connector->kdev) 428 if (connector->kdev)
380 return 0; 429 return 0;
381 430
382 connector->kdev = device_create(drm_class, dev->primary->kdev, 431 connector->kdev =
383 0, connector, "card%d-%s", 432 device_create_with_groups(drm_class, dev->primary->kdev, 0,
384 dev->primary->index, connector->name); 433 connector, connector_dev_groups,
434 "card%d-%s", dev->primary->index,
435 connector->name);
385 DRM_DEBUG("adding \"%s\" to sysfs\n", 436 DRM_DEBUG("adding \"%s\" to sysfs\n",
386 connector->name); 437 connector->name);
387 438
388 if (IS_ERR(connector->kdev)) { 439 if (IS_ERR(connector->kdev)) {
389 DRM_ERROR("failed to register connector device: %ld\n", PTR_ERR(connector->kdev)); 440 DRM_ERROR("failed to register connector device: %ld\n", PTR_ERR(connector->kdev));
390 ret = PTR_ERR(connector->kdev); 441 return PTR_ERR(connector->kdev);
391 goto out;
392 }
393
394 /* Standard attributes */
395
396 for (attr_cnt = 0; attr_cnt < ARRAY_SIZE(connector_attrs); attr_cnt++) {
397 ret = device_create_file(connector->kdev, &connector_attrs[attr_cnt]);
398 if (ret)
399 goto err_out_files;
400 } 442 }
401 443
402 /* Optional attributes */
403 /*
404 * In the long run it maybe a good idea to make one set of
405 * optionals per connector type.
406 */
407 switch (connector->connector_type) {
408 case DRM_MODE_CONNECTOR_DVII:
409 case DRM_MODE_CONNECTOR_Composite:
410 case DRM_MODE_CONNECTOR_SVIDEO:
411 case DRM_MODE_CONNECTOR_Component:
412 case DRM_MODE_CONNECTOR_TV:
413 for (opt_cnt = 0; opt_cnt < ARRAY_SIZE(connector_attrs_opt1); opt_cnt++) {
414 ret = device_create_file(connector->kdev, &connector_attrs_opt1[opt_cnt]);
415 if (ret)
416 goto err_out_files;
417 }
418 break;
419 default:
420 break;
421 }
422
423 ret = sysfs_create_bin_file(&connector->kdev->kobj, &edid_attr);
424 if (ret)
425 goto err_out_files;
426
427 /* Let userspace know we have a new connector */ 444 /* Let userspace know we have a new connector */
428 drm_sysfs_hotplug_event(dev); 445 drm_sysfs_hotplug_event(dev);
429 446
430 return 0; 447 return 0;
431
432err_out_files:
433 for (i = 0; i < opt_cnt; i++)
434 device_remove_file(connector->kdev, &connector_attrs_opt1[i]);
435 for (i = 0; i < attr_cnt; i++)
436 device_remove_file(connector->kdev, &connector_attrs[i]);
437 device_unregister(connector->kdev);
438
439out:
440 return ret;
441} 448}
442 449
443/** 450/**
@@ -455,16 +462,11 @@ out:
455 */ 462 */
456void drm_sysfs_connector_remove(struct drm_connector *connector) 463void drm_sysfs_connector_remove(struct drm_connector *connector)
457{ 464{
458 int i;
459
460 if (!connector->kdev) 465 if (!connector->kdev)
461 return; 466 return;
462 DRM_DEBUG("removing \"%s\" from sysfs\n", 467 DRM_DEBUG("removing \"%s\" from sysfs\n",
463 connector->name); 468 connector->name);
464 469
465 for (i = 0; i < ARRAY_SIZE(connector_attrs); i++)
466 device_remove_file(connector->kdev, &connector_attrs[i]);
467 sysfs_remove_bin_file(&connector->kdev->kobj, &edid_attr);
468 device_unregister(connector->kdev); 470 device_unregister(connector->kdev);
469 connector->kdev = NULL; 471 connector->kdev = NULL;
470} 472}
diff --git a/drivers/gpu/drm/exynos/exynos_drm_fimc.c b/drivers/gpu/drm/exynos/exynos_drm_fimc.c
index 835b6af00970..842d6b8dc3c4 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_fimc.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_fimc.c
@@ -461,7 +461,6 @@ static int fimc_src_set_fmt_order(struct fimc_context *ctx, u32 fmt)
461 cfg |= EXYNOS_MSCTRL_C_INT_IN_3PLANE; 461 cfg |= EXYNOS_MSCTRL_C_INT_IN_3PLANE;
462 break; 462 break;
463 case DRM_FORMAT_NV12: 463 case DRM_FORMAT_NV12:
464 case DRM_FORMAT_NV12MT:
465 case DRM_FORMAT_NV16: 464 case DRM_FORMAT_NV16:
466 cfg |= (EXYNOS_MSCTRL_ORDER2P_LSB_CBCR | 465 cfg |= (EXYNOS_MSCTRL_ORDER2P_LSB_CBCR |
467 EXYNOS_MSCTRL_C_INT_IN_2PLANE); 466 EXYNOS_MSCTRL_C_INT_IN_2PLANE);
@@ -511,7 +510,6 @@ static int fimc_src_set_fmt(struct device *dev, u32 fmt)
511 case DRM_FORMAT_YVU420: 510 case DRM_FORMAT_YVU420:
512 case DRM_FORMAT_NV12: 511 case DRM_FORMAT_NV12:
513 case DRM_FORMAT_NV21: 512 case DRM_FORMAT_NV21:
514 case DRM_FORMAT_NV12MT:
515 cfg |= EXYNOS_MSCTRL_INFORMAT_YCBCR420; 513 cfg |= EXYNOS_MSCTRL_INFORMAT_YCBCR420;
516 break; 514 break;
517 default: 515 default:
@@ -524,10 +522,7 @@ static int fimc_src_set_fmt(struct device *dev, u32 fmt)
524 cfg = fimc_read(ctx, EXYNOS_CIDMAPARAM); 522 cfg = fimc_read(ctx, EXYNOS_CIDMAPARAM);
525 cfg &= ~EXYNOS_CIDMAPARAM_R_MODE_MASK; 523 cfg &= ~EXYNOS_CIDMAPARAM_R_MODE_MASK;
526 524
527 if (fmt == DRM_FORMAT_NV12MT) 525 cfg |= EXYNOS_CIDMAPARAM_R_MODE_LINEAR;
528 cfg |= EXYNOS_CIDMAPARAM_R_MODE_64X32;
529 else
530 cfg |= EXYNOS_CIDMAPARAM_R_MODE_LINEAR;
531 526
532 fimc_write(ctx, cfg, EXYNOS_CIDMAPARAM); 527 fimc_write(ctx, cfg, EXYNOS_CIDMAPARAM);
533 528
@@ -812,7 +807,6 @@ static int fimc_dst_set_fmt_order(struct fimc_context *ctx, u32 fmt)
812 cfg |= EXYNOS_CIOCTRL_YCBCR_3PLANE; 807 cfg |= EXYNOS_CIOCTRL_YCBCR_3PLANE;
813 break; 808 break;
814 case DRM_FORMAT_NV12: 809 case DRM_FORMAT_NV12:
815 case DRM_FORMAT_NV12MT:
816 case DRM_FORMAT_NV16: 810 case DRM_FORMAT_NV16:
817 cfg |= EXYNOS_CIOCTRL_ORDER2P_LSB_CBCR; 811 cfg |= EXYNOS_CIOCTRL_ORDER2P_LSB_CBCR;
818 cfg |= EXYNOS_CIOCTRL_YCBCR_2PLANE; 812 cfg |= EXYNOS_CIOCTRL_YCBCR_2PLANE;
@@ -867,7 +861,6 @@ static int fimc_dst_set_fmt(struct device *dev, u32 fmt)
867 case DRM_FORMAT_YUV420: 861 case DRM_FORMAT_YUV420:
868 case DRM_FORMAT_YVU420: 862 case DRM_FORMAT_YVU420:
869 case DRM_FORMAT_NV12: 863 case DRM_FORMAT_NV12:
870 case DRM_FORMAT_NV12MT:
871 case DRM_FORMAT_NV21: 864 case DRM_FORMAT_NV21:
872 cfg |= EXYNOS_CITRGFMT_OUTFORMAT_YCBCR420; 865 cfg |= EXYNOS_CITRGFMT_OUTFORMAT_YCBCR420;
873 break; 866 break;
@@ -883,10 +876,7 @@ static int fimc_dst_set_fmt(struct device *dev, u32 fmt)
883 cfg = fimc_read(ctx, EXYNOS_CIDMAPARAM); 876 cfg = fimc_read(ctx, EXYNOS_CIDMAPARAM);
884 cfg &= ~EXYNOS_CIDMAPARAM_W_MODE_MASK; 877 cfg &= ~EXYNOS_CIDMAPARAM_W_MODE_MASK;
885 878
886 if (fmt == DRM_FORMAT_NV12MT) 879 cfg |= EXYNOS_CIDMAPARAM_W_MODE_LINEAR;
887 cfg |= EXYNOS_CIDMAPARAM_W_MODE_64X32;
888 else
889 cfg |= EXYNOS_CIDMAPARAM_W_MODE_LINEAR;
890 880
891 fimc_write(ctx, cfg, EXYNOS_CIDMAPARAM); 881 fimc_write(ctx, cfg, EXYNOS_CIDMAPARAM);
892 882
diff --git a/drivers/gpu/drm/exynos/exynos_drm_gsc.c b/drivers/gpu/drm/exynos/exynos_drm_gsc.c
index 0261468c8019..8040ed2a831f 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_gsc.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_gsc.c
@@ -542,9 +542,6 @@ static int gsc_src_set_fmt(struct device *dev, u32 fmt)
542 cfg |= (GSC_IN_CHROMA_ORDER_CBCR | 542 cfg |= (GSC_IN_CHROMA_ORDER_CBCR |
543 GSC_IN_YUV420_2P); 543 GSC_IN_YUV420_2P);
544 break; 544 break;
545 case DRM_FORMAT_NV12MT:
546 cfg |= (GSC_IN_TILE_C_16x8 | GSC_IN_TILE_MODE);
547 break;
548 default: 545 default:
549 dev_err(ippdrv->dev, "inavlid target yuv order 0x%x.\n", fmt); 546 dev_err(ippdrv->dev, "inavlid target yuv order 0x%x.\n", fmt);
550 return -EINVAL; 547 return -EINVAL;
@@ -809,9 +806,6 @@ static int gsc_dst_set_fmt(struct device *dev, u32 fmt)
809 cfg |= (GSC_OUT_CHROMA_ORDER_CBCR | 806 cfg |= (GSC_OUT_CHROMA_ORDER_CBCR |
810 GSC_OUT_YUV420_2P); 807 GSC_OUT_YUV420_2P);
811 break; 808 break;
812 case DRM_FORMAT_NV12MT:
813 cfg |= (GSC_OUT_TILE_C_16x8 | GSC_OUT_TILE_MODE);
814 break;
815 default: 809 default:
816 dev_err(ippdrv->dev, "inavlid target yuv order 0x%x.\n", fmt); 810 dev_err(ippdrv->dev, "inavlid target yuv order 0x%x.\n", fmt);
817 return -EINVAL; 811 return -EINVAL;
diff --git a/drivers/gpu/drm/exynos/exynos_drm_plane.c b/drivers/gpu/drm/exynos/exynos_drm_plane.c
index 358cff67e5ce..2f43a3c4f7b7 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_plane.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_plane.c
@@ -23,7 +23,6 @@ static const uint32_t formats[] = {
23 DRM_FORMAT_XRGB8888, 23 DRM_FORMAT_XRGB8888,
24 DRM_FORMAT_ARGB8888, 24 DRM_FORMAT_ARGB8888,
25 DRM_FORMAT_NV12, 25 DRM_FORMAT_NV12,
26 DRM_FORMAT_NV12MT,
27}; 26};
28 27
29/* 28/*
diff --git a/drivers/gpu/drm/exynos/exynos_mixer.c b/drivers/gpu/drm/exynos/exynos_mixer.c
index ed44cd4f01f7..2fd2e5d46142 100644
--- a/drivers/gpu/drm/exynos/exynos_mixer.c
+++ b/drivers/gpu/drm/exynos/exynos_mixer.c
@@ -412,8 +412,6 @@ static void vp_video_buffer(struct mixer_context *ctx, int win)
412 win_data = &ctx->win_data[win]; 412 win_data = &ctx->win_data[win];
413 413
414 switch (win_data->pixel_format) { 414 switch (win_data->pixel_format) {
415 case DRM_FORMAT_NV12MT:
416 tiled_mode = true;
417 case DRM_FORMAT_NV12: 415 case DRM_FORMAT_NV12:
418 crcb_mode = false; 416 crcb_mode = false;
419 buf_num = 2; 417 buf_num = 2;