2  * Copyright (C) 2005-2006 Micronas USA Inc.
 
   4  * This program is free software; you can redistribute it and/or modify
 
   5  * it under the terms of the GNU General Public License (Version 2) as
 
   6  * published by the Free Software Foundation.
 
   8  * This program is distributed in the hope that it will be useful,
 
   9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 
  10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
  11  * GNU General Public License for more details.
 
  13  * You should have received a copy of the GNU General Public License
 
  14  * along with this program; if not, write to the Free Software Foundation,
 
  15  * Inc., 59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
 
  18 #include <linux/module.h>
 
  19 #include <linux/init.h>
 
  20 #include <linux/i2c.h>
 
  21 #include <linux/videodev2.h>
 
  22 #include <linux/ioctl.h>
 
  33 static u8 initial_registers[] =
 
  35         0x02, 0x44, /* input 1, composite */
 
  36         0x03, 0x92, /* correct digital format */
 
  38         0x05, 0x80, /* or 0x00 for PAL */
 
  39         0x06, 0x40, /* second internal current reference */
 
  40         0x07, 0x02, /* window */
 
  41         0x08, 0x14, /* window */
 
  42         0x09, 0xf0, /* window */
 
  43         0x0a, 0x81, /* window */
 
  44         0x0b, 0xd0, /* window */
 
  46         0x0d, 0x00, /* scaling */
 
  47         0x0e, 0x11, /* scaling */
 
  48         0x0f, 0x00, /* scaling */
 
  49         0x10, 0x00, /* brightness */
 
  50         0x11, 0x60, /* contrast */
 
  51         0x12, 0x01, /* sharpness */
 
  52         0x13, 0x7f, /* U gain */
 
  53         0x14, 0x5a, /* V gain */
 
  55         0x16, 0xc3, /* sharpness */
 
  59         0x1c, 0x0f, /* video norm */
 
  60         0x1d, 0x7f, /* video norm */
 
  61         0x20, 0xa0, /* clamping gain (working 0x50) */
 
  75         0x2e, 0xa5, /* burst PLL control (working: a9) */
 
  76         0x2f, 0xe0, /* 0xea is blue test frame -- 0xe0 for normal */
 
  82         0x06, 0xc0, /* reset device */
 
  83         0x00, 0x00, /* Terminator (reg 0x00 is read-only) */
 
  86 static int write_reg(struct i2c_client *client, u8 reg, u8 value)
 
  88         return i2c_smbus_write_byte_data(client, reg, value);
 
  91 static int write_regs(struct i2c_client *client, u8 *regs)
 
  95         for (i = 0; regs[i] != 0x00; i += 2)
 
  96                 if (i2c_smbus_write_byte_data(client, regs[i], regs[i + 1]) < 0)
 
 101 static int wis_tw9903_command(struct i2c_client *client,
 
 102                                 unsigned int cmd, void *arg)
 
 104         struct wis_tw9903 *dec = i2c_get_clientdata(client);
 
 111                 i2c_smbus_write_byte_data(client, 0x02, 0x40 | (*input << 1));
 
 114 #if 0   /* The scaler on this thing seems to be horribly broken */
 
 115         case DECODER_SET_RESOLUTION:
 
 117                 struct video_decoder_resolution *res = arg;
 
 118                 /*int hscale = 256 * 720 / res->width;*/
 
 119                 int hscale = 256 * 720 / (res->width - (res->width > 704 ? 0 : 8));
 
 120                 int vscale = 256 * (dec->norm & V4L2_STD_NTSC ?  240 : 288)
 
 125                         0x0e, ((vscale & 0xf00) >> 4) | ((hscale & 0xf00) >> 8),
 
 126                         0x06, 0xc0, /* reset device */
 
 129                 printk(KERN_DEBUG "vscale is %04x, hscale is %04x\n",
 
 131                 /*write_regs(client, regs);*/
 
 137                 v4l2_std_id *input = arg;
 
 139                         0x05, *input & V4L2_STD_NTSC ? 0x80 : 0x00,
 
 140                         0x07, *input & V4L2_STD_NTSC ? 0x02 : 0x12,
 
 141                         0x08, *input & V4L2_STD_NTSC ? 0x14 : 0x18,
 
 142                         0x09, *input & V4L2_STD_NTSC ? 0xf0 : 0x20,
 
 145                 write_regs(client, regs);
 
 149         case VIDIOC_QUERYCTRL:
 
 151                 struct v4l2_queryctrl *ctrl = arg;
 
 154                 case V4L2_CID_BRIGHTNESS:
 
 155                         ctrl->type = V4L2_CTRL_TYPE_INTEGER;
 
 156                         strncpy(ctrl->name, "Brightness", sizeof(ctrl->name));
 
 157                         ctrl->minimum = -128;
 
 160                         ctrl->default_value = 0x00;
 
 163                 case V4L2_CID_CONTRAST:
 
 164                         ctrl->type = V4L2_CTRL_TYPE_INTEGER;
 
 165                         strncpy(ctrl->name, "Contrast", sizeof(ctrl->name));
 
 169                         ctrl->default_value = 0x60;
 
 173                 /* I don't understand how the Chroma Gain registers work... */
 
 174                 case V4L2_CID_SATURATION:
 
 175                         ctrl->type = V4L2_CTRL_TYPE_INTEGER;
 
 176                         strncpy(ctrl->name, "Saturation", sizeof(ctrl->name));
 
 180                         ctrl->default_value = 64;
 
 185                         ctrl->type = V4L2_CTRL_TYPE_INTEGER;
 
 186                         strncpy(ctrl->name, "Hue", sizeof(ctrl->name));
 
 187                         ctrl->minimum = -128;
 
 190                         ctrl->default_value = 0;
 
 198                 struct v4l2_control *ctrl = arg;
 
 201                 case V4L2_CID_BRIGHTNESS:
 
 202                         if (ctrl->value > 127)
 
 203                                 dec->brightness = 127;
 
 204                         else if (ctrl->value < -128)
 
 205                                 dec->brightness = -128;
 
 207                                 dec->brightness = ctrl->value;
 
 208                         write_reg(client, 0x10, dec->brightness);
 
 210                 case V4L2_CID_CONTRAST:
 
 211                         if (ctrl->value > 255)
 
 213                         else if (ctrl->value < 0)
 
 216                                 dec->contrast = ctrl->value;
 
 217                         write_reg(client, 0x11, dec->contrast);
 
 220                 case V4L2_CID_SATURATION:
 
 221                         if (ctrl->value > 127)
 
 222                                 dec->saturation = 127;
 
 223                         else if (ctrl->value < 0)
 
 226                                 dec->saturation = ctrl->value;
 
 227                         /*write_reg(client, 0x0c, dec->saturation);*/
 
 231                         if (ctrl->value > 127)
 
 233                         else if (ctrl->value < -128)
 
 236                                 dec->hue = ctrl->value;
 
 237                         write_reg(client, 0x15, dec->hue);
 
 244                 struct v4l2_control *ctrl = arg;
 
 247                 case V4L2_CID_BRIGHTNESS:
 
 248                         ctrl->value = dec->brightness;
 
 250                 case V4L2_CID_CONTRAST:
 
 251                         ctrl->value = dec->contrast;
 
 254                 case V4L2_CID_SATURATION:
 
 255                         ctrl->value = dec->saturation;
 
 259                         ctrl->value = dec->hue;
 
 270 static struct i2c_driver wis_tw9903_driver;
 
 272 static struct i2c_client wis_tw9903_client_templ = {
 
 273         .name           = "TW9903 (WIS)",
 
 274         .driver         = &wis_tw9903_driver,
 
 277 static int wis_tw9903_detect(struct i2c_adapter *adapter, int addr, int kind)
 
 279         struct i2c_client *client;
 
 280         struct wis_tw9903 *dec;
 
 282         if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA))
 
 285         client = kmalloc(sizeof(struct i2c_client), GFP_KERNEL);
 
 288         memcpy(client, &wis_tw9903_client_templ,
 
 289                         sizeof(wis_tw9903_client_templ));
 
 290         client->adapter = adapter;
 
 293         dec = kmalloc(sizeof(struct wis_tw9903), GFP_KERNEL);
 
 298         dec->norm = V4L2_STD_NTSC;
 
 300         dec->contrast = 0x60;
 
 302         i2c_set_clientdata(client, dec);
 
 305                 "wis-tw9903: initializing TW9903 at address %d on %s\n",
 
 306                 addr, adapter->name);
 
 308         if (write_regs(client, initial_registers) < 0) {
 
 309                 printk(KERN_ERR "wis-tw9903: error initializing TW9903\n");
 
 315         i2c_attach_client(client);
 
 319 static int wis_tw9903_detach(struct i2c_client *client)
 
 321         struct wis_tw9903 *dec = i2c_get_clientdata(client);
 
 324         r = i2c_detach_client(client);
 
 333 static struct i2c_driver wis_tw9903_driver = {
 
 335                 .name   = "WIS TW9903 I2C driver",
 
 337         .id             = I2C_DRIVERID_WIS_TW9903,
 
 338         .detach_client  = wis_tw9903_detach,
 
 339         .command        = wis_tw9903_command,
 
 342 static int __init wis_tw9903_init(void)
 
 346         r = i2c_add_driver(&wis_tw9903_driver);
 
 349         return wis_i2c_add_driver(wis_tw9903_driver.id, wis_tw9903_detect);
 
 352 static void __exit wis_tw9903_cleanup(void)
 
 354         wis_i2c_del_driver(wis_tw9903_detect);
 
 355         i2c_del_driver(&wis_tw9903_driver);
 
 358 module_init(wis_tw9903_init);
 
 359 module_exit(wis_tw9903_cleanup);
 
 361 MODULE_LICENSE("GPL v2");