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: Grant Likely <grant.likely@secretlab.ca>
This commit is contained in:
@@ -998,8 +998,10 @@ static const struct net_device_ops fs_enet_netdev_ops = {
|
||||
#endif
|
||||
};
|
||||
|
||||
static struct of_device_id fs_enet_match[];
|
||||
static int __devinit fs_enet_probe(struct platform_device *ofdev)
|
||||
{
|
||||
const struct of_device_id *match;
|
||||
struct net_device *ndev;
|
||||
struct fs_enet_private *fep;
|
||||
struct fs_platform_info *fpi;
|
||||
@@ -1007,14 +1009,15 @@ static int __devinit fs_enet_probe(struct platform_device *ofdev)
|
||||
const u8 *mac_addr;
|
||||
int privsize, len, ret = -ENODEV;
|
||||
|
||||
if (!ofdev->dev.of_match)
|
||||
match = of_match_device(fs_enet_match, &ofdev->dev);
|
||||
if (!match)
|
||||
return -EINVAL;
|
||||
|
||||
fpi = kzalloc(sizeof(*fpi), GFP_KERNEL);
|
||||
if (!fpi)
|
||||
return -ENOMEM;
|
||||
|
||||
if (!IS_FEC(ofdev->dev.of_match)) {
|
||||
if (!IS_FEC(match)) {
|
||||
data = of_get_property(ofdev->dev.of_node, "fsl,cpm-command", &len);
|
||||
if (!data || len != 4)
|
||||
goto out_free_fpi;
|
||||
@@ -1049,7 +1052,7 @@ static int __devinit fs_enet_probe(struct platform_device *ofdev)
|
||||
fep->dev = &ofdev->dev;
|
||||
fep->ndev = ndev;
|
||||
fep->fpi = fpi;
|
||||
fep->ops = ofdev->dev.of_match->data;
|
||||
fep->ops = match->data;
|
||||
|
||||
ret = fep->ops->setup_data(ndev);
|
||||
if (ret)
|
||||
|
@@ -101,17 +101,20 @@ static int fs_enet_fec_mii_reset(struct mii_bus *bus)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct of_device_id fs_enet_mdio_fec_match[];
|
||||
static int __devinit fs_enet_mdio_probe(struct platform_device *ofdev)
|
||||
{
|
||||
const struct of_device_id *match;
|
||||
struct resource res;
|
||||
struct mii_bus *new_bus;
|
||||
struct fec_info *fec;
|
||||
int (*get_bus_freq)(struct device_node *);
|
||||
int ret = -ENOMEM, clock, speed;
|
||||
|
||||
if (!ofdev->dev.of_match)
|
||||
match = of_match_device(fs_enet_mdio_fec_match, &ofdev->dev);
|
||||
if (!match)
|
||||
return -EINVAL;
|
||||
get_bus_freq = ofdev->dev.of_match->data;
|
||||
get_bus_freq = match->data;
|
||||
|
||||
new_bus = mdiobus_alloc();
|
||||
if (!new_bus)
|
||||
|
Reference in New Issue
Block a user