Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b1608d69 authored by Grant Likely's avatar Grant Likely
Browse files

drivercore: revert addition of of_match to struct device



Commit b826291c, "drivercore/dt: add a match table pointer to struct
device" added an of_match pointer to struct device to cache the
of_match_table entry discovered at driver match time.  This was unsafe
because matching is not an atomic operation with probing a driver.  If
two or more drivers are attempted to be matched to a driver at the
same time, then the cached matching entry pointer could get
overwritten.

This patch reverts the of_match cache pointer and reworks all users to
call of_match_device() directly instead.

Signed-off-by: default avatarGrant Likely <grant.likely@secretlab.ca>
parent 01294d82
Loading
Loading
Loading
Loading
+5 −2
Original line number Diff line number Diff line
@@ -318,17 +318,20 @@ static const struct platform_suspend_ops mpc83xx_suspend_ops = {
	.end = mpc83xx_suspend_end,
};

static struct of_device_id pmc_match[];
static int pmc_probe(struct platform_device *ofdev)
{
	const struct of_device_id *match;
	struct device_node *np = ofdev->dev.of_node;
	struct resource res;
	struct pmc_type *type;
	int ret = 0;

	if (!ofdev->dev.of_match)
	match = of_match_device(pmc_match, &ofdev->dev);
	if (!match)
		return -EINVAL;

	type = ofdev->dev.of_match->data;
	type = match->data;

	if (!of_device_is_available(np))
		return -ENODEV;
+5 −2
Original line number Diff line number Diff line
@@ -304,8 +304,10 @@ static int __devinit fsl_msi_setup_hwirq(struct fsl_msi *msi,
	return 0;
}

static const struct of_device_id fsl_of_msi_ids[];
static int __devinit fsl_of_msi_probe(struct platform_device *dev)
{
	const struct of_device_id *match;
	struct fsl_msi *msi;
	struct resource res;
	int err, i, j, irq_index, count;
@@ -316,9 +318,10 @@ static int __devinit fsl_of_msi_probe(struct platform_device *dev)
	u32 offset;
	static const u32 all_avail[] = { 0, NR_MSI_IRQS };

	if (!dev->dev.of_match)
	match = of_match_device(fsl_of_msi_ids, &dev->dev);
	if (!match)
		return -EINVAL;
	features = dev->dev.of_match->data;
	features = match->data;

	printk(KERN_DEBUG "Setting up Freescale MSI support\n");

+4 −1
Original line number Diff line number Diff line
@@ -452,8 +452,10 @@ static void __devinit sabre_pbm_init(struct pci_pbm_info *pbm,
	sabre_scan_bus(pbm, &op->dev);
}

static const struct of_device_id sabre_match[];
static int __devinit sabre_probe(struct platform_device *op)
{
	const struct of_device_id *match;
	const struct linux_prom64_registers *pr_regs;
	struct device_node *dp = op->dev.of_node;
	struct pci_pbm_info *pbm;
@@ -463,7 +465,8 @@ static int __devinit sabre_probe(struct platform_device *op)
	const u32 *vdma;
	u64 clear_irq;

	hummingbird_p = op->dev.of_match && (op->dev.of_match->data != NULL);
	match = of_match_device(sabre_match, &op->dev);
	hummingbird_p = match && (match->data != NULL);
	if (!hummingbird_p) {
		struct device_node *cpu_dp;

+6 −2
Original line number Diff line number Diff line
@@ -1458,11 +1458,15 @@ static int __devinit __schizo_init(struct platform_device *op, unsigned long chi
	return err;
}

static const struct of_device_id schizo_match[];
static int __devinit schizo_probe(struct platform_device *op)
{
	if (!op->dev.of_match)
	const struct of_device_id *match;

	match = of_match_device(schizo_match, &op->dev);
	if (!match)
		return -EINVAL;
	return __schizo_init(op, (unsigned long) op->dev.of_match->data);
	return __schizo_init(op, (unsigned long)match->data);
}

/* The ordering of this table is very important.  Some Tomatillo
+5 −2
Original line number Diff line number Diff line
@@ -2643,16 +2643,19 @@ fore200e_init(struct fore200e* fore200e, struct device *parent)
}

#ifdef CONFIG_SBUS
static const struct of_device_id fore200e_sba_match[];
static int __devinit fore200e_sba_probe(struct platform_device *op)
{
	const struct of_device_id *match;
	const struct fore200e_bus *bus;
	struct fore200e *fore200e;
	static int index = 0;
	int err;

	if (!op->dev.of_match)
	match = of_match_device(fore200e_sba_match, &op->dev);
	if (!match)
		return -EINVAL;
	bus = op->dev.of_match->data;
	bus = match->data;

	fore200e = kzalloc(sizeof(struct fore200e), GFP_KERNEL);
	if (!fore200e)
Loading