aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/misc
diff options
context:
space:
mode:
authorimilka <pkzl22@gmail.com>2012-11-10 22:16:18 +0000
committerEspen Fjellvær Olsen <espen@mrfjo.org>2012-11-11 15:59:50 +0100
commit3c3b858c0168ae826525595ef2fb5d275484f989 (patch)
tree582c77f5deabe0604845fccde2b4186f4c82857a /drivers/misc
parentb1b33a2c6e1af144fae79c803df637683502e5c8 (diff)
downloadkernel_samsung_smdk4412-3c3b858c0168ae826525595ef2fb5d275484f989.zip
kernel_samsung_smdk4412-3c3b858c0168ae826525595ef2fb5d275484f989.tar.gz
kernel_samsung_smdk4412-3c3b858c0168ae826525595ef2fb5d275484f989.tar.bz2
n7100 support
Change-Id: I111e3be9a1c6ea8b68eab5c87fa6c084ba9bb5c3
Diffstat (limited to 'drivers/misc')
-rw-r--r--drivers/misc/modem_if/modem_link_device_hsic.c3
-rw-r--r--drivers/misc/modem_if/modem_link_device_spi.c136
-rw-r--r--drivers/misc/modem_if/modem_link_device_spi.h5
-rw-r--r--drivers/misc/modem_if/modem_modemctl_device_esc6270.c3
-rw-r--r--drivers/misc/modem_if/modem_modemctl_device_mdm6600.c3
-rw-r--r--drivers/misc/modem_if/modem_modemctl_device_sprd8803.c15
-rw-r--r--drivers/misc/modem_if/modem_sim_slot_switch.c19
7 files changed, 78 insertions, 106 deletions
diff --git a/drivers/misc/modem_if/modem_link_device_hsic.c b/drivers/misc/modem_if/modem_link_device_hsic.c
index 795a7cf..976be76 100644
--- a/drivers/misc/modem_if/modem_link_device_hsic.c
+++ b/drivers/misc/modem_if/modem_link_device_hsic.c
@@ -269,7 +269,7 @@ static void usb_rx_complete(struct urb *urb)
switch (pipe_data->format) {
case IF_USB_FMT_EP:
if (usb_ld->if_usb_is_main) {
- //pr_urb("IPC-RX", urb);
+// pr_urb("IPC-RX", urb);
iod_format = IPC_FMT;
} else {
iod_format = IPC_BOOT;
@@ -477,7 +477,6 @@ static int _usb_tx_work(struct sk_buff *skb)
if (!pipe_data)
return -ENOENT;
-
/*
if (iod->format == IPC_FMT && usb_ld->if_usb_is_main)
pr_skb("IPC-TX", skb);
diff --git a/drivers/misc/modem_if/modem_link_device_spi.c b/drivers/misc/modem_if/modem_link_device_spi.c
index 1ea5a2c..c4715e0 100644
--- a/drivers/misc/modem_if/modem_link_device_spi.c
+++ b/drivers/misc/modem_if/modem_link_device_spi.c
@@ -37,22 +37,23 @@
static struct spi_link_device *p_spild;
static struct spi_device *p_spi;
-static void spi_send_work(int spi_sigs)
+static void spi_send_work(int spi_sigs, bool spi_work_t)
{
- struct spi_work_type *spi_wq = NULL;
- spi_wq = kmalloc(sizeof(struct spi_work_type), GFP_ATOMIC);
- spi_wq->signal_code = spi_sigs;
- INIT_WORK(&spi_wq->work, spi_work);
- queue_work(p_spild->spi_wq, (struct work_struct *)spi_wq);
-}
+ struct spi_work_type *spi_wq;
-static void spi_send_work_front(int spi_sigs)
-{
- struct spi_work_type *spi_wq = NULL;
spi_wq = kmalloc(sizeof(struct spi_work_type), GFP_ATOMIC);
+ if (unlikely(!spi_wq)) {
+ pr_err("[LNK/E] <%s> Failed to kmalloc()\n", __func__);
+ return;
+ }
+
spi_wq->signal_code = spi_sigs;
INIT_WORK(&spi_wq->work, spi_work);
- queue_work_front(p_spild->spi_wq, (struct work_struct *)spi_wq);
+
+ if (spi_work_t == SPI_WORK_FRONT)
+ queue_work_front(p_spild->spi_wq, (struct work_struct *)spi_wq);
+ else
+ queue_work(p_spild->spi_wq, (struct work_struct *)spi_wq);
}
static irqreturn_t spi_srdy_irq_handler(int irq, void *p_ld)
@@ -78,11 +79,8 @@ static irqreturn_t spi_srdy_irq_handler(int irq, void *p_ld)
/* SRDY interrupt work on SPI_STATE_IDLE state for receive data */
if (spild->spi_state == SPI_STATE_IDLE
|| spild->spi_state == SPI_STATE_RX_TERMINATE
- || spild->spi_state == SPI_STATE_TX_TERMINATE) {
- spi_send_work_front(SPI_WORK_RECEIVE);
-
- return result;
- }
+ || spild->spi_state == SPI_STATE_TX_TERMINATE)
+ spi_send_work(SPI_WORK_RECEIVE, SPI_WORK_FRONT);
return result;
}
@@ -116,10 +114,10 @@ static int spi_send
struct sk_buff_head *txq;
enum dev_format fmt = iod->format;
- u32 data;
- u32 cmd_ready = 0x12341234;
- u32 cmd_start = 0x45674567;
+ const u32 cmd_ready = 0x12341234;
+ const u32 cmd_start = 0x45674567;
int ret;
+ u32 data;
switch (fmt) {
case IPC_FMT:
@@ -165,7 +163,7 @@ static int spi_send
return 0;
}
- spi_send_work(SPI_WORK_SEND);
+ spi_send_work(SPI_WORK_SEND, SPI_WORK);
return ret;
}
@@ -186,17 +184,21 @@ static int spi_register_isr
if (ret) {
pr_err("[LNK/E] <%s> request_irq fail (%d)\n",
__func__, ret);
- return ret;
+ goto err;
}
ret = enable_irq_wake(irq);
- if (ret)
+ if (ret) {
pr_err("[LNK/E] <%s> enable_irq_wake fail (%d)\n",
__func__, ret);
+ free_irq(irq, ld);
+ goto err;
+ }
pr_debug("[LNK] <%s> IRQ#%d handler is registered.\n", __func__, irq);
- return 0;
+err:
+ return ret;
}
void spi_unregister_isr(unsigned irq, void *data)
@@ -300,56 +302,39 @@ static int spi_buff_write
}
-int spi_prepare_tx_packet(void)
+static void spi_prepare_tx_packet(void)
{
struct link_device *ld;
- struct spi_link_device *spild;
struct sk_buff *skb;
int ret;
int i;
- spild = p_spild;
- ld = &spild->ld;
+ ld = &p_spild->ld;
- for (i = 0; i < spild->max_ipc_dev; i++) {
+ for (i = 0; i < p_spild->max_ipc_dev; i++) {
while ((skb = skb_dequeue(ld->skb_txq[i]))) {
- if (ld->mode == LINK_MODE_IPC) {
- ret = spi_buff_write(spild, i,
- skb->data, skb->len);
- if (!ret) {
- skb_queue_head(ld->skb_txq[i], skb);
- break;
- }
- } else {
- pr_err("[LNK/E] <%s:%s> "
- "ld->mode != LINK_MODE_IPC\n",
- __func__, ld->name);
+ ret = spi_buff_write(p_spild, i, skb->data, skb->len);
+ if (!ret) {
+ skb_queue_head(ld->skb_txq[i], skb);
+ break;
}
dev_kfree_skb_any(skb);
}
}
-
- return 1;
}
-static int spi_start_data_send(void)
+static void spi_start_data_send(void)
{
struct link_device *ld;
- struct spi_link_device *spild;
int i;
- spild = p_spild;
- ld = &spild->ld;
+ ld = &p_spild->ld;
- for (i = 0; i < spild->max_ipc_dev; i++) {
- if (skb_queue_len(ld->skb_txq[i]) > 0) {
- spi_send_work(SPI_WORK_SEND);
- return 1;
- }
+ for (i = 0; i < p_spild->max_ipc_dev; i++) {
+ if (skb_queue_len(ld->skb_txq[i]) > 0)
+ spi_send_work(SPI_WORK_SEND, SPI_WORK);
}
-
- return 0;
}
static void spi_tx_work(void)
@@ -361,15 +346,10 @@ static void spi_tx_work(void)
spild = p_spild;
- /* check SUB SRDY state */
+ /* check SUB SRDY, SRDY state */
if (gpio_get_value(spild->gpio_ipc_sub_srdy) ==
- SPI_GPIOLEVEL_HIGH) {
- spi_start_data_send();
- return;
- }
-
- /* check SRDY state */
- if (gpio_get_value(spild->gpio_ipc_srdy) ==
+ SPI_GPIOLEVEL_HIGH ||
+ gpio_get_value(spild->gpio_ipc_srdy) ==
SPI_GPIOLEVEL_HIGH) {
spi_start_data_send();
return;
@@ -407,7 +387,7 @@ static void spi_tx_work(void)
/* change state SPI_STATE_TX_WAIT */
/* to SPI_STATE_IDLE */
spild->spi_state = SPI_STATE_IDLE;
- spi_send_work(SPI_WORK_SEND);
+ spi_send_work(SPI_WORK_SEND, SPI_WORK);
return;
}
@@ -433,9 +413,8 @@ static void spi_tx_work(void)
spi_prepare_tx_packet();
- if (spi_tx_rx_sync((void *)spi_packet_buf,
- (void *)spi_sync_buf,
- SPI_MAX_PACKET_SIZE) != 0) {
+ if (spi_tx_rx_sync((void *)spi_packet_buf, (void *)spi_sync_buf,
+ SPI_MAX_PACKET_SIZE)) {
/* TODO: save failed packet */
/* back data to each queue */
pr_err("[SPI] spi_dev_send fail\n");
@@ -537,11 +516,11 @@ int spi_buff_read(struct spi_link_device *spild)
/* enqueue spi data */
skb = alloc_skb(data_length, GFP_ATOMIC);
- if (!skb) {
+ if (unlikely(!skb)) {
pr_err("%s %s\n",
"[SPI] ERROR : spi_buff_read:",
"Can't allocate memory for SPI");
- return 0;
+ return -ENOMEM;
}
dst = skb_put(skb, data_length);
@@ -550,11 +529,7 @@ int spi_buff_read(struct spi_link_device *spild)
spi_packet_cur_pos + SPI_DATA_BOF_OFFSET,
data_length);
- if (skb)
- skb_queue_tail(&spild->skb_rxq[dev_id], skb);
- else
- pr_err("[LNK/E] <%s:%s> read[%d] fail\n",
- __func__, ld->name, dev_id);
+ skb_queue_tail(&spild->skb_rxq[dev_id], skb);
/* move spi packet current posision */
spi_packet_cur_pos += spi_data_length;
@@ -578,16 +553,10 @@ static void spi_rx_work(void)
if (!spild)
pr_err("[LNK/E] <%s> dpld == NULL\n", __func__);
- if (!wake_lock_active(&spild->spi_wake_lock))
- return;
-
- if (gpio_get_value(spild->gpio_ipc_srdy) == SPI_GPIOLEVEL_LOW)
- return;
-
- if (get_console_suspended())
- return;
-
- if (spild->spi_state == SPI_STATE_END)
+ if (!wake_lock_active(&spild->spi_wake_lock) ||
+ gpio_get_value(spild->gpio_ipc_srdy) == SPI_GPIOLEVEL_LOW ||
+ get_console_suspended() ||
+ spild->spi_state == SPI_STATE_END)
return;
spild->spi_state = SPI_STATE_RX_WAIT;
@@ -643,7 +612,7 @@ static void spi_rx_work(void)
!= NULL) {
if (iod->recv(iod, ld, skb->data,
skb->len) < 0)
- pr_err("[LNK/E] <%s:%s> recv fail\n",
+ pr_err("[LNK/E] <%s:%s> recv fail\n",
__func__, ld->name);
dev_kfree_skb_any(skb);
}
@@ -1328,7 +1297,6 @@ err:
static inline int _request_mem(struct ipc_spi *od)
{
if (!p_spild->p_virtual_buff) {
- pr_err("what\n");
od->mmio = vmalloc(od->size);
if (!od->mmio) {
pr_err("(%d) Failed to vmalloc size : %lu\n", __LINE__,
@@ -1408,7 +1376,7 @@ static void spi_work(struct work_struct *work)
kfree(spi_wq);
if (wake_lock_active(&p_spild->spi_wake_lock)) {
wake_unlock(&p_spild->spi_wake_lock);
- pr_err("[SPI] [%s](%d) spi_wakelock unlocked .\n",
+ pr_debug("[SPI] [%s](%d) spi_wakelock unlocked .\n",
__func__, __LINE__);
}
}
diff --git a/drivers/misc/modem_if/modem_link_device_spi.h b/drivers/misc/modem_if/modem_link_device_spi.h
index 2289a46..210d815 100644
--- a/drivers/misc/modem_if/modem_link_device_spi.h
+++ b/drivers/misc/modem_if/modem_link_device_spi.h
@@ -81,6 +81,11 @@ enum spi_msg_t {
SPI_WORK_RECEIVE
};
+enum spi_work_t {
+ SPI_WORK,
+ SPI_WORK_FRONT
+};
+
enum spi_state_t {
SPI_STATE_START, /* before init complete */
SPI_STATE_INIT, /* initialising */
diff --git a/drivers/misc/modem_if/modem_modemctl_device_esc6270.c b/drivers/misc/modem_if/modem_modemctl_device_esc6270.c
index df0ff80..5a42755 100644
--- a/drivers/misc/modem_if/modem_modemctl_device_esc6270.c
+++ b/drivers/misc/modem_if/modem_modemctl_device_esc6270.c
@@ -204,10 +204,7 @@ static irqreturn_t phone_active_irq_handler(int irq, void *arg)
mc->iod->modem_state_changed(mc->iod, phone_state);
} else if (phone_reset && !phone_active) {
if (mc->phone_state == STATE_ONLINE) {
- if (cp_dump_int)
phone_state = STATE_CRASH_EXIT;
- else
- phone_state = STATE_CRASH_RESET;
if (mc->iod && mc->iod->modem_state_changed)
mc->iod->modem_state_changed(mc->iod,
phone_state);
diff --git a/drivers/misc/modem_if/modem_modemctl_device_mdm6600.c b/drivers/misc/modem_if/modem_modemctl_device_mdm6600.c
index 2706e5e..ad44579 100644
--- a/drivers/misc/modem_if/modem_modemctl_device_mdm6600.c
+++ b/drivers/misc/modem_if/modem_modemctl_device_mdm6600.c
@@ -657,10 +657,7 @@ static irqreturn_t phone_active_irq_handler(int irq, void *arg)
mc->iod->modem_state_changed(mc->iod, phone_state);
} else if (phone_reset && !phone_active) {
if (mc->phone_state == STATE_ONLINE) {
- if (cp_dump_int)
phone_state = STATE_CRASH_EXIT;
- else
- phone_state = STATE_CRASH_RESET;
if (mc->iod && mc->iod->modem_state_changed)
mc->iod->modem_state_changed(mc->iod,
phone_state);
diff --git a/drivers/misc/modem_if/modem_modemctl_device_sprd8803.c b/drivers/misc/modem_if/modem_modemctl_device_sprd8803.c
index 9db864de..cfa2896 100644
--- a/drivers/misc/modem_if/modem_modemctl_device_sprd8803.c
+++ b/drivers/misc/modem_if/modem_modemctl_device_sprd8803.c
@@ -31,8 +31,6 @@ extern int spi_thread_restart(void);
static int sprd8803_on(struct modem_ctl *mc)
{
- pr_debug("[MODEM_IF] %s\n", __func__);
-
if (!mc->gpio_cp_on || !mc->gpio_pda_active) {
pr_err("[MODEM_IF] no gpio data\n");
return -ENXIO;
@@ -46,9 +44,8 @@ static int sprd8803_on(struct modem_ctl *mc)
gpio_set_value(mc->gpio_cp_ctrl1, 0);
gpio_set_value(mc->gpio_cp_ctrl2, 1);
#endif
- gpio_set_value(mc->gpio_cp_on, 0);
- gpio_set_value(mc->gpio_pda_active, 0);
msleep(100);
+// pr_info("[MODEM_IF] %s\n", __func__); // Kill spam
gpio_set_value(mc->gpio_cp_on, 1);
gpio_set_value(mc->gpio_pda_active, 1);
@@ -118,9 +115,6 @@ static irqreturn_t phone_active_irq_handler(int irq, void *_mc)
int phone_state = 0;
struct modem_ctl *mc = (struct modem_ctl *)_mc;
- disable_irq_nosync(mc->irq_phone_active);
- disable_irq_nosync(gpio_to_irq(mc->gpio_cp_dump_int));
-
if (!mc->gpio_phone_active ||
!mc->gpio_cp_dump_int) {
pr_err("[MODEM_IF] no gpio data\n");
@@ -141,7 +135,7 @@ static irqreturn_t phone_active_irq_handler(int irq, void *_mc)
else
phone_state = STATE_OFFLINE;
- if (phone_active_value && cp_dump_value)
+ if (cp_dump_value)
phone_state = STATE_CRASH_EXIT;
if (mc->iod && mc->iod->modem_state_changed)
@@ -151,9 +145,6 @@ static irqreturn_t phone_active_irq_handler(int irq, void *_mc)
mc->bootd->modem_state_changed(mc->bootd, phone_state);
exit:
- enable_irq(mc->irq_phone_active);
- enable_irq(gpio_to_irq(mc->gpio_cp_dump_int));
-
return IRQ_HANDLED;
}
@@ -212,7 +203,7 @@ int sprd8803_init_modemctl_device(struct modem_ctl *mc,
}
ret = request_irq(irq_cp_dump_int, phone_active_irq_handler,
- IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
+ IRQF_TRIGGER_RISING,
"cp_dump_int", mc);
if (ret) {
pr_err("[MODEM_IF] %s: failed to request_irq:%d\n",
diff --git a/drivers/misc/modem_if/modem_sim_slot_switch.c b/drivers/misc/modem_if/modem_sim_slot_switch.c
index 1dd4c67..c8e83ed 100644
--- a/drivers/misc/modem_if/modem_sim_slot_switch.c
+++ b/drivers/misc/modem_if/modem_sim_slot_switch.c
@@ -16,6 +16,10 @@ static ssize_t get_slot_switch(struct device *dev, struct device_attribute *attr
//return '0' slot path is '||', return '1' slot path is 'X'
value = gpio_get_value(GPIO_UIM_SIM_SEL);
+#if defined(CONFIG_MACH_T0_CHN_CTC)
+ if (system_rev < 7)
+ value = (~value & 0x1);
+#endif
printk("Current Slot is %x\n", value);
return sprintf(buf, "%d\n", value);
@@ -29,10 +33,20 @@ static ssize_t set_slot_switch(struct device *dev, struct device_attribute *attr
switch(value) {
case 0:
+#if defined(CONFIG_MACH_T0_CHN_CTC)
+ if (system_rev < 7)
+ gpio_set_value(GPIO_UIM_SIM_SEL, 1);
+ else
+#endif
gpio_set_value(GPIO_UIM_SIM_SEL, 0);
printk("set slot switch to %x\n", gpio_get_value(GPIO_UIM_SIM_SEL));
break;
case 1:
+#if defined(CONFIG_MACH_T0_CHN_CTC)
+ if (system_rev < 7)
+ gpio_set_value(GPIO_UIM_SIM_SEL, 0);
+ else
+#endif
gpio_set_value(GPIO_UIM_SIM_SEL, 1);
printk("set slot switch to %x\n", gpio_get_value(GPIO_UIM_SIM_SEL));
break;
@@ -61,10 +75,11 @@ static int __init slot_switch_manager_init(void)
gpio_direction_output(GPIO_UIM_SIM_SEL, 1);
s3c_gpio_setpull(GPIO_UIM_SIM_SEL, S3C_GPIO_PULL_NONE);
#if defined(CONFIG_MACH_T0_CHN_CTC)
+ if (system_rev < 7)
gpio_set_value(GPIO_UIM_SIM_SEL, 1);
-#else
- gpio_set_value(GPIO_UIM_SIM_SEL, 0);
+ else
#endif
+ gpio_set_value(GPIO_UIM_SIM_SEL, 0);
}
//initailize slot switch device