linux/drivers/media/platform/mtk-mdp/mtk_mdp_regs.c
Thomas Gleixner 1802d0beec treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 174
Based on 1 normalized pattern(s):

  this program is free software you can redistribute it and or modify
  it under the terms of the gnu general public license version 2 as
  published by the free software foundation this program is
  distributed in the hope that it will be useful but without any
  warranty without even the implied warranty of merchantability or
  fitness for a particular purpose see the gnu general public license
  for more details

extracted by the scancode license scanner the SPDX license identifier

  GPL-2.0-only

has been chosen to replace the boilerplate/reference in 655 file(s).

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Allison Randal <allison@lohutok.net>
Reviewed-by: Kate Stewart <kstewart@linuxfoundation.org>
Reviewed-by: Richard Fontana <rfontana@redhat.com>
Cc: linux-spdx@vger.kernel.org
Link: https://lkml.kernel.org/r/20190527070034.575739538@linutronix.de
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2019-05-30 11:26:41 -07:00

149 lines
4.2 KiB
C

// SPDX-License-Identifier: GPL-2.0-only
/*
* Copyright (c) 2015-2016 MediaTek Inc.
* Author: Houlong Wei <houlong.wei@mediatek.com>
* Ming Hsiu Tsai <minghsiu.tsai@mediatek.com>
*/
#include <linux/platform_device.h>
#include "mtk_mdp_core.h"
#include "mtk_mdp_regs.h"
#define MDP_COLORFMT_PACK(VIDEO, PLANE, COPLANE, HF, VF, BITS, GROUP, SWAP, ID)\
(((VIDEO) << 27) | ((PLANE) << 24) | ((COPLANE) << 22) |\
((HF) << 20) | ((VF) << 18) | ((BITS) << 8) | ((GROUP) << 6) |\
((SWAP) << 5) | ((ID) << 0))
enum MDP_COLOR_ENUM {
MDP_COLOR_UNKNOWN = 0,
MDP_COLOR_NV12 = MDP_COLORFMT_PACK(0, 2, 1, 1, 1, 8, 1, 0, 12),
MDP_COLOR_I420 = MDP_COLORFMT_PACK(0, 3, 0, 1, 1, 8, 1, 0, 8),
MDP_COLOR_YV12 = MDP_COLORFMT_PACK(0, 3, 0, 1, 1, 8, 1, 1, 8),
/* Mediatek proprietary format */
MDP_COLOR_420_MT21 = MDP_COLORFMT_PACK(5, 2, 1, 1, 1, 256, 1, 0, 12),
};
static int32_t mtk_mdp_map_color_format(int v4l2_format)
{
switch (v4l2_format) {
case V4L2_PIX_FMT_NV12M:
case V4L2_PIX_FMT_NV12:
return MDP_COLOR_NV12;
case V4L2_PIX_FMT_MT21C:
return MDP_COLOR_420_MT21;
case V4L2_PIX_FMT_YUV420M:
case V4L2_PIX_FMT_YUV420:
return MDP_COLOR_I420;
case V4L2_PIX_FMT_YVU420:
return MDP_COLOR_YV12;
}
mtk_mdp_err("Unknown format 0x%x", v4l2_format);
return MDP_COLOR_UNKNOWN;
}
void mtk_mdp_hw_set_input_addr(struct mtk_mdp_ctx *ctx,
struct mtk_mdp_addr *addr)
{
struct mdp_buffer *src_buf = &ctx->vpu.vsi->src_buffer;
int i;
for (i = 0; i < ARRAY_SIZE(addr->addr); i++)
src_buf->addr_mva[i] = (uint64_t)addr->addr[i];
}
void mtk_mdp_hw_set_output_addr(struct mtk_mdp_ctx *ctx,
struct mtk_mdp_addr *addr)
{
struct mdp_buffer *dst_buf = &ctx->vpu.vsi->dst_buffer;
int i;
for (i = 0; i < ARRAY_SIZE(addr->addr); i++)
dst_buf->addr_mva[i] = (uint64_t)addr->addr[i];
}
void mtk_mdp_hw_set_in_size(struct mtk_mdp_ctx *ctx)
{
struct mtk_mdp_frame *frame = &ctx->s_frame;
struct mdp_config *config = &ctx->vpu.vsi->src_config;
/* Set input pixel offset */
config->crop_x = frame->crop.left;
config->crop_y = frame->crop.top;
/* Set input cropped size */
config->crop_w = frame->crop.width;
config->crop_h = frame->crop.height;
/* Set input original size */
config->x = 0;
config->y = 0;
config->w = frame->width;
config->h = frame->height;
}
void mtk_mdp_hw_set_in_image_format(struct mtk_mdp_ctx *ctx)
{
unsigned int i;
struct mtk_mdp_frame *frame = &ctx->s_frame;
struct mdp_config *config = &ctx->vpu.vsi->src_config;
struct mdp_buffer *src_buf = &ctx->vpu.vsi->src_buffer;
src_buf->plane_num = frame->fmt->num_comp;
config->format = mtk_mdp_map_color_format(frame->fmt->pixelformat);
config->w_stride = 0; /* MDP will calculate it by color format. */
config->h_stride = 0; /* MDP will calculate it by color format. */
for (i = 0; i < src_buf->plane_num; i++)
src_buf->plane_size[i] = frame->payload[i];
}
void mtk_mdp_hw_set_out_size(struct mtk_mdp_ctx *ctx)
{
struct mtk_mdp_frame *frame = &ctx->d_frame;
struct mdp_config *config = &ctx->vpu.vsi->dst_config;
config->crop_x = frame->crop.left;
config->crop_y = frame->crop.top;
config->crop_w = frame->crop.width;
config->crop_h = frame->crop.height;
config->x = 0;
config->y = 0;
config->w = frame->width;
config->h = frame->height;
}
void mtk_mdp_hw_set_out_image_format(struct mtk_mdp_ctx *ctx)
{
unsigned int i;
struct mtk_mdp_frame *frame = &ctx->d_frame;
struct mdp_config *config = &ctx->vpu.vsi->dst_config;
struct mdp_buffer *dst_buf = &ctx->vpu.vsi->dst_buffer;
dst_buf->plane_num = frame->fmt->num_comp;
config->format = mtk_mdp_map_color_format(frame->fmt->pixelformat);
config->w_stride = 0; /* MDP will calculate it by color format. */
config->h_stride = 0; /* MDP will calculate it by color format. */
for (i = 0; i < dst_buf->plane_num; i++)
dst_buf->plane_size[i] = frame->payload[i];
}
void mtk_mdp_hw_set_rotation(struct mtk_mdp_ctx *ctx)
{
struct mdp_config_misc *misc = &ctx->vpu.vsi->misc;
misc->orientation = ctx->ctrls.rotate->val;
misc->hflip = ctx->ctrls.hflip->val;
misc->vflip = ctx->ctrls.vflip->val;
}
void mtk_mdp_hw_set_global_alpha(struct mtk_mdp_ctx *ctx)
{
struct mdp_config_misc *misc = &ctx->vpu.vsi->misc;
misc->alpha = ctx->ctrls.global_alpha->val;
}