diff options
author | Dave Airlie <airlied@redhat.com> | 2015-02-11 00:33:02 -0500 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2015-02-11 00:33:02 -0500 |
commit | ae6d57d12ab3bc833a1a9ca252cc49280713181b (patch) | |
tree | 110434c4eb0720ab6e20b563c13309415cec20ca /drivers/gpu | |
parent | 2f8997902e64951228385ca1cebb0d2f16f99a23 (diff) | |
parent | 335f1a62c5a6334c4fc92c3c448d7648408d9b83 (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.c | 11 | ||||
-rw-r--r-- | drivers/gpu/drm/drm_sysfs.c | 132 | ||||
-rw-r--r-- | drivers/gpu/drm/exynos/exynos_drm_fimc.c | 14 | ||||
-rw-r--r-- | drivers/gpu/drm/exynos/exynos_drm_gsc.c | 6 | ||||
-rw-r--r-- | drivers/gpu/drm/exynos/exynos_drm_plane.c | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/exynos/exynos_mixer.c | 2 |
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 | ||
342 | static struct device_attribute connector_attrs[] = { | 342 | static DEVICE_ATTR_RO(status); |
343 | __ATTR_RO(status), | 343 | static DEVICE_ATTR_RO(enabled); |
344 | __ATTR_RO(enabled), | 344 | static DEVICE_ATTR_RO(dpms); |
345 | __ATTR_RO(dpms), | 345 | static DEVICE_ATTR_RO(modes); |
346 | __ATTR_RO(modes), | 346 | |
347 | static 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. */ |
350 | static struct device_attribute connector_attrs_opt1[] = { | 356 | static DEVICE_ATTR_RO(subconnector); |
351 | __ATTR_RO(subconnector), | 357 | static DEVICE_ATTR_RO(select_subconnector); |
352 | __ATTR_RO(select_subconnector), | 358 | |
359 | static struct attribute *connector_opt_dev_attrs[] = { | ||
360 | &dev_attr_subconnector.attr, | ||
361 | &dev_attr_select_subconnector.attr, | ||
362 | NULL | ||
353 | }; | 363 | }; |
354 | 364 | ||
365 | static 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 | |||
355 | static struct bin_attribute edid_attr = { | 387 | static 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 | ||
394 | static struct bin_attribute *connector_bin_attrs[] = { | ||
395 | &edid_attr, | ||
396 | NULL | ||
397 | }; | ||
398 | |||
399 | static const struct attribute_group connector_dev_group = { | ||
400 | .attrs = connector_dev_attrs, | ||
401 | .bin_attrs = connector_bin_attrs, | ||
402 | }; | ||
403 | |||
404 | static const struct attribute_group connector_opt_dev_group = { | ||
405 | .attrs = connector_opt_dev_attrs, | ||
406 | .is_visible = connector_opt_dev_is_visible, | ||
407 | }; | ||
408 | |||
409 | static 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 = { | |||
371 | int drm_sysfs_connector_add(struct drm_connector *connector) | 424 | int 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 | |||
432 | err_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 | |||
439 | out: | ||
440 | return ret; | ||
441 | } | 448 | } |
442 | 449 | ||
443 | /** | 450 | /** |
@@ -455,16 +462,11 @@ out: | |||
455 | */ | 462 | */ |
456 | void drm_sysfs_connector_remove(struct drm_connector *connector) | 463 | void 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; |