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

[media] media: tuner xc5000 - release firmwware from xc5000_release()

xc5000 releases firmware right after loading it. Change it to
save the firmware and release it from xc5000_release(). This
helps avoid fecthing firmware when forced firmware load requests
come in to change analog tv frequence and when firmware needs to
be reloaded after suspend and resume.

Signed-off-by: Shuah Khan <shuahkh@osg.samsung.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>

authored by

Shuah Khan and committed by
Mauro Carvalho Chehab
5264a522 8eb988f1

+20 -14
+20 -14
drivers/media/tuners/xc5000.c
··· 70 70 71 71 struct dvb_frontend *fe; 72 72 struct delayed_work timer_sleep; 73 + 74 + const struct firmware *firmware; 73 75 }; 74 76 75 77 /* Misc Defines */ ··· 1138 1136 if (!force && xc5000_is_firmware_loaded(fe) == 0) 1139 1137 return 0; 1140 1138 1141 - ret = request_firmware(&fw, desired_fw->name, 1142 - priv->i2c_props.adap->dev.parent); 1143 - if (ret) { 1144 - printk(KERN_ERR "xc5000: Upload failed. (file not found?)\n"); 1145 - return ret; 1146 - } 1139 + if (!priv->firmware) { 1140 + ret = request_firmware(&fw, desired_fw->name, 1141 + priv->i2c_props.adap->dev.parent); 1142 + if (ret) { 1143 + pr_err("xc5000: Upload failed. rc %d\n", ret); 1144 + return ret; 1145 + } 1146 + dprintk(1, "firmware read %Zu bytes.\n", fw->size); 1147 1147 1148 - dprintk(1, "firmware read %Zu bytes.\n", fw->size); 1149 - 1150 - if (fw->size != desired_fw->size) { 1151 - printk(KERN_ERR "xc5000: Firmware file with incorrect size\n"); 1152 - ret = -EINVAL; 1153 - goto err; 1154 - } 1148 + if (fw->size != desired_fw->size) { 1149 + pr_err("xc5000: Firmware file with incorrect size\n"); 1150 + release_firmware(fw); 1151 + return -EINVAL; 1152 + } 1153 + priv->firmware = fw; 1154 + } else 1155 + fw = priv->firmware; 1155 1156 1156 1157 /* Try up to 5 times to load firmware */ 1157 1158 for (i = 0; i < 5; i++) { ··· 1237 1232 else 1238 1233 printk(KERN_CONT " - too many retries. Giving up\n"); 1239 1234 1240 - release_firmware(fw); 1241 1235 return ret; 1242 1236 } 1243 1237 ··· 1320 1316 if (priv) { 1321 1317 cancel_delayed_work(&priv->timer_sleep); 1322 1318 hybrid_tuner_release_state(priv); 1319 + if (priv->firmware) 1320 + release_firmware(priv->firmware); 1323 1321 } 1324 1322 1325 1323 mutex_unlock(&xc5000_list_mutex);