展讯flash驱动
发布时间:2020-12-15 20:05:05 所属栏目:百科 来源:网络整理
导读:/* * Copyright (C) 2012 Spreadtrum Communications Inc. * * This software is licensed under the terms of the GNU General Public * License version 2,as published by the Free Software Foundation,and * may be copied,distributed,and modified un
/* * Copyright (C) 2012 Spreadtrum Communications Inc. * * This software is licensed under the terms of the GNU General Public * License version 2,as published by the Free Software Foundation,and * may be copied,distributed,and modified under those terms. * * This program is distributed in the hope that it will be useful,* but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */ #include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h> #ifndef CONFIG_64BIT #include <soc/sprd/hardware.h> #include <soc/sprd/board.h> #endif #include <soc/sprd/adi.h> #include "../common/parse_hwinfo.h" #include <asm/gpio.h> #define SPRD_PWM0_CTRL_OFST 0xEC #define SPRD_PWM0_PATTERN_HIGHT_OFST 0x10 #define SPRD_PWM0_PATTERT_LOW_OFST 0xC #define SPRD_PWM0_TONE_OFST 0x8 #define SPRD_PWM0_RATION_OFST 0x4 #define SPRD_WHTLED_CTRL_OFST 0xF0 //chinapalms add for front flash start #define KPLED_V_SHIFT 12 #define KPLED_V_MSK (0x0F << KPLED_V_SHIFT) #define LDO_KPLED_V_SHIFT (0x00) #define LDO_KPLED_V_MSK (0xff) #define LDO_KPLED_PD (1 << 8) #define KPLED_CTL (ANA_REGS_GLB_BASE + 0xf4) #define KPLED_PD (1 << 11) #define KPLED_PULLDOWN_EN (1 << 10) //chinapalms add for rront flash end extern int sci_efuse_ib_trim_get(unsigned int *p_cal_data); #ifdef CONFIG_CAMERA_FLASH_GPIO_Z157 #define SPRD_FLASH_ON 1 #define SPRD_FLASH_OFF 0 #undef GPIO_CAM_FLASH_EN #define GPIO_CAM_FLASH_EN 234 #endif unsigned int ib_trim_cal_data = 0; static int init_flag = 1; int sprd_flash_on(void) { if (init_flag && sci_efuse_ib_trim_get(&ib_trim_cal_data)) { /* 1. set ib_trim_cal_data to WHTLED_CTRL的IB_TRIM(0x400388F0 [15:9]) 2. set IB_TRIM_EM_SEL of RGB_CTRL to 0(0x400388EC [11]) */ sci_adi_clr(ANA_CTL_GLB_BASE + SPRD_WHTLED_CTRL_OFST,0x7F << 9); sci_adi_set(ANA_CTL_GLB_BASE + SPRD_WHTLED_CTRL_OFST,(ib_trim_cal_data & 0x7F) << 9); sci_adi_clr(ANA_CTL_GLB_BASE + SPRD_PWM0_CTRL_OFST,(0x1 << 11)); init_flag = 0; printk("parallel sprd_flash_on trim = %dn",ib_trim_cal_data); } printk("parallel sprd_flash_onn"); /*ENABLE THE PWM0 CONTROLLTER: RTC_PWM0_EN=1 & PWM0_EN=1*/ sci_adi_clr(ANA_CTL_GLB_BASE + SPRD_PWM0_CTRL_OFST,0xFFFF); sci_adi_set(ANA_CTL_GLB_BASE + SPRD_PWM0_CTRL_OFST,0xC805); /*SET PWM0 PATTERN HIGH*/ sci_adi_set(ANA_PWM_BASE + SPRD_PWM0_PATTERN_HIGHT_OFST,0xFFFF); /*SET PWM0 PATTERN LOW*/ sci_adi_set(ANA_PWM_BASE + SPRD_PWM0_PATTERT_LOW_OFST,0xFFFF); /*TONE DIV USE DEFAULT VALUE*/ sci_adi_clr(ANA_PWM_BASE + SPRD_PWM0_TONE_OFST,0x0100); /*SET PWM0 DUTY RATIO = 100%: MOD=FF & DUTY=FF*/ sci_adi_set(ANA_PWM_BASE + SPRD_PWM0_RATION_OFST,0xFFFF); /*ENABLE PWM0 OUTPUT: PWM0_EN=1*/ sci_adi_set(ANA_PWM_BASE,0x100); /*SET LOW LIGHT */ sci_adi_clr(ANA_CTL_GLB_BASE + SPRD_WHTLED_CTRL_OFST,0xFFFF); #ifdef CONFIG_FLASH_CURRENT_Z668 sci_adi_set(ANA_CTL_GLB_BASE + SPRD_WHTLED_CTRL_OFST,0x11); #elif (defined CONFIG_FLASH_CURRENT_Z156) sci_adi_set(ANA_CTL_GLB_BASE + SPRD_WHTLED_CTRL_OFST,0x11);//1e 11 #elif (defined CONFIG_FLASH_CURRENT_Z218) sci_adi_set(ANA_CTL_GLB_BASE + SPRD_WHTLED_CTRL_OFST,0x19); #else sci_adi_set(ANA_CTL_GLB_BASE + SPRD_WHTLED_CTRL_OFST,0x1e); #endif /*ENABLE WHTLED*/ sci_adi_clr(ANA_CTL_GLB_BASE + SPRD_WHTLED_CTRL_OFST,0x1); #ifdef CONFIG_CAMERA_FLASH_GPIO_Z157 printk("sprd_flash_on pwm configs by dongxunfengn"); gpio_request(GPIO_CAM_FLASH_EN,"cam_flash_en"); gpio_direction_output(GPIO_CAM_FLASH_EN,SPRD_FLASH_ON); gpio_free(GPIO_CAM_FLASH_EN); #endif return 0; } int sprd_flash_high_light(void) { printk("parallel sprd_flash_high_lightn"); /*SET HIGH LIGHT*/ sci_adi_clr(ANA_CTL_GLB_BASE + SPRD_WHTLED_CTRL_OFST,0x40); #elif (defined CONFIG_FLASH_CURRENT_Z156) sci_adi_set(ANA_CTL_GLB_BASE + SPRD_WHTLED_CTRL_OFST,0x68);//40 #elif (defined CONFIG_FLASH_CURRENT_Z218) sci_adi_set(ANA_CTL_GLB_BASE + SPRD_WHTLED_CTRL_OFST,0x68); #else sci_adi_set(ANA_CTL_GLB_BASE + SPRD_WHTLED_CTRL_OFST,0x40); #endif /*ENABLE WHTLED*/ sci_adi_clr(ANA_CTL_GLB_BASE + SPRD_WHTLED_CTRL_OFST,0x1); #ifdef CONFIG_CAMERA_FLASH_GPIO_Z157 printk("sprd_flash_high_light pwm configs by dongxunfeng n"); gpio_request(GPIO_CAM_FLASH_EN,SPRD_FLASH_ON); gpio_free(GPIO_CAM_FLASH_EN); #endif return 0; } int sprd_flash_close(void) { printk("parallel sprd_flash_closen"); /*DISABLE WHTLED*/ sci_adi_clr(ANA_CTL_GLB_BASE + SPRD_WHTLED_CTRL_OFST,0xFFFF); sci_adi_set(ANA_CTL_GLB_BASE + SPRD_WHTLED_CTRL_OFST,0x1); /*DISABLE THE PWM0 CONTROLLTER: RTC_PWM0_EN=0 & PWM0_EN=0*/ sci_adi_clr(ANA_CTL_GLB_BASE + SPRD_PWM0_CTRL_OFST,0xC000); /*ENABLE PWM0 OUTPUT: PWM0_EN=0*/ sci_adi_clr(ANA_PWM_BASE,0x100); #ifdef CONFIG_CAMERA_FLASH_GPIO_Z157 printk("sprd_flash_close pwm configs by dongxunfengn"); gpio_request(GPIO_CAM_FLASH_EN,SPRD_FLASH_OFF); gpio_free(GPIO_CAM_FLASH_EN); #endif return 0; } int sprd_flash_cfg(struct sprd_flash_cfg_param *param,void *arg) { return 0; } #ifdef CONFIG_CAMERA_FRONT_FLASH //chinapalms add for front flashlight static void sprd_kpled_set_brightness(int brightness_t) { unsigned long brightness = brightness_t; unsigned long brightness_level; brightness_level = brightness; if(brightness_level > 255) brightness_level = 255; if(0){ sci_adi_write(KPLED_CTL,((brightness_level << KPLED_V_SHIFT) & KPLED_V_MSK),KPLED_V_MSK); } else{ sci_adi_write(KPLED_CTL,((brightness_level << LDO_KPLED_V_SHIFT) & LDO_KPLED_V_MSK),LDO_KPLED_V_MSK); } } int sprd_front_flash_close(void) { //chinapalms add for front flashlight use whtled control start // printk("sprd_front_flash_closen"); if(0){ sci_adi_clr(KPLED_CTL,KPLED_PD); } else{ // sci_adi_set(KPLED_CTL,KPLED_PULLDOWN_EN); sci_adi_clr(KPLED_CTL,LDO_KPLED_PD); } // sprd_kpled_set_brightness(0); //chinapalms add for front flashlight use whtled control end return 0; } int sprd_front_flash_on(void) { //chinapalms add for front flashlight use whtled control start // printk("parallel front sprd_flash_on n"); if(0){ sci_adi_set(KPLED_CTL,KPLED_PD); } else{ sci_adi_set(KPLED_CTL,KPLED_PULLDOWN_EN); sci_adi_set(KPLED_CTL,LDO_KPLED_PD); } sprd_kpled_set_brightness(100); //chinapalms add for front flashlight use whtled control end return 0; } #endif (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |