diff options
author | Andrzej Hajda <a.hajda@samsung.com> | 2017-09-29 06:05:36 -0400 |
---|---|---|
committer | Inki Dae <inki.dae@samsung.com> | 2017-10-25 20:06:32 -0400 |
commit | 524c59f1b79885154c2424aac00ed66f6a6eac29 (patch) | |
tree | 57c044f2b296c9bae1ae923047daba0c44cd6f94 | |
parent | 6ace38a52783705038e312220eb5d31237866fec (diff) |
drm/exynos/mixer: remove mixer_resources sub-structure
mixer_resources adds only unnecessary redirection, removing it makes the
code shorter and cleaner.
Signed-off-by: Andrzej Hajda <a.hajda@samsung.com>
Reviewed-by: Tobias Jakobi <tjakobi@math.uni-bielefeld.de>
Signed-off-by: Inki Dae <inki.dae@samsung.com>
-rw-r--r-- | drivers/gpu/drm/exynos/exynos_mixer.c | 324 |
1 files changed, 148 insertions, 176 deletions
diff --git a/drivers/gpu/drm/exynos/exynos_mixer.c b/drivers/gpu/drm/exynos/exynos_mixer.c index fba120346189..c0e92021748b 100644 --- a/drivers/gpu/drm/exynos/exynos_mixer.c +++ b/drivers/gpu/drm/exynos/exynos_mixer.c | |||
@@ -67,19 +67,6 @@ | |||
67 | #define MXR_FORMAT_ARGB4444 6 | 67 | #define MXR_FORMAT_ARGB4444 6 |
68 | #define MXR_FORMAT_ARGB8888 7 | 68 | #define MXR_FORMAT_ARGB8888 7 |
69 | 69 | ||
70 | struct mixer_resources { | ||
71 | int irq; | ||
72 | void __iomem *mixer_regs; | ||
73 | void __iomem *vp_regs; | ||
74 | spinlock_t reg_slock; | ||
75 | struct clk *mixer; | ||
76 | struct clk *vp; | ||
77 | struct clk *hdmi; | ||
78 | struct clk *sclk_mixer; | ||
79 | struct clk *sclk_hdmi; | ||
80 | struct clk *mout_mixer; | ||
81 | }; | ||
82 | |||
83 | enum mixer_version_id { | 70 | enum mixer_version_id { |
84 | MXR_VER_0_0_0_16, | 71 | MXR_VER_0_0_0_16, |
85 | MXR_VER_16_0_33_0, | 72 | MXR_VER_16_0_33_0, |
@@ -117,7 +104,16 @@ struct mixer_context { | |||
117 | struct exynos_drm_plane planes[MIXER_WIN_NR]; | 104 | struct exynos_drm_plane planes[MIXER_WIN_NR]; |
118 | unsigned long flags; | 105 | unsigned long flags; |
119 | 106 | ||
120 | struct mixer_resources mixer_res; | 107 | int irq; |
108 | void __iomem *mixer_regs; | ||
109 | void __iomem *vp_regs; | ||
110 | spinlock_t reg_slock; | ||
111 | struct clk *mixer; | ||
112 | struct clk *vp; | ||
113 | struct clk *hdmi; | ||
114 | struct clk *sclk_mixer; | ||
115 | struct clk *sclk_hdmi; | ||
116 | struct clk *mout_mixer; | ||
121 | enum mixer_version_id mxr_ver; | 117 | enum mixer_version_id mxr_ver; |
122 | }; | 118 | }; |
123 | 119 | ||
@@ -194,44 +190,44 @@ static inline bool is_alpha_format(unsigned int pixel_format) | |||
194 | } | 190 | } |
195 | } | 191 | } |
196 | 192 | ||
197 | static inline u32 vp_reg_read(struct mixer_resources *res, u32 reg_id) | 193 | static inline u32 vp_reg_read(struct mixer_context *ctx, u32 reg_id) |
198 | { | 194 | { |
199 | return readl(res->vp_regs + reg_id); | 195 | return readl(ctx->vp_regs + reg_id); |
200 | } | 196 | } |
201 | 197 | ||
202 | static inline void vp_reg_write(struct mixer_resources *res, u32 reg_id, | 198 | static inline void vp_reg_write(struct mixer_context *ctx, u32 reg_id, |
203 | u32 val) | 199 | u32 val) |
204 | { | 200 | { |
205 | writel(val, res->vp_regs + reg_id); | 201 | writel(val, ctx->vp_regs + reg_id); |
206 | } | 202 | } |
207 | 203 | ||
208 | static inline void vp_reg_writemask(struct mixer_resources *res, u32 reg_id, | 204 | static inline void vp_reg_writemask(struct mixer_context *ctx, u32 reg_id, |
209 | u32 val, u32 mask) | 205 | u32 val, u32 mask) |
210 | { | 206 | { |
211 | u32 old = vp_reg_read(res, reg_id); | 207 | u32 old = vp_reg_read(ctx, reg_id); |
212 | 208 | ||
213 | val = (val & mask) | (old & ~mask); | 209 | val = (val & mask) | (old & ~mask); |
214 | writel(val, res->vp_regs + reg_id); | 210 | writel(val, ctx->vp_regs + reg_id); |
215 | } | 211 | } |
216 | 212 | ||
217 | static inline u32 mixer_reg_read(struct mixer_resources *res, u32 reg_id) | 213 | static inline u32 mixer_reg_read(struct mixer_context *ctx, u32 reg_id) |
218 | { | 214 | { |
219 | return readl(res->mixer_regs + reg_id); | 215 | return readl(ctx->mixer_regs + reg_id); |
220 | } | 216 | } |
221 | 217 | ||
222 | static inline void mixer_reg_write(struct mixer_resources *res, u32 reg_id, | 218 | static inline void mixer_reg_write(struct mixer_context *ctx, u32 reg_id, |
223 | u32 val) | 219 | u32 val) |
224 | { | 220 | { |
225 | writel(val, res->mixer_regs + reg_id); | 221 | writel(val, ctx->mixer_regs + reg_id); |
226 | } | 222 | } |
227 | 223 | ||
228 | static inline void mixer_reg_writemask(struct mixer_resources *res, | 224 | static inline void mixer_reg_writemask(struct mixer_context *ctx, |
229 | u32 reg_id, u32 val, u32 mask) | 225 | u32 reg_id, u32 val, u32 mask) |
230 | { | 226 | { |
231 | u32 old = mixer_reg_read(res, reg_id); | 227 | u32 old = mixer_reg_read(ctx, reg_id); |
232 | 228 | ||
233 | val = (val & mask) | (old & ~mask); | 229 | val = (val & mask) | (old & ~mask); |
234 | writel(val, res->mixer_regs + reg_id); | 230 | writel(val, ctx->mixer_regs + reg_id); |
235 | } | 231 | } |
236 | 232 | ||
237 | static void mixer_regs_dump(struct mixer_context *ctx) | 233 | static void mixer_regs_dump(struct mixer_context *ctx) |
@@ -239,7 +235,7 @@ static void mixer_regs_dump(struct mixer_context *ctx) | |||
239 | #define DUMPREG(reg_id) \ | 235 | #define DUMPREG(reg_id) \ |
240 | do { \ | 236 | do { \ |
241 | DRM_DEBUG_KMS(#reg_id " = %08x\n", \ | 237 | DRM_DEBUG_KMS(#reg_id " = %08x\n", \ |
242 | (u32)readl(ctx->mixer_res.mixer_regs + reg_id)); \ | 238 | (u32)readl(ctx->mixer_regs + reg_id)); \ |
243 | } while (0) | 239 | } while (0) |
244 | 240 | ||
245 | DUMPREG(MXR_STATUS); | 241 | DUMPREG(MXR_STATUS); |
@@ -271,7 +267,7 @@ static void vp_regs_dump(struct mixer_context *ctx) | |||
271 | #define DUMPREG(reg_id) \ | 267 | #define DUMPREG(reg_id) \ |
272 | do { \ | 268 | do { \ |
273 | DRM_DEBUG_KMS(#reg_id " = %08x\n", \ | 269 | DRM_DEBUG_KMS(#reg_id " = %08x\n", \ |
274 | (u32) readl(ctx->mixer_res.vp_regs + reg_id)); \ | 270 | (u32) readl(ctx->vp_regs + reg_id)); \ |
275 | } while (0) | 271 | } while (0) |
276 | 272 | ||
277 | DUMPREG(VP_ENABLE); | 273 | DUMPREG(VP_ENABLE); |
@@ -301,7 +297,7 @@ do { \ | |||
301 | #undef DUMPREG | 297 | #undef DUMPREG |
302 | } | 298 | } |
303 | 299 | ||
304 | static inline void vp_filter_set(struct mixer_resources *res, | 300 | static inline void vp_filter_set(struct mixer_context *ctx, |
305 | int reg_id, const u8 *data, unsigned int size) | 301 | int reg_id, const u8 *data, unsigned int size) |
306 | { | 302 | { |
307 | /* assure 4-byte align */ | 303 | /* assure 4-byte align */ |
@@ -309,24 +305,23 @@ static inline void vp_filter_set(struct mixer_resources *res, | |||
309 | for (; size; size -= 4, reg_id += 4, data += 4) { | 305 | for (; size; size -= 4, reg_id += 4, data += 4) { |
310 | u32 val = (data[0] << 24) | (data[1] << 16) | | 306 | u32 val = (data[0] << 24) | (data[1] << 16) | |
311 | (data[2] << 8) | data[3]; | 307 | (data[2] << 8) | data[3]; |
312 | vp_reg_write(res, reg_id, val); | 308 | vp_reg_write(ctx, reg_id, val); |
313 | } | 309 | } |
314 | } | 310 | } |
315 | 311 | ||
316 | static void vp_default_filter(struct mixer_resources *res) | 312 | static void vp_default_filter(struct mixer_context *ctx) |
317 | { | 313 | { |
318 | vp_filter_set(res, VP_POLY8_Y0_LL, | 314 | vp_filter_set(ctx, VP_POLY8_Y0_LL, |
319 | filter_y_horiz_tap8, sizeof(filter_y_horiz_tap8)); | 315 | filter_y_horiz_tap8, sizeof(filter_y_horiz_tap8)); |
320 | vp_filter_set(res, VP_POLY4_Y0_LL, | 316 | vp_filter_set(ctx, VP_POLY4_Y0_LL, |
321 | filter_y_vert_tap4, sizeof(filter_y_vert_tap4)); | 317 | filter_y_vert_tap4, sizeof(filter_y_vert_tap4)); |
322 | vp_filter_set(res, VP_POLY4_C0_LL, | 318 | vp_filter_set(ctx, VP_POLY4_C0_LL, |
323 | filter_cr_horiz_tap4, sizeof(filter_cr_horiz_tap4)); | 319 | filter_cr_horiz_tap4, sizeof(filter_cr_horiz_tap4)); |
324 | } | 320 | } |
325 | 321 | ||
326 | static void mixer_cfg_gfx_blend(struct mixer_context *ctx, unsigned int win, | 322 | static void mixer_cfg_gfx_blend(struct mixer_context *ctx, unsigned int win, |
327 | bool alpha) | 323 | bool alpha) |
328 | { | 324 | { |
329 | struct mixer_resources *res = &ctx->mixer_res; | ||
330 | u32 val; | 325 | u32 val; |
331 | 326 | ||
332 | val = MXR_GRP_CFG_COLOR_KEY_DISABLE; /* no blank key */ | 327 | val = MXR_GRP_CFG_COLOR_KEY_DISABLE; /* no blank key */ |
@@ -335,13 +330,12 @@ static void mixer_cfg_gfx_blend(struct mixer_context *ctx, unsigned int win, | |||
335 | val |= MXR_GRP_CFG_BLEND_PRE_MUL; | 330 | val |= MXR_GRP_CFG_BLEND_PRE_MUL; |
336 | val |= MXR_GRP_CFG_PIXEL_BLEND_EN; | 331 | val |= MXR_GRP_CFG_PIXEL_BLEND_EN; |
337 | } | 332 | } |
338 | mixer_reg_writemask(res, MXR_GRAPHIC_CFG(win), | 333 | mixer_reg_writemask(ctx, MXR_GRAPHIC_CFG(win), |
339 | val, MXR_GRP_CFG_MISC_MASK); | 334 | val, MXR_GRP_CFG_MISC_MASK); |
340 | } | 335 | } |
341 | 336 | ||
342 | static void mixer_cfg_vp_blend(struct mixer_context *ctx) | 337 | static void mixer_cfg_vp_blend(struct mixer_context *ctx) |
343 | { | 338 | { |
344 | struct mixer_resources *res = &ctx->mixer_res; | ||
345 | u32 val; | 339 | u32 val; |
346 | 340 | ||
347 | /* | 341 | /* |
@@ -351,25 +345,22 @@ static void mixer_cfg_vp_blend(struct mixer_context *ctx) | |||
351 | * support blending of the video layer through this. | 345 | * support blending of the video layer through this. |
352 | */ | 346 | */ |
353 | val = 0; | 347 | val = 0; |
354 | mixer_reg_write(res, MXR_VIDEO_CFG, val); | 348 | mixer_reg_write(ctx, MXR_VIDEO_CFG, val); |
355 | } | 349 | } |
356 | 350 | ||
357 | static void mixer_vsync_set_update(struct mixer_context *ctx, bool enable) | 351 | static void mixer_vsync_set_update(struct mixer_context *ctx, bool enable) |
358 | { | 352 | { |
359 | struct mixer_resources *res = &ctx->mixer_res; | ||
360 | |||
361 | /* block update on vsync */ | 353 | /* block update on vsync */ |
362 | mixer_reg_writemask(res, MXR_STATUS, enable ? | 354 | mixer_reg_writemask(ctx, MXR_STATUS, enable ? |
363 | MXR_STATUS_SYNC_ENABLE : 0, MXR_STATUS_SYNC_ENABLE); | 355 | MXR_STATUS_SYNC_ENABLE : 0, MXR_STATUS_SYNC_ENABLE); |
364 | 356 | ||
365 | if (test_bit(MXR_BIT_VP_ENABLED, &ctx->flags)) | 357 | if (test_bit(MXR_BIT_VP_ENABLED, &ctx->flags)) |
366 | vp_reg_write(res, VP_SHADOW_UPDATE, enable ? | 358 | vp_reg_write(ctx, VP_SHADOW_UPDATE, enable ? |
367 | VP_SHADOW_UPDATE_ENABLE : 0); | 359 | VP_SHADOW_UPDATE_ENABLE : 0); |
368 | } | 360 | } |
369 | 361 | ||
370 | static void mixer_cfg_scan(struct mixer_context *ctx, int width, int height) | 362 | static void mixer_cfg_scan(struct mixer_context *ctx, int width, int height) |
371 | { | 363 | { |
372 | struct mixer_resources *res = &ctx->mixer_res; | ||
373 | u32 val; | 364 | u32 val; |
374 | 365 | ||
375 | /* choosing between interlace and progressive mode */ | 366 | /* choosing between interlace and progressive mode */ |
@@ -378,7 +369,7 @@ static void mixer_cfg_scan(struct mixer_context *ctx, int width, int height) | |||
378 | 369 | ||
379 | /* setup display size */ | 370 | /* setup display size */ |
380 | if (ctx->mxr_ver == MXR_VER_128_0_0_184) { | 371 | if (ctx->mxr_ver == MXR_VER_128_0_0_184) { |
381 | mixer_reg_write(&ctx->mixer_res, MXR_RESOLUTION, | 372 | mixer_reg_write(ctx, MXR_RESOLUTION, |
382 | MXR_MXR_RES_HEIGHT(height) | MXR_MXR_RES_WIDTH(width)); | 373 | MXR_MXR_RES_HEIGHT(height) | MXR_MXR_RES_WIDTH(width)); |
383 | } else { | 374 | } else { |
384 | /* choosing between proper HD and SD mode */ | 375 | /* choosing between proper HD and SD mode */ |
@@ -394,12 +385,11 @@ static void mixer_cfg_scan(struct mixer_context *ctx, int width, int height) | |||
394 | val |= MXR_CFG_SCAN_HD_720 | MXR_CFG_SCAN_HD; | 385 | val |= MXR_CFG_SCAN_HD_720 | MXR_CFG_SCAN_HD; |
395 | } | 386 | } |
396 | 387 | ||
397 | mixer_reg_writemask(res, MXR_CFG, val, MXR_CFG_SCAN_MASK); | 388 | mixer_reg_writemask(ctx, MXR_CFG, val, MXR_CFG_SCAN_MASK); |
398 | } | 389 | } |
399 | 390 | ||
400 | static void mixer_cfg_rgb_fmt(struct mixer_context *ctx, unsigned int height) | 391 | static void mixer_cfg_rgb_fmt(struct mixer_context *ctx, unsigned int height) |
401 | { | 392 | { |
402 | struct mixer_resources *res = &ctx->mixer_res; | ||
403 | u32 val; | 393 | u32 val; |
404 | 394 | ||
405 | switch (height) { | 395 | switch (height) { |
@@ -412,45 +402,44 @@ static void mixer_cfg_rgb_fmt(struct mixer_context *ctx, unsigned int height) | |||
412 | default: | 402 | default: |
413 | val = MXR_CFG_RGB709_16_235; | 403 | val = MXR_CFG_RGB709_16_235; |
414 | /* Configure the BT.709 CSC matrix for full range RGB. */ | 404 | /* Configure the BT.709 CSC matrix for full range RGB. */ |
415 | mixer_reg_write(res, MXR_CM_COEFF_Y, | 405 | mixer_reg_write(ctx, MXR_CM_COEFF_Y, |
416 | MXR_CSC_CT( 0.184, 0.614, 0.063) | | 406 | MXR_CSC_CT( 0.184, 0.614, 0.063) | |
417 | MXR_CM_COEFF_RGB_FULL); | 407 | MXR_CM_COEFF_RGB_FULL); |
418 | mixer_reg_write(res, MXR_CM_COEFF_CB, | 408 | mixer_reg_write(ctx, MXR_CM_COEFF_CB, |
419 | MXR_CSC_CT(-0.102, -0.338, 0.440)); | 409 | MXR_CSC_CT(-0.102, -0.338, 0.440)); |
420 | mixer_reg_write(res, MXR_CM_COEFF_CR, | 410 | mixer_reg_write(ctx, MXR_CM_COEFF_CR, |
421 | MXR_CSC_CT( 0.440, -0.399, -0.040)); | 411 | MXR_CSC_CT( 0.440, -0.399, -0.040)); |
422 | break; | 412 | break; |
423 | } | 413 | } |
424 | 414 | ||
425 | mixer_reg_writemask(res, MXR_CFG, val, MXR_CFG_RGB_FMT_MASK); | 415 | mixer_reg_writemask(ctx, MXR_CFG, val, MXR_CFG_RGB_FMT_MASK); |
426 | } | 416 | } |
427 | 417 | ||
428 | static void mixer_cfg_layer(struct mixer_context *ctx, unsigned int win, | 418 | static void mixer_cfg_layer(struct mixer_context *ctx, unsigned int win, |
429 | unsigned int priority, bool enable) | 419 | unsigned int priority, bool enable) |
430 | { | 420 | { |
431 | struct mixer_resources *res = &ctx->mixer_res; | ||
432 | u32 val = enable ? ~0 : 0; | 421 | u32 val = enable ? ~0 : 0; |
433 | 422 | ||
434 | switch (win) { | 423 | switch (win) { |
435 | case 0: | 424 | case 0: |
436 | mixer_reg_writemask(res, MXR_CFG, val, MXR_CFG_GRP0_ENABLE); | 425 | mixer_reg_writemask(ctx, MXR_CFG, val, MXR_CFG_GRP0_ENABLE); |
437 | mixer_reg_writemask(res, MXR_LAYER_CFG, | 426 | mixer_reg_writemask(ctx, MXR_LAYER_CFG, |
438 | MXR_LAYER_CFG_GRP0_VAL(priority), | 427 | MXR_LAYER_CFG_GRP0_VAL(priority), |
439 | MXR_LAYER_CFG_GRP0_MASK); | 428 | MXR_LAYER_CFG_GRP0_MASK); |
440 | break; | 429 | break; |
441 | case 1: | 430 | case 1: |
442 | mixer_reg_writemask(res, MXR_CFG, val, MXR_CFG_GRP1_ENABLE); | 431 | mixer_reg_writemask(ctx, MXR_CFG, val, MXR_CFG_GRP1_ENABLE); |
443 | mixer_reg_writemask(res, MXR_LAYER_CFG, | 432 | mixer_reg_writemask(ctx, MXR_LAYER_CFG, |
444 | MXR_LAYER_CFG_GRP1_VAL(priority), | 433 | MXR_LAYER_CFG_GRP1_VAL(priority), |
445 | MXR_LAYER_CFG_GRP1_MASK); | 434 | MXR_LAYER_CFG_GRP1_MASK); |
446 | 435 | ||
447 | break; | 436 | break; |
448 | case VP_DEFAULT_WIN: | 437 | case VP_DEFAULT_WIN: |
449 | if (test_bit(MXR_BIT_VP_ENABLED, &ctx->flags)) { | 438 | if (test_bit(MXR_BIT_VP_ENABLED, &ctx->flags)) { |
450 | vp_reg_writemask(res, VP_ENABLE, val, VP_ENABLE_ON); | 439 | vp_reg_writemask(ctx, VP_ENABLE, val, VP_ENABLE_ON); |
451 | mixer_reg_writemask(res, MXR_CFG, val, | 440 | mixer_reg_writemask(ctx, MXR_CFG, val, |
452 | MXR_CFG_VP_ENABLE); | 441 | MXR_CFG_VP_ENABLE); |
453 | mixer_reg_writemask(res, MXR_LAYER_CFG, | 442 | mixer_reg_writemask(ctx, MXR_LAYER_CFG, |
454 | MXR_LAYER_CFG_VP_VAL(priority), | 443 | MXR_LAYER_CFG_VP_VAL(priority), |
455 | MXR_LAYER_CFG_VP_MASK); | 444 | MXR_LAYER_CFG_VP_MASK); |
456 | } | 445 | } |
@@ -460,19 +449,16 @@ static void mixer_cfg_layer(struct mixer_context *ctx, unsigned int win, | |||
460 | 449 | ||
461 | static void mixer_run(struct mixer_context *ctx) | 450 | static void mixer_run(struct mixer_context *ctx) |
462 | { | 451 | { |
463 | struct mixer_resources *res = &ctx->mixer_res; | 452 | mixer_reg_writemask(ctx, MXR_STATUS, ~0, MXR_STATUS_REG_RUN); |
464 | |||
465 | mixer_reg_writemask(res, MXR_STATUS, ~0, MXR_STATUS_REG_RUN); | ||
466 | } | 453 | } |
467 | 454 | ||
468 | static void mixer_stop(struct mixer_context *ctx) | 455 | static void mixer_stop(struct mixer_context *ctx) |
469 | { | 456 | { |
470 | struct mixer_resources *res = &ctx->mixer_res; | ||
471 | int timeout = 20; | 457 | int timeout = 20; |
472 | 458 | ||
473 | mixer_reg_writemask(res, MXR_STATUS, 0, MXR_STATUS_REG_RUN); | 459 | mixer_reg_writemask(ctx, MXR_STATUS, 0, MXR_STATUS_REG_RUN); |
474 | 460 | ||
475 | while (!(mixer_reg_read(res, MXR_STATUS) & MXR_STATUS_REG_IDLE) && | 461 | while (!(mixer_reg_read(ctx, MXR_STATUS) & MXR_STATUS_REG_IDLE) && |
476 | --timeout) | 462 | --timeout) |
477 | usleep_range(10000, 12000); | 463 | usleep_range(10000, 12000); |
478 | } | 464 | } |
@@ -496,7 +482,6 @@ static void vp_video_buffer(struct mixer_context *ctx, | |||
496 | { | 482 | { |
497 | struct exynos_drm_plane_state *state = | 483 | struct exynos_drm_plane_state *state = |
498 | to_exynos_plane_state(plane->base.state); | 484 | to_exynos_plane_state(plane->base.state); |
499 | struct mixer_resources *res = &ctx->mixer_res; | ||
500 | struct drm_framebuffer *fb = state->base.fb; | 485 | struct drm_framebuffer *fb = state->base.fb; |
501 | unsigned int priority = state->base.normalized_zpos + 1; | 486 | unsigned int priority = state->base.normalized_zpos + 1; |
502 | unsigned long flags; | 487 | unsigned long flags; |
@@ -523,55 +508,55 @@ static void vp_video_buffer(struct mixer_context *ctx, | |||
523 | chroma_addr[1] = 0; | 508 | chroma_addr[1] = 0; |
524 | } | 509 | } |
525 | 510 | ||
526 | spin_lock_irqsave(&res->reg_slock, flags); | 511 | spin_lock_irqsave(&ctx->reg_slock, flags); |
527 | 512 | ||
528 | /* interlace or progressive scan mode */ | 513 | /* interlace or progressive scan mode */ |
529 | val = (test_bit(MXR_BIT_INTERLACE, &ctx->flags) ? ~0 : 0); | 514 | val = (test_bit(MXR_BIT_INTERLACE, &ctx->flags) ? ~0 : 0); |
530 | vp_reg_writemask(res, VP_MODE, val, VP_MODE_LINE_SKIP); | 515 | vp_reg_writemask(ctx, VP_MODE, val, VP_MODE_LINE_SKIP); |
531 | 516 | ||
532 | /* setup format */ | 517 | /* setup format */ |
533 | val = (is_nv21 ? VP_MODE_NV21 : VP_MODE_NV12); | 518 | val = (is_nv21 ? VP_MODE_NV21 : VP_MODE_NV12); |
534 | val |= (is_tiled ? VP_MODE_MEM_TILED : VP_MODE_MEM_LINEAR); | 519 | val |= (is_tiled ? VP_MODE_MEM_TILED : VP_MODE_MEM_LINEAR); |
535 | vp_reg_writemask(res, VP_MODE, val, VP_MODE_FMT_MASK); | 520 | vp_reg_writemask(ctx, VP_MODE, val, VP_MODE_FMT_MASK); |
536 | 521 | ||
537 | /* setting size of input image */ | 522 | /* setting size of input image */ |
538 | vp_reg_write(res, VP_IMG_SIZE_Y, VP_IMG_HSIZE(fb->pitches[0]) | | 523 | vp_reg_write(ctx, VP_IMG_SIZE_Y, VP_IMG_HSIZE(fb->pitches[0]) | |
539 | VP_IMG_VSIZE(fb->height)); | 524 | VP_IMG_VSIZE(fb->height)); |
540 | /* chroma plane for NV12/NV21 is half the height of the luma plane */ | 525 | /* chroma plane for NV12/NV21 is half the height of the luma plane */ |
541 | vp_reg_write(res, VP_IMG_SIZE_C, VP_IMG_HSIZE(fb->pitches[0]) | | 526 | vp_reg_write(ctx, VP_IMG_SIZE_C, VP_IMG_HSIZE(fb->pitches[0]) | |
542 | VP_IMG_VSIZE(fb->height / 2)); | 527 | VP_IMG_VSIZE(fb->height / 2)); |
543 | 528 | ||
544 | vp_reg_write(res, VP_SRC_WIDTH, state->src.w); | 529 | vp_reg_write(ctx, VP_SRC_WIDTH, state->src.w); |
545 | vp_reg_write(res, VP_SRC_HEIGHT, state->src.h); | 530 | vp_reg_write(ctx, VP_SRC_HEIGHT, state->src.h); |
546 | vp_reg_write(res, VP_SRC_H_POSITION, | 531 | vp_reg_write(ctx, VP_SRC_H_POSITION, |
547 | VP_SRC_H_POSITION_VAL(state->src.x)); | 532 | VP_SRC_H_POSITION_VAL(state->src.x)); |
548 | vp_reg_write(res, VP_SRC_V_POSITION, state->src.y); | 533 | vp_reg_write(ctx, VP_SRC_V_POSITION, state->src.y); |
549 | 534 | ||
550 | vp_reg_write(res, VP_DST_WIDTH, state->crtc.w); | 535 | vp_reg_write(ctx, VP_DST_WIDTH, state->crtc.w); |
551 | vp_reg_write(res, VP_DST_H_POSITION, state->crtc.x); | 536 | vp_reg_write(ctx, VP_DST_H_POSITION, state->crtc.x); |
552 | if (test_bit(MXR_BIT_INTERLACE, &ctx->flags)) { | 537 | if (test_bit(MXR_BIT_INTERLACE, &ctx->flags)) { |
553 | vp_reg_write(res, VP_DST_HEIGHT, state->crtc.h / 2); | 538 | vp_reg_write(ctx, VP_DST_HEIGHT, state->crtc.h / 2); |
554 | vp_reg_write(res, VP_DST_V_POSITION, state->crtc.y / 2); | 539 | vp_reg_write(ctx, VP_DST_V_POSITION, state->crtc.y / 2); |
555 | } else { | 540 | } else { |
556 | vp_reg_write(res, VP_DST_HEIGHT, state->crtc.h); | 541 | vp_reg_write(ctx, VP_DST_HEIGHT, state->crtc.h); |
557 | vp_reg_write(res, VP_DST_V_POSITION, state->crtc.y); | 542 | vp_reg_write(ctx, VP_DST_V_POSITION, state->crtc.y); |
558 | } | 543 | } |
559 | 544 | ||
560 | vp_reg_write(res, VP_H_RATIO, state->h_ratio); | 545 | vp_reg_write(ctx, VP_H_RATIO, state->h_ratio); |
561 | vp_reg_write(res, VP_V_RATIO, state->v_ratio); | 546 | vp_reg_write(ctx, VP_V_RATIO, state->v_ratio); |
562 | 547 | ||
563 | vp_reg_write(res, VP_ENDIAN_MODE, VP_ENDIAN_MODE_LITTLE); | 548 | vp_reg_write(ctx, VP_ENDIAN_MODE, VP_ENDIAN_MODE_LITTLE); |
564 | 549 | ||
565 | /* set buffer address to vp */ | 550 | /* set buffer address to vp */ |
566 | vp_reg_write(res, VP_TOP_Y_PTR, luma_addr[0]); | 551 | vp_reg_write(ctx, VP_TOP_Y_PTR, luma_addr[0]); |
567 | vp_reg_write(res, VP_BOT_Y_PTR, luma_addr[1]); | 552 | vp_reg_write(ctx, VP_BOT_Y_PTR, luma_addr[1]); |
568 | vp_reg_write(res, VP_TOP_C_PTR, chroma_addr[0]); | 553 | vp_reg_write(ctx, VP_TOP_C_PTR, chroma_addr[0]); |
569 | vp_reg_write(res, VP_BOT_C_PTR, chroma_addr[1]); | 554 | vp_reg_write(ctx, VP_BOT_C_PTR, chroma_addr[1]); |
570 | 555 | ||
571 | mixer_cfg_layer(ctx, plane->index, priority, true); | 556 | mixer_cfg_layer(ctx, plane->index, priority, true); |
572 | mixer_cfg_vp_blend(ctx); | 557 | mixer_cfg_vp_blend(ctx); |
573 | 558 | ||
574 | spin_unlock_irqrestore(&res->reg_slock, flags); | 559 | spin_unlock_irqrestore(&ctx->reg_slock, flags); |
575 | 560 | ||
576 | mixer_regs_dump(ctx); | 561 | mixer_regs_dump(ctx); |
577 | vp_regs_dump(ctx); | 562 | vp_regs_dump(ctx); |
@@ -579,9 +564,7 @@ static void vp_video_buffer(struct mixer_context *ctx, | |||
579 | 564 | ||
580 | static void mixer_layer_update(struct mixer_context *ctx) | 565 | static void mixer_layer_update(struct mixer_context *ctx) |
581 | { | 566 | { |
582 | struct mixer_resources *res = &ctx->mixer_res; | 567 | mixer_reg_writemask(ctx, MXR_CFG, ~0, MXR_CFG_LAYER_UPDATE); |
583 | |||
584 | mixer_reg_writemask(res, MXR_CFG, ~0, MXR_CFG_LAYER_UPDATE); | ||
585 | } | 568 | } |
586 | 569 | ||
587 | static void mixer_graph_buffer(struct mixer_context *ctx, | 570 | static void mixer_graph_buffer(struct mixer_context *ctx, |
@@ -589,7 +572,6 @@ static void mixer_graph_buffer(struct mixer_context *ctx, | |||
589 | { | 572 | { |
590 | struct exynos_drm_plane_state *state = | 573 | struct exynos_drm_plane_state *state = |
591 | to_exynos_plane_state(plane->base.state); | 574 | to_exynos_plane_state(plane->base.state); |
592 | struct mixer_resources *res = &ctx->mixer_res; | ||
593 | struct drm_framebuffer *fb = state->base.fb; | 575 | struct drm_framebuffer *fb = state->base.fb; |
594 | unsigned int priority = state->base.normalized_zpos + 1; | 576 | unsigned int priority = state->base.normalized_zpos + 1; |
595 | unsigned long flags; | 577 | unsigned long flags; |
@@ -634,29 +616,29 @@ static void mixer_graph_buffer(struct mixer_context *ctx, | |||
634 | + (state->src.x * fb->format->cpp[0]) | 616 | + (state->src.x * fb->format->cpp[0]) |
635 | + (state->src.y * fb->pitches[0]); | 617 | + (state->src.y * fb->pitches[0]); |
636 | 618 | ||
637 | spin_lock_irqsave(&res->reg_slock, flags); | 619 | spin_lock_irqsave(&ctx->reg_slock, flags); |
638 | 620 | ||
639 | /* setup format */ | 621 | /* setup format */ |
640 | mixer_reg_writemask(res, MXR_GRAPHIC_CFG(win), | 622 | mixer_reg_writemask(ctx, MXR_GRAPHIC_CFG(win), |
641 | MXR_GRP_CFG_FORMAT_VAL(fmt), MXR_GRP_CFG_FORMAT_MASK); | 623 | MXR_GRP_CFG_FORMAT_VAL(fmt), MXR_GRP_CFG_FORMAT_MASK); |
642 | 624 | ||
643 | /* setup geometry */ | 625 | /* setup geometry */ |
644 | mixer_reg_write(res, MXR_GRAPHIC_SPAN(win), | 626 | mixer_reg_write(ctx, MXR_GRAPHIC_SPAN(win), |
645 | fb->pitches[0] / fb->format->cpp[0]); | 627 | fb->pitches[0] / fb->format->cpp[0]); |
646 | 628 | ||
647 | val = MXR_GRP_WH_WIDTH(state->src.w); | 629 | val = MXR_GRP_WH_WIDTH(state->src.w); |
648 | val |= MXR_GRP_WH_HEIGHT(state->src.h); | 630 | val |= MXR_GRP_WH_HEIGHT(state->src.h); |
649 | val |= MXR_GRP_WH_H_SCALE(x_ratio); | 631 | val |= MXR_GRP_WH_H_SCALE(x_ratio); |
650 | val |= MXR_GRP_WH_V_SCALE(y_ratio); | 632 | val |= MXR_GRP_WH_V_SCALE(y_ratio); |
651 | mixer_reg_write(res, MXR_GRAPHIC_WH(win), val); | 633 | mixer_reg_write(ctx, MXR_GRAPHIC_WH(win), val); |
652 | 634 | ||
653 | /* setup offsets in display image */ | 635 | /* setup offsets in display image */ |
654 | val = MXR_GRP_DXY_DX(dst_x_offset); | 636 | val = MXR_GRP_DXY_DX(dst_x_offset); |
655 | val |= MXR_GRP_DXY_DY(dst_y_offset); | 637 | val |= MXR_GRP_DXY_DY(dst_y_offset); |
656 | mixer_reg_write(res, MXR_GRAPHIC_DXY(win), val); | 638 | mixer_reg_write(ctx, MXR_GRAPHIC_DXY(win), val); |
657 | 639 | ||
658 | /* set buffer address to mixer */ | 640 | /* set buffer address to mixer */ |
659 | mixer_reg_write(res, MXR_GRAPHIC_BASE(win), dma_addr); | 641 | mixer_reg_write(ctx, MXR_GRAPHIC_BASE(win), dma_addr); |
660 | 642 | ||
661 | mixer_cfg_layer(ctx, win, priority, true); | 643 | mixer_cfg_layer(ctx, win, priority, true); |
662 | mixer_cfg_gfx_blend(ctx, win, is_alpha_format(fb->format->format)); | 644 | mixer_cfg_gfx_blend(ctx, win, is_alpha_format(fb->format->format)); |
@@ -666,20 +648,19 @@ static void mixer_graph_buffer(struct mixer_context *ctx, | |||
666 | ctx->mxr_ver == MXR_VER_128_0_0_184) | 648 | ctx->mxr_ver == MXR_VER_128_0_0_184) |
667 | mixer_layer_update(ctx); | 649 | mixer_layer_update(ctx); |
668 | 650 | ||
669 | spin_unlock_irqrestore(&res->reg_slock, flags); | 651 | spin_unlock_irqrestore(&ctx->reg_slock, flags); |
670 | 652 | ||
671 | mixer_regs_dump(ctx); | 653 | mixer_regs_dump(ctx); |
672 | } | 654 | } |
673 | 655 | ||
674 | static void vp_win_reset(struct mixer_context *ctx) | 656 | static void vp_win_reset(struct mixer_context *ctx) |
675 | { | 657 | { |
676 | struct mixer_resources *res = &ctx->mixer_res; | ||
677 | unsigned int tries = 100; | 658 | unsigned int tries = 100; |
678 | 659 | ||
679 | vp_reg_write(res, VP_SRESET, VP_SRESET_PROCESSING); | 660 | vp_reg_write(ctx, VP_SRESET, VP_SRESET_PROCESSING); |
680 | while (--tries) { | 661 | while (--tries) { |
681 | /* waiting until VP_SRESET_PROCESSING is 0 */ | 662 | /* waiting until VP_SRESET_PROCESSING is 0 */ |
682 | if (~vp_reg_read(res, VP_SRESET) & VP_SRESET_PROCESSING) | 663 | if (~vp_reg_read(ctx, VP_SRESET) & VP_SRESET_PROCESSING) |
683 | break; | 664 | break; |
684 | mdelay(10); | 665 | mdelay(10); |
685 | } | 666 | } |
@@ -688,57 +669,55 @@ static void vp_win_reset(struct mixer_context *ctx) | |||
688 | 669 | ||
689 | static void mixer_win_reset(struct mixer_context *ctx) | 670 | static void mixer_win_reset(struct mixer_context *ctx) |
690 | { | 671 | { |
691 | struct mixer_resources *res = &ctx->mixer_res; | ||
692 | unsigned long flags; | 672 | unsigned long flags; |
693 | 673 | ||
694 | spin_lock_irqsave(&res->reg_slock, flags); | 674 | spin_lock_irqsave(&ctx->reg_slock, flags); |
695 | 675 | ||
696 | mixer_reg_writemask(res, MXR_CFG, MXR_CFG_DST_HDMI, MXR_CFG_DST_MASK); | 676 | mixer_reg_writemask(ctx, MXR_CFG, MXR_CFG_DST_HDMI, MXR_CFG_DST_MASK); |
697 | 677 | ||
698 | /* set output in RGB888 mode */ | 678 | /* set output in RGB888 mode */ |
699 | mixer_reg_writemask(res, MXR_CFG, MXR_CFG_OUT_RGB888, MXR_CFG_OUT_MASK); | 679 | mixer_reg_writemask(ctx, MXR_CFG, MXR_CFG_OUT_RGB888, MXR_CFG_OUT_MASK); |
700 | 680 | ||
701 | /* 16 beat burst in DMA */ | 681 | /* 16 beat burst in DMA */ |
702 | mixer_reg_writemask(res, MXR_STATUS, MXR_STATUS_16_BURST, | 682 | mixer_reg_writemask(ctx, MXR_STATUS, MXR_STATUS_16_BURST, |
703 | MXR_STATUS_BURST_MASK); | 683 | MXR_STATUS_BURST_MASK); |
704 | 684 | ||
705 | /* reset default layer priority */ | 685 | /* reset default layer priority */ |
706 | mixer_reg_write(res, MXR_LAYER_CFG, 0); | 686 | mixer_reg_write(ctx, MXR_LAYER_CFG, 0); |
707 | 687 | ||
708 | /* set all background colors to RGB (0,0,0) */ | 688 | /* set all background colors to RGB (0,0,0) */ |
709 | mixer_reg_write(res, MXR_BG_COLOR0, MXR_YCBCR_VAL(0, 128, 128)); | 689 | mixer_reg_write(ctx, MXR_BG_COLOR0, MXR_YCBCR_VAL(0, 128, 128)); |
710 | mixer_reg_write(res, MXR_BG_COLOR1, MXR_YCBCR_VAL(0, 128, 128)); | 690 | mixer_reg_write(ctx, MXR_BG_COLOR1, MXR_YCBCR_VAL(0, 128, 128)); |
711 | mixer_reg_write(res, MXR_BG_COLOR2, MXR_YCBCR_VAL(0, 128, 128)); | 691 | mixer_reg_write(ctx, MXR_BG_COLOR2, MXR_YCBCR_VAL(0, 128, 128)); |
712 | 692 | ||
713 | if (test_bit(MXR_BIT_VP_ENABLED, &ctx->flags)) { | 693 | if (test_bit(MXR_BIT_VP_ENABLED, &ctx->flags)) { |
714 | /* configuration of Video Processor Registers */ | 694 | /* configuration of Video Processor Registers */ |
715 | vp_win_reset(ctx); | 695 | vp_win_reset(ctx); |
716 | vp_default_filter(res); | 696 | vp_default_filter(ctx); |
717 | } | 697 | } |
718 | 698 | ||
719 | /* disable all layers */ | 699 | /* disable all layers */ |
720 | mixer_reg_writemask(res, MXR_CFG, 0, MXR_CFG_GRP0_ENABLE); | 700 | mixer_reg_writemask(ctx, MXR_CFG, 0, MXR_CFG_GRP0_ENABLE); |
721 | mixer_reg_writemask(res, MXR_CFG, 0, MXR_CFG_GRP1_ENABLE); | 701 | mixer_reg_writemask(ctx, MXR_CFG, 0, MXR_CFG_GRP1_ENABLE); |
722 | if (test_bit(MXR_BIT_VP_ENABLED, &ctx->flags)) | 702 | if (test_bit(MXR_BIT_VP_ENABLED, &ctx->flags)) |
723 | mixer_reg_writemask(res, MXR_CFG, 0, MXR_CFG_VP_ENABLE); | 703 | mixer_reg_writemask(ctx, MXR_CFG, 0, MXR_CFG_VP_ENABLE); |
724 | 704 | ||
725 | /* set all source image offsets to zero */ | 705 | /* set all source image offsets to zero */ |
726 | mixer_reg_write(res, MXR_GRAPHIC_SXY(0), 0); | 706 | mixer_reg_write(ctx, MXR_GRAPHIC_SXY(0), 0); |
727 | mixer_reg_write(res, MXR_GRAPHIC_SXY(1), 0); | 707 | mixer_reg_write(ctx, MXR_GRAPHIC_SXY(1), 0); |
728 | 708 | ||
729 | spin_unlock_irqrestore(&res->reg_slock, flags); | 709 | spin_unlock_irqrestore(&ctx->reg_slock, flags); |
730 | } | 710 | } |
731 | 711 | ||
732 | static irqreturn_t mixer_irq_handler(int irq, void *arg) | 712 | static irqreturn_t mixer_irq_handler(int irq, void *arg) |
733 | { | 713 | { |
734 | struct mixer_context *ctx = arg; | 714 | struct mixer_context *ctx = arg; |
735 | struct mixer_resources *res = &ctx->mixer_res; | ||
736 | u32 val, base, shadow; | 715 | u32 val, base, shadow; |
737 | 716 | ||
738 | spin_lock(&res->reg_slock); | 717 | spin_lock(&ctx->reg_slock); |
739 | 718 | ||
740 | /* read interrupt status for handling and clearing flags for VSYNC */ | 719 | /* read interrupt status for handling and clearing flags for VSYNC */ |
741 | val = mixer_reg_read(res, MXR_INT_STATUS); | 720 | val = mixer_reg_read(ctx, MXR_INT_STATUS); |
742 | 721 | ||
743 | /* handling VSYNC */ | 722 | /* handling VSYNC */ |
744 | if (val & MXR_INT_STATUS_VSYNC) { | 723 | if (val & MXR_INT_STATUS_VSYNC) { |
@@ -748,13 +727,13 @@ static irqreturn_t mixer_irq_handler(int irq, void *arg) | |||
748 | 727 | ||
749 | /* interlace scan need to check shadow register */ | 728 | /* interlace scan need to check shadow register */ |
750 | if (test_bit(MXR_BIT_INTERLACE, &ctx->flags)) { | 729 | if (test_bit(MXR_BIT_INTERLACE, &ctx->flags)) { |
751 | base = mixer_reg_read(res, MXR_GRAPHIC_BASE(0)); | 730 | base = mixer_reg_read(ctx, MXR_GRAPHIC_BASE(0)); |
752 | shadow = mixer_reg_read(res, MXR_GRAPHIC_BASE_S(0)); | 731 | shadow = mixer_reg_read(ctx, MXR_GRAPHIC_BASE_S(0)); |
753 | if (base != shadow) | 732 | if (base != shadow) |
754 | goto out; | 733 | goto out; |
755 | 734 | ||
756 | base = mixer_reg_read(res, MXR_GRAPHIC_BASE(1)); | 735 | base = mixer_reg_read(ctx, MXR_GRAPHIC_BASE(1)); |
757 | shadow = mixer_reg_read(res, MXR_GRAPHIC_BASE_S(1)); | 736 | shadow = mixer_reg_read(ctx, MXR_GRAPHIC_BASE_S(1)); |
758 | if (base != shadow) | 737 | if (base != shadow) |
759 | goto out; | 738 | goto out; |
760 | } | 739 | } |
@@ -764,9 +743,9 @@ static irqreturn_t mixer_irq_handler(int irq, void *arg) | |||
764 | 743 | ||
765 | out: | 744 | out: |
766 | /* clear interrupts */ | 745 | /* clear interrupts */ |
767 | mixer_reg_write(res, MXR_INT_STATUS, val); | 746 | mixer_reg_write(ctx, MXR_INT_STATUS, val); |
768 | 747 | ||
769 | spin_unlock(&res->reg_slock); | 748 | spin_unlock(&ctx->reg_slock); |
770 | 749 | ||
771 | return IRQ_HANDLED; | 750 | return IRQ_HANDLED; |
772 | } | 751 | } |
@@ -774,26 +753,25 @@ out: | |||
774 | static int mixer_resources_init(struct mixer_context *mixer_ctx) | 753 | static int mixer_resources_init(struct mixer_context *mixer_ctx) |
775 | { | 754 | { |
776 | struct device *dev = &mixer_ctx->pdev->dev; | 755 | struct device *dev = &mixer_ctx->pdev->dev; |
777 | struct mixer_resources *mixer_res = &mixer_ctx->mixer_res; | ||
778 | struct resource *res; | 756 | struct resource *res; |
779 | int ret; | 757 | int ret; |
780 | 758 | ||
781 | spin_lock_init(&mixer_res->reg_slock); | 759 | spin_lock_init(&mixer_ctx->reg_slock); |
782 | 760 | ||
783 | mixer_res->mixer = devm_clk_get(dev, "mixer"); | 761 | mixer_ctx->mixer = devm_clk_get(dev, "mixer"); |
784 | if (IS_ERR(mixer_res->mixer)) { | 762 | if (IS_ERR(mixer_ctx->mixer)) { |
785 | dev_err(dev, "failed to get clock 'mixer'\n"); | 763 | dev_err(dev, "failed to get clock 'mixer'\n"); |
786 | return -ENODEV; | 764 | return -ENODEV; |
787 | } | 765 | } |
788 | 766 | ||
789 | mixer_res->hdmi = devm_clk_get(dev, "hdmi"); | 767 | mixer_ctx->hdmi = devm_clk_get(dev, "hdmi"); |
790 | if (IS_ERR(mixer_res->hdmi)) { | 768 | if (IS_ERR(mixer_ctx->hdmi)) { |
791 | dev_err(dev, "failed to get clock 'hdmi'\n"); | 769 | dev_err(dev, "failed to get clock 'hdmi'\n"); |
792 | return PTR_ERR(mixer_res->hdmi); | 770 | return PTR_ERR(mixer_ctx->hdmi); |
793 | } | 771 | } |
794 | 772 | ||
795 | mixer_res->sclk_hdmi = devm_clk_get(dev, "sclk_hdmi"); | 773 | mixer_ctx->sclk_hdmi = devm_clk_get(dev, "sclk_hdmi"); |
796 | if (IS_ERR(mixer_res->sclk_hdmi)) { | 774 | if (IS_ERR(mixer_ctx->sclk_hdmi)) { |
797 | dev_err(dev, "failed to get clock 'sclk_hdmi'\n"); | 775 | dev_err(dev, "failed to get clock 'sclk_hdmi'\n"); |
798 | return -ENODEV; | 776 | return -ENODEV; |
799 | } | 777 | } |
@@ -803,9 +781,9 @@ static int mixer_resources_init(struct mixer_context *mixer_ctx) | |||
803 | return -ENXIO; | 781 | return -ENXIO; |
804 | } | 782 | } |
805 | 783 | ||
806 | mixer_res->mixer_regs = devm_ioremap(dev, res->start, | 784 | mixer_ctx->mixer_regs = devm_ioremap(dev, res->start, |
807 | resource_size(res)); | 785 | resource_size(res)); |
808 | if (mixer_res->mixer_regs == NULL) { | 786 | if (mixer_ctx->mixer_regs == NULL) { |
809 | dev_err(dev, "register mapping failed.\n"); | 787 | dev_err(dev, "register mapping failed.\n"); |
810 | return -ENXIO; | 788 | return -ENXIO; |
811 | } | 789 | } |
@@ -822,7 +800,7 @@ static int mixer_resources_init(struct mixer_context *mixer_ctx) | |||
822 | dev_err(dev, "request interrupt failed.\n"); | 800 | dev_err(dev, "request interrupt failed.\n"); |
823 | return ret; | 801 | return ret; |
824 | } | 802 | } |
825 | mixer_res->irq = res->start; | 803 | mixer_ctx->irq = res->start; |
826 | 804 | ||
827 | return 0; | 805 | return 0; |
828 | } | 806 | } |
@@ -830,30 +808,29 @@ static int mixer_resources_init(struct mixer_context *mixer_ctx) | |||
830 | static int vp_resources_init(struct mixer_context *mixer_ctx) | 808 | static int vp_resources_init(struct mixer_context *mixer_ctx) |
831 | { | 809 | { |
832 | struct device *dev = &mixer_ctx->pdev->dev; | 810 | struct device *dev = &mixer_ctx->pdev->dev; |
833 | struct mixer_resources *mixer_res = &mixer_ctx->mixer_res; | ||
834 | struct resource *res; | 811 | struct resource *res; |
835 | 812 | ||
836 | mixer_res->vp = devm_clk_get(dev, "vp"); | 813 | mixer_ctx->vp = devm_clk_get(dev, "vp"); |
837 | if (IS_ERR(mixer_res->vp)) { | 814 | if (IS_ERR(mixer_ctx->vp)) { |
838 | dev_err(dev, "failed to get clock 'vp'\n"); | 815 | dev_err(dev, "failed to get clock 'vp'\n"); |
839 | return -ENODEV; | 816 | return -ENODEV; |
840 | } | 817 | } |
841 | 818 | ||
842 | if (test_bit(MXR_BIT_HAS_SCLK, &mixer_ctx->flags)) { | 819 | if (test_bit(MXR_BIT_HAS_SCLK, &mixer_ctx->flags)) { |
843 | mixer_res->sclk_mixer = devm_clk_get(dev, "sclk_mixer"); | 820 | mixer_ctx->sclk_mixer = devm_clk_get(dev, "sclk_mixer"); |
844 | if (IS_ERR(mixer_res->sclk_mixer)) { | 821 | if (IS_ERR(mixer_ctx->sclk_mixer)) { |
845 | dev_err(dev, "failed to get clock 'sclk_mixer'\n"); | 822 | dev_err(dev, "failed to get clock 'sclk_mixer'\n"); |
846 | return -ENODEV; | 823 | return -ENODEV; |
847 | } | 824 | } |
848 | mixer_res->mout_mixer = devm_clk_get(dev, "mout_mixer"); | 825 | mixer_ctx->mout_mixer = devm_clk_get(dev, "mout_mixer"); |
849 | if (IS_ERR(mixer_res->mout_mixer)) { | 826 | if (IS_ERR(mixer_ctx->mout_mixer)) { |
850 | dev_err(dev, "failed to get clock 'mout_mixer'\n"); | 827 | dev_err(dev, "failed to get clock 'mout_mixer'\n"); |
851 | return -ENODEV; | 828 | return -ENODEV; |
852 | } | 829 | } |
853 | 830 | ||
854 | if (mixer_res->sclk_hdmi && mixer_res->mout_mixer) | 831 | if (mixer_ctx->sclk_hdmi && mixer_ctx->mout_mixer) |
855 | clk_set_parent(mixer_res->mout_mixer, | 832 | clk_set_parent(mixer_ctx->mout_mixer, |
856 | mixer_res->sclk_hdmi); | 833 | mixer_ctx->sclk_hdmi); |
857 | } | 834 | } |
858 | 835 | ||
859 | res = platform_get_resource(mixer_ctx->pdev, IORESOURCE_MEM, 1); | 836 | res = platform_get_resource(mixer_ctx->pdev, IORESOURCE_MEM, 1); |
@@ -862,9 +839,9 @@ static int vp_resources_init(struct mixer_context *mixer_ctx) | |||
862 | return -ENXIO; | 839 | return -ENXIO; |
863 | } | 840 | } |
864 | 841 | ||
865 | mixer_res->vp_regs = devm_ioremap(dev, res->start, | 842 | mixer_ctx->vp_regs = devm_ioremap(dev, res->start, |
866 | resource_size(res)); | 843 | resource_size(res)); |
867 | if (mixer_res->vp_regs == NULL) { | 844 | if (mixer_ctx->vp_regs == NULL) { |
868 | dev_err(dev, "register mapping failed.\n"); | 845 | dev_err(dev, "register mapping failed.\n"); |
869 | return -ENXIO; | 846 | return -ENXIO; |
870 | } | 847 | } |
@@ -908,15 +885,14 @@ static void mixer_ctx_remove(struct mixer_context *mixer_ctx) | |||
908 | static int mixer_enable_vblank(struct exynos_drm_crtc *crtc) | 885 | static int mixer_enable_vblank(struct exynos_drm_crtc *crtc) |
909 | { | 886 | { |
910 | struct mixer_context *mixer_ctx = crtc->ctx; | 887 | struct mixer_context *mixer_ctx = crtc->ctx; |
911 | struct mixer_resources *res = &mixer_ctx->mixer_res; | ||
912 | 888 | ||
913 | __set_bit(MXR_BIT_VSYNC, &mixer_ctx->flags); | 889 | __set_bit(MXR_BIT_VSYNC, &mixer_ctx->flags); |
914 | if (!test_bit(MXR_BIT_POWERED, &mixer_ctx->flags)) | 890 | if (!test_bit(MXR_BIT_POWERED, &mixer_ctx->flags)) |
915 | return 0; | 891 | return 0; |
916 | 892 | ||
917 | /* enable vsync interrupt */ | 893 | /* enable vsync interrupt */ |
918 | mixer_reg_writemask(res, MXR_INT_STATUS, ~0, MXR_INT_CLEAR_VSYNC); | 894 | mixer_reg_writemask(mixer_ctx, MXR_INT_STATUS, ~0, MXR_INT_CLEAR_VSYNC); |
919 | mixer_reg_writemask(res, MXR_INT_EN, ~0, MXR_INT_EN_VSYNC); | 895 | mixer_reg_writemask(mixer_ctx, MXR_INT_EN, ~0, MXR_INT_EN_VSYNC); |
920 | 896 | ||
921 | return 0; | 897 | return 0; |
922 | } | 898 | } |
@@ -924,7 +900,6 @@ static int mixer_enable_vblank(struct exynos_drm_crtc *crtc) | |||
924 | static void mixer_disable_vblank(struct exynos_drm_crtc *crtc) | 900 | static void mixer_disable_vblank(struct exynos_drm_crtc *crtc) |
925 | { | 901 | { |
926 | struct mixer_context *mixer_ctx = crtc->ctx; | 902 | struct mixer_context *mixer_ctx = crtc->ctx; |
927 | struct mixer_resources *res = &mixer_ctx->mixer_res; | ||
928 | 903 | ||
929 | __clear_bit(MXR_BIT_VSYNC, &mixer_ctx->flags); | 904 | __clear_bit(MXR_BIT_VSYNC, &mixer_ctx->flags); |
930 | 905 | ||
@@ -932,8 +907,8 @@ static void mixer_disable_vblank(struct exynos_drm_crtc *crtc) | |||
932 | return; | 907 | return; |
933 | 908 | ||
934 | /* disable vsync interrupt */ | 909 | /* disable vsync interrupt */ |
935 | mixer_reg_writemask(res, MXR_INT_STATUS, ~0, MXR_INT_CLEAR_VSYNC); | 910 | mixer_reg_writemask(mixer_ctx, MXR_INT_STATUS, ~0, MXR_INT_CLEAR_VSYNC); |
936 | mixer_reg_writemask(res, MXR_INT_EN, 0, MXR_INT_EN_VSYNC); | 911 | mixer_reg_writemask(mixer_ctx, MXR_INT_EN, 0, MXR_INT_EN_VSYNC); |
937 | } | 912 | } |
938 | 913 | ||
939 | static void mixer_atomic_begin(struct exynos_drm_crtc *crtc) | 914 | static void mixer_atomic_begin(struct exynos_drm_crtc *crtc) |
@@ -966,7 +941,6 @@ static void mixer_disable_plane(struct exynos_drm_crtc *crtc, | |||
966 | struct exynos_drm_plane *plane) | 941 | struct exynos_drm_plane *plane) |
967 | { | 942 | { |
968 | struct mixer_context *mixer_ctx = crtc->ctx; | 943 | struct mixer_context *mixer_ctx = crtc->ctx; |
969 | struct mixer_resources *res = &mixer_ctx->mixer_res; | ||
970 | unsigned long flags; | 944 | unsigned long flags; |
971 | 945 | ||
972 | DRM_DEBUG_KMS("win: %d\n", plane->index); | 946 | DRM_DEBUG_KMS("win: %d\n", plane->index); |
@@ -974,9 +948,9 @@ static void mixer_disable_plane(struct exynos_drm_crtc *crtc, | |||
974 | if (!test_bit(MXR_BIT_POWERED, &mixer_ctx->flags)) | 948 | if (!test_bit(MXR_BIT_POWERED, &mixer_ctx->flags)) |
975 | return; | 949 | return; |
976 | 950 | ||
977 | spin_lock_irqsave(&res->reg_slock, flags); | 951 | spin_lock_irqsave(&mixer_ctx->reg_slock, flags); |
978 | mixer_cfg_layer(mixer_ctx, plane->index, 0, false); | 952 | mixer_cfg_layer(mixer_ctx, plane->index, 0, false); |
979 | spin_unlock_irqrestore(&res->reg_slock, flags); | 953 | spin_unlock_irqrestore(&mixer_ctx->reg_slock, flags); |
980 | } | 954 | } |
981 | 955 | ||
982 | static void mixer_atomic_flush(struct exynos_drm_crtc *crtc) | 956 | static void mixer_atomic_flush(struct exynos_drm_crtc *crtc) |
@@ -993,7 +967,6 @@ static void mixer_atomic_flush(struct exynos_drm_crtc *crtc) | |||
993 | static void mixer_enable(struct exynos_drm_crtc *crtc) | 967 | static void mixer_enable(struct exynos_drm_crtc *crtc) |
994 | { | 968 | { |
995 | struct mixer_context *ctx = crtc->ctx; | 969 | struct mixer_context *ctx = crtc->ctx; |
996 | struct mixer_resources *res = &ctx->mixer_res; | ||
997 | 970 | ||
998 | if (test_bit(MXR_BIT_POWERED, &ctx->flags)) | 971 | if (test_bit(MXR_BIT_POWERED, &ctx->flags)) |
999 | return; | 972 | return; |
@@ -1004,11 +977,12 @@ static void mixer_enable(struct exynos_drm_crtc *crtc) | |||
1004 | 977 | ||
1005 | mixer_vsync_set_update(ctx, false); | 978 | mixer_vsync_set_update(ctx, false); |
1006 | 979 | ||
1007 | mixer_reg_writemask(res, MXR_STATUS, ~0, MXR_STATUS_SOFT_RESET); | 980 | mixer_reg_writemask(ctx, MXR_STATUS, ~0, MXR_STATUS_SOFT_RESET); |
1008 | 981 | ||
1009 | if (test_bit(MXR_BIT_VSYNC, &ctx->flags)) { | 982 | if (test_bit(MXR_BIT_VSYNC, &ctx->flags)) { |
1010 | mixer_reg_writemask(res, MXR_INT_STATUS, ~0, MXR_INT_CLEAR_VSYNC); | 983 | mixer_reg_writemask(ctx, MXR_INT_STATUS, ~0, |
1011 | mixer_reg_writemask(res, MXR_INT_EN, ~0, MXR_INT_EN_VSYNC); | 984 | MXR_INT_CLEAR_VSYNC); |
985 | mixer_reg_writemask(ctx, MXR_INT_EN, ~0, MXR_INT_EN_VSYNC); | ||
1012 | } | 986 | } |
1013 | mixer_win_reset(ctx); | 987 | mixer_win_reset(ctx); |
1014 | 988 | ||
@@ -1211,14 +1185,13 @@ static int mixer_remove(struct platform_device *pdev) | |||
1211 | static int __maybe_unused exynos_mixer_suspend(struct device *dev) | 1185 | static int __maybe_unused exynos_mixer_suspend(struct device *dev) |
1212 | { | 1186 | { |
1213 | struct mixer_context *ctx = dev_get_drvdata(dev); | 1187 | struct mixer_context *ctx = dev_get_drvdata(dev); |
1214 | struct mixer_resources *res = &ctx->mixer_res; | ||
1215 | 1188 | ||
1216 | clk_disable_unprepare(res->hdmi); | 1189 | clk_disable_unprepare(ctx->hdmi); |
1217 | clk_disable_unprepare(res->mixer); | 1190 | clk_disable_unprepare(ctx->mixer); |
1218 | if (test_bit(MXR_BIT_VP_ENABLED, &ctx->flags)) { | 1191 | if (test_bit(MXR_BIT_VP_ENABLED, &ctx->flags)) { |
1219 | clk_disable_unprepare(res->vp); | 1192 | clk_disable_unprepare(ctx->vp); |
1220 | if (test_bit(MXR_BIT_HAS_SCLK, &ctx->flags)) | 1193 | if (test_bit(MXR_BIT_HAS_SCLK, &ctx->flags)) |
1221 | clk_disable_unprepare(res->sclk_mixer); | 1194 | clk_disable_unprepare(ctx->sclk_mixer); |
1222 | } | 1195 | } |
1223 | 1196 | ||
1224 | return 0; | 1197 | return 0; |
@@ -1227,28 +1200,27 @@ static int __maybe_unused exynos_mixer_suspend(struct device *dev) | |||
1227 | static int __maybe_unused exynos_mixer_resume(struct device *dev) | 1200 | static int __maybe_unused exynos_mixer_resume(struct device *dev) |
1228 | { | 1201 | { |
1229 | struct mixer_context *ctx = dev_get_drvdata(dev); | 1202 | struct mixer_context *ctx = dev_get_drvdata(dev); |
1230 | struct mixer_resources *res = &ctx->mixer_res; | ||
1231 | int ret; | 1203 | int ret; |
1232 | 1204 | ||
1233 | ret = clk_prepare_enable(res->mixer); | 1205 | ret = clk_prepare_enable(ctx->mixer); |
1234 | if (ret < 0) { | 1206 | if (ret < 0) { |
1235 | DRM_ERROR("Failed to prepare_enable the mixer clk [%d]\n", ret); | 1207 | DRM_ERROR("Failed to prepare_enable the mixer clk [%d]\n", ret); |
1236 | return ret; | 1208 | return ret; |
1237 | } | 1209 | } |
1238 | ret = clk_prepare_enable(res->hdmi); | 1210 | ret = clk_prepare_enable(ctx->hdmi); |
1239 | if (ret < 0) { | 1211 | if (ret < 0) { |
1240 | DRM_ERROR("Failed to prepare_enable the hdmi clk [%d]\n", ret); | 1212 | DRM_ERROR("Failed to prepare_enable the hdmi clk [%d]\n", ret); |
1241 | return ret; | 1213 | return ret; |
1242 | } | 1214 | } |
1243 | if (test_bit(MXR_BIT_VP_ENABLED, &ctx->flags)) { | 1215 | if (test_bit(MXR_BIT_VP_ENABLED, &ctx->flags)) { |
1244 | ret = clk_prepare_enable(res->vp); | 1216 | ret = clk_prepare_enable(ctx->vp); |
1245 | if (ret < 0) { | 1217 | if (ret < 0) { |
1246 | DRM_ERROR("Failed to prepare_enable the vp clk [%d]\n", | 1218 | DRM_ERROR("Failed to prepare_enable the vp clk [%d]\n", |
1247 | ret); | 1219 | ret); |
1248 | return ret; | 1220 | return ret; |
1249 | } | 1221 | } |
1250 | if (test_bit(MXR_BIT_HAS_SCLK, &ctx->flags)) { | 1222 | if (test_bit(MXR_BIT_HAS_SCLK, &ctx->flags)) { |
1251 | ret = clk_prepare_enable(res->sclk_mixer); | 1223 | ret = clk_prepare_enable(ctx->sclk_mixer); |
1252 | if (ret < 0) { | 1224 | if (ret < 0) { |
1253 | DRM_ERROR("Failed to prepare_enable the " \ | 1225 | DRM_ERROR("Failed to prepare_enable the " \ |
1254 | "sclk_mixer clk [%d]\n", | 1226 | "sclk_mixer clk [%d]\n", |