diff options
Diffstat (limited to 'drivers/media/dvb-frontends/tda10071.c')
-rw-r--r-- | drivers/media/dvb-frontends/tda10071.c | 25 |
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 | |||
23 | static struct dvb_frontend_ops tda10071_ops; | 26 | static 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); |