Rev 4075 | Rev 4126 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 4075 | Rev 4104 | ||
---|---|---|---|
Line 255... | Line 255... | ||
255 | static void |
255 | static void |
256 | drm_encoder_disable(struct drm_encoder *encoder) |
256 | drm_encoder_disable(struct drm_encoder *encoder) |
257 | { |
257 | { |
258 | struct drm_encoder_helper_funcs *encoder_funcs = encoder->helper_private; |
258 | struct drm_encoder_helper_funcs *encoder_funcs = encoder->helper_private; |
Line -... | Line 259... | ||
- | 259 | ||
- | 260 | if (encoder->bridge) |
|
- | 261 | encoder->bridge->funcs->disable(encoder->bridge); |
|
259 | 262 | ||
260 | if (encoder_funcs->disable) |
263 | if (encoder_funcs->disable) |
261 | (*encoder_funcs->disable)(encoder); |
264 | (*encoder_funcs->disable)(encoder); |
262 | else |
265 | else |
- | 266 | (*encoder_funcs->dpms)(encoder, DRM_MODE_DPMS_OFF); |
|
- | 267 | ||
- | 268 | if (encoder->bridge) |
|
263 | (*encoder_funcs->dpms)(encoder, DRM_MODE_DPMS_OFF); |
269 | encoder->bridge->funcs->post_disable(encoder->bridge); |
Line 264... | Line 270... | ||
264 | } |
270 | } |
265 | 271 | ||
266 | /** |
272 | /** |
Line 422... | Line 428... | ||
422 | */ |
428 | */ |
423 | list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { |
429 | list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { |
Line 424... | Line 430... | ||
424 | 430 | ||
425 | if (encoder->crtc != crtc) |
431 | if (encoder->crtc != crtc) |
- | 432 | continue; |
|
- | 433 | ||
- | 434 | if (encoder->bridge && encoder->bridge->funcs->mode_fixup) { |
|
- | 435 | ret = encoder->bridge->funcs->mode_fixup( |
|
- | 436 | encoder->bridge, mode, adjusted_mode); |
|
- | 437 | if (!ret) { |
|
- | 438 | DRM_DEBUG_KMS("Bridge fixup failed\n"); |
|
- | 439 | goto done; |
|
- | 440 | } |
|
- | 441 | } |
|
426 | continue; |
442 | |
427 | encoder_funcs = encoder->helper_private; |
443 | encoder_funcs = encoder->helper_private; |
428 | if (!(ret = encoder_funcs->mode_fixup(encoder, mode, |
444 | if (!(ret = encoder_funcs->mode_fixup(encoder, mode, |
429 | adjusted_mode))) { |
445 | adjusted_mode))) { |
430 | DRM_DEBUG_KMS("Encoder fixup failed\n"); |
446 | DRM_DEBUG_KMS("Encoder fixup failed\n"); |
Line 441... | Line 457... | ||
441 | /* Prepare the encoders and CRTCs before setting the mode. */ |
457 | /* Prepare the encoders and CRTCs before setting the mode. */ |
442 | list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { |
458 | list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { |
Line 443... | Line 459... | ||
443 | 459 | ||
444 | if (encoder->crtc != crtc) |
460 | if (encoder->crtc != crtc) |
- | 461 | continue; |
|
- | 462 | ||
- | 463 | if (encoder->bridge) |
|
- | 464 | encoder->bridge->funcs->disable(encoder->bridge); |
|
445 | continue; |
465 | |
446 | encoder_funcs = encoder->helper_private; |
466 | encoder_funcs = encoder->helper_private; |
447 | /* Disable the encoders as the first thing we do. */ |
467 | /* Disable the encoders as the first thing we do. */ |
- | 468 | encoder_funcs->prepare(encoder); |
|
- | 469 | ||
- | 470 | if (encoder->bridge) |
|
448 | encoder_funcs->prepare(encoder); |
471 | encoder->bridge->funcs->post_disable(encoder->bridge); |
Line 449... | Line 472... | ||
449 | } |
472 | } |
Line 450... | Line 473... | ||
450 | 473 | ||
Line 467... | Line 490... | ||
467 | DRM_DEBUG_KMS("[ENCODER:%d:%s] set [MODE:%d:%s]\n", |
490 | DRM_DEBUG_KMS("[ENCODER:%d:%s] set [MODE:%d:%s]\n", |
468 | encoder->base.id, drm_get_encoder_name(encoder), |
491 | encoder->base.id, drm_get_encoder_name(encoder), |
469 | mode->base.id, mode->name); |
492 | mode->base.id, mode->name); |
470 | encoder_funcs = encoder->helper_private; |
493 | encoder_funcs = encoder->helper_private; |
471 | encoder_funcs->mode_set(encoder, mode, adjusted_mode); |
494 | encoder_funcs->mode_set(encoder, mode, adjusted_mode); |
- | 495 | ||
- | 496 | if (encoder->bridge && encoder->bridge->funcs->mode_set) |
|
- | 497 | encoder->bridge->funcs->mode_set(encoder->bridge, mode, |
|
- | 498 | adjusted_mode); |
|
472 | } |
499 | } |
Line 473... | Line 500... | ||
473 | 500 | ||
474 | /* Now enable the clocks, plane, pipe, and connectors that we set up. */ |
501 | /* Now enable the clocks, plane, pipe, and connectors that we set up. */ |
Line 475... | Line 502... | ||
475 | crtc_funcs->commit(crtc); |
502 | crtc_funcs->commit(crtc); |
Line 476... | Line 503... | ||
476 | 503 | ||
477 | list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { |
504 | list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { |
Line -... | Line 505... | ||
- | 505 | ||
- | 506 | if (encoder->crtc != crtc) |
|
- | 507 | continue; |
|
478 | 508 | ||
479 | if (encoder->crtc != crtc) |
509 | if (encoder->bridge) |
Line -... | Line 510... | ||
- | 510 | encoder->bridge->funcs->pre_enable(encoder->bridge); |
|
- | 511 | ||
480 | continue; |
512 | encoder_funcs = encoder->helper_private; |
Line 481... | Line 513... | ||
481 | 513 | encoder_funcs->commit(encoder); |
|
482 | encoder_funcs = encoder->helper_private; |
514 | |
Line 828... | Line 860... | ||
828 | if (connector->dpms < dpms) |
860 | if (connector->dpms < dpms) |
829 | dpms = connector->dpms; |
861 | dpms = connector->dpms; |
830 | return dpms; |
862 | return dpms; |
831 | } |
863 | } |
Line -... | Line 864... | ||
- | 864 | ||
- | 865 | /* Helper which handles bridge ordering around encoder dpms */ |
|
- | 866 | static void drm_helper_encoder_dpms(struct drm_encoder *encoder, int mode) |
|
- | 867 | { |
|
- | 868 | struct drm_bridge *bridge = encoder->bridge; |
|
- | 869 | struct drm_encoder_helper_funcs *encoder_funcs; |
|
- | 870 | ||
- | 871 | if (bridge) { |
|
- | 872 | if (mode == DRM_MODE_DPMS_ON) |
|
- | 873 | bridge->funcs->pre_enable(bridge); |
|
- | 874 | else |
|
- | 875 | bridge->funcs->disable(bridge); |
|
- | 876 | } |
|
- | 877 | ||
- | 878 | encoder_funcs = encoder->helper_private; |
|
- | 879 | if (encoder_funcs->dpms) |
|
- | 880 | encoder_funcs->dpms(encoder, mode); |
|
- | 881 | ||
- | 882 | if (bridge) { |
|
- | 883 | if (mode == DRM_MODE_DPMS_ON) |
|
- | 884 | bridge->funcs->enable(bridge); |
|
- | 885 | else |
|
- | 886 | bridge->funcs->post_disable(bridge); |
|
- | 887 | } |
|
- | 888 | } |
|
832 | 889 | ||
833 | static int drm_helper_choose_crtc_dpms(struct drm_crtc *crtc) |
890 | static int drm_helper_choose_crtc_dpms(struct drm_crtc *crtc) |
834 | { |
891 | { |
835 | int dpms = DRM_MODE_DPMS_OFF; |
892 | int dpms = DRM_MODE_DPMS_OFF; |
836 | struct drm_connector *connector; |
893 | struct drm_connector *connector; |
Line 855... | Line 912... | ||
855 | */ |
912 | */ |
856 | void drm_helper_connector_dpms(struct drm_connector *connector, int mode) |
913 | void drm_helper_connector_dpms(struct drm_connector *connector, int mode) |
857 | { |
914 | { |
858 | struct drm_encoder *encoder = connector->encoder; |
915 | struct drm_encoder *encoder = connector->encoder; |
859 | struct drm_crtc *crtc = encoder ? encoder->crtc : NULL; |
916 | struct drm_crtc *crtc = encoder ? encoder->crtc : NULL; |
860 | int old_dpms; |
917 | int old_dpms, encoder_dpms = DRM_MODE_DPMS_OFF; |
Line 861... | Line 918... | ||
861 | 918 | ||
862 | if (mode == connector->dpms) |
919 | if (mode == connector->dpms) |
Line 863... | Line 920... | ||
863 | return; |
920 | return; |
864 | 921 | ||
Line -... | Line 922... | ||
- | 922 | old_dpms = connector->dpms; |
|
- | 923 | connector->dpms = mode; |
|
- | 924 | ||
865 | old_dpms = connector->dpms; |
925 | if (encoder) |
866 | connector->dpms = mode; |
926 | encoder_dpms = drm_helper_choose_encoder_dpms(encoder); |
867 | 927 | ||
868 | /* from off to on, do crtc then encoder */ |
928 | /* from off to on, do crtc then encoder */ |
869 | if (mode < old_dpms) { |
929 | if (mode < old_dpms) { |
870 | if (crtc) { |
930 | if (crtc) { |
871 | struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private; |
931 | struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private; |
872 | if (crtc_funcs->dpms) |
932 | if (crtc_funcs->dpms) |
873 | (*crtc_funcs->dpms) (crtc, |
933 | (*crtc_funcs->dpms) (crtc, |
874 | drm_helper_choose_crtc_dpms(crtc)); |
- | |
875 | } |
- | |
876 | if (encoder) { |
- | |
877 | struct drm_encoder_helper_funcs *encoder_funcs = encoder->helper_private; |
934 | drm_helper_choose_crtc_dpms(crtc)); |
878 | if (encoder_funcs->dpms) |
- | |
879 | (*encoder_funcs->dpms) (encoder, |
935 | } |
Line 880... | Line 936... | ||
880 | drm_helper_choose_encoder_dpms(encoder)); |
936 | if (encoder) |
881 | } |
937 | drm_helper_encoder_dpms(encoder, encoder_dpms); |
882 | } |
938 | } |
883 | - | ||
884 | /* from on to off, do encoder then crtc */ |
- | |
885 | if (mode > old_dpms) { |
- | |
886 | if (encoder) { |
939 | |
887 | struct drm_encoder_helper_funcs *encoder_funcs = encoder->helper_private; |
- | |
888 | if (encoder_funcs->dpms) |
940 | /* from on to off, do encoder then crtc */ |
889 | (*encoder_funcs->dpms) (encoder, |
941 | if (mode > old_dpms) { |
890 | drm_helper_choose_encoder_dpms(encoder)); |
942 | if (encoder) |
891 | } |
943 | drm_helper_encoder_dpms(encoder, encoder_dpms); |
892 | if (crtc) { |
944 | if (crtc) { |
Line 922... | Line 974... | ||
922 | 974 | ||
923 | int drm_helper_resume_force_mode(struct drm_device *dev) |
975 | int drm_helper_resume_force_mode(struct drm_device *dev) |
924 | { |
976 | { |
925 | struct drm_crtc *crtc; |
977 | struct drm_crtc *crtc; |
926 | struct drm_encoder *encoder; |
- | |
927 | struct drm_encoder_helper_funcs *encoder_funcs; |
978 | struct drm_encoder *encoder; |
928 | struct drm_crtc_helper_funcs *crtc_funcs; |
979 | struct drm_crtc_helper_funcs *crtc_funcs; |
Line 929... | Line 980... | ||
929 | int ret; |
980 | int ret, encoder_dpms; |
Line 930... | Line 981... | ||
930 | 981 | ||
931 | list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { |
982 | list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { |
Line 944... | Line 995... | ||
944 | list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { |
995 | list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { |
Line 945... | Line 996... | ||
945 | 996 | ||
946 | if(encoder->crtc != crtc) |
997 | if(encoder->crtc != crtc) |
Line 947... | Line 998... | ||
947 | continue; |
998 | continue; |
948 | 999 | ||
949 | encoder_funcs = encoder->helper_private; |
- | |
- | 1000 | encoder_dpms = drm_helper_choose_encoder_dpms( |
|
950 | if (encoder_funcs->dpms) |
1001 | encoder); |
951 | (*encoder_funcs->dpms) (encoder, |
1002 | |
Line 952... | Line 1003... | ||
952 | drm_helper_choose_encoder_dpms(encoder)); |
1003 | drm_helper_encoder_dpms(encoder, encoder_dpms); |
953 | } |
1004 | } |
954 | 1005 |