void ft6x06_report_dsm_erro(struct ft6x06_ts_data * ft6x06_data, struct dsm_client * dsm_client, int type, int err_num) { if(!dsm_client) { tp_log_err("%s %d: dsm_client is null!\n", __func__, __LINE__); return; } if(dsm_client_ocuppy(dsm_client)) { tp_log_err("%s %d: dsm buffer is busy!\n", __func__, __LINE__); return; } switch(type) { case DSM_TP_I2C_RW_ERROR_NO: dsm_client_record(dsm_client,"%s %d: i2c_trans_erro, rc = %d\n", __func__,__LINE__, err_num); break; case DSM_TP_FW_ERROR_NO: dsm_client_record(dsm_client,"%s %d: firmware upgrade erro!\n", __func__,__LINE__); break; default: break; } ft6x06_dsm_record_basic_info(ft6x06_data, dsm_client); dsm_client_notify(dsm_client, type); return; }
static void dsm_gpio_key_timer_func(unsigned long data) { int key_press_error_found = -1; if (!dsm_client_ocuppy(key_dclient)) { key_press_error_found++; } /* judge the press count */ if ((!key_press_error_found) && (volume_up_press_count > MAX_PRESS_KEY_COUNT)) { key_press_error_found++; dsm_client_record(key_dclient, "volume up key trigger on the abnormal style.\n"); } else if ((!key_press_error_found) && (volume_down_press_count > MAX_PRESS_KEY_COUNT)) { key_press_error_found++; dsm_client_record(key_dclient, "volume down key trigger on the abnormal style.\n"); } if (key_press_error_found > 0) { dsm_client_notify(key_dclient, DSM_KEY_ERROR_NO); } else if (!key_press_error_found) { dsm_client_unocuppy(key_dclient); } else { /* key_dclient preempt failed, we have nothing to do */ } /* reset the statistic variable */ volume_up_press_count = 0; volume_down_press_count = 0; mod_timer(&dsm_gpio_key_timer, jiffies + STATISTIC_INTERVAL * HZ); return; }
/*add power status error judge,avoid red screen*/ void lcd_dcm_pwr_status_handler(unsigned long data) { /*Not in factory mode will report this dsm log*/ if( !is_runmode_factory() ) { /*optimize 20110 report strategy for device monitor.*/ if((lcd_pwr_status.lcd_dcm_pwr_status != LCD_PWR_STAT_GOOD)&&(lcd_pwr_status.lcd_dcm_pwr_status != LCD_PWR_STAT_IS_GOOD)) { dsm_client_record(lcd_dclient, "lcd power status wrong, value :%x\n",lcd_pwr_status.lcd_dcm_pwr_status); dsm_client_record(lcd_dclient, "lcd power status :bit 0 do unblank\n"); dsm_client_record(lcd_dclient, "lcd power status :bit 1 lcd on\n"); dsm_client_record(lcd_dclient, "lcd power status :bit 2 set frame\n"); dsm_client_record(lcd_dclient, "lcd power status :bit 3 set backlgiht\n"); dsm_client_record(lcd_dclient, "lcd power status :if did the operation the bit will be set to 1 or the bit is 0\n"); dsm_client_record(lcd_dclient,"unblank at [%d-%d-%d]%d:%d:%d:%d\n",lcd_pwr_status.tm_unblank.tm_year + 1900,lcd_pwr_status.tm_unblank.tm_mon+1, lcd_pwr_status.tm_unblank.tm_mday,lcd_pwr_status.tm_unblank.tm_hour,lcd_pwr_status.tm_unblank.tm_min,lcd_pwr_status.tm_unblank.tm_sec,lcd_pwr_status.tvl_unblank.tv_usec%1000); dsm_client_record(lcd_dclient,"lcd on at [%d-%d-%d]%d:%d:%d:%d\n",lcd_pwr_status.tm_lcd_on.tm_year + 1900,lcd_pwr_status.tm_lcd_on.tm_mon+1, lcd_pwr_status.tm_lcd_on.tm_mday,lcd_pwr_status.tm_lcd_on.tm_hour,lcd_pwr_status.tm_lcd_on.tm_min,lcd_pwr_status.tm_lcd_on.tm_sec,lcd_pwr_status.tvl_lcd_on.tv_usec%1000); dsm_client_record(lcd_dclient,"set frame at [%d-%d-%d]%d:%d:%d:%d\n",lcd_pwr_status.tm_set_frame.tm_year + 1900,lcd_pwr_status.tm_set_frame.tm_mon+1, lcd_pwr_status.tm_set_frame.tm_mday,lcd_pwr_status.tm_set_frame.tm_hour,lcd_pwr_status.tm_set_frame.tm_min,lcd_pwr_status.tm_set_frame.tm_sec,lcd_pwr_status.tvl_set_frame.tv_usec%1000); dsm_client_record(lcd_dclient,"set backlight at [%d-%d-%d]%d:%d:%d:%d\n",lcd_pwr_status.tm_backlight.tm_year + 1900,lcd_pwr_status.tm_backlight.tm_mon+1, lcd_pwr_status.tm_backlight.tm_mday,lcd_pwr_status.tm_backlight.tm_hour,lcd_pwr_status.tm_backlight.tm_min,lcd_pwr_status.tm_backlight.tm_sec,lcd_pwr_status.tvl_backlight.tv_usec%1000); dsm_client_notify(lcd_dclient, DSM_LCD_POWER_STATUS_ERROR_NO); show_state_filter(TASK_UNINTERRUPTIBLE); } } else { /*in factory mode do not report this dsm log,just print a log for locate*/ LCD_LOG_INFO("[%s] in factory mode ignore log of 20110\n",__func__); } lcd_pwr_status.lcd_dcm_pwr_status = 0; }
struct hisi_hi6421v300_coul_battery_data* get_battery_data(unsigned int id_voltage) { int i; int dsm_error_found = -1; int dsm_error_offset = 0; if (!bat_param_status) { hwlog_err("battery param is invalid\n"); return NULL; } if(!dsm_client_ocuppy(battery_detect_dclient)) { dsm_error_found++; } for(i = 0; i < hisi_bat_data_size; i++) { if((id_voltage > p_data[i]->id_identify_min) && (id_voltage <= p_data[i]->id_identify_max)) { if ((id_voltage < p_data[i]->id_voltage_min) || (id_voltage > p_data[i]->id_voltage_max)) { dsm_error_found++; dsm_error_offset = 0; dsm_client_record(battery_detect_dclient, "Battery id voltage:%d is out of normal range:[%d~%d],identify range:[%d~%d]!\n",id_voltage, p_data[i]->id_voltage_min,p_data[i]->id_voltage_max,p_data[i]->id_identify_min,p_data[i]->id_identify_max); } break; } } if(i == hisi_bat_data_size) { i = 0; dsm_error_found++; dsm_error_offset = 1; dsm_client_record(battery_detect_dclient, "Battery id voltage:%d is invalid. Use the default battery params!\n",id_voltage); } if(dsm_error_found > 0) { dsm_client_notify(battery_detect_dclient, DSM_BATTERY_DETECT_ERROR_NO + dsm_error_offset); } else if(!dsm_error_found) { dsm_client_unocuppy(battery_detect_dclient); } else { hwlog_err("dsm battery_detect_dclient ocuppy failed!\n"); } hwlog_info("current battery name is %s\n", p_data[i]->batt_brand); return p_data[i]; }
static void hi6401_check_pll(struct hi6401_irq *irq) { unsigned long flags = 0; u32 ret = 0; u32 val = 0; mutex_lock(&irq->sr_mutex); spin_lock_irqsave(&irq->rw_lock, flags); writel(1, irq->reg_base_addr + (HI6401_PAGE_SELECT_REG << 2)); udelay(1); ret = readl(irq->reg_base_addr + ((HI6401_PLL_PD_REG & HI6401_PAGE_OFFSET_MASK) << 2)); udelay(1); if (0 == (ret & 1)) { /* HI6401_PLL_PD_BIT */ /* pll power on */ val = readl(irq->reg_base_addr + ((HI6401_PLL_EN_REG & HI6401_PAGE_OFFSET_MASK) << 2)); udelay(1); if (0 != (val & (1 << HI6401_PLL_EN_BIT))) { /* pll enable */ ret = readl(irq->reg_base_addr + ((HI6401_PLL_STATUS_REG & HI6401_PAGE_OFFSET_MASK) << 2)); udelay(1); if (0 == (ret & (1 << HI6401_PLL_STATUS_BIT))) { pr_err("%s,line:%d reset pll.\n", __FUNCTION__, __LINE__); /* pll unlocked */ hi6401_codec_dump(irq); if ((1 == pll_unlock_flag) && !dsm_client_ocuppy(hi6401_client)) { dsm_client_record(hi6401_client, "DSM_HI6401_PLL_UNLOCK ret=%d,codec=%s\n", ret, (g_dump_buf ? g_dump_buf : "null")); dsm_client_notify(hi6401_client, DSM_HI6401_PLL_UNLOCK); } pll_unlock_flag++; val &= ~(1 << HI6401_PLL_EN_BIT); writel(val, irq->reg_base_addr + ((HI6401_PLL_EN_REG & HI6401_PAGE_OFFSET_MASK) << 2)); udelay(2); val |= (1 << HI6401_PLL_EN_BIT); writel(val, irq->reg_base_addr + ((HI6401_PLL_EN_REG & HI6401_PAGE_OFFSET_MASK) << 2)); udelay(1); } else { pll_unlock_flag = 0; if(g_dump_buf) memset(g_dump_buf, 0, Hi6401_SIZE_MAX); } } } else { if (!dsm_client_ocuppy(hi6401_client)) { dsm_client_record(hi6401_client, "HI6401_PLL_PD_REG ret=%d\n", ret); dsm_client_notify(hi6401_client, DSM_HI6401_PLL_PD); } } spin_unlock_irqrestore(&irq->rw_lock, flags); mutex_unlock(&irq->sr_mutex); }
/** * func - report basic info. * after read power, i2c gpio status,x,y,z value, important registers value, * and report info to dsm server. */ static ssize_t lis_gsensor_dsm_record_basic_err_info( struct lis3dh_acc_data *acceld, bool auto_report_flag) { struct lis_gsensor_test_excep *excep = &acceld->lis_gs_exception; ssize_t size = 0; ssize_t total_size = 0; /* read important registers' value and x,y,z value and report them */ lis_gsensor_read_register_info(acceld,auto_report_flag); memset(acceld->dsm_buf,0, PAGE_SIZE); snprintf(acceld->dsm_buf, PAGE_SIZE,"CTRL1 = 0x%2x,CTRL2 = 0x%2x ," "CTRL3 = 0x%2x,CTRL4 = 0x%2x,CTRL4 = 0x%2x,CTRL5 = 0x%2x \n"\ "excep_x = %d,excep_y = %d,excep_z = %d\n" ,excep->reg_buf[0],excep->reg_buf[1],excep->reg_buf[2] ,excep->reg_buf[3],excep->reg_buf[4],excep->reg_buf[5] ,excep->cur_err_x,excep->cur_err_y,excep->cur_err_z); size = dsm_client_record(lis3dh_gs_dclient,acceld->dsm_buf); total_size += size; /* read power and i2c scl/sda gpio value and report them */ size = lis_gsensor_dsm_record_i2c_err_info(acceld); total_size += size; return total_size; }
static void cpu_buck_work(struct work_struct *work) { int i = 0; struct cpu_buck_sample* cbs = g_cbs; bool already_notified = false; if (!fault_happened) return; while(cbs) { for (i = 0; i < cbs->info_size; ++i) { if ((cbs->cbi[i].error_mask & cbs->reg[cbs->cbi[i].reg_number]) == cbs->cbi[i].error_mask) { if (!dsm_client_ocuppy(cpu_buck_client)) { already_notified = true; hwlog_info("cpu_buck record and notify: %s\n", cbs->cbi[i].error_info); dsm_client_record(cpu_buck_client, "cpu_buck %s happened!\n", cbs->cbi[i].error_info); dsm_client_notify(cpu_buck_client, ERROR_NO_CPU_BUCK_BASE + cbs->cbi[i].err_no); break; } } } if (already_notified) { break; } cbs = cbs->cbs; } }
static void RFC_PrintIeStatus(CSMI_InformationElements *ie) { if (ie->coreUnsprtdMsg || ie->coreDataTxCol || ie->coreReconfigObjection || ie->coreExError) { SLIMBUS_DEV_LIMIT_INFO("Core: UNSPRTD_MSG:%X DATA_TX_COL:%X RECONFIG_OBJECTION:%X EX_ERROR:%X \n", ie->coreUnsprtdMsg, ie->coreDataTxCol, ie->coreReconfigObjection, ie->coreExError); } if (ie->interfaceMcTxCol || ie->interfaceLostFs || ie->interfaceLostSfs || ie->interfaceLostMs || ie->interfaceDataSlotOverlap) { SLIMBUS_DEV_LIMIT_INFO("Interface: MC_TX_COL:%X LOST_FS:%X LOST_SFS:%X LOST_MS:%X DATA_SLOT_OVERLAP:%X\n", ie->interfaceMcTxCol, ie->interfaceLostFs, ie->interfaceLostSfs, ie->interfaceLostMs, ie->interfaceDataSlotOverlap); } if (ie->managerActiveManager) { SLIMBUS_DEV_LIMIT_INFO("Manager: ACTIVE_MANAGER:%X\n", ie->managerActiveManager); } if (ie->framerQuality || ie->framerGcTxCol || ie->framerFiTxCol || ie->framerFsTxCol || ie->framerActiveFramer) { SLIMBUS_DEV_LIMIT_INFO("Framer: QUALITY:%X GC_TX_COL:%X FI_TX_COL:%X FS_TX_COL:%X ACTIVE_FRAMER:%X\n", ie->framerQuality, ie->framerGcTxCol, ie->framerFiTxCol, ie->framerFsTxCol, ie->framerActiveFramer); } if (ie->interfaceLostFs || ie->interfaceLostSfs || ie->interfaceLostMs) { if (dsm_notify_limit == SLIMBUS_LOSTMS_COUNT) { slimbus_dump_state(SLIMBUS_DUMP_LOSTMS); if (!dsm_client_ocuppy(dsm_audio_client)) { dsm_client_record(dsm_audio_client, "DSM_HI6402_SLIMBUS_LOST_MS\n"); dsm_client_notify(dsm_audio_client, DSM_HI6402_SLIMBUS_LOST_MS); } } dsm_notify_limit++; } }
static void gpio_keydown_timer(unsigned long data) { int keydown_value; struct hisi_gpio_key *gpio_key = (struct hisi_gpio_key *)data; keydown_value = gpio_get_value((unsigned int)gpio_key->gpio_down); /*judge key is pressed or released.*/ if (keydown_value == GPIO_LOW_VOLTAGE){ wake_lock(&volume_down_key_lock); #if defined (CONFIG_HUAWEI_DSM) if ((jiffies - volume_down_last_press_time) < msecs_to_jiffies(PRESS_KEY_INTERVAL)) { if (!dsm_client_ocuppy(key_dclient)) { dsm_client_record(key_dclient, "volume down key trigger on the abnormal style.\n"); dsm_client_notify(key_dclient, DSM_KEY_ERROR_NO); } } volume_down_last_press_time = jiffies; #endif } schedule_delayed_work(&(gpio_key->gpio_keydown_work), 0); return; }
int audio_dsm_report_num(int error_no, unsigned int mesg_no) { int err = 0; if(NULL == audio_dclient) { printk("%s: audio_dclient did not register!\n", __func__); return -1; } err = dsm_client_ocuppy(audio_dclient); if(0 != err) { printk("%s: user buffer is busy!\n", __func__); return -1; } printk("%s: after dsm_client_ocuppy, error_no=0x%x, mesg_no=0x%x!\n", __func__, error_no, mesg_no); err = dsm_client_record(audio_dclient, "Message code = 0x%x.\n", mesg_no); dsm_client_notify(audio_dclient, error_no); return 0; }
/* fw err infomation: err number */ ssize_t cyttsp5_dsm_record_fw_err_info( int err_numb ) { ssize_t size = 0; ssize_t total_size = 0; tp_log_err("%s: entry!\n", __func__); /* err number */ size = dsm_client_record(tp_cyp_dclient, "fw update result:failed, retval is %d\n", err_numb); total_size += size; /* fw err status */ size = dsm_client_record(tp_cyp_dclient, "updata status is %d\n", g_tp_dsm_info.constraints_UPDATE_status); total_size += size; return total_size; }
ssize_t synaptics_dsm_record_esd_err_info( int err_num ) { ssize_t size = 0; struct dsm_client *tp_dclient = tp_dsm_get_client(); /* esd err number */ size =dsm_client_record(tp_dclient, "esd err number:%d\n", err_num); return size; }
static void inputhub_mcu_send_complete(rproc_msg_t *ack_buffer, rproc_msg_len_t ack_buffer_len, int error, void *data) { complete(&send_complete); if ((-ETIMEOUT) == error) { hwlog_err("send failed timeout\n"); if(!dsm_client_ocuppy(shb_dclient)){ dsm_client_record(shb_dclient, "IOM3RSTSTAT: 0x%x\n", read_reg32(IOM3RSTSTAT_ADDR)); dsm_client_record(shb_dclient, "PERRSTSTAT4: 0x%x\n", read_reg32(PERRSTSTAT4_ADDR)); dsm_client_record(shb_dclient, "PERSTAT5: 0x%x\n", read_reg32(PERSTAT5_ADDR)); dsm_client_record(shb_dclient, "IOM3CLKEN: 0x%x\n", read_reg32(IOM3CLKEN_ADDR)); dsm_client_notify(shb_dclient, DSM_SHB_ERR_IPC_TIMEOUT); } }else{ hwlog_debug("send success\n"); } return; }
/*delete mdss_mdp_get_clk_rate() to avoid panic*/ void mdp_underrun_dsm_report(unsigned long num,unsigned long underrun_cnt) { /* try to get permission to use the buffer */ if(dsm_client_ocuppy(lcd_dclient)) { /* buffer is busy */ LCD_LOG_ERR("%s: buffer is busy!\n", __func__); return; } dsm_client_record(lcd_dclient, "Lcd underrun detected for ctl=%d,count=%d\n",num,underrun_cnt); dsm_client_notify(lcd_dclient, DSM_LCD_MDSS_UNDERRUN_ERROR_NO); }
size_t ft6x06_dsm_record_basic_info(struct ft6x06_ts_data * ft6x06_data, struct dsm_client * dsm_client) { ssize_t size = 0; ssize_t total_size = 0; if(!ft6x06_data) { tp_log_err("%s %d: ft6x06_data is null!\n", __func__, __LINE__); return -1; } if(!dsm_client) { tp_log_err("%s %d: dsm_client is null!\n", __func__, __LINE__); return -1; } /* power status: mode, enable, voltage*/ size = dsm_client_record(dsm_client, "[vbus power] mode:%d, enable:%d, vol:%d\n" "[vdd power] mode:%d, enable:%d, vol:%d\n", regulator_get_mode(vbus_focaltech), regulator_is_enabled(vbus_focaltech), regulator_get_voltage(vbus_focaltech), regulator_get_mode(vdd_focaltech), regulator_is_enabled(vdd_focaltech), regulator_get_voltage(vdd_focaltech)); total_size += size; /* gpio status: irq, reset*/ size =dsm_client_record(dsm_client, "[irq gpio] num:%d, irq gpio status:%d\n" "[reset gpio] num:%d, reset gpio status:%d\n", ft6x06_data->pdata->irq, gpio_get_value(ft6x06_data->pdata->reset), ft6x06_data->pdata->reset, gpio_get_value(ft6x06_data->pdata->reset)); total_size += size; return total_size; }
/* i2c error infomation: err number, register infomation */ ssize_t cyttsp5_dsm_record_i2c_err_info( int err_numb ) { ssize_t size = 0; ssize_t total_size = 0; tp_log_err("%s: entry!\n", __func__); /* err number */ size = dsm_client_record(tp_cyp_dclient, "i2c err number:%d\n", err_numb ); total_size += size; return total_size; }
int mdss_record_dsm_err(u32 *dsi_status) { if( NULL == lcd_dclient ) { LCD_LOG_ERR("%s: there is no lcd_dclient!\n", __func__); return -1; } /* try to get permission to use the buffer */ if(dsm_client_ocuppy(lcd_dclient)) { /* buffer is busy */ LCD_LOG_ERR("%s: buffer is busy!\n", __func__); return -1; } LCD_LOG_INFO("%s: entry!\n", __func__); if (dsi_status[0]) dsm_client_record(lcd_dclient, "DSI_ACK_ERR_STATUS is wrong ,err number :%x\n", dsi_status[0]); if (dsi_status[1] & 0x0111) dsm_client_record(lcd_dclient, "DSI_TIMEOUT_STATUS is wrong ,err number :%x\n", dsi_status[1]); if (dsi_status[2] & 0x011111) dsm_client_record(lcd_dclient, "DSI_DLN0_PHY_ERR is wrong ,err number :%x\n", dsi_status[2]); if (dsi_status[3] & 0xcccc4489) dsm_client_record(lcd_dclient, "DSI_FIFO_STATUS is wrong ,err number :%x\n", dsi_status[3]); if (dsi_status[4] & 0x80000000) dsm_client_record(lcd_dclient, "DSI_STATUS is wrong ,err number :%x\n", dsi_status[4]); dsm_client_notify(lcd_dclient, DSM_LCD_MDSS_DSI_ISR_ERROR_NO); return 0; }
static void powerkey_timer_func(unsigned long data) { if (powerkey_press_count > MAX_PRESS_KEY_COUNT) { if(!dsm_client_ocuppy(power_key_dclient)) { dsm_client_record(power_key_dclient, "powerkey trigger on the abnormal style.\n"); dsm_client_notify(power_key_dclient, DSM_POWER_KEY_ERROR_NO); } } /* reset the statistic variable */ powerkey_press_count = 0; mod_timer(&dsm_powerkey_timer, jiffies + STATISTIC_INTERVAL * HZ); return; }
/***************************************************************************** 函 数 名 : pastar_dsm_work_func 功能描述 : 上报异常信息 输入参数 : @work - work结构体 输出参数 : 无 返 回 值 : 无 *****************************************************************************/ void pastar_dsm_work_func(struct work_struct *work) { pastar_print_info("Execuing ..."); /* notify exception */ if (!dsm_client_ocuppy(pastar_dclient)) { /* record message */ dsm_client_record(pastar_dclient, "PAStar 0x21 reg 0x%x, 0x6A reg 0x%x\n", reg_val[0], reg_val[1]); /* notify */ dsm_client_notify(pastar_dclient, 30000); } return; }
static void hisi_pmic_record_events(PMIC_MNTN_DESC *pmic_mntn) { int index; #if defined (CONFIG_HUAWEI_DSM) int pmic_record_error_offset = 0; int i = 0; #endif snprintf(pmic_mntn->init_log_show, PMIC_PRINT_BUF_SIZE, "\nPMIC REGISTER DUMP\n"); snprintf(pmic_mntn->init_log_show + strlen(pmic_mntn->init_log_show), PMIC_PRINT_BUF_SIZE, " addr data \n"); for (index = 0; index < pmic_mntn->record_reg_n; index++) { pmic_mntn->record_event_buff[index] = hisi_pmic_reg_read(pmic_mntn->record_regs[index]); #if defined (CONFIG_HUAWEI_DSM) pmic_record_error_offset = pmic_mntn->data_width * index; if (pmic_mntn->record_event_buff[index] & HISI_PMIC_DSM_MASK_STATE) { for (i = 0; i < pmic_mntn->data_width; i++) { if ((pmic_mntn->record_event_buff[index] & BIT(i)) \ && (pmic_mntn->dsm_record_regs_mask[index] & BIT(i)) \ && (pmic_mntn->dsm_ocp_reset_mask[index] & BIT(i))) { if (dsm_client_ocuppy(pmic_dsm_dclient)) { pr_err("pmic_dsm_dclient dsm_client_ocuppy failed\n"); } else { pr_err("pmic %s happened, please pay attention!\n", pmic_mntn->record_exch_desc[index].event_bit_name[i]); dsm_client_record(pmic_dsm_dclient, "pmic %s_ocp happened, please pay attention!\n", pmic_mntn->record_exch_desc[index].event_bit_name[i]); dsm_client_notify(pmic_dsm_dclient, DSM_PMU_OCP_ERROR_NO_BASE + pmic_record_error_offset); } } pmic_record_error_offset++; } } #endif hisi_pmic_reg_write(pmic_mntn->record_regs[index], pmic_mntn->record_event_buff[index]); snprintf(pmic_mntn->init_log_show + strlen(pmic_mntn->init_log_show), PMIC_PRINT_BUF_SIZE, " 0x%0x 0x%0x \n", pmic_mntn->record_regs[index], pmic_mntn->record_event_buff[index]); } clear_uv_mntn_resered_reg_bit(); pr_err("%s", pmic_mntn->init_log_show); return; }
void hw_wifi_dsm_client_notify(int dsm_id, const char *fmt, ...) { char buf[LOG_BUF_SIZE] = {0}; va_list ap; va_start(ap, fmt); if(wifi_dsm_client && !dsm_client_ocuppy(wifi_dsm_client)) { if(fmt) { vsnprintf(buf, LOG_BUF_SIZE, fmt, ap); dsm_client_record(wifi_dsm_client, buf); } dsm_client_notify(wifi_dsm_client, dsm_id); HW_PRINT_HI("wifi dsm_client_notify success\n"); } else { HW_PRINT_HI("wifi dsm_client_notify failed\n"); } va_end(ap); }
static irqreturn_t ivp_dwaxi_irq_handler(int irq, void *dev_id) { ivp_warn("=======================DWAXI IRQ Trigger============================"); ivp_warn("dwaxi triggled!SMMU maybe in reset status"); //clear dwaxi irq ivp_gic_reg_write(GIC_REG_OFF_GICD_ICENABLERn, 0x80000); ivp_parse_dwaxi_info(); ivp_warn("=======================DWAXI IRQ LEAVE=============================="); if(!dsm_client_ocuppy(client_ivp)) { dsm_client_record(client_ivp, "ivp\n"); dsm_client_notify(client_ivp, DSM_IVP_DWAXI_ERROR_NO); ivp_info("[I/DSM] %s dsm_client_ivp_dwaxi", client_ivp->client_name); } return IRQ_HANDLED; }
static irqreturn_t ivp_wdg_irq_handler(int irq, void *dev_id) { struct ivp_device *pdev = (struct ivp_device *) dev_id;; ivp_warn("=======================WDG IRQ Trigger============================"); //Clear IRQ ivp_hw_clr_wdg_irq(); up(&pdev->wdg_sem); ivp_warn("=======================WDG IRQ LEAVE=============================="); if(!dsm_client_ocuppy(client_ivp)) { dsm_client_record(client_ivp, "ivp\n"); dsm_client_notify(client_ivp, DSM_IVP_WATCH_ERROR_NO); ivp_info("[I/DSM] %s dsm_client_ivp_watach dog", client_ivp->client_name); } return IRQ_HANDLED; }
/** * func - after read sda/scl, vdd/vddio value, and report info to dsm server. * NOTE: */ static ssize_t lis_gsensor_dsm_record_i2c_err_info(struct lis3dh_acc_data *acceld) { struct lis_gsensor_test_excep *excep = &acceld->lis_gs_exception; ssize_t size = 0; ssize_t total_size = 0; /* read power and i2c scl/sda gpio value and report them */ lis_gsensor_read_i2c_err_info(acceld); memset(acceld->dsm_buf,0, DSM_SENSOR_BUF_COM); snprintf(acceld->dsm_buf, PAGE_SIZE,"i2c_scl_val=%d,i2c_sda_val=%d,vdd = %d, vddio=%d,i2c_errno=%d\n", excep->i2c_scl_val,excep->i2c_sda_val, excep->vdd_mv,excep->vddio_mv,excep->i2c_err_num); size = dsm_client_record(lis3dh_gs_dclient,acceld->dsm_buf); total_size += size; return total_size; }
int audio_dsm_report_info(int error_no, char *fmt, ...) { int err = 0; int ret = 0; char dsm_report_buffer[DSM_REPORT_BUF_SIZE] = {0}; va_list args; if(NULL == audio_dclient) { printk("%s: audio_dclient did not register!\n", __func__); return -1; } if(error_no < DSM_AUDIO_ERROR_NUM) { printk("%s: input error_no err!\n", __func__); return -1; } va_start(args, fmt); ret = vsnprintf(dsm_report_buffer, DSM_REPORT_BUF_SIZE, fmt, args); va_end(args); err = dsm_client_ocuppy(audio_dclient); if(0 != err) { printk("%s: user buffer is busy!\n", __func__); return -1; } printk("%s: after dsm_client_ocuppy, dsm_error_no = %d, %s\n", __func__, error_no, dsm_report_buffer); dsm_client_record(audio_dclient, "%s\n", dsm_report_buffer); dsm_client_notify(audio_dclient, error_no); return 0; }
static irqreturn_t hi6402_pll_unlock_handler(int irq, void *data) { struct hi6402_mbhc_platform_data *pdata = (struct hi6402_mbhc_platform_data *)data; BUG_ON(NULL == pdata); unsigned int i = 0; mutex_lock(&pdata->p_irq->pll_mutex); if (0 != (hi6402_irq_read(pdata->p_irq, HI6402_PLL_PD_FLAG_REG) & PLL_PD_VALUE) || 0 != (hi6402_irq_read(pdata->p_irq, HI6402_PLL_LOCK_FLAG_REG) & PLL_LOCK_VALUE)){ pr_info("%s(%u): pll pd, ignore pll unlock irq! \n", __FUNCTION__, __LINE__); /* mask pll unlock irq */ mutex_lock(&pdata->p_irq->irq_lock); hi6402_reg_set_bit(pdata->p_irq, HI6402_MASK_IRQ_REG_2, HI6402_MASK_PLL_UNLOCK_BIT); pdata->p_irq->mask2 |= 0x10; mutex_unlock(&pdata->p_irq->irq_lock); } else { pr_info("%s(%u): pll unlock irq! \n", __FUNCTION__, __LINE__); if (!dsm_client_ocuppy(dsm_audio_client)) { dsm_client_record(dsm_audio_client, "DSM_HI6402_PLL_UNLOCK\n"); dsm_client_notify(dsm_audio_client, DSM_HI6402_PLL_UNLOCK); } for (i = PLL_UNLOCK_REG_START; i<= PLL_UNLOCK_REG_END; i++) { pr_err("%s(%u): %x is %x \n", __FUNCTION__, __LINE__, i, hi6402_irq_read(pdata->p_irq, i)); } pdata->p_irq->pll_status = HI6402_PLL_RST; hi6402_irq_set_pll_mode(pdata->p_irq); } mutex_unlock(&pdata->p_irq->pll_mutex); return IRQ_HANDLED; }
int inputhub_mcu_send(const char *buf, unsigned long length) { struct hisi_mbox_task *tx_task = NULL; mbox_msg_t *tx_buffer = NULL; mbox_msg_len_t len=0; int i = 0; int ret = -1; if(NULL==mbox) inputhub_mcu_connect(); if(NULL==mbox) return ret; len = (length + sizeof(mbox_msg_t) - 1) / (sizeof(mbox_msg_t)); //todo:send 256 bytes max one time, and repeat until buf was sent. tx_buffer = (mbox_msg_t *)kmalloc(sizeof(mbox_msg_t)*len, GFP_KERNEL); if (!tx_buffer) return ret; memcpy(tx_buffer, buf, length); pr_debug("inputhub_mcu_send------------->length = %d, len = %d\n", (int)length, (int)len); for (i = 0; i < len; i++) pr_debug("tx_buffer[%d] = 0x%x\n", i, tx_buffer[i]); tx_task = hisi_mbox_task_alloc(mbox, HISI_MAILBOX_RP_IOM3, tx_buffer, len, 0, inputhub_mcu_send_complete, NULL); if (!tx_task) { kfree((void *)tx_buffer); return ret; } INIT_COMPLETION(send_complete); ret=hisi_mbox_msg_send_async(mbox,tx_task); if(ret) { hwlog_err("hisi_mbox_msg_send_async return %d.\n", ret); if (tx_task->tx_buffer) kfree((void *)tx_task->tx_buffer); tx_task->tx_buffer = NULL; hisi_mbox_task_free(&tx_task); return -1; } wait_for_completion(&send_complete); if ((-ETIMEOUT) == tx_task->tx_error) { hwlog_err("send failed timeout\n"); if(!dsm_client_ocuppy(shb_dclient)){ dsm_client_record(shb_dclient, "IOM3RSTSTAT: 0x%x\n", read_reg32(IOM3RSTSTAT_ADDR)); dsm_client_record(shb_dclient, "PERRSTSTAT4: 0x%x\n", read_reg32(PERRSTSTAT4_ADDR)); dsm_client_record(shb_dclient, "PERSTAT5: 0x%x\n", read_reg32(PERSTAT5_ADDR)); dsm_client_record(shb_dclient, "IOM3CLKEN: 0x%x\n", read_reg32(IOM3CLKEN_ADDR)); dsm_client_notify(shb_dclient, DSM_SHB_ERR_IPC_TIMEOUT); } ret = -1; }else{ hwlog_debug("send success\n"); ret = 0; } kfree((void *)tx_task->tx_buffer); tx_task->tx_buffer = NULL; hisi_mbox_task_free(&tx_task); return ret; }
static int tps65132_probe(struct i2c_client *client, const struct i2c_device_id *id) { int retval = 0; int nRet = 0; int vpos_target = 0; int vneg_target = 0; struct device_node *np = NULL; struct tps65132_device_info *di = NULL; np = of_find_compatible_node(NULL, NULL, DTS_COMP_TPS65132); if (!np) { pr_err("NOT FOUND device node %s!\n", DTS_COMP_TPS65132); retval = -ENODEV; goto failed_1; } gpio_vsp_enable = of_get_named_gpio(np, "gpios", 0); gpio_vsn_enable = of_get_named_gpio(np, "gpios", 1); if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { pr_err("[%s,%d]: need I2C_FUNC_I2C\n",__FUNCTION__,__LINE__); retval = -ENODEV; goto failed_1; } di = kzalloc(sizeof(*di), GFP_KERNEL); if (!di) { dev_err(&client->dev, "failed to allocate device info data\n"); retval = -ENOMEM; goto failed_1; } i2c_set_clientdata(client, di); di->dev = &client->dev; di->client = client; if (!fastboot_display_enable) { tps65132_start_setting(); } tps65132_get_target_voltage(&vpos_target, &vneg_target); nRet = tps65132_reg_inited(di->client, (u8)vpos_target, (u8)vneg_target); if (nRet > 0) { pr_info("tps65132 inited needn't reset value\n"); } else if (nRet < 0) { pr_err("tps65132 I2C read fail\n"); retval = -ENODEV; #if defined (CONFIG_HUAWEI_DSM) if (!dsm_client_ocuppy(lcd_dclient)) { dsm_client_record(lcd_dclient, "tps65132 I2C read fail\n"); dsm_client_notify(lcd_dclient, DSM_LCD_POWER_STATUS_ERROR_NO); } #endif goto failed_2; } else { nRet = tps65132_reg_init(di->client, (u8)vpos_target, (u8)vneg_target); if (nRet) { pr_err("tps65132_reg_init failed\n"); retval = -ENODEV; #if defined (CONFIG_HUAWEI_DSM) if (!dsm_client_ocuppy(lcd_dclient)) { dsm_client_record(lcd_dclient, "tps65132_reg_init failed\n"); dsm_client_notify(lcd_dclient, DSM_LCD_POWER_STATUS_ERROR_NO); } #endif goto failed_2; } pr_info("tps65132 inited succeed\n"); } #ifdef CONFIG_HUAWEI_HW_DEV_DCT /* detect current device successful, set the flag as present */ set_hw_dev_flag(DEV_I2C_DC_DC); #endif failed_2: if (!fastboot_display_enable) { tps65132_finish_setting(); } if (di) kfree(di); failed_1: return retval; }
int bq_get_error_info(struct bq_bci_device_info *di) { static int pre_bat_err =0, archive_state = 1; static unsigned long timeout_jiffies = 0; static int first_in = 1; static int pre_uf_capacity = 0; static int pre_capacity = 0; static int capacity_stay_count = 0; static int online_delay_count = 0; int bat_uf_capacity = 0; int curr_by_coultype = 1; int dsm_bci_battery_err_offset = 0; if (COUL_HISI_HI6421V300 == hisi_coulometer_type()) curr_by_coultype = -1; di->bat_err = 0; if(!is_hisi_battery_exist()) di->bat_err |= ERROR_BATT_NOT_EXIST; if(hisi_battery_temperature()< BQ2419x_COLD_BATTERY_THRESHOLD || hisi_battery_temperature()>= BQ2419x_HOT_BATTERY_THRESHOLD) { if(di->charge_status == POWER_SUPPLY_STATUS_NOT_CHARGING) di->bat_err |= ERROR_BATT_TEMP_STOP; if(di->charge_status == POWER_SUPPLY_STATUS_CHARGING) di->bat_err |= ERROR_BATT_TEMP_CHARGE; di->bat_err |= ERROR_BATT_TEMP_OUT; dev_info(di->dev,"batt temp = %d\n ", hisi_battery_temperature()); } if(di->charge_status == POWER_SUPPLY_STATUS_NOT_CHARGING && !(bq2419x_get_factory_flag())) { if(di->power_supply_status == POWER_SUPPLY_HEALTH_OVERVOLTAGE) di->bat_err |= ERROR_VBUS_OVERVOLTAGE; if(hisi_battery_voltage() > BATT_OVERVOLTAGE_THRES) di->bat_err |= ERROR_BATT_OVERVOLTAGE; di->bat_err |= ERROR_BATT_NOT_CHARGING; } else { if(hisi_battery_voltage() > BATT_OVERVOLTAGE_THRES || hisi_battery_voltage() < BATT_LOWVOLTAGE_THRES) { di->bat_err |= ERROR_BATT_VOLTAGE; dev_info(di->dev,"batt volt = %d\n ", hisi_battery_voltage()); } } if(di->chargedone_stat && hisi_battery_capacity() <= CHG_CANT_FULL_THRESHOLD){ di->bat_err |= ERROR_PRE_CHARGEDONE; dev_info(di->dev,"batt capacity = %d\n ", hisi_battery_capacity()); } if(di->charge_status == POWER_SUPPLY_STATUS_CHARGING && hisi_battery_current_avg() <= 50 && hisi_battery_current_avg() >= 10 && (curr_by_coultype*hisi_battery_current()) <= 50 && (curr_by_coultype*hisi_battery_current()) >= 10 && di->capacity == 100) { di->bat_err |= ERROR_NO_CHARGEDONE; dev_info(di->dev,"batt curr = %d batt curr_avg = %d\n ", (curr_by_coultype*hisi_battery_current()), hisi_battery_current_avg()); } if((!di->usb_online) && (!di->ac_online)){ if((-hisi_battery_current() > 0) && (online_delay_count++ == 1)){ di->bat_err |= ERROR_BAD_CURR_SENSOR; online_delay_count = 0; dev_info(di->dev,"batt curr = %d\n ", (-hisi_battery_current())); } } else { online_delay_count = 0; } bat_uf_capacity = hisi_battery_unfiltered_capacity(); if(first_in){ pre_uf_capacity = bat_uf_capacity; pre_capacity = di->capacity; first_in = 0; } else { if (abs(pre_uf_capacity - bat_uf_capacity) >= 3) { if (100 != bat_uf_capacity) { di->bat_err |= ERROR_UFCAPCITY_DEBOUNCE_OTHER; } else { if (abs(pre_uf_capacity - bat_uf_capacity) > 10) di->bat_err |= ERROR_UFCAPCITY_DEBOUNCE_100; } hisi_hi6421v300_print_cc_reg(2); //debug } pre_uf_capacity = bat_uf_capacity; } if(di->charge_status == POWER_SUPPLY_STATUS_NOT_CHARGING || di->charge_status == POWER_SUPPLY_STATUS_DISCHARGING) { if(pre_capacity > 0 && di->capacity != pre_capacity) { if(di->capacity > REACH_FULL_RESAMPLE_THRESHOLD) { if(capacity_stay_count <= 2) { di->bat_err |= ERROR_CAPACITY_CHANGE_FAST; capacity_stay_count = 0; } } else if (di->capacity < REACH_EMPTY_RESAMPLE_THRESHOLD) { if(capacity_stay_count <= 12) { di->bat_err |= ERROR_CAPACITY_CHANGE_FAST; capacity_stay_count = 0; } } else { if(capacity_stay_count <= 6) { di->bat_err |= ERROR_CAPACITY_CHANGE_FAST; capacity_stay_count = 0; } } capacity_stay_count = 0; } else { capacity_stay_count++; } } pre_capacity = di->capacity; if (is_hisi_hi6421v300_fcc_debounce()) { di->bat_err |= ERROR_FCC_DEBOUNCE; } if(di->bat_err != pre_bat_err && archive_state == 1){ timeout_jiffies = jiffies + msecs_to_jiffies(LOG_ARCH_DELAY_TIME); archive_state = 0; dev_info(di->dev,"(%s) BATT ERR = %x\n", hisi_battery_brand(), di->bat_err); } pre_bat_err = di->bat_err; if(time_is_before_jiffies(timeout_jiffies) && di->bat_err != 0x0 && archive_state == 0){ //bq_log_exception_archive(di->bat_err); if (dsm_client_ocuppy(battery_dclient)) { dsm_client_record(battery_dclient, "battery error = %x.\n", di->bat_err); dsm_bci_battery_err_offset = get_bit(di->bat_err); dsm_client_notify(battery_dclient, DSM_BATTERY_ERROR_NO + dsm_bci_battery_err_offset); } archive_state = 1; } return di->bat_err; }
static irqreturn_t hisi_powerkey_handler(int irq, void *data) { struct hisi_powerkey_info *info = (struct hisi_powerkey_info *)data; wake_lock_timeout(&info->pwr_wake_lock, HZ); if (info->irq[0] == irq) { pr_info("[%s]response press interrupt!\n", __FUNCTION__); power_key_ps=true; #if defined (CONFIG_HUAWEI_DSM) powerkey_press_count++; if ((jiffies - powerkey_last_press_time) < msecs_to_jiffies(PRESS_KEY_INTERVAL)) { if (!dsm_client_ocuppy(power_key_dclient)) { dsm_client_record(power_key_dclient, "power key trigger on the abnormal style.\n"); dsm_client_notify(power_key_dclient, DSM_POWER_KEY_ERROR_NO); } } powerkey_last_press_time = jiffies; #endif /* modify by songliangliang for dmd_log> */ #if defined (CONFIG_FB_HI6220_CLCD) lcd_dcm_pwr_add_timer(); #endif input_report_key(info->idev, KEY_POWER, POWER_KEY_PRESS); input_sync(info->idev); } else if (info->irq[1] == irq) { pr_info("[%s]response release interrupt!\n", __FUNCTION__); #if defined(CONFIG_HISILICON_PLATFORM_MAINTAIN) #ifdef CONFIG_ARCH_HI6XXX if (check_himntn(HIMNTN_PRESS_KEY_TO_FASTBOOT)) { if ((VOL_UPDOWN_PRESS & gpio_key_vol_updown_press_get()) == VOL_UPDOWN_PRESS) { gpio_key_vol_updown_press_set_zero(); if(is_gpio_key_vol_updown_pressed()) { systemError(0x25, EXCH_S_LOGDUMP, 0,0,0); } } } #elif defined(CONFIG_HISI_3635) if(is_fastboot_dumpmem_enable()) if ((VOL_UPDOWN_PRESS & gpio_key_vol_updown_press_get()) == VOL_UPDOWN_PRESS) { gpio_key_vol_updown_press_set_zero(); if(is_gpio_key_vol_updown_pressed()) { pr_info("[%s]Powerkey+VolUp_key+VolDn_key\n", __FUNCTION__); #ifdef CONFIG_HISI_REBOOT_TYPE set_watchdog_resetflag(); #endif emergency_restart(); } } #endif #endif input_report_key(info->idev, KEY_POWER, POWER_KEY_RELEASE); input_sync(info->idev); } else if (info->irq[2] == irq) { pr_info("[%s]response long press 1s interrupt!\n", __FUNCTION__); input_report_key(info->idev, KEY_POWER, POWER_KEY_PRESS); input_sync(info->idev); } else if (irq == info->irq[3]) { pr_info("[%s]response long press 8s interrupt!\n", __FUNCTION__); } else if (irq == info->irq[4]) { pr_info("[%s]response long press 10s interrupt!\n", __FUNCTION__); } else { pr_err("[%s]invalid irq %d!\n", __FUNCTION__, irq); } return IRQ_HANDLED; }