Hi Sergio,
> +
> +/* Saved parameters */
> +struct prev_params *prev_config_params;
> +
static?
> +/*
> + * Coeficient Tables for the submodules in Preview.
> + * Array is initialised with the values from.the tables text file.
> + */
> +
> +/*
> + * CFA Filter Coefficient Table
> + *
> + */
> +static u32 cfa_coef_table[] = {
> +#include "cfa_coef_table.h"
> +};
> +
> +/*
> + * Gamma Correction Table - Red
> + */
> +static u32 redgamma_table[] = {
> +#include "redgamma_table.h"
> +};
> +
> +/*
> + * Gamma Correction Table - Green
> + */
> +static u32 greengamma_table[] = {
> +#include "greengamma_table.h"
> +};
> +
> +/*
> + * Gamma Correction Table - Blue
> + */
> +static u32 bluegamma_table[] = {
> +#include "bluegamma_table.h"
> +};
> +
> +/*
> + * Noise Filter Threshold table
> + */
> +static u32 noise_filter_table[] = {
> +#include "noise_filter_table.h"
> +};
> +
> +/*
> + * Luminance Enhancement Table
> + */
> +static u32 luma_enhance_table[] = {
> +#include "luma_enhance_table.h"
> +};
Do want this as table format only can be done like request_firmware?
> +
> +/**
> + * omap34xx_isp_preview_config - Abstraction layer Preview configuration.
> + * @userspace_add: Pointer from Userspace to structure with flags and data to
> + * update.
> + **/
> +int omap34xx_isp_preview_config(void *userspace_add)
> +{
> + struct ispprev_hmed prev_hmed_t;
> + struct ispprev_cfa prev_cfa_t;
> + struct ispprev_csup csup_t;
> + struct ispprev_wbal prev_wbal_t;
> + struct ispprev_blkadj prev_blkadj_t;
> + struct ispprev_rgbtorgb rgb2rgb_t;
> + struct ispprev_yclimit yclimit_t;
> + struct ispprev_dcor prev_dcor_t;
> + struct ispprv_update_config *preview_struct;
> + struct isptables_update isp_table_update;
> + int yen_t[128];
> +
> + if (userspace_add == NULL)
> + return -EINVAL;
> +
> + preview_struct = (struct ispprv_update_config *)userspace_add;
Unnecessary casting. Please remove all the casts when source is void *.
> +
> + if (ISP_ABS_PREV_LUMAENH & preview_struct->flag) {
> + if (ISP_ABS_PREV_LUMAENH & preview_struct->update) {
> + if (copy_from_user(yen_t, preview_struct->yen,
> +
> sizeof(yen_t)))
> + goto err_copy_from_user;
> + isppreview_config_luma_enhancement(yen_t);
> + }
> + params->features |= PREV_LUMA_ENHANCE;
> + } else if (ISP_ABS_PREV_LUMAENH & preview_struct->update)
> + params->features &= ~PREV_LUMA_ENHANCE;
> +
> + if (ISP_ABS_PREV_INVALAW & preview_struct->flag) {
> + isppreview_enable_invalaw(1);
> + params->features |= PREV_INVERSE_ALAW;
> + } else {
> + isppreview_enable_invalaw(0);
> + params->features &= ~PREV_INVERSE_ALAW;
> + }
> +
> + if (ISP_ABS_PREV_HRZ_MED & preview_struct->flag) {
> + if (ISP_ABS_PREV_HRZ_MED & preview_struct->update) {
> + if (copy_from_user(&prev_hmed_t,
> + (struct ispprev_hmed *)
> + preview_struct->prev_hmed,
> + sizeof(struct ispprev_hmed)))
> + goto err_copy_from_user;
> + isppreview_config_hmed(prev_hmed_t);
> + }
> + isppreview_enable_hmed(1);
> + params->features |= PREV_HORZ_MEDIAN_FILTER;
> + } else if (ISP_ABS_PREV_HRZ_MED & preview_struct->update) {
> + isppreview_enable_hmed(0);
> + params->features &= ~PREV_HORZ_MEDIAN_FILTER;
> + }
> +
> + if (ISP_ABS_PREV_CFA & preview_struct->flag) {
> + if (ISP_ABS_PREV_CFA & preview_struct->update) {
> + if (copy_from_user(&prev_cfa_t,
> + (struct ispprev_cfa *)
> + preview_struct->prev_cfa,
> + sizeof(struct ispprev_cfa)))
> + goto err_copy_from_user;
> +
> + isppreview_config_cfa(prev_cfa_t);
> + }
> + isppreview_enable_cfa(1);
> + params->features |= PREV_CFA;
> + } else if (ISP_ABS_PREV_CFA & preview_struct->update) {
> + isppreview_enable_cfa(0);
> + params->features &= ~PREV_CFA;
> + }
> +
> + if (ISP_ABS_PREV_CHROMA_SUPP & preview_struct->flag) {
> + if (ISP_ABS_PREV_CHROMA_SUPP & preview_struct->update) {
> + if (copy_from_user(&csup_t,
> + (struct ispprev_csup *)
> + preview_struct->csup,
> + sizeof(struct ispprev_csup)))
> + goto err_copy_from_user;
> + isppreview_config_chroma_suppression(csup_t);
> + }
> + isppreview_enable_chroma_suppression(1);
> + params->features |= PREV_CHROMA_SUPPRESS;
> + } else if (ISP_ABS_PREV_CHROMA_SUPP & preview_struct->update) {
> + isppreview_enable_chroma_suppression(0);
> + params->features &= ~PREV_CHROMA_SUPPRESS;
> + }
> +
> + if (ISP_ABS_PREV_WB & preview_struct->update) {
> + if (copy_from_user(&prev_wbal_t, (struct ispprev_wbal *)
> + preview_struct->prev_wbal,
> + sizeof(struct ispprev_wbal)))
> + goto err_copy_from_user;
> + isppreview_config_whitebalance(prev_wbal_t);
> + }
> +
> + if (ISP_ABS_PREV_BLKADJ & preview_struct->update) {
> + if (copy_from_user(&prev_blkadj_t, (struct ispprev_blkadjl *)
> + preview_struct->prev_blkadj,
> + sizeof(struct ispprev_blkadj)))
> + goto err_copy_from_user;
> + isppreview_config_blkadj(prev_blkadj_t);
> + }
> +
> + if (ISP_ABS_PREV_RGB2RGB & preview_struct->update) {
> + if (copy_from_user(&rgb2rgb_t, (struct ispprev_rgbtorgb *)
> + preview_struct->rgb2rgb,
> + sizeof(struct ispprev_rgbtorgb)))
> + goto err_copy_from_user;
> + isppreview_config_rgb_blending(rgb2rgb_t);
> + }
> +
> + if (ISP_ABS_PREV_COLOR_CONV & preview_struct->update) {
> + if (copy_from_user(&prev_csc_t, (struct ispprev_csc *)
> + preview_struct->prev_csc,
> + sizeof(struct ispprev_csc)))
> + goto err_copy_from_user;
> + spin_lock(&ispprev_obj.ispprev_lock);
> + if (ispprev_obj.stream_on == 0) {
> + isppreview_config_rgb_to_ycbcr(prev_csc_t);
> + CSC_update = 0;
> + } else
> + CSC_update = 1;
> +
> + spin_unlock(&ispprev_obj.ispprev_lock);
> + } else
> + CSC_update = 0;
> +
> + if (ISP_ABS_PREV_YC_LIMIT & preview_struct->update) {
> + if (copy_from_user(&yclimit_t, (struct ispprev_yclimit *)
> + preview_struct->yclimit,
> + sizeof(struct ispprev_yclimit)))
> + goto err_copy_from_user;
> + isppreview_config_yc_range(yclimit_t);
> + }
> +
> + if (ISP_ABS_PREV_DEFECT_COR & preview_struct->flag) {
> + if (ISP_ABS_PREV_DEFECT_COR & preview_struct->update) {
> + if (copy_from_user(&prev_dcor_t,
> + (struct ispprev_dcor *)
> + preview_struct->prev_dcor,
> + sizeof(struct ispprev_dcor)))
> + goto err_copy_from_user;
> + isppreview_config_dcor(prev_dcor_t);
> + }
> + isppreview_enable_dcor(1);
> + params->features |= PREV_DEFECT_COR;
> + } else if (ISP_ABS_PREV_DEFECT_COR & preview_struct->update) {
> + isppreview_enable_dcor(0);
> + params->features &= ~PREV_DEFECT_COR;
> + }
> +
> + if (ISP_ABS_PREV_GAMMABYPASS & preview_struct->flag) {
> + isppreview_enable_gammabypass(1);
> + params->features |= PREV_GAMMA_BYPASS;
> + } else {
> + isppreview_enable_gammabypass(0);
> + params->features &= ~PREV_GAMMA_BYPASS;
> + }
> +
> + isp_table_update.update = preview_struct->update;
> + isp_table_update.flag = preview_struct->flag;
> + isp_table_update.prev_nf = preview_struct->prev_nf;
> + isp_table_update.red_gamma = preview_struct->red_gamma;
> + isp_table_update.green_gamma = preview_struct->green_gamma;
> + isp_table_update.blue_gamma = preview_struct->blue_gamma;
> +
> + if (omap34xx_isp_tables_update(&isp_table_update))
> + goto err_copy_from_user;
This function is really big and hard to review, I am sure there will
be way to break-down into smaller functions as per functionality.
> +
> + return 0;
> +
> +err_copy_from_user:
> + printk(KERN_ERR "Preview Config: Copy From User Error");
> + return -EINVAL;
This should be -EFAULT.
> +}
> +EXPORT_SYMBOL(omap34xx_isp_preview_config);
If possible, please convert all the EXPORT_SYMBOLs to EXPORT_SYMBOL_GPL.
> +
> +/**
> + * omap34xx_isp_tables_update - Abstraction layer Tables update.
> + * @isptables_struct: Pointer from Userspace to structure with flags and
> table
> + * data to update.
> + **/
> +int omap34xx_isp_tables_update(struct isptables_update *isptables_struct)
> +{
> + int ctr;
> +
> + if (ISP_ABS_TBL_NF & isptables_struct->flag) {
> + NF_enable = 1;
CamelCAseS not allowed. Please remove them from all places.
> + params->features |= PREV_NOISE_FILTER;
> + if (ISP_ABS_TBL_NF & isptables_struct->update) {
> + if (copy_from_user(&prev_nf_t, (struct ispprev_nf *)
> + isptables_struct->prev_nf,
> + sizeof(struct ispprev_nf)))
> + goto err_copy_from_user;
> +
> + spin_lock(&ispprev_obj.ispprev_lock);
> + if (!ispprev_obj.stream_on) {
> + NF_update = 0;
> + isppreview_config_noisefilter(prev_nf_t);
> + isppreview_enable_noisefilter(NF_enable);
> + } else
> + NF_update = 1;
> +
> + spin_unlock(&ispprev_obj.ispprev_lock);
> + } else
> + NF_update = 0;
> + } else {
> + NF_enable = 0;
> + params->features &= ~PREV_NOISE_FILTER;
> + if (ISP_ABS_TBL_NF & isptables_struct->update)
> + NF_update = 1;
> + else
> + NF_update = 0;
> + }
> +
> + if (ISP_ABS_TBL_REDGAMMA & isptables_struct->update) {
> + if (copy_from_user(redgamma_table,
> isptables_struct->red_gamma,
> + sizeof(redgamma_table))) {
> + goto err_copy_from_user;
> + }
> + spin_lock(&ispprev_obj.ispprev_lock);
> + if (!ispprev_obj.stream_on) {
> + RG_update = 0;
> + isp_reg_writel(ISPPRV_TBL_ADDR_RED_G_START,
> + OMAP3_ISP_IOMEM_PREV, ISPPRV_SET_TBL_ADDR);
> + for (ctr = 0; ctr < ISP_GAMMA_TABLE_SIZE; ctr++)
> + isp_reg_writel(redgamma_table[ctr],
> + OMAP3_ISP_IOMEM_PREV, ISPPRV_SET_TBL_DATA);
> + } else
> + RG_update = 1;
> +
> + spin_unlock(&ispprev_obj.ispprev_lock);
> + } else
> + RG_update = 0;
> +
> + if (ISP_ABS_TBL_GREENGAMMA & isptables_struct->update) {
> + if (copy_from_user(greengamma_table,
> + isptables_struct->green_gamma,
> + sizeof(greengamma_table)))
> + goto err_copy_from_user;
> + spin_lock(&ispprev_obj.ispprev_lock);
> + if (!ispprev_obj.stream_on) {
> + GG_update = 0;
> + isp_reg_writel(ISPPRV_TBL_ADDR_GREEN_G_START,
> + OMAP3_ISP_IOMEM_PREV, ISPPRV_SET_TBL_ADDR);
> + for (ctr = 0; ctr < ISP_GAMMA_TABLE_SIZE; ctr++)
> + isp_reg_writel(greengamma_table[ctr],
> + OMAP3_ISP_IOMEM_PREV,
> + ISPPRV_SET_TBL_DATA);
> + } else
> + GG_update = 1;
> +
> + spin_unlock(&ispprev_obj.ispprev_lock);
> + } else
> + GG_update = 0;
> +
> + if (ISP_ABS_TBL_BLUEGAMMA & isptables_struct->update) {
> + if (copy_from_user(bluegamma_table,
> + isptables_struct->blue_gamma,
> + sizeof(bluegamma_table))) {
> + goto err_copy_from_user;
> + }
> + spin_lock(&ispprev_obj.ispprev_lock);
> + if (!ispprev_obj.stream_on) {
> + BG_update = 0;
> + isp_reg_writel(ISPPRV_TBL_ADDR_BLUE_G_START,
> + OMAP3_ISP_IOMEM_PREV,
> + ISPPRV_SET_TBL_ADDR);
> + for (ctr = 0; ctr < ISP_GAMMA_TABLE_SIZE; ctr++)
> + isp_reg_writel(bluegamma_table[ctr],
> + OMAP3_ISP_IOMEM_PREV,
> + ISPPRV_SET_TBL_DATA);
> + } else
> + BG_update = 1;
> +
> + spin_unlock(&ispprev_obj.ispprev_lock);
> + } else
> + BG_update = 0;
> +
> + return 0;
> +
> +err_copy_from_user:
> + printk(KERN_ERR "Preview Tables:Copy From User Error");
> + return -EINVAL;
-EFAULT please.
> +
> +/**
> + * isppreview_config_noisefilter - Configures the Noise Filter.
> + * @prev_nf: Structure containing the noisefilter table, strength to be used
> + * for the noise filter and the defect correction enable flag.
> + **/
> +void isppreview_config_noisefilter(struct ispprev_nf prev_nf)
> +{
> + int i = 0;
> +
> + isp_reg_writel(prev_nf.spread, OMAP3_ISP_IOMEM_PREV, ISPPRV_NF);
> + isp_reg_writel(ISPPRV_NF_TABLE_ADDR, OMAP3_ISP_IOMEM_PREV,
> + ISPPRV_SET_TBL_ADDR);
> + for (i = 0; i < 64; i++) {
What is 64 here?
> + isp_reg_writel(prev_nf.table[i], OMAP3_ISP_IOMEM_PREV,
> + ISPPRV_SET_TBL_DATA);
> + }
> +}
> +EXPORT_SYMBOL(isppreview_config_noisefilter);
> +
> +/**
> + * isppreview_config_cfa - Configures the CFA Interpolation parameters.
> + * @prev_cfa: Structure containing the CFA interpolation table, CFA format
> + * in the image, vertical and horizontal gradient threshold.
> + **/
> +void isppreview_config_cfa(struct ispprev_cfa prev_cfa)
> +{
> + int i = 0;
> +
> + ispprev_obj.cfafmt = prev_cfa.cfafmt;
> +
> + isp_reg_or(OMAP3_ISP_IOMEM_PREV, ISPPRV_PCR,
> + (prev_cfa.cfafmt << ISPPRV_PCR_CFAFMT_SHIFT));
> +
> + isp_reg_writel(
> + (prev_cfa.cfa_gradthrs_vert << ISPPRV_CFA_GRADTH_VER_SHIFT) |
> + (prev_cfa.cfa_gradthrs_horz << ISPPRV_CFA_GRADTH_HOR_SHIFT),
> + OMAP3_ISP_IOMEM_PREV, ISPPRV_CFA);
> +
> + isp_reg_writel(ISPPRV_CFA_TABLE_ADDR, OMAP3_ISP_IOMEM_PREV,
> + ISPPRV_SET_TBL_ADDR);
> +
> + for (i = 0; i < 576; i++) {
Ditto.
> + isp_reg_writel(prev_cfa.cfa_table[i],
> + OMAP3_ISP_IOMEM_PREV, ISPPRV_SET_TBL_DATA);
> + }
> +}
> +EXPORT_SYMBOL(isppreview_config_cfa);
> +
> +/**
> + * isppreview_config_gammacorrn - Configures the Gamma Correction table
> values
> + * @gtable: Structure containing the table for red, blue, green gamma table.
> + **/
> +void isppreview_config_gammacorrn(struct ispprev_gtable gtable)
> +{
> + int i = 0;
> +
> + isp_reg_writel(ISPPRV_REDGAMMA_TABLE_ADDR,
> + OMAP3_ISP_IOMEM_PREV, ISPPRV_SET_TBL_ADDR);
> + for (i = 0; i < 1024; i++) {
Ditto.
> + isp_reg_writel(gtable.redtable[i],
> + OMAP3_ISP_IOMEM_PREV, ISPPRV_SET_TBL_DATA);
> + }
> +
> + isp_reg_writel(ISPPRV_GREENGAMMA_TABLE_ADDR,
> + OMAP3_ISP_IOMEM_PREV, ISPPRV_SET_TBL_ADDR);
> + for (i = 0; i < 1024; i++) {
Ditto.
> + isp_reg_writel(gtable.greentable[i],
> + OMAP3_ISP_IOMEM_PREV, ISPPRV_SET_TBL_DATA);
> + }
> +
> + isp_reg_writel(ISPPRV_BLUEGAMMA_TABLE_ADDR,
> + OMAP3_ISP_IOMEM_PREV, ISPPRV_SET_TBL_ADDR);
> + for (i = 0; i < 1024; i++) {
Ditto.
> + isp_reg_writel(gtable.bluetable[i],
> + OMAP3_ISP_IOMEM_PREV, ISPPRV_SET_TBL_DATA);
> + }
> +}
> +EXPORT_SYMBOL(isppreview_config_gammacorrn);
> +
> +/**
> + * isppreview_config_luma_enhancement - Sets the Luminance Enhancement table.
> + * @ytable: Structure containing the table for Luminance Enhancement table.
> + **/
> +void isppreview_config_luma_enhancement(u32 *ytable)
> +{
> + int i = 0;
> +
> + isp_reg_writel(ISPPRV_YENH_TABLE_ADDR,
> + OMAP3_ISP_IOMEM_PREV, ISPPRV_SET_TBL_ADDR);
> + for (i = 0; i < 128; i++) {
Ditto.
> + isp_reg_writel(ytable[i],
> + OMAP3_ISP_IOMEM_PREV, ISPPRV_SET_TBL_DATA);
> + }
> +}
> +EXPORT_SYMBOL(isppreview_config_luma_enhancement);
> +
> +
> +/**
> + * isp_preview_cleanup - Module Cleanup.
> + **/
> +void __exit isp_preview_cleanup(void)
> +{
> + kfree(prev_config_params);
> + prev_config_params = NULL;
Is this NULL assignment needed?
> +}
> diff --git a/drivers/media/video/isp/isppreview.h
> b/drivers/media/video/isp/isppreview.h
> new file mode 100644
> index 0000000..630295c
> --- /dev/null
> +++ b/drivers/media/video/isp/isppreview.h
> @@ -0,0 +1,356 @@
> +/*
> + * drivers/media/video/isp/isppreview.h
> + *
> + * Driver header file for Preview module in TI's OMAP3 Camera ISP
> + *
> + * Copyright (C) 2008 Texas Instruments, Inc.
> + *
Please update copyright too. Add 2009 :)
--
---Trilok Soni
http://triloksoni.wordpress.com
http://www.linkedin.com/in/triloksoni
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html