ivtv-i2c.c revision 84d0d4f0674c55d0625bd1b6eb91dba4ef3948f9
11a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil/* 21a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil I2C functions 31a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil Copyright (C) 2003-2004 Kevin Thayer <nufan_wfk at yahoo.com> 41a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil Copyright (C) 2005-2007 Hans Verkuil <hverkuil@xs4all.nl> 51a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil 61a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil This program is free software; you can redistribute it and/or modify 71a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil it under the terms of the GNU General Public License as published by 81a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil the Free Software Foundation; either version 2 of the License, or 91a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil (at your option) any later version. 101a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil 111a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil This program is distributed in the hope that it will be useful, 121a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil but WITHOUT ANY WARRANTY; without even the implied warranty of 131a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 141a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil GNU General Public License for more details. 151a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil 161a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil You should have received a copy of the GNU General Public License 171a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil along with this program; if not, write to the Free Software 181a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 191a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil */ 201a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil 211a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil/* 221a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil This file includes an i2c implementation that was reverse engineered 231a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil from the Hauppauge windows driver. Older ivtv versions used i2c-algo-bit, 241a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil which whilst fine under most circumstances, had trouble with the Zilog 251a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil CPU on the PVR-150 which handles IR functions (occasional inability to 261a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil communicate with the chip until it was reset) and also with the i2c 271a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil bus being completely unreachable when multiple PVR cards were present. 281a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil 291a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil The implementation is very similar to i2c-algo-bit, but there are enough 301a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil subtle differences that the two are hard to merge. The general strategy 311a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil employed by i2c-algo-bit is to use udelay() to implement the timing 321a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil when putting out bits on the scl/sda lines. The general strategy taken 331a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil here is to poll the lines for state changes (see ivtv_waitscl and 341a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil ivtv_waitsda). In addition there are small delays at various locations 351a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil which poll the SCL line 5 times (ivtv_scldelay). I would guess that 361a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil since this is memory mapped I/O that the length of those delays is tied 371a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil to the PCI bus clock. There is some extra code to do with recovery 381a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil and retries. Since it is not known what causes the actual i2c problems 391a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil in the first place, the only goal if one was to attempt to use 401a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil i2c-algo-bit would be to try to make it follow the same code path. 411a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil This would be a lot of work, and I'm also not convinced that it would 421a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil provide a generic benefit to i2c-algo-bit. Therefore consider this 431a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil an engineering solution -- not pretty, but it works. 441a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil 451a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil Some more general comments about what we are doing: 461a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil 471a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil The i2c bus is a 2 wire serial bus, with clock (SCL) and data (SDA) 481a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil lines. To communicate on the bus (as a master, we don't act as a slave), 491a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil we first initiate a start condition (ivtv_start). We then write the 501a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil address of the device that we want to communicate with, along with a flag 511a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil that indicates whether this is a read or a write. The slave then issues 521a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil an ACK signal (ivtv_ack), which tells us that it is ready for reading / 531a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil writing. We then proceed with reading or writing (ivtv_read/ivtv_write), 541a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil and finally issue a stop condition (ivtv_stop) to make the bus available 551a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil to other masters. 561a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil 571a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil There is an additional form of transaction where a write may be 581a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil immediately followed by a read. In this case, there is no intervening 591a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil stop condition. (Only the msp3400 chip uses this method of data transfer). 601a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil */ 611a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil 621a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil#include "ivtv-driver.h" 631a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil#include "ivtv-cards.h" 641a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil#include "ivtv-gpio.h" 6583df8e7b0d7b319f9ce9773eaf4b1da324ae17d7Hans Verkuil#include "ivtv-i2c.h" 6672c851b00f6c86353c54fdd9f1ef88d82e8df6c5Hans Verkuil#include <media/cx25840.h> 671a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil 681a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil/* i2c implementation for cx23415/6 chip, ivtv project. 691a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil * Author: Kevin Thayer (nufan_wfk at yahoo.com) 701a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil */ 711a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil/* i2c stuff */ 721a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil#define IVTV_REG_I2C_SETSCL_OFFSET 0x7000 731a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil#define IVTV_REG_I2C_SETSDA_OFFSET 0x7004 741a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil#define IVTV_REG_I2C_GETSCL_OFFSET 0x7008 751a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil#define IVTV_REG_I2C_GETSDA_OFFSET 0x700c 761a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil 771a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil#define IVTV_CS53L32A_I2C_ADDR 0x11 78e2a1774d9c8b866db65853fd1a17e5f472dd5cf2Hans Verkuil#define IVTV_M52790_I2C_ADDR 0x48 791a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil#define IVTV_CX25840_I2C_ADDR 0x44 801a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil#define IVTV_SAA7115_I2C_ADDR 0x21 811a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil#define IVTV_SAA7127_I2C_ADDR 0x44 821a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil#define IVTV_SAA717x_I2C_ADDR 0x21 831a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil#define IVTV_MSP3400_I2C_ADDR 0x40 841a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil#define IVTV_HAUPPAUGE_I2C_ADDR 0x50 851a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil#define IVTV_WM8739_I2C_ADDR 0x1a 861a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil#define IVTV_WM8775_I2C_ADDR 0x1b 871a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil#define IVTV_TEA5767_I2C_ADDR 0x60 881a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil#define IVTV_UPD64031A_I2C_ADDR 0x12 891a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil#define IVTV_UPD64083_I2C_ADDR 0x5c 90d9009201207c4bdce9b95a0bd903b3f087e8eda1Hans Verkuil#define IVTV_VP27SMPX_I2C_ADDR 0x5b 91d9009201207c4bdce9b95a0bd903b3f087e8eda1Hans Verkuil#define IVTV_M52790_I2C_ADDR 0x48 92ad2fe2d48812029b0b674594f297d0723f7c6e8fAndy Walls#define IVTV_AVERMEDIA_IR_RX_I2C_ADDR 0x40 937ce5c41db3672c8b4419b16d9b3ac1ccf11a1445Andy Walls#define IVTV_HAUP_EXT_IR_RX_I2C_ADDR 0x1a 947ce5c41db3672c8b4419b16d9b3ac1ccf11a1445Andy Walls#define IVTV_HAUP_INT_IR_RX_I2C_ADDR 0x18 957ce5c41db3672c8b4419b16d9b3ac1ccf11a1445Andy Walls#define IVTV_Z8F0811_IR_TX_I2C_ADDR 0x70 967ce5c41db3672c8b4419b16d9b3ac1ccf11a1445Andy Walls#define IVTV_Z8F0811_IR_RX_I2C_ADDR 0x71 971a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil 981a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil/* This array should match the IVTV_HW_ defines */ 99d9009201207c4bdce9b95a0bd903b3f087e8eda1Hans Verkuilstatic const u8 hw_addrs[] = { 100d9009201207c4bdce9b95a0bd903b3f087e8eda1Hans Verkuil IVTV_CX25840_I2C_ADDR, 101d9009201207c4bdce9b95a0bd903b3f087e8eda1Hans Verkuil IVTV_SAA7115_I2C_ADDR, 102d9009201207c4bdce9b95a0bd903b3f087e8eda1Hans Verkuil IVTV_SAA7127_I2C_ADDR, 103d9009201207c4bdce9b95a0bd903b3f087e8eda1Hans Verkuil IVTV_MSP3400_I2C_ADDR, 104d9009201207c4bdce9b95a0bd903b3f087e8eda1Hans Verkuil 0, 105d9009201207c4bdce9b95a0bd903b3f087e8eda1Hans Verkuil IVTV_WM8775_I2C_ADDR, 106d9009201207c4bdce9b95a0bd903b3f087e8eda1Hans Verkuil IVTV_CS53L32A_I2C_ADDR, 107d9009201207c4bdce9b95a0bd903b3f087e8eda1Hans Verkuil 0, 108d9009201207c4bdce9b95a0bd903b3f087e8eda1Hans Verkuil IVTV_SAA7115_I2C_ADDR, 109d9009201207c4bdce9b95a0bd903b3f087e8eda1Hans Verkuil IVTV_UPD64031A_I2C_ADDR, 110d9009201207c4bdce9b95a0bd903b3f087e8eda1Hans Verkuil IVTV_UPD64083_I2C_ADDR, 111d9009201207c4bdce9b95a0bd903b3f087e8eda1Hans Verkuil IVTV_SAA717x_I2C_ADDR, 112d9009201207c4bdce9b95a0bd903b3f087e8eda1Hans Verkuil IVTV_WM8739_I2C_ADDR, 113d9009201207c4bdce9b95a0bd903b3f087e8eda1Hans Verkuil IVTV_VP27SMPX_I2C_ADDR, 114d9009201207c4bdce9b95a0bd903b3f087e8eda1Hans Verkuil IVTV_M52790_I2C_ADDR, 115ad2fe2d48812029b0b674594f297d0723f7c6e8fAndy Walls 0, /* IVTV_HW_GPIO dummy driver ID */ 1167ce5c41db3672c8b4419b16d9b3ac1ccf11a1445Andy Walls IVTV_AVERMEDIA_IR_RX_I2C_ADDR, /* IVTV_HW_I2C_IR_RX_AVER */ 1177ce5c41db3672c8b4419b16d9b3ac1ccf11a1445Andy Walls IVTV_HAUP_EXT_IR_RX_I2C_ADDR, /* IVTV_HW_I2C_IR_RX_HAUP_EXT */ 1187ce5c41db3672c8b4419b16d9b3ac1ccf11a1445Andy Walls IVTV_HAUP_INT_IR_RX_I2C_ADDR, /* IVTV_HW_I2C_IR_RX_HAUP_INT */ 1197ce5c41db3672c8b4419b16d9b3ac1ccf11a1445Andy Walls IVTV_Z8F0811_IR_TX_I2C_ADDR, /* IVTV_HW_Z8F0811_IR_TX_HAUP */ 1207ce5c41db3672c8b4419b16d9b3ac1ccf11a1445Andy Walls IVTV_Z8F0811_IR_RX_I2C_ADDR, /* IVTV_HW_Z8F0811_IR_RX_HAUP */ 121d9009201207c4bdce9b95a0bd903b3f087e8eda1Hans Verkuil}; 122d9009201207c4bdce9b95a0bd903b3f087e8eda1Hans Verkuil 123d9009201207c4bdce9b95a0bd903b3f087e8eda1Hans Verkuil/* This array should match the IVTV_HW_ defines */ 124af294867a52bf718df835a688e8c786d550bee26Jean Delvarestatic const char * const hw_devicenames[] = { 125d9009201207c4bdce9b95a0bd903b3f087e8eda1Hans Verkuil "cx25840", 1261a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil "saa7115", 1275daed07401ed27bb2684e803f3f01e3a424ea282Jean Delvare "saa7127_auto", /* saa7127 or saa7129 */ 1281a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil "msp3400", 1291a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil "tuner", 1301a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil "wm8775", 1311a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil "cs53l32a", 1321a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil "tveeprom", 133af294867a52bf718df835a688e8c786d550bee26Jean Delvare "saa7114", 1341a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil "upd64031a", 1351a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil "upd64083", 1361a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil "saa717x", 1371a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil "wm8739", 138ac247433fe205acf460f05de64a30ee71ea307f2Hans Verkuil "vp27smpx", 139e2a1774d9c8b866db65853fd1a17e5f472dd5cf2Hans Verkuil "m52790", 1401a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil "gpio", 1417ce5c41db3672c8b4419b16d9b3ac1ccf11a1445Andy Walls "ir_video", /* IVTV_HW_I2C_IR_RX_AVER */ 1427ce5c41db3672c8b4419b16d9b3ac1ccf11a1445Andy Walls "ir_video", /* IVTV_HW_I2C_IR_RX_HAUP_EXT */ 1437ce5c41db3672c8b4419b16d9b3ac1ccf11a1445Andy Walls "ir_video", /* IVTV_HW_I2C_IR_RX_HAUP_INT */ 1447ce5c41db3672c8b4419b16d9b3ac1ccf11a1445Andy Walls "ir_tx_z8f0811_haup", /* IVTV_HW_Z8F0811_IR_TX_HAUP */ 1457ce5c41db3672c8b4419b16d9b3ac1ccf11a1445Andy Walls "ir_rx_z8f0811_haup", /* IVTV_HW_Z8F0811_IR_RX_HAUP */ 1461a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil}; 1471a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil 148ad2fe2d48812029b0b674594f297d0723f7c6e8fAndy Wallsstatic int ivtv_i2c_new_ir(struct ivtv *itv, u32 hw, const char *type, u8 addr) 149ad2fe2d48812029b0b674594f297d0723f7c6e8fAndy Walls{ 150ad2fe2d48812029b0b674594f297d0723f7c6e8fAndy Walls struct i2c_board_info info; 151ad2fe2d48812029b0b674594f297d0723f7c6e8fAndy Walls struct i2c_adapter *adap = &itv->i2c_adap; 152ad2fe2d48812029b0b674594f297d0723f7c6e8fAndy Walls struct IR_i2c_init_data *init_data = &itv->ir_i2c_init_data; 153ad2fe2d48812029b0b674594f297d0723f7c6e8fAndy Walls unsigned short addr_list[2] = { addr, I2C_CLIENT_END }; 154ad2fe2d48812029b0b674594f297d0723f7c6e8fAndy Walls 1557ce5c41db3672c8b4419b16d9b3ac1ccf11a1445Andy Walls /* Only allow one IR transmitter to be registered per board */ 1567ce5c41db3672c8b4419b16d9b3ac1ccf11a1445Andy Walls if (hw & IVTV_HW_IR_TX_ANY) { 1577ce5c41db3672c8b4419b16d9b3ac1ccf11a1445Andy Walls if (itv->hw_flags & IVTV_HW_IR_TX_ANY) 1587ce5c41db3672c8b4419b16d9b3ac1ccf11a1445Andy Walls return -1; 1597ce5c41db3672c8b4419b16d9b3ac1ccf11a1445Andy Walls memset(&info, 0, sizeof(struct i2c_board_info)); 1607ce5c41db3672c8b4419b16d9b3ac1ccf11a1445Andy Walls strlcpy(info.type, type, I2C_NAME_SIZE); 1619a94241afcc9a481691a9c29b7460217925b59b8Jean Delvare return i2c_new_probed_device(adap, &info, addr_list, NULL) 1629a94241afcc9a481691a9c29b7460217925b59b8Jean Delvare == NULL ? -1 : 0; 1637ce5c41db3672c8b4419b16d9b3ac1ccf11a1445Andy Walls } 1647ce5c41db3672c8b4419b16d9b3ac1ccf11a1445Andy Walls 1657ce5c41db3672c8b4419b16d9b3ac1ccf11a1445Andy Walls /* Only allow one IR receiver to be registered per board */ 1667ce5c41db3672c8b4419b16d9b3ac1ccf11a1445Andy Walls if (itv->hw_flags & IVTV_HW_IR_RX_ANY) 1677ce5c41db3672c8b4419b16d9b3ac1ccf11a1445Andy Walls return -1; 1687ce5c41db3672c8b4419b16d9b3ac1ccf11a1445Andy Walls 169ad2fe2d48812029b0b674594f297d0723f7c6e8fAndy Walls /* Our default information for ir-kbd-i2c.c to use */ 170ad2fe2d48812029b0b674594f297d0723f7c6e8fAndy Walls switch (hw) { 171ad2fe2d48812029b0b674594f297d0723f7c6e8fAndy Walls case IVTV_HW_I2C_IR_RX_AVER: 17202858eedcb78a664215b918d98cdb753ce432ce6Mauro Carvalho Chehab init_data->ir_codes = RC_MAP_AVERMEDIA_CARDBUS; 173ad2fe2d48812029b0b674594f297d0723f7c6e8fAndy Walls init_data->internal_get_key_func = 174ad2fe2d48812029b0b674594f297d0723f7c6e8fAndy Walls IR_KBD_GET_KEY_AVERMEDIA_CARDBUS; 175ad2fe2d48812029b0b674594f297d0723f7c6e8fAndy Walls init_data->type = IR_TYPE_OTHER; 176ad2fe2d48812029b0b674594f297d0723f7c6e8fAndy Walls init_data->name = "AVerMedia AVerTV card"; 177ad2fe2d48812029b0b674594f297d0723f7c6e8fAndy Walls break; 1787ce5c41db3672c8b4419b16d9b3ac1ccf11a1445Andy Walls case IVTV_HW_I2C_IR_RX_HAUP_EXT: 1797ce5c41db3672c8b4419b16d9b3ac1ccf11a1445Andy Walls case IVTV_HW_I2C_IR_RX_HAUP_INT: 1807ce5c41db3672c8b4419b16d9b3ac1ccf11a1445Andy Walls /* Default to old black remote */ 18102858eedcb78a664215b918d98cdb753ce432ce6Mauro Carvalho Chehab init_data->ir_codes = RC_MAP_RC5_TV; 1827ce5c41db3672c8b4419b16d9b3ac1ccf11a1445Andy Walls init_data->internal_get_key_func = IR_KBD_GET_KEY_HAUP; 1837ce5c41db3672c8b4419b16d9b3ac1ccf11a1445Andy Walls init_data->type = IR_TYPE_RC5; 1847ce5c41db3672c8b4419b16d9b3ac1ccf11a1445Andy Walls init_data->name = itv->card_name; 1857ce5c41db3672c8b4419b16d9b3ac1ccf11a1445Andy Walls break; 1867ce5c41db3672c8b4419b16d9b3ac1ccf11a1445Andy Walls case IVTV_HW_Z8F0811_IR_RX_HAUP: 1877ce5c41db3672c8b4419b16d9b3ac1ccf11a1445Andy Walls /* Default to grey remote */ 18802858eedcb78a664215b918d98cdb753ce432ce6Mauro Carvalho Chehab init_data->ir_codes = RC_MAP_HAUPPAUGE_NEW; 1897ce5c41db3672c8b4419b16d9b3ac1ccf11a1445Andy Walls init_data->internal_get_key_func = IR_KBD_GET_KEY_HAUP_XVR; 1907ce5c41db3672c8b4419b16d9b3ac1ccf11a1445Andy Walls init_data->type = IR_TYPE_RC5; 1917ce5c41db3672c8b4419b16d9b3ac1ccf11a1445Andy Walls init_data->name = itv->card_name; 1927ce5c41db3672c8b4419b16d9b3ac1ccf11a1445Andy Walls break; 193ad2fe2d48812029b0b674594f297d0723f7c6e8fAndy Walls } 194ad2fe2d48812029b0b674594f297d0723f7c6e8fAndy Walls 195ad2fe2d48812029b0b674594f297d0723f7c6e8fAndy Walls memset(&info, 0, sizeof(struct i2c_board_info)); 196ad2fe2d48812029b0b674594f297d0723f7c6e8fAndy Walls info.platform_data = init_data; 197ad2fe2d48812029b0b674594f297d0723f7c6e8fAndy Walls strlcpy(info.type, type, I2C_NAME_SIZE); 198ad2fe2d48812029b0b674594f297d0723f7c6e8fAndy Walls 1999a94241afcc9a481691a9c29b7460217925b59b8Jean Delvare return i2c_new_probed_device(adap, &info, addr_list, NULL) == NULL ? 2009a94241afcc9a481691a9c29b7460217925b59b8Jean Delvare -1 : 0; 201ad2fe2d48812029b0b674594f297d0723f7c6e8fAndy Walls} 202ad2fe2d48812029b0b674594f297d0723f7c6e8fAndy Walls 203bfbde8ee56d4a19e2d36a5a24b6dbfd298298bf1Andy Walls/* Instantiate the IR receiver device using probing -- undesirable */ 204bfbde8ee56d4a19e2d36a5a24b6dbfd298298bf1Andy Wallsstruct i2c_client *ivtv_i2c_new_ir_legacy(struct ivtv *itv) 205bfbde8ee56d4a19e2d36a5a24b6dbfd298298bf1Andy Walls{ 206bfbde8ee56d4a19e2d36a5a24b6dbfd298298bf1Andy Walls struct i2c_board_info info; 207bfbde8ee56d4a19e2d36a5a24b6dbfd298298bf1Andy Walls /* 208bfbde8ee56d4a19e2d36a5a24b6dbfd298298bf1Andy Walls * The external IR receiver is at i2c address 0x34. 209bfbde8ee56d4a19e2d36a5a24b6dbfd298298bf1Andy Walls * The internal IR receiver is at i2c address 0x30. 210bfbde8ee56d4a19e2d36a5a24b6dbfd298298bf1Andy Walls * 211bfbde8ee56d4a19e2d36a5a24b6dbfd298298bf1Andy Walls * In theory, both can be fitted, and Hauppauge suggests an external 212bfbde8ee56d4a19e2d36a5a24b6dbfd298298bf1Andy Walls * overrides an internal. That's why we probe 0x1a (~0x34) first. CB 213bfbde8ee56d4a19e2d36a5a24b6dbfd298298bf1Andy Walls * 214bfbde8ee56d4a19e2d36a5a24b6dbfd298298bf1Andy Walls * Some of these addresses we probe may collide with other i2c address 215bfbde8ee56d4a19e2d36a5a24b6dbfd298298bf1Andy Walls * allocations, so this function must be called after all other i2c 216bfbde8ee56d4a19e2d36a5a24b6dbfd298298bf1Andy Walls * devices we care about are registered. 217bfbde8ee56d4a19e2d36a5a24b6dbfd298298bf1Andy Walls */ 218bfbde8ee56d4a19e2d36a5a24b6dbfd298298bf1Andy Walls const unsigned short addr_list[] = { 219bfbde8ee56d4a19e2d36a5a24b6dbfd298298bf1Andy Walls 0x1a, /* Hauppauge IR external - collides with WM8739 */ 220bfbde8ee56d4a19e2d36a5a24b6dbfd298298bf1Andy Walls 0x18, /* Hauppauge IR internal */ 221bfbde8ee56d4a19e2d36a5a24b6dbfd298298bf1Andy Walls 0x71, /* Hauppauge IR (PVR150) */ 222bfbde8ee56d4a19e2d36a5a24b6dbfd298298bf1Andy Walls 0x6b, /* Adaptec IR */ 223bfbde8ee56d4a19e2d36a5a24b6dbfd298298bf1Andy Walls I2C_CLIENT_END 224bfbde8ee56d4a19e2d36a5a24b6dbfd298298bf1Andy Walls }; 225bfbde8ee56d4a19e2d36a5a24b6dbfd298298bf1Andy Walls 226bfbde8ee56d4a19e2d36a5a24b6dbfd298298bf1Andy Walls memset(&info, 0, sizeof(struct i2c_board_info)); 227bfbde8ee56d4a19e2d36a5a24b6dbfd298298bf1Andy Walls strlcpy(info.type, "ir_video", I2C_NAME_SIZE); 2289a94241afcc9a481691a9c29b7460217925b59b8Jean Delvare return i2c_new_probed_device(&itv->i2c_adap, &info, addr_list, NULL); 229bfbde8ee56d4a19e2d36a5a24b6dbfd298298bf1Andy Walls} 230bfbde8ee56d4a19e2d36a5a24b6dbfd298298bf1Andy Walls 231d9009201207c4bdce9b95a0bd903b3f087e8eda1Hans Verkuilint ivtv_i2c_register(struct ivtv *itv, unsigned idx) 2321a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil{ 23367ec09fdf5e05d4670b617256c696348b5df080bHans Verkuil struct v4l2_subdev *sd; 23467ec09fdf5e05d4670b617256c696348b5df080bHans Verkuil struct i2c_adapter *adap = &itv->i2c_adap; 23567ec09fdf5e05d4670b617256c696348b5df080bHans Verkuil const char *type = hw_devicenames[idx]; 23667ec09fdf5e05d4670b617256c696348b5df080bHans Verkuil u32 hw = 1 << idx; 2371a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil 23867ec09fdf5e05d4670b617256c696348b5df080bHans Verkuil if (idx >= ARRAY_SIZE(hw_addrs)) 239d9009201207c4bdce9b95a0bd903b3f087e8eda1Hans Verkuil return -1; 24067ec09fdf5e05d4670b617256c696348b5df080bHans Verkuil if (hw == IVTV_HW_TUNER) { 24167ec09fdf5e05d4670b617256c696348b5df080bHans Verkuil /* special tuner handling */ 24253dacb15705901e14b03dcba27e40364fedd9d09Hans Verkuil sd = v4l2_i2c_new_subdev(&itv->v4l2_dev, 24384d0d4f0674c55d0625bd1b6eb91dba4ef3948f9Laurent Pinchart adap, NULL, type, 24453dacb15705901e14b03dcba27e40364fedd9d09Hans Verkuil 0, itv->card_i2c->radio); 24567ec09fdf5e05d4670b617256c696348b5df080bHans Verkuil if (sd) 24667ec09fdf5e05d4670b617256c696348b5df080bHans Verkuil sd->grp_id = 1 << idx; 24753dacb15705901e14b03dcba27e40364fedd9d09Hans Verkuil sd = v4l2_i2c_new_subdev(&itv->v4l2_dev, 24884d0d4f0674c55d0625bd1b6eb91dba4ef3948f9Laurent Pinchart adap, NULL, type, 24953dacb15705901e14b03dcba27e40364fedd9d09Hans Verkuil 0, itv->card_i2c->demod); 25067ec09fdf5e05d4670b617256c696348b5df080bHans Verkuil if (sd) 25167ec09fdf5e05d4670b617256c696348b5df080bHans Verkuil sd->grp_id = 1 << idx; 25253dacb15705901e14b03dcba27e40364fedd9d09Hans Verkuil sd = v4l2_i2c_new_subdev(&itv->v4l2_dev, 25384d0d4f0674c55d0625bd1b6eb91dba4ef3948f9Laurent Pinchart adap, NULL, type, 25453dacb15705901e14b03dcba27e40364fedd9d09Hans Verkuil 0, itv->card_i2c->tv); 25567ec09fdf5e05d4670b617256c696348b5df080bHans Verkuil if (sd) 25667ec09fdf5e05d4670b617256c696348b5df080bHans Verkuil sd->grp_id = 1 << idx; 25767ec09fdf5e05d4670b617256c696348b5df080bHans Verkuil return sd ? 0 : -1; 2581a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil } 259ad2fe2d48812029b0b674594f297d0723f7c6e8fAndy Walls 260ad2fe2d48812029b0b674594f297d0723f7c6e8fAndy Walls if (hw & IVTV_HW_IR_ANY) 261ad2fe2d48812029b0b674594f297d0723f7c6e8fAndy Walls return ivtv_i2c_new_ir(itv, hw, type, hw_addrs[idx]); 262ad2fe2d48812029b0b674594f297d0723f7c6e8fAndy Walls 263ad2fe2d48812029b0b674594f297d0723f7c6e8fAndy Walls /* Is it not an I2C device or one we do not wish to register? */ 26467ec09fdf5e05d4670b617256c696348b5df080bHans Verkuil if (!hw_addrs[idx]) 26567ec09fdf5e05d4670b617256c696348b5df080bHans Verkuil return -1; 266ad2fe2d48812029b0b674594f297d0723f7c6e8fAndy Walls 267ad2fe2d48812029b0b674594f297d0723f7c6e8fAndy Walls /* It's an I2C device other than an analog tuner or IR chip */ 26867ec09fdf5e05d4670b617256c696348b5df080bHans Verkuil if (hw == IVTV_HW_UPD64031A || hw == IVTV_HW_UPD6408X) { 26953dacb15705901e14b03dcba27e40364fedd9d09Hans Verkuil sd = v4l2_i2c_new_subdev(&itv->v4l2_dev, 27084d0d4f0674c55d0625bd1b6eb91dba4ef3948f9Laurent Pinchart adap, NULL, type, 0, I2C_ADDRS(hw_addrs[idx])); 27172c851b00f6c86353c54fdd9f1ef88d82e8df6c5Hans Verkuil } else if (hw == IVTV_HW_CX25840) { 27272c851b00f6c86353c54fdd9f1ef88d82e8df6c5Hans Verkuil struct cx25840_platform_data pdata; 27372c851b00f6c86353c54fdd9f1ef88d82e8df6c5Hans Verkuil 27472c851b00f6c86353c54fdd9f1ef88d82e8df6c5Hans Verkuil pdata.pvr150_workaround = itv->pvr150_workaround; 27572c851b00f6c86353c54fdd9f1ef88d82e8df6c5Hans Verkuil sd = v4l2_i2c_new_subdev_cfg(&itv->v4l2_dev, 27684d0d4f0674c55d0625bd1b6eb91dba4ef3948f9Laurent Pinchart adap, NULL, type, 0, &pdata, hw_addrs[idx], 27784d0d4f0674c55d0625bd1b6eb91dba4ef3948f9Laurent Pinchart NULL); 27867ec09fdf5e05d4670b617256c696348b5df080bHans Verkuil } else { 279e6574f2fbecdb8af807169d345c10131ae060a88Hans Verkuil sd = v4l2_i2c_new_subdev(&itv->v4l2_dev, 28084d0d4f0674c55d0625bd1b6eb91dba4ef3948f9Laurent Pinchart adap, NULL, type, hw_addrs[idx], NULL); 281d9009201207c4bdce9b95a0bd903b3f087e8eda1Hans Verkuil } 28267ec09fdf5e05d4670b617256c696348b5df080bHans Verkuil if (sd) 28367ec09fdf5e05d4670b617256c696348b5df080bHans Verkuil sd->grp_id = 1 << idx; 28467ec09fdf5e05d4670b617256c696348b5df080bHans Verkuil return sd ? 0 : -1; 2851a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil} 2861a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil 28767ec09fdf5e05d4670b617256c696348b5df080bHans Verkuilstruct v4l2_subdev *ivtv_find_hw(struct ivtv *itv, u32 hw) 2881a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil{ 28967ec09fdf5e05d4670b617256c696348b5df080bHans Verkuil struct v4l2_subdev *result = NULL; 29067ec09fdf5e05d4670b617256c696348b5df080bHans Verkuil struct v4l2_subdev *sd; 2911a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil 2928ac05ae3192ce8a71fc84e4a88772cce0c09173cHans Verkuil spin_lock(&itv->v4l2_dev.lock); 2938ac05ae3192ce8a71fc84e4a88772cce0c09173cHans Verkuil v4l2_device_for_each_subdev(sd, &itv->v4l2_dev) { 29467ec09fdf5e05d4670b617256c696348b5df080bHans Verkuil if (sd->grp_id == hw) { 29567ec09fdf5e05d4670b617256c696348b5df080bHans Verkuil result = sd; 2961a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil break; 2971a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil } 2981a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil } 2998ac05ae3192ce8a71fc84e4a88772cce0c09173cHans Verkuil spin_unlock(&itv->v4l2_dev.lock); 30067ec09fdf5e05d4670b617256c696348b5df080bHans Verkuil return result; 3011a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil} 3021a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil 3031a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil/* Set the serial clock line to the desired state */ 3041a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuilstatic void ivtv_setscl(struct ivtv *itv, int state) 3051a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil{ 3061a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil /* write them out */ 3071a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil /* write bits are inverted */ 3081a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil write_reg(~state, IVTV_REG_I2C_SETSCL_OFFSET); 3091a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil} 3101a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil 3111a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil/* Set the serial data line to the desired state */ 3121a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuilstatic void ivtv_setsda(struct ivtv *itv, int state) 3131a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil{ 3141a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil /* write them out */ 3151a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil /* write bits are inverted */ 3161a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil write_reg(~state & 1, IVTV_REG_I2C_SETSDA_OFFSET); 3171a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil} 3181a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil 3191a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil/* Read the serial clock line */ 3201a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuilstatic int ivtv_getscl(struct ivtv *itv) 3211a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil{ 3221a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil return read_reg(IVTV_REG_I2C_GETSCL_OFFSET) & 1; 3231a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil} 3241a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil 3251a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil/* Read the serial data line */ 3261a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuilstatic int ivtv_getsda(struct ivtv *itv) 3271a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil{ 3281a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil return read_reg(IVTV_REG_I2C_GETSDA_OFFSET) & 1; 3291a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil} 3301a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil 3311a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil/* Implement a short delay by polling the serial clock line */ 3321a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuilstatic void ivtv_scldelay(struct ivtv *itv) 3331a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil{ 3341a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil int i; 3351a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil 3361a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil for (i = 0; i < 5; ++i) 3371a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil ivtv_getscl(itv); 3381a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil} 3391a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil 3401a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil/* Wait for the serial clock line to become set to a specific value */ 3411a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuilstatic int ivtv_waitscl(struct ivtv *itv, int val) 3421a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil{ 3431a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil int i; 3441a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil 3451a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil ivtv_scldelay(itv); 3461a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil for (i = 0; i < 1000; ++i) { 3471a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil if (ivtv_getscl(itv) == val) 3481a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil return 1; 3491a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil } 3501a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil return 0; 3511a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil} 3521a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil 3531a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil/* Wait for the serial data line to become set to a specific value */ 3541a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuilstatic int ivtv_waitsda(struct ivtv *itv, int val) 3551a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil{ 3561a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil int i; 3571a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil 3581a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil ivtv_scldelay(itv); 3591a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil for (i = 0; i < 1000; ++i) { 3601a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil if (ivtv_getsda(itv) == val) 3611a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil return 1; 3621a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil } 3631a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil return 0; 3641a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil} 3651a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil 3661a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil/* Wait for the slave to issue an ACK */ 3671a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuilstatic int ivtv_ack(struct ivtv *itv) 3681a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil{ 3691a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil int ret = 0; 3701a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil 3711a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil if (ivtv_getscl(itv) == 1) { 37211d28766deedc8bcadc87db8a65775a41c15789aHans Verkuil IVTV_DEBUG_HI_I2C("SCL was high starting an ack\n"); 3731a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil ivtv_setscl(itv, 0); 3741a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil if (!ivtv_waitscl(itv, 0)) { 3751a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil IVTV_DEBUG_I2C("Could not set SCL low starting an ack\n"); 3761a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil return -EREMOTEIO; 3771a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil } 3781a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil } 3791a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil ivtv_setsda(itv, 1); 3801a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil ivtv_scldelay(itv); 3811a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil ivtv_setscl(itv, 1); 3821a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil if (!ivtv_waitsda(itv, 0)) { 3831a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil IVTV_DEBUG_I2C("Slave did not ack\n"); 3841a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil ret = -EREMOTEIO; 3851a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil } 3861a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil ivtv_setscl(itv, 0); 3871a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil if (!ivtv_waitscl(itv, 0)) { 3881a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil IVTV_DEBUG_I2C("Failed to set SCL low after ACK\n"); 3891a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil ret = -EREMOTEIO; 3901a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil } 3911a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil return ret; 3921a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil} 3931a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil 3941a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil/* Write a single byte to the i2c bus and wait for the slave to ACK */ 3951a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuilstatic int ivtv_sendbyte(struct ivtv *itv, unsigned char byte) 3961a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil{ 3971a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil int i, bit; 3981a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil 39911d28766deedc8bcadc87db8a65775a41c15789aHans Verkuil IVTV_DEBUG_HI_I2C("write %x\n",byte); 4001a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil for (i = 0; i < 8; ++i, byte<<=1) { 4011a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil ivtv_setscl(itv, 0); 4021a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil if (!ivtv_waitscl(itv, 0)) { 4031a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil IVTV_DEBUG_I2C("Error setting SCL low\n"); 4041a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil return -EREMOTEIO; 4051a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil } 4061a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil bit = (byte>>7)&1; 4071a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil ivtv_setsda(itv, bit); 4081a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil if (!ivtv_waitsda(itv, bit)) { 4091a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil IVTV_DEBUG_I2C("Error setting SDA\n"); 4101a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil return -EREMOTEIO; 4111a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil } 4121a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil ivtv_setscl(itv, 1); 4131a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil if (!ivtv_waitscl(itv, 1)) { 4141a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil IVTV_DEBUG_I2C("Slave not ready for bit\n"); 4151a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil return -EREMOTEIO; 4161a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil } 4171a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil } 4181a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil ivtv_setscl(itv, 0); 4191a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil if (!ivtv_waitscl(itv, 0)) { 4201a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil IVTV_DEBUG_I2C("Error setting SCL low\n"); 4211a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil return -EREMOTEIO; 4221a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil } 4231a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil return ivtv_ack(itv); 4241a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil} 4251a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil 4261a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil/* Read a byte from the i2c bus and send a NACK if applicable (i.e. for the 4271a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil final byte) */ 4281a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuilstatic int ivtv_readbyte(struct ivtv *itv, unsigned char *byte, int nack) 4291a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil{ 4301a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil int i; 4311a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil 4321a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil *byte = 0; 4331a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil 4341a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil ivtv_setsda(itv, 1); 4351a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil ivtv_scldelay(itv); 4361a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil for (i = 0; i < 8; ++i) { 4371a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil ivtv_setscl(itv, 0); 4381a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil ivtv_scldelay(itv); 4391a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil ivtv_setscl(itv, 1); 4401a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil if (!ivtv_waitscl(itv, 1)) { 4411a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil IVTV_DEBUG_I2C("Error setting SCL high\n"); 4421a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil return -EREMOTEIO; 4431a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil } 4441a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil *byte = ((*byte)<<1)|ivtv_getsda(itv); 4451a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil } 4461a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil ivtv_setscl(itv, 0); 4471a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil ivtv_scldelay(itv); 4481a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil ivtv_setsda(itv, nack); 4491a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil ivtv_scldelay(itv); 4501a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil ivtv_setscl(itv, 1); 4511a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil ivtv_scldelay(itv); 4521a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil ivtv_setscl(itv, 0); 4531a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil ivtv_scldelay(itv); 45411d28766deedc8bcadc87db8a65775a41c15789aHans Verkuil IVTV_DEBUG_HI_I2C("read %x\n",*byte); 4551a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil return 0; 4561a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil} 4571a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil 4581a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil/* Issue a start condition on the i2c bus to alert slaves to prepare for 4591a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil an address write */ 4601a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuilstatic int ivtv_start(struct ivtv *itv) 4611a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil{ 4621a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil int sda; 4631a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil 4641a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil sda = ivtv_getsda(itv); 4651a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil if (sda != 1) { 46611d28766deedc8bcadc87db8a65775a41c15789aHans Verkuil IVTV_DEBUG_HI_I2C("SDA was low at start\n"); 4671a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil ivtv_setsda(itv, 1); 4681a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil if (!ivtv_waitsda(itv, 1)) { 4691a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil IVTV_DEBUG_I2C("SDA stuck low\n"); 4701a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil return -EREMOTEIO; 4711a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil } 4721a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil } 4731a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil if (ivtv_getscl(itv) != 1) { 4741a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil ivtv_setscl(itv, 1); 4751a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil if (!ivtv_waitscl(itv, 1)) { 4761a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil IVTV_DEBUG_I2C("SCL stuck low at start\n"); 4771a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil return -EREMOTEIO; 4781a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil } 4791a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil } 4801a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil ivtv_setsda(itv, 0); 4811a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil ivtv_scldelay(itv); 4821a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil return 0; 4831a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil} 4841a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil 4851a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil/* Issue a stop condition on the i2c bus to release it */ 4861a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuilstatic int ivtv_stop(struct ivtv *itv) 4871a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil{ 4881a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil int i; 4891a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil 4901a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil if (ivtv_getscl(itv) != 0) { 49111d28766deedc8bcadc87db8a65775a41c15789aHans Verkuil IVTV_DEBUG_HI_I2C("SCL not low when stopping\n"); 4921a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil ivtv_setscl(itv, 0); 4931a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil if (!ivtv_waitscl(itv, 0)) { 4941a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil IVTV_DEBUG_I2C("SCL could not be set low\n"); 4951a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil } 4961a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil } 4971a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil ivtv_setsda(itv, 0); 4981a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil ivtv_scldelay(itv); 4991a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil ivtv_setscl(itv, 1); 5001a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil if (!ivtv_waitscl(itv, 1)) { 5011a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil IVTV_DEBUG_I2C("SCL could not be set high\n"); 5021a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil return -EREMOTEIO; 5031a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil } 5041a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil ivtv_scldelay(itv); 5051a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil ivtv_setsda(itv, 1); 5061a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil if (!ivtv_waitsda(itv, 1)) { 5071a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil IVTV_DEBUG_I2C("resetting I2C\n"); 5081a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil for (i = 0; i < 16; ++i) { 5091a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil ivtv_setscl(itv, 0); 5101a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil ivtv_scldelay(itv); 5111a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil ivtv_setscl(itv, 1); 5121a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil ivtv_scldelay(itv); 5131a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil ivtv_setsda(itv, 1); 5141a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil } 5151a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil ivtv_waitsda(itv, 1); 5161a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil return -EREMOTEIO; 5171a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil } 5181a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil return 0; 5191a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil} 5201a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil 5211a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil/* Write a message to the given i2c slave. do_stop may be 0 to prevent 5221a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil issuing the i2c stop condition (when following with a read) */ 5231a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuilstatic int ivtv_write(struct ivtv *itv, unsigned char addr, unsigned char *data, u32 len, int do_stop) 5241a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil{ 5251a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil int retry, ret = -EREMOTEIO; 5261a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil u32 i; 5271a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil 5281a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil for (retry = 0; ret != 0 && retry < 8; ++retry) { 5291a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil ret = ivtv_start(itv); 5301a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil 5311a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil if (ret == 0) { 5321a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil ret = ivtv_sendbyte(itv, addr<<1); 5331a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil for (i = 0; ret == 0 && i < len; ++i) 5341a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil ret = ivtv_sendbyte(itv, data[i]); 5351a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil } 5361a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil if (ret != 0 || do_stop) { 5371a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil ivtv_stop(itv); 5381a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil } 5391a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil } 5401a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil if (ret) 5411a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil IVTV_DEBUG_I2C("i2c write to %x failed\n", addr); 5421a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil return ret; 5431a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil} 5441a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil 5451a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil/* Read data from the given i2c slave. A stop condition is always issued. */ 5461a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuilstatic int ivtv_read(struct ivtv *itv, unsigned char addr, unsigned char *data, u32 len) 5471a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil{ 5481a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil int retry, ret = -EREMOTEIO; 5491a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil u32 i; 5501a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil 5511a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil for (retry = 0; ret != 0 && retry < 8; ++retry) { 5521a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil ret = ivtv_start(itv); 5531a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil if (ret == 0) 5541a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil ret = ivtv_sendbyte(itv, (addr << 1) | 1); 5551a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil for (i = 0; ret == 0 && i < len; ++i) { 5561a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil ret = ivtv_readbyte(itv, &data[i], i == len - 1); 5571a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil } 5581a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil ivtv_stop(itv); 5591a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil } 5601a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil if (ret) 5611a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil IVTV_DEBUG_I2C("i2c read from %x failed\n", addr); 5621a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil return ret; 5631a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil} 5641a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil 5651a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil/* Kernel i2c transfer implementation. Takes a number of messages to be read 5661a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil or written. If a read follows a write, this will occur without an 5671a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil intervening stop condition */ 5681a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuilstatic int ivtv_xfer(struct i2c_adapter *i2c_adap, struct i2c_msg *msgs, int num) 5691a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil{ 5708ac05ae3192ce8a71fc84e4a88772cce0c09173cHans Verkuil struct v4l2_device *v4l2_dev = i2c_get_adapdata(i2c_adap); 5718ac05ae3192ce8a71fc84e4a88772cce0c09173cHans Verkuil struct ivtv *itv = to_ivtv(v4l2_dev); 5721a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil int retval; 5731a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil int i; 5741a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil 5751a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil mutex_lock(&itv->i2c_bus_lock); 5761a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil for (i = retval = 0; retval == 0 && i < num; i++) { 5771a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil if (msgs[i].flags & I2C_M_RD) 5781a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil retval = ivtv_read(itv, msgs[i].addr, msgs[i].buf, msgs[i].len); 5791a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil else { 5801a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil /* if followed by a read, don't stop */ 5811a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil int stop = !(i + 1 < num && msgs[i + 1].flags == I2C_M_RD); 5821a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil 5831a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil retval = ivtv_write(itv, msgs[i].addr, msgs[i].buf, msgs[i].len, stop); 5841a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil } 5851a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil } 5861a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil mutex_unlock(&itv->i2c_bus_lock); 5871a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil return retval ? retval : num; 5881a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil} 5891a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil 5901a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil/* Kernel i2c capabilities */ 5911a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuilstatic u32 ivtv_functionality(struct i2c_adapter *adap) 5921a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil{ 5931a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL; 5941a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil} 5951a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil 5961a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuilstatic struct i2c_algorithm ivtv_algo = { 5971a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil .master_xfer = ivtv_xfer, 5981a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil .functionality = ivtv_functionality, 5991a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil}; 6001a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil 6011a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil/* template for our-bit banger */ 6021a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuilstatic struct i2c_adapter ivtv_i2c_adap_hw_template = { 6031a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil .name = "ivtv i2c driver", 6041a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil .algo = &ivtv_algo, 6051a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil .algo_data = NULL, /* filled from template */ 6061a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil .owner = THIS_MODULE, 6071a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil}; 6081a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil 6091a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuilstatic void ivtv_setscl_old(void *data, int state) 6101a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil{ 6111a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil struct ivtv *itv = (struct ivtv *)data; 6121a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil 6131a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil if (state) 6141a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil itv->i2c_state |= 0x01; 6151a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil else 6161a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil itv->i2c_state &= ~0x01; 6171a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil 6181a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil /* write them out */ 6191a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil /* write bits are inverted */ 6201a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil write_reg(~itv->i2c_state, IVTV_REG_I2C_SETSCL_OFFSET); 6211a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil} 6221a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil 6231a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuilstatic void ivtv_setsda_old(void *data, int state) 6241a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil{ 6251a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil struct ivtv *itv = (struct ivtv *)data; 6261a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil 6271a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil if (state) 6281a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil itv->i2c_state |= 0x01; 6291a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil else 6301a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil itv->i2c_state &= ~0x01; 6311a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil 6321a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil /* write them out */ 6331a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil /* write bits are inverted */ 6341a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil write_reg(~itv->i2c_state, IVTV_REG_I2C_SETSDA_OFFSET); 6351a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil} 6361a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil 6371a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuilstatic int ivtv_getscl_old(void *data) 6381a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil{ 6391a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil struct ivtv *itv = (struct ivtv *)data; 6401a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil 6411a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil return read_reg(IVTV_REG_I2C_GETSCL_OFFSET) & 1; 6421a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil} 6431a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil 6441a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuilstatic int ivtv_getsda_old(void *data) 6451a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil{ 6461a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil struct ivtv *itv = (struct ivtv *)data; 6471a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil 6481a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil return read_reg(IVTV_REG_I2C_GETSDA_OFFSET) & 1; 6491a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil} 6501a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil 6511a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil/* template for i2c-bit-algo */ 6521a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuilstatic struct i2c_adapter ivtv_i2c_adap_template = { 6531a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil .name = "ivtv i2c driver", 6541a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil .algo = NULL, /* set by i2c-algo-bit */ 6551a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil .algo_data = NULL, /* filled from template */ 6561a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil .owner = THIS_MODULE, 6571a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil}; 6581a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil 659f412d36a8c9f8e40e057b71e80d534ac388e903eAndy Walls#define IVTV_ALGO_BIT_TIMEOUT (2) /* seconds */ 660f412d36a8c9f8e40e057b71e80d534ac388e903eAndy Walls 661aeb292d1342c649ac0b35ae9205b761fd14adb57Jean Delvarestatic const struct i2c_algo_bit_data ivtv_i2c_algo_template = { 662aeb292d1342c649ac0b35ae9205b761fd14adb57Jean Delvare .setsda = ivtv_setsda_old, 663aeb292d1342c649ac0b35ae9205b761fd14adb57Jean Delvare .setscl = ivtv_setscl_old, 664aeb292d1342c649ac0b35ae9205b761fd14adb57Jean Delvare .getsda = ivtv_getsda_old, 665aeb292d1342c649ac0b35ae9205b761fd14adb57Jean Delvare .getscl = ivtv_getscl_old, 666f412d36a8c9f8e40e057b71e80d534ac388e903eAndy Walls .udelay = IVTV_DEFAULT_I2C_CLOCK_PERIOD / 2, /* microseconds */ 667f412d36a8c9f8e40e057b71e80d534ac388e903eAndy Walls .timeout = IVTV_ALGO_BIT_TIMEOUT * HZ, /* jiffies */ 6681a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil}; 6691a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil 6701a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuilstatic struct i2c_client ivtv_i2c_client_template = { 671a415783bbb9fba7be2eeaeb5e3e08262bd3d64a1Andrew Morton .name = "ivtv internal", 6721a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil}; 6731a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil 674bfbde8ee56d4a19e2d36a5a24b6dbfd298298bf1Andy Walls/* init + register i2c adapter */ 675056827a49ce65a8d10197d35468500b501d1eec1Adrian Bunkint init_ivtv_i2c(struct ivtv *itv) 6761a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil{ 677c668f32dca105d876e51862a003a302fa61e4ae4Jean Delvare int retval; 678c668f32dca105d876e51862a003a302fa61e4ae4Jean Delvare 6791a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil IVTV_DEBUG_I2C("i2c init\n"); 6801a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil 681d9009201207c4bdce9b95a0bd903b3f087e8eda1Hans Verkuil /* Sanity checks for the I2C hardware arrays. They must be the 682ad2fe2d48812029b0b674594f297d0723f7c6e8fAndy Walls * same size. 683d9009201207c4bdce9b95a0bd903b3f087e8eda1Hans Verkuil */ 68484d0d4f0674c55d0625bd1b6eb91dba4ef3948f9Laurent Pinchart if (ARRAY_SIZE(hw_devicenames) != ARRAY_SIZE(hw_addrs)) { 685d9009201207c4bdce9b95a0bd903b3f087e8eda1Hans Verkuil IVTV_ERR("Mismatched I2C hardware arrays\n"); 686d9009201207c4bdce9b95a0bd903b3f087e8eda1Hans Verkuil return -ENODEV; 687d9009201207c4bdce9b95a0bd903b3f087e8eda1Hans Verkuil } 6881a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil if (itv->options.newi2c > 0) { 6891a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil memcpy(&itv->i2c_adap, &ivtv_i2c_adap_hw_template, 6901a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil sizeof(struct i2c_adapter)); 6911a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil } else { 6921a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil memcpy(&itv->i2c_adap, &ivtv_i2c_adap_template, 6931a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil sizeof(struct i2c_adapter)); 6941a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil memcpy(&itv->i2c_algo, &ivtv_i2c_algo_template, 6951a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil sizeof(struct i2c_algo_bit_data)); 6961a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil } 697f412d36a8c9f8e40e057b71e80d534ac388e903eAndy Walls itv->i2c_algo.udelay = itv->options.i2c_clock_period / 2; 6980e614cd1a5a09b36a3b6d0fff8a08a97800d3cceHans Verkuil itv->i2c_algo.data = itv; 6990e614cd1a5a09b36a3b6d0fff8a08a97800d3cceHans Verkuil itv->i2c_adap.algo_data = &itv->i2c_algo; 7001a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil 7011a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil sprintf(itv->i2c_adap.name + strlen(itv->i2c_adap.name), " #%d", 70267ec09fdf5e05d4670b617256c696348b5df080bHans Verkuil itv->instance); 7038ac05ae3192ce8a71fc84e4a88772cce0c09173cHans Verkuil i2c_set_adapdata(&itv->i2c_adap, &itv->v4l2_dev); 7041a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil 7051a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil memcpy(&itv->i2c_client, &ivtv_i2c_client_template, 7061a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil sizeof(struct i2c_client)); 7071a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil itv->i2c_client.adapter = &itv->i2c_adap; 7088ac05ae3192ce8a71fc84e4a88772cce0c09173cHans Verkuil itv->i2c_adap.dev.parent = &itv->pdev->dev; 7091a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil 7101a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil IVTV_DEBUG_I2C("setting scl and sda to 1\n"); 7111a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil ivtv_setscl(itv, 1); 7121a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil ivtv_setsda(itv, 1); 7131a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil 7141a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil if (itv->options.newi2c > 0) 715c668f32dca105d876e51862a003a302fa61e4ae4Jean Delvare retval = i2c_add_adapter(&itv->i2c_adap); 7161a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil else 717c668f32dca105d876e51862a003a302fa61e4ae4Jean Delvare retval = i2c_bit_add_bus(&itv->i2c_adap); 718c668f32dca105d876e51862a003a302fa61e4ae4Jean Delvare 719c668f32dca105d876e51862a003a302fa61e4ae4Jean Delvare return retval; 7201a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil} 7211a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil 722bb374b7b938f73666c403b201b3dd48ec9fe118aDavid Millervoid exit_ivtv_i2c(struct ivtv *itv) 7231a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil{ 7241a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil IVTV_DEBUG_I2C("i2c exit\n"); 7251a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil 7261a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil i2c_del_adapter(&itv->i2c_adap); 7271a0adaf37c30e89e44d1470ef604a930999a5826Hans Verkuil} 728