static kal_int32 fgauge_set_low_battery_interrupt(void *data) { #if defined(CONFIG_MTK_HAFG_20) kal_uint32 voltage=*(kal_uint32*)(data); kal_uint32 rawdata; static int eint_init=0; if(eint_init==0) { pmic_register_interrupt_callback(2,fg_bat_l_int_handler); eint_init=1; } is_lbat_int=KAL_FALSE; pmic_turn_on_clock(KAL_TRUE); rawdata=voltage*4096/1800/4; bm_print(BM_LOG_CRTI, "[fgauge_set_low_battery_interrupt] Battery voltage %d %d\n",rawdata,voltage); // 0:set interrupt pmic_set_register_value(PMIC_RG_INT_EN_BAT_L,1); // 1.setup min voltage threshold 3.4v pmic_set_register_value(PMIC_RG_LBAT_VOLT_MIN,rawdata); // 2.setup detection period pmic_set_register_value(PMIC_RG_LBAT_DET_PRD_19_16,0x0); pmic_set_register_value(PMIC_RG_LBAT_DET_PRD_15_0,0x12f); // 3.setup max/min debounce time pmic_set_register_value(PMIC_RG_LBAT_DEBT_MIN,0x5a);//15mins // 4.turn on IRQ pmic_set_register_value(PMIC_RG_LBAT_IRQ_EN_MIN,0x1); // 5. turn on LowBattery Detection pmic_set_register_value(PMIC_RG_LBAT_EN_MIN,1); #endif return STATUS_OK; }
static int rtc_pdrv_probe(struct platform_device *pdev) { unsigned long flags; /* only enable LPD interrupt in engineering build */ spin_lock_irqsave(&rtc_lock, flags); hal_rtc_set_lp_irq(); spin_unlock_irqrestore(&rtc_lock, flags); /* register rtc device (/dev/rtc0) */ rtc = rtc_device_register(RTC_NAME, &pdev->dev, &rtc_ops, THIS_MODULE); if (IS_ERR(rtc)) { rtc_xerror("register rtc device failed (%ld)\n", PTR_ERR(rtc)); return PTR_ERR(rtc); } #ifdef PMIC_REGISTER_INTERRUPT_ENABLE pmic_register_interrupt_callback(RTC_INTERRUPT_NUM,rtc_irq_handler); pmic_enable_interrupt(RTC_INTERRUPT_NUM,1,"RTC"); #endif device_init_wakeup(&pdev->dev, 1); return 0; }