diff options
Diffstat (limited to 'drivers/video/b2r2/b2r2_utils.c')
-rw-r--r-- | drivers/video/b2r2/b2r2_utils.c | 104 |
1 files changed, 57 insertions, 47 deletions
diff --git a/drivers/video/b2r2/b2r2_utils.c b/drivers/video/b2r2/b2r2_utils.c index 87949a37b6b..3df7a272211 100644 --- a/drivers/video/b2r2/b2r2_utils.c +++ b/drivers/video/b2r2/b2r2_utils.c @@ -8,15 +8,14 @@ * License terms: GNU General Public License (GPL), version 2. */ -#include "b2r2_utils.h" - -#include "b2r2_debug.h" - -#include <video/b2r2_blt.h> - #include <linux/kernel.h> #include <linux/errno.h> +#include <video/b2r2_blt.h> + +#include "b2r2_utils.h" +#include "b2r2_debug.h" +#include "b2r2_internal.h" const s32 b2r2_s32_max = 2147483647; @@ -25,18 +24,19 @@ const s32 b2r2_s32_max = 2147483647; * calculate_scale_factor() - calculates the scale factor between the given * values */ -int calculate_scale_factor(u32 from, u32 to, u16 *sf_out) +int calculate_scale_factor(struct b2r2_control *cont, + u32 from, u32 to, u16 *sf_out) { int ret; u32 sf; - b2r2_log_info("%s\n", __func__); + b2r2_log_info(cont->dev, "%s\n", __func__); if (to == from) { *sf_out = 1 << 10; return 0; } else if (to == 0) { - b2r2_log_err("%s: To is 0!\n", __func__); + b2r2_log_err(cont->dev, "%s: To is 0!\n", __func__); BUG_ON(1); } @@ -44,12 +44,12 @@ int calculate_scale_factor(u32 from, u32 to, u16 *sf_out) if ((sf & 0xffff0000) != 0) { /* Overflow error */ - b2r2_log_warn("%s: " + b2r2_log_warn(cont->dev, "%s: " "Scale factor too large\n", __func__); ret = -EINVAL; goto error; } else if (sf == 0) { - b2r2_log_warn("%s: " + b2r2_log_warn(cont->dev, "%s: " "Scale factor too small\n", __func__); ret = -EINVAL; goto error; @@ -57,12 +57,12 @@ int calculate_scale_factor(u32 from, u32 to, u16 *sf_out) *sf_out = (u16)sf; - b2r2_log_info("%s exit\n", __func__); + b2r2_log_info(cont->dev, "%s exit\n", __func__); return 0; error: - b2r2_log_warn("%s: Exit...\n", __func__); + b2r2_log_warn(cont->dev, "%s: Exit...\n", __func__); return ret; } @@ -127,7 +127,8 @@ void b2r2_intersect_rects(struct b2r2_blt_rect *rect1, * the old source rectangle corresponds to * to the new part of old destination rectangle. */ -void b2r2_trim_rects(const struct b2r2_blt_req *req, +void b2r2_trim_rects(struct b2r2_control *cont, + const struct b2r2_blt_req *req, struct b2r2_blt_rect *new_bg_rect, struct b2r2_blt_rect *new_dst_rect, struct b2r2_blt_rect *new_src_rect) @@ -149,10 +150,12 @@ void b2r2_trim_rects(const struct b2r2_blt_req *req, s16 hsf; s16 vsf; - b2r2_log_info("%s\nold_dst_rect(x,y,w,h)=(%d, %d, %d, %d)\n", __func__, + b2r2_log_info(cont->dev, + "%s\nold_dst_rect(x,y,w,h)=(%d, %d, %d, %d)\n", __func__, old_dst_rect->x, old_dst_rect->y, old_dst_rect->width, old_dst_rect->height); - b2r2_log_info("%s\nold_src_rect(x,y,w,h)=(%d, %d, %d, %d)\n", __func__, + b2r2_log_info(cont->dev, + "%s\nold_src_rect(x,y,w,h)=(%d, %d, %d, %d)\n", __func__, old_src_rect->x, old_src_rect->y, old_src_rect->width, old_src_rect->height); @@ -164,7 +167,8 @@ void b2r2_trim_rects(const struct b2r2_blt_req *req, goto keep_rects; b2r2_intersect_rects(old_dst_rect, &dst_img_bounds, new_dst_rect); - b2r2_log_info("%s\nnew_dst_rect(x,y,w,h)=(%d, %d, %d, %d)\n", __func__, + b2r2_log_info(cont->dev, + "%s\nnew_dst_rect(x,y,w,h)=(%d, %d, %d, %d)\n", __func__, new_dst_rect->x, new_dst_rect->y, new_dst_rect->width, new_dst_rect->height); @@ -177,13 +181,13 @@ void b2r2_trim_rects(const struct b2r2_blt_req *req, if (transform & B2R2_BLT_TRANSFORM_CCW_ROT_90) { int res = 0; - res = calculate_scale_factor(old_src_rect->width, + res = calculate_scale_factor(cont, old_src_rect->width, old_dst_rect->height, &hsf); /* invalid dimensions, leave them to validation */ if (res < 0) goto keep_rects; - res = calculate_scale_factor(old_src_rect->height, + res = calculate_scale_factor(cont, old_src_rect->height, old_dst_rect->width, &vsf); if (res < 0) goto keep_rects; @@ -203,12 +207,12 @@ void b2r2_trim_rects(const struct b2r2_blt_req *req, src_h = new_dst_rect->width * vsf; } else { int res = 0; - res = calculate_scale_factor(old_src_rect->width, + res = calculate_scale_factor(cont, old_src_rect->width, old_dst_rect->width, &hsf); if (res < 0) goto keep_rects; - res = calculate_scale_factor(old_src_rect->height, + res = calculate_scale_factor(cont, old_src_rect->height, old_dst_rect->height, &vsf); if (res < 0) goto keep_rects; @@ -266,7 +270,8 @@ void b2r2_trim_rects(const struct b2r2_blt_req *req, new_src_rect->width = src_w; new_src_rect->height = src_h; - b2r2_log_info("%s\nnew_src_rect(x,y,w,h)=(%d, %d, %d, %d)\n", __func__, + b2r2_log_info(cont->dev, + "%s\nnew_src_rect(x,y,w,h)=(%d, %d, %d, %d)\n", __func__, new_src_rect->x, new_src_rect->y, new_src_rect->width, new_src_rect->height); @@ -274,14 +279,16 @@ void b2r2_trim_rects(const struct b2r2_blt_req *req, /* Modify bg_rect in the same way as dst_rect */ s32 dw = new_dst_rect->width - old_dst_rect->width; s32 dh = new_dst_rect->height - old_dst_rect->height; - b2r2_log_info("%s\nold bg_rect(x,y,w,h)=(%d, %d, %d, %d)\n", + b2r2_log_info(cont->dev, + "%s\nold bg_rect(x,y,w,h)=(%d, %d, %d, %d)\n", __func__, old_bg_rect->x, old_bg_rect->y, old_bg_rect->width, old_bg_rect->height); new_bg_rect->x = old_bg_rect->x + dx; new_bg_rect->y = old_bg_rect->y + dy; new_bg_rect->width = old_bg_rect->width + dw; new_bg_rect->height = old_bg_rect->height + dh; - b2r2_log_info("%s\nnew bg_rect(x,y,w,h)=(%d, %d, %d, %d)\n", + b2r2_log_info(cont->dev, + "%s\nnew bg_rect(x,y,w,h)=(%d, %d, %d, %d)\n", __func__, new_bg_rect->x, new_bg_rect->y, new_bg_rect->width, new_bg_rect->height); } @@ -294,11 +301,11 @@ keep_rects: *new_src_rect = *old_src_rect; *new_dst_rect = *old_dst_rect; *new_bg_rect = *old_bg_rect; - b2r2_log_info("%s original rectangles preserved.\n", __func__); + b2r2_log_info(cont->dev, "%s original rectangles preserved.\n", __func__); return; } -int b2r2_get_fmt_bpp(enum b2r2_blt_fmt fmt) +int b2r2_get_fmt_bpp(struct b2r2_control *cont, enum b2r2_blt_fmt fmt) { /* * Currently this function is not used that often but if that changes a @@ -344,13 +351,14 @@ int b2r2_get_fmt_bpp(enum b2r2_blt_fmt fmt) return 32; default: - b2r2_log_err("%s: Internal error! Format %#x not recognized.\n", + b2r2_log_err(cont->dev, + "%s: Internal error! Format %#x not recognized.\n", __func__, fmt); return 32; } } -int b2r2_get_fmt_y_bpp(enum b2r2_blt_fmt fmt) +int b2r2_get_fmt_y_bpp(struct b2r2_control *cont, enum b2r2_blt_fmt fmt) { switch (fmt) { case B2R2_BLT_FMT_YUV420_PACKED_PLANAR: @@ -373,7 +381,8 @@ int b2r2_get_fmt_y_bpp(enum b2r2_blt_fmt fmt) return 8; default: - b2r2_log_err("%s: Internal error! Non YCbCr format supplied.\n", + b2r2_log_err(cont->dev, + "%s: Internal error! Non YCbCr format supplied.\n", __func__); return 8; } @@ -533,39 +542,40 @@ bool b2r2_is_mb_fmt(enum b2r2_blt_fmt fmt) } } -u32 b2r2_calc_pitch_from_width(s32 width, enum b2r2_blt_fmt fmt) +u32 b2r2_calc_pitch_from_width(struct b2r2_control *cont, + s32 width, enum b2r2_blt_fmt fmt) { if (b2r2_is_single_plane_fmt(fmt)) { return (u32)b2r2_div_round_up(width * - b2r2_get_fmt_bpp(fmt), 8); + b2r2_get_fmt_bpp(cont, fmt), 8); } else if (b2r2_is_ycbcrsp_fmt(fmt) || b2r2_is_ycbcrp_fmt(fmt)) { return (u32)b2r2_div_round_up(width * - b2r2_get_fmt_y_bpp(fmt), 8); + b2r2_get_fmt_y_bpp(cont, fmt), 8); } else { - b2r2_log_err("%s: Internal error! " - "Pitchless format supplied.\n", - __func__); + b2r2_log_err(cont->dev, "%s: Internal error! " + "Pitchless format supplied.\n", + __func__); return 0; } } -u32 b2r2_get_img_pitch(struct b2r2_blt_img *img) +u32 b2r2_get_img_pitch(struct b2r2_control *cont, struct b2r2_blt_img *img) { if (img->pitch != 0) return img->pitch; else - return b2r2_calc_pitch_from_width(img->width, img->fmt); + return b2r2_calc_pitch_from_width(cont, img->width, img->fmt); } -s32 b2r2_get_img_size(struct b2r2_blt_img *img) +s32 b2r2_get_img_size(struct b2r2_control *cont, struct b2r2_blt_img *img) { if (b2r2_is_single_plane_fmt(img->fmt)) { - return (s32)b2r2_get_img_pitch(img) * img->height; + return (s32)b2r2_get_img_pitch(cont, img) * img->height; } else if (b2r2_is_ycbcrsp_fmt(img->fmt) || b2r2_is_ycbcrp_fmt(img->fmt)) { s32 y_plane_size; - y_plane_size = (s32)b2r2_get_img_pitch(img) * img->height; + y_plane_size = (s32)b2r2_get_img_pitch(cont, img) * img->height; if (b2r2_is_ycbcr420_fmt(img->fmt)) { return y_plane_size + y_plane_size / 2; @@ -574,18 +584,18 @@ s32 b2r2_get_img_size(struct b2r2_blt_img *img) } else if (b2r2_is_ycbcr444_fmt(img->fmt)) { return y_plane_size * 3; } else { - b2r2_log_err("%s: Internal error! " - "Format %#x not recognized.\n", - __func__, img->fmt); + b2r2_log_err(cont->dev, "%s: Internal error!" + " Format %#x not recognized.\n", + __func__, img->fmt); return 0; } } else if (b2r2_is_mb_fmt(img->fmt)) { return (img->width * img->height * - b2r2_get_fmt_bpp(img->fmt)) / 8; + b2r2_get_fmt_bpp(cont, img->fmt)) / 8; } else { - b2r2_log_err("%s: Internal error! " - "Format %#x not recognized.\n", - __func__, img->fmt); + b2r2_log_err(cont->dev, "%s: Internal error! " + "Format %#x not recognized.\n", + __func__, img->fmt); return 0; } } |