Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'v6.17-next-soc' of https://git.kernel.org/pub/scm/linux/kernel/git/mediatek/linux into soc/drivers

mtk-svs:
* Drop reference taken on probe failure

* tag 'v6.17-next-soc' of https://git.kernel.org/pub/scm/linux/kernel/git/mediatek/linux:
soc: mediatek: mtk-svs: fix device leaks on mt8192 probe failure
soc: mediatek: mtk-svs: fix device leaks on mt8183 probe failure

Link: https://lore.kernel.org/r/87c8f50b-90a5-47ed-af60-99a4e075a266@gmail.com
Signed-off-by: Arnd Bergmann <arnd@arndb.de>

+23
+23
drivers/soc/mediatek/mtk-svs.c
··· 2165 2165 return dev; 2166 2166 } 2167 2167 2168 + static void svs_put_device(void *_dev) 2169 + { 2170 + struct device *dev = _dev; 2171 + 2172 + put_device(dev); 2173 + } 2174 + 2168 2175 static int svs_mt8192_platform_probe(struct svs_platform *svsp) 2169 2176 { 2170 2177 struct device *dev; 2171 2178 u32 idx; 2179 + int ret; 2172 2180 2173 2181 svsp->rst = devm_reset_control_get_optional(svsp->dev, "svs_rst"); 2174 2182 if (IS_ERR(svsp->rst)) ··· 2187 2179 if (IS_ERR(dev)) 2188 2180 return dev_err_probe(svsp->dev, PTR_ERR(dev), 2189 2181 "failed to get lvts device\n"); 2182 + put_device(dev); 2190 2183 2191 2184 for (idx = 0; idx < svsp->bank_max; idx++) { 2192 2185 struct svs_bank *svsb = &svsp->banks[idx]; ··· 2197 2188 case SVSB_SWID_CPU_LITTLE: 2198 2189 case SVSB_SWID_CPU_BIG: 2199 2190 svsb->opp_dev = get_cpu_device(bdata->cpu_id); 2191 + get_device(svsb->opp_dev); 2200 2192 break; 2201 2193 case SVSB_SWID_CCI: 2202 2194 svsb->opp_dev = svs_add_device_link(svsp, "cci"); ··· 2217 2207 return dev_err_probe(svsp->dev, PTR_ERR(svsb->opp_dev), 2218 2208 "failed to get OPP device for bank %d\n", 2219 2209 idx); 2210 + 2211 + ret = devm_add_action_or_reset(svsp->dev, svs_put_device, 2212 + svsb->opp_dev); 2213 + if (ret) 2214 + return ret; 2220 2215 } 2221 2216 2222 2217 return 0; ··· 2231 2216 { 2232 2217 struct device *dev; 2233 2218 u32 idx; 2219 + int ret; 2234 2220 2235 2221 dev = svs_add_device_link(svsp, "thermal-sensor"); 2236 2222 if (IS_ERR(dev)) 2237 2223 return dev_err_probe(svsp->dev, PTR_ERR(dev), 2238 2224 "failed to get thermal device\n"); 2225 + put_device(dev); 2239 2226 2240 2227 for (idx = 0; idx < svsp->bank_max; idx++) { 2241 2228 struct svs_bank *svsb = &svsp->banks[idx]; ··· 2247 2230 case SVSB_SWID_CPU_LITTLE: 2248 2231 case SVSB_SWID_CPU_BIG: 2249 2232 svsb->opp_dev = get_cpu_device(bdata->cpu_id); 2233 + get_device(svsb->opp_dev); 2250 2234 break; 2251 2235 case SVSB_SWID_CCI: 2252 2236 svsb->opp_dev = svs_add_device_link(svsp, "cci"); ··· 2264 2246 return dev_err_probe(svsp->dev, PTR_ERR(svsb->opp_dev), 2265 2247 "failed to get OPP device for bank %d\n", 2266 2248 idx); 2249 + 2250 + ret = devm_add_action_or_reset(svsp->dev, svs_put_device, 2251 + svsb->opp_dev); 2252 + if (ret) 2253 + return ret; 2267 2254 } 2268 2255 2269 2256 return 0;