void pmic_se1i_handler(void) { TRACE_MSG0(REMOVE_TCD, "--"); pmic_otg_wakeup(); #if 0 #if 1 t_sensor_bits sense_bits; if (pmic_get_sensors(&sense_bits)) { printk(KERN_INFO "%s: pmic_get_sensors() failed\n", __FUNCTION__); return; } TRACE_MSG1(REMOVE_TCD, "MC13783 EVENT: se1: %d", sense_bits.sense_se1s); otg_event(tcd_instance->otg, (sense_bits.sense_se1s ? SE1_DET : SE1_DET_), REMOVE_TCD, "MC13783 SE1"); #else otg_event(tcd_instance->otg, (pmic_check_sense(sense_se1s) ? SE1_DET : SE1_DET_), REMOVE_TCD, "MC13783 SE1"); #endif #endif }
void pmic_idi_handler(void) { TRACE_MSG0(REMOVE_TCD, "--"); pmic_otg_wakeup(); #if 0 #if 1 t_sensor_bits sense_bits; if (pmic_get_sensors(&sense_bits)) { printk(KERN_INFO "%s: pmic_get_sensors() failed\n", __FUNCTION__); return; } TRACE_MSG2(REMOVE_TCD, "MC13783 EVENT: IDGNDS: %d IDFLOATS: %d", sense_bits.sense_id_gnds, sense_bits.sense_id_floats); otg_event(tcd_instance->otg, (sense_bits.sense_id_gnds ? ID_GND : ID_GND_) | (sense_bits.sense_id_floats ? ID_FLOAT : ID_FLOAT_), REMOVE_TCD, "MC13783 IDI"); #else otg_event(tcd_instance->otg, (pmic_check_sense(sense_id_gnds) ? ID_GND : ID_GND_) | (pmic_check_sense(sense_id_floats) ? ID_FLOAT : ID_FLOAT_), REMOVE_TCD, "MC13783 IDI"); #endif #endif }
/*! pmic_otg_event_bh - pmic otg event handler * @param data - otg instance */ void pmic_otg_event_bh(void *data) { struct otg_instance *otg = (struct otg_instance *) data; otg_current_t inputs; t_sensor_bits sense_bits; static BOOL force = TRUE; static otg_current_t inputs_saved = 0; if (pmic_get_sensors(&sense_bits)) { printk(KERN_INFO "%s: pmic_get_sensors() failed\n", __FUNCTION__); return; } TRACE_MSG6(REMOVE_TCD, "usb4v4s%c usb2v0s%c usb0v8s:%c id_gnds%c id_floats%c id_se1s%c", sense_bits.sense_usb4v4s ? ' ' : '/', sense_bits.sense_usb2v0s ? ' ' : '/', sense_bits.sense_usb0v8s ? ' ' : '/', sense_bits.sense_id_gnds ? ' ' : '/', sense_bits.sense_id_floats ? ' ' : '/', sense_bits.sense_se1s ? ' ' : '/'); inputs = (sense_bits.sense_usb4v4s ? VBUS_VLD : VBUS_VLD_) | (sense_bits. sense_usb2v0s ? (B_SESS_VLD | A_SESS_VLD) : (B_SESS_VLD_ | A_SESS_VLD_)) | (sense_bits.sense_usb0v8s ? B_SESS_END_ : B_SESS_END) | (sense_bits. sense_id_gnds ? ID_GND : ID_GND_) | (sense_bits.sense_id_floats ? ID_FLOAT : ID_FLOAT_) | (sense_bits. sense_se1s ? SE1_DET : SE1_DET_) | (det_dp_hi ? DP_HIGH : DP_HIGH_) | (det_dm_hi ? DM_HIGH : DM_HIGH_); // printk(KERN_INFO" inputs: %8X\n", inputs); TRACE_MSG4(REMOVE_TCD, "MC13783 EVENT: sense_bits: %8x otg inputs: %8x saved: %x diff: %x", sense_bits.sense_se1s, inputs, inputs_saved, inputs ^ inputs_saved); RETURN_UNLESS(force || (inputs ^ inputs_saved)); inputs_saved = inputs; otg_event(REMOVE_tcd_instance->otg, inputs, REMOVE_TCD, "PMIC OTG EVENT"); // gpio_config_int_en(2, 17, TRUE); // gpio_config_int_en(2, 16, TRUE); // gpio_clear_int (2, 17); // gpio_clear_int (2, 16); }
/*! mxc_pmic_vbus - Do we have Vbus (cable attached?) * Return non-zero if Vbus is detected. * @param otg - otg instance pointer */ int mxc_pmic_vbus(struct otg_instance *otg) { #if 1 t_sensor_bits sense_bits; if (pmic_get_sensors(&sense_bits)) { printk(KERN_INFO "%s: pmic_get_sensors() failed\n", __FUNCTION__); return 0; } return sense_bits.sense_usb2v0s; #else return pmic_check_sense(sense_usb2v0s); #endif }
/*! mxc_pmic_id - Do we have Vbus (cable attached?) * Return non-zero if Vbus is detected. * * @param otg - otg instance */ int mxc_pmic_id(struct otg_instance *otg) { struct tcd_instance *tcd = otg->tcd; #if 1 t_sensor_bits sense_bits; if (pmic_get_sensors(&sense_bits)) { printk(KERN_INFO "%s: pmic_get_sensors() failed\n", __FUNCTION__); return 0; } return sense_bits.sense_id_gnds; #else return pmic_check_sense(sense_id_gnds); #endif }
/*! * Callback function for events, we want on MGN board */ static void callback_chg_detect(void) { #ifdef CONFIG_MXC_HWEVENT t_sensor_bits sensor; struct mxc_hw_event event = { HWE_BAT_CHARGER_PLUG, 0 }; pr_debug("In callback_chg_detect\n"); /* get sensor values */ pmic_get_sensors(&sensor); pr_debug("Callback, charger detect:%d\n", sensor.sense_chgdets); if (sensor.sense_chgdets) event.args = 1; else event.args = 0; /* send hardware event */ hw_event_send(HWE_DEF_PRIORITY, &event); #endif }
static void callback_chg_full(void) { #ifdef CONFIG_MXC_HWEVENT t_sensor_bits sensor; struct mxc_hw_event event = { HWE_BAT_CHARGER_FULL, 0 }; pr_debug("In callback_chg_full\n"); /* disable charge function */ pmic_batt_disable_charger(BATT_MAIN_CHGR); /* get charger sensor */ pmic_get_sensors(&sensor); /* if did not detect the charger */ if (sensor.sense_chgdets) return; /* send hardware event */ hw_event_send(HWE_DEF_PRIORITY, &event); #endif }
/*! * mxc_pmic_usbi_handler() - event handler * * * */ void pmic_usbi_handler(void) { TRACE_MSG0(REMOVE_TCD, "--"); pmic_otg_wakeup(); #if 0 #if 1 t_sensor_bits sense_bits; if (pmic_get_sensors(&sense_bits)) { printk(KERN_INFO "%s: pmic_get_sensors() failed\n", __FUNCTION__); return; } TRACE_MSG3(REMOVE_TCD, "MC13783 EVENT: 4V4S: %d 2V0S: %d 0V8S: %d", sense_bits.sense_usb4v4s, sense_bits.sense_usb2v0s, sense_bits.sense_usb0v8s); otg_event(tcd_instance->otg, (sense_bits.sense_usb4v4s ? VBUS_VLD : VBUS_VLD_) | (sense_bits. sense_usb2v0s ? (B_SESS_VLD | A_SESS_VLD) : (B_SESS_VLD_ | A_SESS_VLD_)) | (sense_bits.sense_usb0v8s ? B_SESS_END : B_SESS_END_), REMOVE_TCD, "MC13783 USBI"); #else otg_event(tcd_instance->otg, (pmic_check_sense(sense_usb4v4s) ? VBUS_VLD : VBUS_VLD_) | (pmic_check_sense(sense_usb4v4s) ? (B_SESS_VLD | A_SESS_VLD) : (B_SESS_VLD_ | A_SESS_VLD_)) | (pmic_check_sense(sense_usb0v8s) ? B_SESS_END : B_SESS_END_), REMOVE_TCD, "MC13783 USBI"); #endif #endif }
/*! * This function implements IOCTL controls on a PMIC Battery device. * * @param inode pointer on the node * @param file pointer on the file * @param cmd the command * @param arg the parameter * @return This function returns 0 if successful. */ static int pmic_battery_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) { t_charger_setting *chgr_setting = NULL; unsigned short c_current; unsigned int bc_info; t_eol_setting *eol_setting; if (_IOC_TYPE(cmd) != 'p') return -ENOTTY; switch (cmd) { case PMIC_BATT_CHARGER_CONTROL: if ((chgr_setting = kmalloc(sizeof(t_charger_setting), GFP_KERNEL)) == NULL) { return -ENOMEM; } if (copy_from_user(chgr_setting, (t_charger_setting *) arg, sizeof(t_charger_setting))) { kfree(chgr_setting); return -EFAULT; } if (chgr_setting->on != false) { CHECK_ERROR_KFREE(pmic_batt_enable_charger (chgr_setting->chgr, chgr_setting->c_voltage, chgr_setting->c_current), (kfree(chgr_setting))); } else { CHECK_ERROR(pmic_batt_disable_charger (chgr_setting->chgr)); } kfree(chgr_setting); break; case PMIC_BATT_SET_CHARGER: if ((chgr_setting = kmalloc(sizeof(t_charger_setting), GFP_KERNEL)) == NULL) { return -ENOMEM; } if (copy_from_user(chgr_setting, (t_charger_setting *) arg, sizeof(t_charger_setting))) { kfree(chgr_setting); return -EFAULT; } CHECK_ERROR_KFREE(pmic_batt_set_charger(chgr_setting->chgr, chgr_setting->c_voltage, chgr_setting-> c_current), (kfree(chgr_setting))); kfree(chgr_setting); break; case PMIC_BATT_GET_CHARGER: if ((chgr_setting = kmalloc(sizeof(t_charger_setting), GFP_KERNEL)) == NULL) { return -ENOMEM; } if (copy_from_user(chgr_setting, (t_charger_setting *) arg, sizeof(t_charger_setting))) { kfree(chgr_setting); return -EFAULT; } CHECK_ERROR_KFREE(pmic_batt_get_charger_setting (chgr_setting->chgr, &chgr_setting->c_voltage, &chgr_setting->c_current), (kfree(chgr_setting))); if (copy_to_user ((t_charger_setting *) arg, chgr_setting, sizeof(t_charger_setting))) { return -EFAULT; } kfree(chgr_setting); break; case PMIC_BATT_GET_CHARGER_SENSOR: { t_sensor_bits sensor; pmic_get_sensors(&sensor); if (copy_to_user ((unsigned int *)arg, &sensor.sense_chgdets, sizeof(unsigned int))) return -EFAULT; break; } case PMIC_BATT_GET_BATTERY_VOLTAGE: CHECK_ERROR(pmic_batt_get_batt_voltage(&c_current)); bc_info = (unsigned int)c_current * 2300 / 1023 + 2400; if (copy_to_user((unsigned int *)arg, &bc_info, sizeof(unsigned int))) return -EFAULT; break; case PMIC_BATT_GET_BATTERY_CURRENT: CHECK_ERROR(pmic_batt_get_batt_current(&c_current)); bc_info = (unsigned int)c_current * 5750 / 1023; if (copy_to_user((unsigned int *)arg, &bc_info, sizeof(unsigned int))) return -EFAULT; break; case PMIC_BATT_GET_BATTERY_TEMPERATURE: CHECK_ERROR(pmic_batt_get_batt_temperature(&c_current)); bc_info = (unsigned int)c_current; if (copy_to_user((unsigned int *)arg, &bc_info, sizeof(unsigned int))) return -EFAULT; break; case PMIC_BATT_GET_CHARGER_VOLTAGE: CHECK_ERROR(pmic_batt_get_charge_voltage(&c_current)); bc_info = (unsigned int)c_current * 23000 / 1023; if (copy_to_user((unsigned int *)arg, &bc_info, sizeof(unsigned int))) return -EFAULT; break; case PMIC_BATT_GET_CHARGER_CURRENT: CHECK_ERROR(pmic_batt_get_charge_current(&c_current)); bc_info = (unsigned int)c_current * 5750 / 1023; if (copy_to_user((unsigned int *)arg, &bc_info, sizeof(unsigned int))) return -EFAULT; break; case PMIC_BATT_EOL_CONTROL: if ((eol_setting = kmalloc(sizeof(t_eol_setting), GFP_KERNEL)) == NULL) { return -ENOMEM; } if (copy_from_user(eol_setting, (t_eol_setting *) arg, sizeof(t_eol_setting))) { kfree(eol_setting); return -EFAULT; } if (eol_setting->enable != false) { CHECK_ERROR_KFREE(pmic_batt_bp_enable_eol (eol_setting->typical), (kfree(chgr_setting))); } else { CHECK_ERROR_KFREE(pmic_batt_disable_eol(), (kfree(chgr_setting))); } kfree(eol_setting); break; case PMIC_BATT_SET_OUT_CONTROL: CHECK_ERROR(pmic_batt_set_out_control((t_control) arg)); break; case PMIC_BATT_SET_THRESHOLD: CHECK_ERROR(pmic_batt_set_threshold((int)arg)); break; case PMIC_BATT_LED_CONTROL: CHECK_ERROR(pmic_batt_led_control((bool) arg)); break; case PMIC_BATT_REV_SUPP_CONTROL: CHECK_ERROR(pmic_batt_set_reverse_supply((bool) arg)); break; case PMIC_BATT_UNREG_CONTROL: CHECK_ERROR(pmic_batt_set_unregulated((bool) arg)); break; default: return -EINVAL; } return 0; }