提交 099b7fcc 编写于 作者: M Mauro Carvalho Chehab

V4L/DVB (9618): tvaudio: add additional logic to avoid OOPS

This patch checks for volume, bass, treble, set mode and get mode
callbacks before actually enabling the code that would use them.

Instead of aborting the driver for load, this patch will allow it to
load with a reduced number of functionatities.

This prevents OOPS if some board entry is missing a needed callback.
Signed-off-by: NMauro Carvalho Chehab <mchehab@redhat.com>
上级 dd03e970
...@@ -1511,20 +1511,49 @@ static int chip_probe(struct i2c_client *client, const struct i2c_device_id *id) ...@@ -1511,20 +1511,49 @@ static int chip_probe(struct i2c_client *client, const struct i2c_device_id *id)
chip_cmd(chip,"init",&desc->init); chip_cmd(chip,"init",&desc->init);
if (desc->flags & CHIP_HAS_VOLUME) { if (desc->flags & CHIP_HAS_VOLUME) {
if (!desc->volfunc) {
/* This shouldn't be happen. Warn user, but keep working
without volume controls
*/
v4l_info(chip->c, "volume callback undefined!\n");
desc->flags &= ~CHIP_HAS_VOLUME;
} else {
chip->left = desc->leftinit ? desc->leftinit : 65535; chip->left = desc->leftinit ? desc->leftinit : 65535;
chip->right = desc->rightinit ? desc->rightinit : 65535; chip->right = desc->rightinit ? desc->rightinit : 65535;
chip_write(chip,desc->leftreg,desc->volfunc(chip->left)); chip_write(chip, desc->leftreg,
chip_write(chip,desc->rightreg,desc->volfunc(chip->right)); desc->volfunc(chip->left));
chip_write(chip, desc->rightreg,
desc->volfunc(chip->right));
}
} }
if (desc->flags & CHIP_HAS_BASSTREBLE) { if (desc->flags & CHIP_HAS_BASSTREBLE) {
chip->treble = desc->trebleinit ? desc->trebleinit : 32768; if (!desc->bassfunc || !desc->treblefunc) {
chip->bass = desc->bassinit ? desc->bassinit : 32768; /* This shouldn't be happen. Warn user, but keep working
chip_write(chip,desc->bassreg,desc->bassfunc(chip->bass)); without bass/treble controls
chip_write(chip,desc->treblereg,desc->treblefunc(chip->treble)); */
v4l_info(chip->c, "bass/treble callbacks undefined!\n");
desc->flags &= ~CHIP_HAS_BASSTREBLE;
} else {
chip->treble = desc->trebleinit ?
desc->trebleinit : 32768;
chip->bass = desc->bassinit ?
desc->bassinit : 32768;
chip_write(chip, desc->bassreg,
desc->bassfunc(chip->bass));
chip_write(chip, desc->treblereg,
desc->treblefunc(chip->treble));
}
} }
chip->thread = NULL; chip->thread = NULL;
if (desc->flags & CHIP_NEED_CHECKMODE) { if (desc->flags & CHIP_NEED_CHECKMODE) {
if (!desc->getmode || !desc->setmode) {
/* This shouldn't be happen. Warn user, but keep working
without kthread
*/
v4l_info(chip->c, "set/get mode callbacks undefined!\n");
return 0;
}
/* start async thread */ /* start async thread */
init_timer(&chip->wt); init_timer(&chip->wt);
chip->wt.function = chip_thread_wake; chip->wt.function = chip_thread_wake;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册