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

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

parent 716aab44
Loading
Loading
Loading
Loading
+60 −9
Original line number Diff line number Diff line
@@ -40,6 +40,10 @@ struct cx88_IR {
	struct cx88_core *core;
	struct input_dev *input;
	struct ir_input_state ir;
	struct ir_dev_props props;

	int users;

	char name[32];
	char phys[32];

@@ -161,8 +165,16 @@ static enum hrtimer_restart cx88_ir_work(struct hrtimer *timer)
	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) {
		hrtimer_init(&ir->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
		ir->timer.function = cx88_ir_work;
@@ -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_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) {
		cx_write(MO_DDSCFG_IO, 0x0);
		core->pci_irqmask &= ~PCI_INT_IR_SMPINT;
@@ -188,6 +208,37 @@ void cx88_ir_stop(struct cx88_core *core, struct cx88_IR *ir)
		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)
@@ -383,19 +434,19 @@ int cx88_ir_init(struct cx88_core *core, struct pci_dev *pci)
	ir->core = core;
	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 */
	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)
		goto err_out_stop;
		goto err_out_free;

	return 0;

 err_out_stop:
	cx88_ir_stop(core, ir);
	core->ir = NULL;
 err_out_free:
	core->ir = NULL;
	kfree(ir);
	return err;
}
@@ -408,7 +459,7 @@ int cx88_ir_fini(struct cx88_core *core)
	if (NULL == ir)
		return 0;

	cx88_ir_stop(core, ir);
	cx88_ir_stop(core);
	ir_input_unregister(ir->input);
	kfree(ir);

+3 −3
Original line number Diff line number Diff line
@@ -1977,7 +1977,7 @@ static void __devexit cx8800_finidev(struct pci_dev *pci_dev)
	}

	if (core->ir)
		cx88_ir_stop(core, core->ir);
		cx88_ir_stop(core);

	cx88_shutdown(core); /* FIXME */
	pci_disable_device(pci_dev);
@@ -2015,7 +2015,7 @@ static int cx8800_suspend(struct pci_dev *pci_dev, pm_message_t state)
	spin_unlock(&dev->slock);

	if (core->ir)
		cx88_ir_stop(core, core->ir);
		cx88_ir_stop(core);
	/* FIXME -- shutdown device */
	cx88_shutdown(core);

@@ -2056,7 +2056,7 @@ static int cx8800_resume(struct pci_dev *pci_dev)
	/* FIXME: re-initialize hardware */
	cx88_reset(core);
	if (core->ir)
		cx88_ir_start(core, core->ir);
		cx88_ir_start(core);

	cx_set(MO_PCI_INTMSK, core->pci_irqmask);

+3 −3
Original line number Diff line number Diff line
@@ -41,7 +41,7 @@

#include <linux/version.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)

@@ -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_fini(struct cx88_core *core);
void cx88_ir_irq(struct cx88_core *core);
void cx88_ir_start(struct cx88_core *core, struct cx88_IR *ir);
void cx88_ir_stop(struct cx88_core *core, struct cx88_IR *ir);
int cx88_ir_start(struct cx88_core *core);
void cx88_ir_stop(struct cx88_core *core);

/* ----------------------------------------------------------- */
/* cx88-mpeg.c                                                 */