|
9 | 9 |
|
10 | 10 | #include "mgag200_drv.h" |
11 | 11 |
|
12 | | -static struct mgag200_bmc_connector *to_mgag200_bmc_connector(struct drm_connector *connector) |
13 | | -{ |
14 | | - return container_of(connector, struct mgag200_bmc_connector, base); |
15 | | -} |
16 | | - |
17 | 12 | void mgag200_bmc_stop_scanout(struct mga_device *mdev) |
18 | 13 | { |
19 | 14 | u8 tmp; |
@@ -102,100 +97,3 @@ void mgag200_bmc_start_scanout(struct mga_device *mdev) |
102 | 97 | tmp &= ~0x10; |
103 | 98 | WREG_DAC(MGA1064_GEN_IO_DATA, tmp); |
104 | 99 | } |
105 | | - |
106 | | -static const struct drm_encoder_funcs mgag200_bmc_encoder_funcs = { |
107 | | - .destroy = drm_encoder_cleanup, |
108 | | -}; |
109 | | - |
110 | | -static int mgag200_bmc_connector_helper_detect_ctx(struct drm_connector *connector, |
111 | | - struct drm_modeset_acquire_ctx *ctx, |
112 | | - bool force) |
113 | | -{ |
114 | | - struct mgag200_bmc_connector *bmc_connector = to_mgag200_bmc_connector(connector); |
115 | | - struct drm_connector *physical_connector = bmc_connector->physical_connector; |
116 | | - |
117 | | - /* |
118 | | - * Most user-space compositors cannot handle more than one connected |
119 | | - * connector per CRTC. Hence, we only mark the BMC as connected if the |
120 | | - * physical connector is disconnected. If the physical connector's status |
121 | | - * is connected or unknown, the BMC remains disconnected. This has no |
122 | | - * effect on the output of the BMC. |
123 | | - * |
124 | | - * FIXME: Remove this logic once user-space compositors can handle more |
125 | | - * than one connector per CRTC. The BMC should always be connected. |
126 | | - */ |
127 | | - |
128 | | - if (physical_connector && physical_connector->status == connector_status_disconnected) |
129 | | - return connector_status_connected; |
130 | | - |
131 | | - return connector_status_disconnected; |
132 | | -} |
133 | | - |
134 | | -static int mgag200_bmc_connector_helper_get_modes(struct drm_connector *connector) |
135 | | -{ |
136 | | - struct drm_device *dev = connector->dev; |
137 | | - struct mga_device *mdev = to_mga_device(dev); |
138 | | - const struct mgag200_device_info *minfo = mdev->info; |
139 | | - |
140 | | - return drm_add_modes_noedid(connector, minfo->max_hdisplay, minfo->max_vdisplay); |
141 | | -} |
142 | | - |
143 | | -static const struct drm_connector_helper_funcs mgag200_bmc_connector_helper_funcs = { |
144 | | - .get_modes = mgag200_bmc_connector_helper_get_modes, |
145 | | - .detect_ctx = mgag200_bmc_connector_helper_detect_ctx, |
146 | | -}; |
147 | | - |
148 | | -static const struct drm_connector_funcs mgag200_bmc_connector_funcs = { |
149 | | - .reset = drm_atomic_helper_connector_reset, |
150 | | - .fill_modes = drm_helper_probe_single_connector_modes, |
151 | | - .destroy = drm_connector_cleanup, |
152 | | - .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state, |
153 | | - .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, |
154 | | -}; |
155 | | - |
156 | | -static int mgag200_bmc_connector_init(struct drm_device *dev, |
157 | | - struct mgag200_bmc_connector *bmc_connector, |
158 | | - struct drm_connector *physical_connector) |
159 | | -{ |
160 | | - struct drm_connector *connector = &bmc_connector->base; |
161 | | - int ret; |
162 | | - |
163 | | - ret = drm_connector_init(dev, connector, &mgag200_bmc_connector_funcs, |
164 | | - DRM_MODE_CONNECTOR_VIRTUAL); |
165 | | - if (ret) |
166 | | - return ret; |
167 | | - drm_connector_helper_add(connector, &mgag200_bmc_connector_helper_funcs); |
168 | | - |
169 | | - bmc_connector->physical_connector = physical_connector; |
170 | | - |
171 | | - return 0; |
172 | | -} |
173 | | - |
174 | | -int mgag200_bmc_output_init(struct mga_device *mdev, struct drm_connector *physical_connector) |
175 | | -{ |
176 | | - struct drm_device *dev = &mdev->base; |
177 | | - struct drm_crtc *crtc = &mdev->crtc; |
178 | | - struct drm_encoder *encoder; |
179 | | - struct mgag200_bmc_connector *bmc_connector; |
180 | | - struct drm_connector *connector; |
181 | | - int ret; |
182 | | - |
183 | | - encoder = &mdev->output.bmc.encoder; |
184 | | - ret = drm_encoder_init(dev, encoder, &mgag200_bmc_encoder_funcs, |
185 | | - DRM_MODE_ENCODER_VIRTUAL, NULL); |
186 | | - if (ret) |
187 | | - return ret; |
188 | | - encoder->possible_crtcs = drm_crtc_mask(crtc); |
189 | | - |
190 | | - bmc_connector = &mdev->output.bmc.bmc_connector; |
191 | | - ret = mgag200_bmc_connector_init(dev, bmc_connector, physical_connector); |
192 | | - if (ret) |
193 | | - return ret; |
194 | | - connector = &bmc_connector->base; |
195 | | - |
196 | | - ret = drm_connector_attach_encoder(connector, encoder); |
197 | | - if (ret) |
198 | | - return ret; |
199 | | - |
200 | | - return 0; |
201 | | -} |
0 commit comments