blob: 20600bfc80c9f1a325af75e0c4812f5809b9117e [file] [log] [blame]
/* Copyright (c) 2010-2013, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
* only version 2 as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
#define pr_fmt(fmt) "AXI: %s(): " fmt, __func__
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/slab.h>
#include <linux/mutex.h>
#include <linux/radix-tree.h>
#include <linux/clk.h>
#include <mach/msm_bus_board.h>
#include <mach/msm_bus.h>
#include "msm_bus_core.h"
static atomic_t num_fab = ATOMIC_INIT(0);
int msm_bus_get_num_fab(void)
{
return atomic_read(&num_fab);
}
int msm_bus_device_match(struct device *dev, void* id)
{
struct msm_bus_fabric_device *fabdev = to_msm_bus_fabric_device(dev);
if (!fabdev) {
MSM_BUS_WARN("Fabric %p returning 0\n", fabdev);
return 0;
}
return (fabdev->id == (int)id);
}
struct bus_type msm_bus_type = {
.name = "msm-bus-type",
};
EXPORT_SYMBOL(msm_bus_type);
/**
* msm_bus_get_fabric_device() - This function is used to search for
* the fabric device on the bus
* @fabid: Fabric id
* Function returns: Pointer to the fabric device
*/
struct msm_bus_fabric_device *msm_bus_get_fabric_device(int fabid)
{
struct device *dev;
struct msm_bus_fabric_device *fabric;
dev = bus_find_device(&msm_bus_type, NULL, (void *)fabid,
msm_bus_device_match);
if (!dev)
return NULL;
fabric = to_msm_bus_fabric_device(dev);
return fabric;
}
/**
* msm_bus_fabric_device_register() - Registers a fabric on msm bus
* @fabdev: Fabric device to be registered
*/
int msm_bus_fabric_device_register(struct msm_bus_fabric_device *fabdev)
{
int ret = 0;
fabdev->dev.bus = &msm_bus_type;
ret = dev_set_name(&fabdev->dev, fabdev->name);
if (ret) {
MSM_BUS_ERR("error setting dev name\n");
goto err;
}
ret = device_register(&fabdev->dev);
if (ret < 0) {
MSM_BUS_ERR("error registering device%d %s\n",
ret, fabdev->name);
goto err;
}
atomic_inc(&num_fab);
err:
return ret;
}
/**
* msm_bus_fabric_device_unregister() - Unregisters the fabric
* devices from the msm bus
*/
void msm_bus_fabric_device_unregister(struct msm_bus_fabric_device *fabdev)
{
device_unregister(&fabdev->dev);
atomic_dec(&num_fab);
}
static void __exit msm_bus_exit(void)
{
bus_unregister(&msm_bus_type);
}
static int __init msm_bus_init(void)
{
int retval = 0;
retval = bus_register(&msm_bus_type);
if (retval)
MSM_BUS_ERR("bus_register error! %d\n",
retval);
return retval;
}
postcore_initcall(msm_bus_init);
module_exit(msm_bus_exit);
MODULE_LICENSE("GPL v2");
MODULE_VERSION("0.2");
MODULE_ALIAS("platform:msm_bus");