1
0
Fork 0

imx-drm: ipu-v3: fix potential CRTC device registration race

Clean up the IPUv3 CRTC device registration; we don't need a separate
function just to call platform_device_register_data(), and we don't
need the return value converted at all.

Update the IPU client id under a mutex, so that parallel probing
doesn't race.

Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Acked-by: Sascha Hauer <s.hauer@pengutronix.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
hifive-unleashed-5.1
Russell King 2013-12-16 11:34:25 +00:00 committed by Greg Kroah-Hartman
parent 8007875f06
commit 4ae078d58a
1 changed files with 16 additions and 16 deletions

View File

@ -996,35 +996,35 @@ static const struct ipu_platform_reg client_reg[] = {
},
};
static DEFINE_MUTEX(ipu_client_id_mutex);
static int ipu_client_id;
static int ipu_add_subdevice_pdata(struct device *dev,
const struct ipu_platform_reg *reg)
{
struct platform_device *pdev;
pdev = platform_device_register_data(dev, reg->name, ipu_client_id++,
&reg->pdata, sizeof(struct ipu_platform_reg));
return PTR_ERR_OR_ZERO(pdev);
}
static int ipu_add_client_devices(struct ipu_soc *ipu)
{
int ret;
int i;
struct device *dev = ipu->dev;
unsigned i;
int id, ret;
mutex_lock(&ipu_client_id_mutex);
id = ipu_client_id;
ipu_client_id += ARRAY_SIZE(client_reg);
mutex_unlock(&ipu_client_id_mutex);
for (i = 0; i < ARRAY_SIZE(client_reg); i++) {
const struct ipu_platform_reg *reg = &client_reg[i];
ret = ipu_add_subdevice_pdata(ipu->dev, reg);
if (ret)
struct platform_device *pdev;
pdev = platform_device_register_data(dev, reg->name,
id++, &reg->pdata, sizeof(reg->pdata));
if (IS_ERR(pdev))
goto err_register;
}
return 0;
err_register:
platform_device_unregister_children(to_platform_device(ipu->dev));
platform_device_unregister_children(to_platform_device(dev));
return ret;
}