aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/i2c/saa7115.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/media/i2c/saa7115.c')
-rw-r--r--drivers/media/i2c/saa7115.c105
1 files changed, 48 insertions, 57 deletions
diff --git a/drivers/media/i2c/saa7115.c b/drivers/media/i2c/saa7115.c
index 4daa81c55a82..90c43f3fb0f1 100644
--- a/drivers/media/i2c/saa7115.c
+++ b/drivers/media/i2c/saa7115.c
@@ -46,7 +46,6 @@
46#include <linux/videodev2.h> 46#include <linux/videodev2.h>
47#include <media/v4l2-device.h> 47#include <media/v4l2-device.h>
48#include <media/v4l2-ctrls.h> 48#include <media/v4l2-ctrls.h>
49#include <media/v4l2-chip-ident.h>
50#include <media/saa7115.h> 49#include <media/saa7115.h>
51#include <asm/div64.h> 50#include <asm/div64.h>
52 51
@@ -63,6 +62,16 @@ module_param(debug, bool, 0644);
63MODULE_PARM_DESC(debug, "Debug level (0-1)"); 62MODULE_PARM_DESC(debug, "Debug level (0-1)");
64 63
65 64
65enum saa711x_model {
66 SAA7111A,
67 SAA7111,
68 SAA7113,
69 GM7113C,
70 SAA7114,
71 SAA7115,
72 SAA7118,
73};
74
66struct saa711x_state { 75struct saa711x_state {
67 struct v4l2_subdev sd; 76 struct v4l2_subdev sd;
68 struct v4l2_ctrl_handler hdl; 77 struct v4l2_ctrl_handler hdl;
@@ -80,7 +89,7 @@ struct saa711x_state {
80 int radio; 89 int radio;
81 int width; 90 int width;
82 int height; 91 int height;
83 u32 ident; 92 enum saa711x_model ident;
84 u32 audclk_freq; 93 u32 audclk_freq;
85 u32 crystal_freq; 94 u32 crystal_freq;
86 bool ucgc; 95 bool ucgc;
@@ -111,10 +120,10 @@ static inline int saa711x_write(struct v4l2_subdev *sd, u8 reg, u8 value)
111/* Sanity routine to check if a register is present */ 120/* Sanity routine to check if a register is present */
112static int saa711x_has_reg(const int id, const u8 reg) 121static int saa711x_has_reg(const int id, const u8 reg)
113{ 122{
114 if (id == V4L2_IDENT_SAA7111) 123 if (id == SAA7111)
115 return reg < 0x20 && reg != 0x01 && reg != 0x0f && 124 return reg < 0x20 && reg != 0x01 && reg != 0x0f &&
116 (reg < 0x13 || reg > 0x19) && reg != 0x1d && reg != 0x1e; 125 (reg < 0x13 || reg > 0x19) && reg != 0x1d && reg != 0x1e;
117 if (id == V4L2_IDENT_SAA7111A) 126 if (id == SAA7111A)
118 return reg < 0x20 && reg != 0x01 && reg != 0x0f && 127 return reg < 0x20 && reg != 0x01 && reg != 0x0f &&
119 reg != 0x14 && reg != 0x18 && reg != 0x19 && 128 reg != 0x14 && reg != 0x18 && reg != 0x19 &&
120 reg != 0x1d && reg != 0x1e; 129 reg != 0x1d && reg != 0x1e;
@@ -127,18 +136,18 @@ static int saa711x_has_reg(const int id, const u8 reg)
127 return 0; 136 return 0;
128 137
129 switch (id) { 138 switch (id) {
130 case V4L2_IDENT_GM7113C: 139 case GM7113C:
131 return reg != 0x14 && (reg < 0x18 || reg > 0x1e) && reg < 0x20; 140 return reg != 0x14 && (reg < 0x18 || reg > 0x1e) && reg < 0x20;
132 case V4L2_IDENT_SAA7113: 141 case SAA7113:
133 return reg != 0x14 && (reg < 0x18 || reg > 0x1e) && (reg < 0x20 || reg > 0x3f) && 142 return reg != 0x14 && (reg < 0x18 || reg > 0x1e) && (reg < 0x20 || reg > 0x3f) &&
134 reg != 0x5d && reg < 0x63; 143 reg != 0x5d && reg < 0x63;
135 case V4L2_IDENT_SAA7114: 144 case SAA7114:
136 return (reg < 0x1a || reg > 0x1e) && (reg < 0x20 || reg > 0x2f) && 145 return (reg < 0x1a || reg > 0x1e) && (reg < 0x20 || reg > 0x2f) &&
137 (reg < 0x63 || reg > 0x7f) && reg != 0x33 && reg != 0x37 && 146 (reg < 0x63 || reg > 0x7f) && reg != 0x33 && reg != 0x37 &&
138 reg != 0x81 && reg < 0xf0; 147 reg != 0x81 && reg < 0xf0;
139 case V4L2_IDENT_SAA7115: 148 case SAA7115:
140 return (reg < 0x20 || reg > 0x2f) && reg != 0x65 && (reg < 0xfc || reg > 0xfe); 149 return (reg < 0x20 || reg > 0x2f) && reg != 0x65 && (reg < 0xfc || reg > 0xfe);
141 case V4L2_IDENT_SAA7118: 150 case SAA7118:
142 return (reg < 0x1a || reg > 0x1d) && (reg < 0x20 || reg > 0x22) && 151 return (reg < 0x1a || reg > 0x1d) && (reg < 0x20 || reg > 0x22) &&
143 (reg < 0x26 || reg > 0x28) && reg != 0x33 && reg != 0x37 && 152 (reg < 0x26 || reg > 0x28) && reg != 0x33 && reg != 0x37 &&
144 (reg < 0x63 || reg > 0x7f) && reg != 0x81 && reg < 0xf0; 153 (reg < 0x63 || reg > 0x7f) && reg != 0x81 && reg < 0xf0;
@@ -955,14 +964,14 @@ static void saa711x_set_v4lstd(struct v4l2_subdev *sd, v4l2_std_id std)
955 // This works for NTSC-M, SECAM-L and the 50Hz PAL variants. 964 // This works for NTSC-M, SECAM-L and the 50Hz PAL variants.
956 if (std & V4L2_STD_525_60) { 965 if (std & V4L2_STD_525_60) {
957 v4l2_dbg(1, debug, sd, "decoder set standard 60 Hz\n"); 966 v4l2_dbg(1, debug, sd, "decoder set standard 60 Hz\n");
958 if (state->ident == V4L2_IDENT_GM7113C) 967 if (state->ident == GM7113C)
959 saa711x_writeregs(sd, gm7113c_cfg_60hz_video); 968 saa711x_writeregs(sd, gm7113c_cfg_60hz_video);
960 else 969 else
961 saa711x_writeregs(sd, saa7115_cfg_60hz_video); 970 saa711x_writeregs(sd, saa7115_cfg_60hz_video);
962 saa711x_set_size(sd, 720, 480); 971 saa711x_set_size(sd, 720, 480);
963 } else { 972 } else {
964 v4l2_dbg(1, debug, sd, "decoder set standard 50 Hz\n"); 973 v4l2_dbg(1, debug, sd, "decoder set standard 50 Hz\n");
965 if (state->ident == V4L2_IDENT_GM7113C) 974 if (state->ident == GM7113C)
966 saa711x_writeregs(sd, gm7113c_cfg_50hz_video); 975 saa711x_writeregs(sd, gm7113c_cfg_50hz_video);
967 else 976 else
968 saa711x_writeregs(sd, saa7115_cfg_50hz_video); 977 saa711x_writeregs(sd, saa7115_cfg_50hz_video);
@@ -978,8 +987,8 @@ static void saa711x_set_v4lstd(struct v4l2_subdev *sd, v4l2_std_id std)
978 011 NTSC N (3.58MHz) PAL M (3.58MHz) 987 011 NTSC N (3.58MHz) PAL M (3.58MHz)
979 100 reserved NTSC-Japan (3.58MHz) 988 100 reserved NTSC-Japan (3.58MHz)
980 */ 989 */
981 if (state->ident <= V4L2_IDENT_SAA7113 || 990 if (state->ident <= SAA7113 ||
982 state->ident == V4L2_IDENT_GM7113C) { 991 state->ident == GM7113C) {
983 u8 reg = saa711x_read(sd, R_0E_CHROMA_CNTL_1) & 0x8f; 992 u8 reg = saa711x_read(sd, R_0E_CHROMA_CNTL_1) & 0x8f;
984 993
985 if (std == V4L2_STD_PAL_M) { 994 if (std == V4L2_STD_PAL_M) {
@@ -998,9 +1007,8 @@ static void saa711x_set_v4lstd(struct v4l2_subdev *sd, v4l2_std_id std)
998 /* restart task B if needed */ 1007 /* restart task B if needed */
999 int taskb = saa711x_read(sd, R_80_GLOBAL_CNTL_1) & 0x10; 1008 int taskb = saa711x_read(sd, R_80_GLOBAL_CNTL_1) & 0x10;
1000 1009
1001 if (taskb && state->ident == V4L2_IDENT_SAA7114) { 1010 if (taskb && state->ident == SAA7114)
1002 saa711x_writeregs(sd, saa7115_cfg_vbi_on); 1011 saa711x_writeregs(sd, saa7115_cfg_vbi_on);
1003 }
1004 1012
1005 /* switch audio mode too! */ 1013 /* switch audio mode too! */
1006 saa711x_s_clock_freq(sd, state->audclk_freq); 1014 saa711x_s_clock_freq(sd, state->audclk_freq);
@@ -1022,7 +1030,7 @@ static void saa711x_set_lcr(struct v4l2_subdev *sd, struct v4l2_sliced_vbi_forma
1022 1030
1023#else 1031#else
1024 /* SAA7113 and SAA7118 also should support VBI - Need testing */ 1032 /* SAA7113 and SAA7118 also should support VBI - Need testing */
1025 if (state->ident != V4L2_IDENT_SAA7115) 1033 if (state->ident != SAA7115)
1026 return; 1034 return;
1027#endif 1035#endif
1028 1036
@@ -1244,14 +1252,14 @@ static int saa711x_s_routing(struct v4l2_subdev *sd,
1244 u32 input, u32 output, u32 config) 1252 u32 input, u32 output, u32 config)
1245{ 1253{
1246 struct saa711x_state *state = to_state(sd); 1254 struct saa711x_state *state = to_state(sd);
1247 u8 mask = (state->ident <= V4L2_IDENT_SAA7111A) ? 0xf8 : 0xf0; 1255 u8 mask = (state->ident <= SAA7111A) ? 0xf8 : 0xf0;
1248 1256
1249 v4l2_dbg(1, debug, sd, "decoder set input %d output %d\n", 1257 v4l2_dbg(1, debug, sd, "decoder set input %d output %d\n",
1250 input, output); 1258 input, output);
1251 1259
1252 /* saa7111/3 does not have these inputs */ 1260 /* saa7111/3 does not have these inputs */
1253 if ((state->ident <= V4L2_IDENT_SAA7113 || 1261 if ((state->ident <= SAA7113 ||
1254 state->ident == V4L2_IDENT_GM7113C) && 1262 state->ident == GM7113C) &&
1255 (input == SAA7115_COMPOSITE4 || 1263 (input == SAA7115_COMPOSITE4 ||
1256 input == SAA7115_COMPOSITE5)) { 1264 input == SAA7115_COMPOSITE5)) {
1257 return -EINVAL; 1265 return -EINVAL;
@@ -1266,7 +1274,7 @@ static int saa711x_s_routing(struct v4l2_subdev *sd,
1266 state->input = input; 1274 state->input = input;
1267 1275
1268 /* saa7111 has slightly different input numbering */ 1276 /* saa7111 has slightly different input numbering */
1269 if (state->ident <= V4L2_IDENT_SAA7111A) { 1277 if (state->ident <= SAA7111A) {
1270 if (input >= SAA7115_COMPOSITE4) 1278 if (input >= SAA7115_COMPOSITE4)
1271 input -= 2; 1279 input -= 2;
1272 /* saa7111 specific */ 1280 /* saa7111 specific */
@@ -1289,13 +1297,13 @@ static int saa711x_s_routing(struct v4l2_subdev *sd,
1289 (state->input >= SAA7115_SVIDEO0 ? 0x80 : 0x0)); 1297 (state->input >= SAA7115_SVIDEO0 ? 0x80 : 0x0));
1290 1298
1291 state->output = output; 1299 state->output = output;
1292 if (state->ident == V4L2_IDENT_SAA7114 || 1300 if (state->ident == SAA7114 ||
1293 state->ident == V4L2_IDENT_SAA7115) { 1301 state->ident == SAA7115) {
1294 saa711x_write(sd, R_83_X_PORT_I_O_ENA_AND_OUT_CLK, 1302 saa711x_write(sd, R_83_X_PORT_I_O_ENA_AND_OUT_CLK,
1295 (saa711x_read(sd, R_83_X_PORT_I_O_ENA_AND_OUT_CLK) & 0xfe) | 1303 (saa711x_read(sd, R_83_X_PORT_I_O_ENA_AND_OUT_CLK) & 0xfe) |
1296 (state->output & 0x01)); 1304 (state->output & 0x01));
1297 } 1305 }
1298 if (state->ident > V4L2_IDENT_SAA7111A) { 1306 if (state->ident > SAA7111A) {
1299 if (config & SAA7115_IDQ_IS_DEFAULT) 1307 if (config & SAA7115_IDQ_IS_DEFAULT)
1300 saa711x_write(sd, R_85_I_PORT_SIGNAL_POLAR, 0x20); 1308 saa711x_write(sd, R_85_I_PORT_SIGNAL_POLAR, 0x20);
1301 else 1309 else
@@ -1308,7 +1316,7 @@ static int saa711x_s_gpio(struct v4l2_subdev *sd, u32 val)
1308{ 1316{
1309 struct saa711x_state *state = to_state(sd); 1317 struct saa711x_state *state = to_state(sd);
1310 1318
1311 if (state->ident > V4L2_IDENT_SAA7111A) 1319 if (state->ident > SAA7111A)
1312 return -EINVAL; 1320 return -EINVAL;
1313 saa711x_write(sd, 0x11, (saa711x_read(sd, 0x11) & 0x7f) | 1321 saa711x_write(sd, 0x11, (saa711x_read(sd, 0x11) & 0x7f) |
1314 (val ? 0x80 : 0)); 1322 (val ? 0x80 : 0));
@@ -1398,7 +1406,7 @@ static int saa711x_querystd(struct v4l2_subdev *sd, v4l2_std_id *std)
1398 1406
1399 reg1f = saa711x_read(sd, R_1F_STATUS_BYTE_2_VD_DEC); 1407 reg1f = saa711x_read(sd, R_1F_STATUS_BYTE_2_VD_DEC);
1400 1408
1401 if (state->ident == V4L2_IDENT_SAA7115) { 1409 if (state->ident == SAA7115) {
1402 reg1e = saa711x_read(sd, R_1E_STATUS_BYTE_1_VD_DEC); 1410 reg1e = saa711x_read(sd, R_1E_STATUS_BYTE_1_VD_DEC);
1403 1411
1404 v4l2_dbg(1, debug, sd, "Status byte 1 (0x1e)=0x%02x\n", reg1e); 1412 v4l2_dbg(1, debug, sd, "Status byte 1 (0x1e)=0x%02x\n", reg1e);
@@ -1449,7 +1457,7 @@ static int saa711x_g_input_status(struct v4l2_subdev *sd, u32 *status)
1449 int reg1f; 1457 int reg1f;
1450 1458
1451 *status = V4L2_IN_ST_NO_SIGNAL; 1459 *status = V4L2_IN_ST_NO_SIGNAL;
1452 if (state->ident == V4L2_IDENT_SAA7115) 1460 if (state->ident == SAA7115)
1453 reg1e = saa711x_read(sd, R_1E_STATUS_BYTE_1_VD_DEC); 1461 reg1e = saa711x_read(sd, R_1E_STATUS_BYTE_1_VD_DEC);
1454 reg1f = saa711x_read(sd, R_1F_STATUS_BYTE_2_VD_DEC); 1462 reg1f = saa711x_read(sd, R_1F_STATUS_BYTE_2_VD_DEC);
1455 if ((reg1f & 0xc1) == 0x81 && (reg1e & 0xc0) == 0x80) 1463 if ((reg1f & 0xc1) == 0x81 && (reg1e & 0xc0) == 0x80)
@@ -1460,10 +1468,6 @@ static int saa711x_g_input_status(struct v4l2_subdev *sd, u32 *status)
1460#ifdef CONFIG_VIDEO_ADV_DEBUG 1468#ifdef CONFIG_VIDEO_ADV_DEBUG
1461static int saa711x_g_register(struct v4l2_subdev *sd, struct v4l2_dbg_register *reg) 1469static int saa711x_g_register(struct v4l2_subdev *sd, struct v4l2_dbg_register *reg)
1462{ 1470{
1463 struct i2c_client *client = v4l2_get_subdevdata(sd);
1464
1465 if (!v4l2_chip_match_i2c_client(client, &reg->match))
1466 return -EINVAL;
1467 reg->val = saa711x_read(sd, reg->reg & 0xff); 1471 reg->val = saa711x_read(sd, reg->reg & 0xff);
1468 reg->size = 1; 1472 reg->size = 1;
1469 return 0; 1473 return 0;
@@ -1471,23 +1475,11 @@ static int saa711x_g_register(struct v4l2_subdev *sd, struct v4l2_dbg_register *
1471 1475
1472static int saa711x_s_register(struct v4l2_subdev *sd, const struct v4l2_dbg_register *reg) 1476static int saa711x_s_register(struct v4l2_subdev *sd, const struct v4l2_dbg_register *reg)
1473{ 1477{
1474 struct i2c_client *client = v4l2_get_subdevdata(sd);
1475
1476 if (!v4l2_chip_match_i2c_client(client, &reg->match))
1477 return -EINVAL;
1478 saa711x_write(sd, reg->reg & 0xff, reg->val & 0xff); 1478 saa711x_write(sd, reg->reg & 0xff, reg->val & 0xff);
1479 return 0; 1479 return 0;
1480} 1480}
1481#endif 1481#endif
1482 1482
1483static int saa711x_g_chip_ident(struct v4l2_subdev *sd, struct v4l2_dbg_chip_ident *chip)
1484{
1485 struct saa711x_state *state = to_state(sd);
1486 struct i2c_client *client = v4l2_get_subdevdata(sd);
1487
1488 return v4l2_chip_ident_i2c_client(client, chip, state->ident, 0);
1489}
1490
1491static int saa711x_log_status(struct v4l2_subdev *sd) 1483static int saa711x_log_status(struct v4l2_subdev *sd)
1492{ 1484{
1493 struct saa711x_state *state = to_state(sd); 1485 struct saa711x_state *state = to_state(sd);
@@ -1496,7 +1488,7 @@ static int saa711x_log_status(struct v4l2_subdev *sd)
1496 int vcr; 1488 int vcr;
1497 1489
1498 v4l2_info(sd, "Audio frequency: %d Hz\n", state->audclk_freq); 1490 v4l2_info(sd, "Audio frequency: %d Hz\n", state->audclk_freq);
1499 if (state->ident != V4L2_IDENT_SAA7115) { 1491 if (state->ident != SAA7115) {
1500 /* status for the saa7114 */ 1492 /* status for the saa7114 */
1501 reg1f = saa711x_read(sd, R_1F_STATUS_BYTE_2_VD_DEC); 1493 reg1f = saa711x_read(sd, R_1F_STATUS_BYTE_2_VD_DEC);
1502 signalOk = (reg1f & 0xc1) == 0x81; 1494 signalOk = (reg1f & 0xc1) == 0x81;
@@ -1547,7 +1539,6 @@ static const struct v4l2_ctrl_ops saa711x_ctrl_ops = {
1547 1539
1548static const struct v4l2_subdev_core_ops saa711x_core_ops = { 1540static const struct v4l2_subdev_core_ops saa711x_core_ops = {
1549 .log_status = saa711x_log_status, 1541 .log_status = saa711x_log_status,
1550 .g_chip_ident = saa711x_g_chip_ident,
1551 .g_ext_ctrls = v4l2_subdev_g_ext_ctrls, 1542 .g_ext_ctrls = v4l2_subdev_g_ext_ctrls,
1552 .try_ext_ctrls = v4l2_subdev_try_ext_ctrls, 1543 .try_ext_ctrls = v4l2_subdev_try_ext_ctrls,
1553 .s_ext_ctrls = v4l2_subdev_s_ext_ctrls, 1544 .s_ext_ctrls = v4l2_subdev_s_ext_ctrls,
@@ -1650,21 +1641,21 @@ static int saa711x_detect_chip(struct i2c_client *client,
1650 if (chip_ver[0] & 0xf0) { 1641 if (chip_ver[0] & 0xf0) {
1651 snprintf(name, CHIP_VER_SIZE, "saa711%ca", chip_id); 1642 snprintf(name, CHIP_VER_SIZE, "saa711%ca", chip_id);
1652 v4l_info(client, "saa7111a variant found\n"); 1643 v4l_info(client, "saa7111a variant found\n");
1653 return V4L2_IDENT_SAA7111A; 1644 return SAA7111A;
1654 } 1645 }
1655 return V4L2_IDENT_SAA7111; 1646 return SAA7111;
1656 case '3': 1647 case '3':
1657 return V4L2_IDENT_SAA7113; 1648 return SAA7113;
1658 case '4': 1649 case '4':
1659 return V4L2_IDENT_SAA7114; 1650 return SAA7114;
1660 case '5': 1651 case '5':
1661 return V4L2_IDENT_SAA7115; 1652 return SAA7115;
1662 case '8': 1653 case '8':
1663 return V4L2_IDENT_SAA7118; 1654 return SAA7118;
1664 default: 1655 default:
1665 v4l2_info(client, 1656 v4l2_info(client,
1666 "WARNING: Philips/NXP chip unknown - Falling back to saa7111\n"); 1657 "WARNING: Philips/NXP chip unknown - Falling back to saa7111\n");
1667 return V4L2_IDENT_SAA7111; 1658 return SAA7111;
1668 } 1659 }
1669 } 1660 }
1670 1661
@@ -1695,7 +1686,7 @@ static int saa711x_detect_chip(struct i2c_client *client,
1695 "It seems to be a %s chip (%*ph) @ 0x%x.\n", 1686 "It seems to be a %s chip (%*ph) @ 0x%x.\n",
1696 name, 16, chip_ver, client->addr << 1); 1687 name, 16, chip_ver, client->addr << 1);
1697 1688
1698 return V4L2_IDENT_GM7113C; 1689 return GM7113C;
1699 } 1690 }
1700 1691
1701 /* Chip was not discovered. Return its ID and don't bind */ 1692 /* Chip was not discovered. Return its ID and don't bind */
@@ -1774,19 +1765,19 @@ static int saa711x_probe(struct i2c_client *client,
1774 /* init to 60hz/48khz */ 1765 /* init to 60hz/48khz */
1775 state->crystal_freq = SAA7115_FREQ_24_576_MHZ; 1766 state->crystal_freq = SAA7115_FREQ_24_576_MHZ;
1776 switch (state->ident) { 1767 switch (state->ident) {
1777 case V4L2_IDENT_SAA7111: 1768 case SAA7111:
1778 case V4L2_IDENT_SAA7111A: 1769 case SAA7111A:
1779 saa711x_writeregs(sd, saa7111_init); 1770 saa711x_writeregs(sd, saa7111_init);
1780 break; 1771 break;
1781 case V4L2_IDENT_GM7113C: 1772 case GM7113C:
1782 case V4L2_IDENT_SAA7113: 1773 case SAA7113:
1783 saa711x_writeregs(sd, saa7113_init); 1774 saa711x_writeregs(sd, saa7113_init);
1784 break; 1775 break;
1785 default: 1776 default:
1786 state->crystal_freq = SAA7115_FREQ_32_11_MHZ; 1777 state->crystal_freq = SAA7115_FREQ_32_11_MHZ;
1787 saa711x_writeregs(sd, saa7115_init_auto_input); 1778 saa711x_writeregs(sd, saa7115_init_auto_input);
1788 } 1779 }
1789 if (state->ident > V4L2_IDENT_SAA7111A) 1780 if (state->ident > SAA7111A)
1790 saa711x_writeregs(sd, saa7115_init_misc); 1781 saa711x_writeregs(sd, saa7115_init_misc);
1791 saa711x_set_v4lstd(sd, V4L2_STD_NTSC); 1782 saa711x_set_v4lstd(sd, V4L2_STD_NTSC);
1792 v4l2_ctrl_handler_setup(hdl); 1783 v4l2_ctrl_handler_setup(hdl);