1/* 2 * Driver for the Conexant CX23885 PCIe bridge 3 * 4 * Copyright (c) 2006 Steven Toth <stoth@linuxtv.org> 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License as published by 8 * the Free Software Foundation; either version 2 of the License, or 9 * (at your option) any later version. 10 * 11 * This program is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 * 15 * GNU General Public License for more details. 16 * 17 * You should have received a copy of the GNU General Public License 18 * along with this program; if not, write to the Free Software 19 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 20 */ 21 22#include <linux/module.h> 23#include <linux/moduleparam.h> 24#include <linux/init.h> 25#include <linux/delay.h> 26#include <asm/io.h> 27 28#include "cx23885.h" 29 30#include <media/v4l2-common.h> 31 32static unsigned int i2c_debug; 33module_param(i2c_debug, int, 0644); 34MODULE_PARM_DESC(i2c_debug, "enable debug messages [i2c]"); 35 36static unsigned int i2c_scan; 37module_param(i2c_scan, int, 0444); 38MODULE_PARM_DESC(i2c_scan, "scan i2c bus at insmod time"); 39 40#define dprintk(level, fmt, arg...)\ 41 do { if (i2c_debug >= level)\ 42 printk(KERN_DEBUG "%s/0: " fmt, dev->name, ## arg);\ 43 } while (0) 44 45#define I2C_WAIT_DELAY 32 46#define I2C_WAIT_RETRY 64 47 48#define I2C_EXTEND (1 << 3) 49#define I2C_NOSTOP (1 << 4) 50 51static inline int i2c_slave_did_ack(struct i2c_adapter *i2c_adap) 52{ 53 struct cx23885_i2c *bus = i2c_adap->algo_data; 54 struct cx23885_dev *dev = bus->dev; 55 return cx_read(bus->reg_stat) & 0x01; 56} 57 58static inline int i2c_is_busy(struct i2c_adapter *i2c_adap) 59{ 60 struct cx23885_i2c *bus = i2c_adap->algo_data; 61 struct cx23885_dev *dev = bus->dev; 62 return cx_read(bus->reg_stat) & 0x02 ? 1 : 0; 63} 64 65static int i2c_wait_done(struct i2c_adapter *i2c_adap) 66{ 67 int count; 68 69 for (count = 0; count < I2C_WAIT_RETRY; count++) { 70 if (!i2c_is_busy(i2c_adap)) 71 break; 72 udelay(I2C_WAIT_DELAY); 73 } 74 75 if (I2C_WAIT_RETRY == count) 76 return 0; 77 78 return 1; 79} 80 81static int i2c_sendbytes(struct i2c_adapter *i2c_adap, 82 const struct i2c_msg *msg, int joined_rlen) 83{ 84 struct cx23885_i2c *bus = i2c_adap->algo_data; 85 struct cx23885_dev *dev = bus->dev; 86 u32 wdata, addr, ctrl; 87 int retval, cnt; 88 89 if (joined_rlen) 90 dprintk(1, "%s(msg->wlen=%d, nextmsg->rlen=%d)\n", __func__, 91 msg->len, joined_rlen); 92 else 93 dprintk(1, "%s(msg->len=%d)\n", __func__, msg->len); 94 95 /* Deal with i2c probe functions with zero payload */ 96 if (msg->len == 0) { 97 cx_write(bus->reg_addr, msg->addr << 25); 98 cx_write(bus->reg_ctrl, bus->i2c_period | (1 << 2)); 99 if (!i2c_wait_done(i2c_adap)) 100 return -EIO; 101 if (!i2c_slave_did_ack(i2c_adap)) 102 return -ENXIO; 103 104 dprintk(1, "%s() returns 0\n", __func__); 105 return 0; 106 } 107 108 109 /* dev, reg + first byte */ 110 addr = (msg->addr << 25) | msg->buf[0]; 111 wdata = msg->buf[0]; 112 ctrl = bus->i2c_period | (1 << 12) | (1 << 2); 113 114 if (msg->len > 1) 115 ctrl |= I2C_NOSTOP | I2C_EXTEND; 116 else if (joined_rlen) 117 ctrl |= I2C_NOSTOP; 118 119 cx_write(bus->reg_addr, addr); 120 cx_write(bus->reg_wdata, wdata); 121 cx_write(bus->reg_ctrl, ctrl); 122 123 if (!i2c_wait_done(i2c_adap)) 124 goto eio; 125 if (!i2c_slave_did_ack(i2c_adap)) { 126 retval = -ENXIO; 127 goto err; 128 } 129 if (i2c_debug) { 130 printk(" <W %02x %02x", msg->addr << 1, msg->buf[0]); 131 if (!(ctrl & I2C_NOSTOP)) 132 printk(" >\n"); 133 } 134 135 for (cnt = 1; cnt < msg->len; cnt++) { 136 /* following bytes */ 137 wdata = msg->buf[cnt]; 138 ctrl = bus->i2c_period | (1 << 12) | (1 << 2); 139 140 if (cnt < msg->len - 1) 141 ctrl |= I2C_NOSTOP | I2C_EXTEND; 142 else if (joined_rlen) 143 ctrl |= I2C_NOSTOP; 144 145 cx_write(bus->reg_addr, addr); 146 cx_write(bus->reg_wdata, wdata); 147 cx_write(bus->reg_ctrl, ctrl); 148 149 if (!i2c_wait_done(i2c_adap)) 150 goto eio; 151 if (i2c_debug) { 152 dprintk(1, " %02x", msg->buf[cnt]); 153 if (!(ctrl & I2C_NOSTOP)) 154 dprintk(1, " >\n"); 155 } 156 } 157 return msg->len; 158 159 eio: 160 retval = -EIO; 161 err: 162 if (i2c_debug) 163 printk(KERN_ERR " ERR: %d\n", retval); 164 return retval; 165} 166 167static int i2c_readbytes(struct i2c_adapter *i2c_adap, 168 const struct i2c_msg *msg, int joined) 169{ 170 struct cx23885_i2c *bus = i2c_adap->algo_data; 171 struct cx23885_dev *dev = bus->dev; 172 u32 ctrl, cnt; 173 int retval; 174 175 176 if (i2c_debug && !joined) 177 dprintk(1, "%s(msg->len=%d)\n", __func__, msg->len); 178 179 /* Deal with i2c probe functions with zero payload */ 180 if (msg->len == 0) { 181 cx_write(bus->reg_addr, msg->addr << 25); 182 cx_write(bus->reg_ctrl, bus->i2c_period | (1 << 2) | 1); 183 if (!i2c_wait_done(i2c_adap)) 184 return -EIO; 185 if (!i2c_slave_did_ack(i2c_adap)) 186 return -ENXIO; 187 188 189 dprintk(1, "%s() returns 0\n", __func__); 190 return 0; 191 } 192 193 if (i2c_debug) { 194 if (joined) 195 dprintk(1, " R"); 196 else 197 dprintk(1, " <R %02x", (msg->addr << 1) + 1); 198 } 199 200 for (cnt = 0; cnt < msg->len; cnt++) { 201 202 ctrl = bus->i2c_period | (1 << 12) | (1 << 2) | 1; 203 204 if (cnt < msg->len - 1) 205 ctrl |= I2C_NOSTOP | I2C_EXTEND; 206 207 cx_write(bus->reg_addr, msg->addr << 25); 208 cx_write(bus->reg_ctrl, ctrl); 209 210 if (!i2c_wait_done(i2c_adap)) 211 goto eio; 212 if (cnt == 0 && !i2c_slave_did_ack(i2c_adap)) { 213 retval = -ENXIO; 214 goto err; 215 } 216 msg->buf[cnt] = cx_read(bus->reg_rdata) & 0xff; 217 if (i2c_debug) { 218 dprintk(1, " %02x", msg->buf[cnt]); 219 if (!(ctrl & I2C_NOSTOP)) 220 dprintk(1, " >\n"); 221 } 222 } 223 return msg->len; 224 225 eio: 226 retval = -EIO; 227 err: 228 if (i2c_debug) 229 printk(KERN_ERR " ERR: %d\n", retval); 230 return retval; 231} 232 233static int i2c_xfer(struct i2c_adapter *i2c_adap, 234 struct i2c_msg *msgs, int num) 235{ 236 struct cx23885_i2c *bus = i2c_adap->algo_data; 237 struct cx23885_dev *dev = bus->dev; 238 int i, retval = 0; 239 240 dprintk(1, "%s(num = %d)\n", __func__, num); 241 242 for (i = 0 ; i < num; i++) { 243 dprintk(1, "%s(num = %d) addr = 0x%02x len = 0x%x\n", 244 __func__, num, msgs[i].addr, msgs[i].len); 245 if (msgs[i].flags & I2C_M_RD) { 246 /* read */ 247 retval = i2c_readbytes(i2c_adap, &msgs[i], 0); 248 } else if (i + 1 < num && (msgs[i + 1].flags & I2C_M_RD) && 249 msgs[i].addr == msgs[i + 1].addr) { 250 /* write then read from same address */ 251 retval = i2c_sendbytes(i2c_adap, &msgs[i], 252 msgs[i + 1].len); 253 if (retval < 0) 254 goto err; 255 i++; 256 retval = i2c_readbytes(i2c_adap, &msgs[i], 1); 257 } else { 258 /* write */ 259 retval = i2c_sendbytes(i2c_adap, &msgs[i], 0); 260 } 261 if (retval < 0) 262 goto err; 263 } 264 return num; 265 266 err: 267 return retval; 268} 269 270static u32 cx23885_functionality(struct i2c_adapter *adap) 271{ 272 return I2C_FUNC_SMBUS_EMUL | I2C_FUNC_I2C; 273} 274 275static struct i2c_algorithm cx23885_i2c_algo_template = { 276 .master_xfer = i2c_xfer, 277 .functionality = cx23885_functionality, 278}; 279 280/* ----------------------------------------------------------------------- */ 281 282static struct i2c_adapter cx23885_i2c_adap_template = { 283 .name = "cx23885", 284 .owner = THIS_MODULE, 285 .algo = &cx23885_i2c_algo_template, 286}; 287 288static struct i2c_client cx23885_i2c_client_template = { 289 .name = "cx23885 internal", 290}; 291 292static char *i2c_devs[128] = { 293 [0x10 >> 1] = "tda10048", 294 [0x12 >> 1] = "dib7000pc", 295 [0x1c >> 1] = "lgdt3303", 296 [0x86 >> 1] = "tda9887", 297 [0x32 >> 1] = "cx24227", 298 [0x88 >> 1] = "cx25837", 299 [0x84 >> 1] = "tda8295", 300 [0xa0 >> 1] = "eeprom", 301 [0xc0 >> 1] = "tuner/mt2131/tda8275", 302 [0xc2 >> 1] = "tuner/mt2131/tda8275/xc5000/xc3028", 303 [0xc8 >> 1] = "tuner/xc3028L", 304}; 305 306static void do_i2c_scan(char *name, struct i2c_client *c) 307{ 308 unsigned char buf; 309 int i, rc; 310 311 for (i = 0; i < 128; i++) { 312 c->addr = i; 313 rc = i2c_master_recv(c, &buf, 0); 314 if (rc < 0) 315 continue; 316 printk(KERN_INFO "%s: i2c scan: found device @ 0x%x [%s]\n", 317 name, i << 1, i2c_devs[i] ? i2c_devs[i] : "???"); 318 } 319} 320 321/* init + register i2c algo-bit adapter */ 322int cx23885_i2c_register(struct cx23885_i2c *bus) 323{ 324 struct cx23885_dev *dev = bus->dev; 325 326 dprintk(1, "%s(bus = %d)\n", __func__, bus->nr); 327 328 memcpy(&bus->i2c_adap, &cx23885_i2c_adap_template, 329 sizeof(bus->i2c_adap)); 330 memcpy(&bus->i2c_algo, &cx23885_i2c_algo_template, 331 sizeof(bus->i2c_algo)); 332 memcpy(&bus->i2c_client, &cx23885_i2c_client_template, 333 sizeof(bus->i2c_client)); 334 335 bus->i2c_adap.dev.parent = &dev->pci->dev; 336 337 strlcpy(bus->i2c_adap.name, bus->dev->name, 338 sizeof(bus->i2c_adap.name)); 339 340 bus->i2c_algo.data = bus; 341 bus->i2c_adap.algo_data = bus; 342 i2c_set_adapdata(&bus->i2c_adap, &dev->v4l2_dev); 343 i2c_add_adapter(&bus->i2c_adap); 344 345 bus->i2c_client.adapter = &bus->i2c_adap; 346 347 if (0 == bus->i2c_rc) { 348 dprintk(1, "%s: i2c bus %d registered\n", dev->name, bus->nr); 349 if (i2c_scan) { 350 printk(KERN_INFO "%s: scan bus %d:\n", 351 dev->name, bus->nr); 352 do_i2c_scan(dev->name, &bus->i2c_client); 353 } 354 } else 355 printk(KERN_WARNING "%s: i2c bus %d register FAILED\n", 356 dev->name, bus->nr); 357 358 /* Instantiate the IR receiver device, if present */ 359 if (0 == bus->i2c_rc) { 360 struct i2c_board_info info; 361 const unsigned short addr_list[] = { 362 0x6b, I2C_CLIENT_END 363 }; 364 365 memset(&info, 0, sizeof(struct i2c_board_info)); 366 strlcpy(info.type, "ir_video", I2C_NAME_SIZE); 367 /* Use quick read command for probe, some IR chips don't 368 * support writes */ 369 i2c_new_probed_device(&bus->i2c_adap, &info, addr_list, 370 i2c_probe_func_quick_read); 371 } 372 373 return bus->i2c_rc; 374} 375 376int cx23885_i2c_unregister(struct cx23885_i2c *bus) 377{ 378 i2c_del_adapter(&bus->i2c_adap); 379 return 0; 380} 381 382void cx23885_av_clk(struct cx23885_dev *dev, int enable) 383{ 384 /* write 0 to bus 2 addr 0x144 via i2x_xfer() */ 385 char buffer[3]; 386 struct i2c_msg msg; 387 dprintk(1, "%s(enabled = %d)\n", __func__, enable); 388 389 /* Register 0x144 */ 390 buffer[0] = 0x01; 391 buffer[1] = 0x44; 392 if (enable == 1) 393 buffer[2] = 0x05; 394 else 395 buffer[2] = 0x00; 396 397 msg.addr = 0x44; 398 msg.flags = I2C_M_TEN; 399 msg.len = 3; 400 msg.buf = buffer; 401 402 i2c_xfer(&dev->i2c_bus[2].i2c_adap, &msg, 1); 403} 404 405/* ----------------------------------------------------------------------- */ 406 407/* 408 * Local variables: 409 * c-basic-offset: 8 410 * End: 411 */ 412