mirror of
https://github.com/joel16/android_kernel_sony_msm8994.git
synced 2024-11-29 07:01:10 +00:00
[MMC+MFD] Convert mmc to mutexes
convert mfd and mmc to mutexes Signed-off-by: Arjan van de Ven <arjan@infradead.org> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
This commit is contained in:
parent
593195f9b2
commit
a621aaed69
@ -24,13 +24,14 @@
|
|||||||
#include <linux/errno.h>
|
#include <linux/errno.h>
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
#include <linux/device.h>
|
#include <linux/device.h>
|
||||||
|
#include <linux/mutex.h>
|
||||||
|
|
||||||
#include <asm/dma.h>
|
#include <asm/dma.h>
|
||||||
#include <asm/hardware.h>
|
#include <asm/hardware.h>
|
||||||
|
|
||||||
#include "ucb1x00.h"
|
#include "ucb1x00.h"
|
||||||
|
|
||||||
static DECLARE_MUTEX(ucb1x00_sem);
|
static DEFINE_MUTEX(ucb1x00_mutex);
|
||||||
static LIST_HEAD(ucb1x00_drivers);
|
static LIST_HEAD(ucb1x00_drivers);
|
||||||
static LIST_HEAD(ucb1x00_devices);
|
static LIST_HEAD(ucb1x00_devices);
|
||||||
|
|
||||||
@ -521,12 +522,12 @@ static int ucb1x00_probe(struct mcp *mcp)
|
|||||||
goto err_irq;
|
goto err_irq;
|
||||||
|
|
||||||
INIT_LIST_HEAD(&ucb->devs);
|
INIT_LIST_HEAD(&ucb->devs);
|
||||||
down(&ucb1x00_sem);
|
mutex_lock(&ucb1x00_mutex);
|
||||||
list_add(&ucb->node, &ucb1x00_devices);
|
list_add(&ucb->node, &ucb1x00_devices);
|
||||||
list_for_each_entry(drv, &ucb1x00_drivers, node) {
|
list_for_each_entry(drv, &ucb1x00_drivers, node) {
|
||||||
ucb1x00_add_dev(ucb, drv);
|
ucb1x00_add_dev(ucb, drv);
|
||||||
}
|
}
|
||||||
up(&ucb1x00_sem);
|
mutex_unlock(&ucb1x00_mutex);
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
err_irq:
|
err_irq:
|
||||||
@ -544,13 +545,13 @@ static void ucb1x00_remove(struct mcp *mcp)
|
|||||||
struct ucb1x00 *ucb = mcp_get_drvdata(mcp);
|
struct ucb1x00 *ucb = mcp_get_drvdata(mcp);
|
||||||
struct list_head *l, *n;
|
struct list_head *l, *n;
|
||||||
|
|
||||||
down(&ucb1x00_sem);
|
mutex_lock(&ucb1x00_mutex);
|
||||||
list_del(&ucb->node);
|
list_del(&ucb->node);
|
||||||
list_for_each_safe(l, n, &ucb->devs) {
|
list_for_each_safe(l, n, &ucb->devs) {
|
||||||
struct ucb1x00_dev *dev = list_entry(l, struct ucb1x00_dev, dev_node);
|
struct ucb1x00_dev *dev = list_entry(l, struct ucb1x00_dev, dev_node);
|
||||||
ucb1x00_remove_dev(dev);
|
ucb1x00_remove_dev(dev);
|
||||||
}
|
}
|
||||||
up(&ucb1x00_sem);
|
mutex_unlock(&ucb1x00_mutex);
|
||||||
|
|
||||||
free_irq(ucb->irq, ucb);
|
free_irq(ucb->irq, ucb);
|
||||||
class_device_unregister(&ucb->cdev);
|
class_device_unregister(&ucb->cdev);
|
||||||
@ -561,12 +562,12 @@ int ucb1x00_register_driver(struct ucb1x00_driver *drv)
|
|||||||
struct ucb1x00 *ucb;
|
struct ucb1x00 *ucb;
|
||||||
|
|
||||||
INIT_LIST_HEAD(&drv->devs);
|
INIT_LIST_HEAD(&drv->devs);
|
||||||
down(&ucb1x00_sem);
|
mutex_lock(&ucb1x00_mutex);
|
||||||
list_add(&drv->node, &ucb1x00_drivers);
|
list_add(&drv->node, &ucb1x00_drivers);
|
||||||
list_for_each_entry(ucb, &ucb1x00_devices, node) {
|
list_for_each_entry(ucb, &ucb1x00_devices, node) {
|
||||||
ucb1x00_add_dev(ucb, drv);
|
ucb1x00_add_dev(ucb, drv);
|
||||||
}
|
}
|
||||||
up(&ucb1x00_sem);
|
mutex_unlock(&ucb1x00_mutex);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -574,13 +575,13 @@ void ucb1x00_unregister_driver(struct ucb1x00_driver *drv)
|
|||||||
{
|
{
|
||||||
struct list_head *n, *l;
|
struct list_head *n, *l;
|
||||||
|
|
||||||
down(&ucb1x00_sem);
|
mutex_lock(&ucb1x00_mutex);
|
||||||
list_del(&drv->node);
|
list_del(&drv->node);
|
||||||
list_for_each_safe(l, n, &drv->devs) {
|
list_for_each_safe(l, n, &drv->devs) {
|
||||||
struct ucb1x00_dev *dev = list_entry(l, struct ucb1x00_dev, drv_node);
|
struct ucb1x00_dev *dev = list_entry(l, struct ucb1x00_dev, drv_node);
|
||||||
ucb1x00_remove_dev(dev);
|
ucb1x00_remove_dev(dev);
|
||||||
}
|
}
|
||||||
up(&ucb1x00_sem);
|
mutex_unlock(&ucb1x00_mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ucb1x00_suspend(struct mcp *mcp, pm_message_t state)
|
static int ucb1x00_suspend(struct mcp *mcp, pm_message_t state)
|
||||||
@ -588,12 +589,12 @@ static int ucb1x00_suspend(struct mcp *mcp, pm_message_t state)
|
|||||||
struct ucb1x00 *ucb = mcp_get_drvdata(mcp);
|
struct ucb1x00 *ucb = mcp_get_drvdata(mcp);
|
||||||
struct ucb1x00_dev *dev;
|
struct ucb1x00_dev *dev;
|
||||||
|
|
||||||
down(&ucb1x00_sem);
|
mutex_lock(&ucb1x00_mutex);
|
||||||
list_for_each_entry(dev, &ucb->devs, dev_node) {
|
list_for_each_entry(dev, &ucb->devs, dev_node) {
|
||||||
if (dev->drv->suspend)
|
if (dev->drv->suspend)
|
||||||
dev->drv->suspend(dev, state);
|
dev->drv->suspend(dev, state);
|
||||||
}
|
}
|
||||||
up(&ucb1x00_sem);
|
mutex_unlock(&ucb1x00_mutex);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -602,12 +603,12 @@ static int ucb1x00_resume(struct mcp *mcp)
|
|||||||
struct ucb1x00 *ucb = mcp_get_drvdata(mcp);
|
struct ucb1x00 *ucb = mcp_get_drvdata(mcp);
|
||||||
struct ucb1x00_dev *dev;
|
struct ucb1x00_dev *dev;
|
||||||
|
|
||||||
down(&ucb1x00_sem);
|
mutex_lock(&ucb1x00_mutex);
|
||||||
list_for_each_entry(dev, &ucb->devs, dev_node) {
|
list_for_each_entry(dev, &ucb->devs, dev_node) {
|
||||||
if (dev->drv->resume)
|
if (dev->drv->resume)
|
||||||
dev->drv->resume(dev);
|
dev->drv->resume(dev);
|
||||||
}
|
}
|
||||||
up(&ucb1x00_sem);
|
mutex_unlock(&ucb1x00_mutex);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -28,6 +28,7 @@
|
|||||||
#include <linux/kdev_t.h>
|
#include <linux/kdev_t.h>
|
||||||
#include <linux/blkdev.h>
|
#include <linux/blkdev.h>
|
||||||
#include <linux/devfs_fs_kernel.h>
|
#include <linux/devfs_fs_kernel.h>
|
||||||
|
#include <linux/mutex.h>
|
||||||
|
|
||||||
#include <linux/mmc/card.h>
|
#include <linux/mmc/card.h>
|
||||||
#include <linux/mmc/protocol.h>
|
#include <linux/mmc/protocol.h>
|
||||||
@ -57,33 +58,33 @@ struct mmc_blk_data {
|
|||||||
unsigned int read_only;
|
unsigned int read_only;
|
||||||
};
|
};
|
||||||
|
|
||||||
static DECLARE_MUTEX(open_lock);
|
static DEFINE_MUTEX(open_lock);
|
||||||
|
|
||||||
static struct mmc_blk_data *mmc_blk_get(struct gendisk *disk)
|
static struct mmc_blk_data *mmc_blk_get(struct gendisk *disk)
|
||||||
{
|
{
|
||||||
struct mmc_blk_data *md;
|
struct mmc_blk_data *md;
|
||||||
|
|
||||||
down(&open_lock);
|
mutex_lock(&open_lock);
|
||||||
md = disk->private_data;
|
md = disk->private_data;
|
||||||
if (md && md->usage == 0)
|
if (md && md->usage == 0)
|
||||||
md = NULL;
|
md = NULL;
|
||||||
if (md)
|
if (md)
|
||||||
md->usage++;
|
md->usage++;
|
||||||
up(&open_lock);
|
mutex_unlock(&open_lock);
|
||||||
|
|
||||||
return md;
|
return md;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void mmc_blk_put(struct mmc_blk_data *md)
|
static void mmc_blk_put(struct mmc_blk_data *md)
|
||||||
{
|
{
|
||||||
down(&open_lock);
|
mutex_lock(&open_lock);
|
||||||
md->usage--;
|
md->usage--;
|
||||||
if (md->usage == 0) {
|
if (md->usage == 0) {
|
||||||
put_disk(md->disk);
|
put_disk(md->disk);
|
||||||
mmc_cleanup_queue(&md->queue);
|
mmc_cleanup_queue(&md->queue);
|
||||||
kfree(md);
|
kfree(md);
|
||||||
}
|
}
|
||||||
up(&open_lock);
|
mutex_unlock(&open_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int mmc_blk_open(struct inode *inode, struct file *filp)
|
static int mmc_blk_open(struct inode *inode, struct file *filp)
|
||||||
|
Loading…
Reference in New Issue
Block a user