|
@@ -376,3 +376,61 @@ static int neponset_remove(struct platform_device *dev)
|
|
if (!IS_ERR(d->sa1111))
|
|
if (!IS_ERR(d->sa1111))
|
|
platform_device_unregister(d->sa1111);
|
|
platform_device_unregister(d->sa1111);
|
|
if (!IS_ERR(d->smc91x))
|
|
if (!IS_ERR(d->smc91x))
|
|
|
|
+ platform_device_unregister(d->smc91x);
|
|
|
|
+ irq_set_chained_handler(irq, NULL);
|
|
|
|
+ irq_free_descs(d->irq_base, NEP_IRQ_NR);
|
|
|
|
+ nep_base = NULL;
|
|
|
|
+ iounmap(d->base);
|
|
|
|
+ kfree(d);
|
|
|
|
+
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+#ifdef CONFIG_PM_SLEEP
|
|
|
|
+static int neponset_suspend(struct device *dev)
|
|
|
|
+{
|
|
|
|
+ struct neponset_drvdata *d = dev_get_drvdata(dev);
|
|
|
|
+
|
|
|
|
+ d->ncr0 = readb_relaxed(d->base + NCR_0);
|
|
|
|
+ d->mdm_ctl_0 = readb_relaxed(d->base + MDM_CTL_0);
|
|
|
|
+
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static int neponset_resume(struct device *dev)
|
|
|
|
+{
|
|
|
|
+ struct neponset_drvdata *d = dev_get_drvdata(dev);
|
|
|
|
+
|
|
|
|
+ writeb_relaxed(d->ncr0, d->base + NCR_0);
|
|
|
|
+ writeb_relaxed(d->mdm_ctl_0, d->base + MDM_CTL_0);
|
|
|
|
+
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static const struct dev_pm_ops neponset_pm_ops = {
|
|
|
|
+ .suspend_noirq = neponset_suspend,
|
|
|
|
+ .resume_noirq = neponset_resume,
|
|
|
|
+ .freeze_noirq = neponset_suspend,
|
|
|
|
+ .restore_noirq = neponset_resume,
|
|
|
|
+};
|
|
|
|
+#define PM_OPS &neponset_pm_ops
|
|
|
|
+#else
|
|
|
|
+#define PM_OPS NULL
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
+static struct platform_driver neponset_device_driver = {
|
|
|
|
+ .probe = neponset_probe,
|
|
|
|
+ .remove = neponset_remove,
|
|
|
|
+ .driver = {
|
|
|
|
+ .name = "neponset",
|
|
|
|
+ .owner = THIS_MODULE,
|
|
|
|
+ .pm = PM_OPS,
|
|
|
|
+ },
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+static int __init neponset_init(void)
|
|
|
|
+{
|
|
|
|
+ return platform_driver_register(&neponset_device_driver);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+subsys_initcall(neponset_init);
|