diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/media/video/hdpvr/hdpvr-i2c.c | 30 | ||||
-rw-r--r-- | drivers/media/video/hdpvr/hdpvr.h | 3 |
2 files changed, 16 insertions, 17 deletions
diff --git a/drivers/media/video/hdpvr/hdpvr-i2c.c b/drivers/media/video/hdpvr/hdpvr-i2c.c index 45b88cf60d68..89b71faeaac2 100644 --- a/drivers/media/video/hdpvr/hdpvr-i2c.c +++ b/drivers/media/video/hdpvr/hdpvr-i2c.c | |||
@@ -57,23 +57,21 @@ static int hdpvr_i2c_read(struct hdpvr_device *dev, int bus, | |||
57 | unsigned char addr, char *data, int len) | 57 | unsigned char addr, char *data, int len) |
58 | { | 58 | { |
59 | int ret; | 59 | int ret; |
60 | char *buf = kmalloc(len, GFP_KERNEL); | 60 | |
61 | if (!buf) | 61 | if (len > sizeof(dev->i2c_buf)) |
62 | return -ENOMEM; | 62 | return -EINVAL; |
63 | 63 | ||
64 | ret = usb_control_msg(dev->udev, | 64 | ret = usb_control_msg(dev->udev, |
65 | usb_rcvctrlpipe(dev->udev, 0), | 65 | usb_rcvctrlpipe(dev->udev, 0), |
66 | REQTYPE_I2C_READ, CTRL_READ_REQUEST, | 66 | REQTYPE_I2C_READ, CTRL_READ_REQUEST, |
67 | (bus << 8) | addr, 0, buf, len, 1000); | 67 | (bus << 8) | addr, 0, &dev->i2c_buf, len, 1000); |
68 | 68 | ||
69 | if (ret == len) { | 69 | if (ret == len) { |
70 | memcpy(data, buf, len); | 70 | memcpy(data, &dev->i2c_buf, len); |
71 | ret = 0; | 71 | ret = 0; |
72 | } else if (ret >= 0) | 72 | } else if (ret >= 0) |
73 | ret = -EIO; | 73 | ret = -EIO; |
74 | 74 | ||
75 | kfree(buf); | ||
76 | |||
77 | return ret; | 75 | return ret; |
78 | } | 76 | } |
79 | 77 | ||
@@ -81,31 +79,29 @@ static int hdpvr_i2c_write(struct hdpvr_device *dev, int bus, | |||
81 | unsigned char addr, char *data, int len) | 79 | unsigned char addr, char *data, int len) |
82 | { | 80 | { |
83 | int ret; | 81 | int ret; |
84 | char *buf = kmalloc(len, GFP_KERNEL); | ||
85 | if (!buf) | ||
86 | return -ENOMEM; | ||
87 | 82 | ||
88 | memcpy(buf, data, len); | 83 | if (len > sizeof(dev->i2c_buf)) |
84 | return -EINVAL; | ||
85 | |||
86 | memcpy(&dev->i2c_buf, data, len); | ||
89 | ret = usb_control_msg(dev->udev, | 87 | ret = usb_control_msg(dev->udev, |
90 | usb_sndctrlpipe(dev->udev, 0), | 88 | usb_sndctrlpipe(dev->udev, 0), |
91 | REQTYPE_I2C_WRITE, CTRL_WRITE_REQUEST, | 89 | REQTYPE_I2C_WRITE, CTRL_WRITE_REQUEST, |
92 | (bus << 8) | addr, 0, buf, len, 1000); | 90 | (bus << 8) | addr, 0, &dev->i2c_buf, len, 1000); |
93 | 91 | ||
94 | if (ret < 0) | 92 | if (ret < 0) |
95 | goto error; | 93 | return ret; |
96 | 94 | ||
97 | ret = usb_control_msg(dev->udev, | 95 | ret = usb_control_msg(dev->udev, |
98 | usb_rcvctrlpipe(dev->udev, 0), | 96 | usb_rcvctrlpipe(dev->udev, 0), |
99 | REQTYPE_I2C_WRITE_STATT, CTRL_READ_REQUEST, | 97 | REQTYPE_I2C_WRITE_STATT, CTRL_READ_REQUEST, |
100 | 0, 0, buf, 2, 1000); | 98 | 0, 0, &dev->i2c_buf, 2, 1000); |
101 | 99 | ||
102 | if ((ret == 2) && (buf[1] == (len - 1))) | 100 | if ((ret == 2) && (dev->i2c_buf[1] == (len - 1))) |
103 | ret = 0; | 101 | ret = 0; |
104 | else if (ret >= 0) | 102 | else if (ret >= 0) |
105 | ret = -EIO; | 103 | ret = -EIO; |
106 | 104 | ||
107 | error: | ||
108 | kfree(buf); | ||
109 | return ret; | 105 | return ret; |
110 | } | 106 | } |
111 | 107 | ||
diff --git a/drivers/media/video/hdpvr/hdpvr.h b/drivers/media/video/hdpvr/hdpvr.h index 29f74269400c..ee74e3be9a6a 100644 --- a/drivers/media/video/hdpvr/hdpvr.h +++ b/drivers/media/video/hdpvr/hdpvr.h | |||
@@ -25,6 +25,7 @@ | |||
25 | KERNEL_VERSION(HDPVR_MAJOR_VERSION, HDPVR_MINOR_VERSION, HDPVR_RELEASE) | 25 | KERNEL_VERSION(HDPVR_MAJOR_VERSION, HDPVR_MINOR_VERSION, HDPVR_RELEASE) |
26 | 26 | ||
27 | #define HDPVR_MAX 8 | 27 | #define HDPVR_MAX 8 |
28 | #define HDPVR_I2C_MAX_SIZE 128 | ||
28 | 29 | ||
29 | /* Define these values to match your devices */ | 30 | /* Define these values to match your devices */ |
30 | #define HD_PVR_VENDOR_ID 0x2040 | 31 | #define HD_PVR_VENDOR_ID 0x2040 |
@@ -109,6 +110,8 @@ struct hdpvr_device { | |||
109 | struct i2c_adapter i2c_adapter; | 110 | struct i2c_adapter i2c_adapter; |
110 | /* I2C lock */ | 111 | /* I2C lock */ |
111 | struct mutex i2c_mutex; | 112 | struct mutex i2c_mutex; |
113 | /* I2C message buffer space */ | ||
114 | char i2c_buf[HDPVR_I2C_MAX_SIZE]; | ||
112 | 115 | ||
113 | /* For passing data to ir-kbd-i2c */ | 116 | /* For passing data to ir-kbd-i2c */ |
114 | struct IR_i2c_init_data ir_i2c_init_data; | 117 | struct IR_i2c_init_data ir_i2c_init_data; |