@@ -93,6 +93,29 @@ static const struct drm_private_state_funcs vc4_ctm_state_funcs = {
9393 .atomic_destroy_state = vc4_ctm_destroy_state ,
9494};
9595
96+ static void vc4_ctm_obj_fini (struct drm_device * dev , void * unused )
97+ {
98+ struct vc4_dev * vc4 = to_vc4_dev (dev );
99+
100+ drm_atomic_private_obj_fini (& vc4 -> ctm_manager );
101+ }
102+
103+ static int vc4_ctm_obj_init (struct vc4_dev * vc4 )
104+ {
105+ struct vc4_ctm_state * ctm_state ;
106+
107+ drm_modeset_lock_init (& vc4 -> ctm_state_lock );
108+
109+ ctm_state = kzalloc (sizeof (* ctm_state ), GFP_KERNEL );
110+ if (!ctm_state )
111+ return - ENOMEM ;
112+
113+ drm_atomic_private_obj_init (& vc4 -> base , & vc4 -> ctm_manager , & ctm_state -> base ,
114+ & vc4_ctm_state_funcs );
115+
116+ return drmm_add_action (& vc4 -> base , vc4_ctm_obj_fini , NULL );
117+ }
118+
96119/* Converts a DRM S31.32 value to the HW S0.9 format. */
97120static u16 vc4_ctm_s31_32_to_s0_9 (u64 in )
98121{
@@ -609,6 +632,34 @@ static const struct drm_private_state_funcs vc4_load_tracker_state_funcs = {
609632 .atomic_destroy_state = vc4_load_tracker_destroy_state ,
610633};
611634
635+ static void vc4_load_tracker_obj_fini (struct drm_device * dev , void * unused )
636+ {
637+ struct vc4_dev * vc4 = to_vc4_dev (dev );
638+
639+ if (!vc4 -> load_tracker_available )
640+ return ;
641+
642+ drm_atomic_private_obj_fini (& vc4 -> load_tracker );
643+ }
644+
645+ static int vc4_load_tracker_obj_init (struct vc4_dev * vc4 )
646+ {
647+ struct vc4_load_tracker_state * load_state ;
648+
649+ if (!vc4 -> load_tracker_available )
650+ return 0 ;
651+
652+ load_state = kzalloc (sizeof (* load_state ), GFP_KERNEL );
653+ if (!load_state )
654+ return - ENOMEM ;
655+
656+ drm_atomic_private_obj_init (& vc4 -> base , & vc4 -> load_tracker ,
657+ & load_state -> base ,
658+ & vc4_load_tracker_state_funcs );
659+
660+ return drmm_add_action (& vc4 -> base , vc4_load_tracker_obj_fini , NULL );
661+ }
662+
612663#define NUM_OUTPUTS 6
613664#define NUM_CHANNELS 3
614665
@@ -711,8 +762,6 @@ static const struct drm_mode_config_funcs vc4_mode_funcs = {
711762int vc4_kms_load (struct drm_device * dev )
712763{
713764 struct vc4_dev * vc4 = to_vc4_dev (dev );
714- struct vc4_ctm_state * ctm_state ;
715- struct vc4_load_tracker_state * load_state ;
716765 bool is_vc5 = of_device_is_compatible (dev -> dev -> of_node ,
717766 "brcm,bcm2711-vc5" );
718767 int ret ;
@@ -751,26 +800,13 @@ int vc4_kms_load(struct drm_device *dev)
751800 dev -> mode_config .async_page_flip = true;
752801 dev -> mode_config .allow_fb_modifiers = true;
753802
754- drm_modeset_lock_init (& vc4 -> ctm_state_lock );
755-
756- ctm_state = kzalloc (sizeof (* ctm_state ), GFP_KERNEL );
757- if (!ctm_state )
758- return - ENOMEM ;
759-
760- drm_atomic_private_obj_init (dev , & vc4 -> ctm_manager , & ctm_state -> base ,
761- & vc4_ctm_state_funcs );
762-
763- if (vc4 -> load_tracker_available ) {
764- load_state = kzalloc (sizeof (* load_state ), GFP_KERNEL );
765- if (!load_state ) {
766- drm_atomic_private_obj_fini (& vc4 -> ctm_manager );
767- return - ENOMEM ;
768- }
803+ ret = vc4_ctm_obj_init (vc4 );
804+ if (ret )
805+ return ret ;
769806
770- drm_atomic_private_obj_init (dev , & vc4 -> load_tracker ,
771- & load_state -> base ,
772- & vc4_load_tracker_state_funcs );
773- }
807+ ret = vc4_load_tracker_obj_init (vc4 );
808+ if (ret )
809+ return ret ;
774810
775811 drm_mode_config_reset (dev );
776812
0 commit comments