Пример #1
0
 /*!
 * This function is called by power IC clients to turn the two WLAN's power supplies LOGIC and RF on or off.
 *
 * @param        on         Turns WLAN on or off (POWER_IC_PERIPH_ON or POWER_IC_PERIPH_OFF)
 *
 * @return       This function returns 0 if successful.
 */
int power_ic_periph_set_wlan_on(int on)
{
    
    int val;
    
    /* Any input above zero is on.. */
    /* It is required that the LOGIC be powered-up before RF section when turning ON and shut down 
    after the RF section when shutting off */     
    if(on > 0)
    {
    
        val = power_ic_set_reg_value(WLAN_LOGIC_ONOFF_REG, WLAN_LOGIC_ONOFF_INDEX, 1,
                                 WLAN_LOGIC_ONOFF_NUM_BITS);

        val |= power_ic_set_reg_value(WLAN_RF_ONOFF_REG, WLAN_RF_ONOFF_INDEX, 1,
                                     WLAN_RF_ONOFF_NUM_BITS);
    }
    else
    {
        val = power_ic_set_reg_value(WLAN_RF_ONOFF_REG, WLAN_RF_ONOFF_INDEX, 0,
                                     WLAN_RF_ONOFF_NUM_BITS);

        val |= power_ic_set_reg_value(WLAN_LOGIC_ONOFF_REG, WLAN_LOGIC_ONOFF_INDEX, 0,
                                 WLAN_LOGIC_ONOFF_NUM_BITS);
    }
    
     
    return val;
    
}
Пример #2
0
/*!
 * @brief emu_glue_set_transceiver_params
 *
 * Thsi function set the EMU trasnceiver parameteres.
 *
 * @param trans_params
 *
 */
void emu_glue_set_transceiver_params(POWER_IC_EMU_GLUE_TRANSCEIVER_PARAMS_T trans_params)
{
    int vusb_settings  = (trans_params.vusb_input_source | \
                         ((trans_params.vusb_voltage == 3300 ? 1 : 0) << 2) | \
                         ((trans_params.vusb_en == 0 ? 0 : 1) << 3));
        
    /* Set VUSB settings in Charger USB 1 register */
    power_ic_set_reg_value(POWER_IC_REG_ATLAS_CHARGE_USB_1, 0, vusb_settings, 4);
    
    /* Set the state of the transceiver in USB 0 regsiter */
    power_ic_set_reg_value(POWER_IC_REG_ATLAS_USB_0, 12, (trans_params.xcvr_en == 0 ? 0 : 1), 1);   
}
Пример #3
0
 /*!
 * This function is called by power IC clients to when the WLAN is going to be placed into a 
 * low power state the LOGIC section is turned on, in case it is off, and the RF is turned off.
 *
 * @return       This function returns 0 if successful.
 */
int power_ic_periph_set_wlan_low_power_state_on(void)
{
    int val;

    val = power_ic_set_reg_value(WLAN_LOGIC_ONOFF_REG, WLAN_LOGIC_ONOFF_INDEX, 1,
                                 WLAN_LOGIC_ONOFF_NUM_BITS);
    
    val |= power_ic_set_reg_value(WLAN_RF_ONOFF_REG, WLAN_RF_ONOFF_INDEX, 0,
                                     WLAN_RF_ONOFF_NUM_BITS);
    
    return val;
    
}
Пример #4
0
/*!
 * This function is called by power IC clients to change the SIM voltage values.
 *
 * @param        sim_card_num   Used later for different types of SIM
 * @param        volt           Changes SIM voltage to 1.8 or 3.0 volts
 *
 * @return       This function returns 0 if successful.
 *
 * @note         If volt is 0, then SIM voltage will be 1.8 volts.  If volt is 1, then SIM voltage 
 *               is 3.0 volts
 */
int power_ic_periph_set_sim_voltage(unsigned char sim_card_num, POWER_IC_SIM_VOLTAGE_T volt)
{
    /* If 0, then set VSIM, otherwise set VESIM */
    if(sim_card_num == 0)
    {
        return (power_ic_set_reg_value(SIM_REG_SET_0_REG, SIM_REG_SET_0_VSIM_INDEX, volt,
                                 SIM_REG_SET_0_NUM_BITS));
    }
    else
    {  
        return (power_ic_set_reg_value(SIM_REG_SET_0_REG, SIM_REG_SET_0_VESIM_INDEX, volt,
                                 SIM_REG_SET_0_NUM_BITS));
    }      
}
Пример #5
0
int power_ic_rtc_set_time(struct timeval *power_ic_time)
{
    int err = 0;
    if (power_ic_time->tv_usec > 500000)
    {
      power_ic_time->tv_sec += 1;
    }
    err = power_ic_set_reg_value(RTC_TOD_REG,POWER_IC_TIME_REG_BIT,
				 power_ic_time->tv_sec % POWER_IC_NUM_SEC_PER_DAY,  POWER_IC_TOD_NUM_BITS );
    err = power_ic_set_reg_value(RTC_DAY_REG,POWER_IC_TIME_REG_BIT,
				 power_ic_time->tv_sec / POWER_IC_NUM_SEC_PER_DAY, POWER_IC_DAY_NUM_BITS);
    tracemsg(_k_d("Set RTC Time \n RTC_TOD = %d \n RTC_DAY = %d \n tv_sec = %d Error = %d \n"),((int)power_ic_time->tv_sec % POWER_IC_NUM_SEC_PER_DAY) , 
	     ((int)power_ic_time->tv_sec / POWER_IC_NUM_SEC_PER_DAY),((int)power_ic_time->tv_sec), err );
    return err;
}
Пример #6
0
/*!
 * @brief emu_glue_read_sense
 *
 * This function returns the EMU state information.  
 * The parameter to the function indicates if the interrupt status flags should be cleared 
 * after reading the value of the sense bits.  If the parameter is non zero, the interrupt 
 * status flags for the VBUS, ID, and SE1 interrupts should be cleared.  
 * If zero, the interrupt status flags should be left unchanged
 *
 * @param clear_int_flags see description
 *
 * @return unsigned long int representing the current state of the EMU state information
 */
unsigned long emu_glue_read_sense(unsigned long clear_int_flags)
{
    int value_read;
    unsigned long emu_glue_sense_read = 0;
   
    /* Read Atlas Sense 0 register bits */
    power_ic_get_reg_value(POWER_IC_REG_ATLAS_INT_SENSE_0, 0,
                           &(value_read), 24);

    /* Get all EMU sense bit states from the power ic */
    emu_glue_sense_read =  value_read & (EMU_SENSE_CHGCURR | EMU_SENSE_DPLUS | EMU_SENSE_DMINUS | \
                                         EMU_SENSE_VBUS_4V4 | EMU_SENSE_VBUS_2V0 | EMU_SENSE_VBUS_0V8 | \
                                         EMU_SENSE_ID_FLOAT | EMU_SENSE_ID_GROUND | EMU_SENSE_SE1 );

    /* OR in the state of the cradle detect line */
    emu_glue_sense_read |= (EMU_GET_CRADLE_DETECT() ? EMU_SENSE_CRADLE_DETECT : 0);
    
    /* Get accessory power setting */
    power_ic_get_reg_value(POWER_IC_REG_ATLAS_CHARGE_USB_1, 5,  &(value_read), 1);
    emu_glue_sense_read |=  value_read;

    /* Clear interrupt flags if requested */
    if (clear_int_flags != 0)
    {
        power_ic_set_reg_value(POWER_IC_REG_ATLAS_INT_STAT_0, 0,
                               CLEAR_ACCY_INTERRUPT_1, 24);
    }
    
    return emu_glue_sense_read;
}
Пример #7
0
int power_ic_rtc_set_time_alarm(struct timeval *power_ic_time)
{

    int err = 0;
    
    if (power_ic_time->tv_usec > 500000)
    {
       power_ic_time->tv_sec += 1;
    }
    err = power_ic_set_reg_value(RTC_TODA_REG,POWER_IC_TIME_REG_BIT,
				 power_ic_time->tv_sec % POWER_IC_NUM_SEC_PER_DAY,  POWER_IC_TOD_NUM_BITS );
    err = power_ic_set_reg_value(RTC_DAYA_REG,POWER_IC_TIME_REG_BIT,
				 power_ic_time->tv_sec / POWER_IC_NUM_SEC_PER_DAY, POWER_IC_DAY_NUM_BITS);

    err |= power_ic_event_unmask(RTC_TODA_EVENT);
    
    tracemsg(_k_d("Set RTC Alarm Time \nRTC_TODA = %d \n RTC_DAYA = %d \n tv_sec = %d Error = %d \n"),(int)power_ic_time->tv_sec % POWER_IC_NUM_SEC_PER_DAY , 
	     (int)power_ic_time->tv_sec / POWER_IC_NUM_SEC_PER_DAY,(int)power_ic_time->tv_sec, err );
    return err;
}
Пример #8
0
/*!
 * This function is called by power IC clients to set the vibrator supply level.
 *
 * @param        level      The level that the vibrator should be set to, from 0 (low) to 3 (high).
 *
 * @return       This function returns 0 if successful.
 */
int power_ic_periph_set_vibrator_level(int level)
{
    /* Don't allow any attempts to set any other value than on or off. */
    if((level < 0) || (level >= (1 << VIBRATOR_LEVEL_NUM_BITS) ))
    {
        return -EINVAL;
    }
    
    return power_ic_set_reg_value(VIBRATOR_LEVEL_REG, VIBRATOR_LEVEL_INDEX, level,
                                  VIBRATOR_LEVEL_NUM_BITS);
}
Пример #9
0
/*!
 * This function is called by power IC clients turn the camera on or off.
 *
 * @param        on         Turns the camera on or off (POWER_IC_PERIPH_ON or POWER_IC_PERIPH_OFF)
 *
 * @return       This function returns 0 if successful.
 *
 * @note         This function is only used for Atlas.  PCAP camera is powered off of AP_IO_REG which is always on.
 */
int power_ic_periph_set_camera_on(int on)
{
    /* Any input above zero is on.. */
    if(on > 0)
    {
        on = 1;
    }
    else
    {
        on = 0;
    }
    
    return power_ic_set_reg_value(CAMERA_ONOFF_REG, CAMERA_ONOFF_INDEX, on,
                                  CAMERA_ONOFF_NUM_BITS);
}
Пример #10
0
/*!
 * This function is called by power IC clients turn the vibrator on or off.
 *
 * @param        on         Turns the vibrator on or off (POWER_IC_PERIPH_ON or POWER_IC_PERIPH_OFF)
 *
 * @return       This function returns 0 if successful.
 */
int power_ic_periph_set_vibrator_on(int on)
{
    /* Any input above zero is on.. */
    if(on > 0)
    {
        on = 1;
    }
    else
    {
        on = 0;
    }
    
    return power_ic_set_reg_value(VIBRATOR_ONOFF_REG, VIBRATOR_ONOFF_INDEX, on,
                                  VIBRATOR_ONOFF_NUM_BITS);
}
Пример #11
0
 /*!
 * This function is called by power IC clients to turn Bluetooth's power supply on or off.
 *
 * @param        on         Turns Bluetooth on or off (POWER_IC_PERIPH_ON or POWER_IC_PERIPH_OFF)
 *
 * @return       This function returns 0 if successful.
 */
int power_ic_periph_set_bluetooth_on(int on)
{
    /* Any input above zero is on.. */
    if(on > 0)
    {
        on = 1;
    }
    else
    {
        on = 0;
    }
    
    return power_ic_set_reg_value(BLUETOOTH_ONOFF_REG, BLUETOOTH_ONOFF_INDEX, on,
                                  BLUETOOTH_ONOFF_NUM_BITS);
}
Пример #12
0
/*!
 * This function is called by power IC clients to turn the flash card power supply on or off.
 *
 * @param        on         Turns the flash card on or off (POWER_IC_PERIPH_ON or POWER_IC_PERIPH_OFF)
 *
 * @return       This function returns 0 if successful.
 */
int power_ic_periph_set_flash_card_on(int on)
{
    
    /* Any input above zero is on.. */
    if( on > 0)
    {
        on = 1;
    }
    else
    {
        on = 0;
    }
        
    return power_ic_set_reg_value(FLASH_CARD_ONOFF_REG, FLASH_CARD_ONOFF_INDEX, on,
                                    FLASH_CARD_ONOFF_NUM_BITS);
  
}
Пример #13
0
static int emu_proc_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
{
    unsigned int ret_val = 0;
    
    POWER_IC_EMU_GLUE_READ_SENSE_T read_sense; 
    POWER_IC_EMU_GLUE_TRANSCEIVER_PARAMS_T trans_params;
    POWER_IC_FET_CONTROL_T fet_ctrl;

    /* prev lockout status */
    static bool prev_emu_hw_lockout_state = false;

    /* what devices were connected before lockout */
    static MOTO_ACCY_MASK_T connected_device_before_lock = 0;
    MOTO_ACCY_MASK_T connected_device;
    
    /* Get the actual command from the ioctl request. */
    unsigned int cmd_num = _IOC_NR(cmd);
    
    if ((cmd_num >= POWER_IC_IOC_CMD_EMU_GLUE_BASE) && (cmd_num <= POWER_IC_IOC_CMD_EMU_GLUE_LAST_CMD))
    { 
        tracemsg(_k_d("EMU GLUE control ioctl(), request 0x%X (cmd 0x%X)"),(int) cmd, _IOC_NR(cmd));

        /* Handle the request. */
        switch(cmd)
        {
            case POWER_IC_IOCTL_CMD_EMU_GLUE_READ_SENSE:
                /* Fetch the data passed from user space. */
                if(copy_from_user((void *)&read_sense, (void *)arg, sizeof(read_sense)) != 0)
                {
                    tracemsg(_k_d("error copying data from user space."));
                    ret_val = -EFAULT;
                }  
                else
                {
                    /* Read the sense and clear the interrupt if requested */
                    read_sense.sense = emu_glue_read_sense(read_sense.clear_int_flags);

                    /* Only the sense value read needs to be sent back to the caller. */
                    if(put_user(read_sense.sense,&(((POWER_IC_EMU_GLUE_READ_SENSE_T *)arg)->sense)) != 0)
                    {
                        tracemsg(_k_d("error copying read bits to user space."));
                        ret_val = -EFAULT;
                    }
                }
                break;
                
            case POWER_IC_IOCTL_CMD_EMU_GLUE_LOCKOUT_CHANGES:
                power_ic_emu_hw_locked = (bool)(arg == 0 ? 0 : 1);
                 
                if (power_ic_emu_hw_locked)
                {
                    /* Make sure the hardware is not already locked */
                    if (prev_emu_hw_lockout_state == false)
                    {
                        /* If the EMU hardware needs to be locked, keep track of
                           the currently connected accessory */
                        connected_device_before_lock = moto_accy_get_all_devices();
                    }
                }
                else
                {                   
                    /* If the EMU hardware was previously locked but is now unlocked the accessory may need
                       to be reconfigured. */
                    if (prev_emu_hw_lockout_state == true)
                    {
                        connected_device = moto_accy_get_all_devices();
                        
                        if (connected_device_before_lock == connected_device)
                        {
                            if ((ACCY_BITMASK_ISSET(connected_device, MOTO_ACCY_TYPE_HEADSET_EMU_MONO)) ||
                                (ACCY_BITMASK_ISSET(connected_device, MOTO_ACCY_TYPE_HEADSET_EMU_STEREO)))
                            {
                                audio_config.id_pull_down = 0;
                                audio_config.conn_mode = 0;
                                emu_util_set_emu_headset_mode(audio_config.headset_mode);
                            }
                            else if ((ACCY_BITMASK_ISSET(connected_device, MOTO_ACCY_TYPE_CARKIT_MID)) ||
                                     (ACCY_BITMASK_ISSET(connected_device, MOTO_ACCY_TYPE_CARKIT_FAST)))
                            {
                                audio_config.headset_mode = MOTO_ACCY_HEADSET_MODE_NONE;
                                EMU_SET_EMU_CONN_MODE(audio_config.conn_mode);
                                EMU_SET_ID_PULL_DOWN(audio_config.id_pull_down);
                            }
                            else
                            {
                                audio_config.headset_mode = MOTO_ACCY_HEADSET_MODE_NONE;
                                audio_config.conn_mode = POWER_IC_EMU_CONN_MODE_USB;
                                audio_config.id_pull_down = 0;  
                            }
                        }
                        else
                        {
                            audio_config.headset_mode = MOTO_ACCY_HEADSET_MODE_NONE;
                            audio_config.conn_mode = POWER_IC_EMU_CONN_MODE_USB;
                            audio_config.id_pull_down = 0;  
                        }
                    }
                }

                prev_emu_hw_lockout_state = power_ic_emu_hw_locked;
                break;

            case POWER_IC_IOCTL_CMD_EMU_GLUE_GET_FET_CONTROL:
                if ((power_ic_get_reg_value(POWER_IC_REG_ATLAS_CHARGER_0, 10, (int *)&(fet_ctrl), 2)) != 0)
                {
                    ret_val = -EIO;
                }
                /* Only the sense value read needs to be sent back to the caller. */
                else if(put_user(fet_ctrl, (((int *)arg))) != 0)
                {
                    tracemsg(_k_d("error copying read bits to user space."));
                    ret_val = -EFAULT;
                }
                break;
                   
            case POWER_IC_IOCTL_CMD_EMU_GLUE_SET_FET_CONTROL:
                power_ic_set_reg_value(POWER_IC_REG_ATLAS_CHARGER_0, 10,
                                       arg, 2);
                break;
                
            case POWER_IC_IOCTL_CMD_EMU_GLUE_SET_VBUS_5K_PD:
                power_ic_set_reg_value(POWER_IC_REG_ATLAS_CHARGER_0, 19,
                                       (arg == 0 ? 0 : 1), 1);
                break;
         
            case POWER_IC_IOCTL_CMD_EMU_GLUE_SET_VBUS_70K_PD:
                power_ic_set_reg_value(POWER_IC_REG_ATLAS_USB_0, 6,
                                       (arg == 0 ? 0 : 1), 1);
                               
                break;

            case POWER_IC_IOCTL_CMD_EMU_GLUE_SET_REVERSE_MODE:
                power_ic_set_reg_value(POWER_IC_REG_ATLAS_CHARGE_USB_1, 5,
                                   (arg == 0 ? 0 : 1), 1);
                break;

            case POWER_IC_IOCTL_CMD_EMU_GLUE_SET_ID_PU:
                power_ic_set_reg_value(POWER_IC_REG_ATLAS_USB_0, 22,
                                       (arg == 0 ? 0 : 1), 1);
                break;            
         
            case POWER_IC_IOCTL_CMD_EMU_GLUE_SET_ID_PD:
                 power_ic_set_reg_value(POWER_IC_REG_ATLAS_USB_0, 20,
                                       (arg == 0 ? 0 : 1), 1);
                 break;

            case POWER_IC_IOCTL_CMD_EMU_GLUE_SET_ID_STEREO_PU:
                power_ic_set_reg_value(POWER_IC_REG_ATLAS_CHARGE_USB_1, 8,
                                       (arg == 0 ? 0 : 1), 1);
                break;  

            case POWER_IC_IOCTL_CMD_EMU_GLUE_SET_CONN_MODE:
                power_ic_set_reg_value(POWER_IC_REG_ATLAS_USB_0, 14,
                                       arg, 3);
                break;  

            case POWER_IC_IOCTL_CMD_EMU_GLUE_SET_DPLUS_150K_PU:
                power_ic_set_reg_value(POWER_IC_REG_ATLAS_USB_0, 5,
                                       (arg == 0 ? 0 : 1), 1);            
                break;

            case POWER_IC_IOCTL_CMD_EMU_GLUE_SET_DPLUS_1_5K_PU:
                power_ic_set_reg_value(POWER_IC_REG_ATLAS_USB_0, 2,
                                       (arg == 0 ? 0 : 1), 1); 
                break;
  
            case POWER_IC_IOCTL_CMD_EMU_GLUE_SET_LOW_SPEED_MODE:
                power_ic_set_reg_value(POWER_IC_REG_ATLAS_USB_0, 0,
                                       (arg == 0 ? 0 : 1), 1);    
                break;

            case POWER_IC_IOCTL_CMD_EMU_GLUE_SET_USB_SUSPEND:
                power_ic_set_reg_value(POWER_IC_REG_ATLAS_USB_0, 1,
                                       (arg == 0 ? 0 : 1), 1);    
                break;

            case POWER_IC_IOCTL_CMD_EMU_GLUE_SET_TRANSCEIVER_PARAMS:
                /* Fetch the data passed from user space. */
                if(copy_from_user((void *)&trans_params, (void *)arg, sizeof(trans_params)) != 0)
                {
                    tracemsg(_k_d("error copying data from user space."));
                    ret_val = -EFAULT;
                }
                else
                {
                    /* Call local function */
                    emu_glue_set_transceiver_params(trans_params);
                }
                break;

            case POWER_IC_IOCTL_CMD_EMU_GLUE_SET_ID_INT_MASK:
                power_ic_set_reg_value(POWER_IC_REG_ATLAS_INT_MASK_0, 19,
                                       arg, 1);    
                break;  

            case POWER_IC_IOCTL_CMD_EMU_GLUE_SET_VBUS_INT_MASK:
                power_ic_set_reg_value(POWER_IC_REG_ATLAS_INT_MASK_0, 16,
                                       arg, 1);    
                break; 

            case POWER_IC_IOCTL_CMD_EMU_GLUE_SET_SE1_INT_MASK:
                power_ic_set_reg_value(POWER_IC_REG_ATLAS_INT_MASK_0, 21,
                                       arg, 1);    
                break;

            default: /* This shouldn't be able to happen, but just in case... */
                tracemsg(_k_d("=> 0x%X unsupported emu proc ioctl command"), (int) cmd);
                ret_val = -ENOTTY;
                break;
        }
    }
    else /* The driver doesn't support this request. */
    {
        tracemsg(_k_d("0x%X unsupported ioctl command"), (int) cmd);
        ret_val = -ENOTTY;
    }
        
    return ret_val;
}