diff options
Diffstat (limited to 'drivers/crypto/nx/nx-842-platform.c')
| -rw-r--r-- | drivers/crypto/nx/nx-842-platform.c | 84 | 
1 files changed, 84 insertions, 0 deletions
diff --git a/drivers/crypto/nx/nx-842-platform.c b/drivers/crypto/nx/nx-842-platform.c new file mode 100644 index 000000000000..664f13dd06ed --- /dev/null +++ b/drivers/crypto/nx/nx-842-platform.c @@ -0,0 +1,84 @@ + +#include "nx-842.h" + +/* this is needed, separate from the main nx-842.c driver, because that main + * driver loads the platform drivers during its init(), and it expects one + * (or none) of the platform drivers to set this pointer to its driver. + * That means this pointer can't be in the main nx-842 driver, because it + * wouldn't be accessible until after the main driver loaded, which wouldn't + * be possible as it's waiting for the platform driver to load.  So place it + * here. + */ +static struct nx842_driver *driver; +static DEFINE_SPINLOCK(driver_lock); + +struct nx842_driver *nx842_platform_driver(void) +{ +	return driver; +} +EXPORT_SYMBOL_GPL(nx842_platform_driver); + +bool nx842_platform_driver_set(struct nx842_driver *_driver) +{ +	bool ret = false; + +	spin_lock(&driver_lock); + +	if (!driver) { +		driver = _driver; +		ret = true; +	} else +		WARN(1, "can't set platform driver, already set to %s\n", +		     driver->name); + +	spin_unlock(&driver_lock); +	return ret; +} +EXPORT_SYMBOL_GPL(nx842_platform_driver_set); + +/* only call this from the platform driver exit function */ +void nx842_platform_driver_unset(struct nx842_driver *_driver) +{ +	spin_lock(&driver_lock); + +	if (driver == _driver) +		driver = NULL; +	else if (driver) +		WARN(1, "can't unset platform driver %s, currently set to %s\n", +		     _driver->name, driver->name); +	else +		WARN(1, "can't unset platform driver, already unset\n"); + +	spin_unlock(&driver_lock); +} +EXPORT_SYMBOL_GPL(nx842_platform_driver_unset); + +bool nx842_platform_driver_get(void) +{ +	bool ret = false; + +	spin_lock(&driver_lock); + +	if (driver) +		ret = try_module_get(driver->owner); + +	spin_unlock(&driver_lock); + +	return ret; +} +EXPORT_SYMBOL_GPL(nx842_platform_driver_get); + +void nx842_platform_driver_put(void) +{ +	spin_lock(&driver_lock); + +	if (driver) +		module_put(driver->owner); + +	spin_unlock(&driver_lock); +} +EXPORT_SYMBOL_GPL(nx842_platform_driver_put); + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Dan Streetman <[email protected]>"); +MODULE_DESCRIPTION("842 H/W Compression platform driver");  |