diff options
| -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 | ||||
| -rw-r--r-- | include/uapi/drm/drm_fourcc.h | 3 |
7 files changed, 78 insertions, 91 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; |
diff --git a/include/uapi/drm/drm_fourcc.h b/include/uapi/drm/drm_fourcc.h index 646ae5f39f42..a284f11a8ef5 100644 --- a/include/uapi/drm/drm_fourcc.h +++ b/include/uapi/drm/drm_fourcc.h | |||
| @@ -109,9 +109,6 @@ | |||
| 109 | #define DRM_FORMAT_NV24 fourcc_code('N', 'V', '2', '4') /* non-subsampled Cr:Cb plane */ | 109 | #define DRM_FORMAT_NV24 fourcc_code('N', 'V', '2', '4') /* non-subsampled Cr:Cb plane */ |
| 110 | #define DRM_FORMAT_NV42 fourcc_code('N', 'V', '4', '2') /* non-subsampled Cb:Cr plane */ | 110 | #define DRM_FORMAT_NV42 fourcc_code('N', 'V', '4', '2') /* non-subsampled Cb:Cr plane */ |
| 111 | 111 | ||
| 112 | /* special NV12 tiled format */ | ||
| 113 | #define DRM_FORMAT_NV12MT fourcc_code('T', 'M', '1', '2') /* 2x2 subsampled Cr:Cb plane 64x32 macroblocks */ | ||
| 114 | |||
| 115 | /* | 112 | /* |
| 116 | * 3 plane YCbCr | 113 | * 3 plane YCbCr |
| 117 | * index 0: Y plane, [7:0] Y | 114 | * index 0: Y plane, [7:0] Y |
