11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  linux/arch/arm/mach-integrator/lm.c
31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *  Copyright (C) 2003 Deep Blue Solutions Ltd, All Rights Reserved.
51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This program is free software; you can redistribute it and/or modify
71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * it under the terms of the GNU General Public License version 2 as
81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * published by the Free Software Foundation.
91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/module.h>
111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/init.h>
121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/device.h>
134e57b6817880946a3a78d5d8cad1ace363f7e449Tim Schmielau#include <linux/slab.h>
141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
15c36928adfc24398f8fe49cf498389500c14a5550Linus Walleij#include "lm.h"
161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define to_lm_device(d)	container_of(d, struct lm_device, dev)
181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define to_lm_driver(d)	container_of(d, struct lm_driver, drv)
191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int lm_match(struct device *dev, struct device_driver *drv)
211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 1;
231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int lm_bus_probe(struct device *dev)
261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct lm_device *lmdev = to_lm_device(dev);
281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct lm_driver *lmdrv = to_lm_driver(dev->driver);
291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return lmdrv->probe(lmdev);
311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int lm_bus_remove(struct device *dev)
341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct lm_device *lmdev = to_lm_device(dev);
361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct lm_driver *lmdrv = to_lm_driver(dev->driver);
371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
385c0784c350516856ed15deb6adf6b053bf427792Russell King	if (lmdrv->remove)
395c0784c350516856ed15deb6adf6b053bf427792Russell King		lmdrv->remove(lmdev);
401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 0;
411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
435c0784c350516856ed15deb6adf6b053bf427792Russell Kingstatic struct bus_type lm_bustype = {
445c0784c350516856ed15deb6adf6b053bf427792Russell King	.name		= "logicmodule",
455c0784c350516856ed15deb6adf6b053bf427792Russell King	.match		= lm_match,
465c0784c350516856ed15deb6adf6b053bf427792Russell King	.probe		= lm_bus_probe,
475c0784c350516856ed15deb6adf6b053bf427792Russell King	.remove		= lm_bus_remove,
485c0784c350516856ed15deb6adf6b053bf427792Russell King//	.suspend	= lm_bus_suspend,
495c0784c350516856ed15deb6adf6b053bf427792Russell King//	.resume		= lm_bus_resume,
505c0784c350516856ed15deb6adf6b053bf427792Russell King};
515c0784c350516856ed15deb6adf6b053bf427792Russell King
525c0784c350516856ed15deb6adf6b053bf427792Russell Kingstatic int __init lm_init(void)
535c0784c350516856ed15deb6adf6b053bf427792Russell King{
545c0784c350516856ed15deb6adf6b053bf427792Russell King	return bus_register(&lm_bustype);
555c0784c350516856ed15deb6adf6b053bf427792Russell King}
565c0784c350516856ed15deb6adf6b053bf427792Russell King
575c0784c350516856ed15deb6adf6b053bf427792Russell Kingpostcore_initcall(lm_init);
585c0784c350516856ed15deb6adf6b053bf427792Russell King
591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint lm_driver_register(struct lm_driver *drv)
601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	drv->drv.bus = &lm_bustype;
621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return driver_register(&drv->drv);
631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid lm_driver_unregister(struct lm_driver *drv)
661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	driver_unregister(&drv->drv);
681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic void lm_device_release(struct device *dev)
711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct lm_device *d = to_lm_device(dev);
731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	kfree(d);
751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsint lm_device_register(struct lm_device *dev)
781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	int ret;
801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	dev->dev.release = lm_device_release;
821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	dev->dev.bus = &lm_bustype;
831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
843f9787046ea37a26170dc4439efa21f8d23a9978Kay Sievers	ret = dev_set_name(&dev->dev, "lm%d", dev->id);
853f9787046ea37a26170dc4439efa21f8d23a9978Kay Sievers	if (ret)
863f9787046ea37a26170dc4439efa21f8d23a9978Kay Sievers		return ret;
873f9787046ea37a26170dc4439efa21f8d23a9978Kay Sievers	dev->resource.name = dev_name(&dev->dev);
881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ret = request_resource(&iomem_resource, &dev->resource);
901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (ret == 0) {
911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ret = device_register(&dev->dev);
921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		if (ret)
931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			release_resource(&dev->resource);
941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return ret;
961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(lm_driver_register);
991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus TorvaldsEXPORT_SYMBOL(lm_driver_unregister);
100