驱动中remove和shutdown根本的区别在于调用的时机不同,我们以platform驱动为例,如下:
static struct platform_driver s3cmci_driver = {
.driver = {},
.remove = __devexit_p(s3cmci_remove),
.shutdown = s3cmci_shutdown,
};
static int __init s3cmci_init(void)
{
return platform_driver_register(&s3cmci_driver);
}
int platform_driver_register(struct platform_driver *drv)
{
if (drv->remove)
drv->driver.remove = platform_drv_remove;
if (drv->shutdown)
drv->driver.shutdown = platform_drv_shutdown;
return driver_register(&drv->driver);
}
14、15行,drv->remove是
一个特定
(具体)platform驱动的remove回调,比如这里的s3cmci_remove函数。drv->driver.remove是platform框架提供的,所有platform驱动通用。那么,一个特定驱动的remove函数如何得到调用?答案在platform_drv_remove函数中:
static int platform_drv_remove(struct device *_dev)
{
struct platform_driver *drv = to_platform_driver(_dev->driver);
struct platform_device *dev = to_platform_device(_dev);
return drv->remove(dev);
}