Merge commit 'AU_LINUX_ANDROID_ICS.04.00.04.00.126' into msm-3.4
AU_LINUX_ANDROID_ICS.04.00.04.00.126 from msm-3.0.
First parent is from google/android-3.4.
* commit 'AU_LINUX_ANDROID_ICS.04.00.04.00.126': (8712 commits)
PRNG: Device tree entry for qrng device.
vidc:1080p: Set video core timeout value for Thumbnail mode
msm: sps: improve the debugging support in SPS driver
board-8064 msm: Overlap secure and non secure video firmware heaps.
msm: clock: Add handoff ops for 7x30 and copper XO clocks
msm_fb: display: Wait for external vsync before DTV IOMMU unmap
msm: Fix ciruclar dependency in debug UART settings
msm: gdsc: Add GDSC regulator driver for msm-copper
defconfig: Enable Mobicore Driver.
mobicore: Add mobicore driver.
mobicore: rename variable to lower case.
mobicore: rename folder.
mobicore: add makefiles
mobicore: initial import of kernel driver
ASoC: msm: Add SLIMBUS_2_RX CPU DAI
board-8064-gpio: Update FUNC for EPM SPI CS
msm_fb: display: Remove chicken bit config during video playback
mmc: msm_sdcc: enable the sanitize capability
msm-fb: display: lm2 writeback support on mpq platfroms
msm_fb: display: Disable LVDS phy & pll during panel off
...
Signed-off-by: Steve Muckle <smuckle@codeaurora.org>
diff --git a/net/bluetooth/rfcomm/tty.c b/net/bluetooth/rfcomm/tty.c
index 4bf54b3..e18781c 100644
--- a/net/bluetooth/rfcomm/tty.c
+++ b/net/bluetooth/rfcomm/tty.c
@@ -26,6 +26,7 @@
*/
#include <linux/module.h>
+#include <linux/interrupt.h>
#include <linux/tty.h>
#include <linux/tty_driver.h>
@@ -34,7 +35,6 @@
#include <linux/capability.h>
#include <linux/slab.h>
#include <linux/skbuff.h>
-#include <linux/workqueue.h>
#include <net/bluetooth/bluetooth.h>
#include <net/bluetooth/hci_core.h>
@@ -66,7 +66,7 @@
struct rfcomm_dlc *dlc;
struct tty_struct *tty;
wait_queue_head_t wait;
- struct work_struct wakeup_task;
+ struct tasklet_struct wakeup_task;
struct device *tty_dev;
@@ -76,13 +76,13 @@
};
static LIST_HEAD(rfcomm_dev_list);
-static DEFINE_SPINLOCK(rfcomm_dev_lock);
+static DEFINE_RWLOCK(rfcomm_dev_lock);
static void rfcomm_dev_data_ready(struct rfcomm_dlc *dlc, struct sk_buff *skb);
static void rfcomm_dev_state_change(struct rfcomm_dlc *dlc, int err);
static void rfcomm_dev_modem_status(struct rfcomm_dlc *dlc, u8 v24_sig);
-static void rfcomm_tty_wakeup(struct work_struct *work);
+static void rfcomm_tty_wakeup(unsigned long arg);
/* ---- Device functions ---- */
static void rfcomm_dev_destruct(struct rfcomm_dev *dev)
@@ -134,10 +134,13 @@
static struct rfcomm_dev *__rfcomm_dev_get(int id)
{
struct rfcomm_dev *dev;
+ struct list_head *p;
- list_for_each_entry(dev, &rfcomm_dev_list, list)
+ list_for_each(p, &rfcomm_dev_list) {
+ dev = list_entry(p, struct rfcomm_dev, list);
if (dev->id == id)
return dev;
+ }
return NULL;
}
@@ -146,7 +149,7 @@
{
struct rfcomm_dev *dev;
- spin_lock(&rfcomm_dev_lock);
+ read_lock(&rfcomm_dev_lock);
dev = __rfcomm_dev_get(id);
@@ -157,7 +160,7 @@
rfcomm_dev_hold(dev);
}
- spin_unlock(&rfcomm_dev_lock);
+ read_unlock(&rfcomm_dev_lock);
return dev;
}
@@ -195,8 +198,8 @@
static int rfcomm_dev_add(struct rfcomm_dev_req *req, struct rfcomm_dlc *dlc)
{
- struct rfcomm_dev *dev, *entry;
- struct list_head *head = &rfcomm_dev_list;
+ struct rfcomm_dev *dev;
+ struct list_head *head = &rfcomm_dev_list, *p;
int err = 0;
BT_DBG("id %d channel %d", req->dev_id, req->channel);
@@ -205,22 +208,24 @@
if (!dev)
return -ENOMEM;
- spin_lock(&rfcomm_dev_lock);
+ write_lock_bh(&rfcomm_dev_lock);
if (req->dev_id < 0) {
dev->id = 0;
- list_for_each_entry(entry, &rfcomm_dev_list, list) {
- if (entry->id != dev->id)
+ list_for_each(p, &rfcomm_dev_list) {
+ if (list_entry(p, struct rfcomm_dev, list)->id != dev->id)
break;
dev->id++;
- head = &entry->list;
+ head = p;
}
} else {
dev->id = req->dev_id;
- list_for_each_entry(entry, &rfcomm_dev_list, list) {
+ list_for_each(p, &rfcomm_dev_list) {
+ struct rfcomm_dev *entry = list_entry(p, struct rfcomm_dev, list);
+
if (entry->id == dev->id) {
err = -EADDRINUSE;
goto out;
@@ -229,7 +234,7 @@
if (entry->id > dev->id - 1)
break;
- head = &entry->list;
+ head = p;
}
}
@@ -253,7 +258,7 @@
atomic_set(&dev->opened, 0);
init_waitqueue_head(&dev->wait);
- INIT_WORK(&dev->wakeup_task, rfcomm_tty_wakeup);
+ tasklet_init(&dev->wakeup_task, rfcomm_tty_wakeup, (unsigned long) dev);
skb_queue_head_init(&dev->pending);
@@ -290,7 +295,7 @@
__module_get(THIS_MODULE);
out:
- spin_unlock(&rfcomm_dev_lock);
+ write_unlock_bh(&rfcomm_dev_lock);
if (err < 0)
goto free;
@@ -327,9 +332,9 @@
if (atomic_read(&dev->opened) > 0)
return;
- spin_lock(&rfcomm_dev_lock);
+ write_lock_bh(&rfcomm_dev_lock);
list_del_init(&dev->list);
- spin_unlock(&rfcomm_dev_lock);
+ write_unlock_bh(&rfcomm_dev_lock);
rfcomm_dev_put(dev);
}
@@ -347,7 +352,7 @@
struct rfcomm_dev *dev = (void *) skb->sk;
atomic_sub(skb->truesize, &dev->wmem_alloc);
if (test_bit(RFCOMM_TTY_ATTACHED, &dev->flags))
- queue_work(system_nrt_wq, &dev->wakeup_task);
+ tasklet_schedule(&dev->wakeup_task);
rfcomm_dev_put(dev);
}
@@ -451,9 +456,9 @@
static int rfcomm_get_dev_list(void __user *arg)
{
- struct rfcomm_dev *dev;
struct rfcomm_dev_list_req *dl;
struct rfcomm_dev_info *di;
+ struct list_head *p;
int n = 0, size, err;
u16 dev_num;
@@ -473,9 +478,10 @@
di = dl->dev_info;
- spin_lock(&rfcomm_dev_lock);
+ read_lock_bh(&rfcomm_dev_lock);
- list_for_each_entry(dev, &rfcomm_dev_list, list) {
+ list_for_each(p, &rfcomm_dev_list) {
+ struct rfcomm_dev *dev = list_entry(p, struct rfcomm_dev, list);
if (test_bit(RFCOMM_TTY_RELEASED, &dev->flags))
continue;
(di + n)->id = dev->id;
@@ -488,7 +494,7 @@
break;
}
- spin_unlock(&rfcomm_dev_lock);
+ read_unlock_bh(&rfcomm_dev_lock);
dl->dev_num = n;
size = sizeof(*dl) + n * sizeof(*di);
@@ -630,10 +636,9 @@
}
/* ---- TTY functions ---- */
-static void rfcomm_tty_wakeup(struct work_struct *work)
+static void rfcomm_tty_wakeup(unsigned long arg)
{
- struct rfcomm_dev *dev = container_of(work, struct rfcomm_dev,
- wakeup_task);
+ struct rfcomm_dev *dev = (void *) arg;
struct tty_struct *tty = dev->tty;
if (!tty)
return;
@@ -758,7 +763,7 @@
rfcomm_dlc_close(dev->dlc, 0);
clear_bit(RFCOMM_TTY_ATTACHED, &dev->flags);
- cancel_work_sync(&dev->wakeup_task);
+ tasklet_kill(&dev->wakeup_task);
rfcomm_dlc_lock(dev->dlc);
tty->driver_data = NULL;
@@ -766,9 +771,9 @@
rfcomm_dlc_unlock(dev->dlc);
if (test_bit(RFCOMM_TTY_RELEASED, &dev->flags)) {
- spin_lock(&rfcomm_dev_lock);
+ write_lock_bh(&rfcomm_dev_lock);
list_del_init(&dev->list);
- spin_unlock(&rfcomm_dev_lock);
+ write_unlock_bh(&rfcomm_dev_lock);
rfcomm_dev_put(dev);
}
@@ -1151,12 +1156,11 @@
int __init rfcomm_init_ttys(void)
{
- int error;
-
rfcomm_tty_driver = alloc_tty_driver(RFCOMM_TTY_PORTS);
if (!rfcomm_tty_driver)
- return -ENOMEM;
+ return -1;
+ rfcomm_tty_driver->owner = THIS_MODULE;
rfcomm_tty_driver->driver_name = "rfcomm";
rfcomm_tty_driver->name = "rfcomm";
rfcomm_tty_driver->major = RFCOMM_TTY_MAJOR;
@@ -1169,11 +1173,10 @@
rfcomm_tty_driver->init_termios.c_lflag &= ~ICANON;
tty_set_operations(rfcomm_tty_driver, &rfcomm_ops);
- error = tty_register_driver(rfcomm_tty_driver);
- if (error) {
+ if (tty_register_driver(rfcomm_tty_driver)) {
BT_ERR("Can't register RFCOMM TTY driver");
put_tty_driver(rfcomm_tty_driver);
- return error;
+ return -1;
}
BT_INFO("RFCOMM TTY layer initialized");