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

[media] si2165: Load driver for all hardware revisions

Current firmware is only for revision D.

Signed-off-by: Matthias Schwarzott <zzam@gentoo.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>

authored by

Matthias Schwarzott and committed by
Mauro Carvalho Chehab
55bea400 1eb96047

+18 -10
+17 -9
drivers/media/dvb-frontends/si2165.c
··· 44 44 45 45 struct si2165_config config; 46 46 47 - /* chip revision */ 48 - u8 revcode; 49 - /* chip type */ 47 + u8 chip_revcode; 50 48 u8 chip_type; 51 49 52 50 /* calculated by xtal and div settings */ ··· 405 407 int ret; 406 408 407 409 const struct firmware *fw = NULL; 408 - u8 *fw_file = SI2165_FIRMWARE; 410 + u8 *fw_file; 409 411 const u8 *data; 410 412 u32 len; 411 413 u32 offset; ··· 413 415 u8 block_count; 414 416 u16 crc_expected; 415 417 418 + switch (state->chip_revcode) { 419 + case 0x03: /* revision D */ 420 + fw_file = SI2165_FIRMWARE_REV_D; 421 + break; 422 + default: 423 + dev_info(&state->i2c->dev, "%s: no firmware file for revision=%d\n", 424 + KBUILD_MODNAME, state->chip_revcode); 425 + return 0; 426 + } 427 + 416 428 /* request the firmware, this will block and timeout */ 417 429 ret = request_firmware(&fw, fw_file, state->i2c->dev.parent); 418 430 if (ret) { 419 - dev_warn(&state->i2c->dev, "%s: firmare file '%s' not found\n", 431 + dev_warn(&state->i2c->dev, "%s: firmware file '%s' not found\n", 420 432 KBUILD_MODNAME, fw_file); 421 433 goto error; 422 434 } ··· 992 984 if (val != state->config.chip_mode) 993 985 goto error; 994 986 995 - io_ret = si2165_readreg8(state, 0x0023 , &state->revcode); 987 + io_ret = si2165_readreg8(state, 0x0023, &state->chip_revcode); 996 988 if (io_ret < 0) 997 989 goto error; 998 990 ··· 1006 998 goto error; 1007 999 1008 1000 dev_info(&state->i2c->dev, "%s: hardware revision 0x%02x, chip type 0x%02x\n", 1009 - KBUILD_MODNAME, state->revcode, state->chip_type); 1001 + KBUILD_MODNAME, state->chip_revcode, state->chip_type); 1010 1002 1011 1003 /* It is a guess that register 0x0118 (chip type?) can be used to 1012 1004 * differ between si2161, si2163 and si2165 1013 1005 * Only si2165 has been tested. 1014 1006 */ 1015 - if (state->revcode == 0x03 && state->chip_type == 0x07) { 1007 + if (state->chip_type == 0x07) { 1016 1008 state->has_dvbt = true; 1017 1009 state->has_dvbc = true; 1018 1010 } else { ··· 1045 1037 MODULE_DESCRIPTION("Silicon Labs Si2165 DVB-C/-T Demodulator driver"); 1046 1038 MODULE_AUTHOR("Matthias Schwarzott <zzam@gentoo.org>"); 1047 1039 MODULE_LICENSE("GPL"); 1048 - MODULE_FIRMWARE(SI2165_FIRMWARE); 1040 + MODULE_FIRMWARE(SI2165_FIRMWARE_REV_D);
+1 -1
drivers/media/dvb-frontends/si2165_priv.h
··· 18 18 #ifndef _DVB_SI2165_PRIV 19 19 #define _DVB_SI2165_PRIV 20 20 21 - #define SI2165_FIRMWARE "dvb-demod-si2165.fw" 21 + #define SI2165_FIRMWARE_REV_D "dvb-demod-si2165.fw" 22 22 23 23 #endif /* _DVB_SI2165_PRIV */