aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/video/s5p-fimc/fimc-reg.c
diff options
context:
space:
mode:
authorSylwester Nawrocki <s.nawrocki@samsung.com>2010-10-08 04:01:14 -0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2010-10-21 05:55:44 -0400
commit548aafcd9e73b14fd959ec3689d1551bf7f388d3 (patch)
treeb27564ac9ffddbb5e80745079e462cfc4e1e29ff /drivers/media/video/s5p-fimc/fimc-reg.c
parent77e6208252cccc377aecec18340ee0bfbcb02108 (diff)
[media] s5p-fimc: mem2mem driver refactoring and cleanup
Register access functions refactored for camera capture interface control. Removed the workqueue since it was only useful for FIFO output mode which is not supported at this time. Fixed errors on module unload. Comments and whitespace cleanup. Signed-off-by: Sylwester Nawrocki <s.nawrocki@samsung.com> Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/video/s5p-fimc/fimc-reg.c')
-rw-r--r--drivers/media/video/s5p-fimc/fimc-reg.c43
1 files changed, 21 insertions, 22 deletions
diff --git a/drivers/media/video/s5p-fimc/fimc-reg.c b/drivers/media/video/s5p-fimc/fimc-reg.c
index 70f29c5a6d10..94e98d47a7d0 100644
--- a/drivers/media/video/s5p-fimc/fimc-reg.c
+++ b/drivers/media/video/s5p-fimc/fimc-reg.c
@@ -29,7 +29,7 @@ void fimc_hw_reset(struct fimc_dev *dev)
29 cfg = readl(dev->regs + S5P_CIGCTRL); 29 cfg = readl(dev->regs + S5P_CIGCTRL);
30 cfg |= (S5P_CIGCTRL_SWRST | S5P_CIGCTRL_IRQ_LEVEL); 30 cfg |= (S5P_CIGCTRL_SWRST | S5P_CIGCTRL_IRQ_LEVEL);
31 writel(cfg, dev->regs + S5P_CIGCTRL); 31 writel(cfg, dev->regs + S5P_CIGCTRL);
32 msleep(1); 32 udelay(1000);
33 33
34 cfg = readl(dev->regs + S5P_CIGCTRL); 34 cfg = readl(dev->regs + S5P_CIGCTRL);
35 cfg &= ~S5P_CIGCTRL_SWRST; 35 cfg &= ~S5P_CIGCTRL_SWRST;
@@ -247,21 +247,20 @@ void fimc_hw_en_lastirq(struct fimc_dev *dev, int enable)
247 spin_unlock_irqrestore(&dev->slock, flags); 247 spin_unlock_irqrestore(&dev->slock, flags);
248} 248}
249 249
250void fimc_hw_set_prescaler(struct fimc_ctx *ctx) 250static void fimc_hw_set_prescaler(struct fimc_ctx *ctx)
251{ 251{
252 struct fimc_dev *dev = ctx->fimc_dev; 252 struct fimc_dev *dev = ctx->fimc_dev;
253 struct fimc_scaler *sc = &ctx->scaler; 253 struct fimc_scaler *sc = &ctx->scaler;
254 u32 cfg = 0, shfactor; 254 u32 cfg, shfactor;
255 255
256 shfactor = 10 - (sc->hfactor + sc->vfactor); 256 shfactor = 10 - (sc->hfactor + sc->vfactor);
257 257
258 cfg |= S5P_CISCPRERATIO_SHFACTOR(shfactor); 258 cfg = S5P_CISCPRERATIO_SHFACTOR(shfactor);
259 cfg |= S5P_CISCPRERATIO_HOR(sc->pre_hratio); 259 cfg |= S5P_CISCPRERATIO_HOR(sc->pre_hratio);
260 cfg |= S5P_CISCPRERATIO_VER(sc->pre_vratio); 260 cfg |= S5P_CISCPRERATIO_VER(sc->pre_vratio);
261 writel(cfg, dev->regs + S5P_CISCPRERATIO); 261 writel(cfg, dev->regs + S5P_CISCPRERATIO);
262 262
263 cfg = 0; 263 cfg = S5P_CISCPREDST_WIDTH(sc->pre_dst_width);
264 cfg |= S5P_CISCPREDST_WIDTH(sc->pre_dst_width);
265 cfg |= S5P_CISCPREDST_HEIGHT(sc->pre_dst_height); 264 cfg |= S5P_CISCPREDST_HEIGHT(sc->pre_dst_height);
266 writel(cfg, dev->regs + S5P_CISCPREDST); 265 writel(cfg, dev->regs + S5P_CISCPREDST);
267} 266}
@@ -274,6 +273,8 @@ void fimc_hw_set_scaler(struct fimc_ctx *ctx)
274 struct fimc_frame *dst_frame = &ctx->d_frame; 273 struct fimc_frame *dst_frame = &ctx->d_frame;
275 u32 cfg = 0; 274 u32 cfg = 0;
276 275
276 fimc_hw_set_prescaler(ctx);
277
277 if (!(ctx->flags & FIMC_COLOR_RANGE_NARROW)) 278 if (!(ctx->flags & FIMC_COLOR_RANGE_NARROW))
278 cfg |= (S5P_CISCCTRL_CSCR2Y_WIDE | S5P_CISCCTRL_CSCY2R_WIDE); 279 cfg |= (S5P_CISCCTRL_CSCR2Y_WIDE | S5P_CISCCTRL_CSCY2R_WIDE);
279 280
@@ -364,7 +365,7 @@ static void fimc_hw_set_in_dma_size(struct fimc_ctx *ctx)
364 u32 cfg_r = 0; 365 u32 cfg_r = 0;
365 366
366 if (FIMC_LCDFIFO == ctx->out_path) 367 if (FIMC_LCDFIFO == ctx->out_path)
367 cfg_r |= S5P_CIREAL_ISIZE_AUTOLOAD_EN; 368 cfg_r |= S5P_CIREAL_ISIZE_AUTOLOAD_EN;
368 369
369 cfg_o |= S5P_ORIG_SIZE_HOR(frame->f_width); 370 cfg_o |= S5P_ORIG_SIZE_HOR(frame->f_width);
370 cfg_o |= S5P_ORIG_SIZE_VER(frame->f_height); 371 cfg_o |= S5P_ORIG_SIZE_VER(frame->f_height);
@@ -380,27 +381,25 @@ void fimc_hw_set_in_dma(struct fimc_ctx *ctx)
380 struct fimc_dev *dev = ctx->fimc_dev; 381 struct fimc_dev *dev = ctx->fimc_dev;
381 struct fimc_frame *frame = &ctx->s_frame; 382 struct fimc_frame *frame = &ctx->s_frame;
382 struct fimc_dma_offset *offset = &frame->dma_offset; 383 struct fimc_dma_offset *offset = &frame->dma_offset;
383 u32 cfg = 0; 384 u32 cfg;
384 385
385 /* Set the pixel offsets. */ 386 /* Set the pixel offsets. */
386 cfg |= S5P_CIO_OFFS_HOR(offset->y_h); 387 cfg = S5P_CIO_OFFS_HOR(offset->y_h);
387 cfg |= S5P_CIO_OFFS_VER(offset->y_v); 388 cfg |= S5P_CIO_OFFS_VER(offset->y_v);
388 writel(cfg, dev->regs + S5P_CIIYOFF); 389 writel(cfg, dev->regs + S5P_CIIYOFF);
389 390
390 cfg = 0; 391 cfg = S5P_CIO_OFFS_HOR(offset->cb_h);
391 cfg |= S5P_CIO_OFFS_HOR(offset->cb_h);
392 cfg |= S5P_CIO_OFFS_VER(offset->cb_v); 392 cfg |= S5P_CIO_OFFS_VER(offset->cb_v);
393 writel(cfg, dev->regs + S5P_CIICBOFF); 393 writel(cfg, dev->regs + S5P_CIICBOFF);
394 394
395 cfg = 0; 395 cfg = S5P_CIO_OFFS_HOR(offset->cr_h);
396 cfg |= S5P_CIO_OFFS_HOR(offset->cr_h);
397 cfg |= S5P_CIO_OFFS_VER(offset->cr_v); 396 cfg |= S5P_CIO_OFFS_VER(offset->cr_v);
398 writel(cfg, dev->regs + S5P_CIICROFF); 397 writel(cfg, dev->regs + S5P_CIICROFF);
399 398
400 /* Input original and real size. */ 399 /* Input original and real size. */
401 fimc_hw_set_in_dma_size(ctx); 400 fimc_hw_set_in_dma_size(ctx);
402 401
403 /* Autoload is used currently only in FIFO mode. */ 402 /* Use DMA autoload only in FIFO mode. */
404 fimc_hw_en_autoload(dev, ctx->out_path == FIMC_LCDFIFO); 403 fimc_hw_en_autoload(dev, ctx->out_path == FIMC_LCDFIFO);
405 404
406 /* Set the input DMA to process single frame only. */ 405 /* Set the input DMA to process single frame only. */
@@ -501,9 +500,7 @@ void fimc_hw_set_output_path(struct fimc_ctx *ctx)
501 500
502void fimc_hw_set_input_addr(struct fimc_dev *dev, struct fimc_addr *paddr) 501void fimc_hw_set_input_addr(struct fimc_dev *dev, struct fimc_addr *paddr)
503{ 502{
504 u32 cfg = 0; 503 u32 cfg = readl(dev->regs + S5P_CIREAL_ISIZE);
505
506 cfg = readl(dev->regs + S5P_CIREAL_ISIZE);
507 cfg |= S5P_CIREAL_ISIZE_ADDR_CH_DIS; 504 cfg |= S5P_CIREAL_ISIZE_ADDR_CH_DIS;
508 writel(cfg, dev->regs + S5P_CIREAL_ISIZE); 505 writel(cfg, dev->regs + S5P_CIREAL_ISIZE);
509 506
@@ -515,13 +512,15 @@ void fimc_hw_set_input_addr(struct fimc_dev *dev, struct fimc_addr *paddr)
515 writel(cfg, dev->regs + S5P_CIREAL_ISIZE); 512 writel(cfg, dev->regs + S5P_CIREAL_ISIZE);
516} 513}
517 514
518void fimc_hw_set_output_addr(struct fimc_dev *dev, struct fimc_addr *paddr) 515void fimc_hw_set_output_addr(struct fimc_dev *dev,
516 struct fimc_addr *paddr, int index)
519{ 517{
520 int i; 518 int i = (index == -1) ? 0 : index;
521 /* Set all the output register sets to point to single video buffer. */ 519 do {
522 for (i = 0; i < FIMC_MAX_OUT_BUFS; i++) {
523 writel(paddr->y, dev->regs + S5P_CIOYSA(i)); 520 writel(paddr->y, dev->regs + S5P_CIOYSA(i));
524 writel(paddr->cb, dev->regs + S5P_CIOCBSA(i)); 521 writel(paddr->cb, dev->regs + S5P_CIOCBSA(i));
525 writel(paddr->cr, dev->regs + S5P_CIOCRSA(i)); 522 writel(paddr->cr, dev->regs + S5P_CIOCRSA(i));
526 } 523 dbg("dst_buf[%d]: 0x%X, cb: 0x%X, cr: 0x%X",
524 i, paddr->y, paddr->cb, paddr->cr);
525 } while (index == -1 && ++i < FIMC_MAX_OUT_BUFS);
527} 526}