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

[media] si2157: Add support for Si2141-A10

The Si2141 needs two distinct commands for powerup/reset, otherwise it
will not respond to chip revision requests. It also needs a firmware
to run properly.

Cc: Evgeny Plehov <EvgenyPlehov@ukr.net>
Signed-off-by: Stefan Brüns <stefan.bruens@rwth-aachen.de>
Signed-off-by: Antti Palosaari <crope@iki.fi>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>

authored by

Stefan Brüns and committed by
Mauro Carvalho Chehab
3a2824c7 297e14d5

+23 -2
+21 -2
drivers/media/tuners/si2157.c
··· 106 106 if (dev->chiptype == SI2157_CHIPTYPE_SI2146) { 107 107 memcpy(cmd.args, "\xc0\x05\x01\x00\x00\x0b\x00\x00\x01", 9); 108 108 cmd.wlen = 9; 109 + } else if (dev->chiptype == SI2157_CHIPTYPE_SI2141) { 110 + memcpy(cmd.args, "\xc0\x00\x0d\x0e\x00\x01\x01\x01\x01\x03", 10); 111 + cmd.wlen = 10; 109 112 } else { 110 113 memcpy(cmd.args, "\xc0\x00\x0c\x00\x00\x01\x01\x01\x01\x01\x01\x02\x00\x00\x01", 15); 111 114 cmd.wlen = 15; ··· 117 114 ret = si2157_cmd_execute(client, &cmd); 118 115 if (ret) 119 116 goto err; 117 + 118 + /* Si2141 needs a second command before it answers the revision query */ 119 + if (dev->chiptype == SI2157_CHIPTYPE_SI2141) { 120 + memcpy(cmd.args, "\xc0\x08\x01\x02\x00\x00\x01", 7); 121 + cmd.wlen = 7; 122 + ret = si2157_cmd_execute(client, &cmd); 123 + if (ret) 124 + goto err; 125 + } 120 126 121 127 /* query chip revision */ 122 128 memcpy(cmd.args, "\x02", 1); ··· 143 131 #define SI2157_A30 ('A' << 24 | 57 << 16 | '3' << 8 | '0' << 0) 144 132 #define SI2147_A30 ('A' << 24 | 47 << 16 | '3' << 8 | '0' << 0) 145 133 #define SI2146_A10 ('A' << 24 | 46 << 16 | '1' << 8 | '0' << 0) 134 + #define SI2141_A10 ('A' << 24 | 41 << 16 | '1' << 8 | '0' << 0) 146 135 147 136 switch (chip_id) { 148 137 case SI2158_A20: 149 138 case SI2148_A20: 150 139 fw_name = SI2158_A20_FIRMWARE; 140 + break; 141 + case SI2141_A10: 142 + fw_name = SI2141_A10_FIRMWARE; 151 143 break; 152 144 case SI2157_A30: 153 145 case SI2147_A30: ··· 387 371 388 372 static const struct dvb_tuner_ops si2157_ops = { 389 373 .info = { 390 - .name = "Silicon Labs Si2146/2147/2148/2157/2158", 374 + .name = "Silicon Labs Si2141/Si2146/2147/2148/2157/2158", 391 375 .frequency_min = 42000000, 392 376 .frequency_max = 870000000, 393 377 }, ··· 487 471 #endif 488 472 489 473 dev_info(&client->dev, "Silicon Labs %s successfully attached\n", 474 + dev->chiptype == SI2157_CHIPTYPE_SI2141 ? "Si2141" : 490 475 dev->chiptype == SI2157_CHIPTYPE_SI2146 ? 491 476 "Si2146" : "Si2147/2148/2157/2158"); 492 477 ··· 525 508 static const struct i2c_device_id si2157_id_table[] = { 526 509 {"si2157", SI2157_CHIPTYPE_SI2157}, 527 510 {"si2146", SI2157_CHIPTYPE_SI2146}, 511 + {"si2141", SI2157_CHIPTYPE_SI2141}, 528 512 {} 529 513 }; 530 514 MODULE_DEVICE_TABLE(i2c, si2157_id_table); ··· 542 524 543 525 module_i2c_driver(si2157_driver); 544 526 545 - MODULE_DESCRIPTION("Silicon Labs Si2146/2147/2148/2157/2158 silicon tuner driver"); 527 + MODULE_DESCRIPTION("Silicon Labs Si2141/Si2146/2147/2148/2157/2158 silicon tuner driver"); 546 528 MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>"); 547 529 MODULE_LICENSE("GPL"); 548 530 MODULE_FIRMWARE(SI2158_A20_FIRMWARE); 531 + MODULE_FIRMWARE(SI2141_A10_FIRMWARE);
+2
drivers/media/tuners/si2157_priv.h
··· 42 42 43 43 #define SI2157_CHIPTYPE_SI2157 0 44 44 #define SI2157_CHIPTYPE_SI2146 1 45 + #define SI2157_CHIPTYPE_SI2141 2 45 46 46 47 /* firmware command struct */ 47 48 #define SI2157_ARGLEN 30 ··· 53 52 }; 54 53 55 54 #define SI2158_A20_FIRMWARE "dvb-tuner-si2158-a20-01.fw" 55 + #define SI2141_A10_FIRMWARE "dvb-tuner-si2141-a10-01.fw" 56 56 57 57 #endif