Commit 92f4fc10 authored by Mauro Carvalho Chehab's avatar Mauro Carvalho Chehab

V4L/DVB: cx88: Only start IR if the input device is opened

Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 716aab44
...@@ -40,6 +40,10 @@ struct cx88_IR { ...@@ -40,6 +40,10 @@ struct cx88_IR {
struct cx88_core *core; struct cx88_core *core;
struct input_dev *input; struct input_dev *input;
struct ir_input_state ir; struct ir_input_state ir;
struct ir_dev_props props;
int users;
char name[32]; char name[32];
char phys[32]; char phys[32];
...@@ -161,8 +165,16 @@ static enum hrtimer_restart cx88_ir_work(struct hrtimer *timer) ...@@ -161,8 +165,16 @@ static enum hrtimer_restart cx88_ir_work(struct hrtimer *timer)
return HRTIMER_RESTART; return HRTIMER_RESTART;
} }
void cx88_ir_start(struct cx88_core *core, struct cx88_IR *ir) static int __cx88_ir_start(void *priv)
{ {
struct cx88_core *core = priv;
struct cx88_IR *ir;
if (!core || !core->ir)
return -EINVAL;
ir = core->ir;
if (ir->polling) { if (ir->polling) {
hrtimer_init(&ir->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); hrtimer_init(&ir->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
ir->timer.function = cx88_ir_work; ir->timer.function = cx88_ir_work;
...@@ -175,10 +187,18 @@ void cx88_ir_start(struct cx88_core *core, struct cx88_IR *ir) ...@@ -175,10 +187,18 @@ void cx88_ir_start(struct cx88_core *core, struct cx88_IR *ir)
cx_write(MO_DDS_IO, 0xa80a80); /* 4 kHz sample rate */ cx_write(MO_DDS_IO, 0xa80a80); /* 4 kHz sample rate */
cx_write(MO_DDSCFG_IO, 0x5); /* enable */ cx_write(MO_DDSCFG_IO, 0x5); /* enable */
} }
return 0;
} }
void cx88_ir_stop(struct cx88_core *core, struct cx88_IR *ir) static void __cx88_ir_stop(void *priv)
{ {
struct cx88_core *core = priv;
struct cx88_IR *ir;
if (!core || !core->ir)
return;
ir = core->ir;
if (ir->sampling) { if (ir->sampling) {
cx_write(MO_DDSCFG_IO, 0x0); cx_write(MO_DDSCFG_IO, 0x0);
core->pci_irqmask &= ~PCI_INT_IR_SMPINT; core->pci_irqmask &= ~PCI_INT_IR_SMPINT;
...@@ -188,6 +208,37 @@ void cx88_ir_stop(struct cx88_core *core, struct cx88_IR *ir) ...@@ -188,6 +208,37 @@ void cx88_ir_stop(struct cx88_core *core, struct cx88_IR *ir)
hrtimer_cancel(&ir->timer); hrtimer_cancel(&ir->timer);
} }
int cx88_ir_start(struct cx88_core *core)
{
if (core->ir->users)
return __cx88_ir_start(core);
return 0;
}
void cx88_ir_stop(struct cx88_core *core)
{
if (core->ir->users)
__cx88_ir_stop(core);
}
static int cx88_ir_open(void *priv)
{
struct cx88_core *core = priv;
core->ir->users++;
return __cx88_ir_start(core);
}
static void cx88_ir_close(void *priv)
{
struct cx88_core *core = priv;
core->ir->users--;
if (!core->ir->users)
__cx88_ir_stop(core);
}
/* ---------------------------------------------------------------------- */ /* ---------------------------------------------------------------------- */
int cx88_ir_init(struct cx88_core *core, struct pci_dev *pci) int cx88_ir_init(struct cx88_core *core, struct pci_dev *pci)
...@@ -383,19 +434,19 @@ int cx88_ir_init(struct cx88_core *core, struct pci_dev *pci) ...@@ -383,19 +434,19 @@ int cx88_ir_init(struct cx88_core *core, struct pci_dev *pci)
ir->core = core; ir->core = core;
core->ir = ir; core->ir = ir;
cx88_ir_start(core, ir); ir->props.priv = core;
ir->props.open = cx88_ir_open;
ir->props.close = cx88_ir_close;
/* all done */ /* all done */
err = ir_input_register(ir->input, ir_codes, NULL, MODULE_NAME); err = ir_input_register(ir->input, ir_codes, &ir->props, MODULE_NAME);
if (err) if (err)
goto err_out_stop; goto err_out_free;
return 0; return 0;
err_out_stop:
cx88_ir_stop(core, ir);
core->ir = NULL;
err_out_free: err_out_free:
core->ir = NULL;
kfree(ir); kfree(ir);
return err; return err;
} }
...@@ -408,7 +459,7 @@ int cx88_ir_fini(struct cx88_core *core) ...@@ -408,7 +459,7 @@ int cx88_ir_fini(struct cx88_core *core)
if (NULL == ir) if (NULL == ir)
return 0; return 0;
cx88_ir_stop(core, ir); cx88_ir_stop(core);
ir_input_unregister(ir->input); ir_input_unregister(ir->input);
kfree(ir); kfree(ir);
......
...@@ -1977,7 +1977,7 @@ static void __devexit cx8800_finidev(struct pci_dev *pci_dev) ...@@ -1977,7 +1977,7 @@ static void __devexit cx8800_finidev(struct pci_dev *pci_dev)
} }
if (core->ir) if (core->ir)
cx88_ir_stop(core, core->ir); cx88_ir_stop(core);
cx88_shutdown(core); /* FIXME */ cx88_shutdown(core); /* FIXME */
pci_disable_device(pci_dev); pci_disable_device(pci_dev);
...@@ -2015,7 +2015,7 @@ static int cx8800_suspend(struct pci_dev *pci_dev, pm_message_t state) ...@@ -2015,7 +2015,7 @@ static int cx8800_suspend(struct pci_dev *pci_dev, pm_message_t state)
spin_unlock(&dev->slock); spin_unlock(&dev->slock);
if (core->ir) if (core->ir)
cx88_ir_stop(core, core->ir); cx88_ir_stop(core);
/* FIXME -- shutdown device */ /* FIXME -- shutdown device */
cx88_shutdown(core); cx88_shutdown(core);
...@@ -2056,7 +2056,7 @@ static int cx8800_resume(struct pci_dev *pci_dev) ...@@ -2056,7 +2056,7 @@ static int cx8800_resume(struct pci_dev *pci_dev)
/* FIXME: re-initialize hardware */ /* FIXME: re-initialize hardware */
cx88_reset(core); cx88_reset(core);
if (core->ir) if (core->ir)
cx88_ir_start(core, core->ir); cx88_ir_start(core);
cx_set(MO_PCI_INTMSK, core->pci_irqmask); cx_set(MO_PCI_INTMSK, core->pci_irqmask);
......
...@@ -41,7 +41,7 @@ ...@@ -41,7 +41,7 @@
#include <linux/version.h> #include <linux/version.h>
#include <linux/mutex.h> #include <linux/mutex.h>
#define CX88_VERSION_CODE KERNEL_VERSION(0,0,7) #define CX88_VERSION_CODE KERNEL_VERSION(0, 0, 8)
#define UNSET (-1U) #define UNSET (-1U)
...@@ -683,8 +683,8 @@ s32 cx88_dsp_detect_stereo_sap(struct cx88_core *core); ...@@ -683,8 +683,8 @@ s32 cx88_dsp_detect_stereo_sap(struct cx88_core *core);
int cx88_ir_init(struct cx88_core *core, struct pci_dev *pci); int cx88_ir_init(struct cx88_core *core, struct pci_dev *pci);
int cx88_ir_fini(struct cx88_core *core); int cx88_ir_fini(struct cx88_core *core);
void cx88_ir_irq(struct cx88_core *core); void cx88_ir_irq(struct cx88_core *core);
void cx88_ir_start(struct cx88_core *core, struct cx88_IR *ir); int cx88_ir_start(struct cx88_core *core);
void cx88_ir_stop(struct cx88_core *core, struct cx88_IR *ir); void cx88_ir_stop(struct cx88_core *core);
/* ----------------------------------------------------------- */ /* ----------------------------------------------------------- */
/* cx88-mpeg.c */ /* cx88-mpeg.c */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment