Merge "msm: pil-pronto: Add Pronto PIL driver to msm-copper" into msm-3.0
diff --git a/arch/arm/configs/msm8960_defconfig b/arch/arm/configs/msm8960_defconfig
index e18f0ea..cb935a2 100644
--- a/arch/arm/configs/msm8960_defconfig
+++ b/arch/arm/configs/msm8960_defconfig
@@ -276,6 +276,7 @@
CONFIG_INPUT_EVDEV=y
CONFIG_INPUT_EVBUG=m
CONFIG_KEYBOARD_GPIO=y
+CONFIG_KEYBOARD_MATRIX=y
CONFIG_KEYBOARD_PMIC8XXX=y
CONFIG_INPUT_JOYSTICK=y
CONFIG_JOYSTICK_XPAD=y
diff --git a/arch/arm/mach-msm/board-8064.c b/arch/arm/mach-msm/board-8064.c
index d08fe01..2d93f78 100644
--- a/arch/arm/mach-msm/board-8064.c
+++ b/arch/arm/mach-msm/board-8064.c
@@ -2291,6 +2291,92 @@
},
};
+static struct gpio_keys_button mpq_keys[] = {
+ {
+ .code = KEY_VOLUMEDOWN,
+ .gpio = GPIO_KEY_VOLUME_DOWN,
+ .desc = "volume_down_key",
+ .active_low = 1,
+ .type = EV_KEY,
+ .wakeup = 1,
+ .debounce_interval = 15,
+ },
+ {
+ .code = KEY_VOLUMEUP,
+ .gpio = GPIO_KEY_VOLUME_UP,
+ .desc = "volume_up_key",
+ .active_low = 1,
+ .type = EV_KEY,
+ .wakeup = 1,
+ .debounce_interval = 15,
+ },
+};
+
+static struct gpio_keys_platform_data mpq_keys_data = {
+ .buttons = mpq_keys,
+ .nbuttons = ARRAY_SIZE(mpq_keys),
+};
+
+static struct platform_device mpq_gpio_keys_pdev = {
+ .name = "gpio-keys",
+ .id = -1,
+ .dev = {
+ .platform_data = &mpq_keys_data,
+ },
+};
+
+#define MPQ_KP_ROW_BASE SX150X_EXP2_GPIO_BASE
+#define MPQ_KP_COL_BASE (SX150X_EXP2_GPIO_BASE + 4)
+
+static unsigned int mpq_row_gpios[] = {MPQ_KP_ROW_BASE, MPQ_KP_ROW_BASE + 1,
+ MPQ_KP_ROW_BASE + 2, MPQ_KP_ROW_BASE + 3};
+static unsigned int mpq_col_gpios[] = {MPQ_KP_COL_BASE, MPQ_KP_COL_BASE + 1,
+ MPQ_KP_COL_BASE + 2};
+
+static const unsigned int mpq_keymap[] = {
+ KEY(0, 0, KEY_UP),
+ KEY(0, 1, KEY_ENTER),
+ KEY(0, 2, KEY_3),
+
+ KEY(1, 0, KEY_DOWN),
+ KEY(1, 1, KEY_EXIT),
+ KEY(1, 2, KEY_4),
+
+ KEY(2, 0, KEY_LEFT),
+ KEY(2, 1, KEY_1),
+ KEY(2, 2, KEY_5),
+
+ KEY(3, 0, KEY_RIGHT),
+ KEY(3, 1, KEY_2),
+ KEY(3, 2, KEY_6),
+};
+
+static struct matrix_keymap_data mpq_keymap_data = {
+ .keymap_size = ARRAY_SIZE(mpq_keymap),
+ .keymap = mpq_keymap,
+};
+
+static struct matrix_keypad_platform_data mpq_keypad_data = {
+ .keymap_data = &mpq_keymap_data,
+ .row_gpios = mpq_row_gpios,
+ .col_gpios = mpq_col_gpios,
+ .num_row_gpios = ARRAY_SIZE(mpq_row_gpios),
+ .num_col_gpios = ARRAY_SIZE(mpq_col_gpios),
+ .col_scan_delay_us = 32000,
+ .debounce_ms = 20,
+ .wakeup = 1,
+ .active_low = 1,
+ .no_autorepeat = 1,
+};
+
+static struct platform_device mpq_keypad_device = {
+ .name = "matrix-keypad",
+ .id = -1,
+ .dev = {
+ .platform_data = &mpq_keypad_data,
+ },
+};
+
/* Sensors DSPS platform data */
#define DSPS_PIL_GENERIC_NAME "dsps"
static void __init apq8064_init_dsps(void)
@@ -2372,8 +2458,8 @@
[SX150X_EXP2] = {
.gpio_base = SX150X_EXP2_GPIO_BASE,
.oscio_is_gpo = false,
- .io_pullup_ena = 0x0,
- .io_pulldn_ena = 0x0,
+ .io_pullup_ena = 0x0f,
+ .io_pulldn_ena = 0x70,
.io_open_drain_ena = 0x0,
.io_polarity = 0,
.irq_summary = SX150X_EXP2_INT_N,
@@ -2611,6 +2697,11 @@
platform_device_register(&mtp_kp_pdev);
change_memory_power = &apq8064_change_memory_power;
+
+ if (machine_is_mpq8064_cdp()) {
+ platform_device_register(&mpq_gpio_keys_pdev);
+ platform_device_register(&mpq_keypad_device);
+ }
}
MACHINE_START(APQ8064_SIM, "QCT APQ8064 SIMULATOR")
diff --git a/arch/arm/mach-msm/board-8930.c b/arch/arm/mach-msm/board-8930.c
index 1cf1935..e249331 100644
--- a/arch/arm/mach-msm/board-8930.c
+++ b/arch/arm/mach-msm/board-8930.c
@@ -1638,9 +1638,9 @@
static struct tsens_platform_data msm_tsens_pdata = {
.tsens_factor = 1000,
.hw_type = APQ_8064,
- .tsens_num_sensor = 11,
- .slope = {1176, 1176, 1154, 1176, 1111,
- 1132, 1132, 1199, 1132, 1199, 1132},
+ .tsens_num_sensor = 10,
+ .slope = {1132, 1135, 1137, 1135, 1157,
+ 1142, 1124, 1153, 1175, 1166},
};
#ifdef CONFIG_MSM_FAKE_BATTERY
diff --git a/arch/arm/mach-msm/board-9615.c b/arch/arm/mach-msm/board-9615.c
index 3389dea..e1adc6c 100644
--- a/arch/arm/mach-msm/board-9615.c
+++ b/arch/arm/mach-msm/board-9615.c
@@ -656,7 +656,7 @@
.tsens_factor = 1000,
.hw_type = MDM_9615,
.tsens_num_sensor = 5,
- .slope = {1176, 1176, 1154, 1176, 1111},
+ .slope = {1176, 1162, 1162, 1149, 1176},
};
static struct platform_device *common_devices[] = {
diff --git a/drivers/input/keyboard/matrix_keypad.c b/drivers/input/keyboard/matrix_keypad.c
index c7aa2ce..dc1feaa 100644
--- a/drivers/input/keyboard/matrix_keypad.c
+++ b/drivers/input/keyboard/matrix_keypad.c
@@ -2,6 +2,7 @@
* GPIO driven matrix keyboard driver
*
* Copyright (c) 2008 Marek Vasut <marek.vasut@gmail.com>
+ * Copyright (c) 2012, Code Aurora Forum. All rights reserved.
*
* Based on corgikbd.c
*
@@ -34,7 +35,7 @@
uint32_t last_key_state[MATRIX_MAX_COLS];
struct delayed_work work;
- spinlock_t lock;
+ struct mutex lock;
bool scan_pending;
bool stopped;
bool gpio_all_disabled;
@@ -162,19 +163,17 @@
activate_all_cols(pdata, true);
- /* Enable IRQs again */
- spin_lock_irq(&keypad->lock);
+ mutex_lock(&keypad->lock);
keypad->scan_pending = false;
enable_row_irqs(keypad);
- spin_unlock_irq(&keypad->lock);
+ mutex_unlock(&keypad->lock);
}
static irqreturn_t matrix_keypad_interrupt(int irq, void *id)
{
struct matrix_keypad *keypad = id;
- unsigned long flags;
- spin_lock_irqsave(&keypad->lock, flags);
+ mutex_lock(&keypad->lock);
/*
* See if another IRQ beaten us to it and scheduled the
@@ -190,7 +189,7 @@
msecs_to_jiffies(keypad->pdata->debounce_ms));
out:
- spin_unlock_irqrestore(&keypad->lock, flags);
+ mutex_unlock(&keypad->lock);
return IRQ_HANDLED;
}
@@ -341,10 +340,11 @@
}
} else {
for (i = 0; i < pdata->num_row_gpios; i++) {
- err = request_any_context_irq(
+ err = request_threaded_irq(
gpio_to_irq(pdata->row_gpios[i]),
+ NULL,
matrix_keypad_interrupt,
- IRQF_DISABLED |
+ IRQF_DISABLED | IRQF_ONESHOT |
IRQF_TRIGGER_RISING |
IRQF_TRIGGER_FALLING,
"matrix-keypad", keypad);
@@ -417,7 +417,7 @@
keypad->row_shift = row_shift;
keypad->stopped = true;
INIT_DELAYED_WORK(&keypad->work, matrix_keypad_scan);
- spin_lock_init(&keypad->lock);
+ mutex_init(&keypad->lock);
input_dev->name = pdev->name;
input_dev->id.bustype = BUS_HOST;
@@ -479,6 +479,7 @@
for (i = 0; i < pdata->num_col_gpios; i++)
gpio_free(pdata->col_gpios[i]);
+ mutex_destroy(&keypad->lock);
input_unregister_device(keypad->input_dev);
platform_set_drvdata(pdev, NULL);
kfree(keypad->keycodes);
diff --git a/drivers/mmc/host/msm_sdcc.c b/drivers/mmc/host/msm_sdcc.c
index 5040fc8..c194f9c 100644
--- a/drivers/mmc/host/msm_sdcc.c
+++ b/drivers/mmc/host/msm_sdcc.c
@@ -1862,10 +1862,6 @@
}
spin_lock_irqsave(&host->lock, flags);
- WARN(host->curr.mrq, "Request in progress\n");
- WARN(!host->pwr, "SDCC power is turned off\n");
- WARN(!host->clks_on, "SDCC clocks are turned off\n");
- WARN(host->sdcc_irq_disabled, "SDCC IRQ is disabled\n");
if (host->eject) {
if (mrq->data && !(mrq->data->flags & MMC_DATA_READ)) {
@@ -1881,6 +1877,29 @@
}
/*
+ * Don't start the request if SDCC is not in proper state to handle it
+ */
+ if (!host->pwr || !host->clks_on || host->sdcc_irq_disabled) {
+ WARN(1, "%s: %s: SDCC is in bad state. don't process"
+ " new request (CMD%d)\n", mmc_hostname(host->mmc),
+ __func__, mrq->cmd->opcode);
+ msmsdcc_dump_sdcc_state(host);
+ mrq->cmd->error = -EIO;
+ if (mrq->data) {
+ mrq->data->error = -EIO;
+ mrq->data->bytes_xfered = 0;
+ }
+ spin_unlock_irqrestore(&host->lock, flags);
+ mmc_request_done(mmc, mrq);
+ return;
+ }
+
+ WARN(host->curr.mrq, "%s: %s: New request (CMD%d) received while"
+ " other request (CMD%d) is in progress\n",
+ mmc_hostname(host->mmc), __func__,
+ mrq->cmd->opcode, host->curr.mrq->cmd->opcode);
+
+ /*
* Kick the software command timeout timer here.
* Timer expires in 10 secs.
*/
@@ -2830,6 +2849,20 @@
}
#ifdef CONFIG_PM_RUNTIME
+static void msmsdcc_print_rpm_info(struct msmsdcc_host *host)
+{
+ struct device *dev = mmc_dev(host->mmc);
+
+ pr_info("%s: RPM: runtime_status=%d, usage_count=%d,"
+ " is_suspended=%d, disable_depth=%d, runtime_error=%d,"
+ " request_pending=%d, request=%d\n",
+ mmc_hostname(host->mmc), dev->power.runtime_status,
+ atomic_read(&dev->power.usage_count),
+ dev->power.is_suspended, dev->power.disable_depth,
+ dev->power.runtime_error, dev->power.request_pending,
+ dev->power.request);
+}
+
static int msmsdcc_enable(struct mmc_host *mmc)
{
int rc = 0;
@@ -2862,6 +2895,7 @@
if (rc < 0) {
pr_info("%s: %s: failed with error %d", mmc_hostname(mmc),
__func__, rc);
+ msmsdcc_print_rpm_info(host);
return rc;
}
@@ -2892,12 +2926,15 @@
if (rc < 0 && (rc != -EAGAIN)) {
pr_info("%s: %s: failed with error %d", mmc_hostname(mmc),
__func__, rc);
+ msmsdcc_print_rpm_info(host);
return rc;
}
return 0;
}
#else
+static void msmsdcc_print_rpm_info(struct msmsdcc_host *host) {}
+
static int msmsdcc_enable(struct mmc_host *mmc)
{
struct device *dev = mmc->parent;
@@ -4153,7 +4190,7 @@
mmc_hostname(host->mmc), host->dma.busy,
host->dma.channel, host->dma.crci);
else if (host->is_sps_mode) {
- if (host->sps.busy)
+ if (host->sps.busy && host->clks_on)
msmsdcc_print_regs("SDCC-DML", host->dml_base,
host->dml_memres->start,
16);
@@ -4171,6 +4208,7 @@
mmc_hostname(host->mmc), host->curr.got_dataend,
host->prog_enable, host->curr.wait_for_auto_prog_done,
host->curr.got_auto_prog_done);
+ msmsdcc_print_rpm_info(host);
}
static void msmsdcc_req_tout_timer_hdlr(unsigned long data)