diff options
| -rw-r--r-- | drivers/staging/go7007/s2250-board.c | 77 |
1 files changed, 72 insertions, 5 deletions
diff --git a/drivers/staging/go7007/s2250-board.c b/drivers/staging/go7007/s2250-board.c index 3310961de1ec..8c85a9c3665a 100644 --- a/drivers/staging/go7007/s2250-board.c +++ b/drivers/staging/go7007/s2250-board.c | |||
| @@ -112,7 +112,7 @@ static u16 vid_regs_fp_pal[] = | |||
| 112 | }; | 112 | }; |
| 113 | 113 | ||
| 114 | struct s2250 { | 114 | struct s2250 { |
| 115 | int std; | 115 | v4l2_std_id std; |
| 116 | int input; | 116 | int input; |
| 117 | int brightness; | 117 | int brightness; |
| 118 | int contrast; | 118 | int contrast; |
| @@ -240,6 +240,45 @@ static int write_reg_fp(struct i2c_client *client, u16 addr, u16 val) | |||
| 240 | return 0; | 240 | return 0; |
| 241 | } | 241 | } |
| 242 | 242 | ||
| 243 | static int read_reg_fp(struct i2c_client *client, u16 addr, u16 *val) | ||
| 244 | { | ||
| 245 | struct go7007 *go = i2c_get_adapdata(client->adapter); | ||
| 246 | struct go7007_usb *usb; | ||
| 247 | u8 *buf; | ||
| 248 | |||
| 249 | if (go == NULL) | ||
| 250 | return -ENODEV; | ||
| 251 | |||
| 252 | if (go->status == STATUS_SHUTDOWN) | ||
| 253 | return -EBUSY; | ||
| 254 | |||
| 255 | buf = kzalloc(16, GFP_KERNEL); | ||
| 256 | |||
| 257 | if (buf == NULL) | ||
| 258 | return -ENOMEM; | ||
| 259 | |||
| 260 | |||
| 261 | |||
| 262 | memset(buf, 0xcd, 6); | ||
| 263 | usb = go->hpi_context; | ||
| 264 | if (down_interruptible(&usb->i2c_lock) != 0) { | ||
| 265 | printk(KERN_INFO "i2c lock failed\n"); | ||
| 266 | kfree(buf); | ||
| 267 | return -EINTR; | ||
| 268 | } | ||
| 269 | if (go7007_usb_vendor_request(go, 0x58, addr, 0, buf, 16, 1) < 0) { | ||
| 270 | kfree(buf); | ||
| 271 | return -EFAULT; | ||
| 272 | } | ||
| 273 | up(&usb->i2c_lock); | ||
| 274 | |||
| 275 | *val = (buf[0] << 8) | buf[1]; | ||
| 276 | kfree(buf); | ||
| 277 | |||
| 278 | return 0; | ||
| 279 | } | ||
| 280 | |||
| 281 | |||
| 243 | static int write_regs(struct i2c_client *client, u8 *regs) | 282 | static int write_regs(struct i2c_client *client, u8 *regs) |
| 244 | { | 283 | { |
| 245 | int i; | 284 | int i; |
| @@ -354,14 +393,42 @@ static int s2250_command(struct i2c_client *client, | |||
| 354 | { | 393 | { |
| 355 | struct v4l2_control *ctrl = arg; | 394 | struct v4l2_control *ctrl = arg; |
| 356 | int value1; | 395 | int value1; |
| 396 | u16 oldvalue; | ||
| 357 | 397 | ||
| 358 | switch (ctrl->id) { | 398 | switch (ctrl->id) { |
| 359 | case V4L2_CID_BRIGHTNESS: | 399 | case V4L2_CID_BRIGHTNESS: |
| 360 | printk(KERN_INFO "s2250: future setting\n"); | 400 | if (ctrl->value > 100) |
| 361 | return -EINVAL; | 401 | dec->brightness = 100; |
| 402 | else if (ctrl->value < 0) | ||
| 403 | dec->brightness = 0; | ||
| 404 | else | ||
| 405 | dec->brightness = ctrl->value; | ||
| 406 | value1 = (dec->brightness - 50) * 255 / 100; | ||
| 407 | read_reg_fp(client, VPX322_ADDR_BRIGHTNESS0, &oldvalue); | ||
| 408 | write_reg_fp(client, VPX322_ADDR_BRIGHTNESS0, | ||
| 409 | value1 | (oldvalue & ~0xff)); | ||
| 410 | read_reg_fp(client, VPX322_ADDR_BRIGHTNESS1, &oldvalue); | ||
| 411 | write_reg_fp(client, VPX322_ADDR_BRIGHTNESS1, | ||
| 412 | value1 | (oldvalue & ~0xff)); | ||
| 413 | write_reg_fp(client, 0x140, 0x60); | ||
| 414 | break; | ||
| 362 | case V4L2_CID_CONTRAST: | 415 | case V4L2_CID_CONTRAST: |
| 363 | printk(KERN_INFO "s2250: future setting\n"); | 416 | if (ctrl->value > 100) |
| 364 | return -EINVAL; | 417 | dec->contrast = 100; |
| 418 | else if (ctrl->value < 0) | ||
| 419 | dec->contrast = 0; | ||
| 420 | else | ||
| 421 | dec->contrast = ctrl->value; | ||
| 422 | value1 = dec->contrast * 0x40 / 100; | ||
| 423 | if (value1 > 0x3f) | ||
| 424 | value1 = 0x3f; /* max */ | ||
| 425 | read_reg_fp(client, VPX322_ADDR_CONTRAST0, &oldvalue); | ||
| 426 | write_reg_fp(client, VPX322_ADDR_CONTRAST0, | ||
| 427 | value1 | (oldvalue & ~0x3f)); | ||
| 428 | read_reg_fp(client, VPX322_ADDR_CONTRAST1, &oldvalue); | ||
| 429 | write_reg_fp(client, VPX322_ADDR_CONTRAST1, | ||
| 430 | value1 | (oldvalue & ~0x3f)); | ||
| 431 | write_reg_fp(client, 0x140, 0x60); | ||
| 365 | break; | 432 | break; |
| 366 | case V4L2_CID_SATURATION: | 433 | case V4L2_CID_SATURATION: |
| 367 | if (ctrl->value > 127) | 434 | if (ctrl->value > 127) |
