|
@@ -44,6 +44,12 @@
|
|
|
#define MIXER_WIN_NR 3
|
|
|
#define MIXER_DEFAULT_WIN 0
|
|
|
|
|
|
+/* The pixelformats that are natively supported by the mixer. */
|
|
|
+#define MXR_FORMAT_RGB565 4
|
|
|
+#define MXR_FORMAT_ARGB1555 5
|
|
|
+#define MXR_FORMAT_ARGB4444 6
|
|
|
+#define MXR_FORMAT_ARGB8888 7
|
|
|
+
|
|
|
struct mixer_resources {
|
|
|
int irq;
|
|
|
void __iomem *mixer_regs;
|
|
@@ -327,7 +333,8 @@ static void mixer_cfg_rgb_fmt(struct mixer_context *ctx, unsigned int height)
|
|
|
mixer_reg_writemask(res, MXR_CFG, val, MXR_CFG_RGB_FMT_MASK);
|
|
|
}
|
|
|
|
|
|
-static void mixer_cfg_layer(struct mixer_context *ctx, int win, bool enable)
|
|
|
+static void mixer_cfg_layer(struct mixer_context *ctx, unsigned int win,
|
|
|
+ bool enable)
|
|
|
{
|
|
|
struct mixer_resources *res = &ctx->mixer_res;
|
|
|
u32 val = enable ? ~0 : 0;
|
|
@@ -359,8 +366,6 @@ static void mixer_run(struct mixer_context *ctx)
|
|
|
struct mixer_resources *res = &ctx->mixer_res;
|
|
|
|
|
|
mixer_reg_writemask(res, MXR_STATUS, ~0, MXR_STATUS_REG_RUN);
|
|
|
-
|
|
|
- mixer_regs_dump(ctx);
|
|
|
}
|
|
|
|
|
|
static void mixer_stop(struct mixer_context *ctx)
|
|
@@ -373,16 +378,13 @@ static void mixer_stop(struct mixer_context *ctx)
|
|
|
while (!(mixer_reg_read(res, MXR_STATUS) & MXR_STATUS_REG_IDLE) &&
|
|
|
--timeout)
|
|
|
usleep_range(10000, 12000);
|
|
|
-
|
|
|
- mixer_regs_dump(ctx);
|
|
|
}
|
|
|
|
|
|
-static void vp_video_buffer(struct mixer_context *ctx, int win)
|
|
|
+static void vp_video_buffer(struct mixer_context *ctx, unsigned int win)
|
|
|
{
|
|
|
struct mixer_resources *res = &ctx->mixer_res;
|
|
|
unsigned long flags;
|
|
|
struct exynos_drm_plane *plane;
|
|
|
- unsigned int buf_num = 1;
|
|
|
dma_addr_t luma_addr[2], chroma_addr[2];
|
|
|
bool tiled_mode = false;
|
|
|
bool crcb_mode = false;
|
|
@@ -393,27 +395,18 @@ static void vp_video_buffer(struct mixer_context *ctx, int win)
|
|
|
switch (plane->pixel_format) {
|
|
|
case DRM_FORMAT_NV12:
|
|
|
crcb_mode = false;
|
|
|
- buf_num = 2;
|
|
|
break;
|
|
|
- /* TODO: single buffer format NV12, NV21 */
|
|
|
+ case DRM_FORMAT_NV21:
|
|
|
+ crcb_mode = true;
|
|
|
+ break;
|
|
|
default:
|
|
|
- /* ignore pixel format at disable time */
|
|
|
- if (!plane->dma_addr[0])
|
|
|
- break;
|
|
|
-
|
|
|
DRM_ERROR("pixel format for vp is wrong [%d].\n",
|
|
|
plane->pixel_format);
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- if (buf_num == 2) {
|
|
|
- luma_addr[0] = plane->dma_addr[0];
|
|
|
- chroma_addr[0] = plane->dma_addr[1];
|
|
|
- } else {
|
|
|
- luma_addr[0] = plane->dma_addr[0];
|
|
|
- chroma_addr[0] = plane->dma_addr[0]
|
|
|
- + (plane->pitch * plane->fb_height);
|
|
|
- }
|
|
|
+ luma_addr[0] = plane->dma_addr[0];
|
|
|
+ chroma_addr[0] = plane->dma_addr[1];
|
|
|
|
|
|
if (plane->scan_flag & DRM_MODE_FLAG_INTERLACE) {
|
|
|
ctx->interlace = true;
|
|
@@ -484,6 +477,7 @@ static void vp_video_buffer(struct mixer_context *ctx, int win)
|
|
|
mixer_vsync_set_update(ctx, true);
|
|
|
spin_unlock_irqrestore(&res->reg_slock, flags);
|
|
|
|
|
|
+ mixer_regs_dump(ctx);
|
|
|
vp_regs_dump(ctx);
|
|
|
}
|
|
|
|
|
@@ -518,7 +512,7 @@ fail:
|
|
|
return -ENOTSUPP;
|
|
|
}
|
|
|
|
|
|
-static void mixer_graph_buffer(struct mixer_context *ctx, int win)
|
|
|
+static void mixer_graph_buffer(struct mixer_context *ctx, unsigned int win)
|
|
|
{
|
|
|
struct mixer_resources *res = &ctx->mixer_res;
|
|
|
unsigned long flags;
|
|
@@ -531,20 +525,27 @@ static void mixer_graph_buffer(struct mixer_context *ctx, int win)
|
|
|
|
|
|
plane = &ctx->planes[win];
|
|
|
|
|
|
- #define RGB565 4
|
|
|
- #define ARGB1555 5
|
|
|
- #define ARGB4444 6
|
|
|
- #define ARGB8888 7
|
|
|
+ switch (plane->pixel_format) {
|
|
|
+ case DRM_FORMAT_XRGB4444:
|
|
|
+ fmt = MXR_FORMAT_ARGB4444;
|
|
|
+ break;
|
|
|
|
|
|
- switch (plane->bpp) {
|
|
|
- case 16:
|
|
|
- fmt = ARGB4444;
|
|
|
+ case DRM_FORMAT_XRGB1555:
|
|
|
+ fmt = MXR_FORMAT_ARGB1555;
|
|
|
break;
|
|
|
- case 32:
|
|
|
- fmt = ARGB8888;
|
|
|
+
|
|
|
+ case DRM_FORMAT_RGB565:
|
|
|
+ fmt = MXR_FORMAT_RGB565;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case DRM_FORMAT_XRGB8888:
|
|
|
+ case DRM_FORMAT_ARGB8888:
|
|
|
+ fmt = MXR_FORMAT_ARGB8888;
|
|
|
break;
|
|
|
+
|
|
|
default:
|
|
|
- fmt = ARGB8888;
|
|
|
+ DRM_DEBUG_KMS("pixelformat unsupported by mixer\n");
|
|
|
+ return;
|
|
|
}
|
|
|
|
|
|
/* check if mixer supports requested scaling setup */
|
|
@@ -617,6 +618,8 @@ static void mixer_graph_buffer(struct mixer_context *ctx, int win)
|
|
|
|
|
|
mixer_vsync_set_update(ctx, true);
|
|
|
spin_unlock_irqrestore(&res->reg_slock, flags);
|
|
|
+
|
|
|
+ mixer_regs_dump(ctx);
|
|
|
}
|
|
|
|
|
|
static void vp_win_reset(struct mixer_context *ctx)
|
|
@@ -1070,6 +1073,7 @@ static void mixer_poweroff(struct mixer_context *ctx)
|
|
|
mutex_unlock(&ctx->mixer_mutex);
|
|
|
|
|
|
mixer_stop(ctx);
|
|
|
+ mixer_regs_dump(ctx);
|
|
|
mixer_window_suspend(ctx);
|
|
|
|
|
|
ctx->int_en = mixer_reg_read(res, MXR_INT_EN);
|
|
@@ -1126,7 +1130,7 @@ int mixer_check_mode(struct drm_display_mode *mode)
|
|
|
return -EINVAL;
|
|
|
}
|
|
|
|
|
|
-static struct exynos_drm_crtc_ops mixer_crtc_ops = {
|
|
|
+static const struct exynos_drm_crtc_ops mixer_crtc_ops = {
|
|
|
.dpms = mixer_dpms,
|
|
|
.enable_vblank = mixer_enable_vblank,
|
|
|
.disable_vblank = mixer_disable_vblank,
|
|
@@ -1156,7 +1160,7 @@ static struct mixer_drv_data exynos4210_mxr_drv_data = {
|
|
|
.has_sclk = 1,
|
|
|
};
|
|
|
|
|
|
-static struct platform_device_id mixer_driver_types[] = {
|
|
|
+static const struct platform_device_id mixer_driver_types[] = {
|
|
|
{
|
|
|
.name = "s5p-mixer",
|
|
|
.driver_data = (unsigned long)&exynos4210_mxr_drv_data,
|