linux/drivers/media/video/usbvision/usbvision-i2c.c
<<
>>
Prefs
   1/*
   2 * usbvision_i2c.c
   3 *  i2c algorithm for USB-I2C Bridges
   4 *
   5 * Copyright (c) 1999-2007 Joerg Heckenbach <joerg@heckenbach-aw.de>
   6 *                         Dwaine Garden <dwainegarden@rogers.com>
   7 *
   8 * This module is part of usbvision driver project.
   9 * Updates to driver completed by Dwaine P. Garden
  10 *
  11 * This program is free software; you can redistribute it and/or modify
  12 * it under the terms of the GNU General Public License as published by
  13 * the Free Software Foundation; either version 2 of the License, or
  14 * (at your option) any later version.
  15 *
  16 * This program is distributed in the hope that it will be useful,
  17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  19 * GNU General Public License for more details.
  20 *
  21 * You should have received a copy of the GNU General Public License
  22 * along with this program; if not, write to the Free Software
  23 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  24 */
  25
  26
  27#include <linux/kernel.h>
  28#include <linux/module.h>
  29#include <linux/delay.h>
  30#include <linux/slab.h>
  31#include <linux/version.h>
  32#include <linux/utsname.h>
  33#include <linux/init.h>
  34#include <asm/uaccess.h>
  35#include <linux/ioport.h>
  36#include <linux/errno.h>
  37#include <linux/usb.h>
  38#include <linux/i2c.h>
  39#include "usbvision.h"
  40
  41#define DBG_I2C         1<<0
  42
  43static int i2c_debug = 0;
  44
  45module_param (i2c_debug, int, 0644);                    // debug_i2c_usb mode of the device driver
  46MODULE_PARM_DESC(i2c_debug, "enable debug messages [i2c]");
  47
  48#define PDEBUG(level, fmt, args...) \
  49                if (i2c_debug & (level)) info("[%s:%d] " fmt, __PRETTY_FUNCTION__, __LINE__ , ## args)
  50
  51static int usbvision_i2c_write(struct usb_usbvision *usbvision, unsigned char addr, char *buf,
  52                            short len);
  53static int usbvision_i2c_read(struct usb_usbvision *usbvision, unsigned char addr, char *buf,
  54                           short len);
  55
  56static inline int try_write_address(struct i2c_adapter *i2c_adap,
  57                                    unsigned char addr, int retries)
  58{
  59        struct usb_usbvision *usbvision;
  60        int i, ret = -1;
  61        char buf[4];
  62
  63        usbvision = (struct usb_usbvision *)i2c_get_adapdata(i2c_adap);
  64        buf[0] = 0x00;
  65        for (i = 0; i <= retries; i++) {
  66                ret = (usbvision_i2c_write(usbvision, addr, buf, 1));
  67                if (ret == 1)
  68                        break;  /* success! */
  69                udelay(5);
  70                if (i == retries)       /* no success */
  71                        break;
  72                udelay(10);
  73        }
  74        if (i) {
  75                PDEBUG(DBG_I2C,"Needed %d retries for address %#2x", i, addr);
  76                PDEBUG(DBG_I2C,"Maybe there's no device at this address");
  77        }
  78        return ret;
  79}
  80
  81static inline int try_read_address(struct i2c_adapter *i2c_adap,
  82                                   unsigned char addr, int retries)
  83{
  84        struct usb_usbvision *usbvision;
  85        int i, ret = -1;
  86        char buf[4];
  87
  88        usbvision = (struct usb_usbvision *)i2c_get_adapdata(i2c_adap);
  89        for (i = 0; i <= retries; i++) {
  90                ret = (usbvision_i2c_read(usbvision, addr, buf, 1));
  91                if (ret == 1)
  92                        break;  /* success! */
  93                udelay(5);
  94                if (i == retries)       /* no success */
  95                        break;
  96                udelay(10);
  97        }
  98        if (i) {
  99                PDEBUG(DBG_I2C,"Needed %d retries for address %#2x", i, addr);
 100                PDEBUG(DBG_I2C,"Maybe there's no device at this address");
 101        }
 102        return ret;
 103}
 104
 105static inline int usb_find_address(struct i2c_adapter *i2c_adap,
 106                                   struct i2c_msg *msg, int retries,
 107                                   unsigned char *add)
 108{
 109        unsigned short flags = msg->flags;
 110
 111        unsigned char addr;
 112        int ret;
 113        if ((flags & I2C_M_TEN)) {
 114                /* a ten bit address */
 115                addr = 0xf0 | ((msg->addr >> 7) & 0x03);
 116                /* try extended address code... */
 117                ret = try_write_address(i2c_adap, addr, retries);
 118                if (ret != 1) {
 119                        err("died at extended address code, while writing");
 120                        return -EREMOTEIO;
 121                }
 122                add[0] = addr;
 123                if (flags & I2C_M_RD) {
 124                        /* okay, now switch into reading mode */
 125                        addr |= 0x01;
 126                        ret = try_read_address(i2c_adap, addr, retries);
 127                        if (ret != 1) {
 128                                err("died at extended address code, while reading");
 129                                return -EREMOTEIO;
 130                        }
 131                }
 132
 133        } else {                /* normal 7bit address  */
 134                addr = (msg->addr << 1);
 135                if (flags & I2C_M_RD)
 136                        addr |= 1;
 137
 138                add[0] = addr;
 139                if (flags & I2C_M_RD)
 140                        ret = try_read_address(i2c_adap, addr, retries);
 141                else
 142                        ret = try_write_address(i2c_adap, addr, retries);
 143
 144                if (ret != 1) {
 145                        return -EREMOTEIO;
 146                }
 147        }
 148        return 0;
 149}
 150
 151static int
 152usbvision_i2c_xfer(struct i2c_adapter *i2c_adap, struct i2c_msg msgs[], int num)
 153{
 154        struct i2c_msg *pmsg;
 155        struct usb_usbvision *usbvision;
 156        int i, ret;
 157        unsigned char addr;
 158
 159        usbvision = (struct usb_usbvision *)i2c_get_adapdata(i2c_adap);
 160
 161        for (i = 0; i < num; i++) {
 162                pmsg = &msgs[i];
 163                ret = usb_find_address(i2c_adap, pmsg, i2c_adap->retries, &addr);
 164                if (ret != 0) {
 165                        PDEBUG(DBG_I2C,"got NAK from device, message #%d", i);
 166                        return (ret < 0) ? ret : -EREMOTEIO;
 167                }
 168
 169                if (pmsg->flags & I2C_M_RD) {
 170                        /* read bytes into buffer */
 171                        ret = (usbvision_i2c_read(usbvision, addr, pmsg->buf, pmsg->len));
 172                        if (ret < pmsg->len) {
 173                                return (ret < 0) ? ret : -EREMOTEIO;
 174                        }
 175                } else {
 176                        /* write bytes from buffer */
 177                        ret = (usbvision_i2c_write(usbvision, addr, pmsg->buf, pmsg->len));
 178                        if (ret < pmsg->len) {
 179                                return (ret < 0) ? ret : -EREMOTEIO;
 180                        }
 181                }
 182        }
 183        return num;
 184}
 185
 186static u32 functionality(struct i2c_adapter *adap)
 187{
 188        return I2C_FUNC_SMBUS_EMUL | I2C_FUNC_10BIT_ADDR;
 189}
 190
 191
 192/* -----exported algorithm data: -------------------------------------  */
 193
 194static struct i2c_algorithm usbvision_algo = {
 195        .master_xfer   = usbvision_i2c_xfer,
 196        .smbus_xfer    = NULL,
 197        .functionality = functionality,
 198};
 199
 200
 201/*
 202 * registering functions to load algorithms at runtime
 203 */
 204static int usbvision_i2c_usb_add_bus(struct i2c_adapter *adap)
 205{
 206        PDEBUG(DBG_I2C, "I2C   debugging is enabled [i2c]");
 207        PDEBUG(DBG_I2C, "ALGO   debugging is enabled [i2c]");
 208
 209        /* register new adapter to i2c module... */
 210
 211        adap->algo = &usbvision_algo;
 212
 213        adap->timeout = 100;    /* default values, should       */
 214        adap->retries = 3;      /* be replaced by defines       */
 215
 216        i2c_add_adapter(adap);
 217
 218        PDEBUG(DBG_I2C,"i2c bus for %s registered", adap->name);
 219
 220        return 0;
 221}
 222
 223/* ----------------------------------------------------------------------- */
 224/* usbvision specific I2C functions                                        */
 225/* ----------------------------------------------------------------------- */
 226static struct i2c_adapter i2c_adap_template;
 227static struct i2c_client i2c_client_template;
 228
 229int usbvision_i2c_register(struct usb_usbvision *usbvision)
 230{
 231        memcpy(&usbvision->i2c_adap, &i2c_adap_template,
 232               sizeof(struct i2c_adapter));
 233        memcpy(&usbvision->i2c_client, &i2c_client_template,
 234               sizeof(struct i2c_client));
 235
 236        sprintf(usbvision->i2c_adap.name + strlen(usbvision->i2c_adap.name),
 237                " #%d", usbvision->vdev->minor & 0x1f);
 238        PDEBUG(DBG_I2C,"Adaptername: %s", usbvision->i2c_adap.name);
 239        usbvision->i2c_adap.dev.parent = &usbvision->dev->dev;
 240
 241        i2c_set_adapdata(&usbvision->i2c_adap, usbvision);
 242        i2c_set_clientdata(&usbvision->i2c_client, usbvision);
 243
 244        usbvision->i2c_client.adapter = &usbvision->i2c_adap;
 245
 246        if (usbvision_write_reg(usbvision, USBVISION_SER_MODE, USBVISION_IIC_LRNACK) < 0) {
 247                printk(KERN_ERR "usbvision_register: can't write reg\n");
 248                return -EBUSY;
 249        }
 250
 251#ifdef CONFIG_MODULES
 252        /* Request the load of the i2c modules we need */
 253        switch (usbvision_device_data[usbvision->DevModel].Codec) {
 254        case CODEC_SAA7113:
 255                request_module("saa7115");
 256                break;
 257        case CODEC_SAA7111:
 258                request_module("saa7115");
 259                break;
 260        }
 261        if (usbvision_device_data[usbvision->DevModel].Tuner == 1) {
 262                request_module("tuner");
 263        }
 264#endif
 265
 266        return usbvision_i2c_usb_add_bus(&usbvision->i2c_adap);
 267}
 268
 269int usbvision_i2c_unregister(struct usb_usbvision *usbvision)
 270{
 271
 272        i2c_del_adapter(&(usbvision->i2c_adap));
 273
 274        PDEBUG(DBG_I2C,"i2c bus for %s unregistered", usbvision->i2c_adap.name);
 275
 276        return 0;
 277}
 278
 279void call_i2c_clients(struct usb_usbvision *usbvision, unsigned int cmd,
 280                      void *arg)
 281{
 282        i2c_clients_command(&usbvision->i2c_adap, cmd, arg);
 283}
 284
 285static int attach_inform(struct i2c_client *client)
 286{
 287        struct usb_usbvision *usbvision;
 288
 289        usbvision = (struct usb_usbvision *)i2c_get_adapdata(client->adapter);
 290
 291        switch (client->addr << 1) {
 292                case 0x42 << 1:
 293                case 0x43 << 1:
 294                case 0x4a << 1:
 295                case 0x4b << 1:
 296                        PDEBUG(DBG_I2C,"attach_inform: tda9887 detected.");
 297                        break;
 298                case 0x42:
 299                        PDEBUG(DBG_I2C,"attach_inform: saa7114 detected.");
 300                        break;
 301                case 0x4a:
 302                        PDEBUG(DBG_I2C,"attach_inform: saa7113 detected.");
 303                        break;
 304                case 0x48:
 305                        PDEBUG(DBG_I2C,"attach_inform: saa7111 detected.");
 306                        break;
 307                case 0xa0:
 308                        PDEBUG(DBG_I2C,"attach_inform: eeprom detected.");
 309                        break;
 310
 311                default:
 312                        {
 313                                struct tuner_setup tun_setup;
 314
 315                                PDEBUG(DBG_I2C,"attach inform: detected I2C address %x", client->addr << 1);
 316                                usbvision->tuner_addr = client->addr;
 317
 318                                if ((usbvision->have_tuner) && (usbvision->tuner_type != -1)) {
 319                                        tun_setup.mode_mask = T_ANALOG_TV | T_RADIO;
 320                                        tun_setup.type = usbvision->tuner_type;
 321                                        tun_setup.addr = usbvision->tuner_addr;
 322                                        call_i2c_clients(usbvision, TUNER_SET_TYPE_ADDR, &tun_setup);
 323                                }
 324                        }
 325                        break;
 326        }
 327        return 0;
 328}
 329
 330static int detach_inform(struct i2c_client *client)
 331{
 332        struct usb_usbvision *usbvision;
 333
 334        usbvision = (struct usb_usbvision *)i2c_get_adapdata(client->adapter);
 335
 336        PDEBUG(DBG_I2C,"usbvision[%d] detaches %s", usbvision->nr, client->name);
 337        return 0;
 338}
 339
 340static int
 341usbvision_i2c_read_max4(struct usb_usbvision *usbvision, unsigned char addr,
 342                     char *buf, short len)
 343{
 344        int rc, retries;
 345
 346        for (retries = 5;;) {
 347                rc = usbvision_write_reg(usbvision, USBVISION_SER_ADRS, addr);
 348                if (rc < 0)
 349                        return rc;
 350
 351                /* Initiate byte read cycle                    */
 352                /* USBVISION_SER_CONT <- d0-d2 n. of bytes to r/w */
 353                /*                    d3 0=Wr 1=Rd             */
 354                rc = usbvision_write_reg(usbvision, USBVISION_SER_CONT,
 355                                      (len & 0x07) | 0x18);
 356                if (rc < 0)
 357                        return rc;
 358
 359                /* Test for Busy and ACK */
 360                do {
 361                        /* USBVISION_SER_CONT -> d4 == 0 busy */
 362                        rc = usbvision_read_reg(usbvision, USBVISION_SER_CONT);
 363                } while (rc > 0 && ((rc & 0x10) != 0)); /* Retry while busy */
 364                if (rc < 0)
 365                        return rc;
 366
 367                /* USBVISION_SER_CONT -> d5 == 1 Not ack */
 368                if ((rc & 0x20) == 0)   /* Ack? */
 369                        break;
 370
 371                /* I2C abort */
 372                rc = usbvision_write_reg(usbvision, USBVISION_SER_CONT, 0x00);
 373                if (rc < 0)
 374                        return rc;
 375
 376                if (--retries < 0)
 377                        return -1;
 378        }
 379
 380        switch (len) {
 381        case 4:
 382                buf[3] = usbvision_read_reg(usbvision, USBVISION_SER_DAT4);
 383        case 3:
 384                buf[2] = usbvision_read_reg(usbvision, USBVISION_SER_DAT3);
 385        case 2:
 386                buf[1] = usbvision_read_reg(usbvision, USBVISION_SER_DAT2);
 387        case 1:
 388                buf[0] = usbvision_read_reg(usbvision, USBVISION_SER_DAT1);
 389                break;
 390        default:
 391                printk(KERN_ERR
 392                       "usbvision_i2c_read_max4: buffer length > 4\n");
 393        }
 394
 395        if (i2c_debug & DBG_I2C) {
 396                int idx;
 397                for (idx = 0; idx < len; idx++) {
 398                        PDEBUG(DBG_I2C,"read %x from address %x", (unsigned char)buf[idx], addr);
 399                }
 400        }
 401        return len;
 402}
 403
 404
 405static int usbvision_i2c_write_max4(struct usb_usbvision *usbvision,
 406                                 unsigned char addr, const char *buf,
 407                                 short len)
 408{
 409        int rc, retries;
 410        int i;
 411        unsigned char value[6];
 412        unsigned char ser_cont;
 413
 414        ser_cont = (len & 0x07) | 0x10;
 415
 416        value[0] = addr;
 417        value[1] = ser_cont;
 418        for (i = 0; i < len; i++)
 419                value[i + 2] = buf[i];
 420
 421        for (retries = 5;;) {
 422                rc = usb_control_msg(usbvision->dev,
 423                                     usb_sndctrlpipe(usbvision->dev, 1),
 424                                     USBVISION_OP_CODE,
 425                                     USB_DIR_OUT | USB_TYPE_VENDOR |
 426                                     USB_RECIP_ENDPOINT, 0,
 427                                     (__u16) USBVISION_SER_ADRS, value,
 428                                     len + 2, HZ);
 429
 430                if (rc < 0)
 431                        return rc;
 432
 433                rc = usbvision_write_reg(usbvision, USBVISION_SER_CONT,
 434                                      (len & 0x07) | 0x10);
 435                if (rc < 0)
 436                        return rc;
 437
 438                /* Test for Busy and ACK */
 439                do {
 440                        rc = usbvision_read_reg(usbvision, USBVISION_SER_CONT);
 441                } while (rc > 0 && ((rc & 0x10) != 0)); /* Retry while busy */
 442                if (rc < 0)
 443                        return rc;
 444
 445                if ((rc & 0x20) == 0)   /* Ack? */
 446                        break;
 447
 448                /* I2C abort */
 449                usbvision_write_reg(usbvision, USBVISION_SER_CONT, 0x00);
 450
 451                if (--retries < 0)
 452                        return -1;
 453
 454        }
 455
 456        if (i2c_debug & DBG_I2C) {
 457                int idx;
 458                for (idx = 0; idx < len; idx++) {
 459                        PDEBUG(DBG_I2C,"wrote %x at address %x", (unsigned char)buf[idx], addr);
 460                }
 461        }
 462        return len;
 463}
 464
 465static int usbvision_i2c_write(struct usb_usbvision *usbvision, unsigned char addr, char *buf,
 466                            short len)
 467{
 468        char *bufPtr = buf;
 469        int retval;
 470        int wrcount = 0;
 471        int count;
 472        int maxLen = 4;
 473
 474        while (len > 0) {
 475                count = (len > maxLen) ? maxLen : len;
 476                retval = usbvision_i2c_write_max4(usbvision, addr, bufPtr, count);
 477                if (retval > 0) {
 478                        len -= count;
 479                        bufPtr += count;
 480                        wrcount += count;
 481                } else
 482                        return (retval < 0) ? retval : -EFAULT;
 483        }
 484        return wrcount;
 485}
 486
 487static int usbvision_i2c_read(struct usb_usbvision *usbvision, unsigned char addr, char *buf,
 488                           short len)
 489{
 490        char temp[4];
 491        int retval, i;
 492        int rdcount = 0;
 493        int count;
 494
 495        while (len > 0) {
 496                count = (len > 3) ? 4 : len;
 497                retval = usbvision_i2c_read_max4(usbvision, addr, temp, count);
 498                if (retval > 0) {
 499                        for (i = 0; i < len; i++)
 500                                buf[rdcount + i] = temp[i];
 501                        len -= count;
 502                        rdcount += count;
 503                } else
 504                        return (retval < 0) ? retval : -EFAULT;
 505        }
 506        return rdcount;
 507}
 508
 509static struct i2c_adapter i2c_adap_template = {
 510        .owner = THIS_MODULE,
 511        .name              = "usbvision",
 512        .id                = I2C_HW_B_BT848, /* FIXME */
 513        .client_register   = attach_inform,
 514        .client_unregister = detach_inform,
 515#ifdef I2C_ADAP_CLASS_TV_ANALOG
 516        .class             = I2C_ADAP_CLASS_TV_ANALOG,
 517#else
 518        .class             = I2C_CLASS_TV_ANALOG,
 519#endif
 520};
 521
 522static struct i2c_client i2c_client_template = {
 523        .name           = "usbvision internal",
 524};
 525
 526/*
 527 * Overrides for Emacs so that we follow Linus's tabbing style.
 528 * ---------------------------------------------------------------------------
 529 * Local variables:
 530 * c-basic-offset: 8
 531 * End:
 532 */
 533