Commit 405f230c authored by Sylwester Nawrocki's avatar Sylwester Nawrocki Committed by Mauro Carvalho Chehab

[media] s5p-fimc: Add variant data structure for Exynos4x12

Add variant data structures for Exynos4212 and Exynos4412 SoC.
Add 'const' qualifier for the variant description structures.
Also remove has_cam_if flags from FIMC3 on Exynos4210 SoC is
it has no interconnections the camera ports.
Signed-off-by: default avatarSylwester Nawrocki <s.nawrocki@samsung.com>
Signed-off-by: default avatarKyungmin Park <kyungmin.park@samsung.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 35f29248
...@@ -626,8 +626,8 @@ static struct fimc_fmt *fimc_capture_try_format(struct fimc_ctx *ctx, ...@@ -626,8 +626,8 @@ static struct fimc_fmt *fimc_capture_try_format(struct fimc_ctx *ctx,
{ {
bool rotation = ctx->rotation == 90 || ctx->rotation == 270; bool rotation = ctx->rotation == 90 || ctx->rotation == 270;
struct fimc_dev *fimc = ctx->fimc_dev; struct fimc_dev *fimc = ctx->fimc_dev;
struct fimc_variant *var = fimc->variant; const struct fimc_variant *var = fimc->variant;
struct fimc_pix_limit *pl = var->pix_limit; const struct fimc_pix_limit *pl = var->pix_limit;
struct fimc_frame *dst = &ctx->d_frame; struct fimc_frame *dst = &ctx->d_frame;
u32 depth, min_w, max_w, min_h, align_h = 3; u32 depth, min_w, max_w, min_h, align_h = 3;
u32 mask = FMT_FLAGS_CAM; u32 mask = FMT_FLAGS_CAM;
...@@ -699,8 +699,8 @@ static void fimc_capture_try_selection(struct fimc_ctx *ctx, ...@@ -699,8 +699,8 @@ static void fimc_capture_try_selection(struct fimc_ctx *ctx,
{ {
bool rotate = ctx->rotation == 90 || ctx->rotation == 270; bool rotate = ctx->rotation == 90 || ctx->rotation == 270;
struct fimc_dev *fimc = ctx->fimc_dev; struct fimc_dev *fimc = ctx->fimc_dev;
struct fimc_variant *var = fimc->variant; const struct fimc_variant *var = fimc->variant;
struct fimc_pix_limit *pl = var->pix_limit; const struct fimc_pix_limit *pl = var->pix_limit;
struct fimc_frame *sink = &ctx->s_frame; struct fimc_frame *sink = &ctx->s_frame;
u32 max_w, max_h, min_w = 0, min_h = 0, min_sz; u32 max_w, max_h, min_w = 0, min_h = 0, min_sz;
u32 align_sz = 0, align_h = 4; u32 align_sz = 0, align_h = 4;
......
...@@ -241,7 +241,7 @@ static int fimc_get_scaler_factor(u32 src, u32 tar, u32 *ratio, u32 *shift) ...@@ -241,7 +241,7 @@ static int fimc_get_scaler_factor(u32 src, u32 tar, u32 *ratio, u32 *shift)
int fimc_set_scaler_info(struct fimc_ctx *ctx) int fimc_set_scaler_info(struct fimc_ctx *ctx)
{ {
struct fimc_variant *variant = ctx->fimc_dev->variant; const struct fimc_variant *variant = ctx->fimc_dev->variant;
struct device *dev = &ctx->fimc_dev->pdev->dev; struct device *dev = &ctx->fimc_dev->pdev->dev;
struct fimc_scaler *sc = &ctx->scaler; struct fimc_scaler *sc = &ctx->scaler;
struct fimc_frame *s_frame = &ctx->s_frame; struct fimc_frame *s_frame = &ctx->s_frame;
...@@ -440,7 +440,7 @@ void fimc_set_yuv_order(struct fimc_ctx *ctx) ...@@ -440,7 +440,7 @@ void fimc_set_yuv_order(struct fimc_ctx *ctx)
void fimc_prepare_dma_offset(struct fimc_ctx *ctx, struct fimc_frame *f) void fimc_prepare_dma_offset(struct fimc_ctx *ctx, struct fimc_frame *f)
{ {
struct fimc_variant *variant = ctx->fimc_dev->variant; const struct fimc_variant *variant = ctx->fimc_dev->variant;
u32 i, depth = 0; u32 i, depth = 0;
for (i = 0; i < f->fmt->colplanes; i++) for (i = 0; i < f->fmt->colplanes; i++)
...@@ -524,7 +524,7 @@ static int fimc_set_color_effect(struct fimc_ctx *ctx, enum v4l2_colorfx colorfx ...@@ -524,7 +524,7 @@ static int fimc_set_color_effect(struct fimc_ctx *ctx, enum v4l2_colorfx colorfx
static int __fimc_s_ctrl(struct fimc_ctx *ctx, struct v4l2_ctrl *ctrl) static int __fimc_s_ctrl(struct fimc_ctx *ctx, struct v4l2_ctrl *ctrl)
{ {
struct fimc_dev *fimc = ctx->fimc_dev; struct fimc_dev *fimc = ctx->fimc_dev;
struct fimc_variant *variant = fimc->variant; const struct fimc_variant *variant = fimc->variant;
unsigned int flags = FIMC_DST_FMT | FIMC_SRC_FMT; unsigned int flags = FIMC_DST_FMT | FIMC_SRC_FMT;
int ret = 0; int ret = 0;
...@@ -591,7 +591,7 @@ static const struct v4l2_ctrl_ops fimc_ctrl_ops = { ...@@ -591,7 +591,7 @@ static const struct v4l2_ctrl_ops fimc_ctrl_ops = {
int fimc_ctrls_create(struct fimc_ctx *ctx) int fimc_ctrls_create(struct fimc_ctx *ctx)
{ {
struct fimc_variant *variant = ctx->fimc_dev->variant; const struct fimc_variant *variant = ctx->fimc_dev->variant;
unsigned int max_alpha = fimc_get_alpha_mask(ctx->d_frame.fmt); unsigned int max_alpha = fimc_get_alpha_mask(ctx->d_frame.fmt);
struct fimc_ctrls *ctrls = &ctx->ctrls; struct fimc_ctrls *ctrls = &ctx->ctrls;
struct v4l2_ctrl_handler *handler = &ctrls->handler; struct v4l2_ctrl_handler *handler = &ctrls->handler;
...@@ -881,7 +881,7 @@ static int fimc_m2m_resume(struct fimc_dev *fimc) ...@@ -881,7 +881,7 @@ static int fimc_m2m_resume(struct fimc_dev *fimc)
static int fimc_probe(struct platform_device *pdev) static int fimc_probe(struct platform_device *pdev)
{ {
struct fimc_drvdata *drv_data = fimc_get_drvdata(pdev); const struct fimc_drvdata *drv_data = fimc_get_drvdata(pdev);
struct s5p_platform_fimc *pdata; struct s5p_platform_fimc *pdata;
struct fimc_dev *fimc; struct fimc_dev *fimc;
struct resource *res; struct resource *res;
...@@ -1053,7 +1053,7 @@ static int __devexit fimc_remove(struct platform_device *pdev) ...@@ -1053,7 +1053,7 @@ static int __devexit fimc_remove(struct platform_device *pdev)
} }
/* Image pixel limits, similar across several FIMC HW revisions. */ /* Image pixel limits, similar across several FIMC HW revisions. */
static struct fimc_pix_limit s5p_pix_limit[4] = { static const struct fimc_pix_limit s5p_pix_limit[4] = {
[0] = { [0] = {
.scaler_en_w = 3264, .scaler_en_w = 3264,
.scaler_dis_w = 8192, .scaler_dis_w = 8192,
...@@ -1088,7 +1088,7 @@ static struct fimc_pix_limit s5p_pix_limit[4] = { ...@@ -1088,7 +1088,7 @@ static struct fimc_pix_limit s5p_pix_limit[4] = {
}, },
}; };
static struct fimc_variant fimc0_variant_s5p = { static const struct fimc_variant fimc0_variant_s5p = {
.has_inp_rot = 1, .has_inp_rot = 1,
.has_out_rot = 1, .has_out_rot = 1,
.has_cam_if = 1, .has_cam_if = 1,
...@@ -1100,7 +1100,7 @@ static struct fimc_variant fimc0_variant_s5p = { ...@@ -1100,7 +1100,7 @@ static struct fimc_variant fimc0_variant_s5p = {
.pix_limit = &s5p_pix_limit[0], .pix_limit = &s5p_pix_limit[0],
}; };
static struct fimc_variant fimc2_variant_s5p = { static const struct fimc_variant fimc2_variant_s5p = {
.has_cam_if = 1, .has_cam_if = 1,
.min_inp_pixsize = 16, .min_inp_pixsize = 16,
.min_out_pixsize = 16, .min_out_pixsize = 16,
...@@ -1110,7 +1110,7 @@ static struct fimc_variant fimc2_variant_s5p = { ...@@ -1110,7 +1110,7 @@ static struct fimc_variant fimc2_variant_s5p = {
.pix_limit = &s5p_pix_limit[1], .pix_limit = &s5p_pix_limit[1],
}; };
static struct fimc_variant fimc0_variant_s5pv210 = { static const struct fimc_variant fimc0_variant_s5pv210 = {
.pix_hoff = 1, .pix_hoff = 1,
.has_inp_rot = 1, .has_inp_rot = 1,
.has_out_rot = 1, .has_out_rot = 1,
...@@ -1123,7 +1123,7 @@ static struct fimc_variant fimc0_variant_s5pv210 = { ...@@ -1123,7 +1123,7 @@ static struct fimc_variant fimc0_variant_s5pv210 = {
.pix_limit = &s5p_pix_limit[1], .pix_limit = &s5p_pix_limit[1],
}; };
static struct fimc_variant fimc1_variant_s5pv210 = { static const struct fimc_variant fimc1_variant_s5pv210 = {
.pix_hoff = 1, .pix_hoff = 1,
.has_inp_rot = 1, .has_inp_rot = 1,
.has_out_rot = 1, .has_out_rot = 1,
...@@ -1137,7 +1137,7 @@ static struct fimc_variant fimc1_variant_s5pv210 = { ...@@ -1137,7 +1137,7 @@ static struct fimc_variant fimc1_variant_s5pv210 = {
.pix_limit = &s5p_pix_limit[2], .pix_limit = &s5p_pix_limit[2],
}; };
static struct fimc_variant fimc2_variant_s5pv210 = { static const struct fimc_variant fimc2_variant_s5pv210 = {
.has_cam_if = 1, .has_cam_if = 1,
.pix_hoff = 1, .pix_hoff = 1,
.min_inp_pixsize = 16, .min_inp_pixsize = 16,
...@@ -1148,7 +1148,7 @@ static struct fimc_variant fimc2_variant_s5pv210 = { ...@@ -1148,7 +1148,7 @@ static struct fimc_variant fimc2_variant_s5pv210 = {
.pix_limit = &s5p_pix_limit[2], .pix_limit = &s5p_pix_limit[2],
}; };
static struct fimc_variant fimc0_variant_exynos4 = { static const struct fimc_variant fimc0_variant_exynos4210 = {
.pix_hoff = 1, .pix_hoff = 1,
.has_inp_rot = 1, .has_inp_rot = 1,
.has_out_rot = 1, .has_out_rot = 1,
...@@ -1164,9 +1164,38 @@ static struct fimc_variant fimc0_variant_exynos4 = { ...@@ -1164,9 +1164,38 @@ static struct fimc_variant fimc0_variant_exynos4 = {
.pix_limit = &s5p_pix_limit[1], .pix_limit = &s5p_pix_limit[1],
}; };
static struct fimc_variant fimc3_variant_exynos4 = { static const struct fimc_variant fimc3_variant_exynos4210 = {
.pix_hoff = 1, .pix_hoff = 1,
.has_cistatus2 = 1,
.has_mainscaler_ext = 1,
.has_alpha = 1,
.min_inp_pixsize = 16,
.min_out_pixsize = 16,
.hor_offs_align = 2,
.min_vsize_align = 1,
.out_buf_count = 32,
.pix_limit = &s5p_pix_limit[3],
};
static const struct fimc_variant fimc0_variant_exynos4x12 = {
.pix_hoff = 1,
.has_inp_rot = 1,
.has_out_rot = 1,
.has_cam_if = 1, .has_cam_if = 1,
.has_isp_wb = 1,
.has_cistatus2 = 1,
.has_mainscaler_ext = 1,
.has_alpha = 1,
.min_inp_pixsize = 16,
.min_out_pixsize = 16,
.hor_offs_align = 2,
.min_vsize_align = 1,
.out_buf_count = 32,
.pix_limit = &s5p_pix_limit[1],
};
static const struct fimc_variant fimc3_variant_exynos4x12 = {
.pix_hoff = 1,
.has_cistatus2 = 1, .has_cistatus2 = 1,
.has_mainscaler_ext = 1, .has_mainscaler_ext = 1,
.has_alpha = 1, .has_alpha = 1,
...@@ -1179,7 +1208,7 @@ static struct fimc_variant fimc3_variant_exynos4 = { ...@@ -1179,7 +1208,7 @@ static struct fimc_variant fimc3_variant_exynos4 = {
}; };
/* S5PC100 */ /* S5PC100 */
static struct fimc_drvdata fimc_drvdata_s5p = { static const struct fimc_drvdata fimc_drvdata_s5p = {
.variant = { .variant = {
[0] = &fimc0_variant_s5p, [0] = &fimc0_variant_s5p,
[1] = &fimc0_variant_s5p, [1] = &fimc0_variant_s5p,
...@@ -1190,7 +1219,7 @@ static struct fimc_drvdata fimc_drvdata_s5p = { ...@@ -1190,7 +1219,7 @@ static struct fimc_drvdata fimc_drvdata_s5p = {
}; };
/* S5PV210, S5PC110 */ /* S5PV210, S5PC110 */
static struct fimc_drvdata fimc_drvdata_s5pv210 = { static const struct fimc_drvdata fimc_drvdata_s5pv210 = {
.variant = { .variant = {
[0] = &fimc0_variant_s5pv210, [0] = &fimc0_variant_s5pv210,
[1] = &fimc1_variant_s5pv210, [1] = &fimc1_variant_s5pv210,
...@@ -1201,18 +1230,30 @@ static struct fimc_drvdata fimc_drvdata_s5pv210 = { ...@@ -1201,18 +1230,30 @@ static struct fimc_drvdata fimc_drvdata_s5pv210 = {
}; };
/* EXYNOS4210, S5PV310, S5PC210 */ /* EXYNOS4210, S5PV310, S5PC210 */
static struct fimc_drvdata fimc_drvdata_exynos4 = { static const struct fimc_drvdata fimc_drvdata_exynos4210 = {
.variant = {
[0] = &fimc0_variant_exynos4210,
[1] = &fimc0_variant_exynos4210,
[2] = &fimc0_variant_exynos4210,
[3] = &fimc3_variant_exynos4210,
},
.num_entities = 4,
.lclk_frequency = 166000000UL,
};
/* EXYNOS4212, EXYNOS4412 */
static const struct fimc_drvdata fimc_drvdata_exynos4x12 = {
.variant = { .variant = {
[0] = &fimc0_variant_exynos4, [0] = &fimc0_variant_exynos4x12,
[1] = &fimc0_variant_exynos4, [1] = &fimc0_variant_exynos4x12,
[2] = &fimc0_variant_exynos4, [2] = &fimc0_variant_exynos4x12,
[3] = &fimc3_variant_exynos4, [3] = &fimc3_variant_exynos4x12,
}, },
.num_entities = 4, .num_entities = 4,
.lclk_frequency = 166000000UL, .lclk_frequency = 166000000UL,
}; };
static struct platform_device_id fimc_driver_ids[] = { static const struct platform_device_id fimc_driver_ids[] = {
{ {
.name = "s5p-fimc", .name = "s5p-fimc",
.driver_data = (unsigned long)&fimc_drvdata_s5p, .driver_data = (unsigned long)&fimc_drvdata_s5p,
...@@ -1221,7 +1262,10 @@ static struct platform_device_id fimc_driver_ids[] = { ...@@ -1221,7 +1262,10 @@ static struct platform_device_id fimc_driver_ids[] = {
.driver_data = (unsigned long)&fimc_drvdata_s5pv210, .driver_data = (unsigned long)&fimc_drvdata_s5pv210,
}, { }, {
.name = "exynos4-fimc", .name = "exynos4-fimc",
.driver_data = (unsigned long)&fimc_drvdata_exynos4, .driver_data = (unsigned long)&fimc_drvdata_exynos4210,
}, {
.name = "exynos4x12-fimc",
.driver_data = (unsigned long)&fimc_drvdata_exynos4x12,
}, },
{}, {},
}; };
......
...@@ -372,6 +372,7 @@ struct fimc_pix_limit { ...@@ -372,6 +372,7 @@ struct fimc_pix_limit {
* @has_mainscaler_ext: 1 if extended mainscaler ratios in CIEXTEN register * @has_mainscaler_ext: 1 if extended mainscaler ratios in CIEXTEN register
* are present in this IP revision * are present in this IP revision
* @has_cam_if: set if this instance has a camera input interface * @has_cam_if: set if this instance has a camera input interface
* @has_isp_wb: set if this instance has ISP writeback input
* @pix_limit: pixel size constraints for the scaler * @pix_limit: pixel size constraints for the scaler
* @min_inp_pixsize: minimum input pixel size * @min_inp_pixsize: minimum input pixel size
* @min_out_pixsize: minimum output pixel size * @min_out_pixsize: minimum output pixel size
...@@ -386,8 +387,9 @@ struct fimc_variant { ...@@ -386,8 +387,9 @@ struct fimc_variant {
unsigned int has_cistatus2:1; unsigned int has_cistatus2:1;
unsigned int has_mainscaler_ext:1; unsigned int has_mainscaler_ext:1;
unsigned int has_cam_if:1; unsigned int has_cam_if:1;
unsigned int has_isp_wb:1;
unsigned int has_alpha:1; unsigned int has_alpha:1;
struct fimc_pix_limit *pix_limit; const struct fimc_pix_limit *pix_limit;
u16 min_inp_pixsize; u16 min_inp_pixsize;
u16 min_out_pixsize; u16 min_out_pixsize;
u16 hor_offs_align; u16 hor_offs_align;
...@@ -402,7 +404,7 @@ struct fimc_variant { ...@@ -402,7 +404,7 @@ struct fimc_variant {
* @lclk_frequency: local bus clock frequency * @lclk_frequency: local bus clock frequency
*/ */
struct fimc_drvdata { struct fimc_drvdata {
struct fimc_variant *variant[FIMC_MAX_DEVS]; const struct fimc_variant *variant[FIMC_MAX_DEVS];
int num_entities; int num_entities;
unsigned long lclk_frequency; unsigned long lclk_frequency;
}; };
...@@ -435,7 +437,7 @@ struct fimc_dev { ...@@ -435,7 +437,7 @@ struct fimc_dev {
struct mutex lock; struct mutex lock;
struct platform_device *pdev; struct platform_device *pdev;
struct s5p_platform_fimc *pdata; struct s5p_platform_fimc *pdata;
struct fimc_variant *variant; const struct fimc_variant *variant;
u16 id; u16 id;
struct clk *clock[MAX_FIMC_CLOCKS]; struct clk *clock[MAX_FIMC_CLOCKS];
void __iomem *regs; void __iomem *regs;
......
...@@ -300,7 +300,7 @@ static int fimc_m2m_g_fmt_mplane(struct file *file, void *fh, ...@@ -300,7 +300,7 @@ static int fimc_m2m_g_fmt_mplane(struct file *file, void *fh,
static int fimc_try_fmt_mplane(struct fimc_ctx *ctx, struct v4l2_format *f) static int fimc_try_fmt_mplane(struct fimc_ctx *ctx, struct v4l2_format *f)
{ {
struct fimc_dev *fimc = ctx->fimc_dev; struct fimc_dev *fimc = ctx->fimc_dev;
struct fimc_variant *variant = fimc->variant; const struct fimc_variant *variant = fimc->variant;
struct v4l2_pix_format_mplane *pix = &f->fmt.pix_mp; struct v4l2_pix_format_mplane *pix = &f->fmt.pix_mp;
struct fimc_fmt *fmt; struct fimc_fmt *fmt;
u32 max_w, mod_x, mod_y; u32 max_w, mod_x, mod_y;
......
...@@ -312,7 +312,7 @@ static void fimc_hw_set_scaler(struct fimc_ctx *ctx) ...@@ -312,7 +312,7 @@ static void fimc_hw_set_scaler(struct fimc_ctx *ctx)
void fimc_hw_set_mainscaler(struct fimc_ctx *ctx) void fimc_hw_set_mainscaler(struct fimc_ctx *ctx)
{ {
struct fimc_dev *dev = ctx->fimc_dev; struct fimc_dev *dev = ctx->fimc_dev;
struct fimc_variant *variant = dev->variant; const struct fimc_variant *variant = dev->variant;
struct fimc_scaler *sc = &ctx->scaler; struct fimc_scaler *sc = &ctx->scaler;
u32 cfg; u32 cfg;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment