mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-06 10:57:46 +00:00
V4L/DVB (8395): saa7134: Fix Kbuild dependency of ir-kbd-i2c
Currently, saa7134 is dependent of ir-kbd-i2c, since it uses a symbol that is defined there. However, as this symbol is used only on saa7134, there's no sense on keeping it defined there (or on ir-commons). So, let's move it to saa7134 and remove one symbol for being exported. Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
This commit is contained in:
parent
4db16db4f6
commit
1c22dad8ab
3 changed files with 78 additions and 85 deletions
|
@ -194,88 +194,6 @@ static int get_key_knc1(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Common (grey or coloured) pinnacle PCTV remote handling
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
static int get_key_pinnacle(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw,
|
|
||||||
int parity_offset, int marker, int code_modulo)
|
|
||||||
{
|
|
||||||
unsigned char b[4];
|
|
||||||
unsigned int start = 0,parity = 0,code = 0;
|
|
||||||
|
|
||||||
/* poll IR chip */
|
|
||||||
if (4 != i2c_master_recv(&ir->c,b,4)) {
|
|
||||||
dprintk(2,"read error\n");
|
|
||||||
return -EIO;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (start = 0; start < ARRAY_SIZE(b); start++) {
|
|
||||||
if (b[start] == marker) {
|
|
||||||
code=b[(start+parity_offset+1)%4];
|
|
||||||
parity=b[(start+parity_offset)%4];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Empty Request */
|
|
||||||
if (parity==0)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
/* Repeating... */
|
|
||||||
if (ir->old == parity)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
ir->old = parity;
|
|
||||||
|
|
||||||
/* drop special codes when a key is held down a long time for the grey controller
|
|
||||||
In this case, the second bit of the code is asserted */
|
|
||||||
if (marker == 0xfe && (code & 0x40))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
code %= code_modulo;
|
|
||||||
|
|
||||||
*ir_raw = code;
|
|
||||||
*ir_key = code;
|
|
||||||
|
|
||||||
dprintk(1,"Pinnacle PCTV key %02x\n", code);
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* The grey pinnacle PCTV remote
|
|
||||||
*
|
|
||||||
* There are one issue with this remote:
|
|
||||||
* - I2c packet does not change when the same key is pressed quickly. The workaround
|
|
||||||
* is to hold down each key for about half a second, so that another code is generated
|
|
||||||
* in the i2c packet, and the function can distinguish key presses.
|
|
||||||
*
|
|
||||||
* Sylvain Pasche <sylvain.pasche@gmail.com>
|
|
||||||
*/
|
|
||||||
int get_key_pinnacle_grey(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw)
|
|
||||||
{
|
|
||||||
|
|
||||||
return get_key_pinnacle(ir, ir_key, ir_raw, 1, 0xfe, 0xff);
|
|
||||||
}
|
|
||||||
|
|
||||||
EXPORT_SYMBOL_GPL(get_key_pinnacle_grey);
|
|
||||||
|
|
||||||
|
|
||||||
/* The new pinnacle PCTV remote (with the colored buttons)
|
|
||||||
*
|
|
||||||
* Ricardo Cerqueira <v4l@cerqueira.org>
|
|
||||||
*/
|
|
||||||
int get_key_pinnacle_color(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw)
|
|
||||||
{
|
|
||||||
/* code_modulo parameter (0x88) is used to reduce code value to fit inside IR_KEYTAB_SIZE
|
|
||||||
*
|
|
||||||
* this is the only value that results in 42 unique
|
|
||||||
* codes < 128
|
|
||||||
*/
|
|
||||||
|
|
||||||
return get_key_pinnacle(ir, ir_key, ir_raw, 2, 0x80, 0x88);
|
|
||||||
}
|
|
||||||
|
|
||||||
EXPORT_SYMBOL_GPL(get_key_pinnacle_color);
|
|
||||||
|
|
||||||
/* ----------------------------------------------------------------------- */
|
/* ----------------------------------------------------------------------- */
|
||||||
|
|
||||||
static void ir_key_poll(struct IR_i2c *ir)
|
static void ir_key_poll(struct IR_i2c *ir)
|
||||||
|
|
|
@ -198,6 +198,84 @@ static int get_key_beholdm6xx(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Common (grey or coloured) pinnacle PCTV remote handling
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
static int get_key_pinnacle(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw,
|
||||||
|
int parity_offset, int marker, int code_modulo)
|
||||||
|
{
|
||||||
|
unsigned char b[4];
|
||||||
|
unsigned int start = 0,parity = 0,code = 0;
|
||||||
|
|
||||||
|
/* poll IR chip */
|
||||||
|
if (4 != i2c_master_recv(&ir->c, b, 4)) {
|
||||||
|
i2cdprintk("read error\n");
|
||||||
|
return -EIO;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (start = 0; start < ARRAY_SIZE(b); start++) {
|
||||||
|
if (b[start] == marker) {
|
||||||
|
code=b[(start+parity_offset + 1) % 4];
|
||||||
|
parity=b[(start+parity_offset) % 4];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Empty Request */
|
||||||
|
if (parity == 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
/* Repeating... */
|
||||||
|
if (ir->old == parity)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
ir->old = parity;
|
||||||
|
|
||||||
|
/* drop special codes when a key is held down a long time for the grey controller
|
||||||
|
In this case, the second bit of the code is asserted */
|
||||||
|
if (marker == 0xfe && (code & 0x40))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
code %= code_modulo;
|
||||||
|
|
||||||
|
*ir_raw = code;
|
||||||
|
*ir_key = code;
|
||||||
|
|
||||||
|
i2cdprintk("Pinnacle PCTV key %02x\n", code);
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* The grey pinnacle PCTV remote
|
||||||
|
*
|
||||||
|
* There are one issue with this remote:
|
||||||
|
* - I2c packet does not change when the same key is pressed quickly. The workaround
|
||||||
|
* is to hold down each key for about half a second, so that another code is generated
|
||||||
|
* in the i2c packet, and the function can distinguish key presses.
|
||||||
|
*
|
||||||
|
* Sylvain Pasche <sylvain.pasche@gmail.com>
|
||||||
|
*/
|
||||||
|
static int get_key_pinnacle_grey(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw)
|
||||||
|
{
|
||||||
|
|
||||||
|
return get_key_pinnacle(ir, ir_key, ir_raw, 1, 0xfe, 0xff);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* The new pinnacle PCTV remote (with the colored buttons)
|
||||||
|
*
|
||||||
|
* Ricardo Cerqueira <v4l@cerqueira.org>
|
||||||
|
*/
|
||||||
|
static int get_key_pinnacle_color(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw)
|
||||||
|
{
|
||||||
|
/* code_modulo parameter (0x88) is used to reduce code value to fit inside IR_KEYTAB_SIZE
|
||||||
|
*
|
||||||
|
* this is the only value that results in 42 unique
|
||||||
|
* codes < 128
|
||||||
|
*/
|
||||||
|
|
||||||
|
return get_key_pinnacle(ir, ir_key, ir_raw, 2, 0x80, 0x88);
|
||||||
|
}
|
||||||
|
|
||||||
void saa7134_input_irq(struct saa7134_dev *dev)
|
void saa7134_input_irq(struct saa7134_dev *dev)
|
||||||
{
|
{
|
||||||
struct card_ir *ir = dev->remote;
|
struct card_ir *ir = dev->remote;
|
||||||
|
|
|
@ -19,7 +19,4 @@ struct IR_i2c {
|
||||||
char phys[32];
|
char phys[32];
|
||||||
int (*get_key)(struct IR_i2c*, u32*, u32*);
|
int (*get_key)(struct IR_i2c*, u32*, u32*);
|
||||||
};
|
};
|
||||||
|
|
||||||
int get_key_pinnacle_grey(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw);
|
|
||||||
int get_key_pinnacle_color(struct IR_i2c *ir, u32 *ir_key, u32 *ir_raw);
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue