Merge "defconfig: 9615: Enable MMC/SD/SDIO" into msm-3.0
diff --git a/arch/arm/configs/msm8960_defconfig b/arch/arm/configs/msm8960_defconfig
index 8ccb48a..ddbe87c 100755
--- a/arch/arm/configs/msm8960_defconfig
+++ b/arch/arm/configs/msm8960_defconfig
@@ -285,6 +285,7 @@
CONFIG_FB_VIRTUAL=y
CONFIG_FB_MSM=y
# CONFIG_FB_MSM_BACKLIGHT is not set
+CONFIG_FB_MSM_TRIPLE_BUFFER=y
CONFIG_FB_MSM_MDP40=y
CONFIG_FB_MSM_OVERLAY=y
CONFIG_FB_MSM_OVERLAY_WRITEBACK=y
diff --git a/arch/arm/mach-msm/board-msm8960.c b/arch/arm/mach-msm/board-msm8960.c
index 7b2c778..6024757 100644
--- a/arch/arm/mach-msm/board-msm8960.c
+++ b/arch/arm/mach-msm/board-msm8960.c
@@ -1018,8 +1018,6 @@
};
#endif
-#ifdef CONFIG_MSM_BUS_SCALING
-
static struct msm_bus_vectors cam_init_vectors[] = {
{
.src = MSM_BUS_MASTER_VFE,
@@ -1153,24 +1151,19 @@
ARRAY_SIZE(cam_bus_client_config),
.name = "msm_camera",
};
-#endif
struct msm_camera_device_platform_data msm_camera_csi_device_data[] = {
{
.ioclk.mclk_clk_rate = 24000000,
.ioclk.vfe_clk_rate = 228570000,
.csid_core = 0,
-#ifdef CONFIG_MSM_BUS_SCALING
.cam_bus_scale_table = &cam_bus_client_pdata,
-#endif
},
{
.ioclk.mclk_clk_rate = 24000000,
.ioclk.vfe_clk_rate = 228570000,
.csid_core = 1,
-#ifdef CONFIG_MSM_BUS_SCALING
.cam_bus_scale_table = &cam_bus_client_pdata,
-#endif
},
};
diff --git a/arch/arm/mach-msm/clock-8960.c b/arch/arm/mach-msm/clock-8960.c
index 21abb8b..9aa5700 100644
--- a/arch/arm/mach-msm/clock-8960.c
+++ b/arch/arm/mach-msm/clock-8960.c
@@ -5160,6 +5160,7 @@
CLK_LOOKUP("mmfab_a_clk", mmfab_a_clk.c, NULL),
CLK_LOOKUP("mmfpb_clk", mmfpb_clk.c, NULL),
CLK_LOOKUP("mmfpb_a_clk", mmfpb_a_clk.c, NULL),
+ CLK_LOOKUP("mmfpb_a_clk", mmfpb_a_clk.c, "clock-8960"),
CLK_LOOKUP("sfab_clk", sfab_clk.c, NULL),
CLK_LOOKUP("sfab_a_clk", sfab_a_clk.c, NULL),
CLK_LOOKUP("sfpb_clk", sfpb_clk.c, NULL),
@@ -5763,6 +5764,20 @@
static int __init msm8960_clock_late_init(void)
{
+ int rc;
+ struct clk *mmfpb_a_clk = clk_get_sys("clock-8960", "mmfpb_a_clk");
+
+ /* Vote for MMFPB to be at least 76.8MHz when an Apps CPU is active. */
+ if (WARN(IS_ERR(mmfpb_a_clk), "mmfpb_a_clk not found (%ld)\n",
+ PTR_ERR(mmfpb_a_clk)))
+ return PTR_ERR(mmfpb_a_clk);
+ rc = clk_set_min_rate(mmfpb_a_clk, 76800000);
+ if (WARN(rc, "mmfpb_a_clk rate was not set (%d)\n", rc))
+ return rc;
+ rc = clk_enable(mmfpb_a_clk);
+ if (WARN(rc, "mmfpb_a_clk not enabled (%d)\n", rc))
+ return rc;
+
return local_unvote_sys_vdd(HIGH);
}
diff --git a/arch/arm/mach-msm/devices-msm7x27a.c b/arch/arm/mach-msm/devices-msm7x27a.c
index ef187a6..488db75 100644
--- a/arch/arm/mach-msm/devices-msm7x27a.c
+++ b/arch/arm/mach-msm/devices-msm7x27a.c
@@ -414,14 +414,14 @@
},
{
.name = "sdcc_dma_chnl",
- .start = DMOV_SDC4_CHAN,
- .end = DMOV_SDC4_CHAN,
+ .start = DMOV_SDC3_CHAN,
+ .end = DMOV_SDC3_CHAN,
.flags = IORESOURCE_DMA,
},
{
.name = "sdcc_dma_crci",
- .start = DMOV_SDC4_CRCI,
- .end = DMOV_SDC4_CRCI,
+ .start = DMOV_SDC3_CRCI,
+ .end = DMOV_SDC3_CRCI,
.flags = IORESOURCE_DMA,
},
};
@@ -439,14 +439,14 @@
},
{
.name = "sdcc_dma_chnl",
- .start = DMOV_SDC3_CHAN,
- .end = DMOV_SDC3_CHAN,
+ .start = DMOV_SDC4_CHAN,
+ .end = DMOV_SDC4_CHAN,
.flags = IORESOURCE_DMA,
},
{
.name = "sdcc_dma_crci",
- .start = DMOV_SDC3_CRCI,
- .end = DMOV_SDC3_CRCI,
+ .start = DMOV_SDC4_CRCI,
+ .end = DMOV_SDC4_CRCI,
.flags = IORESOURCE_DMA,
},
};
diff --git a/arch/arm/mach-msm/include/mach/board.h b/arch/arm/mach-msm/include/mach/board.h
index 2dbbc7d..df6a64c 100644
--- a/arch/arm/mach-msm/include/mach/board.h
+++ b/arch/arm/mach-msm/include/mach/board.h
@@ -24,9 +24,7 @@
#include <linux/leds-pmic8058.h>
#include <linux/clkdev.h>
#include <linux/msm_ssbi.h>
-#ifdef CONFIG_MSM_BUS_SCALING
#include <mach/msm_bus.h>
-#endif
struct msm_camera_io_ext {
uint32_t mdcphy;
@@ -62,9 +60,7 @@
struct msm_camera_io_ext ioext;
struct msm_camera_io_clk ioclk;
uint8_t csid_core;
-#ifdef CONFIG_MSM_BUS_SCALING
struct msm_bus_scale_pdata *cam_bus_scale_table;
-#endif
};
enum msm_camera_csi_data_format {
CSI_8BIT,
diff --git a/arch/arm/mach-msm/peripheral-loader.h b/arch/arm/mach-msm/peripheral-loader.h
index 7357432..097d9d7 100644
--- a/arch/arm/mach-msm/peripheral-loader.h
+++ b/arch/arm/mach-msm/peripheral-loader.h
@@ -9,8 +9,8 @@
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
-#ifndef __MACH_PERIPHERAL_LOADER_H
-#define __MACH_PERIPHERAL_LOADER_H
+#ifndef __MSM_PERIPHERAL_LOADER_H
+#define __MSM_PERIPHERAL_LOADER_H
#include <linux/list.h>
#include <linux/mutex.h>
diff --git a/arch/arm/mach-msm/qdsp6v2/pcm_out.c b/arch/arm/mach-msm/qdsp6v2/pcm_out.c
index b8521f6..75975cc 100644
--- a/arch/arm/mach-msm/qdsp6v2/pcm_out.c
+++ b/arch/arm/mach-msm/qdsp6v2/pcm_out.c
@@ -52,7 +52,6 @@
atomic_t out_stopped;
atomic_t out_prefill;
struct wake_lock wakelock;
- struct wake_lock idlelock;
};
void pcm_out_cb(uint32_t opcode, uint32_t token,
@@ -77,14 +76,12 @@
{
pr_debug("%s:\n", __func__);
wake_lock(&audio->wakelock);
- wake_lock(&audio->idlelock);
}
static void audio_allow_sleep(struct pcm *audio)
{
pr_debug("%s:\n", __func__);
wake_unlock(&audio->wakelock);
- wake_unlock(&audio->idlelock);
}
static int pcm_out_enable(struct pcm *pcm)
@@ -336,8 +333,6 @@
atomic_set(&pcm->out_opened, 1);
snprintf(name, sizeof name, "audio_pcm_%x", pcm->ac->session);
wake_lock_init(&pcm->wakelock, WAKE_LOCK_SUSPEND, name);
- snprintf(name, sizeof name, "audio_pcm_idle_%x", pcm->ac->session);
- wake_lock_init(&pcm->idlelock, WAKE_LOCK_IDLE, name);
rc = auddev_register_evt_listner(pcm->stream_event,
AUDDEV_CLNT_DEC,
@@ -441,7 +436,6 @@
q6asm_audio_client_free(pcm->ac);
audio_allow_sleep(pcm);
wake_lock_destroy(&pcm->wakelock);
- wake_lock_destroy(&pcm->idlelock);
mutex_destroy(&pcm->lock);
mutex_destroy(&pcm->write_lock);
kfree(pcm);
diff --git a/arch/arm/mach-msm/qdss-etb.c b/arch/arm/mach-msm/qdss-etb.c
index d4f7940..16f8a5b 100644
--- a/arch/arm/mach-msm/qdss-etb.c
+++ b/arch/arm/mach-msm/qdss-etb.c
@@ -12,6 +12,9 @@
#include <linux/kernel.h>
#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/types.h>
+#include <linux/device.h>
#include <linux/platform_device.h>
#include <linux/io.h>
#include <linux/err.h>
@@ -20,6 +23,7 @@
#include <linux/uaccess.h>
#include <linux/slab.h>
#include <linux/delay.h>
+#include <linux/mutex.h>
#include "qdss.h"
@@ -47,6 +51,7 @@
#define BYTES_PER_WORD 4
#define ETB_SIZE_WORDS 4096
+#define FRAME_SIZE_WORDS 4
#define ETB_LOCK() \
do { \
@@ -132,12 +137,24 @@
uint32_t read_data;
uint32_t read_ptr;
uint32_t write_ptr;
+ uint32_t frame_off;
+ uint32_t frame_endoff;
ETB_UNLOCK();
read_ptr = etb_readl(etb, ETB_RAM_READ_POINTER);
write_ptr = etb_readl(etb, ETB_RAM_WRITE_POINTER);
+ frame_off = write_ptr % FRAME_SIZE_WORDS;
+ frame_endoff = FRAME_SIZE_WORDS - frame_off;
+ if (frame_off) {
+ dev_err(etb.dev, "write_ptr: %lu not aligned to formatter "
+ "frame size\n", (unsigned long)write_ptr);
+ dev_err(etb.dev, "frameoff: %lu, frame_endoff: %lu\n",
+ (unsigned long)frame_off, (unsigned long)frame_endoff);
+ write_ptr += frame_endoff;
+ }
+
if ((etb_readl(etb, ETB_STATUS_REG) & BIT(0)) == 0)
etb_writel(etb, 0x0, ETB_RAM_READ_POINTER);
else
@@ -146,14 +163,20 @@
buf_ptr = etb.buf;
for (i = 0; i < ETB_SIZE_WORDS; i++) {
read_data = etb_readl(etb, ETB_RAM_READ_DATA_REG);
- *buf_ptr = read_data >> 0;
- buf_ptr++;
- *buf_ptr = read_data >> 8;
- buf_ptr++;
- *buf_ptr = read_data >> 16;
- buf_ptr++;
- *buf_ptr = read_data >> 24;
- buf_ptr++;
+ *buf_ptr++ = read_data >> 0;
+ *buf_ptr++ = read_data >> 8;
+ *buf_ptr++ = read_data >> 16;
+ *buf_ptr++ = read_data >> 24;
+ }
+
+ if (frame_off) {
+ buf_ptr -= (frame_endoff * BYTES_PER_WORD);
+ for (i = 0; i < frame_endoff; i++) {
+ *buf_ptr++ = 0x0;
+ *buf_ptr++ = 0x0;
+ *buf_ptr++ = 0x0;
+ *buf_ptr++ = 0x0;
+ }
}
etb_writel(etb, read_ptr, ETB_RAM_READ_POINTER);
diff --git a/arch/arm/mach-msm/qdss-funnel.c b/arch/arm/mach-msm/qdss-funnel.c
index 9ad407b..290b418 100644
--- a/arch/arm/mach-msm/qdss-funnel.c
+++ b/arch/arm/mach-msm/qdss-funnel.c
@@ -12,6 +12,9 @@
#include <linux/kernel.h>
#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/types.h>
+#include <linux/device.h>
#include <linux/platform_device.h>
#include <linux/io.h>
#include <linux/err.h>
diff --git a/arch/arm/mach-msm/qdss-ptm.c b/arch/arm/mach-msm/qdss-ptm.c
index 28dd171..4e8add7 100644
--- a/arch/arm/mach-msm/qdss-ptm.c
+++ b/arch/arm/mach-msm/qdss-ptm.c
@@ -12,6 +12,9 @@
#include <linux/kernel.h>
#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/types.h>
+#include <linux/device.h>
#include <linux/platform_device.h>
#include <linux/io.h>
#include <linux/err.h>
diff --git a/arch/arm/mach-msm/qdss-tpiu.c b/arch/arm/mach-msm/qdss-tpiu.c
index def7467..60a8dd2 100644
--- a/arch/arm/mach-msm/qdss-tpiu.c
+++ b/arch/arm/mach-msm/qdss-tpiu.c
@@ -12,6 +12,8 @@
#include <linux/kernel.h>
#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/device.h>
#include <linux/platform_device.h>
#include <linux/io.h>
#include <linux/err.h>
@@ -56,7 +58,6 @@
struct tpiu_ctx {
void __iomem *base;
bool enabled;
- atomic_t in_use;
struct device *dev;
};
diff --git a/arch/arm/mach-msm/qdss.h b/arch/arm/mach-msm/qdss.h
index e4e6b0c..a41d7e2 100644
--- a/arch/arm/mach-msm/qdss.h
+++ b/arch/arm/mach-msm/qdss.h
@@ -13,6 +13,8 @@
#ifndef _ARCH_ARM_MACH_MSM_QDSS_H_
#define _ARCH_ARM_MACH_MSM_QDSS_H_
+#include <linux/bitops.h>
+
/* Coresight management registers (0xF00-0xFCC) */
#define CS_ITCTRL (0xF00)
#define CS_CLAIMSET (0xFA0)
diff --git a/arch/arm/mm/init.c b/arch/arm/mm/init.c
index 4b5e6be..ca501ef 100644
--- a/arch/arm/mm/init.c
+++ b/arch/arm/mm/init.c
@@ -658,7 +658,14 @@
else if (!page_count(page))
free_pages++;
page++;
+#ifdef CONFIG_SPARSEMEM
+ pfn1++;
+ if (!(pfn1 % PAGES_PER_SECTION))
+ page = pfn_to_page(pfn1);
+ } while (pfn1 < pfn2);
+#else
} while (page < end);
+#endif
}
/*
diff --git a/drivers/char/diag/diagchar.h b/drivers/char/diag/diagchar.h
index 5c685c3..292fbc3 100644
--- a/drivers/char/diag/diagchar.h
+++ b/drivers/char/diag/diagchar.h
@@ -46,6 +46,7 @@
#define MSG_MASK_SIZE 8000
#define LOG_MASK_SIZE 8000
#define EVENT_MASK_SIZE 1000
+#define USER_SPACE_DATA 8000
#define PKT_SIZE 4096
#define MAX_EQUIP_ID 12
@@ -157,6 +158,7 @@
unsigned char *buf_in_wcnss_cntl;
unsigned char *usb_buf_out;
unsigned char *apps_rsp_buf;
+ unsigned char *user_space_data;
smd_channel_t *ch;
smd_channel_t *ch_cntl;
smd_channel_t *chqdsp;
diff --git a/drivers/char/diag/diagchar_core.c b/drivers/char/diag/diagchar_core.c
index c9a9d57..6fa043c 100644
--- a/drivers/char/diag/diagchar_core.c
+++ b/drivers/char/diag/diagchar_core.c
@@ -355,6 +355,8 @@
mutex_lock(&driver->diagchar_mutex);
temp = driver->logging_mode;
driver->logging_mode = (int)ioarg;
+ if (driver->logging_mode == UART_MODE)
+ driver->logging_mode = MEMORY_DEVICE_MODE;
driver->logging_process_id = current->tgid;
mutex_unlock(&driver->diagchar_mutex);
if (temp == MEMORY_DEVICE_MODE && driver->logging_mode
@@ -363,12 +365,14 @@
driver->in_busy_2 = 1;
driver->in_busy_qdsp_1 = 1;
driver->in_busy_qdsp_2 = 1;
+ driver->in_busy_wcnss = 1;
} else if (temp == NO_LOGGING_MODE && driver->logging_mode
== MEMORY_DEVICE_MODE) {
driver->in_busy_1 = 0;
driver->in_busy_2 = 0;
driver->in_busy_qdsp_1 = 0;
driver->in_busy_qdsp_2 = 0;
+ driver->in_busy_wcnss = 0;
/* Poll SMD channels to check for data*/
if (driver->ch)
queue_work(driver->diag_wq,
@@ -376,6 +380,9 @@
if (driver->chqdsp)
queue_work(driver->diag_wq,
&(driver->diag_read_smd_qdsp_work));
+ if (driver->ch_wcnss)
+ queue_work(driver->diag_wq,
+ &(driver->diag_read_smd_wcnss_work));
}
#ifdef CONFIG_DIAG_OVER_USB
else if (temp == USB_MODE && driver->logging_mode
@@ -391,6 +398,7 @@
driver->in_busy_2 = 0;
driver->in_busy_qdsp_2 = 0;
driver->in_busy_qdsp_2 = 0;
+ driver->in_busy_wcnss = 0;
/* Poll SMD channels to check for data*/
if (driver->ch)
queue_work(driver->diag_wq,
@@ -398,6 +406,9 @@
if (driver->chqdsp)
queue_work(driver->diag_wq,
&(driver->diag_read_smd_qdsp_work));
+ if (driver->ch_wcnss)
+ queue_work(driver->diag_wq,
+ &(driver->diag_read_smd_wcnss_work));
} else if (temp == MEMORY_DEVICE_MODE && driver->logging_mode
== USB_MODE)
diagfwd_connect();
@@ -426,10 +437,10 @@
driver->data_ready[index]);
mutex_lock(&driver->diagchar_mutex);
- if ((driver->data_ready[index] & MEMORY_DEVICE_LOG_TYPE) && (driver->
+ if ((driver->data_ready[index] & USER_SPACE_LOG_TYPE) && (driver->
logging_mode == MEMORY_DEVICE_MODE)) {
/*Copy the type of data being passed*/
- data_type = driver->data_ready[index] & MEMORY_DEVICE_LOG_TYPE;
+ data_type = driver->data_ready[index] & USER_SPACE_LOG_TYPE;
COPY_USER_SPACE_OR_EXIT(buf, data_type, 4);
/* place holder for number of data field */
ret += 4;
@@ -496,8 +507,7 @@
driver->write_ptr_2->length);
driver->in_busy_2 = 0;
}
-
- /* copy q6 data */
+ /* copy lpass data */
if (driver->in_busy_qdsp_1 == 1) {
num_data++;
/*Copy the length of data being passed*/
@@ -520,23 +530,37 @@
write_ptr_qdsp_2->length);
driver->in_busy_qdsp_2 = 0;
}
-
+ /* copy wncss data */
+ if (driver->in_busy_wcnss == 1) {
+ num_data++;
+ /*Copy the length of data being passed*/
+ COPY_USER_SPACE_OR_EXIT(buf+ret,
+ (driver->write_ptr_wcnss->length), 4);
+ /*Copy the actual data being passed*/
+ COPY_USER_SPACE_OR_EXIT(buf+ret, *(driver->
+ buf_in_wcnss),
+ driver->write_ptr_wcnss->length);
+ driver->in_busy_wcnss = 0;
+ }
/* copy number of data fields */
COPY_USER_SPACE_OR_EXIT(buf+4, num_data, 4);
ret -= 4;
- driver->data_ready[index] ^= MEMORY_DEVICE_LOG_TYPE;
+ driver->data_ready[index] ^= USER_SPACE_LOG_TYPE;
if (driver->ch)
queue_work(driver->diag_wq,
&(driver->diag_read_smd_work));
if (driver->chqdsp)
queue_work(driver->diag_wq,
&(driver->diag_read_smd_qdsp_work));
+ if (driver->ch_wcnss)
+ queue_work(driver->diag_wq,
+ &(driver->diag_read_smd_wcnss_work));
APPEND_DEBUG('n');
goto exit;
- } else if (driver->data_ready[index] & MEMORY_DEVICE_LOG_TYPE) {
+ } else if (driver->data_ready[index] & USER_SPACE_LOG_TYPE) {
/* In case, the thread wakes up and the logging mode is
not memory device any more, the condition needs to be cleared */
- driver->data_ready[index] ^= MEMORY_DEVICE_LOG_TYPE;
+ driver->data_ready[index] ^= USER_SPACE_LOG_TYPE;
}
if (driver->data_ready[index] & DEINIT_TYPE) {
@@ -612,21 +636,27 @@
#endif /* DIAG over USB */
/* Get the packet type F3/log/event/Pkt response */
err = copy_from_user((&pkt_type), buf, 4);
- /*First 4 bytes indicate the type of payload - ignore these */
+ /* First 4 bytes indicate the type of payload - ignore these */
payload_size = count - 4;
- if (pkt_type == MEMORY_DEVICE_LOG_TYPE) {
- if (!mask_request_validate((unsigned char *)buf)) {
- printk(KERN_ALERT "mask request Invalid ..cannot send to modem \n");
- return -EFAULT;
+ if (pkt_type == USER_SPACE_LOG_TYPE) {
+ err = copy_from_user(driver->user_space_data, buf + 4,
+ payload_size);
+ /* Check masks for On-Device logging */
+ if (pkt_type == USER_SPACE_LOG_TYPE) {
+ if (!mask_request_validate((unsigned char *)buf)) {
+ pr_alert("diag: mask request Invalid\n");
+ return -EFAULT;
+ }
}
buf = buf + 4;
#ifdef DIAG_DEBUG
- pr_debug("diag: masks: %d\n", payload_size);
+ pr_debug("diag: user space data %d\n", payload_size);
for (i = 0; i < payload_size; i++)
printk(KERN_DEBUG "\t %x", *(((unsigned char *)buf)+i));
#endif
- diag_process_hdlc((void *)buf, payload_size);
+ diag_process_hdlc((void *)(driver->user_space_data),
+ payload_size);
return 0;
}
diff --git a/drivers/char/diag/diagfwd.c b/drivers/char/diag/diagfwd.c
index f9664c4..e49d57c 100644
--- a/drivers/char/diag/diagfwd.c
+++ b/drivers/char/diag/diagfwd.c
@@ -61,7 +61,8 @@
driver->write_ptr_1->length = (int)(enc.dest - \
(void *)(driver->buf_in_1)); \
driver->in_busy_1 = 1; \
- usb_diag_write(driver->legacy_ch, driver->write_ptr_1); \
+ diag_device_write(driver->buf_in_1, MODEM_DATA, \
+ driver->write_ptr_1); \
memset(driver->apps_rsp_buf, '\0', 500); \
} \
} while (0)
@@ -153,7 +154,7 @@
driver->logging_process_id)
break;
if (i < driver->num_clients) {
- driver->data_ready[i] |= MEMORY_DEVICE_LOG_TYPE;
+ driver->data_ready[i] |= USER_SPACE_LOG_TYPE;
wake_up_interruptible(&driver->wait_q);
} else
return -EINVAL;
@@ -982,13 +983,15 @@
{
printk(KERN_DEBUG "diag: USB disconnected\n");
driver->usb_connected = 0;
- driver->in_busy_1 = 1;
- driver->in_busy_2 = 1;
- driver->in_busy_qdsp_1 = 1;
- driver->in_busy_qdsp_2 = 1;
- driver->in_busy_wcnss = 1;
driver->debug_flag = 1;
usb_diag_free_req(driver->legacy_ch);
+ if (driver->logging_mode == USB_MODE) {
+ driver->in_busy_1 = 1;
+ driver->in_busy_2 = 1;
+ driver->in_busy_qdsp_1 = 1;
+ driver->in_busy_qdsp_2 = 1;
+ driver->in_busy_wcnss = 1;
+ }
#ifdef CONFIG_DIAG_SDIO_PIPE
if (machine_is_msm8x60_fusion() || machine_is_msm8x60_fusn_ffa())
if (driver->mdm_ch && !IS_ERR(driver->mdm_ch))
@@ -1235,6 +1238,10 @@
if (driver->hdlc_buf == NULL
&& (driver->hdlc_buf = kzalloc(HDLC_MAX, GFP_KERNEL)) == NULL)
goto err;
+ if (driver->user_space_data == NULL)
+ driver->user_space_data = kzalloc(USER_SPACE_DATA, GFP_KERNEL);
+ if (driver->user_space_data == NULL)
+ goto err;
if (driver->msg_masks == NULL
&& (driver->msg_masks = kzalloc(MSG_MASK_SIZE,
GFP_KERNEL)) == NULL)
@@ -1350,6 +1357,7 @@
kfree(driver->write_ptr_wcnss);
kfree(driver->usb_read_ptr);
kfree(driver->apps_rsp_buf);
+ kfree(driver->user_space_data);
if (driver->diag_wq)
destroy_workqueue(driver->diag_wq);
}
@@ -1391,5 +1399,6 @@
kfree(driver->write_ptr_wcnss);
kfree(driver->usb_read_ptr);
kfree(driver->apps_rsp_buf);
+ kfree(driver->user_space_data);
destroy_workqueue(driver->diag_wq);
}
diff --git a/drivers/char/diag/diagfwd_sdio.c b/drivers/char/diag/diagfwd_sdio.c
index 8be9f46..f3873aa 100644
--- a/drivers/char/diag/diagfwd_sdio.c
+++ b/drivers/char/diag/diagfwd_sdio.c
@@ -124,10 +124,11 @@
int diagfwd_disconnect_sdio(void)
{
- driver->in_busy_sdio = 1;
usb_diag_free_req(driver->mdm_ch);
- if (driver->sdio_ch && (driver->logging_mode == USB_MODE))
+ if (driver->sdio_ch && (driver->logging_mode == USB_MODE)) {
+ driver->in_busy_sdio = 1;
diag_sdio_close();
+ }
return 0;
}
diff --git a/drivers/i2c/busses/i2c-qup.c b/drivers/i2c/busses/i2c-qup.c
index 8f2a942..c6bbb0d 100644
--- a/drivers/i2c/busses/i2c-qup.c
+++ b/drivers/i2c/busses/i2c-qup.c
@@ -335,8 +335,15 @@
else /* 1-bit delay before we check for bus busy */
udelay(dev->one_bit_t);
}
- if (retries++ == 1000)
- udelay(100);
+ if (retries++ == 1000) {
+ /*
+ * Wait for FIFO number of bytes to be absolutely sure
+ * that I2C write state machine is not idle. Each byte
+ * takes 9 clock cycles. (8 bits + 1 ack)
+ */
+ usleep_range((dev->one_bit_t * (dev->out_fifo_sz * 9)),
+ (dev->one_bit_t * (dev->out_fifo_sz * 9)));
+ }
}
qup_print_status(dev);
return -ETIMEDOUT;
@@ -1076,7 +1083,7 @@
platform_set_drvdata(pdev, dev);
- dev->one_bit_t = USEC_PER_SEC/pdata->clk_freq;
+ dev->one_bit_t = (USEC_PER_SEC/pdata->clk_freq) + 1;
dev->pdata = pdata;
dev->clk_ctl = 0;
dev->pos = 0;
diff --git a/drivers/media/video/msm/sensors/ov2720.c b/drivers/media/video/msm/sensors/ov2720.c
index be15b779..d50ea43 100644
--- a/drivers/media/video/msm/sensors/ov2720.c
+++ b/drivers/media/video/msm/sensors/ov2720.c
@@ -83,10 +83,10 @@
{0x4005, 0x08},
{0x404f, 0x84},
{0x4051, 0x00},
- {0x5000, 0xff},
+ {0x5000, 0xcf},
{0x3a18, 0x00},
{0x3a19, 0x80},
- {0x3503, 0x13},
+ {0x3503, 0x03},
{0x4521, 0x00},
{0x5183, 0xb0},
{0x5184, 0xb0},
diff --git a/drivers/spi/spi_qsd.c b/drivers/spi/spi_qsd.c
index 4896556..aaeb790 100644
--- a/drivers/spi/spi_qsd.c
+++ b/drivers/spi/spi_qsd.c
@@ -172,11 +172,17 @@
static char const * const spi_rsrcs[] = {
"spi_clk",
- "spi_cs",
"spi_miso",
"spi_mosi"
};
+static char const * const spi_cs_rsrcs[] = {
+ "spi_cs",
+ "spi_cs1",
+ "spi_cs2",
+ "spi_cs3",
+};
+
enum msm_spi_mode {
SPI_FIFO_MODE = 0x0, /* 00 */
SPI_BLOCK_MODE = 0x1, /* 01 */
@@ -184,6 +190,12 @@
SPI_MODE_NONE = 0xFF, /* invalid value */
};
+/* Structure for SPI CS GPIOs */
+struct spi_cs_gpio {
+ int gpio_num;
+ bool valid;
+};
+
/* Structures for Data Mover */
struct spi_dmov_cmd {
dmov_box box; /* data aligned to max(dm_burst_size, block_size)
@@ -330,8 +342,10 @@
struct spi_transfer *cur_rx_transfer;
/* Temporary buffer used for WR-WR or WR-RD transfers */
u8 *temp_buf;
- /* GPIO pin numbers for SPI clk, cs, miso and mosi */
+ /* GPIO pin numbers for SPI clk, miso and mosi */
int spi_gpios[ARRAY_SIZE(spi_rsrcs)];
+ /* SPI CS GPIOs for each slave */
+ struct spi_cs_gpio cs_gpios[ARRAY_SIZE(spi_cs_rsrcs)];
};
/* Forward declaration */
@@ -635,8 +649,8 @@
if (dd->spi_gpios[i] >= 0) {
result = gpio_request(dd->spi_gpios[i], spi_rsrcs[i]);
if (result) {
- pr_err("%s: gpio_request for pin %d failed\
- with error%d\n", __func__,
+ dev_err(dd->dev, "%s: gpio_request for pin %d "
+ "failed with error %d\n", __func__,
dd->spi_gpios[i], result);
goto error;
}
@@ -660,6 +674,13 @@
if (dd->spi_gpios[i] >= 0)
gpio_free(dd->spi_gpios[i]);
}
+
+ for (i = 0; i < ARRAY_SIZE(spi_cs_rsrcs); ++i) {
+ if (dd->cs_gpios[i].valid) {
+ gpio_free(dd->cs_gpios[i].gpio_num);
+ dd->cs_gpios[i].valid = 0;
+ }
+ }
}
static void msm_spi_clock_set(struct msm_spi *dd, int speed)
@@ -1652,7 +1673,24 @@
static void msm_spi_process_message(struct msm_spi *dd)
{
int xfrs_grped = 0;
+ int cs_num;
+ int rc;
+
dd->write_xfr_cnt = dd->read_xfr_cnt = 0;
+ cs_num = dd->cur_msg->spi->chip_select;
+ if ((!(dd->cur_msg->spi->mode & SPI_LOOP)) &&
+ (!(dd->cs_gpios[cs_num].valid)) &&
+ (dd->cs_gpios[cs_num].gpio_num >= 0)) {
+ rc = gpio_request(dd->cs_gpios[cs_num].gpio_num,
+ spi_cs_rsrcs[cs_num]);
+ if (rc) {
+ dev_err(dd->dev, "gpio_request for pin %d failed with "
+ "error %d\n", dd->cs_gpios[cs_num].gpio_num,
+ rc);
+ return;
+ }
+ dd->cs_gpios[cs_num].valid = 1;
+ }
dd->cur_transfer = list_first_entry(&dd->cur_msg->transfers,
struct spi_transfer,
@@ -1664,7 +1702,7 @@
&dd->cur_msg->transfers,
transfer_list) {
if (!dd->cur_transfer->len)
- return;
+ goto error;
if (xfrs_grped) {
xfrs_grped--;
continue;
@@ -1686,12 +1724,20 @@
int ret = msm_spi_map_dma_buffers(dd);
if (ret < 0) {
dd->cur_msg->status = ret;
- return;
+ goto error;
}
}
dd->cur_tx_transfer = dd->cur_rx_transfer = dd->cur_transfer;
msm_spi_process_transfer(dd);
}
+
+ return;
+
+error:
+ if (dd->cs_gpios[cs_num].valid) {
+ gpio_free(dd->cs_gpios[cs_num].gpio_num);
+ dd->cs_gpios[cs_num].valid = 0;
+ }
}
/* workqueue - pull messages from queue & process */
@@ -2257,9 +2303,17 @@
dd->spi_gpios[i] = resource ? resource->start : -1;
}
+ for (i = 0; i < ARRAY_SIZE(spi_cs_rsrcs); ++i) {
+ resource = platform_get_resource_byname(pdev, IORESOURCE_IO,
+ spi_cs_rsrcs[i]);
+ dd->cs_gpios[i].gpio_num = resource ? resource->start : -1;
+ dd->cs_gpios[i].valid = 0;
+ }
+
rc = msm_spi_request_gpios(dd);
if (rc)
goto err_probe_gpio;
+
spin_lock_init(&dd->queue_lock);
mutex_init(&dd->core_lock);
INIT_LIST_HEAD(&dd->queue);
diff --git a/drivers/usb/gadget/composite.c b/drivers/usb/gadget/composite.c
index dc06da6..4c33695 100644
--- a/drivers/usb/gadget/composite.c
+++ b/drivers/usb/gadget/composite.c
@@ -37,7 +37,7 @@
*/
/* big enough to hold our biggest descriptor */
-#define USB_BUFSIZ 1024
+#define USB_BUFSIZ 4096
static struct usb_composite_driver *composite;
static int (*composite_gadget_bind)(struct usb_composite_dev *cdev);
@@ -859,6 +859,10 @@
struct usb_function *f = NULL;
u8 endp;
+
+ if (w_length > USB_BUFSIZ)
+ return value;
+
/* partial re-init of the response message; the function or the
* gadget might need to intercept e.g. a control-OUT completion
* when we delegate to it.
diff --git a/drivers/usb/gadget/f_mass_storage.c b/drivers/usb/gadget/f_mass_storage.c
index ecade02..55d9a307 100644
--- a/drivers/usb/gadget/f_mass_storage.c
+++ b/drivers/usb/gadget/f_mass_storage.c
@@ -2649,7 +2649,6 @@
*/
if (!fsg_is_set(common))
break;
- common->ep0req->length = 0;
if (test_and_clear_bit(IGNORE_BULK_OUT,
&common->fsg->atomic_bitflags))
usb_ep_clear_halt(common->fsg->bulk_in);
diff --git a/drivers/usb/gadget/f_rmnet.c b/drivers/usb/gadget/f_rmnet.c
index 0bb50de..2a61337 100644
--- a/drivers/usb/gadget/f_rmnet.c
+++ b/drivers/usb/gadget/f_rmnet.c
@@ -493,8 +493,6 @@
case ((USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE) << 8)
| USB_CDC_SEND_ENCAPSULATED_COMMAND:
- if (w_length > req->length)
- goto invalid;
ret = w_length;
req->complete = frmnet_cmd_complete;
req->context = dev;
diff --git a/drivers/usb/gadget/f_rmnet_sdio.c b/drivers/usb/gadget/f_rmnet_sdio.c
index 61a67bb..b15c221 100644
--- a/drivers/usb/gadget/f_rmnet_sdio.c
+++ b/drivers/usb/gadget/f_rmnet_sdio.c
@@ -534,8 +534,6 @@
case ((USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE) << 8)
| USB_CDC_SEND_ENCAPSULATED_COMMAND:
- if (w_length > req->length)
- goto invalid;
ret = w_length;
req->complete = rmnet_sdio_command_complete;
req->context = dev;
diff --git a/drivers/usb/gadget/f_rmnet_smd.c b/drivers/usb/gadget/f_rmnet_smd.c
index 08a6799..b8dd3a5 100644
--- a/drivers/usb/gadget/f_rmnet_smd.c
+++ b/drivers/usb/gadget/f_rmnet_smd.c
@@ -534,8 +534,6 @@
case ((USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE) << 8)
| USB_CDC_SEND_ENCAPSULATED_COMMAND:
- if (w_length > req->length)
- goto invalid;
ret = w_length;
req->complete = rmnet_smd_command_complete;
req->context = dev;
diff --git a/drivers/usb/gadget/f_rmnet_smd_sdio.c b/drivers/usb/gadget/f_rmnet_smd_sdio.c
index b9120ca..eda547a 100644
--- a/drivers/usb/gadget/f_rmnet_smd_sdio.c
+++ b/drivers/usb/gadget/f_rmnet_smd_sdio.c
@@ -1110,8 +1110,6 @@
case ((USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE) << 8)
| USB_CDC_SEND_ENCAPSULATED_COMMAND:
- if (w_length > req->length)
- goto invalid;
ret = w_length;
req->complete = rmnet_mux_command_complete;
req->context = dev;
diff --git a/include/linux/diagchar.h b/include/linux/diagchar.h
index 22270de..91d67d5 100644
--- a/include/linux/diagchar.h
+++ b/include/linux/diagchar.h
@@ -18,10 +18,11 @@
#define EVENT_MASKS_TYPE 4
#define PKT_TYPE 8
#define DEINIT_TYPE 16
-#define MEMORY_DEVICE_LOG_TYPE 32
+#define USER_SPACE_LOG_TYPE 32
#define USB_MODE 1
#define MEMORY_DEVICE_MODE 2
#define NO_LOGGING_MODE 3
+#define UART_MODE 4
/* different values that go in for diag_data_type */
#define DATA_TYPE_EVENT 0
diff --git a/kernel/printk.c b/kernel/printk.c
index ccdfac7..bddd32b 100644
--- a/kernel/printk.c
+++ b/kernel/printk.c
@@ -53,10 +53,6 @@
#define __LOG_BUF_LEN (1 << CONFIG_LOG_BUF_SHIFT)
-#ifdef CONFIG_DEBUG_LL
-extern void printascii(char *);
-#endif
-
/* printk's without a loglevel use this.. */
#define DEFAULT_MESSAGE_LOGLEVEL CONFIG_DEFAULT_MESSAGE_LOGLEVEL
@@ -928,9 +924,6 @@
printed_len += vscnprintf(printk_buf + printed_len,
sizeof(printk_buf) - printed_len, fmt, args);
-#ifdef CONFIG_DEBUG_LL
- printascii(printk_buf);
-#endif
p = printk_buf;
diff --git a/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c
index 079538b..733e9d2 100644
--- a/net/bluetooth/hci_conn.c
+++ b/net/bluetooth/hci_conn.c
@@ -50,10 +50,13 @@
struct hci_dev *hdev = conn->hdev;
struct hci_cp_le_create_conn cp;
+ BT_DBG("%p", conn);
+
conn->state = BT_CONNECT;
conn->out = 1;
conn->link_mode |= HCI_LM_MASTER;
conn->sec_level = BT_SECURITY_LOW;
+ conn->type = LE_LINK;
memset(&cp, 0, sizeof(cp));
cp.scan_interval = cpu_to_le16(0x0004);
@@ -300,9 +303,6 @@
BT_DBG("conn %p state %d", conn, conn->state);
- if (atomic_read(&conn->refcnt))
- return;
-
hci_dev_lock(hdev);
switch (conn->state) {
@@ -317,11 +317,14 @@
break;
case BT_CONFIG:
case BT_CONNECTED:
- reason = hci_proto_disconn_ind(conn);
- hci_acl_disconn(conn, reason);
+ if (!atomic_read(&conn->refcnt)) {
+ reason = hci_proto_disconn_ind(conn);
+ hci_acl_disconn(conn, reason);
+ }
break;
default:
- conn->state = BT_CLOSED;
+ if (!atomic_read(&conn->refcnt))
+ conn->state = BT_CLOSED;
break;
}
diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c
index e2d6490..da8b780 100644
--- a/net/bluetooth/hci_event.c
+++ b/net/bluetooth/hci_event.c
@@ -1352,6 +1352,10 @@
else
BT_ERR("No memory for new connection");
}
+
+ if (conn)
+ mod_timer(&conn->disc_timer,
+ jiffies + msecs_to_jiffies(5000));
}
hci_dev_unlock(hdev);
diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c
index 848a515..a328db9 100644
--- a/net/bluetooth/mgmt.c
+++ b/net/bluetooth/mgmt.c
@@ -1411,6 +1411,10 @@
BT_DBG("Unable to find a pending command");
return;
}
+
+ if (status)
+ pairing_complete(cmd, status);
+
hci_conn_put(conn);
}