/*! 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; }
/*! * @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"); }
int power_ic_periph_is_usb_cable_connected (void) { return power_ic_event_sense_read (USB_CABLE_ATTACH); }