root/drivers/media/usb/pvrusb2/pvrusb2-i2c-core.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. pvr2_i2c_write
  2. pvr2_i2c_read
  3. pvr2_i2c_basic_op
  4. i2c_24xxx_ir
  5. i2c_hack_wm8775
  6. i2c_black_hole
  7. i2c_hack_cx25840
  8. pvr2_i2c_xfer
  9. pvr2_i2c_functionality
  10. do_i2c_probe
  11. do_i2c_scan
  12. pvr2_i2c_register_ir
  13. pvr2_i2c_core_init
  14. pvr2_i2c_core_done

   1 // SPDX-License-Identifier: GPL-2.0-only
   2 /*
   3  *
   4  *  Copyright (C) 2005 Mike Isely <isely@pobox.com>
   5  */
   6 
   7 #include <linux/i2c.h>
   8 #include <linux/module.h>
   9 #include <media/i2c/ir-kbd-i2c.h>
  10 #include "pvrusb2-i2c-core.h"
  11 #include "pvrusb2-hdw-internal.h"
  12 #include "pvrusb2-debug.h"
  13 #include "pvrusb2-fx2-cmd.h"
  14 #include "pvrusb2.h"
  15 
  16 #define trace_i2c(...) pvr2_trace(PVR2_TRACE_I2C,__VA_ARGS__)
  17 
  18 /*
  19 
  20   This module attempts to implement a compliant I2C adapter for the pvrusb2
  21   device.
  22 
  23 */
  24 
  25 static unsigned int i2c_scan;
  26 module_param(i2c_scan, int, S_IRUGO|S_IWUSR);
  27 MODULE_PARM_DESC(i2c_scan,"scan i2c bus at insmod time");
  28 
  29 static int ir_mode[PVR_NUM] = { [0 ... PVR_NUM-1] = 1 };
  30 module_param_array(ir_mode, int, NULL, 0444);
  31 MODULE_PARM_DESC(ir_mode,"specify: 0=disable IR reception, 1=normal IR");
  32 
  33 static int pvr2_disable_ir_video;
  34 module_param_named(disable_autoload_ir_video, pvr2_disable_ir_video,
  35                    int, S_IRUGO|S_IWUSR);
  36 MODULE_PARM_DESC(disable_autoload_ir_video,
  37                  "1=do not try to autoload ir_video IR receiver");
  38 
  39 static int pvr2_i2c_write(struct pvr2_hdw *hdw, /* Context */
  40                           u8 i2c_addr,      /* I2C address we're talking to */
  41                           u8 *data,         /* Data to write */
  42                           u16 length)       /* Size of data to write */
  43 {
  44         /* Return value - default 0 means success */
  45         int ret;
  46 
  47 
  48         if (!data) length = 0;
  49         if (length > (sizeof(hdw->cmd_buffer) - 3)) {
  50                 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
  51                            "Killing an I2C write to %u that is too large (desired=%u limit=%u)",
  52                            i2c_addr,
  53                            length,(unsigned int)(sizeof(hdw->cmd_buffer) - 3));
  54                 return -ENOTSUPP;
  55         }
  56 
  57         LOCK_TAKE(hdw->ctl_lock);
  58 
  59         /* Clear the command buffer (likely to be paranoia) */
  60         memset(hdw->cmd_buffer, 0, sizeof(hdw->cmd_buffer));
  61 
  62         /* Set up command buffer for an I2C write */
  63         hdw->cmd_buffer[0] = FX2CMD_I2C_WRITE;      /* write prefix */
  64         hdw->cmd_buffer[1] = i2c_addr;  /* i2c addr of chip */
  65         hdw->cmd_buffer[2] = length;    /* length of what follows */
  66         if (length) memcpy(hdw->cmd_buffer + 3, data, length);
  67 
  68         /* Do the operation */
  69         ret = pvr2_send_request(hdw,
  70                                 hdw->cmd_buffer,
  71                                 length + 3,
  72                                 hdw->cmd_buffer,
  73                                 1);
  74         if (!ret) {
  75                 if (hdw->cmd_buffer[0] != 8) {
  76                         ret = -EIO;
  77                         if (hdw->cmd_buffer[0] != 7) {
  78                                 trace_i2c("unexpected status from i2_write[%d]: %d",
  79                                           i2c_addr,hdw->cmd_buffer[0]);
  80                         }
  81                 }
  82         }
  83 
  84         LOCK_GIVE(hdw->ctl_lock);
  85 
  86         return ret;
  87 }
  88 
  89 static int pvr2_i2c_read(struct pvr2_hdw *hdw, /* Context */
  90                          u8 i2c_addr,       /* I2C address we're talking to */
  91                          u8 *data,          /* Data to write */
  92                          u16 dlen,          /* Size of data to write */
  93                          u8 *res,           /* Where to put data we read */
  94                          u16 rlen)          /* Amount of data to read */
  95 {
  96         /* Return value - default 0 means success */
  97         int ret;
  98 
  99 
 100         if (!data) dlen = 0;
 101         if (dlen > (sizeof(hdw->cmd_buffer) - 4)) {
 102                 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
 103                            "Killing an I2C read to %u that has wlen too large (desired=%u limit=%u)",
 104                            i2c_addr,
 105                            dlen,(unsigned int)(sizeof(hdw->cmd_buffer) - 4));
 106                 return -ENOTSUPP;
 107         }
 108         if (res && (rlen > (sizeof(hdw->cmd_buffer) - 1))) {
 109                 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
 110                            "Killing an I2C read to %u that has rlen too large (desired=%u limit=%u)",
 111                            i2c_addr,
 112                            rlen,(unsigned int)(sizeof(hdw->cmd_buffer) - 1));
 113                 return -ENOTSUPP;
 114         }
 115 
 116         LOCK_TAKE(hdw->ctl_lock);
 117 
 118         /* Clear the command buffer (likely to be paranoia) */
 119         memset(hdw->cmd_buffer, 0, sizeof(hdw->cmd_buffer));
 120 
 121         /* Set up command buffer for an I2C write followed by a read */
 122         hdw->cmd_buffer[0] = FX2CMD_I2C_READ;  /* read prefix */
 123         hdw->cmd_buffer[1] = dlen;  /* arg length */
 124         hdw->cmd_buffer[2] = rlen;  /* answer length. Device will send one
 125                                        more byte (status). */
 126         hdw->cmd_buffer[3] = i2c_addr;  /* i2c addr of chip */
 127         if (dlen) memcpy(hdw->cmd_buffer + 4, data, dlen);
 128 
 129         /* Do the operation */
 130         ret = pvr2_send_request(hdw,
 131                                 hdw->cmd_buffer,
 132                                 4 + dlen,
 133                                 hdw->cmd_buffer,
 134                                 rlen + 1);
 135         if (!ret) {
 136                 if (hdw->cmd_buffer[0] != 8) {
 137                         ret = -EIO;
 138                         if (hdw->cmd_buffer[0] != 7) {
 139                                 trace_i2c("unexpected status from i2_read[%d]: %d",
 140                                           i2c_addr,hdw->cmd_buffer[0]);
 141                         }
 142                 }
 143         }
 144 
 145         /* Copy back the result */
 146         if (res && rlen) {
 147                 if (ret) {
 148                         /* Error, just blank out the return buffer */
 149                         memset(res, 0, rlen);
 150                 } else {
 151                         memcpy(res, hdw->cmd_buffer + 1, rlen);
 152                 }
 153         }
 154 
 155         LOCK_GIVE(hdw->ctl_lock);
 156 
 157         return ret;
 158 }
 159 
 160 /* This is the common low level entry point for doing I2C operations to the
 161    hardware. */
 162 static int pvr2_i2c_basic_op(struct pvr2_hdw *hdw,
 163                              u8 i2c_addr,
 164                              u8 *wdata,
 165                              u16 wlen,
 166                              u8 *rdata,
 167                              u16 rlen)
 168 {
 169         if (!rdata) rlen = 0;
 170         if (!wdata) wlen = 0;
 171         if (rlen || !wlen) {
 172                 return pvr2_i2c_read(hdw,i2c_addr,wdata,wlen,rdata,rlen);
 173         } else {
 174                 return pvr2_i2c_write(hdw,i2c_addr,wdata,wlen);
 175         }
 176 }
 177 
 178 
 179 /* This is a special entry point for cases of I2C transaction attempts to
 180    the IR receiver.  The implementation here simulates the IR receiver by
 181    issuing a command to the FX2 firmware and using that response to return
 182    what the real I2C receiver would have returned.  We use this for 24xxx
 183    devices, where the IR receiver chip has been removed and replaced with
 184    FX2 related logic. */
 185 static int i2c_24xxx_ir(struct pvr2_hdw *hdw,
 186                         u8 i2c_addr,u8 *wdata,u16 wlen,u8 *rdata,u16 rlen)
 187 {
 188         u8 dat[4];
 189         unsigned int stat;
 190 
 191         if (!(rlen || wlen)) {
 192                 /* This is a probe attempt.  Just let it succeed. */
 193                 return 0;
 194         }
 195 
 196         /* We don't understand this kind of transaction */
 197         if ((wlen != 0) || (rlen == 0)) return -EIO;
 198 
 199         if (rlen < 3) {
 200                 /* Mike Isely <isely@pobox.com> Appears to be a probe
 201                    attempt from lirc.  Just fill in zeroes and return.  If
 202                    we try instead to do the full transaction here, then bad
 203                    things seem to happen within the lirc driver module
 204                    (version 0.8.0-7 sources from Debian, when run under
 205                    vanilla 2.6.17.6 kernel) - and I don't have the patience
 206                    to chase it down. */
 207                 if (rlen > 0) rdata[0] = 0;
 208                 if (rlen > 1) rdata[1] = 0;
 209                 return 0;
 210         }
 211 
 212         /* Issue a command to the FX2 to read the IR receiver. */
 213         LOCK_TAKE(hdw->ctl_lock); do {
 214                 hdw->cmd_buffer[0] = FX2CMD_GET_IR_CODE;
 215                 stat = pvr2_send_request(hdw,
 216                                          hdw->cmd_buffer,1,
 217                                          hdw->cmd_buffer,4);
 218                 dat[0] = hdw->cmd_buffer[0];
 219                 dat[1] = hdw->cmd_buffer[1];
 220                 dat[2] = hdw->cmd_buffer[2];
 221                 dat[3] = hdw->cmd_buffer[3];
 222         } while (0); LOCK_GIVE(hdw->ctl_lock);
 223 
 224         /* Give up if that operation failed. */
 225         if (stat != 0) return stat;
 226 
 227         /* Mangle the results into something that looks like the real IR
 228            receiver. */
 229         rdata[2] = 0xc1;
 230         if (dat[0] != 1) {
 231                 /* No code received. */
 232                 rdata[0] = 0;
 233                 rdata[1] = 0;
 234         } else {
 235                 u16 val;
 236                 /* Mash the FX2 firmware-provided IR code into something
 237                    that the normal i2c chip-level driver expects. */
 238                 val = dat[1];
 239                 val <<= 8;
 240                 val |= dat[2];
 241                 val >>= 1;
 242                 val &= ~0x0003;
 243                 val |= 0x8000;
 244                 rdata[0] = (val >> 8) & 0xffu;
 245                 rdata[1] = val & 0xffu;
 246         }
 247 
 248         return 0;
 249 }
 250 
 251 /* This is a special entry point that is entered if an I2C operation is
 252    attempted to a wm8775 chip on model 24xxx hardware.  Autodetect of this
 253    part doesn't work, but we know it is really there.  So let's look for
 254    the autodetect attempt and just return success if we see that. */
 255 static int i2c_hack_wm8775(struct pvr2_hdw *hdw,
 256                            u8 i2c_addr,u8 *wdata,u16 wlen,u8 *rdata,u16 rlen)
 257 {
 258         if (!(rlen || wlen)) {
 259                 // This is a probe attempt.  Just let it succeed.
 260                 return 0;
 261         }
 262         return pvr2_i2c_basic_op(hdw,i2c_addr,wdata,wlen,rdata,rlen);
 263 }
 264 
 265 /* This is an entry point designed to always fail any attempt to perform a
 266    transfer.  We use this to cause certain I2C addresses to not be
 267    probed. */
 268 static int i2c_black_hole(struct pvr2_hdw *hdw,
 269                            u8 i2c_addr,u8 *wdata,u16 wlen,u8 *rdata,u16 rlen)
 270 {
 271         return -EIO;
 272 }
 273 
 274 /* This is a special entry point that is entered if an I2C operation is
 275    attempted to a cx25840 chip on model 24xxx hardware.  This chip can
 276    sometimes wedge itself.  Worse still, when this happens msp3400 can
 277    falsely detect this part and then the system gets hosed up after msp3400
 278    gets confused and dies.  What we want to do here is try to keep msp3400
 279    away and also try to notice if the chip is wedged and send a warning to
 280    the system log. */
 281 static int i2c_hack_cx25840(struct pvr2_hdw *hdw,
 282                             u8 i2c_addr,u8 *wdata,u16 wlen,u8 *rdata,u16 rlen)
 283 {
 284         int ret;
 285         unsigned int subaddr;
 286         u8 wbuf[2];
 287         int state = hdw->i2c_cx25840_hack_state;
 288 
 289         if (!(rlen || wlen)) {
 290                 // Probe attempt - always just succeed and don't bother the
 291                 // hardware (this helps to make the state machine further
 292                 // down somewhat easier).
 293                 return 0;
 294         }
 295 
 296         if (state == 3) {
 297                 return pvr2_i2c_basic_op(hdw,i2c_addr,wdata,wlen,rdata,rlen);
 298         }
 299 
 300         /* We're looking for the exact pattern where the revision register
 301            is being read.  The cx25840 module will always look at the
 302            revision register first.  Any other pattern of access therefore
 303            has to be a probe attempt from somebody else so we'll reject it.
 304            Normally we could just let each client just probe the part
 305            anyway, but when the cx25840 is wedged, msp3400 will get a false
 306            positive and that just screws things up... */
 307 
 308         if (wlen == 0) {
 309                 switch (state) {
 310                 case 1: subaddr = 0x0100; break;
 311                 case 2: subaddr = 0x0101; break;
 312                 default: goto fail;
 313                 }
 314         } else if (wlen == 2) {
 315                 subaddr = (wdata[0] << 8) | wdata[1];
 316                 switch (subaddr) {
 317                 case 0x0100: state = 1; break;
 318                 case 0x0101: state = 2; break;
 319                 default: goto fail;
 320                 }
 321         } else {
 322                 goto fail;
 323         }
 324         if (!rlen) goto success;
 325         state = 0;
 326         if (rlen != 1) goto fail;
 327 
 328         /* If we get to here then we have a legitimate read for one of the
 329            two revision bytes, so pass it through. */
 330         wbuf[0] = subaddr >> 8;
 331         wbuf[1] = subaddr;
 332         ret = pvr2_i2c_basic_op(hdw,i2c_addr,wbuf,2,rdata,rlen);
 333 
 334         if ((ret != 0) || (*rdata == 0x04) || (*rdata == 0x0a)) {
 335                 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
 336                            "***WARNING*** Detected a wedged cx25840 chip; the device will not work.");
 337                 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
 338                            "***WARNING*** Try power cycling the pvrusb2 device.");
 339                 pvr2_trace(PVR2_TRACE_ERROR_LEGS,
 340                            "***WARNING*** Disabling further access to the device to prevent other foul-ups.");
 341                 // This blocks all further communication with the part.
 342                 hdw->i2c_func[0x44] = NULL;
 343                 pvr2_hdw_render_useless(hdw);
 344                 goto fail;
 345         }
 346 
 347         /* Success! */
 348         pvr2_trace(PVR2_TRACE_CHIPS,"cx25840 appears to be OK.");
 349         state = 3;
 350 
 351  success:
 352         hdw->i2c_cx25840_hack_state = state;
 353         return 0;
 354 
 355  fail:
 356         hdw->i2c_cx25840_hack_state = state;
 357         return -EIO;
 358 }
 359 
 360 /* This is a very, very limited I2C adapter implementation.  We can only
 361    support what we actually know will work on the device... */
 362 static int pvr2_i2c_xfer(struct i2c_adapter *i2c_adap,
 363                          struct i2c_msg msgs[],
 364                          int num)
 365 {
 366         int ret = -ENOTSUPP;
 367         pvr2_i2c_func funcp = NULL;
 368         struct pvr2_hdw *hdw = (struct pvr2_hdw *)(i2c_adap->algo_data);
 369 
 370         if (!num) {
 371                 ret = -EINVAL;
 372                 goto done;
 373         }
 374         if (msgs[0].addr < PVR2_I2C_FUNC_CNT) {
 375                 funcp = hdw->i2c_func[msgs[0].addr];
 376         }
 377         if (!funcp) {
 378                 ret = -EIO;
 379                 goto done;
 380         }
 381 
 382         if (num == 1) {
 383                 if (msgs[0].flags & I2C_M_RD) {
 384                         /* Simple read */
 385                         u16 tcnt,bcnt,offs;
 386                         if (!msgs[0].len) {
 387                                 /* Length == 0 read.  This is a probe. */
 388                                 if (funcp(hdw,msgs[0].addr,NULL,0,NULL,0)) {
 389                                         ret = -EIO;
 390                                         goto done;
 391                                 }
 392                                 ret = 1;
 393                                 goto done;
 394                         }
 395                         /* If the read is short enough we'll do the whole
 396                            thing atomically.  Otherwise we have no choice
 397                            but to break apart the reads. */
 398                         tcnt = msgs[0].len;
 399                         offs = 0;
 400                         while (tcnt) {
 401                                 bcnt = tcnt;
 402                                 if (bcnt > sizeof(hdw->cmd_buffer)-1) {
 403                                         bcnt = sizeof(hdw->cmd_buffer)-1;
 404                                 }
 405                                 if (funcp(hdw,msgs[0].addr,NULL,0,
 406                                           msgs[0].buf+offs,bcnt)) {
 407                                         ret = -EIO;
 408                                         goto done;
 409                                 }
 410                                 offs += bcnt;
 411                                 tcnt -= bcnt;
 412                         }
 413                         ret = 1;
 414                         goto done;
 415                 } else {
 416                         /* Simple write */
 417                         ret = 1;
 418                         if (funcp(hdw,msgs[0].addr,
 419                                   msgs[0].buf,msgs[0].len,NULL,0)) {
 420                                 ret = -EIO;
 421                         }
 422                         goto done;
 423                 }
 424         } else if (num == 2) {
 425                 if (msgs[0].addr != msgs[1].addr) {
 426                         trace_i2c("i2c refusing 2 phase transfer with conflicting target addresses");
 427                         ret = -ENOTSUPP;
 428                         goto done;
 429                 }
 430                 if ((!((msgs[0].flags & I2C_M_RD))) &&
 431                     (msgs[1].flags & I2C_M_RD)) {
 432                         u16 tcnt,bcnt,wcnt,offs;
 433                         /* Write followed by atomic read.  If the read
 434                            portion is short enough we'll do the whole thing
 435                            atomically.  Otherwise we have no choice but to
 436                            break apart the reads. */
 437                         tcnt = msgs[1].len;
 438                         wcnt = msgs[0].len;
 439                         offs = 0;
 440                         while (tcnt || wcnt) {
 441                                 bcnt = tcnt;
 442                                 if (bcnt > sizeof(hdw->cmd_buffer)-1) {
 443                                         bcnt = sizeof(hdw->cmd_buffer)-1;
 444                                 }
 445                                 if (funcp(hdw,msgs[0].addr,
 446                                           msgs[0].buf,wcnt,
 447                                           msgs[1].buf+offs,bcnt)) {
 448                                         ret = -EIO;
 449                                         goto done;
 450                                 }
 451                                 offs += bcnt;
 452                                 tcnt -= bcnt;
 453                                 wcnt = 0;
 454                         }
 455                         ret = 2;
 456                         goto done;
 457                 } else {
 458                         trace_i2c("i2c refusing complex transfer read0=%d read1=%d",
 459                                   (msgs[0].flags & I2C_M_RD),
 460                                   (msgs[1].flags & I2C_M_RD));
 461                 }
 462         } else {
 463                 trace_i2c("i2c refusing %d phase transfer",num);
 464         }
 465 
 466  done:
 467         if (pvrusb2_debug & PVR2_TRACE_I2C_TRAF) {
 468                 unsigned int idx,offs,cnt;
 469                 for (idx = 0; idx < num; idx++) {
 470                         cnt = msgs[idx].len;
 471                         pr_info("pvrusb2 i2c xfer %u/%u: addr=0x%x len=%d %s",
 472                                idx+1,num,
 473                                msgs[idx].addr,
 474                                cnt,
 475                                (msgs[idx].flags & I2C_M_RD ?
 476                                 "read" : "write"));
 477                         if ((ret > 0) || !(msgs[idx].flags & I2C_M_RD)) {
 478                                 if (cnt > 8) cnt = 8;
 479                                 pr_cont(" [");
 480                                 for (offs = 0; offs < cnt; offs++) {
 481                                         if (offs) pr_cont(" ");
 482                                         pr_cont("%02x", msgs[idx].buf[offs]);
 483                                 }
 484                                 if (offs < cnt) pr_cont(" ...");
 485                                 pr_cont("]");
 486                         }
 487                         if (idx+1 == num) {
 488                                 pr_cont(" result=%d", ret);
 489                         }
 490                         pr_cont("\n");
 491                 }
 492                 if (!num) {
 493                         pr_info("pvrusb2 i2c xfer null transfer result=%d\n",
 494                                ret);
 495                 }
 496         }
 497         return ret;
 498 }
 499 
 500 static u32 pvr2_i2c_functionality(struct i2c_adapter *adap)
 501 {
 502         return I2C_FUNC_SMBUS_EMUL | I2C_FUNC_I2C;
 503 }
 504 
 505 static const struct i2c_algorithm pvr2_i2c_algo_template = {
 506         .master_xfer   = pvr2_i2c_xfer,
 507         .functionality = pvr2_i2c_functionality,
 508 };
 509 
 510 static const struct i2c_adapter pvr2_i2c_adap_template = {
 511         .owner         = THIS_MODULE,
 512         .class         = 0,
 513 };
 514 
 515 
 516 /* Return true if device exists at given address */
 517 static int do_i2c_probe(struct pvr2_hdw *hdw, int addr)
 518 {
 519         struct i2c_msg msg[1];
 520         int rc;
 521         msg[0].addr = 0;
 522         msg[0].flags = I2C_M_RD;
 523         msg[0].len = 0;
 524         msg[0].buf = NULL;
 525         msg[0].addr = addr;
 526         rc = i2c_transfer(&hdw->i2c_adap, msg, ARRAY_SIZE(msg));
 527         return rc == 1;
 528 }
 529 
 530 static void do_i2c_scan(struct pvr2_hdw *hdw)
 531 {
 532         int i;
 533         pr_info("%s: i2c scan beginning\n", hdw->name);
 534         for (i = 0; i < 128; i++) {
 535                 if (do_i2c_probe(hdw, i)) {
 536                         pr_info("%s: i2c scan: found device @ 0x%x\n",
 537                                hdw->name, i);
 538                 }
 539         }
 540         pr_info("%s: i2c scan done.\n", hdw->name);
 541 }
 542 
 543 static void pvr2_i2c_register_ir(struct pvr2_hdw *hdw)
 544 {
 545         struct i2c_board_info info;
 546         struct IR_i2c_init_data *init_data = &hdw->ir_init_data;
 547         if (pvr2_disable_ir_video) {
 548                 pvr2_trace(PVR2_TRACE_INFO,
 549                            "Automatic binding of ir_video has been disabled.");
 550                 return;
 551         }
 552         memset(&info, 0, sizeof(struct i2c_board_info));
 553         switch (hdw->ir_scheme_active) {
 554         case PVR2_IR_SCHEME_24XXX: /* FX2-controlled IR */
 555         case PVR2_IR_SCHEME_29XXX: /* Original 29xxx device */
 556                 init_data->ir_codes              = RC_MAP_HAUPPAUGE;
 557                 init_data->internal_get_key_func = IR_KBD_GET_KEY_HAUP;
 558                 init_data->type                  = RC_PROTO_BIT_RC5;
 559                 init_data->name                  = hdw->hdw_desc->description;
 560                 init_data->polling_interval      = 100; /* ms From ir-kbd-i2c */
 561                 /* IR Receiver */
 562                 info.addr          = 0x18;
 563                 info.platform_data = init_data;
 564                 strscpy(info.type, "ir_video", I2C_NAME_SIZE);
 565                 pvr2_trace(PVR2_TRACE_INFO, "Binding %s to i2c address 0x%02x.",
 566                            info.type, info.addr);
 567                 i2c_new_device(&hdw->i2c_adap, &info);
 568                 break;
 569         case PVR2_IR_SCHEME_ZILOG:     /* HVR-1950 style */
 570         case PVR2_IR_SCHEME_24XXX_MCE: /* 24xxx MCE device */
 571                 init_data->ir_codes = RC_MAP_HAUPPAUGE;
 572                 init_data->internal_get_key_func = IR_KBD_GET_KEY_HAUP_XVR;
 573                 init_data->type = RC_PROTO_BIT_RC5 | RC_PROTO_BIT_RC6_MCE |
 574                                                         RC_PROTO_BIT_RC6_6A_32;
 575                 init_data->name = hdw->hdw_desc->description;
 576                 /* IR Transceiver */
 577                 info.addr = 0x71;
 578                 info.platform_data = init_data;
 579                 strscpy(info.type, "ir_z8f0811_haup", I2C_NAME_SIZE);
 580                 pvr2_trace(PVR2_TRACE_INFO, "Binding %s to i2c address 0x%02x.",
 581                            info.type, info.addr);
 582                 i2c_new_device(&hdw->i2c_adap, &info);
 583                 break;
 584         default:
 585                 /* The device either doesn't support I2C-based IR or we
 586                    don't know (yet) how to operate IR on the device. */
 587                 break;
 588         }
 589 }
 590 
 591 void pvr2_i2c_core_init(struct pvr2_hdw *hdw)
 592 {
 593         unsigned int idx;
 594 
 595         /* The default action for all possible I2C addresses is just to do
 596            the transfer normally. */
 597         for (idx = 0; idx < PVR2_I2C_FUNC_CNT; idx++) {
 598                 hdw->i2c_func[idx] = pvr2_i2c_basic_op;
 599         }
 600 
 601         /* However, deal with various special cases for 24xxx hardware. */
 602         if (ir_mode[hdw->unit_number] == 0) {
 603                 pr_info("%s: IR disabled\n", hdw->name);
 604                 hdw->i2c_func[0x18] = i2c_black_hole;
 605         } else if (ir_mode[hdw->unit_number] == 1) {
 606                 if (hdw->ir_scheme_active == PVR2_IR_SCHEME_24XXX) {
 607                         /* Set up translation so that our IR looks like a
 608                            29xxx device */
 609                         hdw->i2c_func[0x18] = i2c_24xxx_ir;
 610                 }
 611         }
 612         if (hdw->hdw_desc->flag_has_cx25840) {
 613                 hdw->i2c_func[0x44] = i2c_hack_cx25840;
 614         }
 615         if (hdw->hdw_desc->flag_has_wm8775) {
 616                 hdw->i2c_func[0x1b] = i2c_hack_wm8775;
 617         }
 618 
 619         // Configure the adapter and set up everything else related to it.
 620         hdw->i2c_adap = pvr2_i2c_adap_template;
 621         hdw->i2c_algo = pvr2_i2c_algo_template;
 622         strscpy(hdw->i2c_adap.name, hdw->name, sizeof(hdw->i2c_adap.name));
 623         hdw->i2c_adap.dev.parent = &hdw->usb_dev->dev;
 624         hdw->i2c_adap.algo = &hdw->i2c_algo;
 625         hdw->i2c_adap.algo_data = hdw;
 626         hdw->i2c_linked = !0;
 627         i2c_set_adapdata(&hdw->i2c_adap, &hdw->v4l2_dev);
 628         i2c_add_adapter(&hdw->i2c_adap);
 629         if (hdw->i2c_func[0x18] == i2c_24xxx_ir) {
 630                 /* Probe for a different type of IR receiver on this
 631                    device.  This is really the only way to differentiate
 632                    older 24xxx devices from 24xxx variants that include an
 633                    IR blaster.  If the IR blaster is present, the IR
 634                    receiver is part of that chip and thus we must disable
 635                    the emulated IR receiver. */
 636                 if (do_i2c_probe(hdw, 0x71)) {
 637                         pvr2_trace(PVR2_TRACE_INFO,
 638                                    "Device has newer IR hardware; disabling unneeded virtual IR device");
 639                         hdw->i2c_func[0x18] = NULL;
 640                         /* Remember that this is a different device... */
 641                         hdw->ir_scheme_active = PVR2_IR_SCHEME_24XXX_MCE;
 642                 }
 643         }
 644         if (i2c_scan) do_i2c_scan(hdw);
 645 
 646         pvr2_i2c_register_ir(hdw);
 647 }
 648 
 649 void pvr2_i2c_core_done(struct pvr2_hdw *hdw)
 650 {
 651         if (hdw->i2c_linked) {
 652                 i2c_del_adapter(&hdw->i2c_adap);
 653                 hdw->i2c_linked = 0;
 654         }
 655 }

/* [<][>][^][v][top][bottom][index][help] */