mirror of
https://github.com/ukui/kernel.git
synced 2026-03-09 10:07:04 -07:00
Merge branch 'v4l_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6
* 'v4l_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mchehab/linux-2.6: [media] v1.88 DM04/QQBOX Move remote to use rc_core dvb-usb-remote [media] Add missing include guard to header file [media] Inlined functions should be static [media] Remove invalid parameter description [media] cpia2: fix warning about invalid trigraph sequence [media] s5p-csis: Add missing dependency on PLAT_S5P [media] gspca/kinect: wrap gspca_debug with GSPCA_DEBUG [media] fintek-cir: new driver for Fintek LPC SuperIO CIR function [media] uvcvideo: Connect video devices to media entities [media] uvcvideo: Register subdevices for each entity [media] uvcvideo: Register a v4l2_device [media] add V4L2-PIX-FMT-SRGGB12 & friends to docbook [media] Documentation/DocBook: Rename media fops xml files [media] Media DocBook: fix validation errors [media] wl12xx: g_volatile_ctrl fix: wrong field set [media] fix kconfig dependency warning for VIDEO_TIMBERDALE [media] dm1105: GPIO handling added, I2C on GPIO added, LNB control through GPIO reworked [media] Add support for M-5MOLS 8 Mega Pixel camera ISP
This commit is contained in:
@@ -141,13 +141,15 @@ struct dtv_properties {
|
||||
</row></tbody></tgroup></informaltable>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<title>Property types</title>
|
||||
<para>
|
||||
On <link linkend="FE_GET_PROPERTY">FE_GET_PROPERTY</link>/<link linkend="FE_SET_PROPERTY">FE_SET_PROPERTY</link>,
|
||||
the actual action is determined by the dtv_property cmd/data pairs. With one single ioctl, is possible to
|
||||
get/set up to 64 properties. The actual meaning of each property is described on the next sections.
|
||||
</para>
|
||||
|
||||
<para>The Available frontend property types are:</para>
|
||||
<para>The available frontend property types are:</para>
|
||||
<programlisting>
|
||||
#define DTV_UNDEFINED 0
|
||||
#define DTV_TUNE 1
|
||||
@@ -193,6 +195,7 @@ get/set up to 64 properties. The actual meaning of each property is described on
|
||||
#define DTV_ISDBT_LAYER_ENABLED 41
|
||||
#define DTV_ISDBS_TS_ID 42
|
||||
</programlisting>
|
||||
</section>
|
||||
|
||||
<section id="fe_property_common">
|
||||
<title>Parameters that are common to all Digital TV standards</title>
|
||||
|
||||
@@ -293,6 +293,7 @@
|
||||
<!ENTITY sub-yuyv SYSTEM "v4l/pixfmt-yuyv.xml">
|
||||
<!ENTITY sub-yvyu SYSTEM "v4l/pixfmt-yvyu.xml">
|
||||
<!ENTITY sub-srggb10 SYSTEM "v4l/pixfmt-srggb10.xml">
|
||||
<!ENTITY sub-srggb12 SYSTEM "v4l/pixfmt-srggb12.xml">
|
||||
<!ENTITY sub-srggb8 SYSTEM "v4l/pixfmt-srggb8.xml">
|
||||
<!ENTITY sub-y10 SYSTEM "v4l/pixfmt-y10.xml">
|
||||
<!ENTITY sub-y12 SYSTEM "v4l/pixfmt-y12.xml">
|
||||
@@ -373,9 +374,9 @@
|
||||
<!ENTITY sub-media-indices SYSTEM "media-indices.tmpl">
|
||||
|
||||
<!ENTITY sub-media-controller SYSTEM "v4l/media-controller.xml">
|
||||
<!ENTITY sub-media-open SYSTEM "v4l/media-func-open.xml">
|
||||
<!ENTITY sub-media-close SYSTEM "v4l/media-func-close.xml">
|
||||
<!ENTITY sub-media-ioctl SYSTEM "v4l/media-func-ioctl.xml">
|
||||
<!ENTITY sub-media-func-open SYSTEM "v4l/media-func-open.xml">
|
||||
<!ENTITY sub-media-func-close SYSTEM "v4l/media-func-close.xml">
|
||||
<!ENTITY sub-media-func-ioctl SYSTEM "v4l/media-func-ioctl.xml">
|
||||
<!ENTITY sub-media-ioc-device-info SYSTEM "v4l/media-ioc-device-info.xml">
|
||||
<!ENTITY sub-media-ioc-enum-entities SYSTEM "v4l/media-ioc-enum-entities.xml">
|
||||
<!ENTITY sub-media-ioc-enum-links SYSTEM "v4l/media-ioc-enum-links.xml">
|
||||
|
||||
@@ -78,9 +78,9 @@
|
||||
<appendix id="media-user-func">
|
||||
<title>Function Reference</title>
|
||||
<!-- Keep this alphabetically sorted. -->
|
||||
&sub-media-open;
|
||||
&sub-media-close;
|
||||
&sub-media-ioctl;
|
||||
&sub-media-func-open;
|
||||
&sub-media-func-close;
|
||||
&sub-media-func-ioctl;
|
||||
<!-- All ioctls go here. -->
|
||||
&sub-media-ioc-device-info;
|
||||
&sub-media-ioc-enum-entities;
|
||||
|
||||
@@ -673,6 +673,7 @@ access the palette, this must be done with ioctls of the Linux framebuffer API.<
|
||||
&sub-srggb8;
|
||||
&sub-sbggr16;
|
||||
&sub-srggb10;
|
||||
&sub-srggb12;
|
||||
</section>
|
||||
|
||||
<section id="yuv-formats">
|
||||
|
||||
@@ -2531,13 +2531,13 @@
|
||||
<constant>_JPEG</constant> prefix the format code is made of
|
||||
the following information.
|
||||
<itemizedlist>
|
||||
<listitem>The number of bus samples per entropy encoded byte.</listitem>
|
||||
<listitem>The bus width.</listitem>
|
||||
<listitem><para>The number of bus samples per entropy encoded byte.</para></listitem>
|
||||
<listitem><para>The bus width.</para></listitem>
|
||||
</itemizedlist>
|
||||
</para>
|
||||
|
||||
<para>For instance, for a JPEG baseline process and an 8-bit bus width
|
||||
the format will be named <constant>V4L2_MBUS_FMT_JPEG_1X8</constant>.
|
||||
</para>
|
||||
<para>For instance, for a JPEG baseline process and an 8-bit bus width
|
||||
the format will be named <constant>V4L2_MBUS_FMT_JPEG_1X8</constant>.
|
||||
</para>
|
||||
|
||||
<para>The following table lists existing JPEG compressed formats.</para>
|
||||
|
||||
@@ -20,6 +20,7 @@
|
||||
*/
|
||||
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/i2c-algo-bit.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
@@ -49,11 +50,12 @@
|
||||
|
||||
#define UNSET (-1U)
|
||||
|
||||
#define DM1105_BOARD_NOAUTO UNSET
|
||||
#define DM1105_BOARD_UNKNOWN 0
|
||||
#define DM1105_BOARD_DVBWORLD_2002 1
|
||||
#define DM1105_BOARD_DVBWORLD_2004 2
|
||||
#define DM1105_BOARD_AXESS_DM05 3
|
||||
#define DM1105_BOARD_NOAUTO UNSET
|
||||
#define DM1105_BOARD_UNKNOWN 0
|
||||
#define DM1105_BOARD_DVBWORLD_2002 1
|
||||
#define DM1105_BOARD_DVBWORLD_2004 2
|
||||
#define DM1105_BOARD_AXESS_DM05 3
|
||||
#define DM1105_BOARD_UNBRANDED_I2C_ON_GPIO 4
|
||||
|
||||
/* ----------------------------------------------- */
|
||||
/*
|
||||
@@ -157,22 +159,38 @@
|
||||
#define DM1105_MAX 0x04
|
||||
|
||||
#define DRIVER_NAME "dm1105"
|
||||
#define DM1105_I2C_GPIO_NAME "dm1105-gpio"
|
||||
|
||||
#define DM1105_DMA_PACKETS 47
|
||||
#define DM1105_DMA_PACKET_LENGTH (128*4)
|
||||
#define DM1105_DMA_BYTES (128 * 4 * DM1105_DMA_PACKETS)
|
||||
|
||||
/* */
|
||||
#define GPIO08 (1 << 8)
|
||||
#define GPIO13 (1 << 13)
|
||||
#define GPIO14 (1 << 14)
|
||||
#define GPIO15 (1 << 15)
|
||||
#define GPIO16 (1 << 16)
|
||||
#define GPIO17 (1 << 17)
|
||||
#define GPIO_ALL 0x03ffff
|
||||
|
||||
/* GPIO's for LNB power control */
|
||||
#define DM1105_LNB_MASK 0x00000000
|
||||
#define DM1105_LNB_OFF 0x00020000
|
||||
#define DM1105_LNB_13V 0x00010100
|
||||
#define DM1105_LNB_18V 0x00000100
|
||||
#define DM1105_LNB_MASK (GPIO_ALL & ~(GPIO14 | GPIO13))
|
||||
#define DM1105_LNB_OFF GPIO17
|
||||
#define DM1105_LNB_13V (GPIO16 | GPIO08)
|
||||
#define DM1105_LNB_18V GPIO08
|
||||
|
||||
/* GPIO's for LNB power control for Axess DM05 */
|
||||
#define DM05_LNB_MASK 0x00000000
|
||||
#define DM05_LNB_OFF 0x00020000/* actually 13v */
|
||||
#define DM05_LNB_13V 0x00020000
|
||||
#define DM05_LNB_18V 0x00030000
|
||||
#define DM05_LNB_MASK (GPIO_ALL & ~(GPIO14 | GPIO13))
|
||||
#define DM05_LNB_OFF GPIO17/* actually 13v */
|
||||
#define DM05_LNB_13V GPIO17
|
||||
#define DM05_LNB_18V (GPIO17 | GPIO16)
|
||||
|
||||
/* GPIO's for LNB power control for unbranded with I2C on GPIO */
|
||||
#define UNBR_LNB_MASK (GPIO17 | GPIO16)
|
||||
#define UNBR_LNB_OFF 0
|
||||
#define UNBR_LNB_13V GPIO17
|
||||
#define UNBR_LNB_18V (GPIO17 | GPIO16)
|
||||
|
||||
static unsigned int card[] = {[0 ... 3] = UNSET };
|
||||
module_param_array(card, int, NULL, 0444);
|
||||
@@ -187,7 +205,11 @@ static unsigned int dm1105_devcount;
|
||||
DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
|
||||
|
||||
struct dm1105_board {
|
||||
char *name;
|
||||
char *name;
|
||||
struct {
|
||||
u32 mask, off, v13, v18;
|
||||
} lnb;
|
||||
u32 gpio_scl, gpio_sda;
|
||||
};
|
||||
|
||||
struct dm1105_subid {
|
||||
@@ -199,15 +221,50 @@ struct dm1105_subid {
|
||||
static const struct dm1105_board dm1105_boards[] = {
|
||||
[DM1105_BOARD_UNKNOWN] = {
|
||||
.name = "UNKNOWN/GENERIC",
|
||||
.lnb = {
|
||||
.mask = DM1105_LNB_MASK,
|
||||
.off = DM1105_LNB_OFF,
|
||||
.v13 = DM1105_LNB_13V,
|
||||
.v18 = DM1105_LNB_18V,
|
||||
},
|
||||
},
|
||||
[DM1105_BOARD_DVBWORLD_2002] = {
|
||||
.name = "DVBWorld PCI 2002",
|
||||
.lnb = {
|
||||
.mask = DM1105_LNB_MASK,
|
||||
.off = DM1105_LNB_OFF,
|
||||
.v13 = DM1105_LNB_13V,
|
||||
.v18 = DM1105_LNB_18V,
|
||||
},
|
||||
},
|
||||
[DM1105_BOARD_DVBWORLD_2004] = {
|
||||
.name = "DVBWorld PCI 2004",
|
||||
.lnb = {
|
||||
.mask = DM1105_LNB_MASK,
|
||||
.off = DM1105_LNB_OFF,
|
||||
.v13 = DM1105_LNB_13V,
|
||||
.v18 = DM1105_LNB_18V,
|
||||
},
|
||||
},
|
||||
[DM1105_BOARD_AXESS_DM05] = {
|
||||
.name = "Axess/EasyTv DM05",
|
||||
.lnb = {
|
||||
.mask = DM05_LNB_MASK,
|
||||
.off = DM05_LNB_OFF,
|
||||
.v13 = DM05_LNB_13V,
|
||||
.v18 = DM05_LNB_18V,
|
||||
},
|
||||
},
|
||||
[DM1105_BOARD_UNBRANDED_I2C_ON_GPIO] = {
|
||||
.name = "Unbranded DM1105 with i2c on GPIOs",
|
||||
.lnb = {
|
||||
.mask = UNBR_LNB_MASK,
|
||||
.off = UNBR_LNB_OFF,
|
||||
.v13 = UNBR_LNB_13V,
|
||||
.v18 = UNBR_LNB_18V,
|
||||
},
|
||||
.gpio_scl = GPIO14,
|
||||
.gpio_sda = GPIO13,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -293,6 +350,8 @@ struct dm1105_dev {
|
||||
|
||||
/* i2c */
|
||||
struct i2c_adapter i2c_adap;
|
||||
struct i2c_adapter i2c_bb_adap;
|
||||
struct i2c_algo_bit_data i2c_bit;
|
||||
|
||||
/* irq */
|
||||
struct work_struct work;
|
||||
@@ -328,6 +387,103 @@ struct dm1105_dev {
|
||||
#define dm_setl(reg, bit) dm_andorl((reg), (bit), (bit))
|
||||
#define dm_clearl(reg, bit) dm_andorl((reg), (bit), 0)
|
||||
|
||||
/* The chip has 18 GPIOs. In HOST mode GPIO's used as 15 bit address lines,
|
||||
so we can use only 3 GPIO's from GPIO15 to GPIO17.
|
||||
Here I don't check whether HOST is enebled as it is not implemented yet.
|
||||
*/
|
||||
static void dm1105_gpio_set(struct dm1105_dev *dev, u32 mask)
|
||||
{
|
||||
if (mask & 0xfffc0000)
|
||||
printk(KERN_ERR "%s: Only 18 GPIO's are allowed\n", __func__);
|
||||
|
||||
if (mask & 0x0003ffff)
|
||||
dm_setl(DM1105_GPIOVAL, mask & 0x0003ffff);
|
||||
|
||||
}
|
||||
|
||||
static void dm1105_gpio_clear(struct dm1105_dev *dev, u32 mask)
|
||||
{
|
||||
if (mask & 0xfffc0000)
|
||||
printk(KERN_ERR "%s: Only 18 GPIO's are allowed\n", __func__);
|
||||
|
||||
if (mask & 0x0003ffff)
|
||||
dm_clearl(DM1105_GPIOVAL, mask & 0x0003ffff);
|
||||
|
||||
}
|
||||
|
||||
static void dm1105_gpio_andor(struct dm1105_dev *dev, u32 mask, u32 val)
|
||||
{
|
||||
if (mask & 0xfffc0000)
|
||||
printk(KERN_ERR "%s: Only 18 GPIO's are allowed\n", __func__);
|
||||
|
||||
if (mask & 0x0003ffff)
|
||||
dm_andorl(DM1105_GPIOVAL, mask & 0x0003ffff, val);
|
||||
|
||||
}
|
||||
|
||||
static u32 dm1105_gpio_get(struct dm1105_dev *dev, u32 mask)
|
||||
{
|
||||
if (mask & 0xfffc0000)
|
||||
printk(KERN_ERR "%s: Only 18 GPIO's are allowed\n", __func__);
|
||||
|
||||
if (mask & 0x0003ffff)
|
||||
return dm_readl(DM1105_GPIOVAL) & mask & 0x0003ffff;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void dm1105_gpio_enable(struct dm1105_dev *dev, u32 mask, int asoutput)
|
||||
{
|
||||
if (mask & 0xfffc0000)
|
||||
printk(KERN_ERR "%s: Only 18 GPIO's are allowed\n", __func__);
|
||||
|
||||
if ((mask & 0x0003ffff) && asoutput)
|
||||
dm_clearl(DM1105_GPIOCTR, mask & 0x0003ffff);
|
||||
else if ((mask & 0x0003ffff) && !asoutput)
|
||||
dm_setl(DM1105_GPIOCTR, mask & 0x0003ffff);
|
||||
|
||||
}
|
||||
|
||||
static void dm1105_setline(struct dm1105_dev *dev, u32 line, int state)
|
||||
{
|
||||
if (state)
|
||||
dm1105_gpio_enable(dev, line, 0);
|
||||
else {
|
||||
dm1105_gpio_enable(dev, line, 1);
|
||||
dm1105_gpio_clear(dev, line);
|
||||
}
|
||||
}
|
||||
|
||||
static void dm1105_setsda(void *data, int state)
|
||||
{
|
||||
struct dm1105_dev *dev = data;
|
||||
|
||||
dm1105_setline(dev, dm1105_boards[dev->boardnr].gpio_sda, state);
|
||||
}
|
||||
|
||||
static void dm1105_setscl(void *data, int state)
|
||||
{
|
||||
struct dm1105_dev *dev = data;
|
||||
|
||||
dm1105_setline(dev, dm1105_boards[dev->boardnr].gpio_scl, state);
|
||||
}
|
||||
|
||||
static int dm1105_getsda(void *data)
|
||||
{
|
||||
struct dm1105_dev *dev = data;
|
||||
|
||||
return dm1105_gpio_get(dev, dm1105_boards[dev->boardnr].gpio_sda)
|
||||
? 1 : 0;
|
||||
}
|
||||
|
||||
static int dm1105_getscl(void *data)
|
||||
{
|
||||
struct dm1105_dev *dev = data;
|
||||
|
||||
return dm1105_gpio_get(dev, dm1105_boards[dev->boardnr].gpio_scl)
|
||||
? 1 : 0;
|
||||
}
|
||||
|
||||
static int dm1105_i2c_xfer(struct i2c_adapter *i2c_adap,
|
||||
struct i2c_msg *msgs, int num)
|
||||
{
|
||||
@@ -436,31 +592,20 @@ static inline struct dm1105_dev *frontend_to_dm1105_dev(struct dvb_frontend *fe)
|
||||
static int dm1105_set_voltage(struct dvb_frontend *fe, fe_sec_voltage_t voltage)
|
||||
{
|
||||
struct dm1105_dev *dev = frontend_to_dm1105_dev(fe);
|
||||
u32 lnb_mask, lnb_13v, lnb_18v, lnb_off;
|
||||
|
||||
switch (dev->boardnr) {
|
||||
case DM1105_BOARD_AXESS_DM05:
|
||||
lnb_mask = DM05_LNB_MASK;
|
||||
lnb_off = DM05_LNB_OFF;
|
||||
lnb_13v = DM05_LNB_13V;
|
||||
lnb_18v = DM05_LNB_18V;
|
||||
break;
|
||||
case DM1105_BOARD_DVBWORLD_2002:
|
||||
case DM1105_BOARD_DVBWORLD_2004:
|
||||
default:
|
||||
lnb_mask = DM1105_LNB_MASK;
|
||||
lnb_off = DM1105_LNB_OFF;
|
||||
lnb_13v = DM1105_LNB_13V;
|
||||
lnb_18v = DM1105_LNB_18V;
|
||||
}
|
||||
|
||||
dm_writel(DM1105_GPIOCTR, lnb_mask);
|
||||
dm1105_gpio_enable(dev, dm1105_boards[dev->boardnr].lnb.mask, 1);
|
||||
if (voltage == SEC_VOLTAGE_18)
|
||||
dm_writel(DM1105_GPIOVAL, lnb_18v);
|
||||
dm1105_gpio_andor(dev,
|
||||
dm1105_boards[dev->boardnr].lnb.mask,
|
||||
dm1105_boards[dev->boardnr].lnb.v18);
|
||||
else if (voltage == SEC_VOLTAGE_13)
|
||||
dm_writel(DM1105_GPIOVAL, lnb_13v);
|
||||
dm1105_gpio_andor(dev,
|
||||
dm1105_boards[dev->boardnr].lnb.mask,
|
||||
dm1105_boards[dev->boardnr].lnb.v13);
|
||||
else
|
||||
dm_writel(DM1105_GPIOVAL, lnb_off);
|
||||
dm1105_gpio_andor(dev,
|
||||
dm1105_boards[dev->boardnr].lnb.mask,
|
||||
dm1105_boards[dev->boardnr].lnb.off);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -708,6 +853,38 @@ static int __devinit frontend_init(struct dm1105_dev *dev)
|
||||
int ret;
|
||||
|
||||
switch (dev->boardnr) {
|
||||
case DM1105_BOARD_UNBRANDED_I2C_ON_GPIO:
|
||||
dm1105_gpio_enable(dev, GPIO15, 1);
|
||||
dm1105_gpio_clear(dev, GPIO15);
|
||||
msleep(100);
|
||||
dm1105_gpio_set(dev, GPIO15);
|
||||
msleep(200);
|
||||
dev->fe = dvb_attach(
|
||||
stv0299_attach, &sharp_z0194a_config,
|
||||
&dev->i2c_bb_adap);
|
||||
if (dev->fe) {
|
||||
dev->fe->ops.set_voltage = dm1105_set_voltage;
|
||||
dvb_attach(dvb_pll_attach, dev->fe, 0x60,
|
||||
&dev->i2c_bb_adap, DVB_PLL_OPERA1);
|
||||
break;
|
||||
}
|
||||
|
||||
dev->fe = dvb_attach(
|
||||
stv0288_attach, &earda_config,
|
||||
&dev->i2c_bb_adap);
|
||||
if (dev->fe) {
|
||||
dev->fe->ops.set_voltage = dm1105_set_voltage;
|
||||
dvb_attach(stb6000_attach, dev->fe, 0x61,
|
||||
&dev->i2c_bb_adap);
|
||||
break;
|
||||
}
|
||||
|
||||
dev->fe = dvb_attach(
|
||||
si21xx_attach, &serit_config,
|
||||
&dev->i2c_bb_adap);
|
||||
if (dev->fe)
|
||||
dev->fe->ops.set_voltage = dm1105_set_voltage;
|
||||
break;
|
||||
case DM1105_BOARD_DVBWORLD_2004:
|
||||
dev->fe = dvb_attach(
|
||||
cx24116_attach, &serit_sp2633_config,
|
||||
@@ -870,11 +1047,32 @@ static int __devinit dm1105_probe(struct pci_dev *pdev,
|
||||
if (ret < 0)
|
||||
goto err_dm1105_hw_exit;
|
||||
|
||||
i2c_set_adapdata(&dev->i2c_bb_adap, dev);
|
||||
strcpy(dev->i2c_bb_adap.name, DM1105_I2C_GPIO_NAME);
|
||||
dev->i2c_bb_adap.owner = THIS_MODULE;
|
||||
dev->i2c_bb_adap.dev.parent = &pdev->dev;
|
||||
dev->i2c_bb_adap.algo_data = &dev->i2c_bit;
|
||||
dev->i2c_bit.data = dev;
|
||||
dev->i2c_bit.setsda = dm1105_setsda;
|
||||
dev->i2c_bit.setscl = dm1105_setscl;
|
||||
dev->i2c_bit.getsda = dm1105_getsda;
|
||||
dev->i2c_bit.getscl = dm1105_getscl;
|
||||
dev->i2c_bit.udelay = 10;
|
||||
dev->i2c_bit.timeout = 10;
|
||||
|
||||
/* Raise SCL and SDA */
|
||||
dm1105_setsda(dev, 1);
|
||||
dm1105_setscl(dev, 1);
|
||||
|
||||
ret = i2c_bit_add_bus(&dev->i2c_bb_adap);
|
||||
if (ret < 0)
|
||||
goto err_i2c_del_adapter;
|
||||
|
||||
/* dvb */
|
||||
ret = dvb_register_adapter(&dev->dvb_adapter, DRIVER_NAME,
|
||||
THIS_MODULE, &pdev->dev, adapter_nr);
|
||||
if (ret < 0)
|
||||
goto err_i2c_del_adapter;
|
||||
goto err_i2c_del_adapters;
|
||||
|
||||
dvb_adapter = &dev->dvb_adapter;
|
||||
|
||||
@@ -952,6 +1150,8 @@ err_dvb_dmx_release:
|
||||
dvb_dmx_release(dvbdemux);
|
||||
err_dvb_unregister_adapter:
|
||||
dvb_unregister_adapter(dvb_adapter);
|
||||
err_i2c_del_adapters:
|
||||
i2c_del_adapter(&dev->i2c_bb_adap);
|
||||
err_i2c_del_adapter:
|
||||
i2c_del_adapter(&dev->i2c_adap);
|
||||
err_dm1105_hw_exit:
|
||||
|
||||
@@ -207,17 +207,6 @@ static int lme2510_stream_restart(struct dvb_usb_device *d)
|
||||
rbuff, sizeof(rbuff));
|
||||
return ret;
|
||||
}
|
||||
static int lme2510_remote_keypress(struct dvb_usb_adapter *adap, u32 keypress)
|
||||
{
|
||||
struct dvb_usb_device *d = adap->dev;
|
||||
|
||||
deb_info(1, "INT Key Keypress =%04x", keypress);
|
||||
|
||||
if (keypress > 0)
|
||||
rc_keydown(d->rc_dev, keypress, 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int lme2510_enable_pid(struct dvb_usb_device *d, u8 index, u16 pid_out)
|
||||
{
|
||||
@@ -256,6 +245,7 @@ static void lme2510_int_response(struct urb *lme_urb)
|
||||
struct lme2510_state *st = adap->dev->priv;
|
||||
static u8 *ibuf, *rbuf;
|
||||
int i = 0, offset;
|
||||
u32 key;
|
||||
|
||||
switch (lme_urb->status) {
|
||||
case 0:
|
||||
@@ -282,10 +272,16 @@ static void lme2510_int_response(struct urb *lme_urb)
|
||||
|
||||
switch (ibuf[0]) {
|
||||
case 0xaa:
|
||||
debug_data_snipet(1, "INT Remote data snipet in", ibuf);
|
||||
lme2510_remote_keypress(adap,
|
||||
(u32)(ibuf[2] << 24) + (ibuf[3] << 16) +
|
||||
(ibuf[4] << 8) + ibuf[5]);
|
||||
debug_data_snipet(1, "INT Remote data snipet", ibuf);
|
||||
if ((ibuf[4] + ibuf[5]) == 0xff) {
|
||||
key = ibuf[5];
|
||||
key += (ibuf[3] > 0)
|
||||
? (ibuf[3] ^ 0xff) << 8 : 0;
|
||||
key += (ibuf[2] ^ 0xff) << 16;
|
||||
deb_info(1, "INT Key =%08x", key);
|
||||
if (adap->dev->rc_dev != NULL)
|
||||
rc_keydown(adap->dev->rc_dev, key, 0);
|
||||
}
|
||||
break;
|
||||
case 0xbb:
|
||||
switch (st->tuner_config) {
|
||||
@@ -691,45 +687,6 @@ static int lme2510_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff)
|
||||
return (ret < 0) ? -ENODEV : 0;
|
||||
}
|
||||
|
||||
static int lme2510_int_service(struct dvb_usb_adapter *adap)
|
||||
{
|
||||
struct dvb_usb_device *d = adap->dev;
|
||||
struct rc_dev *rc;
|
||||
int ret;
|
||||
|
||||
info("STA Configuring Remote");
|
||||
|
||||
rc = rc_allocate_device();
|
||||
if (!rc)
|
||||
return -ENOMEM;
|
||||
|
||||
usb_make_path(d->udev, d->rc_phys, sizeof(d->rc_phys));
|
||||
strlcat(d->rc_phys, "/ir0", sizeof(d->rc_phys));
|
||||
|
||||
rc->input_name = "LME2510 Remote Control";
|
||||
rc->input_phys = d->rc_phys;
|
||||
rc->map_name = RC_MAP_LME2510;
|
||||
rc->driver_name = "LME 2510";
|
||||
usb_to_input_id(d->udev, &rc->input_id);
|
||||
|
||||
ret = rc_register_device(rc);
|
||||
if (ret) {
|
||||
rc_free_device(rc);
|
||||
return ret;
|
||||
}
|
||||
d->rc_dev = rc;
|
||||
|
||||
/* Start the Interrupt */
|
||||
ret = lme2510_int_read(adap);
|
||||
if (ret < 0) {
|
||||
rc_unregister_device(rc);
|
||||
info("INT Unable to start Interrupt Service");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static u8 check_sum(u8 *p, u8 len)
|
||||
{
|
||||
u8 sum = 0;
|
||||
@@ -831,7 +788,7 @@ static int lme_firmware_switch(struct usb_device *udev, int cold)
|
||||
|
||||
cold_fw = !cold;
|
||||
|
||||
if (udev->descriptor.idProduct == 0x1122) {
|
||||
if (le16_to_cpu(udev->descriptor.idProduct) == 0x1122) {
|
||||
switch (dvb_usb_lme2510_firmware) {
|
||||
default:
|
||||
dvb_usb_lme2510_firmware = TUNER_S0194;
|
||||
@@ -1053,8 +1010,11 @@ static int dm04_lme2510_frontend_attach(struct dvb_usb_adapter *adap)
|
||||
|
||||
|
||||
end: if (ret) {
|
||||
kfree(adap->fe);
|
||||
adap->fe = NULL;
|
||||
if (adap->fe) {
|
||||
dvb_frontend_detach(adap->fe);
|
||||
adap->fe = NULL;
|
||||
}
|
||||
adap->dev->props.rc.core.rc_codes = NULL;
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
@@ -1097,8 +1057,12 @@ static int dm04_lme2510_tuner(struct dvb_usb_adapter *adap)
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
/* Start the Interrupt & Remote*/
|
||||
ret = lme2510_int_service(adap);
|
||||
/* Start the Interrupt*/
|
||||
ret = lme2510_int_read(adap);
|
||||
if (ret < 0) {
|
||||
info("INT Unable to start Interrupt Service");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -1204,6 +1168,12 @@ static struct dvb_usb_device_properties lme2510_properties = {
|
||||
}
|
||||
}
|
||||
},
|
||||
.rc.core = {
|
||||
.protocol = RC_TYPE_NEC,
|
||||
.module_name = "LME2510 Remote Control",
|
||||
.allowed_protos = RC_TYPE_NEC,
|
||||
.rc_codes = RC_MAP_LME2510,
|
||||
},
|
||||
.power_ctrl = lme2510_powerup,
|
||||
.identify_state = lme2510_identify_state,
|
||||
.i2c_algo = &lme2510_i2c_algo,
|
||||
@@ -1246,6 +1216,12 @@ static struct dvb_usb_device_properties lme2510c_properties = {
|
||||
}
|
||||
}
|
||||
},
|
||||
.rc.core = {
|
||||
.protocol = RC_TYPE_NEC,
|
||||
.module_name = "LME2510 Remote Control",
|
||||
.allowed_protos = RC_TYPE_NEC,
|
||||
.rc_codes = RC_MAP_LME2510,
|
||||
},
|
||||
.power_ctrl = lme2510_powerup,
|
||||
.identify_state = lme2510_identify_state,
|
||||
.i2c_algo = &lme2510_i2c_algo,
|
||||
@@ -1269,19 +1245,21 @@ static void *lme2510_exit_int(struct dvb_usb_device *d)
|
||||
adap->feedcount = 0;
|
||||
}
|
||||
|
||||
if (st->lme_urb != NULL) {
|
||||
if (st->usb_buffer != NULL) {
|
||||
st->i2c_talk_onoff = 1;
|
||||
st->signal_lock = 0;
|
||||
st->signal_level = 0;
|
||||
st->signal_sn = 0;
|
||||
buffer = st->usb_buffer;
|
||||
}
|
||||
|
||||
if (st->lme_urb != NULL) {
|
||||
usb_kill_urb(st->lme_urb);
|
||||
usb_free_coherent(d->udev, 5000, st->buffer,
|
||||
st->lme_urb->transfer_dma);
|
||||
info("Interrupt Service Stopped");
|
||||
rc_unregister_device(d->rc_dev);
|
||||
info("Remote Stopped");
|
||||
}
|
||||
|
||||
return buffer;
|
||||
}
|
||||
|
||||
@@ -1293,7 +1271,8 @@ static void lme2510_exit(struct usb_interface *intf)
|
||||
if (d != NULL) {
|
||||
usb_buffer = lme2510_exit_int(d);
|
||||
dvb_usb_device_exit(intf);
|
||||
kfree(usb_buffer);
|
||||
if (usb_buffer != NULL)
|
||||
kfree(usb_buffer);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1327,5 +1306,5 @@ module_exit(lme2510_module_exit);
|
||||
|
||||
MODULE_AUTHOR("Malcolm Priestley <tvboxspy@gmail.com>");
|
||||
MODULE_DESCRIPTION("LME2510(C) DVB-S USB2.0");
|
||||
MODULE_VERSION("1.86");
|
||||
MODULE_VERSION("1.88");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
#include "stb0899_priv.h"
|
||||
#include "stb0899_reg.h"
|
||||
|
||||
inline u32 stb0899_do_div(u64 n, u32 d)
|
||||
static inline u32 stb0899_do_div(u64 n, u32 d)
|
||||
{
|
||||
/* wrap do_div() for ease of use */
|
||||
|
||||
|
||||
@@ -224,7 +224,6 @@ exit:
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(tda8261_attach);
|
||||
MODULE_PARM_DESC(verbose, "Set verbosity level");
|
||||
|
||||
MODULE_AUTHOR("Manu Abraham");
|
||||
MODULE_DESCRIPTION("TDA8261 8PSK/QPSK Tuner");
|
||||
|
||||
@@ -1382,7 +1382,7 @@ static int wl1273_fm_g_volatile_ctrl(struct v4l2_ctrl *ctrl)
|
||||
|
||||
switch (ctrl->id) {
|
||||
case V4L2_CID_TUNE_ANTENNA_CAPACITOR:
|
||||
ctrl->val = wl1273_fm_get_tx_ctune(radio);
|
||||
ctrl->cur.val = wl1273_fm_get_tx_ctune(radio);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
@@ -191,7 +191,7 @@ static int fm_g_volatile_ctrl(struct v4l2_ctrl *ctrl)
|
||||
|
||||
switch (ctrl->id) {
|
||||
case V4L2_CID_TUNE_ANTENNA_CAPACITOR:
|
||||
ctrl->val = fm_tx_get_tune_cap_val(fmdev);
|
||||
ctrl->cur.val = fm_tx_get_tune_cap_val(fmdev);
|
||||
break;
|
||||
default:
|
||||
fmwarn("%s: Unknown IOCTL: %d\n", __func__, ctrl->id);
|
||||
|
||||
@@ -148,6 +148,18 @@ config IR_ITE_CIR
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called ite-cir.
|
||||
|
||||
config IR_FINTEK
|
||||
tristate "Fintek Consumer Infrared Transceiver"
|
||||
depends on PNP
|
||||
depends on RC_CORE
|
||||
---help---
|
||||
Say Y here to enable support for integrated infrared receiver
|
||||
/transciever made by Fintek. This chip is found on assorted
|
||||
Jetway motherboards (and of course, possibly others).
|
||||
|
||||
To compile this driver as a module, choose M here: the
|
||||
module will be called fintek-cir.
|
||||
|
||||
config IR_NUVOTON
|
||||
tristate "Nuvoton w836x7hg Consumer Infrared Transceiver"
|
||||
depends on PNP
|
||||
|
||||
@@ -16,6 +16,7 @@ obj-$(CONFIG_IR_LIRC_CODEC) += ir-lirc-codec.o
|
||||
obj-$(CONFIG_IR_IMON) += imon.o
|
||||
obj-$(CONFIG_IR_ITE_CIR) += ite-cir.o
|
||||
obj-$(CONFIG_IR_MCEUSB) += mceusb.o
|
||||
obj-$(CONFIG_IR_FINTEK) += fintek-cir.o
|
||||
obj-$(CONFIG_IR_NUVOTON) += nuvoton-cir.o
|
||||
obj-$(CONFIG_IR_ENE) += ene_ir.o
|
||||
obj-$(CONFIG_IR_REDRAT3) += redrat3.o
|
||||
|
||||
684
drivers/media/rc/fintek-cir.c
Normal file
684
drivers/media/rc/fintek-cir.c
Normal file
File diff suppressed because it is too large
Load Diff
243
drivers/media/rc/fintek-cir.h
Normal file
243
drivers/media/rc/fintek-cir.h
Normal file
@@ -0,0 +1,243 @@
|
||||
/*
|
||||
* Driver for Feature Integration Technology Inc. (aka Fintek) LPC CIR
|
||||
*
|
||||
* Copyright (C) 2011 Jarod Wilson <jarod@redhat.com>
|
||||
*
|
||||
* Special thanks to Fintek for providing hardware and spec sheets.
|
||||
* This driver is based upon the nuvoton, ite and ene drivers for
|
||||
* similar hardware.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
|
||||
* USA
|
||||
*/
|
||||
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/ioctl.h>
|
||||
|
||||
/* platform driver name to register */
|
||||
#define FINTEK_DRIVER_NAME "fintek-cir"
|
||||
#define FINTEK_DESCRIPTION "Fintek LPC SuperIO Consumer IR Transceiver"
|
||||
#define VENDOR_ID_FINTEK 0x1934
|
||||
|
||||
|
||||
/* debugging module parameter */
|
||||
static int debug;
|
||||
|
||||
#define fit_pr(level, text, ...) \
|
||||
printk(level KBUILD_MODNAME ": " text, ## __VA_ARGS__)
|
||||
|
||||
#define fit_dbg(text, ...) \
|
||||
if (debug) \
|
||||
printk(KERN_DEBUG \
|
||||
KBUILD_MODNAME ": " text "\n" , ## __VA_ARGS__)
|
||||
|
||||
#define fit_dbg_verbose(text, ...) \
|
||||
if (debug > 1) \
|
||||
printk(KERN_DEBUG \
|
||||
KBUILD_MODNAME ": " text "\n" , ## __VA_ARGS__)
|
||||
|
||||
#define fit_dbg_wake(text, ...) \
|
||||
if (debug > 2) \
|
||||
printk(KERN_DEBUG \
|
||||
KBUILD_MODNAME ": " text "\n" , ## __VA_ARGS__)
|
||||
|
||||
|
||||
#define TX_BUF_LEN 256
|
||||
#define RX_BUF_LEN 32
|
||||
|
||||
struct fintek_dev {
|
||||
struct pnp_dev *pdev;
|
||||
struct rc_dev *rdev;
|
||||
|
||||
spinlock_t fintek_lock;
|
||||
|
||||
/* for rx */
|
||||
u8 buf[RX_BUF_LEN];
|
||||
unsigned int pkts;
|
||||
|
||||
struct {
|
||||
spinlock_t lock;
|
||||
u8 buf[TX_BUF_LEN];
|
||||
unsigned int buf_count;
|
||||
unsigned int cur_buf_num;
|
||||
wait_queue_head_t queue;
|
||||
} tx;
|
||||
|
||||
/* Config register index/data port pair */
|
||||
u8 cr_ip;
|
||||
u8 cr_dp;
|
||||
|
||||
/* hardware I/O settings */
|
||||
unsigned long cir_addr;
|
||||
int cir_irq;
|
||||
int cir_port_len;
|
||||
|
||||
/* hardware id */
|
||||
u8 chip_major;
|
||||
u8 chip_minor;
|
||||
u16 chip_vendor;
|
||||
|
||||
/* hardware features */
|
||||
bool hw_learning_capable;
|
||||
bool hw_tx_capable;
|
||||
|
||||
/* rx settings */
|
||||
bool learning_enabled;
|
||||
bool carrier_detect_enabled;
|
||||
|
||||
enum {
|
||||
CMD_HEADER = 0,
|
||||
SUBCMD,
|
||||
CMD_DATA,
|
||||
PARSE_IRDATA,
|
||||
} parser_state;
|
||||
|
||||
u8 cmd, rem;
|
||||
|
||||
/* carrier period = 1 / frequency */
|
||||
u32 carrier;
|
||||
};
|
||||
|
||||
/* buffer packet constants, largely identical to mceusb.c */
|
||||
#define BUF_PULSE_BIT 0x80
|
||||
#define BUF_LEN_MASK 0x1f
|
||||
#define BUF_SAMPLE_MASK 0x7f
|
||||
|
||||
#define BUF_COMMAND_HEADER 0x9f
|
||||
#define BUF_COMMAND_MASK 0xe0
|
||||
#define BUF_COMMAND_NULL 0x00
|
||||
#define BUF_HW_CMD_HEADER 0xff
|
||||
#define BUF_CMD_G_REVISION 0x0b
|
||||
#define BUF_CMD_S_CARRIER 0x06
|
||||
#define BUF_CMD_S_TIMEOUT 0x0c
|
||||
#define BUF_CMD_SIG_END 0x01
|
||||
#define BUF_CMD_S_TXMASK 0x08
|
||||
#define BUF_CMD_S_RXSENSOR 0x14
|
||||
#define BUF_RSP_PULSE_COUNT 0x15
|
||||
|
||||
#define CIR_SAMPLE_PERIOD 50
|
||||
|
||||
/*
|
||||
* Configuration Register:
|
||||
* Index Port
|
||||
* Data Port
|
||||
*/
|
||||
#define CR_INDEX_PORT 0x2e
|
||||
#define CR_DATA_PORT 0x2f
|
||||
|
||||
/* Possible alternate values, depends on how the chip is wired */
|
||||
#define CR_INDEX_PORT2 0x4e
|
||||
#define CR_DATA_PORT2 0x4f
|
||||
|
||||
/*
|
||||
* GCR_CONFIG_PORT_SEL bit 4 specifies which Index Port value is
|
||||
* active. 1 = 0x4e, 0 = 0x2e
|
||||
*/
|
||||
#define PORT_SEL_PORT_4E_EN 0x10
|
||||
|
||||
/* Extended Function Mode enable/disable magic values */
|
||||
#define CONFIG_REG_ENABLE 0x87
|
||||
#define CONFIG_REG_DISABLE 0xaa
|
||||
|
||||
/* Chip IDs found in CR_CHIP_ID_{HI,LO} */
|
||||
#define CHIP_ID_HIGH_F71809U 0x04
|
||||
#define CHIP_ID_LOW_F71809U 0x08
|
||||
|
||||
/*
|
||||
* Global control regs we need to care about:
|
||||
* Global Control def.
|
||||
* Register name addr val. */
|
||||
#define GCR_SOFTWARE_RESET 0x02 /* 0x00 */
|
||||
#define GCR_LOGICAL_DEV_NO 0x07 /* 0x00 */
|
||||
#define GCR_CHIP_ID_HI 0x20 /* 0x04 */
|
||||
#define GCR_CHIP_ID_LO 0x21 /* 0x08 */
|
||||
#define GCR_VENDOR_ID_HI 0x23 /* 0x19 */
|
||||
#define GCR_VENDOR_ID_LO 0x24 /* 0x34 */
|
||||
#define GCR_CONFIG_PORT_SEL 0x25 /* 0x01 */
|
||||
#define GCR_KBMOUSE_WAKEUP 0x27
|
||||
|
||||
#define LOGICAL_DEV_DISABLE 0x00
|
||||
#define LOGICAL_DEV_ENABLE 0x01
|
||||
|
||||
/* Logical device number of the CIR function */
|
||||
#define LOGICAL_DEV_CIR 0x05
|
||||
|
||||
/* CIR Logical Device (LDN 0x08) config registers */
|
||||
#define CIR_CR_COMMAND_INDEX 0x04
|
||||
#define CIR_CR_IRCS 0x05 /* Before host writes command to IR, host
|
||||
must set to 1. When host finshes write
|
||||
command to IR, host must clear to 0. */
|
||||
#define CIR_CR_COMMAND_DATA 0x06 /* Host read or write comand data */
|
||||
#define CIR_CR_CLASS 0x07 /* 0xff = rx-only, 0x66 = rx + 2 tx,
|
||||
0x33 = rx + 1 tx */
|
||||
#define CIR_CR_DEV_EN 0x30 /* bit0 = 1 enables CIR */
|
||||
#define CIR_CR_BASE_ADDR_HI 0x60 /* MSB of CIR IO base addr */
|
||||
#define CIR_CR_BASE_ADDR_LO 0x61 /* LSB of CIR IO base addr */
|
||||
#define CIR_CR_IRQ_SEL 0x70 /* bits3-0 store CIR IRQ */
|
||||
#define CIR_CR_PSOUT_STATUS 0xf1
|
||||
#define CIR_CR_WAKE_KEY3_ADDR 0xf8
|
||||
#define CIR_CR_WAKE_KEY3_CODE 0xf9
|
||||
#define CIR_CR_WAKE_KEY3_DC 0xfa
|
||||
#define CIR_CR_WAKE_CONTROL 0xfb
|
||||
#define CIR_CR_WAKE_KEY12_ADDR 0xfc
|
||||
#define CIR_CR_WAKE_KEY4_ADDR 0xfd
|
||||
#define CIR_CR_WAKE_KEY5_ADDR 0xfe
|
||||
|
||||
#define CLASS_RX_ONLY 0xff
|
||||
#define CLASS_RX_2TX 0x66
|
||||
#define CLASS_RX_1TX 0x33
|
||||
|
||||
/* CIR device registers */
|
||||
#define CIR_STATUS 0x00
|
||||
#define CIR_RX_DATA 0x01
|
||||
#define CIR_TX_CONTROL 0x02
|
||||
#define CIR_TX_DATA 0x03
|
||||
#define CIR_CONTROL 0x04
|
||||
|
||||
/* Bits to enable CIR wake */
|
||||
#define LOGICAL_DEV_ACPI 0x01
|
||||
#define LDEV_ACPI_WAKE_EN_REG 0xe8
|
||||
#define ACPI_WAKE_EN_CIR_BIT 0x04
|
||||
|
||||
#define LDEV_ACPI_PME_EN_REG 0xf0
|
||||
#define LDEV_ACPI_PME_CLR_REG 0xf1
|
||||
#define ACPI_PME_CIR_BIT 0x02
|
||||
|
||||
#define LDEV_ACPI_STATE_REG 0xf4
|
||||
#define ACPI_STATE_CIR_BIT 0x20
|
||||
|
||||
/*
|
||||
* CIR status register (0x00):
|
||||
* 7 - CIR_IRQ_EN (1 = enable CIR IRQ, 0 = disable)
|
||||
* 3 - TX_FINISH (1 when TX finished, write 1 to clear)
|
||||
* 2 - TX_UNDERRUN (1 on TX underrun, write 1 to clear)
|
||||
* 1 - RX_TIMEOUT (1 on RX timeout, write 1 to clear)
|
||||
* 0 - RX_RECEIVE (1 on RX receive, write 1 to clear)
|
||||
*/
|
||||
#define CIR_STATUS_IRQ_EN 0x80
|
||||
#define CIR_STATUS_TX_FINISH 0x08
|
||||
#define CIR_STATUS_TX_UNDERRUN 0x04
|
||||
#define CIR_STATUS_RX_TIMEOUT 0x02
|
||||
#define CIR_STATUS_RX_RECEIVE 0x01
|
||||
#define CIR_STATUS_IRQ_MASK 0x0f
|
||||
|
||||
/*
|
||||
* CIR TX control register (0x02):
|
||||
* 7 - TX_START (1 to indicate TX start, auto-cleared when done)
|
||||
* 6 - TX_END (1 to indicate TX data written to TX fifo)
|
||||
*/
|
||||
#define CIR_TX_CONTROL_TX_START 0x80
|
||||
#define CIR_TX_CONTROL_TX_END 0x40
|
||||
|
||||
@@ -14,81 +14,81 @@
|
||||
|
||||
static struct rc_map_table lme2510_rc[] = {
|
||||
/* Type 1 - 26 buttons */
|
||||
{ 0xef12ba45, KEY_0 },
|
||||
{ 0xef12a05f, KEY_1 },
|
||||
{ 0xef12af50, KEY_2 },
|
||||
{ 0xef12a25d, KEY_3 },
|
||||
{ 0xef12be41, KEY_4 },
|
||||
{ 0xef12f50a, KEY_5 },
|
||||
{ 0xef12bd42, KEY_6 },
|
||||
{ 0xef12b847, KEY_7 },
|
||||
{ 0xef12b649, KEY_8 },
|
||||
{ 0xef12fa05, KEY_9 },
|
||||
{ 0xef12bc43, KEY_POWER },
|
||||
{ 0xef12b946, KEY_SUBTITLE },
|
||||
{ 0xef12f906, KEY_PAUSE },
|
||||
{ 0xef12fc03, KEY_MEDIA_REPEAT},
|
||||
{ 0xef12fd02, KEY_PAUSE },
|
||||
{ 0xef12a15e, KEY_VOLUMEUP },
|
||||
{ 0xef12a35c, KEY_VOLUMEDOWN },
|
||||
{ 0xef12f609, KEY_CHANNELUP },
|
||||
{ 0xef12e51a, KEY_CHANNELDOWN },
|
||||
{ 0xef12e11e, KEY_PLAY },
|
||||
{ 0xef12e41b, KEY_ZOOM },
|
||||
{ 0xef12a659, KEY_MUTE },
|
||||
{ 0xef12a55a, KEY_TV },
|
||||
{ 0xef12e718, KEY_RECORD },
|
||||
{ 0xef12f807, KEY_EPG },
|
||||
{ 0xef12fe01, KEY_STOP },
|
||||
{ 0x10ed45, KEY_0 },
|
||||
{ 0x10ed5f, KEY_1 },
|
||||
{ 0x10ed50, KEY_2 },
|
||||
{ 0x10ed5d, KEY_3 },
|
||||
{ 0x10ed41, KEY_4 },
|
||||
{ 0x10ed0a, KEY_5 },
|
||||
{ 0x10ed42, KEY_6 },
|
||||
{ 0x10ed47, KEY_7 },
|
||||
{ 0x10ed49, KEY_8 },
|
||||
{ 0x10ed05, KEY_9 },
|
||||
{ 0x10ed43, KEY_POWER },
|
||||
{ 0x10ed46, KEY_SUBTITLE },
|
||||
{ 0x10ed06, KEY_PAUSE },
|
||||
{ 0x10ed03, KEY_MEDIA_REPEAT},
|
||||
{ 0x10ed02, KEY_PAUSE },
|
||||
{ 0x10ed5e, KEY_VOLUMEUP },
|
||||
{ 0x10ed5c, KEY_VOLUMEDOWN },
|
||||
{ 0x10ed09, KEY_CHANNELUP },
|
||||
{ 0x10ed1a, KEY_CHANNELDOWN },
|
||||
{ 0x10ed1e, KEY_PLAY },
|
||||
{ 0x10ed1b, KEY_ZOOM },
|
||||
{ 0x10ed59, KEY_MUTE },
|
||||
{ 0x10ed5a, KEY_TV },
|
||||
{ 0x10ed18, KEY_RECORD },
|
||||
{ 0x10ed07, KEY_EPG },
|
||||
{ 0x10ed01, KEY_STOP },
|
||||
/* Type 2 - 20 buttons */
|
||||
{ 0xff40ea15, KEY_0 },
|
||||
{ 0xff40f708, KEY_1 },
|
||||
{ 0xff40f609, KEY_2 },
|
||||
{ 0xff40f50a, KEY_3 },
|
||||
{ 0xff40f30c, KEY_4 },
|
||||
{ 0xff40f20d, KEY_5 },
|
||||
{ 0xff40f10e, KEY_6 },
|
||||
{ 0xff40ef10, KEY_7 },
|
||||
{ 0xff40ee11, KEY_8 },
|
||||
{ 0xff40ed12, KEY_9 },
|
||||
{ 0xff40ff00, KEY_POWER },
|
||||
{ 0xff40fb04, KEY_MEDIA_REPEAT}, /* Recall */
|
||||
{ 0xff40e51a, KEY_PAUSE }, /* Timeshift */
|
||||
{ 0xff40fd02, KEY_VOLUMEUP }, /* 2 x -/+ Keys not marked */
|
||||
{ 0xff40f906, KEY_VOLUMEDOWN }, /* Volume defined as right hand*/
|
||||
{ 0xff40fe01, KEY_CHANNELUP },
|
||||
{ 0xff40fa05, KEY_CHANNELDOWN },
|
||||
{ 0xff40eb14, KEY_ZOOM },
|
||||
{ 0xff40e718, KEY_RECORD },
|
||||
{ 0xff40e916, KEY_STOP },
|
||||
{ 0xbf15, KEY_0 },
|
||||
{ 0xbf08, KEY_1 },
|
||||
{ 0xbf09, KEY_2 },
|
||||
{ 0xbf0a, KEY_3 },
|
||||
{ 0xbf0c, KEY_4 },
|
||||
{ 0xbf0d, KEY_5 },
|
||||
{ 0xbf0e, KEY_6 },
|
||||
{ 0xbf10, KEY_7 },
|
||||
{ 0xbf11, KEY_8 },
|
||||
{ 0xbf12, KEY_9 },
|
||||
{ 0xbf00, KEY_POWER },
|
||||
{ 0xbf04, KEY_MEDIA_REPEAT}, /* Recall */
|
||||
{ 0xbf1a, KEY_PAUSE }, /* Timeshift */
|
||||
{ 0xbf02, KEY_VOLUMEUP }, /* 2 x -/+ Keys not marked */
|
||||
{ 0xbf06, KEY_VOLUMEDOWN }, /* Volume defined as right hand*/
|
||||
{ 0xbf01, KEY_CHANNELUP },
|
||||
{ 0xbf05, KEY_CHANNELDOWN },
|
||||
{ 0xbf14, KEY_ZOOM },
|
||||
{ 0xbf18, KEY_RECORD },
|
||||
{ 0xbf16, KEY_STOP },
|
||||
/* Type 3 - 20 buttons */
|
||||
{ 0xff00e31c, KEY_0 },
|
||||
{ 0xff00f807, KEY_1 },
|
||||
{ 0xff00ea15, KEY_2 },
|
||||
{ 0xff00f609, KEY_3 },
|
||||
{ 0xff00e916, KEY_4 },
|
||||
{ 0xff00e619, KEY_5 },
|
||||
{ 0xff00f20d, KEY_6 },
|
||||
{ 0xff00f30c, KEY_7 },
|
||||
{ 0xff00e718, KEY_8 },
|
||||
{ 0xff00a15e, KEY_9 },
|
||||
{ 0xff00ba45, KEY_POWER },
|
||||
{ 0xff00bb44, KEY_MEDIA_REPEAT}, /* Recall */
|
||||
{ 0xff00b54a, KEY_PAUSE }, /* Timeshift */
|
||||
{ 0xff00b847, KEY_VOLUMEUP }, /* 2 x -/+ Keys not marked */
|
||||
{ 0xff00bc43, KEY_VOLUMEDOWN }, /* Volume defined as right hand*/
|
||||
{ 0xff00b946, KEY_CHANNELUP },
|
||||
{ 0xff00bf40, KEY_CHANNELDOWN },
|
||||
{ 0xff00f708, KEY_ZOOM },
|
||||
{ 0xff00bd42, KEY_RECORD },
|
||||
{ 0xff00a55a, KEY_STOP },
|
||||
{ 0x1c, KEY_0 },
|
||||
{ 0x07, KEY_1 },
|
||||
{ 0x15, KEY_2 },
|
||||
{ 0x09, KEY_3 },
|
||||
{ 0x16, KEY_4 },
|
||||
{ 0x19, KEY_5 },
|
||||
{ 0x0d, KEY_6 },
|
||||
{ 0x0c, KEY_7 },
|
||||
{ 0x18, KEY_8 },
|
||||
{ 0x5e, KEY_9 },
|
||||
{ 0x45, KEY_POWER },
|
||||
{ 0x44, KEY_MEDIA_REPEAT}, /* Recall */
|
||||
{ 0x4a, KEY_PAUSE }, /* Timeshift */
|
||||
{ 0x47, KEY_VOLUMEUP }, /* 2 x -/+ Keys not marked */
|
||||
{ 0x43, KEY_VOLUMEDOWN }, /* Volume defined as right hand*/
|
||||
{ 0x46, KEY_CHANNELUP },
|
||||
{ 0x40, KEY_CHANNELDOWN },
|
||||
{ 0x08, KEY_ZOOM },
|
||||
{ 0x42, KEY_RECORD },
|
||||
{ 0x5a, KEY_STOP },
|
||||
};
|
||||
|
||||
static struct rc_map_list lme2510_map = {
|
||||
.map = {
|
||||
.scan = lme2510_rc,
|
||||
.size = ARRAY_SIZE(lme2510_rc),
|
||||
.rc_type = RC_TYPE_UNKNOWN,
|
||||
.rc_type = RC_TYPE_NEC,
|
||||
.name = RC_MAP_LME2510,
|
||||
}
|
||||
};
|
||||
|
||||
@@ -687,7 +687,7 @@ config VIDEO_HEXIUM_GEMINI
|
||||
|
||||
config VIDEO_TIMBERDALE
|
||||
tristate "Support for timberdale Video In/LogiWIN"
|
||||
depends on VIDEO_V4L2 && I2C
|
||||
depends on VIDEO_V4L2 && I2C && DMADEVICES
|
||||
select DMA_ENGINE
|
||||
select TIMB_DMA
|
||||
select VIDEO_ADV7180
|
||||
@@ -757,6 +757,8 @@ config VIDEO_NOON010PC30
|
||||
---help---
|
||||
This driver supports NOON010PC30 CIF camera from Siliconfile
|
||||
|
||||
source "drivers/media/video/m5mols/Kconfig"
|
||||
|
||||
config VIDEO_OMAP3
|
||||
tristate "OMAP 3 Camera support (EXPERIMENTAL)"
|
||||
select OMAP_IOMMU
|
||||
@@ -952,7 +954,7 @@ config VIDEO_SAMSUNG_S5P_FIMC
|
||||
|
||||
config VIDEO_S5P_MIPI_CSIS
|
||||
tristate "Samsung S5P and EXYNOS4 MIPI CSI receiver driver"
|
||||
depends on VIDEO_V4L2 && PM_RUNTIME && VIDEO_V4L2_SUBDEV_API
|
||||
depends on VIDEO_V4L2 && PM_RUNTIME && PLAT_S5P && VIDEO_V4L2_SUBDEV_API
|
||||
---help---
|
||||
This is a v4l2 driver for Samsung S5P/EXYNOS4 MIPI-CSI receiver.
|
||||
|
||||
|
||||
@@ -69,6 +69,7 @@ obj-$(CONFIG_VIDEO_MT9V011) += mt9v011.o
|
||||
obj-$(CONFIG_VIDEO_MT9V032) += mt9v032.o
|
||||
obj-$(CONFIG_VIDEO_SR030PC30) += sr030pc30.o
|
||||
obj-$(CONFIG_VIDEO_NOON010PC30) += noon010pc30.o
|
||||
obj-$(CONFIG_VIDEO_M5MOLS) += m5mols/
|
||||
|
||||
obj-$(CONFIG_SOC_CAMERA_IMX074) += imx074.o
|
||||
obj-$(CONFIG_SOC_CAMERA_MT9M001) += mt9m001.o
|
||||
|
||||
@@ -438,7 +438,7 @@ static int cpia2_querycap(struct file *file, void *fh, struct v4l2_capability *v
|
||||
strcat(vc->card, " (676/");
|
||||
break;
|
||||
default:
|
||||
strcat(vc->card, " (???/");
|
||||
strcat(vc->card, " (XXX/");
|
||||
break;
|
||||
}
|
||||
switch (cam->params.version.sensor_flags) {
|
||||
@@ -458,7 +458,7 @@ static int cpia2_querycap(struct file *file, void *fh, struct v4l2_capability *v
|
||||
strcat(vc->card, "500)");
|
||||
break;
|
||||
default:
|
||||
strcat(vc->card, "???)");
|
||||
strcat(vc->card, "XXX)");
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
@@ -34,7 +34,7 @@ MODULE_AUTHOR("Antonio Ospite <ospite@studenti.unina.it>");
|
||||
MODULE_DESCRIPTION("GSPCA/Kinect Sensor Device USB Camera Driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
#ifdef DEBUG
|
||||
#ifdef GSPCA_DEBUG
|
||||
int gspca_debug = D_ERR | D_PROBE | D_CONF | D_STREAM | D_FRAM | D_PACK |
|
||||
D_USBI | D_USBO | D_V4L2;
|
||||
#endif
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user