static int intel_qep_probe()

in intel-qep.c [392:443]


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;

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

	ret = pcim_enable_device(pci);
	if (ret)
		return ret;

	pci_set_master(pci);

	ret = pcim_iomap_regions(pci, BIT(0), pci_name(pci));
	if (ret)
		return ret;

	regs = pcim_iomap_table(pci)[0];
	if (!regs)
		return -ENOMEM;

	qep->dev = dev;
	qep->regs = regs;
	mutex_init(&qep->lock);

	intel_qep_init(qep);
	pci_set_drvdata(pci, 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);

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

	return 0;
}