/* * Copyright 2008-2009 Freescale Semiconductor, Inc. All Rights Reserved. */ /* * The code contained herein is licensed under the GNU General Public * License. You may obtain a copy of the GNU General Public License * Version 2 or later at the following locations: * * http://www.opensource.org/licenses/gpl-license.html * http://www.gnu.org/copyleft/gpl.html */ #include #include #include #include #include #include #include #include #include #include #include #include #include /* * Convenience conversion. * Here atm, maybe there is somewhere better for this. */ #define mV_to_uV(mV) (mV * 1000) #define uV_to_mV(uV) (uV / 1000) #define V_to_uV(V) (mV_to_uV(V * 1000)) #define uV_to_V(uV) (uV_to_mV(uV) / 1000) /*! * @enum regulator_voltage_sw * @brief PMIC regulator SW output voltage. */ enum { SW_0_9V = 0, /*!< 0.900 V */ SW_0_925V, /*!< 0.925 V */ SW_0_95V, /*!< 0.950 V */ SW_0_975V, /*!< 0.975 V */ SW_1V, /*!< 1.000 V */ SW_1_025V, /*!< 1.025 V */ SW_1_05V, /*!< 1.050 V */ SW_1_075V, /*!< 1.075 V */ SW_1_1V, /*!< 1.100 V */ SW_1_125V, /*!< 1.125 V */ SW_1_15V, /*!< 1.150 V */ SW_1_175V, /*!< 1.175 V */ SW_1_2V, /*!< 1.200 V */ SW_1_225V, /*!< 1.225 V */ SW_1_25V, /*!< 1.250 V */ SW_1_275V, /*!< 1.275 V */ SW_1_3V, /*!< 1.300 V */ SW_1_325V, /*!< 1.325 V */ SW_1_35V, /*!< 1.350 V */ SW_1_375V, /*!< 1.375 V */ SW_1_4V, /*!< 1.400 V */ SW_1_425V, /*!< 1.425 V */ SW_1_45V, /*!< 1.450 V */ SW_1_475V, /*!< 1.475 V */ SW_1_5V, /*!< 1.500 V */ SW_1_525V, /*!< 1.525 V */ SW_1_55V, /*!< 1.550 V */ SW_1_575V, /*!< 1.575 V */ SW_1_6V, /*!< 1.600 V */ SW_1_625V, /*!< 1.625 V */ SW_1_65V, /*!< 1.650 V */ SW_1_675V, /*!< 1.675 V */ SW_1_7V, /*!< 1.700 V */ SW_1_8V = 36, /*!< 1.800 V */ SW_1_85V = 40, /*!< 1.850 V */ SW_2V = 44, /*!< 2_000 V */ SW_2_1V = 48, /*!< 2_100 V */ SW_2_2V = 52, /*!< 2_200 V */ } regulator_voltage_sw; /*! * @enum regulator_voltage_violo * @brief PMIC regulator VIOLO output voltage. */ enum { VIOLO_1_2V = 0, /*!< 1.2 V */ VIOLO_1_3V, /*!< 1.3 V */ VIOLO_1_5V, /*!< 1.5 V */ VIOLO_1_8V, /*!< 1.8 V */ } regulator_voltage_violo; /*! * @enum regulator_voltage_vdig * @brief PMIC regulator VDIG output voltage. */ enum { VDIG_1_2V = 0, /*!< 1.2 V */ VDIG_1_3V, /*!< 1.3 V */ VDIG_1_5V, /*!< 1.5 V */ VDIG_1_8V, /*!< 1.8 V */ } regulator_voltage_vdig; /*! * @enum regulator_voltage_vgen * @brief PMIC regulator VGEN output voltage. */ enum { VGEN_1_2V = 0, /*!< 1.2 V */ VGEN_1_3V, /*!< 1.3 V */ VGEN_1_5V, /*!< 1.5 V */ VGEN_1_8V, /*!< 1.8 V */ VGEN_1_1V, /*!< 1.1 V */ VGEN_2V, /*!< 2 V */ VGEN_2_775V, /*!< 2.775 V */ VGEN_2_4V, /*!< 2.4 V */ } regulator_voltage_vgen; /*! * @enum regulator_voltage_vrfdig * @brief PMIC regulator VRFDIG output voltage. */ enum { VRFDIG_1_2V = 0, /*!< 1.2 V */ VRFDIG_1_5V, /*!< 1.5 V */ VRFDIG_1_8V, /*!< 1.8 V */ VRFDIG_1_875V, /*!< 1.875 V */ } regulator_voltage_vrfdig; /*! * @enum regulator_voltage_vrfref * @brief PMIC regulator VRFREF output voltage. */ enum { VRFREF_2_475V = 0, /*!< 2.475 V */ VRFREF_2_6V, /*!< 2.600 V */ VRFREF_2_7V, /*!< 2.700 V */ VRFREF_2_775V, /*!< 2.775 V */ } regulator_voltage_vrfref; /*! * @enum regulator_voltage_vrfcp * @brief PMIC regulator VRFCP output voltage. */ enum { VRFCP_2_7V = 0, /*!< 2.700 V */ VRFCP_2_775V, /*!< 2.775 V */ } regulator_voltage_vrfcp; /*! * @enum regulator_voltage_vsim * @brief PMIC linear regulator VSIM output voltage. */ enum { VSIM_1_8V = 0, /*!< 1.8 V */ VSIM_2_9V, /*!< 2.90 V */ VSIM_3V = 1, /*!< 3 V */ } regulator_voltage_vsim; /*! * @enum regulator_voltage_vesim * @brief PMIC regulator VESIM output voltage. */ enum { VESIM_1_8V = 0, /*!< 1.80 V */ VESIM_2_9V, /*!< 2.90 V */ } regulator_voltage_vesim; /*! * @enum regulator_voltage_vcam * @brief PMIC regulator VCAM output voltage. */ enum { VCAM_1_5V = 0, /*!< 1.50 V */ VCAM_1_8V, /*!< 1.80 V */ VCAM_2_5V, /*!< 2.50 V */ VCAM_2_55V, /*!< 2.55 V */ VCAM_2_6V, /*!< 2.60 V */ VCAM_2_75V, /*!< 2.75 V */ VCAM_2_8V, /*!< 2.80 V */ VCAM_3V, /*!< 3.00 V */ } regulator_voltage_vcam; /*! * @enum regulator_voltage_vvib * @brief PMIC linear regulator V_VIB output voltage. */ enum { VVIB_1_3V = 0, /*!< 1.30 V */ VVIB_1_8V, /*!< 1.80 V */ VVIB_2V, /*!< 2 V */ VVIB_3V, /*!< 3 V */ } regulator_voltage_vvib; /*! * @enum regulator_voltage_vmmc * @brief MC13783 PMIC regulator VMMC output voltage. */ enum { VMMC_1_6V = 0, /*!< 1.60 V */ VMMC_1_8V, /*!< 1.80 V */ VMMC_2V, /*!< 2.00 V */ VMMC_2_6V, /*!< 2.60 V */ VMMC_2_7V, /*!< 2.70 V */ VMMC_2_8V, /*!< 2.80 V */ VMMC_2_9V, /*!< 2.90 V */ VMMC_3V, /*!< 3.00 V */ } regulator_voltage_vmmc; /*! * @enum regulator_voltage_vrf * @brief PMIC regulator VRF output voltage. */ enum { VRF_1_5V = 0, /*!< 1.500 V */ VRF_1_875V, /*!< 1.875 V */ VRF_2_7V, /*!< 2.700 V */ VRF_2_775V, /*!< 2.775 V */ } regulator_voltage_vrf; /*! * @enum regulator_voltage_sw3 * @brief PMIC Switch mode regulator SW3 output voltages. */ enum { SW3_5V = 0, /*!< 5.0 V */ SW3_5_5V = 3, /*!< 5.5 V */ } regulator_voltage_sw3; /*! * The \b TPmicDVSTransitionSpeed enum defines the rate with which the * voltage transition occurs. */ enum { ESysDependent, E25mVEach4us, E25mVEach8us, E25mvEach16us } DVS_transition_speed; /* * Reg Regulator Mode 0 */ #define VAUDIO_EN_LSH 0 #define VAUDIO_EN_WID 1 #define VAUDIO_EN_ENABLE 1 #define VAUDIO_EN_DISABLE 0 #define VIOHI_EN_LSH 3 #define VIOHI_EN_WID 1 #define VIOHI_EN_ENABLE 1 #define VIOHI_EN_DISABLE 0 #define VIOLO_EN_LSH 6 #define VIOLO_EN_WID 1 #define VIOLO_EN_ENABLE 1 #define VIOLO_EN_DISABLE 0 #define VDIG_EN_LSH 9 #define VDIG_EN_WID 1 #define VDIG_EN_ENABLE 1 #define VDIG_EN_DISABLE 0 #define VGEN_EN_LSH 12 #define VGEN_EN_WID 1 #define VGEN_EN_ENABLE 1 #define VGEN_EN_DISABLE 0 #define VRFDIG_EN_LSH 15 #define VRFDIG_EN_WID 1 #define VRFDIG_EN_ENABLE 1 #define VRFDIG_EN_DISABLE 0 #define VRFREF_EN_LSH 18 #define VRFREF_EN_WID 1 #define VRFREF_EN_ENABLE 1 #define VRFREF_EN_DISABLE 0 #define VRFCP_EN_LSH 21 #define VRFCP_EN_WID 1 #define VRFCP_EN_ENABLE 1 #define VRFCP_EN_DISABLE 0 /* * Reg Regulator Mode 1 */ #define VSIM_EN_LSH 0 #define VSIM_EN_WID 1 #define VSIM_EN_ENABLE 1 #define VSIM_EN_DISABLE 0 #define VESIM_EN_LSH 3 #define VESIM_EN_WID 1 #define VESIM_EN_ENABLE 1 #define VESIM_EN_DISABLE 0 #define VCAM_EN_LSH 6 #define VCAM_EN_WID 1 #define VCAM_EN_ENABLE 1 #define VCAM_EN_DISABLE 0 #define VRFBG_EN_LSH 9 #define VRFBG_EN_WID 1 #define VRFBG_EN_ENABLE 1 #define VRFBG_EN_DISABLE 0 #define VVIB_EN_LSH 11 #define VVIB_EN_WID 1 #define VVIB_EN_ENABLE 1 #define VVIB_EN_DISABLE 0 #define VRF1_EN_LSH 12 #define VRF1_EN_WID 1 #define VRF1_EN_ENABLE 1 #define VRF1_EN_DISABLE 0 #define VRF2_EN_LSH 15 #define VRF2_EN_WID 1 #define VRF2_EN_ENABLE 1 #define VRF2_EN_DISABLE 0 #define VMMC1_EN_LSH 18 #define VMMC1_EN_WID 1 #define VMMC1_EN_ENABLE 1 #define VMMC1_EN_DISABLE 0 #define VMMC2_EN_LSH 21 #define VMMC2_EN_WID 1 #define VMMC2_EN_ENABLE 1 #define VMMC2_EN_DISABLE 0 /* * Reg Regulator Setting 0 */ #define VIOLO_LSH 2 #define VIOLO_WID 2 #define VDIG_LSH 4 #define VDIG_WID 2 #define VGEN_LSH 6 #define VGEN_WID 3 #define VRFDIG_LSH 9 #define VRFDIG_WID 2 #define VRFREF_LSH 11 #define VRFREF_WID 2 #define VRFCP_LSH 13 #define VRFCP_WID 1 #define VSIM_LSH 14 #define VSIM_WID 1 #define VESIM_LSH 15 #define VESIM_WID 1 #define VCAM_LSH 16 #define VCAM_WID 3 /* * Reg Regulator Setting 1 */ #define VVIB_LSH 0 #define VVIB_WID 2 #define VRF1_LSH 2 #define VRF1_WID 2 #define VRF2_LSH 4 #define VRF2_WID 2 #define VMMC1_LSH 6 #define VMMC1_WID 3 #define VMMC2_LSH 9 #define VMMC2_WID 3 /* * Reg Switcher 0 */ #define SW1A_LSH 0 #define SW1A_WID 6 #define SW1A_DVS_LSH 6 #define SW1A_DVS_WID 6 #define SW1A_STDBY_LSH 12 #define SW1A_STDBY_WID 6 /* * Reg Switcher 1 */ #define SW1B_LSH 0 #define SW1B_WID 6 #define SW1B_DVS_LSH 6 #define SW1B_DVS_WID 6 #define SW1B_STDBY_LSH 12 #define SW1B_STDBY_WID 6 /* * Reg Switcher 2 */ #define SW2A_LSH 0 #define SW2A_WID 6 #define SW2A_DVS_LSH 6 #define SW2A_DVS_WID 6 #define SW2A_STDBY_LSH 12 #define SW2A_STDBY_WID 6 /* * Reg Switcher 3 */ #define SW2B_LSH 0 #define SW2B_WID 6 #define SW2B_DVS_LSH 6 #define SW2B_DVS_WID 6 #define SW2B_STDBY_LSH 12 #define SW2B_STDBY_WID 6 /* * Reg Switcher 4 */ #define SW1A_MODE_LSH 0 #define SW1A_MODE_WID 2 #define SW1A_STBY_MODE_LSH 2 #define SW1A_STBY_MODE_WID 2 #define SW1A_DVS_SPEED_LSH 6 #define SW1A_DVS_SPEED_WID 2 #define SW1B_MODE_LSH 10 #define SW1B_MODE_WID 2 #define SW1B_STBY_MODE_LSH 12 #define SW1B_STBY_MODE_WID 2 #define SW1B_DVS_SPEED_LSH 14 #define SW1B_DVS_SPEED_WID 2 /* * Reg Switcher 5 */ #define SW2A_MODE_LSH 0 #define SW2A_MODE_WID 2 #define SW2A_STBY_MODE_LSH 2 #define SW2A_STBY_MODE_WID 2 #define SW2A_DVS_SPEED_LSH 6 #define SW2A_DVS_SPEED_WID 2 #define SW2B_MODE_LSH 10 #define SW2B_MODE_WID 2 #define SW2B_STBY_MODE_LSH 12 #define SW2B_STBY_MODE_WID 2 #define SW2B_DVS_SPEED_LSH 14 #define SW2B_DVS_SPEED_WID 2 #define SW3_LSH 18 #define SW3_WID 2 #define SW3_EN_LSH 20 #define SW3_EN_WID 2 #define SW3_EN_ENABLE 1 #define SW3_EN_DISABLE 0 /* * Reg Regulator Misc. */ #define GPO1_EN_LSH 6 #define GPO1_EN_WID 1 #define GPO1_EN_ENABLE 1 #define GPO1_EN_DISABLE 0 #define GPO2_EN_LSH 8 #define GPO2_EN_WID 1 #define GPO2_EN_ENABLE 1 #define GPO2_EN_DISABLE 0 #define GPO3_EN_LSH 10 #define GPO3_EN_WID 1 #define GPO3_EN_ENABLE 1 #define GPO3_EN_DISABLE 0 #define GPO4_EN_LSH 12 #define GPO4_EN_WID 1 #define GPO4_EN_ENABLE 1 #define GPO4_EN_DISABLE 0 /* * Switcher mode configuration */ #define SW_MODE_SYNC_RECT_EN 0 #define SW_MODE_PULSE_NO_SKIP_EN 1 #define SW_MODE_PULSE_SKIP_EN 2 #define SW_MODE_LOW_POWER_EN 3 #define dvs_speed E25mvEach16us static int mc13783_vaudio_enable(struct regulator_dev *reg) { unsigned int register_val = 0, register_mask = 0; unsigned int register1; register_val = BITFVAL(VAUDIO_EN, VAUDIO_EN_ENABLE); register_mask = BITFMASK(VAUDIO_EN); register1 = REG_REGULATOR_MODE_0; return pmic_write_reg(register1, register_val, register_mask); } static int mc13783_vaudio_disable(struct regulator_dev *reg) { unsigned int register_val = 0, register_mask = 0; unsigned int register1; register_val = BITFVAL(VAUDIO_EN, VAUDIO_EN_DISABLE); register_mask = BITFMASK(VAUDIO_EN); register1 = REG_REGULATOR_MODE_0; return pmic_write_reg(register1, register_val, register_mask); } static int mc13783_viohi_enable(struct regulator_dev *reg) { unsigned int register_val = 0, register_mask = 0; unsigned int register1; register_val = BITFVAL(VIOHI_EN, VIOHI_EN_ENABLE); register_mask = BITFMASK(VIOHI_EN); register1 = REG_REGULATOR_MODE_0; return pmic_write_reg(register1, register_val, register_mask); } static int mc13783_viohi_disable(struct regulator_dev *reg) { unsigned int register_val = 0, register_mask = 0; unsigned int register1; register_val = BITFVAL(VIOHI_EN, VIOHI_EN_DISABLE); register_mask = BITFMASK(VIOHI_EN); register1 = REG_REGULATOR_MODE_0; return pmic_write_reg(register1, register_val, register_mask); } static int mc13783_violo_set_voltage(struct regulator_dev *reg, int minuV, int uV) { unsigned int register_val = 0, register_mask = 0, register1 = 0; int voltage, mV = uV / 1000; if ((mV >= 1200) && (mV < 1300)) voltage = VIOLO_1_2V; else if ((mV >= 1300) && (mV < 1500)) voltage = VIOLO_1_3V; else if ((mV >= 1500) && (mV < 1800)) voltage = VIOLO_1_5V; else voltage = VIOLO_1_8V; register_val = BITFVAL(VIOLO, voltage); register_mask = BITFMASK(VIOLO); register1 = REG_REGULATOR_SETTING_0; return pmic_write_reg(register1, register_val, register_mask); } static int mc13783_violo_get_voltage(struct regulator_dev *reg) { unsigned int register_val = 0; int voltage = 0, mV = 0; CHECK_ERROR(pmic_read_reg(REG_REGULATOR_SETTING_0, ®ister_val, PMIC_ALL_BITS)); voltage = BITFEXT(register_val, VIOLO); switch (voltage) { case VIOLO_1_2V: mV = 1200; break; case VIOLO_1_3V: mV = 1300; break; case VIOLO_1_5V: mV = 1500; break; case VIOLO_1_8V: mV = 1800; break; default: return -EINVAL; } return mV * 1000; } static int mc13783_violo_enable(struct regulator_dev *reg) { unsigned int register_val = 0, register_mask = 0; unsigned int register1; register_val = BITFVAL(VIOLO_EN, VIOLO_EN_ENABLE); register_mask = BITFMASK(VIOLO_EN); register1 = REG_REGULATOR_MODE_0; return pmic_write_reg(register1, register_val, register_mask); } static int mc13783_violo_disable(struct regulator_dev *reg) { unsigned int register_val = 0, register_mask = 0; unsigned int register1; register_val = BITFVAL(VIOLO_EN, VIOLO_EN_DISABLE); register_mask = BITFMASK(VIOLO_EN); register1 = REG_REGULATOR_MODE_0; return pmic_write_reg(register1, register_val, register_mask); } static int mc13783_vdig_set_voltage(struct regulator_dev *reg, int minuV, int uV) { unsigned int register_val = 0, register_mask = 0; unsigned int register1; int voltage, mV = uV / 1000; if ((mV >= 1200) && (mV < 1300)) voltage = VDIG_1_2V; else if ((mV >= 1300) && (mV < 1500)) voltage = VDIG_1_3V; else if ((mV >= 1500) && (mV < 1800)) voltage = VDIG_1_5V; else voltage = VDIG_1_8V; register_val = BITFVAL(VDIG, voltage); register_mask = BITFMASK(VDIG); register1 = REG_REGULATOR_SETTING_0; return pmic_write_reg(register1, register_val, register_mask); } static int mc13783_vdig_get_voltage(struct regulator_dev *reg) { unsigned int register_val = 0; int voltage = 0, mV = 0; CHECK_ERROR(pmic_read_reg(REG_REGULATOR_SETTING_0, ®ister_val, PMIC_ALL_BITS)); voltage = BITFEXT(register_val, VDIG); switch (voltage) { case VDIG_1_2V: mV = 1200; break; case VDIG_1_3V: mV = 1300; break; case VDIG_1_5V: mV = 1500; break; case VDIG_1_8V: mV = 1800; break; default: return -EINVAL; } return mV * 1000; } static int mc13783_vdig_enable(struct regulator_dev *reg) { unsigned int register_val = 0, register_mask = 0; unsigned int register1; register_val = BITFVAL(VDIG_EN, VDIG_EN_ENABLE); register_mask = BITFMASK(VDIG_EN); register1 = REG_REGULATOR_MODE_0; return pmic_write_reg(register1, register_val, register_mask); } static int mc13783_vdig_disable(struct regulator_dev *reg) { unsigned int register_val = 0, register_mask = 0; unsigned int register1; register_val = BITFVAL(VDIG_EN, VDIG_EN_DISABLE); register_mask = BITFMASK(VDIG_EN); register1 = REG_REGULATOR_MODE_0; return pmic_write_reg(register1, register_val, register_mask); } static int mc13783_vgen_set_voltage(struct regulator_dev *reg, int minuV, int uV) { unsigned int register_val = 0, register_mask = 0; unsigned int register1; int voltage, mV = uV / 1000; int vgenid = rdev_get_id(reg); printk(KERN_INFO "VGEN ID is %d\n", vgenid); if ((mV >= 1100) && (mV < 1200)) voltage = VGEN_1_1V; else if ((mV >= 1200) && (mV < 1300)) voltage = VGEN_1_2V; else if ((mV >= 1300) && (mV < 1500)) voltage = VGEN_1_3V; else if ((mV >= 1500) && (mV < 1800)) voltage = VGEN_1_5V; else if ((mV >= 1800) && (mV < 2000)) voltage = VGEN_1_8V; else if ((mV >= 2000) && (mV < 2400)) voltage = VGEN_2V; else if ((mV >= 2400) && (mV < 2775)) voltage = VGEN_2_4V; else voltage = VGEN_2_775V; register_val = BITFVAL(VGEN, voltage); register_mask = BITFMASK(VGEN); register1 = REG_REGULATOR_SETTING_0; return pmic_write_reg(register1, register_val, register_mask); } static int mc13783_vgen_get_voltage(struct regulator_dev *reg) { unsigned int register_val = 0; int voltage = 0, mV = 0; CHECK_ERROR(pmic_read_reg(REG_REGULATOR_SETTING_0, ®ister_val, PMIC_ALL_BITS)); voltage = BITFEXT(register_val, VGEN); switch (voltage) { case VGEN_1_2V: mV = 1200; break; case VGEN_1_3V: mV = 1300; break; case VGEN_1_5V: mV = 1500; break; case VGEN_1_8V: mV = 1800; break; case VGEN_1_1V: mV = 1100; break; case VGEN_2V: mV = 2000; break; case VGEN_2_775V: mV = 2775; break; case VGEN_2_4V: mV = 2400; break; default: return -EINVAL; } return mV * 1000; } static int mc13783_vgen_enable(struct regulator_dev *reg) { unsigned int register_val = 0, register_mask = 0; unsigned int register1; register_val = BITFVAL(VGEN_EN, VGEN_EN_ENABLE); register_mask = BITFMASK(VGEN_EN); register1 = REG_REGULATOR_MODE_0; return pmic_write_reg(register1, register_val, register_mask); } static int mc13783_vgen_disable(struct regulator_dev *reg) { unsigned int register_val = 0, register_mask = 0; unsigned int register1; register_val = BITFVAL(VGEN_EN, VGEN_EN_DISABLE); register_mask = BITFMASK(VGEN_EN); register1 = REG_REGULATOR_MODE_0; return pmic_write_reg(register1, register_val, register_mask); } static int mc13783_vrfdig_set_voltage(struct regulator_dev *reg, int minuV, int uV) { unsigned int register_val = 0, register_mask = 0; unsigned int register1; int voltage, mV = uV / 1000; if ((mV >= 1200) && (mV < 1500)) voltage = VRFDIG_1_2V; else if ((mV >= 1500) && (mV < 1300)) voltage = VRFDIG_1_5V; else if ((mV >= 1800) && (mV < 1875)) voltage = VRFDIG_1_8V; else voltage = VRFDIG_1_875V; register_val = BITFVAL(VRFDIG, voltage); register_mask = BITFMASK(VRFDIG); register1 = REG_REGULATOR_SETTING_0; return pmic_write_reg(register1, register_val, register_mask); } static int mc13783_vrfdig_get_voltage(struct regulator_dev *reg) { unsigned int register_val = 0; int voltage = 0, mV = 0; CHECK_ERROR(pmic_read_reg(REG_REGULATOR_SETTING_0, ®ister_val, PMIC_ALL_BITS)); voltage = BITFEXT(register_val, VRFDIG); switch (voltage) { case VRFDIG_1_2V: mV = 1200; break; case VRFDIG_1_5V: mV = 1500; break; case VRFDIG_1_8V: mV = 1800; break; case VRFDIG_1_875V: mV = 1875; break; default: return -EINVAL; } return mV * 1000; } static int mc13783_vrfdig_enable(struct regulator_dev *reg) { unsigned int register_val = 0, register_mask = 0; unsigned int register1; register_val = BITFVAL(VRFDIG_EN, VRFDIG_EN_ENABLE); register_mask = BITFMASK(VRFDIG_EN); register1 = REG_REGULATOR_MODE_0; return pmic_write_reg(register1, register_val, register_mask); } static int mc13783_vrfdig_disable(struct regulator_dev *reg) { unsigned int register_val = 0, register_mask = 0; unsigned int register1; register_val = BITFVAL(VRFDIG_EN, VRFDIG_EN_DISABLE); register_mask = BITFMASK(VRFDIG_EN); register1 = REG_REGULATOR_MODE_0; return pmic_write_reg(register1, register_val, register_mask); } static int mc13783_vrfref_set_voltage(struct regulator_dev *reg, int minuV, int uV) { unsigned int register_val = 0, register_mask = 0; unsigned int register1; int voltage, mV = uV / 1000; if ((mV >= 2475) && (mV < 2600)) voltage = VRFREF_2_475V; else if ((mV >= 2600) && (mV < 2700)) voltage = VRFREF_2_6V; else if ((mV >= 2700) && (mV < 2775)) voltage = VRFREF_2_7V; else voltage = VRFREF_2_775V; register_val = BITFVAL(VRFREF, voltage); register_mask = BITFMASK(VRFREF); register1 = REG_REGULATOR_SETTING_0; return pmic_write_reg(register1, register_val, register_mask); } static int mc13783_vrfref_get_voltage(struct regulator_dev *reg) { unsigned int register_val = 0; int voltage = 0, mV = 0; CHECK_ERROR(pmic_read_reg(REG_REGULATOR_SETTING_0, ®ister_val, PMIC_ALL_BITS)); voltage = BITFEXT(register_val, VRFREF); switch (voltage) { case VRFREF_2_475V: mV = 2475; break; case VRFREF_2_6V: mV = 2600; break; case VRFREF_2_7V: mV = 2700; break; case VRFREF_2_775V: mV = 2775; break; default: return -EINVAL; } return mV * 1000; } static int mc13783_vrfref_enable(struct regulator_dev *reg) { unsigned int register_val = 0, register_mask = 0; unsigned int register1; register_val = BITFVAL(VRFREF_EN, VRFREF_EN_ENABLE); register_mask = BITFMASK(VRFREF_EN); register1 = REG_REGULATOR_MODE_0; return pmic_write_reg(register1, register_val, register_mask); } static int mc13783_vrfref_disable(struct regulator_dev *reg) { unsigned int register_val = 0, register_mask = 0; unsigned int register1; register_val = BITFVAL(VRFREF_EN, VRFREF_EN_DISABLE); register_mask = BITFMASK(VRFREF_EN); register1 = REG_REGULATOR_MODE_0; return pmic_write_reg(register1, register_val, register_mask); } static int mc13783_vrfcp_set_voltage(struct regulator_dev *reg, int minuV, int uV) { unsigned int register_val = 0, register_mask = 0; unsigned int register1; int voltage, mV = uV / 1000; if ((mV >= 2700) && (mV < 2775)) voltage = VRFCP_2_7V; else voltage = VRFCP_2_775V; register_val = BITFVAL(VRFCP, voltage); register_mask = BITFMASK(VRFCP); register1 = REG_REGULATOR_SETTING_0; return pmic_write_reg(register1, register_val, register_mask); } static int mc13783_vrfcp_get_voltage(struct regulator_dev *reg) { unsigned int register_val = 0; int voltage = 0, mV = 0; CHECK_ERROR(pmic_read_reg(REG_REGULATOR_SETTING_0, ®ister_val, PMIC_ALL_BITS)); voltage = BITFEXT(register_val, VRFCP); switch (voltage) { case VRFCP_2_7V: mV = 2700; break; case VRFCP_2_775V: mV = 2775; break; default: return -EINVAL; } return mV * 1000; } static int mc13783_vrfcp_enable(struct regulator_dev *reg) { unsigned int register_val = 0, register_mask = 0; unsigned int register1; register_val = BITFVAL(VRFCP_EN, VRFCP_EN_ENABLE); register_mask = BITFMASK(VRFCP_EN); register1 = REG_REGULATOR_MODE_0; return pmic_write_reg(register1, register_val, register_mask); } static int mc13783_vrfcp_disable(struct regulator_dev *reg) { unsigned int register_val = 0, register_mask = 0; unsigned int register1; register_val = BITFVAL(VRFCP_EN, VRFCP_EN_DISABLE); register_mask = BITFMASK(VRFCP_EN); register1 = REG_REGULATOR_MODE_0; return pmic_write_reg(register1, register_val, register_mask); } static int mc13783_vsim_set_voltage(struct regulator_dev *reg, int minuV, int uV) { unsigned int register_val = 0, register_mask = 0; unsigned int register1; int voltage, mV = uV / 1000; if ((mV >= 1800) && (mV < 2900)) voltage = VSIM_1_8V; else voltage = VSIM_2_9V; register_val = BITFVAL(VSIM, voltage); register_mask = BITFMASK(VSIM); register1 = REG_REGULATOR_SETTING_0; return pmic_write_reg(register1, register_val, register_mask); } static int mc13783_vsim_get_voltage(struct regulator_dev *reg) { unsigned int register_val = 0; int voltage = 0, mV = 0; CHECK_ERROR(pmic_read_reg(REG_REGULATOR_SETTING_0, ®ister_val, PMIC_ALL_BITS)); voltage = BITFEXT(register_val, VSIM); switch (voltage) { case VSIM_1_8V: mV = 1800; break; case VSIM_2_9V: mV = 1900; break; default: return -EINVAL; } return mV * 1000; } static int mc13783_vsim_enable(struct regulator_dev *reg) { unsigned int register_val = 0, register_mask = 0; unsigned int register1; register_val = BITFVAL(VSIM_EN, VSIM_EN_ENABLE); register_mask = BITFMASK(VSIM_EN); register1 = REG_REGULATOR_MODE_1; return pmic_write_reg(register1, register_val, register_mask); } static int mc13783_vsim_disable(struct regulator_dev *reg) { unsigned int register_val = 0, register_mask = 0; unsigned int register1; register_val = BITFVAL(VSIM_EN, VSIM_EN_DISABLE); register_mask = BITFMASK(VSIM_EN); register1 = REG_REGULATOR_MODE_1; return pmic_write_reg(register1, register_val, register_mask); } static int mc13783_vesim_set_voltage(struct regulator_dev *reg, int minuV, int uV) { unsigned int register_val = 0, register_mask = 0; unsigned int register1; int voltage, mV = uV / 1000; if ((mV >= 1800) && (mV < 2900)) voltage = VESIM_1_8V; else voltage = VESIM_2_9V; register_val = BITFVAL(VESIM, voltage); register_mask = BITFMASK(VESIM); register1 = REG_REGULATOR_SETTING_0; return pmic_write_reg(register1, register_val, register_mask); } static int mc13783_vesim_get_voltage(struct regulator_dev *reg) { unsigned int register_val = 0; int voltage = 0, mV = 0; CHECK_ERROR(pmic_read_reg(REG_REGULATOR_SETTING_0, ®ister_val, PMIC_ALL_BITS)); voltage = BITFEXT(register_val, VESIM); switch (voltage) { case VESIM_1_8V: mV = 1800; break; case VESIM_2_9V: mV = 1900; break; default: return -EINVAL; } return mV * 1000; } static int mc13783_vesim_enable(struct regulator_dev *reg) { unsigned int register_val = 0, register_mask = 0; unsigned int register1; register_val = BITFVAL(VESIM_EN, VESIM_EN_ENABLE); register_mask = BITFMASK(VESIM_EN); register1 = REG_REGULATOR_MODE_1; return pmic_write_reg(register1, register_val, register_mask); } static int mc13783_vesim_disable(struct regulator_dev *reg) { unsigned int register_val = 0, register_mask = 0; unsigned int register1; register_val = BITFVAL(VESIM_EN, VESIM_EN_DISABLE); register_mask = BITFMASK(VESIM_EN); register1 = REG_REGULATOR_MODE_1; return pmic_write_reg(register1, register_val, register_mask); } static int mc13783_vcam_set_voltage(struct regulator_dev *reg, int minuV, int uV) { unsigned int register_val = 0, register_mask = 0; unsigned int register1; int voltage, mV = uV / 1000; if ((mV >= 1500) && (mV < 1800)) voltage = VCAM_1_5V; else if ((mV >= 1800) && (mV < 2500)) voltage = VCAM_1_8V; else if ((mV >= 2500) && (mV < 2550)) voltage = VCAM_2_5V; else if ((mV >= 2550) && (mV < 2600)) voltage = VCAM_2_55V; if ((mV >= 2600) && (mV < 2750)) voltage = VCAM_2_6V; else if ((mV >= 2750) && (mV < 2800)) voltage = VCAM_2_75V; else if ((mV >= 2800) && (mV < 3000)) voltage = VCAM_2_8V; else voltage = VCAM_3V; register_val = BITFVAL(VCAM, voltage); register_mask = BITFMASK(VCAM); register1 = REG_REGULATOR_SETTING_0; return pmic_write_reg(register1, register_val, register_mask); } static int mc13783_vcam_get_voltage(struct regulator_dev *reg) { unsigned int register_val = 0; int voltage = 0, mV = 0; CHECK_ERROR(pmic_read_reg(REG_REGULATOR_SETTING_0, ®ister_val, PMIC_ALL_BITS)); voltage = BITFEXT(register_val, VCAM); switch (voltage) { case VCAM_1_5V: mV = 1500; break; case VCAM_1_8V: mV = 1800; break; case VCAM_2_5V: mV = 2500; break; case VCAM_2_55V: mV = 2550; break; case VCAM_2_6V: mV = 2600; break; case VCAM_2_75V: mV = 2750; break; case VCAM_2_8V: mV = 2800; break; case VCAM_3V: mV = 3000; break; default: return -EINVAL; } return mV * 1000; } static int mc13783_vcam_enable(struct regulator_dev *reg) { unsigned int register_val = 0, register_mask = 0; unsigned int register1; register_val = BITFVAL(VCAM_EN, VCAM_EN_ENABLE); register_mask = BITFMASK(VCAM_EN); register1 = REG_REGULATOR_MODE_1; return pmic_write_reg(register1, register_val, register_mask); } static int mc13783_vcam_disable(struct regulator_dev *reg) { unsigned int register_val = 0, register_mask = 0; unsigned int register1; register_val = BITFVAL(VCAM_EN, VCAM_EN_DISABLE); register_mask = BITFMASK(VCAM_EN); register1 = REG_REGULATOR_MODE_1; return pmic_write_reg(register1, register_val, register_mask); } static int mc13783_vvib_set_voltage(struct regulator_dev *reg, int minuV, int uV) { unsigned int register_val = 0, register_mask = 0; unsigned int register1; int voltage, mV = uV / 1000; if ((mV >= 1300) && (mV < 1800)) voltage = VVIB_1_3V; else if ((mV >= 1800) && (mV < 2000)) voltage = VVIB_1_8V; else if ((mV >= 2000) && (mV < 3000)) voltage = VVIB_2V; else voltage = VVIB_3V; register_val = BITFVAL(VVIB, voltage); register_mask = BITFMASK(VVIB); register1 = REG_REGULATOR_SETTING_1; return pmic_write_reg(register1, register_val, register_mask); } static int mc13783_vvib_get_voltage(struct regulator_dev *reg) { unsigned int register_val = 0; int voltage = 0, mV = 0; CHECK_ERROR(pmic_read_reg(REG_REGULATOR_SETTING_1, ®ister_val, PMIC_ALL_BITS)); voltage = BITFEXT(register_val, VVIB); switch (voltage) { case VVIB_1_3V: mV = 1300; break; case VVIB_1_8V: mV = 1800; break; case VVIB_2V: mV = 2000; break; case VVIB_3V: mV = 3000; break; default: return -EINVAL; } return mV * 1000; } static int mc13783_vvib_enable(struct regulator_dev *reg) { unsigned int register_val = 0, register_mask = 0; unsigned int register1; register_val = BITFVAL(VVIB_EN, VVIB_EN_ENABLE); register_mask = BITFMASK(VVIB_EN); register1 = REG_REGULATOR_MODE_1; return pmic_write_reg(register1, register_val, register_mask); } static int mc13783_vvib_disable(struct regulator_dev *reg) { unsigned int register_val = 0, register_mask = 0; unsigned int register1; register_val = BITFVAL(VVIB_EN, VVIB_EN_DISABLE); register_mask = BITFMASK(VVIB_EN); register1 = REG_REGULATOR_MODE_1; return pmic_write_reg(register1, register_val, register_mask); } static int mc13783_vrf_set_voltage(struct regulator_dev *reg, int minuV, int uV) { unsigned int register_val = 0, register_mask = 0; unsigned int register1; int voltage, rf = rdev_get_id(reg), mV = uV / 1000; if ((mV >= 1500) && (mV < 1875)) voltage = VRF_1_5V; else if ((mV >= 1875) && (mV < 2700)) voltage = VRF_1_875V; else if ((mV >= 2700) && (mV < 2775)) voltage = VRF_2_7V; else voltage = VRF_2_775V; switch (rf) { case MC13783_VRF1: register_val = BITFVAL(VRF1, voltage); register_mask = BITFMASK(VRF1); break; case MC13783_VRF2: register_val = BITFVAL(VRF2, voltage); register_mask = BITFMASK(VRF2); break; default: return -EINVAL; } register1 = REG_REGULATOR_SETTING_1; return pmic_write_reg(register1, register_val, register_mask); } static int mc13783_vrf_get_voltage(struct regulator_dev *reg) { unsigned int register_val = 0; int voltage = 0, rf = rdev_get_id(reg), mV = 0; CHECK_ERROR(pmic_read_reg(REG_REGULATOR_SETTING_1, ®ister_val, PMIC_ALL_BITS)); switch (rf) { case MC13783_VRF1: voltage = BITFEXT(register_val, VRF1); break; case MC13783_VRF2: voltage = BITFEXT(register_val, VRF2); break; default: return -EINVAL; }; switch (voltage) { case VRF_1_5V: mV = 1500; break; case VRF_1_875V: mV = 1875; break; case VRF_2_7V: mV = 2700; break; case VRF_2_775V: mV = 2775; break; default: return -EINVAL; } return mV * 1000; } static int mc13783_vrf_enable(struct regulator_dev *reg) { unsigned int register_val = 0, register_mask = 0; unsigned int register1; int vrf = rdev_get_id(reg); switch (vrf) { case MC13783_VRF1: register_val = BITFVAL(VRF1_EN, VRF1_EN_ENABLE); register_mask = BITFMASK(VRF1_EN); break; case MC13783_VRF2: register_val = BITFVAL(VRF2_EN, VRF2_EN_ENABLE); register_mask = BITFMASK(VRF2_EN); break; default: return -EINVAL; }; register1 = REG_REGULATOR_MODE_1; return pmic_write_reg(register1, register_val, register_mask); } static int mc13783_vrf_disable(struct regulator_dev *reg) { unsigned int register_val = 0, register_mask = 0; unsigned int register1; int vrf = rdev_get_id(reg); switch (vrf) { case MC13783_VRF1: register_val = BITFVAL(VRF1_EN, VRF1_EN_DISABLE); register_mask = BITFMASK(VRF1_EN); break; case MC13783_VRF2: register_val = BITFVAL(VRF2_EN, VRF2_EN_DISABLE); register_mask = BITFMASK(VRF2_EN); break; default: return -EINVAL; }; register1 = REG_REGULATOR_MODE_1; return pmic_write_reg(register1, register_val, register_mask); } static int mc13783_vmmc_set_voltage(struct regulator_dev *reg, int minuV, int uV) { unsigned int register_val = 0, register_mask = 0; unsigned int register1; int voltage, mmc = rdev_get_id(reg), mV = uV / 1000; printk(KERN_INFO "VMMC ID is %d\n", mmc); if ((mV >= 1600) && (mV < 1800)) voltage = VMMC_1_6V; else if ((mV >= 1800) && (mV < 2000)) voltage = VMMC_1_8V; else if ((mV >= 2000) && (mV < 2600)) voltage = VMMC_2V; else if ((mV >= 2600) && (mV < 2700)) voltage = VMMC_2_6V; else if ((mV >= 2700) && (mV < 2800)) voltage = VMMC_2_7V; else if ((mV >= 2800) && (mV < 2900)) voltage = VMMC_2_8V; else if ((mV >= 2900) && (mV < 3000)) voltage = VMMC_2_9V; else voltage = VMMC_3V; switch (mmc) { case MC13783_VMMC1: register_val = BITFVAL(VMMC1, voltage); register_mask = BITFMASK(VMMC1); break; case MC13783_VMMC2: register_val = BITFVAL(VMMC2, voltage); register_mask = BITFMASK(VMMC2); break; default: return -EINVAL; } register1 = REG_REGULATOR_SETTING_1; return pmic_write_reg(register1, register_val, register_mask); } static int mc13783_vmmc_get_voltage(struct regulator_dev *reg) { unsigned int register_val = 0; int voltage = 0, mmc = rdev_get_id(reg), mV = 0; CHECK_ERROR(pmic_read_reg(REG_REGULATOR_SETTING_1, ®ister_val, PMIC_ALL_BITS)); switch (mmc) { case MC13783_VMMC1: voltage = BITFEXT(register_val, VMMC1); break; case MC13783_VMMC2: voltage = BITFEXT(register_val, VMMC2); break; default: return -EINVAL; } switch (voltage) { case VMMC_1_6V: mV = 1600; break; case VMMC_1_8V: mV = 1800; break; case VMMC_2V: mV = 2000; break; case VMMC_2_6V: mV = 2600; break; case VMMC_2_7V: mV = 2700; break; case VMMC_2_8V: mV = 2800; break; case VMMC_2_9V: mV = 2900; break; case VMMC_3V: mV = 3000; break; default: return -EINVAL; } return mV * 1000; } static int mc13783_vmmc_enable(struct regulator_dev *reg) { unsigned int register_val = 0, register_mask = 0; unsigned int register1; int vmmc = rdev_get_id(reg); switch (vmmc) { case MC13783_VMMC1: register_val = BITFVAL(VMMC1_EN, VMMC1_EN_ENABLE); register_mask = BITFMASK(VMMC1_EN); break; case MC13783_VMMC2: register_val = BITFVAL(VMMC2_EN, VMMC2_EN_ENABLE); register_mask = BITFMASK(VMMC2_EN); break; default: return -EINVAL; }; register1 = REG_REGULATOR_MODE_1; return pmic_write_reg(register1, register_val, register_mask); } static int mc13783_vmmc_disable(struct regulator_dev *reg) { unsigned int register_val = 0, register_mask = 0; unsigned int register1; int vmmc = rdev_get_id(reg); switch (vmmc) { case MC13783_VMMC1: register_val = BITFVAL(VMMC1_EN, VMMC1_EN_DISABLE); register_mask = BITFMASK(VMMC1_EN); break; case MC13783_VMMC2: register_val = BITFVAL(VMMC2_EN, VMMC2_EN_DISABLE); register_mask = BITFMASK(VMMC2_EN); break; default: return -EINVAL; }; register1 = REG_REGULATOR_MODE_1; return pmic_write_reg(register1, register_val, register_mask); } static int mc13783_gpo_enable(struct regulator_dev *reg) { unsigned int register_val = 0, register_mask = 0; unsigned int register1; int gpo = rdev_get_id(reg); switch (gpo) { case MC13783_GPO1: register_val = BITFVAL(GPO1_EN, GPO1_EN_ENABLE); register_mask = BITFMASK(GPO1_EN); break; case MC13783_GPO2: register_val = BITFVAL(GPO2_EN, GPO2_EN_ENABLE); register_mask = BITFMASK(GPO2_EN); break; case MC13783_GPO3: register_val = BITFVAL(GPO3_EN, GPO3_EN_ENABLE); register_mask = BITFMASK(GPO3_EN); break; case MC13783_GPO4: register_val = BITFVAL(GPO4_EN, GPO4_EN_ENABLE); register_mask = BITFMASK(GPO4_EN); break; default: return -EINVAL; }; register1 = REG_POWER_MISCELLANEOUS; return pmic_write_reg(register1, register_val, register_mask); } static int mc13783_gpo_disable(struct regulator_dev *reg) { unsigned int register_val = 0, register_mask = 0; unsigned int register1; int gpo = rdev_get_id(reg); switch (gpo) { case MC13783_GPO1: register_val = BITFVAL(GPO1_EN, GPO1_EN_DISABLE); register_mask = BITFMASK(GPO1_EN); break; case MC13783_GPO2: register_val = BITFVAL(GPO2_EN, GPO2_EN_DISABLE); register_mask = BITFMASK(GPO2_EN); break; case MC13783_GPO3: register_val = BITFVAL(GPO3_EN, GPO3_EN_DISABLE); register_mask = BITFMASK(GPO3_EN); break; case MC13783_GPO4: register_val = BITFVAL(GPO4_EN, GPO4_EN_DISABLE); register_mask = BITFMASK(GPO4_EN); break; default: return -EINVAL; }; register1 = REG_POWER_MISCELLANEOUS; return pmic_write_reg(register1, register_val, register_mask); } static int mc13783_sw3_set_voltage(struct regulator_dev *reg, int minuV, int uV) { unsigned int register_val = 0, register_mask = 0, register1 = 0; int voltage, mV = uV / 1000; if ((mV >= 5000) && (mV < 5500)) voltage = SW3_5V; else voltage = SW3_5_5V; register_val = BITFVAL(SW3, voltage); register_mask = BITFMASK(SW3); register1 = REG_SWITCHERS_5; return pmic_write_reg(register1, register_val, register_mask); } static int mc13783_sw3_get_voltage(struct regulator_dev *reg) { unsigned int register_val = 0; int voltage = 0, mV = 0; CHECK_ERROR(pmic_read_reg(REG_SWITCHERS_5, ®ister_val, PMIC_ALL_BITS)); voltage = BITFEXT(register_val, SW3); if (voltage == SW3_5_5V) mV = 5500; else mV = 5000; return mV * 1000; } static int mc13783_sw3_enable(struct regulator_dev *reg) { unsigned int register_val = 0, register_mask = 0; unsigned int register1; register_val = BITFVAL(SW3_EN, SW3_EN_ENABLE); register_mask = BITFMASK(SW3_EN); register1 = REG_SWITCHERS_5; return pmic_write_reg(register1, register_val, register_mask); } static int mc13783_sw3_disable(struct regulator_dev *reg) { unsigned int register_val = 0, register_mask = 0; unsigned int register1; register_val = BITFVAL(SW3_EN, SW3_EN_DISABLE); register_mask = BITFMASK(SW3_EN); register1 = REG_SWITCHERS_5; return pmic_write_reg(register1, register_val, register_mask); } static int mc13783_sw_set_normal_voltage(struct regulator_dev *reg, int minuV, int uV) { unsigned int register_val = 0, register_mask = 0; unsigned int register1 = 0; int voltage, sw = rdev_get_id(reg), mV = uV / 1000; if ((mV >= 900) && (mV < 925)) voltage = SW_0_9V; else if ((mV >= 925) && (mV < 950)) voltage = SW_0_925V; else if ((mV >= 950) && (mV < 975)) voltage = SW_0_95V; else if ((mV >= 975) && (mV < 1000)) voltage = SW_0_975V; else if ((mV >= 1000) && (mV < 1025)) voltage = SW_1V; else if ((mV >= 1025) && (mV < 1050)) voltage = SW_1_025V; else if ((mV >= 1050) && (mV < 1075)) voltage = SW_1_05V; else if ((mV >= 1075) && (mV < 1100)) voltage = SW_1_075V; else if ((mV >= 1100) && (mV < 1125)) voltage = SW_1_1V; else if ((mV >= 1125) && (mV < 1150)) voltage = SW_1_125V; else if ((mV >= 1150) && (mV < 1175)) voltage = SW_1_15V; else if ((mV >= 1175) && (mV < 1200)) voltage = SW_1_175V; else if ((mV >= 1200) && (mV < 1225)) voltage = SW_1_2V; else if ((mV >= 1225) && (mV < 1250)) voltage = SW_1_225V; else if ((mV >= 1250) && (mV < 1275)) voltage = SW_1_25V; else if ((mV >= 1275) && (mV < 1300)) voltage = SW_1_275V; else if ((mV >= 1300) && (mV < 1325)) voltage = SW_1_3V; else if ((mV >= 1325) && (mV < 1350)) voltage = SW_1_325V; else if ((mV >= 1350) && (mV < 1375)) voltage = SW_1_35V; else if ((mV >= 1375) && (mV < 1400)) voltage = SW_1_375V; else if ((mV >= 1400) && (mV < 1425)) voltage = SW_1_4V; else if ((mV >= 1425) && (mV < 1450)) voltage = SW_1_425V; else if ((mV >= 1450) && (mV < 1475)) voltage = SW_1_45V; else if ((mV >= 1475) && (mV < 1500)) voltage = SW_1_475V; else if ((mV >= 1500) && (mV < 1525)) voltage = SW_1_5V; else if ((mV >= 1525) && (mV < 1550)) voltage = SW_1_525V; else if ((mV >= 1550) && (mV < 1575)) voltage = SW_1_55V; else if ((mV >= 1575) && (mV < 1600)) voltage = SW_1_575V; else if ((mV >= 1600) && (mV < 1625)) voltage = SW_1_6V; else if ((mV >= 1625) && (mV < 1650)) voltage = SW_1_625V; else if ((mV >= 1650) && (mV < 1675)) voltage = SW_1_65V; else if ((mV >= 1675) && (mV < 1700)) voltage = SW_1_675V; else if ((mV >= 1700) && (mV < 1800)) voltage = SW_1_7V; else if ((mV >= 1800) && (mV < 1850)) voltage = SW_1_8V; else if ((mV >= 1850) && (mV < 2000)) voltage = SW_1_85V; else if ((mV >= 2000) && (mV < 2100)) voltage = SW_2V; else if ((mV >= 2100) && (mV < 2200)) voltage = SW_2_1V; else voltage = SW_2_2V; switch (sw) { case MC13783_SW1A: register1 = REG_SWITCHERS_0; register_val = BITFVAL(SW1A, voltage); register_mask = BITFMASK(SW1A); break; case MC13783_SW1B: register1 = REG_SWITCHERS_1; register_val = BITFVAL(SW1B, voltage); register_mask = BITFMASK(SW1B); break; case MC13783_SW2A: register1 = REG_SWITCHERS_2; register_val = BITFVAL(SW2A, voltage); register_mask = BITFMASK(SW2A); break; case MC13783_SW2B: register1 = REG_SWITCHERS_3; register_val = BITFVAL(SW2B, voltage); register_mask = BITFMASK(SW2B); break; default: return -EINVAL; } return pmic_write_reg(register1, register_val, register_mask); } static int mc13783_sw_get_normal_voltage(struct regulator_dev *reg) { unsigned int register_val = 0; int voltage = 0, mV = 0, sw = rdev_get_id(reg); switch (sw) { case MC13783_SW1A: CHECK_ERROR(pmic_read_reg(REG_SWITCHERS_0, ®ister_val, PMIC_ALL_BITS)); voltage = BITFEXT(register_val, SW1A); break; case MC13783_SW1B: CHECK_ERROR(pmic_read_reg(REG_SWITCHERS_1, ®ister_val, PMIC_ALL_BITS)); voltage = BITFEXT(register_val, SW1B); break; case MC13783_SW2A: CHECK_ERROR(pmic_read_reg(REG_SWITCHERS_2, ®ister_val, PMIC_ALL_BITS)); voltage = BITFEXT(register_val, SW2A); break; case MC13783_SW2B: CHECK_ERROR(pmic_read_reg(REG_SWITCHERS_3, ®ister_val, PMIC_ALL_BITS)); voltage = BITFEXT(register_val, SW2B); break; default: return -EINVAL; } switch (voltage) { case SW_0_9V: mV = 900; break; case SW_0_925V: mV = 925; break; case SW_0_95V: mV = 950; break; case SW_0_975V: mV = 975; break; case SW_1V: mV = 1000; break; case SW_1_025V: mV = 1025; break; case SW_1_05V: mV = 1050; break; case SW_1_075V: mV = 1075; break; case SW_1_1V: mV = 1100; break; case SW_1_125V: mV = 1125; break; case SW_1_15V: mV = 1150; break; case SW_1_175V: mV = 1175; break; case SW_1_2V: mV = 1200; break; case SW_1_225V: mV = 1225; break; case SW_1_25V: mV = 1250; break; case SW_1_275V: mV = 1275; break; case SW_1_3V: mV = 1300; break; case SW_1_325V: mV = 1325; break; case SW_1_35V: mV = 1350; break; case SW_1_375V: mV = 1375; break; case SW_1_4V: mV = 1400; break; case SW_1_425V: mV = 1425; break; case SW_1_45V: mV = 1450; break; case SW_1_475V: mV = 1475; break; case SW_1_5V: mV = 1500; break; case SW_1_525V: mV = 1525; break; case SW_1_55V: mV = 1550; break; case SW_1_575V: mV = 1575; break; case SW_1_6V: mV = 1600; break; case SW_1_625V: mV = 1625; break; case SW_1_65V: mV = 1650; break; case SW_1_675V: mV = 1675; break; case SW_1_7V: mV = 1700; break; case SW_1_8V: mV = 1800; break; case SW_1_85V: mV = 1850; break; case SW_2V: mV = 2000; break; case SW_2_1V: mV = 2100; break; case SW_2_2V: mV = 2200; break; default: return -EINVAL; } return mV * 1000; } static int mc13783_sw_normal_enable(struct regulator_dev *reg) { return 0; } static int mc13783_sw_normal_disable(struct regulator_dev *reg) { return 0; } static int mc13783_sw_stby_enable(struct regulator_dev *reg) { return 0; } static int mc13783_sw_stby_disable(struct regulator_dev *reg) { return 0; } static int mc13783_sw_set_stby_voltage(struct regulator_dev *reg, int uV) { unsigned int register_val = 0, register_mask = 0; unsigned int register1 = 0; int voltage, sw = rdev_get_id(reg), mV = uV / 1000; if ((mV >= 900) && (mV < 925)) voltage = SW_0_9V; else if ((mV >= 925) && (mV < 950)) voltage = SW_0_925V; else if ((mV >= 950) && (mV < 975)) voltage = SW_0_95V; else if ((mV >= 975) && (mV < 1000)) voltage = SW_0_975V; else if ((mV >= 1000) && (mV < 1025)) voltage = SW_1V; else if ((mV >= 1025) && (mV < 1050)) voltage = SW_1_025V; else if ((mV >= 1050) && (mV < 1075)) voltage = SW_1_05V; else if ((mV >= 1075) && (mV < 1100)) voltage = SW_1_075V; else if ((mV >= 1100) && (mV < 1125)) voltage = SW_1_1V; else if ((mV >= 1125) && (mV < 1150)) voltage = SW_1_125V; else if ((mV >= 1150) && (mV < 1175)) voltage = SW_1_15V; else if ((mV >= 1175) && (mV < 1200)) voltage = SW_1_175V; else if ((mV >= 1200) && (mV < 1225)) voltage = SW_1_2V; else if ((mV >= 1225) && (mV < 1250)) voltage = SW_1_225V; else if ((mV >= 1250) && (mV < 1275)) voltage = SW_1_25V; else if ((mV >= 1275) && (mV < 1300)) voltage = SW_1_275V; else if ((mV >= 1300) && (mV < 1325)) voltage = SW_1_3V; else if ((mV >= 1325) && (mV < 1350)) voltage = SW_1_325V; else if ((mV >= 1350) && (mV < 1375)) voltage = SW_1_35V; else if ((mV >= 1375) && (mV < 1400)) voltage = SW_1_375V; else if ((mV >= 1400) && (mV < 1425)) voltage = SW_1_4V; else if ((mV >= 1425) && (mV < 1450)) voltage = SW_1_425V; else if ((mV >= 1450) && (mV < 1475)) voltage = SW_1_45V; else if ((mV >= 1475) && (mV < 1500)) voltage = SW_1_475V; else if ((mV >= 1500) && (mV < 1525)) voltage = SW_1_5V; else if ((mV >= 1525) && (mV < 1550)) voltage = SW_1_525V; else if ((mV >= 1550) && (mV < 1575)) voltage = SW_1_55V; else if ((mV >= 1575) && (mV < 1600)) voltage = SW_1_575V; else if ((mV >= 1600) && (mV < 1625)) voltage = SW_1_6V; else if ((mV >= 1625) && (mV < 1650)) voltage = SW_1_625V; else if ((mV >= 1650) && (mV < 1675)) voltage = SW_1_65V; else if ((mV >= 1675) && (mV < 1700)) voltage = SW_1_675V; else if ((mV >= 1700) && (mV < 1800)) voltage = SW_1_7V; else if ((mV >= 1800) && (mV < 1850)) voltage = SW_1_8V; else if ((mV >= 1850) && (mV < 2000)) voltage = SW_1_85V; else if ((mV >= 2000) && (mV < 2100)) voltage = SW_2V; else if ((mV >= 2100) && (mV < 2200)) voltage = SW_2_1V; else voltage = SW_2_2V; switch (sw) { case MC13783_SW1A: register1 = REG_SWITCHERS_0; register_val = BITFVAL(SW1A_STDBY, voltage); register_mask = BITFMASK(SW1A_STDBY); break; case MC13783_SW1B: register1 = REG_SWITCHERS_1; register_val = BITFVAL(SW1B_STDBY, voltage); register_mask = BITFMASK(SW1B_STDBY); break; case MC13783_SW2A: register1 = REG_SWITCHERS_2; register_val = BITFVAL(SW2A_STDBY, voltage); register_mask = BITFMASK(SW2A_STDBY); break; case MC13783_SW2B: register1 = REG_SWITCHERS_3; register_val = BITFVAL(SW2B_STDBY, voltage); register_mask = BITFMASK(SW2B_STDBY); break; default: return -EINVAL; } return pmic_write_reg(register1, register_val, register_mask); } static int mc13783_sw_set_normal_mode(struct regulator_dev *reg, unsigned int mode) { unsigned int reg_val = 0, reg_mask = 0; unsigned int register1 = 0; unsigned int l_mode; int sw = rdev_get_id(reg); switch (mode) { case REGULATOR_MODE_FAST: /* SYNC RECT mode */ l_mode = SW_MODE_SYNC_RECT_EN; break; case REGULATOR_MODE_NORMAL: /* PULSE SKIP mode */ l_mode = SW_MODE_PULSE_SKIP_EN; break; case REGULATOR_MODE_IDLE: /* LOW POWER mode */ l_mode = SW_MODE_LOW_POWER_EN; break; case REGULATOR_MODE_STANDBY: /* NO PULSE SKIP mode */ l_mode = SW_MODE_PULSE_NO_SKIP_EN; break; default: return -EINVAL; } switch (sw) { case MC13783_SW1A: reg_val = BITFVAL(SW1A_MODE, l_mode); reg_mask = BITFMASK(SW1A_MODE); register1 = REG_SWITCHERS_4; break; case MC13783_SW1B: reg_val = BITFVAL(SW1B_MODE, l_mode); reg_mask = BITFMASK(SW1B_MODE); register1 = REG_SWITCHERS_4; break; case MC13783_SW2A: reg_val = BITFVAL(SW2A_MODE, l_mode); reg_mask = BITFMASK(SW2A_MODE); register1 = REG_SWITCHERS_5; break; case MC13783_SW2B: reg_val = BITFVAL(SW2B_MODE, l_mode); reg_mask = BITFMASK(SW2B_MODE); register1 = REG_SWITCHERS_5; break; default: return -EINVAL; } return pmic_write_reg(register1, reg_val, reg_mask); } static unsigned int mc13783_sw_get_normal_mode(struct regulator_dev *reg) { unsigned int reg_val = 0, reg_mask = 0; unsigned int register1 = 0; unsigned int l_mode = 0; int sw = rdev_get_id(reg); int ret = 0; switch (sw) { case MC13783_SW1A: reg_mask = BITFMASK(SW1A_MODE); register1 = REG_SWITCHERS_4; break; case MC13783_SW1B: reg_mask = BITFMASK(SW1B_MODE); register1 = REG_SWITCHERS_4; break; case MC13783_SW2A: reg_mask = BITFMASK(SW2A_MODE); register1 = REG_SWITCHERS_5; break; case MC13783_SW2B: reg_mask = BITFMASK(SW2B_MODE); register1 = REG_SWITCHERS_5; break; default: return -EINVAL; } ret = pmic_read_reg(register1, ®_val, reg_mask); if (ret != 0) return ret; switch (sw) { case MC13783_SW1A: l_mode = BITFEXT(reg_val, SW1A_MODE); break; case MC13783_SW1B: l_mode = BITFEXT(reg_val, SW1B_MODE); break; case MC13783_SW2A: l_mode = BITFEXT(reg_val, SW2A_MODE); break; case MC13783_SW2B: l_mode = BITFEXT(reg_val, SW2B_MODE); break; default: return -EINVAL; } if (l_mode == SW_MODE_SYNC_RECT_EN) { return REGULATOR_MODE_FAST; } else if (l_mode == SW_MODE_PULSE_NO_SKIP_EN) { return REGULATOR_MODE_STANDBY; } else if (l_mode == SW_MODE_PULSE_SKIP_EN) { return REGULATOR_MODE_NORMAL; } else if (l_mode == SW_MODE_LOW_POWER_EN) { return REGULATOR_MODE_IDLE; } else { return -EINVAL; } } static int mc13783_sw_set_stby_mode(struct regulator_dev *reg, unsigned int mode) { unsigned int reg_val = 0, reg_mask = 0; unsigned int register1 = 0; unsigned int l_mode; int sw = rdev_get_id(reg); switch (mode) { case REGULATOR_MODE_FAST: /* SYNC RECT mode */ l_mode = SW_MODE_SYNC_RECT_EN; break; case REGULATOR_MODE_NORMAL: /* PULSE SKIP mode */ l_mode = SW_MODE_PULSE_SKIP_EN; break; case REGULATOR_MODE_IDLE: /* LOW POWER mode */ l_mode = SW_MODE_LOW_POWER_EN; break; case REGULATOR_MODE_STANDBY: /* NO PULSE SKIP mode */ l_mode = SW_MODE_PULSE_NO_SKIP_EN; break; default: return -EINVAL; } switch (sw) { case MC13783_SW1A: reg_val = BITFVAL(SW1A_STBY_MODE, l_mode); reg_mask = BITFMASK(SW1A_STBY_MODE); register1 = REG_SWITCHERS_4; break; case MC13783_SW1B: reg_val = BITFVAL(SW1B_STBY_MODE, l_mode); reg_mask = BITFMASK(SW1B_STBY_MODE); register1 = REG_SWITCHERS_4; break; case MC13783_SW2A: reg_val = BITFVAL(SW2A_STBY_MODE, l_mode); reg_mask = BITFMASK(SW2A_STBY_MODE); register1 = REG_SWITCHERS_5; break; case MC13783_SW2B: reg_val = BITFVAL(SW2B_STBY_MODE, l_mode); reg_mask = BITFMASK(SW2B_STBY_MODE); register1 = REG_SWITCHERS_5; break; default: return -EINVAL; } return pmic_write_reg(register1, reg_val, reg_mask); } static struct regulator_ops mc13783_vaudio_ops = { .enable = mc13783_vaudio_enable, .disable = mc13783_vaudio_disable, }; static struct regulator_ops mc13783_viohi_ops = { .enable = mc13783_viohi_enable, .disable = mc13783_viohi_disable, }; static struct regulator_ops mc13783_violo_ops = { .set_voltage = mc13783_violo_set_voltage, .get_voltage = mc13783_violo_get_voltage, .enable = mc13783_violo_enable, .disable = mc13783_violo_disable, }; static struct regulator_ops mc13783_vdig_ops = { .set_voltage = mc13783_vdig_set_voltage, .get_voltage = mc13783_vdig_get_voltage, .enable = mc13783_vdig_enable, .disable = mc13783_vdig_disable, }; static struct regulator_ops mc13783_vgen_ops = { .set_voltage = mc13783_vgen_set_voltage, .get_voltage = mc13783_vgen_get_voltage, .enable = mc13783_vgen_enable, .disable = mc13783_vgen_disable, }; static struct regulator_ops mc13783_vrfdig_ops = { .set_voltage = mc13783_vrfdig_set_voltage, .get_voltage = mc13783_vrfdig_get_voltage, .enable = mc13783_vrfdig_enable, .disable = mc13783_vrfdig_disable, }; static struct regulator_ops mc13783_vrfref_ops = { .set_voltage = mc13783_vrfref_set_voltage, .get_voltage = mc13783_vrfref_get_voltage, .enable = mc13783_vrfref_enable, .disable = mc13783_vrfref_disable, }; static struct regulator_ops mc13783_vrfcp_ops = { .set_voltage = mc13783_vrfcp_set_voltage, .get_voltage = mc13783_vrfcp_get_voltage, .enable = mc13783_vrfcp_enable, .disable = mc13783_vrfcp_disable, }; static struct regulator_ops mc13783_vsim_ops = { .set_voltage = mc13783_vsim_set_voltage, .get_voltage = mc13783_vsim_get_voltage, .enable = mc13783_vsim_enable, .disable = mc13783_vsim_disable, }; static struct regulator_ops mc13783_vesim_ops = { .set_voltage = mc13783_vesim_set_voltage, .get_voltage = mc13783_vesim_get_voltage, .enable = mc13783_vesim_enable, .disable = mc13783_vesim_disable, }; static struct regulator_ops mc13783_vcam_ops = { .set_voltage = mc13783_vcam_set_voltage, .get_voltage = mc13783_vcam_get_voltage, .enable = mc13783_vcam_enable, .disable = mc13783_vcam_disable, }; static struct regulator_ops mc13783_vvib_ops = { .set_voltage = mc13783_vvib_set_voltage, .get_voltage = mc13783_vvib_get_voltage, .enable = mc13783_vvib_enable, .disable = mc13783_vvib_disable, }; static struct regulator_ops mc13783_vrf_ops = { .set_voltage = mc13783_vrf_set_voltage, .get_voltage = mc13783_vrf_get_voltage, .enable = mc13783_vrf_enable, .disable = mc13783_vrf_disable, }; static struct regulator_ops mc13783_vmmc_ops = { .set_voltage = mc13783_vmmc_set_voltage, .get_voltage = mc13783_vmmc_get_voltage, .enable = mc13783_vmmc_enable, .disable = mc13783_vmmc_disable, }; static struct regulator_ops mc13783_gpo_ops = { .enable = mc13783_gpo_enable, .disable = mc13783_gpo_disable, }; static struct regulator_ops mc13783_sw3_ops = { .set_voltage = mc13783_sw3_set_voltage, .get_voltage = mc13783_sw3_get_voltage, .enable = mc13783_sw3_enable, .disable = mc13783_sw3_disable, }; static struct regulator_ops mc13783_sw1_ops = { .set_voltage = mc13783_sw_set_normal_voltage, .get_voltage = mc13783_sw_get_normal_voltage, .get_mode = mc13783_sw_get_normal_mode, .set_mode = mc13783_sw_set_normal_mode, .set_suspend_voltage = mc13783_sw_set_stby_voltage, .set_suspend_enable = mc13783_sw_stby_enable, .set_suspend_disable = mc13783_sw_stby_disable, .set_suspend_mode = mc13783_sw_set_stby_mode, }; static struct regulator_ops mc13783_sw_normal_ops = { .set_voltage = mc13783_sw_set_normal_voltage, .get_voltage = mc13783_sw_get_normal_voltage, .get_mode = mc13783_sw_get_normal_mode, .set_mode = mc13783_sw_set_normal_mode, .enable = mc13783_sw_normal_enable, .disable = mc13783_sw_normal_disable, }; static struct regulator_desc reg_mc13783[] = { { .name = "SW1A", .id = MC13783_SW1A, .ops = &mc13783_sw1_ops, .irq = 0, .type = REGULATOR_VOLTAGE, .owner = THIS_MODULE }, { .name = "SW1B", .id = MC13783_SW1B, .ops = &mc13783_sw_normal_ops, .irq = 0, .type = REGULATOR_VOLTAGE, .owner = THIS_MODULE }, { .name = "SW2A", .id = MC13783_SW2A, .ops = &mc13783_sw_normal_ops, .irq = 0, .type = REGULATOR_VOLTAGE, .owner = THIS_MODULE }, { .name = "SW2B", .id = MC13783_SW2B, .ops = &mc13783_sw_normal_ops, .irq = 0, .type = REGULATOR_VOLTAGE, .owner = THIS_MODULE }, { .name = "SW3", .id = MC13783_SW3, .ops = &mc13783_sw3_ops, .irq = 0, .type = REGULATOR_VOLTAGE, .owner = THIS_MODULE }, { .name = "VAUDIO", .id = MC13783_VAUDIO, .ops = &mc13783_vaudio_ops, .irq = 0, .type = REGULATOR_VOLTAGE, .owner = THIS_MODULE }, { .name = "VIOHI", .id = MC13783_VIOHI, .ops = &mc13783_viohi_ops, .irq = 0, .type = REGULATOR_VOLTAGE, .owner = THIS_MODULE }, { .name = "VIOLO", .id = MC13783_VIOLO, .ops = &mc13783_violo_ops, .irq = 0, .type = REGULATOR_VOLTAGE, .owner = THIS_MODULE }, { .name = "VDIG", .id = MC13783_VDIG, .ops = &mc13783_vdig_ops, .irq = 0, .type = REGULATOR_VOLTAGE, .owner = THIS_MODULE }, { .name = "VGEN", .id = MC13783_VGEN, .ops = &mc13783_vgen_ops, .irq = 0, .type = REGULATOR_VOLTAGE, .owner = THIS_MODULE }, { .name = "VRFDIG", .id = MC13783_VRFDIG, .ops = &mc13783_vrfdig_ops, .irq = 0, .type = REGULATOR_VOLTAGE, .owner = THIS_MODULE }, { .name = "VRFREF", .id = MC13783_VRFREF, .ops = &mc13783_vrfref_ops, .irq = 0, .type = REGULATOR_VOLTAGE, .owner = THIS_MODULE }, { .name = "VRFCP", .id = MC13783_VRFCP, .ops = &mc13783_vrfcp_ops, .irq = 0, .type = REGULATOR_VOLTAGE, .owner = THIS_MODULE }, { .name = "VSIM", .id = MC13783_VSIM, .ops = &mc13783_vsim_ops, .irq = 0, .type = REGULATOR_VOLTAGE, .owner = THIS_MODULE }, { .name = "VESIM", .id = MC13783_VESIM, .ops = &mc13783_vesim_ops, .irq = 0, .type = REGULATOR_VOLTAGE, .owner = THIS_MODULE }, { .name = "VCAM", .id = MC13783_VCAM, .ops = &mc13783_vcam_ops, .irq = 0, .type = REGULATOR_VOLTAGE, .owner = THIS_MODULE }, { .name = "VRFBG", .id = MC13783_VRFBG, .irq = 0, .type = REGULATOR_VOLTAGE, .owner = THIS_MODULE }, { .name = "VVIB", .id = MC13783_VVIB, .ops = &mc13783_vvib_ops, .irq = 0, .type = REGULATOR_VOLTAGE, .owner = THIS_MODULE }, { .name = "VRF1", .id = MC13783_VRF1, .ops = &mc13783_vrf_ops, .irq = 0, .type = REGULATOR_VOLTAGE, .owner = THIS_MODULE }, { .name = "VRF2", .id = MC13783_VRF2, .ops = &mc13783_vrf_ops, .irq = 0, .type = REGULATOR_VOLTAGE, .owner = THIS_MODULE }, { .name = "VMMC1", .id = MC13783_VMMC1, .ops = &mc13783_vmmc_ops, .irq = 0, .type = REGULATOR_VOLTAGE, .owner = THIS_MODULE }, { .name = "VMMC2", .id = MC13783_VMMC2, .ops = &mc13783_vmmc_ops, .irq = 0, .type = REGULATOR_VOLTAGE, .owner = THIS_MODULE }, { .name = "GPO1", .id = MC13783_GPO1, .ops = &mc13783_gpo_ops, .irq = 0, .type = REGULATOR_VOLTAGE, .owner = THIS_MODULE }, { .name = "GPO2", .id = MC13783_GPO2, .ops = &mc13783_gpo_ops, .irq = 0, .type = REGULATOR_VOLTAGE, .owner = THIS_MODULE }, { .name = "GPO3", .id = MC13783_GPO3, .ops = &mc13783_gpo_ops, .irq = 0, .type = REGULATOR_VOLTAGE, .owner = THIS_MODULE }, { .name = "GPO4", .id = MC13783_GPO4, .ops = &mc13783_gpo_ops, .irq = 0, .type = REGULATOR_VOLTAGE, .owner = THIS_MODULE }, }; /* * Init and Exit */ static int reg_mc13783_probe(struct platform_device *pdev) { struct regulator_dev *rdev; /* register regulator */ rdev = regulator_register(®_mc13783[pdev->id], &pdev->dev, pdev->dev.platform_data, dev_get_drvdata(&pdev->dev)); if (IS_ERR(rdev)) { dev_err(&pdev->dev, "failed to register %s\n", reg_mc13783[pdev->id].name); return PTR_ERR(rdev); } platform_set_drvdata(pdev, rdev); return 0; } static int mc13783_regulator_remove(struct platform_device *pdev) { struct regulator_dev *rdev = platform_get_drvdata(pdev); regulator_unregister(rdev); return 0; } int mc13783_register_regulator(struct mc13783 *mc13783, int reg, struct regulator_init_data *initdata) { struct platform_device *pdev; int ret; if (mc13783->pmic.pdev[reg]) return -EBUSY; pdev = platform_device_alloc("mc13783-regulatr", reg); if (!pdev) return -ENOMEM; mc13783->pmic.pdev[reg] = pdev; initdata->driver_data = mc13783; pdev->dev.platform_data = initdata; pdev->dev.parent = mc13783->dev; ret = platform_device_add(pdev); if (ret != 0) { dev_err(mc13783->dev, "Failed to register regulator %d: %d\n", reg, ret); platform_device_del(pdev); mc13783->pmic.pdev[reg] = NULL; } return ret; } EXPORT_SYMBOL_GPL(mc13783_register_regulator); static struct platform_driver mc13783_regulator_driver = { .probe = reg_mc13783_probe, .remove = mc13783_regulator_remove, .driver = { .name = "mc13783-regulatr", /* o left out due to string length */ }, }; static int __init mc13783_regulator_subsys_init(void) { return platform_driver_register(&mc13783_regulator_driver); } subsys_initcall(mc13783_regulator_subsys_init); static void __exit mc13783_regulator_exit(void) { platform_driver_unregister(&mc13783_regulator_driver); } module_exit(mc13783_regulator_exit); /* Module information */ MODULE_AUTHOR("Freescale Semiconductor, Inc."); MODULE_DESCRIPTION("MC13783 Regulator driver"); MODULE_LICENSE("GPL");