/*! mxc_mc13783_id - Do we have Vbus (cable attached?)
 * Return non-zero if Vbus is detected.
 *
 */
int mxc_mc13783_id (struct otg_instance *otg)
{
        int value = power_ic_event_sense_read(POWER_IC_EVENT_ATLAS_ID_GROUND);
        if ( value < 0 ) {
                printk(KERN_INFO"%s: power_ic_event_sense_read() failed\n", __FUNCTION__);
                return 0;
        } 
        return value;
}
/*! mxc_mc13783_vbus - Do we have Vbus (cable attached?)
 * Return non-zero if Vbus is detected.
 *
 */
int mxc_mc13783_vbus (struct otg_instance *otg)
{
	unsigned int reg_value = power_ic_event_sense_read(POWER_IC_EVENT_ATLAS_USB2V0S);

        if (reg_value < 0) {
                printk(KERN_INFO"%s: power_ic_get_sense() failed\n", __FUNCTION__);
                return 0;
        }
        return reg_value; 
}
示例#3
0
/*!
 * @brief Reads overvoltage state.
 *
 * This function reads the charger overvoltage sense bit from the hardware and returns it
 * to the caller.
 *
 * @param        overvoltage       For a successful read, set to zero if no overvoltage detected,
 *                                 greater than 0 if an overvoltage condition has been seen.
 *
 * @return returns 0 if successful.
 *
 * @note At this time, this doesn't seem to do much. The sense bit is not set when a charger
 * overvoltage condition occurs, even when EMU one-chip has already detected a problem and
 * cut the charge current.
 */
int power_ic_charger_get_overvoltage(int * overvoltage)
{
    int error = 0;
    
    *overvoltage = power_ic_event_sense_read(VBUS_OVERVOLTAGE_EVENT);
    
    if(*overvoltage < 0)
    {
        error = *overvoltage;
    }
    
    return error;
}
void mc13783_otg_event_bh (void *arg)
{
        u64 inputs;
        t_sense_bits sense_bits;
        static BOOL force = TRUE;
        static u64 inputs_saved = 0;

// Note: power_ic has USB4V4S labelled as USBI, which is incorrect

	// Get the sense bits, return if any fail to be read. 
	if ( (sense_bits.sense_usb4v4s = power_ic_event_sense_read(POWER_IC_EVENT_ATLAS_USBI)) < 0) {
                printk(KERN_INFO"%s: mc13783_get_sense() usb4v4s failed\n", __FUNCTION__);
		return;
        }       
	if ( (sense_bits.sense_usb2v0s = power_ic_event_sense_read(POWER_IC_EVENT_ATLAS_USB2V0S)) < 0) {
                printk(KERN_INFO"%s: mc13783_get_sense() usb2v0s failed\n", __FUNCTION__);
		return;
        }       
	if ( (sense_bits.sense_usb0v8s = power_ic_event_sense_read(POWER_IC_EVENT_ATLAS_USB0V8S)) < 0) {
                printk(KERN_INFO"%s: mc13783_get_sense() usb0v8s failed\n", __FUNCTION__);
		return;
        }       
	if ( (sense_bits.sense_id_floats = power_ic_event_sense_read(POWER_IC_EVENT_ATLAS_ID_FLOAT)) < 0) {
                printk(KERN_INFO"%s: mc13783_get_sense() id_floats failed\n", __FUNCTION__);
		return;
        }       
	if ( (sense_bits.sense_id_gnds = power_ic_event_sense_read(POWER_IC_EVENT_ATLAS_ID_GROUND)) < 0) {
                printk(KERN_INFO"%s: mc13783_get_sense() id_gnds failed\n", __FUNCTION__);
		return;
        }       
	if ( (sense_bits.sense_se1s = power_ic_event_sense_read(POWER_IC_EVENT_ATLAS_SE1I)) < 0) {
                printk(KERN_INFO"%s: mc13783_get_sense() se1s failed\n", __FUNCTION__);
		return;
        }       

    // Factory cable check meant for USB B device only. If IDGNDS is True 
    // adjust the value of IDGNDS to be False, so the state machine thinks it's a
    // traditional device and not a Dual role device.
#ifdef CONFIG_OTG_USB_PERIPHERAL
    if ( sense_bits.sense_id_gnds ) {
        sense_bits.sense_id_gnds = FALSE;
	    TRACE_MSG0(TCD, "Factory Cable detected and IDGND modified to false"); 
	    // printk("Factory Cable detected and IDGND modified to false\n"); 
    }
#endif

	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_);



	TRACE_MSG4(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(tcd_instance->otg, inputs, TCD, "MC13783 OTG EVENT");
}
示例#5
0
int power_ic_periph_is_usb_cable_connected (void)
{
    return power_ic_event_sense_read (USB_CABLE_ATTACH);
}