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;
}