int oem_fact_get_option_bit( unsigned char item, unsigned char bit ) { int result = 0; unsigned char *smem_ptr = NULL; unsigned int offset; if ( ( item >= OEM_FACT_OPTION_ITEM_SMEM_MIN ) && ( item <= OEM_FACT_OPTION_ITEM_SMEM_MAX ) ) { if ( bit > 7 ) { return result; } smem_ptr = kc_smem_alloc( OEM_FACT_OPTION_SMEM_ID, OEM_FACT_OPTION_SMEM_SIZE ); if ( smem_ptr ) { offset = item - OEM_FACT_OPTION_ITEM_SMEM_MIN; result = ( *( smem_ptr + offset ) & ( 0x01 << bit ) ) > 0 ? 1 : 0; } } return result; }
void oem_chg_param_init(void) { uint32_t *smem_ptr = NULL; uint32_t *cmp_ptr = NULL; if (init_flag) { return; } smem_ptr = (uint32_t *)kc_smem_alloc(SMEM_CHG_PARAM, CHG_PARAM_SIZE); if (smem_ptr == NULL) { pr_err("chg param read error.\n"); init_flag = 1; return; } cmp_ptr = kmalloc(CHG_PARAM_SIZE - SMEM_CHG_PARAM_SHARE, GFP_KERNEL); if (cmp_ptr == NULL) { pr_err("kmalloc error.\n"); init_flag = 1; return; } memset(cmp_ptr, 0x00, CHG_PARAM_SIZE); if (0 == memcmp(smem_ptr, cmp_ptr, CHG_PARAM_SIZE - SMEM_CHG_PARAM_SHARE)) { pr_err("smem data all '0'\n"); memset(smem_ptr, 0xFF, CHG_PARAM_SIZE-SMEM_CHG_PARAM_SHARE); oem_cmp_zero_flag = 1; } oem_param_charger_init((pm8921_oem_chg_param*)smem_ptr); oem_param_hkadc_init((pm8921_oem_chg_param*)smem_ptr); oem_param_bms_init((pm8921_oem_chg_param*)smem_ptr); oem_param_share_init((pm8921_oem_chg_param*)smem_ptr); kfree(cmp_ptr); init_flag = 1; }