aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/dvb-frontends/af9033.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/media/dvb-frontends/af9033.c')
-rw-r--r--drivers/media/dvb-frontends/af9033.c23
1 files changed, 20 insertions, 3 deletions
diff --git a/drivers/media/dvb-frontends/af9033.c b/drivers/media/dvb-frontends/af9033.c
index a777b4b944eb..65728c25ea05 100644
--- a/drivers/media/dvb-frontends/af9033.c
+++ b/drivers/media/dvb-frontends/af9033.c
@@ -21,6 +21,9 @@
21 21
22#include "af9033_priv.h" 22#include "af9033_priv.h"
23 23
24/* Max transfer size done by I2C transfer functions */
25#define MAX_XFER_SIZE 64
26
24struct af9033_state { 27struct af9033_state {
25 struct i2c_adapter *i2c; 28 struct i2c_adapter *i2c;
26 struct dvb_frontend fe; 29 struct dvb_frontend fe;
@@ -40,16 +43,23 @@ static int af9033_wr_regs(struct af9033_state *state, u32 reg, const u8 *val,
40 int len) 43 int len)
41{ 44{
42 int ret; 45 int ret;
43 u8 buf[3 + len]; 46 u8 buf[MAX_XFER_SIZE];
44 struct i2c_msg msg[1] = { 47 struct i2c_msg msg[1] = {
45 { 48 {
46 .addr = state->cfg.i2c_addr, 49 .addr = state->cfg.i2c_addr,
47 .flags = 0, 50 .flags = 0,
48 .len = sizeof(buf), 51 .len = 3 + len,
49 .buf = buf, 52 .buf = buf,
50 } 53 }
51 }; 54 };
52 55
56 if (3 + len > sizeof(buf)) {
57 dev_warn(&state->i2c->dev,
58 "%s: i2c wr reg=%04x: len=%d is too big!\n",
59 KBUILD_MODNAME, reg, len);
60 return -EINVAL;
61 }
62
53 buf[0] = (reg >> 16) & 0xff; 63 buf[0] = (reg >> 16) & 0xff;
54 buf[1] = (reg >> 8) & 0xff; 64 buf[1] = (reg >> 8) & 0xff;
55 buf[2] = (reg >> 0) & 0xff; 65 buf[2] = (reg >> 0) & 0xff;
@@ -160,11 +170,18 @@ static int af9033_rd_reg_mask(struct af9033_state *state, u32 reg, u8 *val,
160static int af9033_wr_reg_val_tab(struct af9033_state *state, 170static int af9033_wr_reg_val_tab(struct af9033_state *state,
161 const struct reg_val *tab, int tab_len) 171 const struct reg_val *tab, int tab_len)
162{ 172{
173#define MAX_TAB_LEN 212
163 int ret, i, j; 174 int ret, i, j;
164 u8 buf[tab_len]; 175 u8 buf[1 + MAX_TAB_LEN];
165 176
166 dev_dbg(&state->i2c->dev, "%s: tab_len=%d\n", __func__, tab_len); 177 dev_dbg(&state->i2c->dev, "%s: tab_len=%d\n", __func__, tab_len);
167 178
179 if (tab_len > sizeof(buf)) {
180 dev_warn(&state->i2c->dev, "%s: tab len %d is too big\n",
181 KBUILD_MODNAME, tab_len);
182 return -EINVAL;
183 }
184
168 for (i = 0, j = 0; i < tab_len; i++) { 185 for (i = 0, j = 0; i < tab_len; i++) {
169 buf[j] = tab[i].val; 186 buf[j] = tab[i].val;
170 187