summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPunnay Sharma <punnaysharma805@gmail.com>2026-08-08 00:04:43 +0530
committerHans Verkuil <hverkuil+cisco@kernel.org>2026-09-08 15:07:04 +0200
commit30684fa98394bc0eb4362282908612aab7d4dad9 (patch)
tree1e43b38df311aa0d9745a062e464ca3f60ce8c0b
parent5764f9bd7b7a72c6df49db6c8c00d4f9994a55ba (diff)
downloadlinux-next-30684fa98394bc0eb4362282908612aab7d4dad9.tar.gz
linux-next-30684fa98394bc0eb4362282908612aab7d4dad9.zip
staging: media: av7110: fix sp8870 initialization failure state
The SP8870 DVB frontend driver prematurely flags the device as initialized at the very beginning of the sp8870_init() routine, prior to requesting the firmware (dvb-fe-sp8870.fw) and executing the I2C upload sequence. If request_firmware() times out or sp8870_firmware_upload() encounters an I2C bus error, the function aborts and returns -EIO. However, because `state->initialised` is already set to 1, all subsequent invocations of `fe->ops.init()` by the DVB core will immediately return 0 (success) without attempting to load the firmware again. This leaves the demodulator microcontroller halted and the frontend permanently dead until the module is forcibly reloaded. Relocate the `state->initialised = 1` assignment to the end of sp8870_init(), ensuring the flag is only set after the firmware is successfully uploaded and the system controller is actually restarted. Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2") Cc: stable@vger.kernel.org Signed-off-by: Punnay Sharma <punnaysharma805@gmail.com> Signed-off-by: Hans Verkuil <hverkuil+cisco@kernel.org>
-rw-r--r--drivers/staging/media/av7110/sp8870.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/drivers/staging/media/av7110/sp8870.c b/drivers/staging/media/av7110/sp8870.c
index 340e4b22859d..aecdbd87976f 100644
--- a/drivers/staging/media/av7110/sp8870.c
+++ b/drivers/staging/media/av7110/sp8870.c
@@ -315,7 +315,6 @@ static int sp8870_init(struct dvb_frontend *fe)
sp8870_wake_up(state);
if (state->initialised)
return 0;
- state->initialised = 1;
dprintk("initialising frontend...\n");
@@ -353,6 +352,8 @@ static int sp8870_init(struct dvb_frontend *fe)
sp8870_writereg(state, 0x0D00, 0x010);
sp8870_writereg(state, 0x0D01, 0x000);
+ state->initialised = 1;
+
return 0;
}