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