diff options
Diffstat (limited to 'drivers/media/video/omap3isp/isppreview.c')
| -rw-r--r-- | drivers/media/video/omap3isp/isppreview.c | 452 |
1 files changed, 226 insertions, 226 deletions
diff --git a/drivers/media/video/omap3isp/isppreview.c b/drivers/media/video/omap3isp/isppreview.c index b22a549d4a91..9a8628417b50 100644 --- a/drivers/media/video/omap3isp/isppreview.c +++ b/drivers/media/video/omap3isp/isppreview.c | |||
| @@ -157,64 +157,53 @@ static u32 luma_enhance_table[] = { | |||
| 157 | }; | 157 | }; |
| 158 | 158 | ||
| 159 | /* | 159 | /* |
| 160 | * preview_enable_invalaw - Enable/disable Inverse A-Law decompression | 160 | * preview_config_luma_enhancement - Configure the Luminance Enhancement table |
| 161 | */ | ||
| 162 | static void preview_enable_invalaw(struct isp_prev_device *prev, bool enable) | ||
| 163 | { | ||
| 164 | struct isp_device *isp = to_isp_device(prev); | ||
| 165 | |||
| 166 | if (enable) | ||
| 167 | isp_reg_set(isp, OMAP3_ISP_IOMEM_PREV, ISPPRV_PCR, | ||
| 168 | ISPPRV_PCR_WIDTH | ISPPRV_PCR_INVALAW); | ||
| 169 | else | ||
| 170 | isp_reg_clr(isp, OMAP3_ISP_IOMEM_PREV, ISPPRV_PCR, | ||
| 171 | ISPPRV_PCR_WIDTH | ISPPRV_PCR_INVALAW); | ||
| 172 | } | ||
| 173 | |||
| 174 | /* | ||
| 175 | * preview_enable_drkframe_capture - Enable/disable Dark Frame Capture | ||
| 176 | */ | 161 | */ |
| 177 | static void | 162 | static void |
| 178 | preview_enable_drkframe_capture(struct isp_prev_device *prev, bool enable) | 163 | preview_config_luma_enhancement(struct isp_prev_device *prev, |
| 164 | const struct prev_params *params) | ||
| 179 | { | 165 | { |
| 180 | struct isp_device *isp = to_isp_device(prev); | 166 | struct isp_device *isp = to_isp_device(prev); |
| 167 | const struct omap3isp_prev_luma *yt = ¶ms->luma; | ||
| 168 | unsigned int i; | ||
| 181 | 169 | ||
| 182 | if (enable) | 170 | isp_reg_writel(isp, ISPPRV_YENH_TABLE_ADDR, |
| 183 | isp_reg_set(isp, OMAP3_ISP_IOMEM_PREV, ISPPRV_PCR, | 171 | OMAP3_ISP_IOMEM_PREV, ISPPRV_SET_TBL_ADDR); |
| 184 | ISPPRV_PCR_DRKFCAP); | 172 | for (i = 0; i < OMAP3ISP_PREV_YENH_TBL_SIZE; i++) { |
| 185 | else | 173 | isp_reg_writel(isp, yt->table[i], |
| 186 | isp_reg_clr(isp, OMAP3_ISP_IOMEM_PREV, ISPPRV_PCR, | 174 | OMAP3_ISP_IOMEM_PREV, ISPPRV_SET_TBL_DATA); |
| 187 | ISPPRV_PCR_DRKFCAP); | 175 | } |
| 188 | } | 176 | } |
| 189 | 177 | ||
| 190 | /* | 178 | /* |
| 191 | * preview_enable_drkframe - Enable/disable Dark Frame Subtraction | 179 | * preview_enable_luma_enhancement - Enable/disable Luminance Enhancement |
| 192 | */ | 180 | */ |
| 193 | static void preview_enable_drkframe(struct isp_prev_device *prev, bool enable) | 181 | static void |
| 182 | preview_enable_luma_enhancement(struct isp_prev_device *prev, bool enable) | ||
| 194 | { | 183 | { |
| 195 | struct isp_device *isp = to_isp_device(prev); | 184 | struct isp_device *isp = to_isp_device(prev); |
| 196 | 185 | ||
| 197 | if (enable) | 186 | if (enable) |
| 198 | isp_reg_set(isp, OMAP3_ISP_IOMEM_PREV, ISPPRV_PCR, | 187 | isp_reg_set(isp, OMAP3_ISP_IOMEM_PREV, ISPPRV_PCR, |
| 199 | ISPPRV_PCR_DRKFEN); | 188 | ISPPRV_PCR_YNENHEN); |
| 200 | else | 189 | else |
| 201 | isp_reg_clr(isp, OMAP3_ISP_IOMEM_PREV, ISPPRV_PCR, | 190 | isp_reg_clr(isp, OMAP3_ISP_IOMEM_PREV, ISPPRV_PCR, |
| 202 | ISPPRV_PCR_DRKFEN); | 191 | ISPPRV_PCR_YNENHEN); |
| 203 | } | 192 | } |
| 204 | 193 | ||
| 205 | /* | 194 | /* |
| 206 | * preview_enable_hmed - Enable/disable the Horizontal Median Filter | 195 | * preview_enable_invalaw - Enable/disable Inverse A-Law decompression |
| 207 | */ | 196 | */ |
| 208 | static void preview_enable_hmed(struct isp_prev_device *prev, bool enable) | 197 | static void preview_enable_invalaw(struct isp_prev_device *prev, bool enable) |
| 209 | { | 198 | { |
| 210 | struct isp_device *isp = to_isp_device(prev); | 199 | struct isp_device *isp = to_isp_device(prev); |
| 211 | 200 | ||
| 212 | if (enable) | 201 | if (enable) |
| 213 | isp_reg_set(isp, OMAP3_ISP_IOMEM_PREV, ISPPRV_PCR, | 202 | isp_reg_set(isp, OMAP3_ISP_IOMEM_PREV, ISPPRV_PCR, |
| 214 | ISPPRV_PCR_HMEDEN); | 203 | ISPPRV_PCR_WIDTH | ISPPRV_PCR_INVALAW); |
| 215 | else | 204 | else |
| 216 | isp_reg_clr(isp, OMAP3_ISP_IOMEM_PREV, ISPPRV_PCR, | 205 | isp_reg_clr(isp, OMAP3_ISP_IOMEM_PREV, ISPPRV_PCR, |
| 217 | ISPPRV_PCR_HMEDEN); | 206 | ISPPRV_PCR_WIDTH | ISPPRV_PCR_INVALAW); |
| 218 | } | 207 | } |
| 219 | 208 | ||
| 220 | /* | 209 | /* |
| @@ -233,46 +222,18 @@ static void preview_config_hmed(struct isp_prev_device *prev, | |||
| 233 | } | 222 | } |
| 234 | 223 | ||
| 235 | /* | 224 | /* |
| 236 | * preview_config_noisefilter - Configure the Noise Filter | 225 | * preview_enable_hmed - Enable/disable the Horizontal Median Filter |
| 237 | */ | ||
| 238 | static void | ||
| 239 | preview_config_noisefilter(struct isp_prev_device *prev, | ||
| 240 | const struct prev_params *params) | ||
| 241 | { | ||
| 242 | struct isp_device *isp = to_isp_device(prev); | ||
| 243 | const struct omap3isp_prev_nf *nf = ¶ms->nf; | ||
| 244 | unsigned int i; | ||
| 245 | |||
| 246 | isp_reg_writel(isp, nf->spread, OMAP3_ISP_IOMEM_PREV, ISPPRV_NF); | ||
| 247 | isp_reg_writel(isp, ISPPRV_NF_TABLE_ADDR, | ||
| 248 | OMAP3_ISP_IOMEM_PREV, ISPPRV_SET_TBL_ADDR); | ||
| 249 | for (i = 0; i < OMAP3ISP_PREV_NF_TBL_SIZE; i++) { | ||
| 250 | isp_reg_writel(isp, nf->table[i], | ||
| 251 | OMAP3_ISP_IOMEM_PREV, ISPPRV_SET_TBL_DATA); | ||
| 252 | } | ||
| 253 | } | ||
| 254 | |||
| 255 | /* | ||
| 256 | * preview_config_dcor - Configure Couplet Defect Correction | ||
| 257 | */ | 226 | */ |
| 258 | static void | 227 | static void preview_enable_hmed(struct isp_prev_device *prev, bool enable) |
| 259 | preview_config_dcor(struct isp_prev_device *prev, | ||
| 260 | const struct prev_params *params) | ||
| 261 | { | 228 | { |
| 262 | struct isp_device *isp = to_isp_device(prev); | 229 | struct isp_device *isp = to_isp_device(prev); |
| 263 | const struct omap3isp_prev_dcor *dcor = ¶ms->dcor; | ||
| 264 | 230 | ||
| 265 | isp_reg_writel(isp, dcor->detect_correct[0], | 231 | if (enable) |
| 266 | OMAP3_ISP_IOMEM_PREV, ISPPRV_CDC_THR0); | 232 | isp_reg_set(isp, OMAP3_ISP_IOMEM_PREV, ISPPRV_PCR, |
| 267 | isp_reg_writel(isp, dcor->detect_correct[1], | 233 | ISPPRV_PCR_HMEDEN); |
| 268 | OMAP3_ISP_IOMEM_PREV, ISPPRV_CDC_THR1); | 234 | else |
| 269 | isp_reg_writel(isp, dcor->detect_correct[2], | 235 | isp_reg_clr(isp, OMAP3_ISP_IOMEM_PREV, ISPPRV_PCR, |
| 270 | OMAP3_ISP_IOMEM_PREV, ISPPRV_CDC_THR2); | 236 | ISPPRV_PCR_HMEDEN); |
| 271 | isp_reg_writel(isp, dcor->detect_correct[3], | ||
| 272 | OMAP3_ISP_IOMEM_PREV, ISPPRV_CDC_THR3); | ||
| 273 | isp_reg_clr_set(isp, OMAP3_ISP_IOMEM_PREV, ISPPRV_PCR, | ||
| 274 | ISPPRV_PCR_DCCOUP, | ||
| 275 | dcor->couplet_mode_en ? ISPPRV_PCR_DCCOUP : 0); | ||
| 276 | } | 237 | } |
| 277 | 238 | ||
| 278 | /* | 239 | /* |
| @@ -305,55 +266,6 @@ preview_config_cfa(struct isp_prev_device *prev, | |||
| 305 | } | 266 | } |
| 306 | 267 | ||
| 307 | /* | 268 | /* |
| 308 | * preview_config_gammacorrn - Configure the Gamma Correction tables | ||
| 309 | */ | ||
| 310 | static void | ||
| 311 | preview_config_gammacorrn(struct isp_prev_device *prev, | ||
| 312 | const struct prev_params *params) | ||
| 313 | { | ||
| 314 | struct isp_device *isp = to_isp_device(prev); | ||
| 315 | const struct omap3isp_prev_gtables *gt = ¶ms->gamma; | ||
| 316 | unsigned int i; | ||
| 317 | |||
| 318 | isp_reg_writel(isp, ISPPRV_REDGAMMA_TABLE_ADDR, | ||
| 319 | OMAP3_ISP_IOMEM_PREV, ISPPRV_SET_TBL_ADDR); | ||
| 320 | for (i = 0; i < OMAP3ISP_PREV_GAMMA_TBL_SIZE; i++) | ||
| 321 | isp_reg_writel(isp, gt->red[i], OMAP3_ISP_IOMEM_PREV, | ||
| 322 | ISPPRV_SET_TBL_DATA); | ||
| 323 | |||
| 324 | isp_reg_writel(isp, ISPPRV_GREENGAMMA_TABLE_ADDR, | ||
| 325 | OMAP3_ISP_IOMEM_PREV, ISPPRV_SET_TBL_ADDR); | ||
| 326 | for (i = 0; i < OMAP3ISP_PREV_GAMMA_TBL_SIZE; i++) | ||
| 327 | isp_reg_writel(isp, gt->green[i], OMAP3_ISP_IOMEM_PREV, | ||
| 328 | ISPPRV_SET_TBL_DATA); | ||
| 329 | |||
| 330 | isp_reg_writel(isp, ISPPRV_BLUEGAMMA_TABLE_ADDR, | ||
| 331 | OMAP3_ISP_IOMEM_PREV, ISPPRV_SET_TBL_ADDR); | ||
| 332 | for (i = 0; i < OMAP3ISP_PREV_GAMMA_TBL_SIZE; i++) | ||
| 333 | isp_reg_writel(isp, gt->blue[i], OMAP3_ISP_IOMEM_PREV, | ||
| 334 | ISPPRV_SET_TBL_DATA); | ||
| 335 | } | ||
| 336 | |||
| 337 | /* | ||
| 338 | * preview_config_luma_enhancement - Configure the Luminance Enhancement table | ||
| 339 | */ | ||
| 340 | static void | ||
| 341 | preview_config_luma_enhancement(struct isp_prev_device *prev, | ||
| 342 | const struct prev_params *params) | ||
| 343 | { | ||
| 344 | struct isp_device *isp = to_isp_device(prev); | ||
| 345 | const struct omap3isp_prev_luma *yt = ¶ms->luma; | ||
| 346 | unsigned int i; | ||
| 347 | |||
| 348 | isp_reg_writel(isp, ISPPRV_YENH_TABLE_ADDR, | ||
| 349 | OMAP3_ISP_IOMEM_PREV, ISPPRV_SET_TBL_ADDR); | ||
| 350 | for (i = 0; i < OMAP3ISP_PREV_YENH_TBL_SIZE; i++) { | ||
| 351 | isp_reg_writel(isp, yt->table[i], | ||
| 352 | OMAP3_ISP_IOMEM_PREV, ISPPRV_SET_TBL_DATA); | ||
| 353 | } | ||
| 354 | } | ||
| 355 | |||
| 356 | /* | ||
| 357 | * preview_config_chroma_suppression - Configure Chroma Suppression | 269 | * preview_config_chroma_suppression - Configure Chroma Suppression |
| 358 | */ | 270 | */ |
| 359 | static void | 271 | static void |
| @@ -370,72 +282,6 @@ preview_config_chroma_suppression(struct isp_prev_device *prev, | |||
| 370 | } | 282 | } |
| 371 | 283 | ||
| 372 | /* | 284 | /* |
| 373 | * preview_enable_noisefilter - Enable/disable the Noise Filter | ||
| 374 | */ | ||
| 375 | static void | ||
| 376 | preview_enable_noisefilter(struct isp_prev_device *prev, bool enable) | ||
| 377 | { | ||
| 378 | struct isp_device *isp = to_isp_device(prev); | ||
| 379 | |||
| 380 | if (enable) | ||
| 381 | isp_reg_set(isp, OMAP3_ISP_IOMEM_PREV, ISPPRV_PCR, | ||
| 382 | ISPPRV_PCR_NFEN); | ||
| 383 | else | ||
| 384 | isp_reg_clr(isp, OMAP3_ISP_IOMEM_PREV, ISPPRV_PCR, | ||
| 385 | ISPPRV_PCR_NFEN); | ||
| 386 | } | ||
| 387 | |||
| 388 | /* | ||
| 389 | * preview_enable_dcor - Enable/disable Couplet Defect Correction | ||
| 390 | */ | ||
| 391 | static void preview_enable_dcor(struct isp_prev_device *prev, bool enable) | ||
| 392 | { | ||
| 393 | struct isp_device *isp = to_isp_device(prev); | ||
| 394 | |||
| 395 | if (enable) | ||
| 396 | isp_reg_set(isp, OMAP3_ISP_IOMEM_PREV, ISPPRV_PCR, | ||
| 397 | ISPPRV_PCR_DCOREN); | ||
| 398 | else | ||
| 399 | isp_reg_clr(isp, OMAP3_ISP_IOMEM_PREV, ISPPRV_PCR, | ||
| 400 | ISPPRV_PCR_DCOREN); | ||
| 401 | } | ||
| 402 | |||
| 403 | /* | ||
| 404 | * preview_enable_gammabypass - Enable/disable Gamma Bypass | ||
| 405 | * | ||
| 406 | * When gamma bypass is enabled, the output of the gamma correction is the 8 MSB | ||
| 407 | * of the 10-bit input . | ||
| 408 | */ | ||
| 409 | static void | ||
| 410 | preview_enable_gammabypass(struct isp_prev_device *prev, bool enable) | ||
| 411 | { | ||
| 412 | struct isp_device *isp = to_isp_device(prev); | ||
| 413 | |||
| 414 | if (enable) | ||
| 415 | isp_reg_set(isp, OMAP3_ISP_IOMEM_PREV, ISPPRV_PCR, | ||
| 416 | ISPPRV_PCR_GAMMA_BYPASS); | ||
| 417 | else | ||
| 418 | isp_reg_clr(isp, OMAP3_ISP_IOMEM_PREV, ISPPRV_PCR, | ||
| 419 | ISPPRV_PCR_GAMMA_BYPASS); | ||
| 420 | } | ||
| 421 | |||
| 422 | /* | ||
| 423 | * preview_enable_luma_enhancement - Enable/disable Luminance Enhancement | ||
| 424 | */ | ||
| 425 | static void | ||
| 426 | preview_enable_luma_enhancement(struct isp_prev_device *prev, bool enable) | ||
| 427 | { | ||
| 428 | struct isp_device *isp = to_isp_device(prev); | ||
| 429 | |||
| 430 | if (enable) | ||
| 431 | isp_reg_set(isp, OMAP3_ISP_IOMEM_PREV, ISPPRV_PCR, | ||
| 432 | ISPPRV_PCR_YNENHEN); | ||
| 433 | else | ||
| 434 | isp_reg_clr(isp, OMAP3_ISP_IOMEM_PREV, ISPPRV_PCR, | ||
| 435 | ISPPRV_PCR_YNENHEN); | ||
| 436 | } | ||
| 437 | |||
| 438 | /* | ||
| 439 | * preview_enable_chroma_suppression - Enable/disable Chrominance Suppression | 285 | * preview_enable_chroma_suppression - Enable/disable Chrominance Suppression |
| 440 | */ | 286 | */ |
| 441 | static void | 287 | static void |
| @@ -579,26 +425,175 @@ preview_config_csc(struct isp_prev_device *prev, | |||
| 579 | } | 425 | } |
| 580 | 426 | ||
| 581 | /* | 427 | /* |
| 582 | * preview_update_contrast - Updates the contrast. | 428 | * preview_config_yc_range - Configure the max and min Y and C values |
| 583 | * @contrast: Pointer to hold the current programmed contrast value. | 429 | */ |
| 430 | static void | ||
| 431 | preview_config_yc_range(struct isp_prev_device *prev, | ||
| 432 | const struct prev_params *params) | ||
| 433 | { | ||
| 434 | struct isp_device *isp = to_isp_device(prev); | ||
| 435 | const struct omap3isp_prev_yclimit *yc = ¶ms->yclimit; | ||
| 436 | |||
| 437 | isp_reg_writel(isp, | ||
| 438 | yc->maxC << ISPPRV_SETUP_YC_MAXC_SHIFT | | ||
| 439 | yc->maxY << ISPPRV_SETUP_YC_MAXY_SHIFT | | ||
| 440 | yc->minC << ISPPRV_SETUP_YC_MINC_SHIFT | | ||
| 441 | yc->minY << ISPPRV_SETUP_YC_MINY_SHIFT, | ||
| 442 | OMAP3_ISP_IOMEM_PREV, ISPPRV_SETUP_YC); | ||
| 443 | } | ||
| 444 | |||
| 445 | /* | ||
| 446 | * preview_config_dcor - Configure Couplet Defect Correction | ||
| 447 | */ | ||
| 448 | static void | ||
| 449 | preview_config_dcor(struct isp_prev_device *prev, | ||
| 450 | const struct prev_params *params) | ||
| 451 | { | ||
| 452 | struct isp_device *isp = to_isp_device(prev); | ||
| 453 | const struct omap3isp_prev_dcor *dcor = ¶ms->dcor; | ||
| 454 | |||
| 455 | isp_reg_writel(isp, dcor->detect_correct[0], | ||
| 456 | OMAP3_ISP_IOMEM_PREV, ISPPRV_CDC_THR0); | ||
| 457 | isp_reg_writel(isp, dcor->detect_correct[1], | ||
| 458 | OMAP3_ISP_IOMEM_PREV, ISPPRV_CDC_THR1); | ||
| 459 | isp_reg_writel(isp, dcor->detect_correct[2], | ||
| 460 | OMAP3_ISP_IOMEM_PREV, ISPPRV_CDC_THR2); | ||
| 461 | isp_reg_writel(isp, dcor->detect_correct[3], | ||
| 462 | OMAP3_ISP_IOMEM_PREV, ISPPRV_CDC_THR3); | ||
| 463 | isp_reg_clr_set(isp, OMAP3_ISP_IOMEM_PREV, ISPPRV_PCR, | ||
| 464 | ISPPRV_PCR_DCCOUP, | ||
| 465 | dcor->couplet_mode_en ? ISPPRV_PCR_DCCOUP : 0); | ||
| 466 | } | ||
| 467 | |||
| 468 | /* | ||
| 469 | * preview_enable_dcor - Enable/disable Couplet Defect Correction | ||
| 470 | */ | ||
| 471 | static void preview_enable_dcor(struct isp_prev_device *prev, bool enable) | ||
| 472 | { | ||
| 473 | struct isp_device *isp = to_isp_device(prev); | ||
| 474 | |||
| 475 | if (enable) | ||
| 476 | isp_reg_set(isp, OMAP3_ISP_IOMEM_PREV, ISPPRV_PCR, | ||
| 477 | ISPPRV_PCR_DCOREN); | ||
| 478 | else | ||
| 479 | isp_reg_clr(isp, OMAP3_ISP_IOMEM_PREV, ISPPRV_PCR, | ||
| 480 | ISPPRV_PCR_DCOREN); | ||
| 481 | } | ||
| 482 | |||
| 483 | /* | ||
| 484 | * preview_enable_gammabypass - Enable/disable Gamma Bypass | ||
| 584 | * | 485 | * |
| 585 | * Value should be programmed before enabling the module. | 486 | * When gamma bypass is enabled, the output of the gamma correction is the 8 MSB |
| 487 | * of the 10-bit input . | ||
| 586 | */ | 488 | */ |
| 587 | static void | 489 | static void |
| 588 | preview_update_contrast(struct isp_prev_device *prev, u8 contrast) | 490 | preview_enable_gammabypass(struct isp_prev_device *prev, bool enable) |
| 589 | { | 491 | { |
| 590 | struct prev_params *params; | 492 | struct isp_device *isp = to_isp_device(prev); |
| 591 | unsigned long flags; | ||
| 592 | 493 | ||
| 593 | spin_lock_irqsave(&prev->params.lock, flags); | 494 | if (enable) |
| 594 | params = (prev->params.active & OMAP3ISP_PREV_CONTRAST) | 495 | isp_reg_set(isp, OMAP3_ISP_IOMEM_PREV, ISPPRV_PCR, |
| 595 | ? &prev->params.params[0] : &prev->params.params[1]; | 496 | ISPPRV_PCR_GAMMA_BYPASS); |
| 497 | else | ||
| 498 | isp_reg_clr(isp, OMAP3_ISP_IOMEM_PREV, ISPPRV_PCR, | ||
| 499 | ISPPRV_PCR_GAMMA_BYPASS); | ||
| 500 | } | ||
| 596 | 501 | ||
| 597 | if (params->contrast != (contrast * ISPPRV_CONTRAST_UNITS)) { | 502 | /* |
| 598 | params->contrast = contrast * ISPPRV_CONTRAST_UNITS; | 503 | * preview_enable_drkframe_capture - Enable/disable Dark Frame Capture |
| 599 | params->update |= OMAP3ISP_PREV_CONTRAST; | 504 | */ |
| 505 | static void | ||
| 506 | preview_enable_drkframe_capture(struct isp_prev_device *prev, bool enable) | ||
| 507 | { | ||
| 508 | struct isp_device *isp = to_isp_device(prev); | ||
| 509 | |||
| 510 | if (enable) | ||
| 511 | isp_reg_set(isp, OMAP3_ISP_IOMEM_PREV, ISPPRV_PCR, | ||
| 512 | ISPPRV_PCR_DRKFCAP); | ||
| 513 | else | ||
| 514 | isp_reg_clr(isp, OMAP3_ISP_IOMEM_PREV, ISPPRV_PCR, | ||
| 515 | ISPPRV_PCR_DRKFCAP); | ||
| 516 | } | ||
| 517 | |||
| 518 | /* | ||
| 519 | * preview_enable_drkframe - Enable/disable Dark Frame Subtraction | ||
| 520 | */ | ||
| 521 | static void preview_enable_drkframe(struct isp_prev_device *prev, bool enable) | ||
| 522 | { | ||
| 523 | struct isp_device *isp = to_isp_device(prev); | ||
| 524 | |||
| 525 | if (enable) | ||
| 526 | isp_reg_set(isp, OMAP3_ISP_IOMEM_PREV, ISPPRV_PCR, | ||
| 527 | ISPPRV_PCR_DRKFEN); | ||
| 528 | else | ||
| 529 | isp_reg_clr(isp, OMAP3_ISP_IOMEM_PREV, ISPPRV_PCR, | ||
| 530 | ISPPRV_PCR_DRKFEN); | ||
| 531 | } | ||
| 532 | |||
| 533 | /* | ||
| 534 | * preview_config_noisefilter - Configure the Noise Filter | ||
| 535 | */ | ||
| 536 | static void | ||
| 537 | preview_config_noisefilter(struct isp_prev_device *prev, | ||
| 538 | const struct prev_params *params) | ||
| 539 | { | ||
| 540 | struct isp_device *isp = to_isp_device(prev); | ||
| 541 | const struct omap3isp_prev_nf *nf = ¶ms->nf; | ||
| 542 | unsigned int i; | ||
| 543 | |||
| 544 | isp_reg_writel(isp, nf->spread, OMAP3_ISP_IOMEM_PREV, ISPPRV_NF); | ||
| 545 | isp_reg_writel(isp, ISPPRV_NF_TABLE_ADDR, | ||
| 546 | OMAP3_ISP_IOMEM_PREV, ISPPRV_SET_TBL_ADDR); | ||
| 547 | for (i = 0; i < OMAP3ISP_PREV_NF_TBL_SIZE; i++) { | ||
| 548 | isp_reg_writel(isp, nf->table[i], | ||
| 549 | OMAP3_ISP_IOMEM_PREV, ISPPRV_SET_TBL_DATA); | ||
| 600 | } | 550 | } |
| 601 | spin_unlock_irqrestore(&prev->params.lock, flags); | 551 | } |
| 552 | |||
| 553 | /* | ||
| 554 | * preview_enable_noisefilter - Enable/disable the Noise Filter | ||
| 555 | */ | ||
| 556 | static void | ||
| 557 | preview_enable_noisefilter(struct isp_prev_device *prev, bool enable) | ||
| 558 | { | ||
| 559 | struct isp_device *isp = to_isp_device(prev); | ||
| 560 | |||
| 561 | if (enable) | ||
| 562 | isp_reg_set(isp, OMAP3_ISP_IOMEM_PREV, ISPPRV_PCR, | ||
| 563 | ISPPRV_PCR_NFEN); | ||
| 564 | else | ||
| 565 | isp_reg_clr(isp, OMAP3_ISP_IOMEM_PREV, ISPPRV_PCR, | ||
| 566 | ISPPRV_PCR_NFEN); | ||
| 567 | } | ||
| 568 | |||
| 569 | /* | ||
| 570 | * preview_config_gammacorrn - Configure the Gamma Correction tables | ||
| 571 | */ | ||
| 572 | static void | ||
| 573 | preview_config_gammacorrn(struct isp_prev_device *prev, | ||
| 574 | const struct prev_params *params) | ||
| 575 | { | ||
| 576 | struct isp_device *isp = to_isp_device(prev); | ||
| 577 | const struct omap3isp_prev_gtables *gt = ¶ms->gamma; | ||
| 578 | unsigned int i; | ||
| 579 | |||
| 580 | isp_reg_writel(isp, ISPPRV_REDGAMMA_TABLE_ADDR, | ||
| 581 | OMAP3_ISP_IOMEM_PREV, ISPPRV_SET_TBL_ADDR); | ||
| 582 | for (i = 0; i < OMAP3ISP_PREV_GAMMA_TBL_SIZE; i++) | ||
| 583 | isp_reg_writel(isp, gt->red[i], OMAP3_ISP_IOMEM_PREV, | ||
| 584 | ISPPRV_SET_TBL_DATA); | ||
| 585 | |||
| 586 | isp_reg_writel(isp, ISPPRV_GREENGAMMA_TABLE_ADDR, | ||
| 587 | OMAP3_ISP_IOMEM_PREV, ISPPRV_SET_TBL_ADDR); | ||
| 588 | for (i = 0; i < OMAP3ISP_PREV_GAMMA_TBL_SIZE; i++) | ||
| 589 | isp_reg_writel(isp, gt->green[i], OMAP3_ISP_IOMEM_PREV, | ||
| 590 | ISPPRV_SET_TBL_DATA); | ||
| 591 | |||
| 592 | isp_reg_writel(isp, ISPPRV_BLUEGAMMA_TABLE_ADDR, | ||
| 593 | OMAP3_ISP_IOMEM_PREV, ISPPRV_SET_TBL_ADDR); | ||
| 594 | for (i = 0; i < OMAP3ISP_PREV_GAMMA_TBL_SIZE; i++) | ||
| 595 | isp_reg_writel(isp, gt->blue[i], OMAP3_ISP_IOMEM_PREV, | ||
| 596 | ISPPRV_SET_TBL_DATA); | ||
| 602 | } | 597 | } |
| 603 | 598 | ||
| 604 | /* | 599 | /* |
| @@ -618,57 +613,62 @@ preview_config_contrast(struct isp_prev_device *prev, | |||
| 618 | } | 613 | } |
| 619 | 614 | ||
| 620 | /* | 615 | /* |
| 621 | * preview_update_brightness - Updates the brightness in preview module. | 616 | * preview_config_brightness - Configure the Brightness |
| 622 | * @brightness: Pointer to hold the current programmed brightness value. | 617 | */ |
| 618 | static void | ||
| 619 | preview_config_brightness(struct isp_prev_device *prev, | ||
| 620 | const struct prev_params *params) | ||
| 621 | { | ||
| 622 | struct isp_device *isp = to_isp_device(prev); | ||
| 623 | |||
| 624 | isp_reg_clr_set(isp, OMAP3_ISP_IOMEM_PREV, ISPPRV_CNT_BRT, | ||
| 625 | 0xff << ISPPRV_CNT_BRT_BRT_SHIFT, | ||
| 626 | params->brightness << ISPPRV_CNT_BRT_BRT_SHIFT); | ||
| 627 | } | ||
| 628 | |||
| 629 | /* | ||
| 630 | * preview_update_contrast - Updates the contrast. | ||
| 631 | * @contrast: Pointer to hold the current programmed contrast value. | ||
| 623 | * | 632 | * |
| 633 | * Value should be programmed before enabling the module. | ||
| 624 | */ | 634 | */ |
| 625 | static void | 635 | static void |
| 626 | preview_update_brightness(struct isp_prev_device *prev, u8 brightness) | 636 | preview_update_contrast(struct isp_prev_device *prev, u8 contrast) |
| 627 | { | 637 | { |
| 628 | struct prev_params *params; | 638 | struct prev_params *params; |
| 629 | unsigned long flags; | 639 | unsigned long flags; |
| 630 | 640 | ||
| 631 | spin_lock_irqsave(&prev->params.lock, flags); | 641 | spin_lock_irqsave(&prev->params.lock, flags); |
| 632 | params = (prev->params.active & OMAP3ISP_PREV_BRIGHTNESS) | 642 | params = (prev->params.active & OMAP3ISP_PREV_CONTRAST) |
| 633 | ? &prev->params.params[0] : &prev->params.params[1]; | 643 | ? &prev->params.params[0] : &prev->params.params[1]; |
| 634 | 644 | ||
| 635 | if (params->brightness != (brightness * ISPPRV_BRIGHT_UNITS)) { | 645 | if (params->contrast != (contrast * ISPPRV_CONTRAST_UNITS)) { |
| 636 | params->brightness = brightness * ISPPRV_BRIGHT_UNITS; | 646 | params->contrast = contrast * ISPPRV_CONTRAST_UNITS; |
| 637 | params->update |= OMAP3ISP_PREV_BRIGHTNESS; | 647 | params->update |= OMAP3ISP_PREV_CONTRAST; |
| 638 | } | 648 | } |
| 639 | spin_unlock_irqrestore(&prev->params.lock, flags); | 649 | spin_unlock_irqrestore(&prev->params.lock, flags); |
| 640 | } | 650 | } |
| 641 | 651 | ||
| 642 | /* | 652 | /* |
| 643 | * preview_config_brightness - Configure the Brightness | 653 | * preview_update_brightness - Updates the brightness in preview module. |
| 654 | * @brightness: Pointer to hold the current programmed brightness value. | ||
| 655 | * | ||
| 644 | */ | 656 | */ |
| 645 | static void | 657 | static void |
| 646 | preview_config_brightness(struct isp_prev_device *prev, | 658 | preview_update_brightness(struct isp_prev_device *prev, u8 brightness) |
| 647 | const struct prev_params *params) | ||
| 648 | { | 659 | { |
| 649 | struct isp_device *isp = to_isp_device(prev); | 660 | struct prev_params *params; |
| 650 | 661 | unsigned long flags; | |
| 651 | isp_reg_clr_set(isp, OMAP3_ISP_IOMEM_PREV, ISPPRV_CNT_BRT, | ||
| 652 | 0xff << ISPPRV_CNT_BRT_BRT_SHIFT, | ||
| 653 | params->brightness << ISPPRV_CNT_BRT_BRT_SHIFT); | ||
| 654 | } | ||
| 655 | 662 | ||
| 656 | /* | 663 | spin_lock_irqsave(&prev->params.lock, flags); |
| 657 | * preview_config_yc_range - Configure the max and min Y and C values | 664 | params = (prev->params.active & OMAP3ISP_PREV_BRIGHTNESS) |
| 658 | */ | 665 | ? &prev->params.params[0] : &prev->params.params[1]; |
| 659 | static void | ||
| 660 | preview_config_yc_range(struct isp_prev_device *prev, | ||
| 661 | const struct prev_params *params) | ||
| 662 | { | ||
| 663 | struct isp_device *isp = to_isp_device(prev); | ||
| 664 | const struct omap3isp_prev_yclimit *yc = ¶ms->yclimit; | ||
| 665 | 666 | ||
| 666 | isp_reg_writel(isp, | 667 | if (params->brightness != (brightness * ISPPRV_BRIGHT_UNITS)) { |
| 667 | yc->maxC << ISPPRV_SETUP_YC_MAXC_SHIFT | | 668 | params->brightness = brightness * ISPPRV_BRIGHT_UNITS; |
| 668 | yc->maxY << ISPPRV_SETUP_YC_MAXY_SHIFT | | 669 | params->update |= OMAP3ISP_PREV_BRIGHTNESS; |
| 669 | yc->minC << ISPPRV_SETUP_YC_MINC_SHIFT | | 670 | } |
| 670 | yc->minY << ISPPRV_SETUP_YC_MINY_SHIFT, | 671 | spin_unlock_irqrestore(&prev->params.lock, flags); |
| 671 | OMAP3_ISP_IOMEM_PREV, ISPPRV_SETUP_YC); | ||
| 672 | } | 672 | } |
| 673 | 673 | ||
| 674 | static u32 | 674 | static u32 |
