aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/dvb-frontends/tda10071.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/media/dvb-frontends/tda10071.c')
-rw-r--r--drivers/media/dvb-frontends/tda10071.c25
1 files changed, 21 insertions, 4 deletions
diff --git a/drivers/media/dvb-frontends/tda10071.c b/drivers/media/dvb-frontends/tda10071.c
index e79749cfec81..8ad3a57cf640 100644
--- a/drivers/media/dvb-frontends/tda10071.c
+++ b/drivers/media/dvb-frontends/tda10071.c
@@ -20,6 +20,9 @@
20 20
21#include "tda10071_priv.h" 21#include "tda10071_priv.h"
22 22
23/* Max transfer size done by I2C transfer functions */
24#define MAX_XFER_SIZE 64
25
23static struct dvb_frontend_ops tda10071_ops; 26static struct dvb_frontend_ops tda10071_ops;
24 27
25/* write multiple registers */ 28/* write multiple registers */
@@ -27,16 +30,23 @@ static int tda10071_wr_regs(struct tda10071_priv *priv, u8 reg, u8 *val,
27 int len) 30 int len)
28{ 31{
29 int ret; 32 int ret;
30 u8 buf[len+1]; 33 u8 buf[MAX_XFER_SIZE];
31 struct i2c_msg msg[1] = { 34 struct i2c_msg msg[1] = {
32 { 35 {
33 .addr = priv->cfg.demod_i2c_addr, 36 .addr = priv->cfg.demod_i2c_addr,
34 .flags = 0, 37 .flags = 0,
35 .len = sizeof(buf), 38 .len = 1 + len,
36 .buf = buf, 39 .buf = buf,
37 } 40 }
38 }; 41 };
39 42
43 if (1 + len > sizeof(buf)) {
44 dev_warn(&priv->i2c->dev,
45 "%s: i2c wr reg=%04x: len=%d is too big!\n",
46 KBUILD_MODNAME, reg, len);
47 return -EINVAL;
48 }
49
40 buf[0] = reg; 50 buf[0] = reg;
41 memcpy(&buf[1], val, len); 51 memcpy(&buf[1], val, len);
42 52
@@ -56,7 +66,7 @@ static int tda10071_rd_regs(struct tda10071_priv *priv, u8 reg, u8 *val,
56 int len) 66 int len)
57{ 67{
58 int ret; 68 int ret;
59 u8 buf[len]; 69 u8 buf[MAX_XFER_SIZE];
60 struct i2c_msg msg[2] = { 70 struct i2c_msg msg[2] = {
61 { 71 {
62 .addr = priv->cfg.demod_i2c_addr, 72 .addr = priv->cfg.demod_i2c_addr,
@@ -66,11 +76,18 @@ static int tda10071_rd_regs(struct tda10071_priv *priv, u8 reg, u8 *val,
66 }, { 76 }, {
67 .addr = priv->cfg.demod_i2c_addr, 77 .addr = priv->cfg.demod_i2c_addr,
68 .flags = I2C_M_RD, 78 .flags = I2C_M_RD,
69 .len = sizeof(buf), 79 .len = len,
70 .buf = buf, 80 .buf = buf,
71 } 81 }
72 }; 82 };
73 83
84 if (len > sizeof(buf)) {
85 dev_warn(&priv->i2c->dev,
86 "%s: i2c wr reg=%04x: len=%d is too big!\n",
87 KBUILD_MODNAME, reg, len);
88 return -EINVAL;
89 }
90
74 ret = i2c_transfer(priv->i2c, msg, 2); 91 ret = i2c_transfer(priv->i2c, msg, 2);
75 if (ret == 2) { 92 if (ret == 2) {
76 memcpy(val, buf, len); 93 memcpy(val, buf, len);