10508ad1fSJeremy Kerr /* 20508ad1fSJeremy Kerr * FSI core driver 30508ad1fSJeremy Kerr * 40508ad1fSJeremy Kerr * Copyright (C) IBM Corporation 2016 50508ad1fSJeremy Kerr * 60508ad1fSJeremy Kerr * This program is free software; you can redistribute it and/or modify 70508ad1fSJeremy Kerr * it under the terms of the GNU General Public License version 2 as 80508ad1fSJeremy Kerr * published by the Free Software Foundation. 90508ad1fSJeremy Kerr * 100508ad1fSJeremy Kerr * This program is distributed in the hope that it will be useful, 110508ad1fSJeremy Kerr * but WITHOUT ANY WARRANTY; without even the implied warranty of 120508ad1fSJeremy Kerr * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 130508ad1fSJeremy Kerr * GNU General Public License for more details. 140508ad1fSJeremy Kerr */ 150508ad1fSJeremy Kerr 160508ad1fSJeremy Kerr #include <linux/device.h> 170508ad1fSJeremy Kerr #include <linux/fsi.h> 180508ad1fSJeremy Kerr #include <linux/module.h> 190508ad1fSJeremy Kerr 200508ad1fSJeremy Kerr /* FSI core & Linux bus type definitions */ 210508ad1fSJeremy Kerr 22dd37eed7SJeremy Kerr static int fsi_bus_match(struct device *dev, struct device_driver *drv) 23dd37eed7SJeremy Kerr { 24dd37eed7SJeremy Kerr struct fsi_device *fsi_dev = to_fsi_dev(dev); 25dd37eed7SJeremy Kerr struct fsi_driver *fsi_drv = to_fsi_drv(drv); 26dd37eed7SJeremy Kerr const struct fsi_device_id *id; 27dd37eed7SJeremy Kerr 28dd37eed7SJeremy Kerr if (!fsi_drv->id_table) 29dd37eed7SJeremy Kerr return 0; 30dd37eed7SJeremy Kerr 31dd37eed7SJeremy Kerr for (id = fsi_drv->id_table; id->engine_type; id++) { 32dd37eed7SJeremy Kerr if (id->engine_type != fsi_dev->engine_type) 33dd37eed7SJeremy Kerr continue; 34dd37eed7SJeremy Kerr if (id->version == FSI_VERSION_ANY || 35dd37eed7SJeremy Kerr id->version == fsi_dev->version) 36dd37eed7SJeremy Kerr return 1; 37dd37eed7SJeremy Kerr } 38dd37eed7SJeremy Kerr 39dd37eed7SJeremy Kerr return 0; 40dd37eed7SJeremy Kerr } 41dd37eed7SJeremy Kerr 420508ad1fSJeremy Kerr struct bus_type fsi_bus_type = { 430508ad1fSJeremy Kerr .name = "fsi", 44dd37eed7SJeremy Kerr .match = fsi_bus_match, 450508ad1fSJeremy Kerr }; 460508ad1fSJeremy Kerr EXPORT_SYMBOL_GPL(fsi_bus_type); 470508ad1fSJeremy Kerr 480508ad1fSJeremy Kerr static int fsi_init(void) 490508ad1fSJeremy Kerr { 500508ad1fSJeremy Kerr return bus_register(&fsi_bus_type); 510508ad1fSJeremy Kerr } 520508ad1fSJeremy Kerr 530508ad1fSJeremy Kerr static void fsi_exit(void) 540508ad1fSJeremy Kerr { 550508ad1fSJeremy Kerr bus_unregister(&fsi_bus_type); 560508ad1fSJeremy Kerr } 570508ad1fSJeremy Kerr 580508ad1fSJeremy Kerr module_init(fsi_init); 590508ad1fSJeremy Kerr module_exit(fsi_exit); 60