static void dc_kbd_callback(struct mapleq *mq)
 {
        struct maple_device *mapledev = mq->dev;
-       struct dc_kbd *kbd = mapledev->private_data;
+       struct dc_kbd *kbd = maple_get_drvdata(mapledev);
        unsigned long *buf = mq->recvbuf;
 
        /*
                goto fail;
        }
 
-       mdev->private_data = kbd;
-
        kbd->dev = idev;
        memcpy(kbd->keycode, dc_kbd_keycode, sizeof(kbd->keycode));
 
                MAPLE_FUNC_KEYBOARD);
 
        mdev->driver = mdrv;
+
+       maple_set_drvdata(mdev, kbd);
+
        return error;
 
 fail:
        input_free_device(idev);
        kfree(kbd);
-       mdev->private_data = NULL;
+       maple_set_drvdata(mdev, NULL);
        return error;
 }
 
 static int remove_maple_kbd(struct device *dev)
 {
        struct maple_device *mdev = to_maple_dev(dev);
-       struct dc_kbd *kbd;
+       struct dc_kbd *kbd = maple_get_drvdata(mdev);
 
        mutex_lock(&maple_keyb_mutex);
 
-       kbd = mdev->private_data;
-       mdev->private_data = NULL;
        input_unregister_device(kbd->dev);
        kfree(kbd);
 
+       maple_set_drvdata(mdev, NULL);
+
        mutex_unlock(&maple_keyb_mutex);
        return 0;
 }
 
 {
        driver_unregister(&drv->drv);
 }
+EXPORT_SYMBOL_GPL(maple_driver_unregister);
 
 /* set hardware registers to enable next round of dma */
 static void maplebus_dma_reset(void)
 
 struct maple_device {
        struct maple_driver *driver;
        struct mapleq *mq;
-       void *private_data;
        void (*callback) (struct mapleq * mq);
        unsigned long when, interval, function;
        struct maple_devinfo devinfo;
 #define to_maple_dev(n) container_of(n, struct maple_device, dev)
 #define to_maple_driver(n) container_of(n, struct maple_driver, drv)
 
+#define maple_get_drvdata(d)           dev_get_drvdata(&(d)->dev)
+#define maple_set_drvdata(d,p)         dev_set_drvdata(&(d)->dev, (p))
+
 #endif                         /* __LINUX_MAPLE_H */