aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/dvb
diff options
context:
space:
mode:
authorAntti Palosaari <crope@iki.fi>2011-05-25 11:32:44 -0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2011-07-27 16:52:09 -0400
commitd838f4c318f12785a81e3e073a71ba4bb4ccd8cf (patch)
tree674ff39294fce448755e461bd9cdfcd3850446ba /drivers/media/dvb
parent05c46c05d20d9504d832dc12b2a84e9e0cc9be31 (diff)
[media] cxd2820r: malloc buffers instead of stack
kmalloc I2C buffers Signed-off-by: Antti Palosaari <crope@iki.fi> Cc: Dan Carpenter <error27@gmail.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/dvb')
-rw-r--r--drivers/media/dvb/frontends/cxd2820r_core.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/drivers/media/dvb/frontends/cxd2820r_core.c b/drivers/media/dvb/frontends/cxd2820r_core.c
index 0779f69db793..903cbdbbc73b 100644
--- a/drivers/media/dvb/frontends/cxd2820r_core.c
+++ b/drivers/media/dvb/frontends/cxd2820r_core.c
@@ -740,12 +740,13 @@ static int cxd2820r_tuner_i2c_xfer(struct i2c_adapter *i2c_adap,
740 struct i2c_msg msg[], int num) 740 struct i2c_msg msg[], int num)
741{ 741{
742 struct cxd2820r_priv *priv = i2c_get_adapdata(i2c_adap); 742 struct cxd2820r_priv *priv = i2c_get_adapdata(i2c_adap);
743 u8 obuf[msg[0].len + 2]; 743 int ret;
744 u8 *obuf = kmalloc(msg[0].len + 2, GFP_KERNEL);
744 struct i2c_msg msg2[2] = { 745 struct i2c_msg msg2[2] = {
745 { 746 {
746 .addr = priv->cfg.i2c_address, 747 .addr = priv->cfg.i2c_address,
747 .flags = 0, 748 .flags = 0,
748 .len = sizeof(obuf), 749 .len = msg[0].len + 2,
749 .buf = obuf, 750 .buf = obuf,
750 }, { 751 }, {
751 .addr = priv->cfg.i2c_address, 752 .addr = priv->cfg.i2c_address,
@@ -755,15 +756,24 @@ static int cxd2820r_tuner_i2c_xfer(struct i2c_adapter *i2c_adap,
755 } 756 }
756 }; 757 };
757 758
759 if (!obuf)
760 return -ENOMEM;
761
758 obuf[0] = 0x09; 762 obuf[0] = 0x09;
759 obuf[1] = (msg[0].addr << 1); 763 obuf[1] = (msg[0].addr << 1);
760 if (num == 2) { /* I2C read */ 764 if (num == 2) { /* I2C read */
761 obuf[1] = (msg[0].addr << 1) | I2C_M_RD; /* I2C RD flag */ 765 obuf[1] = (msg[0].addr << 1) | I2C_M_RD; /* I2C RD flag */
762 msg2[0].len = sizeof(obuf) - 1; /* maybe HW bug ? */ 766 msg2[0].len = msg[0].len + 2 - 1; /* '-1' maybe HW bug ? */
763 } 767 }
764 memcpy(&obuf[2], msg[0].buf, msg[0].len); 768 memcpy(&obuf[2], msg[0].buf, msg[0].len);
765 769
766 return i2c_transfer(priv->i2c, msg2, num); 770 ret = i2c_transfer(priv->i2c, msg2, num);
771 if (ret < 0)
772 warn("tuner i2c failed ret:%d", ret);
773
774 kfree(obuf);
775
776 return ret;
767} 777}
768 778
769static struct i2c_algorithm cxd2820r_tuner_i2c_algo = { 779static struct i2c_algorithm cxd2820r_tuner_i2c_algo = {