Commit e99dec87 authored by Uwe Kleine-König's avatar Uwe Kleine-König Committed by Greg Kroah-Hartman
Browse files

counter: intel-qep: Convert to new counter registration



This fixes device lifetime issues where it was possible to free a live
struct device.

Fixes: b711f687 ("counter: Add support for Intel Quadrature Encoder Peripheral")
Tested-by: default avatarJarkko Nikula <jarkko.nikula@linux.intel.com>
Reviewed-by: default avatarJonathan Cameron <Jonathan.Cameron@huawei.com>
Acked-by: default avatarWilliam Breathitt Gray <vilhelm.gray@gmail.com>
Acked-by: default avatarJarkko Nikula <jarkko.nikula@linux.intel.com>
Signed-off-by: default avatarUwe Kleine-König <u.kleine-koenig@pengutronix.de>
Link: https://lore.kernel.org/r/20211230150300.72196-18-u.kleine-koenig@pengutronix.de


Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent aefc7e17
Loading
Loading
Loading
Loading
+16 −12
Original line number Diff line number Diff line
@@ -63,7 +63,6 @@
#define INTEL_QEP_CLK_PERIOD_NS		10

struct intel_qep {
	struct counter_device counter;
	struct mutex lock;
	struct device *dev;
	void __iomem *regs;
@@ -392,14 +391,16 @@ static struct counter_count intel_qep_counter_count[] = {

static int intel_qep_probe(struct pci_dev *pci, const struct pci_device_id *id)
{
	struct counter_device *counter;
	struct intel_qep *qep;
	struct device *dev = &pci->dev;
	void __iomem *regs;
	int ret;

	qep = devm_kzalloc(dev, sizeof(*qep), GFP_KERNEL);
	if (!qep)
	counter = devm_counter_alloc(dev, sizeof(*qep));
	if (!counter)
		return -ENOMEM;
	qep = counter_priv(counter);

	ret = pcim_enable_device(pci);
	if (ret)
@@ -422,20 +423,23 @@ static int intel_qep_probe(struct pci_dev *pci, const struct pci_device_id *id)
	intel_qep_init(qep);
	pci_set_drvdata(pci, qep);

	qep->counter.name = pci_name(pci);
	qep->counter.parent = dev;
	qep->counter.ops = &intel_qep_counter_ops;
	qep->counter.counts = intel_qep_counter_count;
	qep->counter.num_counts = ARRAY_SIZE(intel_qep_counter_count);
	qep->counter.signals = intel_qep_signals;
	qep->counter.num_signals = ARRAY_SIZE(intel_qep_signals);
	qep->counter.priv = qep;
	counter->name = pci_name(pci);
	counter->parent = dev;
	counter->ops = &intel_qep_counter_ops;
	counter->counts = intel_qep_counter_count;
	counter->num_counts = ARRAY_SIZE(intel_qep_counter_count);
	counter->signals = intel_qep_signals;
	counter->num_signals = ARRAY_SIZE(intel_qep_signals);
	qep->enabled = false;

	pm_runtime_put(dev);
	pm_runtime_allow(dev);

	return devm_counter_register(&pci->dev, &qep->counter);
	ret = devm_counter_add(&pci->dev, counter);
	if (ret < 0)
		return dev_err_probe(&pci->dev, ret, "Failed to add counter\n");

	return 0;
}

static void intel_qep_remove(struct pci_dev *pci)