diff options
| -rw-r--r-- | drivers/media/video/bt8xx/bttv-driver.c | 355 |
1 files changed, 178 insertions, 177 deletions
diff --git a/drivers/media/video/bt8xx/bttv-driver.c b/drivers/media/video/bt8xx/bttv-driver.c index 30cc2d3ba52d..c8f958151677 100644 --- a/drivers/media/video/bt8xx/bttv-driver.c +++ b/drivers/media/video/bt8xx/bttv-driver.c | |||
| @@ -1442,6 +1442,170 @@ static void bttv_reinit_bt848(struct bttv *btv) | |||
| 1442 | set_input(btv, btv->input, btv->tvnorm); | 1442 | set_input(btv, btv->input, btv->tvnorm); |
| 1443 | } | 1443 | } |
| 1444 | 1444 | ||
| 1445 | static int bttv_g_ctrl(struct file *file, void *priv, | ||
| 1446 | struct v4l2_control *c) | ||
| 1447 | { | ||
| 1448 | struct bttv_fh *fh = priv; | ||
| 1449 | struct bttv *btv = fh->btv; | ||
| 1450 | |||
| 1451 | switch (c->id) { | ||
| 1452 | case V4L2_CID_BRIGHTNESS: | ||
| 1453 | c->value = btv->bright; | ||
| 1454 | break; | ||
| 1455 | case V4L2_CID_HUE: | ||
| 1456 | c->value = btv->hue; | ||
| 1457 | break; | ||
| 1458 | case V4L2_CID_CONTRAST: | ||
| 1459 | c->value = btv->contrast; | ||
| 1460 | break; | ||
| 1461 | case V4L2_CID_SATURATION: | ||
| 1462 | c->value = btv->saturation; | ||
| 1463 | break; | ||
| 1464 | |||
| 1465 | case V4L2_CID_AUDIO_MUTE: | ||
| 1466 | case V4L2_CID_AUDIO_VOLUME: | ||
| 1467 | case V4L2_CID_AUDIO_BALANCE: | ||
| 1468 | case V4L2_CID_AUDIO_BASS: | ||
| 1469 | case V4L2_CID_AUDIO_TREBLE: | ||
| 1470 | bttv_call_i2c_clients(btv, VIDIOC_G_CTRL, c); | ||
| 1471 | break; | ||
| 1472 | |||
| 1473 | case V4L2_CID_PRIVATE_CHROMA_AGC: | ||
| 1474 | c->value = btv->opt_chroma_agc; | ||
| 1475 | break; | ||
| 1476 | case V4L2_CID_PRIVATE_COMBFILTER: | ||
| 1477 | c->value = btv->opt_combfilter; | ||
| 1478 | break; | ||
| 1479 | case V4L2_CID_PRIVATE_LUMAFILTER: | ||
| 1480 | c->value = btv->opt_lumafilter; | ||
| 1481 | break; | ||
| 1482 | case V4L2_CID_PRIVATE_AUTOMUTE: | ||
| 1483 | c->value = btv->opt_automute; | ||
| 1484 | break; | ||
| 1485 | case V4L2_CID_PRIVATE_AGC_CRUSH: | ||
| 1486 | c->value = btv->opt_adc_crush; | ||
| 1487 | break; | ||
| 1488 | case V4L2_CID_PRIVATE_VCR_HACK: | ||
| 1489 | c->value = btv->opt_vcr_hack; | ||
| 1490 | break; | ||
| 1491 | case V4L2_CID_PRIVATE_WHITECRUSH_UPPER: | ||
| 1492 | c->value = btv->opt_whitecrush_upper; | ||
| 1493 | break; | ||
| 1494 | case V4L2_CID_PRIVATE_WHITECRUSH_LOWER: | ||
| 1495 | c->value = btv->opt_whitecrush_lower; | ||
| 1496 | break; | ||
| 1497 | case V4L2_CID_PRIVATE_UV_RATIO: | ||
| 1498 | c->value = btv->opt_uv_ratio; | ||
| 1499 | break; | ||
| 1500 | case V4L2_CID_PRIVATE_FULL_LUMA_RANGE: | ||
| 1501 | c->value = btv->opt_full_luma_range; | ||
| 1502 | break; | ||
| 1503 | case V4L2_CID_PRIVATE_CORING: | ||
| 1504 | c->value = btv->opt_coring; | ||
| 1505 | break; | ||
| 1506 | default: | ||
| 1507 | return -EINVAL; | ||
| 1508 | } | ||
| 1509 | return 0; | ||
| 1510 | } | ||
| 1511 | |||
| 1512 | static int bttv_s_ctrl(struct file *file, void *f, | ||
| 1513 | struct v4l2_control *c) | ||
| 1514 | { | ||
| 1515 | int err; | ||
| 1516 | int val; | ||
| 1517 | struct bttv_fh *fh = f; | ||
| 1518 | struct bttv *btv = fh->btv; | ||
| 1519 | |||
| 1520 | err = v4l2_prio_check(&btv->prio, &fh->prio); | ||
| 1521 | if (0 != err) | ||
| 1522 | return err; | ||
| 1523 | |||
| 1524 | switch (c->id) { | ||
| 1525 | case V4L2_CID_BRIGHTNESS: | ||
| 1526 | bt848_bright(btv, c->value); | ||
| 1527 | break; | ||
| 1528 | case V4L2_CID_HUE: | ||
| 1529 | bt848_hue(btv, c->value); | ||
| 1530 | break; | ||
| 1531 | case V4L2_CID_CONTRAST: | ||
| 1532 | bt848_contrast(btv, c->value); | ||
| 1533 | break; | ||
| 1534 | case V4L2_CID_SATURATION: | ||
| 1535 | bt848_sat(btv, c->value); | ||
| 1536 | break; | ||
| 1537 | case V4L2_CID_AUDIO_MUTE: | ||
| 1538 | audio_mute(btv, c->value); | ||
| 1539 | /* fall through */ | ||
| 1540 | case V4L2_CID_AUDIO_VOLUME: | ||
| 1541 | if (btv->volume_gpio) | ||
| 1542 | btv->volume_gpio(btv, c->value); | ||
| 1543 | |||
| 1544 | bttv_call_i2c_clients(btv, VIDIOC_S_CTRL, c); | ||
| 1545 | break; | ||
| 1546 | case V4L2_CID_AUDIO_BALANCE: | ||
| 1547 | case V4L2_CID_AUDIO_BASS: | ||
| 1548 | case V4L2_CID_AUDIO_TREBLE: | ||
| 1549 | bttv_call_i2c_clients(btv, VIDIOC_S_CTRL, c); | ||
| 1550 | break; | ||
| 1551 | |||
| 1552 | case V4L2_CID_PRIVATE_CHROMA_AGC: | ||
| 1553 | btv->opt_chroma_agc = c->value; | ||
| 1554 | val = btv->opt_chroma_agc ? BT848_SCLOOP_CAGC : 0; | ||
| 1555 | btwrite(val, BT848_E_SCLOOP); | ||
| 1556 | btwrite(val, BT848_O_SCLOOP); | ||
| 1557 | break; | ||
| 1558 | case V4L2_CID_PRIVATE_COMBFILTER: | ||
| 1559 | btv->opt_combfilter = c->value; | ||
| 1560 | break; | ||
| 1561 | case V4L2_CID_PRIVATE_LUMAFILTER: | ||
| 1562 | btv->opt_lumafilter = c->value; | ||
| 1563 | if (btv->opt_lumafilter) { | ||
| 1564 | btand(~BT848_CONTROL_LDEC, BT848_E_CONTROL); | ||
| 1565 | btand(~BT848_CONTROL_LDEC, BT848_O_CONTROL); | ||
| 1566 | } else { | ||
| 1567 | btor(BT848_CONTROL_LDEC, BT848_E_CONTROL); | ||
| 1568 | btor(BT848_CONTROL_LDEC, BT848_O_CONTROL); | ||
| 1569 | } | ||
| 1570 | break; | ||
| 1571 | case V4L2_CID_PRIVATE_AUTOMUTE: | ||
| 1572 | btv->opt_automute = c->value; | ||
| 1573 | break; | ||
| 1574 | case V4L2_CID_PRIVATE_AGC_CRUSH: | ||
| 1575 | btv->opt_adc_crush = c->value; | ||
| 1576 | btwrite(BT848_ADC_RESERVED | | ||
| 1577 | (btv->opt_adc_crush ? BT848_ADC_CRUSH : 0), | ||
| 1578 | BT848_ADC); | ||
| 1579 | break; | ||
| 1580 | case V4L2_CID_PRIVATE_VCR_HACK: | ||
| 1581 | btv->opt_vcr_hack = c->value; | ||
| 1582 | break; | ||
| 1583 | case V4L2_CID_PRIVATE_WHITECRUSH_UPPER: | ||
| 1584 | btv->opt_whitecrush_upper = c->value; | ||
| 1585 | btwrite(c->value, BT848_WC_UP); | ||
| 1586 | break; | ||
| 1587 | case V4L2_CID_PRIVATE_WHITECRUSH_LOWER: | ||
| 1588 | btv->opt_whitecrush_lower = c->value; | ||
| 1589 | btwrite(c->value, BT848_WC_DOWN); | ||
| 1590 | break; | ||
| 1591 | case V4L2_CID_PRIVATE_UV_RATIO: | ||
| 1592 | btv->opt_uv_ratio = c->value; | ||
| 1593 | bt848_sat(btv, btv->saturation); | ||
| 1594 | break; | ||
| 1595 | case V4L2_CID_PRIVATE_FULL_LUMA_RANGE: | ||
| 1596 | btv->opt_full_luma_range = c->value; | ||
| 1597 | btaor((c->value<<7), ~BT848_OFORM_RANGE, BT848_OFORM); | ||
| 1598 | break; | ||
| 1599 | case V4L2_CID_PRIVATE_CORING: | ||
| 1600 | btv->opt_coring = c->value; | ||
| 1601 | btaor((c->value<<5), ~BT848_OFORM_CORE32, BT848_OFORM); | ||
| 1602 | break; | ||
| 1603 | default: | ||
| 1604 | return -EINVAL; | ||
| 1605 | } | ||
| 1606 | return 0; | ||
| 1607 | } | ||
| 1608 | |||
| 1445 | /* ----------------------------------------------------------------------- */ | 1609 | /* ----------------------------------------------------------------------- */ |
| 1446 | 1610 | ||
| 1447 | void bttv_gpio_tracking(struct bttv *btv, char *comment) | 1611 | void bttv_gpio_tracking(struct bttv *btv, char *comment) |
| @@ -1869,170 +2033,6 @@ static int bttv_log_status(struct file *file, void *f) | |||
| 1869 | return 0; | 2033 | return 0; |
| 1870 | } | 2034 | } |
| 1871 | 2035 | ||
| 1872 | static int bttv_g_ctrl(struct file *file, void *priv, | ||
| 1873 | struct v4l2_control *c) | ||
| 1874 | { | ||
| 1875 | struct bttv_fh *fh = priv; | ||
| 1876 | struct bttv *btv = fh->btv; | ||
| 1877 | |||
| 1878 | switch (c->id) { | ||
| 1879 | case V4L2_CID_BRIGHTNESS: | ||
| 1880 | c->value = btv->bright; | ||
| 1881 | break; | ||
| 1882 | case V4L2_CID_HUE: | ||
| 1883 | c->value = btv->hue; | ||
| 1884 | break; | ||
| 1885 | case V4L2_CID_CONTRAST: | ||
| 1886 | c->value = btv->contrast; | ||
| 1887 | break; | ||
| 1888 | case V4L2_CID_SATURATION: | ||
| 1889 | c->value = btv->saturation; | ||
| 1890 | break; | ||
| 1891 | |||
| 1892 | case V4L2_CID_AUDIO_MUTE: | ||
| 1893 | case V4L2_CID_AUDIO_VOLUME: | ||
| 1894 | case V4L2_CID_AUDIO_BALANCE: | ||
| 1895 | case V4L2_CID_AUDIO_BASS: | ||
| 1896 | case V4L2_CID_AUDIO_TREBLE: | ||
| 1897 | bttv_call_i2c_clients(btv, VIDIOC_G_CTRL, c); | ||
| 1898 | break; | ||
| 1899 | |||
| 1900 | case V4L2_CID_PRIVATE_CHROMA_AGC: | ||
| 1901 | c->value = btv->opt_chroma_agc; | ||
| 1902 | break; | ||
| 1903 | case V4L2_CID_PRIVATE_COMBFILTER: | ||
| 1904 | c->value = btv->opt_combfilter; | ||
| 1905 | break; | ||
| 1906 | case V4L2_CID_PRIVATE_LUMAFILTER: | ||
| 1907 | c->value = btv->opt_lumafilter; | ||
| 1908 | break; | ||
| 1909 | case V4L2_CID_PRIVATE_AUTOMUTE: | ||
| 1910 | c->value = btv->opt_automute; | ||
| 1911 | break; | ||
| 1912 | case V4L2_CID_PRIVATE_AGC_CRUSH: | ||
| 1913 | c->value = btv->opt_adc_crush; | ||
| 1914 | break; | ||
| 1915 | case V4L2_CID_PRIVATE_VCR_HACK: | ||
| 1916 | c->value = btv->opt_vcr_hack; | ||
| 1917 | break; | ||
| 1918 | case V4L2_CID_PRIVATE_WHITECRUSH_UPPER: | ||
| 1919 | c->value = btv->opt_whitecrush_upper; | ||
| 1920 | break; | ||
| 1921 | case V4L2_CID_PRIVATE_WHITECRUSH_LOWER: | ||
| 1922 | c->value = btv->opt_whitecrush_lower; | ||
| 1923 | break; | ||
| 1924 | case V4L2_CID_PRIVATE_UV_RATIO: | ||
| 1925 | c->value = btv->opt_uv_ratio; | ||
| 1926 | break; | ||
| 1927 | case V4L2_CID_PRIVATE_FULL_LUMA_RANGE: | ||
| 1928 | c->value = btv->opt_full_luma_range; | ||
| 1929 | break; | ||
| 1930 | case V4L2_CID_PRIVATE_CORING: | ||
| 1931 | c->value = btv->opt_coring; | ||
| 1932 | break; | ||
| 1933 | default: | ||
| 1934 | return -EINVAL; | ||
| 1935 | } | ||
| 1936 | return 0; | ||
| 1937 | } | ||
| 1938 | |||
| 1939 | static int bttv_s_ctrl(struct file *file, void *f, | ||
| 1940 | struct v4l2_control *c) | ||
| 1941 | { | ||
| 1942 | int err; | ||
| 1943 | int val; | ||
| 1944 | struct bttv_fh *fh = f; | ||
| 1945 | struct bttv *btv = fh->btv; | ||
| 1946 | |||
| 1947 | err = v4l2_prio_check(&btv->prio, &fh->prio); | ||
| 1948 | if (0 != err) | ||
| 1949 | return err; | ||
| 1950 | |||
| 1951 | switch (c->id) { | ||
| 1952 | case V4L2_CID_BRIGHTNESS: | ||
| 1953 | bt848_bright(btv, c->value); | ||
| 1954 | break; | ||
| 1955 | case V4L2_CID_HUE: | ||
| 1956 | bt848_hue(btv, c->value); | ||
| 1957 | break; | ||
| 1958 | case V4L2_CID_CONTRAST: | ||
| 1959 | bt848_contrast(btv, c->value); | ||
| 1960 | break; | ||
| 1961 | case V4L2_CID_SATURATION: | ||
| 1962 | bt848_sat(btv, c->value); | ||
| 1963 | break; | ||
| 1964 | case V4L2_CID_AUDIO_MUTE: | ||
| 1965 | audio_mute(btv, c->value); | ||
| 1966 | /* fall through */ | ||
| 1967 | case V4L2_CID_AUDIO_VOLUME: | ||
| 1968 | if (btv->volume_gpio) | ||
| 1969 | btv->volume_gpio(btv, c->value); | ||
| 1970 | |||
| 1971 | bttv_call_i2c_clients(btv, VIDIOC_S_CTRL, c); | ||
| 1972 | break; | ||
| 1973 | case V4L2_CID_AUDIO_BALANCE: | ||
| 1974 | case V4L2_CID_AUDIO_BASS: | ||
| 1975 | case V4L2_CID_AUDIO_TREBLE: | ||
| 1976 | bttv_call_i2c_clients(btv, VIDIOC_S_CTRL, c); | ||
| 1977 | break; | ||
| 1978 | |||
| 1979 | case V4L2_CID_PRIVATE_CHROMA_AGC: | ||
| 1980 | btv->opt_chroma_agc = c->value; | ||
| 1981 | val = btv->opt_chroma_agc ? BT848_SCLOOP_CAGC : 0; | ||
| 1982 | btwrite(val, BT848_E_SCLOOP); | ||
| 1983 | btwrite(val, BT848_O_SCLOOP); | ||
| 1984 | break; | ||
| 1985 | case V4L2_CID_PRIVATE_COMBFILTER: | ||
| 1986 | btv->opt_combfilter = c->value; | ||
| 1987 | break; | ||
| 1988 | case V4L2_CID_PRIVATE_LUMAFILTER: | ||
| 1989 | btv->opt_lumafilter = c->value; | ||
| 1990 | if (btv->opt_lumafilter) { | ||
| 1991 | btand(~BT848_CONTROL_LDEC, BT848_E_CONTROL); | ||
| 1992 | btand(~BT848_CONTROL_LDEC, BT848_O_CONTROL); | ||
| 1993 | } else { | ||
| 1994 | btor(BT848_CONTROL_LDEC, BT848_E_CONTROL); | ||
| 1995 | btor(BT848_CONTROL_LDEC, BT848_O_CONTROL); | ||
| 1996 | } | ||
| 1997 | break; | ||
| 1998 | case V4L2_CID_PRIVATE_AUTOMUTE: | ||
| 1999 | btv->opt_automute = c->value; | ||
| 2000 | break; | ||
| 2001 | case V4L2_CID_PRIVATE_AGC_CRUSH: | ||
| 2002 | btv->opt_adc_crush = c->value; | ||
| 2003 | btwrite(BT848_ADC_RESERVED | | ||
| 2004 | (btv->opt_adc_crush ? BT848_ADC_CRUSH : 0), | ||
| 2005 | BT848_ADC); | ||
| 2006 | break; | ||
| 2007 | case V4L2_CID_PRIVATE_VCR_HACK: | ||
| 2008 | btv->opt_vcr_hack = c->value; | ||
| 2009 | break; | ||
| 2010 | case V4L2_CID_PRIVATE_WHITECRUSH_UPPER: | ||
| 2011 | btv->opt_whitecrush_upper = c->value; | ||
| 2012 | btwrite(c->value, BT848_WC_UP); | ||
| 2013 | break; | ||
| 2014 | case V4L2_CID_PRIVATE_WHITECRUSH_LOWER: | ||
| 2015 | btv->opt_whitecrush_lower = c->value; | ||
| 2016 | btwrite(c->value, BT848_WC_DOWN); | ||
| 2017 | break; | ||
| 2018 | case V4L2_CID_PRIVATE_UV_RATIO: | ||
| 2019 | btv->opt_uv_ratio = c->value; | ||
| 2020 | bt848_sat(btv, btv->saturation); | ||
| 2021 | break; | ||
| 2022 | case V4L2_CID_PRIVATE_FULL_LUMA_RANGE: | ||
| 2023 | btv->opt_full_luma_range = c->value; | ||
| 2024 | btaor((c->value<<7), ~BT848_OFORM_RANGE, BT848_OFORM); | ||
| 2025 | break; | ||
| 2026 | case V4L2_CID_PRIVATE_CORING: | ||
| 2027 | btv->opt_coring = c->value; | ||
| 2028 | btaor((c->value<<5), ~BT848_OFORM_CORE32, BT848_OFORM); | ||
| 2029 | break; | ||
| 2030 | default: | ||
| 2031 | return -EINVAL; | ||
| 2032 | } | ||
| 2033 | return 0; | ||
| 2034 | } | ||
| 2035 | |||
| 2036 | #ifdef CONFIG_VIDEO_ADV_DEBUG | 2036 | #ifdef CONFIG_VIDEO_ADV_DEBUG |
| 2037 | static int bttv_g_register(struct file *file, void *f, | 2037 | static int bttv_g_register(struct file *file, void *f, |
| 2038 | struct v4l2_register *reg) | 2038 | struct v4l2_register *reg) |
| @@ -2633,13 +2633,26 @@ static int bttv_querycap(struct file *file, void *priv, | |||
| 2633 | return 0; | 2633 | return 0; |
| 2634 | } | 2634 | } |
| 2635 | 2635 | ||
| 2636 | static int bttv_enum_fmt_vbi(struct file *file, void *priv, | ||
| 2637 | struct v4l2_fmtdesc *f) | ||
| 2638 | { | ||
| 2639 | if (0 != f->index) | ||
| 2640 | return -EINVAL; | ||
| 2641 | |||
| 2642 | f->pixelformat = V4L2_PIX_FMT_GREY; | ||
| 2643 | strcpy(f->description, "vbi data"); | ||
| 2644 | |||
| 2645 | return 0; | ||
| 2646 | } | ||
| 2647 | |||
| 2636 | static int bttv_enum_fmt_cap(struct file *file, void *priv, | 2648 | static int bttv_enum_fmt_cap(struct file *file, void *priv, |
| 2637 | struct v4l2_fmtdesc *f) | 2649 | struct v4l2_fmtdesc *f) |
| 2638 | { | 2650 | { |
| 2639 | if (f->index >= FORMATS) | 2651 | if (f->index >= FORMATS) |
| 2640 | return -EINVAL; | 2652 | return -EINVAL; |
| 2641 | 2653 | ||
| 2642 | strlcpy(f->description, formats[f->index].name, sizeof(f->description)); | 2654 | strlcpy(f->description, formats[f->index].name, |
| 2655 | sizeof(f->description)); | ||
| 2643 | f->pixelformat = formats[f->index].fourcc; | 2656 | f->pixelformat = formats[f->index].fourcc; |
| 2644 | 2657 | ||
| 2645 | return 0; | 2658 | return 0; |
| @@ -2664,18 +2677,6 @@ static int bttv_enum_fmt_overlay(struct file *file, void *priv, | |||
| 2664 | return 0; | 2677 | return 0; |
| 2665 | } | 2678 | } |
| 2666 | 2679 | ||
| 2667 | static int bttv_enum_fmt_vbi(struct file *file, void *priv, | ||
| 2668 | struct v4l2_fmtdesc *f) | ||
| 2669 | { | ||
| 2670 | if (0 != f->index) | ||
| 2671 | return -EINVAL; | ||
| 2672 | |||
| 2673 | f->pixelformat = V4L2_PIX_FMT_GREY; | ||
| 2674 | strcpy(f->description, "vbi data"); | ||
| 2675 | |||
| 2676 | return 0; | ||
| 2677 | } | ||
| 2678 | |||
| 2679 | static int bttv_g_fbuf(struct file *file, void *f, | 2680 | static int bttv_g_fbuf(struct file *file, void *f, |
| 2680 | struct v4l2_framebuffer *fb) | 2681 | struct v4l2_framebuffer *fb) |
| 2681 | { | 2682 | { |
