19aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
29aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau/*
3e86da6f07ed6deebc199368bd0a47b3671829b80Janne Grunau * Hauppauge HD PVR USB driver
49aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau *
59aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau * Copyright (C) 2008      Janne Grunau (j@jannau.net)
69aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau *
7ea6c06033f01216df504b0f337a350778a3bc80eAndy Walls * IR device registration code is
8ea6c06033f01216df504b0f337a350778a3bc80eAndy Walls * Copyright (C) 2010	Andy Walls <awalls@md.metrocast.net>
9ea6c06033f01216df504b0f337a350778a3bc80eAndy Walls *
109aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau *	This program is free software; you can redistribute it and/or
119aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau *	modify it under the terms of the GNU General Public License as
129aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau *	published by the Free Software Foundation, version 2.
139aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau *
149aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau */
159aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
16324b04ba5da7918a2409f8113e46843bfbd89e67Jarod Wilson#if defined(CONFIG_I2C) || defined(CONFIG_I2C_MODULE)
17324b04ba5da7918a2409f8113e46843bfbd89e67Jarod Wilson
189aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau#include <linux/i2c.h>
195a0e3ad6af8660be21ca98a971cd00f331318c05Tejun Heo#include <linux/slab.h>
2035a246363ec41e7b19f7887a97ef3d01ab41356aPaul Gortmaker#include <linux/export.h>
219aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
229aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau#include "hdpvr.h"
239aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
249aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau#define CTRL_READ_REQUEST	0xb8
259aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau#define CTRL_WRITE_REQUEST	0x38
269aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
279aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau#define REQTYPE_I2C_READ	0xb1
289aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau#define REQTYPE_I2C_WRITE	0xb0
299aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau#define REQTYPE_I2C_WRITE_STATT	0xd0
309aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
31ea6c06033f01216df504b0f337a350778a3bc80eAndy Walls#define Z8F0811_IR_TX_I2C_ADDR	0x70
32ea6c06033f01216df504b0f337a350778a3bc80eAndy Walls#define Z8F0811_IR_RX_I2C_ADDR	0x71
33ea6c06033f01216df504b0f337a350778a3bc80eAndy Walls
34ea6c06033f01216df504b0f337a350778a3bc80eAndy Walls
357f2a06deaa22104a4cf4c0cc3d7c44c7e3228ef3Jarod Wilsonstruct i2c_client *hdpvr_register_ir_tx_i2c(struct hdpvr_device *dev)
367f2a06deaa22104a4cf4c0cc3d7c44c7e3228ef3Jarod Wilson{
377f2a06deaa22104a4cf4c0cc3d7c44c7e3228ef3Jarod Wilson	struct IR_i2c_init_data *init_data = &dev->ir_i2c_init_data;
387f2a06deaa22104a4cf4c0cc3d7c44c7e3228ef3Jarod Wilson	struct i2c_board_info hdpvr_ir_tx_i2c_board_info = {
397f2a06deaa22104a4cf4c0cc3d7c44c7e3228ef3Jarod Wilson		I2C_BOARD_INFO("ir_tx_z8f0811_hdpvr", Z8F0811_IR_TX_I2C_ADDR),
407f2a06deaa22104a4cf4c0cc3d7c44c7e3228ef3Jarod Wilson	};
417f2a06deaa22104a4cf4c0cc3d7c44c7e3228ef3Jarod Wilson
427f2a06deaa22104a4cf4c0cc3d7c44c7e3228ef3Jarod Wilson	init_data->name = "HD-PVR";
437f2a06deaa22104a4cf4c0cc3d7c44c7e3228ef3Jarod Wilson	hdpvr_ir_tx_i2c_board_info.platform_data = init_data;
44ea6c06033f01216df504b0f337a350778a3bc80eAndy Walls
457f2a06deaa22104a4cf4c0cc3d7c44c7e3228ef3Jarod Wilson	return i2c_new_device(&dev->i2c_adapter, &hdpvr_ir_tx_i2c_board_info);
467f2a06deaa22104a4cf4c0cc3d7c44c7e3228ef3Jarod Wilson}
477f2a06deaa22104a4cf4c0cc3d7c44c7e3228ef3Jarod Wilson
487f2a06deaa22104a4cf4c0cc3d7c44c7e3228ef3Jarod Wilsonstruct i2c_client *hdpvr_register_ir_rx_i2c(struct hdpvr_device *dev)
49ea6c06033f01216df504b0f337a350778a3bc80eAndy Walls{
50ea6c06033f01216df504b0f337a350778a3bc80eAndy Walls	struct IR_i2c_init_data *init_data = &dev->ir_i2c_init_data;
517f2a06deaa22104a4cf4c0cc3d7c44c7e3228ef3Jarod Wilson	struct i2c_board_info hdpvr_ir_rx_i2c_board_info = {
527f2a06deaa22104a4cf4c0cc3d7c44c7e3228ef3Jarod Wilson		I2C_BOARD_INFO("ir_rx_z8f0811_hdpvr", Z8F0811_IR_RX_I2C_ADDR),
537f2a06deaa22104a4cf4c0cc3d7c44c7e3228ef3Jarod Wilson	};
54ea6c06033f01216df504b0f337a350778a3bc80eAndy Walls
55ea6c06033f01216df504b0f337a350778a3bc80eAndy Walls	/* Our default information for ir-kbd-i2c.c to use */
56af86ce79f020a31e4a30661e41471d31face9985Mauro Carvalho Chehab	init_data->ir_codes = RC_MAP_HAUPPAUGE;
57324b04ba5da7918a2409f8113e46843bfbd89e67Jarod Wilson	init_data->internal_get_key_func = IR_KBD_GET_KEY_HAUP_XVR;
58324b04ba5da7918a2409f8113e46843bfbd89e67Jarod Wilson	init_data->type = RC_TYPE_RC5;
597f2a06deaa22104a4cf4c0cc3d7c44c7e3228ef3Jarod Wilson	init_data->name = "HD-PVR";
60dc8e2aa3b5a6c13baa77709bcaa2e7e483d9d006Jarod Wilson	init_data->polling_interval = 405; /* ms, duplicated from Windows */
617f2a06deaa22104a4cf4c0cc3d7c44c7e3228ef3Jarod Wilson	hdpvr_ir_rx_i2c_board_info.platform_data = init_data;
62ea6c06033f01216df504b0f337a350778a3bc80eAndy Walls
637f2a06deaa22104a4cf4c0cc3d7c44c7e3228ef3Jarod Wilson	return i2c_new_device(&dev->i2c_adapter, &hdpvr_ir_rx_i2c_board_info);
64ea6c06033f01216df504b0f337a350778a3bc80eAndy Walls}
65ea6c06033f01216df504b0f337a350778a3bc80eAndy Walls
66324b04ba5da7918a2409f8113e46843bfbd89e67Jarod Wilsonstatic int hdpvr_i2c_read(struct hdpvr_device *dev, int bus,
67b443ac5a2836532af2315a4acb95c7a2cf721cbdJarod Wilson			  unsigned char addr, char *wdata, int wlen,
68b443ac5a2836532af2315a4acb95c7a2cf721cbdJarod Wilson			  char *data, int len)
699aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau{
709aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	int ret;
71559d162e1ebcdb61e89f154f2c2db376af072b0eJarod Wilson
72b443ac5a2836532af2315a4acb95c7a2cf721cbdJarod Wilson	if ((len > sizeof(dev->i2c_buf)) || (wlen > sizeof(dev->i2c_buf)))
73559d162e1ebcdb61e89f154f2c2db376af072b0eJarod Wilson		return -EINVAL;
749aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
75b443ac5a2836532af2315a4acb95c7a2cf721cbdJarod Wilson	if (wlen) {
76b443ac5a2836532af2315a4acb95c7a2cf721cbdJarod Wilson		memcpy(&dev->i2c_buf, wdata, wlen);
77b443ac5a2836532af2315a4acb95c7a2cf721cbdJarod Wilson		ret = usb_control_msg(dev->udev, usb_sndctrlpipe(dev->udev, 0),
78b443ac5a2836532af2315a4acb95c7a2cf721cbdJarod Wilson				      REQTYPE_I2C_WRITE, CTRL_WRITE_REQUEST,
79b443ac5a2836532af2315a4acb95c7a2cf721cbdJarod Wilson				      (bus << 8) | addr, 0, &dev->i2c_buf,
80b443ac5a2836532af2315a4acb95c7a2cf721cbdJarod Wilson				      wlen, 1000);
81b443ac5a2836532af2315a4acb95c7a2cf721cbdJarod Wilson		if (ret < 0)
82b443ac5a2836532af2315a4acb95c7a2cf721cbdJarod Wilson			return ret;
83b443ac5a2836532af2315a4acb95c7a2cf721cbdJarod Wilson	}
84b443ac5a2836532af2315a4acb95c7a2cf721cbdJarod Wilson
85b443ac5a2836532af2315a4acb95c7a2cf721cbdJarod Wilson	ret = usb_control_msg(dev->udev, usb_rcvctrlpipe(dev->udev, 0),
869aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau			      REQTYPE_I2C_READ, CTRL_READ_REQUEST,
87559d162e1ebcdb61e89f154f2c2db376af072b0eJarod Wilson			      (bus << 8) | addr, 0, &dev->i2c_buf, len, 1000);
889aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
899aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	if (ret == len) {
90559d162e1ebcdb61e89f154f2c2db376af072b0eJarod Wilson		memcpy(data, &dev->i2c_buf, len);
919aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau		ret = 0;
929aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	} else if (ret >= 0)
939aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau		ret = -EIO;
949aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
959aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	return ret;
969aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau}
979aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
98324b04ba5da7918a2409f8113e46843bfbd89e67Jarod Wilsonstatic int hdpvr_i2c_write(struct hdpvr_device *dev, int bus,
99324b04ba5da7918a2409f8113e46843bfbd89e67Jarod Wilson			   unsigned char addr, char *data, int len)
1009aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau{
1019aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	int ret;
1029aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
103559d162e1ebcdb61e89f154f2c2db376af072b0eJarod Wilson	if (len > sizeof(dev->i2c_buf))
104559d162e1ebcdb61e89f154f2c2db376af072b0eJarod Wilson		return -EINVAL;
105559d162e1ebcdb61e89f154f2c2db376af072b0eJarod Wilson
106559d162e1ebcdb61e89f154f2c2db376af072b0eJarod Wilson	memcpy(&dev->i2c_buf, data, len);
107b443ac5a2836532af2315a4acb95c7a2cf721cbdJarod Wilson	ret = usb_control_msg(dev->udev, usb_sndctrlpipe(dev->udev, 0),
1089aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau			      REQTYPE_I2C_WRITE, CTRL_WRITE_REQUEST,
109559d162e1ebcdb61e89f154f2c2db376af072b0eJarod Wilson			      (bus << 8) | addr, 0, &dev->i2c_buf, len, 1000);
1109aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
1119aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	if (ret < 0)
112559d162e1ebcdb61e89f154f2c2db376af072b0eJarod Wilson		return ret;
1139aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
114b443ac5a2836532af2315a4acb95c7a2cf721cbdJarod Wilson	ret = usb_control_msg(dev->udev, usb_rcvctrlpipe(dev->udev, 0),
1159aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau			      REQTYPE_I2C_WRITE_STATT, CTRL_READ_REQUEST,
116559d162e1ebcdb61e89f154f2c2db376af072b0eJarod Wilson			      0, 0, &dev->i2c_buf, 2, 1000);
1179aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
118559d162e1ebcdb61e89f154f2c2db376af072b0eJarod Wilson	if ((ret == 2) && (dev->i2c_buf[1] == (len - 1)))
1199aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau		ret = 0;
1209aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	else if (ret >= 0)
1219aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau		ret = -EIO;
1229aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
1239aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	return ret;
1249aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau}
1259aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
1269aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunaustatic int hdpvr_transfer(struct i2c_adapter *i2c_adapter, struct i2c_msg *msgs,
1279aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau			  int num)
1289aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau{
1299aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	struct hdpvr_device *dev = i2c_get_adapdata(i2c_adapter);
130b443ac5a2836532af2315a4acb95c7a2cf721cbdJarod Wilson	int retval = 0, addr;
1319aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
1329aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	if (num <= 0)
1339aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau		return 0;
1349aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
1359aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	mutex_lock(&dev->i2c_mutex);
1369aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
137b443ac5a2836532af2315a4acb95c7a2cf721cbdJarod Wilson	addr = msgs[0].addr << 1;
1389aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
139b443ac5a2836532af2315a4acb95c7a2cf721cbdJarod Wilson	if (num == 1) {
140b443ac5a2836532af2315a4acb95c7a2cf721cbdJarod Wilson		if (msgs[0].flags & I2C_M_RD)
141b443ac5a2836532af2315a4acb95c7a2cf721cbdJarod Wilson			retval = hdpvr_i2c_read(dev, 1, addr, NULL, 0,
142b443ac5a2836532af2315a4acb95c7a2cf721cbdJarod Wilson						msgs[0].buf, msgs[0].len);
1439aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau		else
144b443ac5a2836532af2315a4acb95c7a2cf721cbdJarod Wilson			retval = hdpvr_i2c_write(dev, 1, addr, msgs[0].buf,
145b443ac5a2836532af2315a4acb95c7a2cf721cbdJarod Wilson						 msgs[0].len);
146b443ac5a2836532af2315a4acb95c7a2cf721cbdJarod Wilson	} else if (num == 2) {
147b443ac5a2836532af2315a4acb95c7a2cf721cbdJarod Wilson		if (msgs[0].addr != msgs[1].addr) {
148b443ac5a2836532af2315a4acb95c7a2cf721cbdJarod Wilson			v4l2_warn(&dev->v4l2_dev, "refusing 2-phase i2c xfer "
149b443ac5a2836532af2315a4acb95c7a2cf721cbdJarod Wilson				  "with conflicting target addresses\n");
150b443ac5a2836532af2315a4acb95c7a2cf721cbdJarod Wilson			retval = -EINVAL;
151b443ac5a2836532af2315a4acb95c7a2cf721cbdJarod Wilson			goto out;
152b443ac5a2836532af2315a4acb95c7a2cf721cbdJarod Wilson		}
153b443ac5a2836532af2315a4acb95c7a2cf721cbdJarod Wilson
154b443ac5a2836532af2315a4acb95c7a2cf721cbdJarod Wilson		if ((msgs[0].flags & I2C_M_RD) || !(msgs[1].flags & I2C_M_RD)) {
155b443ac5a2836532af2315a4acb95c7a2cf721cbdJarod Wilson			v4l2_warn(&dev->v4l2_dev, "refusing complex xfer with "
156b443ac5a2836532af2315a4acb95c7a2cf721cbdJarod Wilson				  "r0=%d, r1=%d\n", msgs[0].flags & I2C_M_RD,
157b443ac5a2836532af2315a4acb95c7a2cf721cbdJarod Wilson				  msgs[1].flags & I2C_M_RD);
158b443ac5a2836532af2315a4acb95c7a2cf721cbdJarod Wilson			retval = -EINVAL;
159b443ac5a2836532af2315a4acb95c7a2cf721cbdJarod Wilson			goto out;
160b443ac5a2836532af2315a4acb95c7a2cf721cbdJarod Wilson		}
161b443ac5a2836532af2315a4acb95c7a2cf721cbdJarod Wilson
162b443ac5a2836532af2315a4acb95c7a2cf721cbdJarod Wilson		/*
163b443ac5a2836532af2315a4acb95c7a2cf721cbdJarod Wilson		 * Write followed by atomic read is the only complex xfer that
164b443ac5a2836532af2315a4acb95c7a2cf721cbdJarod Wilson		 * we actually support here.
165b443ac5a2836532af2315a4acb95c7a2cf721cbdJarod Wilson		 */
166b443ac5a2836532af2315a4acb95c7a2cf721cbdJarod Wilson		retval = hdpvr_i2c_read(dev, 1, addr, msgs[0].buf, msgs[0].len,
167b443ac5a2836532af2315a4acb95c7a2cf721cbdJarod Wilson					msgs[1].buf, msgs[1].len);
168b443ac5a2836532af2315a4acb95c7a2cf721cbdJarod Wilson	} else {
169b443ac5a2836532af2315a4acb95c7a2cf721cbdJarod Wilson		v4l2_warn(&dev->v4l2_dev, "refusing %d-phase i2c xfer\n", num);
1709aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	}
1719aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
172b443ac5a2836532af2315a4acb95c7a2cf721cbdJarod Wilsonout:
1739aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	mutex_unlock(&dev->i2c_mutex);
1749aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
1759aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	return retval ? retval : num;
1769aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau}
1779aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
1789aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunaustatic u32 hdpvr_functionality(struct i2c_adapter *adapter)
1799aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau{
1809aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL;
1819aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau}
1829aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
1839aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunaustatic struct i2c_algorithm hdpvr_algo = {
1849aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	.master_xfer   = hdpvr_transfer,
1859aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	.functionality = hdpvr_functionality,
1869aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau};
1879aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
188324b04ba5da7918a2409f8113e46843bfbd89e67Jarod Wilsonstatic struct i2c_adapter hdpvr_i2c_adapter_template = {
189324b04ba5da7918a2409f8113e46843bfbd89e67Jarod Wilson	.name   = "Hauppage HD PVR I2C",
190324b04ba5da7918a2409f8113e46843bfbd89e67Jarod Wilson	.owner  = THIS_MODULE,
191324b04ba5da7918a2409f8113e46843bfbd89e67Jarod Wilson	.algo   = &hdpvr_algo,
192324b04ba5da7918a2409f8113e46843bfbd89e67Jarod Wilson};
193324b04ba5da7918a2409f8113e46843bfbd89e67Jarod Wilson
194324b04ba5da7918a2409f8113e46843bfbd89e67Jarod Wilsonstatic int hdpvr_activate_ir(struct hdpvr_device *dev)
195324b04ba5da7918a2409f8113e46843bfbd89e67Jarod Wilson{
196dc8e2aa3b5a6c13baa77709bcaa2e7e483d9d006Jarod Wilson	char buffer[2];
197324b04ba5da7918a2409f8113e46843bfbd89e67Jarod Wilson
198324b04ba5da7918a2409f8113e46843bfbd89e67Jarod Wilson	mutex_lock(&dev->i2c_mutex);
199324b04ba5da7918a2409f8113e46843bfbd89e67Jarod Wilson
200b443ac5a2836532af2315a4acb95c7a2cf721cbdJarod Wilson	hdpvr_i2c_read(dev, 0, 0x54, NULL, 0, buffer, 1);
201324b04ba5da7918a2409f8113e46843bfbd89e67Jarod Wilson
202324b04ba5da7918a2409f8113e46843bfbd89e67Jarod Wilson	buffer[0] = 0;
203324b04ba5da7918a2409f8113e46843bfbd89e67Jarod Wilson	buffer[1] = 0x8;
204324b04ba5da7918a2409f8113e46843bfbd89e67Jarod Wilson	hdpvr_i2c_write(dev, 1, 0x54, buffer, 2);
205324b04ba5da7918a2409f8113e46843bfbd89e67Jarod Wilson
206324b04ba5da7918a2409f8113e46843bfbd89e67Jarod Wilson	buffer[1] = 0x18;
207324b04ba5da7918a2409f8113e46843bfbd89e67Jarod Wilson	hdpvr_i2c_write(dev, 1, 0x54, buffer, 2);
208324b04ba5da7918a2409f8113e46843bfbd89e67Jarod Wilson
209324b04ba5da7918a2409f8113e46843bfbd89e67Jarod Wilson	mutex_unlock(&dev->i2c_mutex);
210324b04ba5da7918a2409f8113e46843bfbd89e67Jarod Wilson
211324b04ba5da7918a2409f8113e46843bfbd89e67Jarod Wilson	return 0;
212324b04ba5da7918a2409f8113e46843bfbd89e67Jarod Wilson}
213324b04ba5da7918a2409f8113e46843bfbd89e67Jarod Wilson
2149aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunauint hdpvr_register_i2c_adapter(struct hdpvr_device *dev)
2159aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau{
2169aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	int retval = -ENOMEM;
2179aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
218324b04ba5da7918a2409f8113e46843bfbd89e67Jarod Wilson	hdpvr_activate_ir(dev);
2199aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
220324b04ba5da7918a2409f8113e46843bfbd89e67Jarod Wilson	memcpy(&dev->i2c_adapter, &hdpvr_i2c_adapter_template,
221324b04ba5da7918a2409f8113e46843bfbd89e67Jarod Wilson	       sizeof(struct i2c_adapter));
222324b04ba5da7918a2409f8113e46843bfbd89e67Jarod Wilson	dev->i2c_adapter.dev.parent = &dev->udev->dev;
2239aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
224324b04ba5da7918a2409f8113e46843bfbd89e67Jarod Wilson	i2c_set_adapdata(&dev->i2c_adapter, dev);
2259aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
226324b04ba5da7918a2409f8113e46843bfbd89e67Jarod Wilson	retval = i2c_add_adapter(&dev->i2c_adapter);
2279aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau
2289aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau	return retval;
2299aba42efe85bc7a55e3fed0747ce14abc9ee96e7Janne Grunau}
230324b04ba5da7918a2409f8113e46843bfbd89e67Jarod Wilson
231324b04ba5da7918a2409f8113e46843bfbd89e67Jarod Wilson#endif
232