CC: [email protected] BCC: [email protected] CC: Linux Memory Management List <[email protected]> TO: Johnson Wang <[email protected]> CC: Chanwoo Choi <[email protected]> CC: "Jia-Wei Chang" <[email protected]>
tree: https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git master head: f2528c29385819a84480cacef4886b049761e2c5 commit: b615b00c42da1ea59aefbd6c98b08b1afabb9d1e [5859/8914] PM / devfreq: mediatek: Introduce MediaTek CCI devfreq driver :::::: branch date: 3 days ago :::::: commit date: 11 days ago config: microblaze-randconfig-m031-20220706 (https://download.01.org/0day-ci/archive/20220711/[email protected]/config) compiler: microblaze-linux-gcc (GCC) 11.3.0 If you fix the issue, kindly add following tag where applicable Reported-by: kernel test robot <[email protected]> Reported-by: Dan Carpenter <[email protected]> smatch warnings: drivers/devfreq/mtk-cci-devfreq.c:135 mtk_ccifreq_target() warn: variable dereferenced before check 'drv' (see line 130) vim +/drv +135 drivers/devfreq/mtk-cci-devfreq.c b615b00c42da1e Johnson Wang 2022-06-07 125 b615b00c42da1e Johnson Wang 2022-06-07 126 static int mtk_ccifreq_target(struct device *dev, unsigned long *freq, b615b00c42da1e Johnson Wang 2022-06-07 127 u32 flags) b615b00c42da1e Johnson Wang 2022-06-07 128 { b615b00c42da1e Johnson Wang 2022-06-07 129 struct mtk_ccifreq_drv *drv = dev_get_drvdata(dev); b615b00c42da1e Johnson Wang 2022-06-07 @130 struct clk *cci_pll = clk_get_parent(drv->cci_clk); b615b00c42da1e Johnson Wang 2022-06-07 131 struct dev_pm_opp *opp; b615b00c42da1e Johnson Wang 2022-06-07 132 unsigned long opp_rate; b615b00c42da1e Johnson Wang 2022-06-07 133 int voltage, pre_voltage, inter_voltage, target_voltage, ret; b615b00c42da1e Johnson Wang 2022-06-07 134 b615b00c42da1e Johnson Wang 2022-06-07 @135 if (!drv) b615b00c42da1e Johnson Wang 2022-06-07 136 return -EINVAL; b615b00c42da1e Johnson Wang 2022-06-07 137 b615b00c42da1e Johnson Wang 2022-06-07 138 if (drv->pre_freq == *freq) b615b00c42da1e Johnson Wang 2022-06-07 139 return 0; b615b00c42da1e Johnson Wang 2022-06-07 140 b615b00c42da1e Johnson Wang 2022-06-07 141 inter_voltage = drv->inter_voltage; b615b00c42da1e Johnson Wang 2022-06-07 142 b615b00c42da1e Johnson Wang 2022-06-07 143 opp_rate = *freq; b615b00c42da1e Johnson Wang 2022-06-07 144 opp = devfreq_recommended_opp(dev, &opp_rate, 1); b615b00c42da1e Johnson Wang 2022-06-07 145 if (IS_ERR(opp)) { b615b00c42da1e Johnson Wang 2022-06-07 146 dev_err(dev, "failed to find opp for freq: %ld\n", opp_rate); b615b00c42da1e Johnson Wang 2022-06-07 147 return PTR_ERR(opp); b615b00c42da1e Johnson Wang 2022-06-07 148 } b615b00c42da1e Johnson Wang 2022-06-07 149 b615b00c42da1e Johnson Wang 2022-06-07 150 mutex_lock(&drv->reg_lock); b615b00c42da1e Johnson Wang 2022-06-07 151 b615b00c42da1e Johnson Wang 2022-06-07 152 voltage = dev_pm_opp_get_voltage(opp); b615b00c42da1e Johnson Wang 2022-06-07 153 dev_pm_opp_put(opp); b615b00c42da1e Johnson Wang 2022-06-07 154 b615b00c42da1e Johnson Wang 2022-06-07 155 pre_voltage = regulator_get_voltage(drv->proc_reg); b615b00c42da1e Johnson Wang 2022-06-07 156 if (pre_voltage < 0) { b615b00c42da1e Johnson Wang 2022-06-07 157 dev_err(dev, "invalid vproc value: %d\n", pre_voltage); b615b00c42da1e Johnson Wang 2022-06-07 158 ret = pre_voltage; b615b00c42da1e Johnson Wang 2022-06-07 159 goto out_unlock; b615b00c42da1e Johnson Wang 2022-06-07 160 } b615b00c42da1e Johnson Wang 2022-06-07 161 b615b00c42da1e Johnson Wang 2022-06-07 162 /* scale up: set voltage first then freq. */ b615b00c42da1e Johnson Wang 2022-06-07 163 target_voltage = max(inter_voltage, voltage); b615b00c42da1e Johnson Wang 2022-06-07 164 if (pre_voltage <= target_voltage) { b615b00c42da1e Johnson Wang 2022-06-07 165 ret = mtk_ccifreq_set_voltage(drv, target_voltage); b615b00c42da1e Johnson Wang 2022-06-07 166 if (ret) { b615b00c42da1e Johnson Wang 2022-06-07 167 dev_err(dev, "failed to scale up voltage\n"); b615b00c42da1e Johnson Wang 2022-06-07 168 goto out_restore_voltage; b615b00c42da1e Johnson Wang 2022-06-07 169 } b615b00c42da1e Johnson Wang 2022-06-07 170 } b615b00c42da1e Johnson Wang 2022-06-07 171 b615b00c42da1e Johnson Wang 2022-06-07 172 /* switch the cci clock to intermediate clock source. */ b615b00c42da1e Johnson Wang 2022-06-07 173 ret = clk_set_parent(drv->cci_clk, drv->inter_clk); b615b00c42da1e Johnson Wang 2022-06-07 174 if (ret) { b615b00c42da1e Johnson Wang 2022-06-07 175 dev_err(dev, "failed to re-parent cci clock\n"); b615b00c42da1e Johnson Wang 2022-06-07 176 goto out_restore_voltage; b615b00c42da1e Johnson Wang 2022-06-07 177 } b615b00c42da1e Johnson Wang 2022-06-07 178 b615b00c42da1e Johnson Wang 2022-06-07 179 /* set the original clock to target rate. */ b615b00c42da1e Johnson Wang 2022-06-07 180 ret = clk_set_rate(cci_pll, *freq); b615b00c42da1e Johnson Wang 2022-06-07 181 if (ret) { b615b00c42da1e Johnson Wang 2022-06-07 182 dev_err(dev, "failed to set cci pll rate: %d\n", ret); b615b00c42da1e Johnson Wang 2022-06-07 183 clk_set_parent(drv->cci_clk, cci_pll); b615b00c42da1e Johnson Wang 2022-06-07 184 goto out_restore_voltage; b615b00c42da1e Johnson Wang 2022-06-07 185 } b615b00c42da1e Johnson Wang 2022-06-07 186 b615b00c42da1e Johnson Wang 2022-06-07 187 /* switch the cci clock back to the original clock source. */ b615b00c42da1e Johnson Wang 2022-06-07 188 ret = clk_set_parent(drv->cci_clk, cci_pll); b615b00c42da1e Johnson Wang 2022-06-07 189 if (ret) { b615b00c42da1e Johnson Wang 2022-06-07 190 dev_err(dev, "failed to re-parent cci clock\n"); b615b00c42da1e Johnson Wang 2022-06-07 191 mtk_ccifreq_set_voltage(drv, inter_voltage); b615b00c42da1e Johnson Wang 2022-06-07 192 goto out_unlock; b615b00c42da1e Johnson Wang 2022-06-07 193 } b615b00c42da1e Johnson Wang 2022-06-07 194 b615b00c42da1e Johnson Wang 2022-06-07 195 /* b615b00c42da1e Johnson Wang 2022-06-07 196 * If the new voltage is lower than the intermediate voltage or the b615b00c42da1e Johnson Wang 2022-06-07 197 * original voltage, scale down to the new voltage. b615b00c42da1e Johnson Wang 2022-06-07 198 */ b615b00c42da1e Johnson Wang 2022-06-07 199 if (voltage < inter_voltage || voltage < pre_voltage) { b615b00c42da1e Johnson Wang 2022-06-07 200 ret = mtk_ccifreq_set_voltage(drv, voltage); b615b00c42da1e Johnson Wang 2022-06-07 201 if (ret) { b615b00c42da1e Johnson Wang 2022-06-07 202 dev_err(dev, "failed to scale down voltage\n"); b615b00c42da1e Johnson Wang 2022-06-07 203 goto out_unlock; b615b00c42da1e Johnson Wang 2022-06-07 204 } b615b00c42da1e Johnson Wang 2022-06-07 205 } b615b00c42da1e Johnson Wang 2022-06-07 206 b615b00c42da1e Johnson Wang 2022-06-07 207 drv->pre_freq = *freq; b615b00c42da1e Johnson Wang 2022-06-07 208 mutex_unlock(&drv->reg_lock); b615b00c42da1e Johnson Wang 2022-06-07 209 b615b00c42da1e Johnson Wang 2022-06-07 210 return 0; b615b00c42da1e Johnson Wang 2022-06-07 211 b615b00c42da1e Johnson Wang 2022-06-07 212 out_restore_voltage: b615b00c42da1e Johnson Wang 2022-06-07 213 mtk_ccifreq_set_voltage(drv, pre_voltage); b615b00c42da1e Johnson Wang 2022-06-07 214 b615b00c42da1e Johnson Wang 2022-06-07 215 out_unlock: b615b00c42da1e Johnson Wang 2022-06-07 216 mutex_unlock(&drv->reg_lock); b615b00c42da1e Johnson Wang 2022-06-07 217 return ret; b615b00c42da1e Johnson Wang 2022-06-07 218 } b615b00c42da1e Johnson Wang 2022-06-07 219 -- 0-DAY CI Kernel Test Service https://01.org/lkp _______________________________________________ kbuild mailing list -- [email protected] To unsubscribe send an email to [email protected]
