diff options
Diffstat (limited to 'drivers/misc/modem_if')
-rw-r--r-- | drivers/misc/modem_if/modem_link_device_hsic.c | 3 | ||||
-rw-r--r-- | drivers/misc/modem_if/modem_link_device_spi.c | 136 | ||||
-rw-r--r-- | drivers/misc/modem_if/modem_link_device_spi.h | 5 | ||||
-rw-r--r-- | drivers/misc/modem_if/modem_modemctl_device_esc6270.c | 3 | ||||
-rw-r--r-- | drivers/misc/modem_if/modem_modemctl_device_mdm6600.c | 3 | ||||
-rw-r--r-- | drivers/misc/modem_if/modem_modemctl_device_sprd8803.c | 15 | ||||
-rw-r--r-- | drivers/misc/modem_if/modem_sim_slot_switch.c | 19 |
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 |