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

media: st_rc: Handle errors of clk_prepare_enable()

Hadle errors of clk_prepare_enable() in st_rc_hardware_init() and its
callers.

Found by Linux Driver Verification project (linuxtesting.org).

Signed-off-by: Evgeny Novikov <novikov@ispras.ru>
Signed-off-by: Sean Young <sean@mess.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>

authored by

Evgeny Novikov and committed by
Mauro Carvalho Chehab
04297b00 da9a805b

+18 -4
+18 -4
drivers/media/rc/st_rc.c
··· 157 157 return IRQ_HANDLED; 158 158 } 159 159 160 - static void st_rc_hardware_init(struct st_rc_device *dev) 160 + static int st_rc_hardware_init(struct st_rc_device *dev) 161 161 { 162 + int ret; 162 163 int baseclock, freqdiff; 163 164 unsigned int rx_max_symbol_per = MAX_SYMB_TIME; 164 165 unsigned int rx_sampling_freq_div; ··· 167 166 /* Enable the IP */ 168 167 reset_control_deassert(dev->rstc); 169 168 170 - clk_prepare_enable(dev->sys_clock); 169 + ret = clk_prepare_enable(dev->sys_clock); 170 + if (ret) { 171 + dev_err(dev->dev, "Failed to prepare/enable system clock\n"); 172 + return ret; 173 + } 174 + 171 175 baseclock = clk_get_rate(dev->sys_clock); 172 176 173 177 /* IRB input pins are inverted internally from high to low. */ ··· 190 184 } 191 185 192 186 writel(rx_max_symbol_per, dev->rx_base + IRB_MAX_SYM_PERIOD); 187 + 188 + return 0; 193 189 } 194 190 195 191 static int st_rc_remove(struct platform_device *pdev) ··· 295 287 296 288 rc_dev->dev = dev; 297 289 platform_set_drvdata(pdev, rc_dev); 298 - st_rc_hardware_init(rc_dev); 290 + ret = st_rc_hardware_init(rc_dev); 291 + if (ret) 292 + goto err; 299 293 300 294 rdev->allowed_protocols = RC_PROTO_BIT_ALL_IR_DECODER; 301 295 /* rx sampling rate is 10Mhz */ ··· 369 359 370 360 static int st_rc_resume(struct device *dev) 371 361 { 362 + int ret; 372 363 struct st_rc_device *rc_dev = dev_get_drvdata(dev); 373 364 struct rc_dev *rdev = rc_dev->rdev; 374 365 ··· 378 367 rc_dev->irq_wake = 0; 379 368 } else { 380 369 pinctrl_pm_select_default_state(dev); 381 - st_rc_hardware_init(rc_dev); 370 + ret = st_rc_hardware_init(rc_dev); 371 + if (ret) 372 + return ret; 373 + 382 374 if (rdev->users) { 383 375 writel(IRB_RX_INTS, rc_dev->rx_base + IRB_RX_INT_EN); 384 376 writel(0x01, rc_dev->rx_base + IRB_RX_EN);