Lines Matching refs:si

174 static int pxa_irda_set_speed(struct pxa_irda *si, int speed);
176 static inline void pxa_irda_disable_clk(struct pxa_irda *si) in pxa_irda_disable_clk() argument
178 if (si->cur_clk) in pxa_irda_disable_clk()
179 clk_disable_unprepare(si->cur_clk); in pxa_irda_disable_clk()
180 si->cur_clk = NULL; in pxa_irda_disable_clk()
183 static inline void pxa_irda_enable_firclk(struct pxa_irda *si) in pxa_irda_enable_firclk() argument
185 si->cur_clk = si->fir_clk; in pxa_irda_enable_firclk()
186 clk_prepare_enable(si->fir_clk); in pxa_irda_enable_firclk()
189 static inline void pxa_irda_enable_sirclk(struct pxa_irda *si) in pxa_irda_enable_sirclk() argument
191 si->cur_clk = si->sir_clk; in pxa_irda_enable_sirclk()
192 clk_prepare_enable(si->sir_clk); in pxa_irda_enable_sirclk()
196 #define IS_FIR(si) ((si)->speed >= 4000000) argument
202 inline static void pxa_irda_fir_dma_rx_start(struct pxa_irda *si) in pxa_irda_fir_dma_rx_start() argument
206 tx = dmaengine_prep_slave_single(si->rxdma, si->dma_rx_buff_phy, in pxa_irda_fir_dma_rx_start()
210 dev_err(si->dev, "prep_slave_sg() failed\n"); in pxa_irda_fir_dma_rx_start()
214 tx->callback_param = si; in pxa_irda_fir_dma_rx_start()
215 si->rx_cookie = dmaengine_submit(tx); in pxa_irda_fir_dma_rx_start()
216 dma_async_issue_pending(si->rxdma); in pxa_irda_fir_dma_rx_start()
219 inline static void pxa_irda_fir_dma_tx_start(struct pxa_irda *si) in pxa_irda_fir_dma_tx_start() argument
223 tx = dmaengine_prep_slave_single(si->txdma, si->dma_tx_buff_phy, in pxa_irda_fir_dma_tx_start()
224 si->dma_tx_buff_len, DMA_TO_DEVICE, in pxa_irda_fir_dma_tx_start()
227 dev_err(si->dev, "prep_slave_sg() failed\n"); in pxa_irda_fir_dma_tx_start()
231 tx->callback_param = si; in pxa_irda_fir_dma_tx_start()
232 si->tx_cookie = dmaengine_submit(tx); in pxa_irda_fir_dma_tx_start()
233 dma_async_issue_pending(si->rxdma); in pxa_irda_fir_dma_tx_start()
239 static void pxa_irda_set_mode(struct pxa_irda *si, int mode) in pxa_irda_set_mode() argument
241 if (si->pdata->transceiver_mode) in pxa_irda_set_mode()
242 si->pdata->transceiver_mode(si->dev, mode); in pxa_irda_set_mode()
244 if (gpio_is_valid(si->pdata->gpio_pwdown)) in pxa_irda_set_mode()
245 gpio_set_value(si->pdata->gpio_pwdown, in pxa_irda_set_mode()
247 !si->pdata->gpio_pwdown_inverted); in pxa_irda_set_mode()
248 pxa2xx_transceiver_mode(si->dev, mode); in pxa_irda_set_mode()
255 static int pxa_irda_set_speed(struct pxa_irda *si, int speed) in pxa_irda_set_speed() argument
270 if (IS_FIR(si)) { in pxa_irda_set_speed()
272 dmaengine_terminate_all(si->rxdma); in pxa_irda_set_speed()
274 ficp_writel(si, 0, ICCR0); in pxa_irda_set_speed()
275 pxa_irda_disable_clk(si); in pxa_irda_set_speed()
278 pxa_irda_set_mode(si, IR_SIRMODE); in pxa_irda_set_speed()
281 pxa_irda_enable_sirclk(si); in pxa_irda_set_speed()
285 stuart_writel(si, 0, STIER); in pxa_irda_set_speed()
288 stuart_writel(si, stuart_readl(si, STLCR) | LCR_DLAB, STLCR); in pxa_irda_set_speed()
289 stuart_writel(si, divisor & 0xff, STDLL); in pxa_irda_set_speed()
290 stuart_writel(si, divisor >> 8, STDLH); in pxa_irda_set_speed()
291 stuart_writel(si, stuart_readl(si, STLCR) & ~LCR_DLAB, STLCR); in pxa_irda_set_speed()
293 si->speed = speed; in pxa_irda_set_speed()
294 stuart_writel(si, IrSR_IR_RECEIVE_ON | IrSR_XMODE_PULSE_1_6, in pxa_irda_set_speed()
296 stuart_writel(si, IER_UUE | IER_RLSE | IER_RAVIE | IER_RTIOE, in pxa_irda_set_speed()
306 stuart_writel(si, 0, STIER); in pxa_irda_set_speed()
307 stuart_writel(si, 0, STISR); in pxa_irda_set_speed()
308 pxa_irda_disable_clk(si); in pxa_irda_set_speed()
311 ficp_writel(si, 0, ICCR0); in pxa_irda_set_speed()
314 pxa_irda_set_mode(si, IR_FIRMODE); in pxa_irda_set_speed()
317 pxa_irda_enable_firclk(si); in pxa_irda_set_speed()
319 si->speed = speed; in pxa_irda_set_speed()
320 pxa_irda_fir_dma_rx_start(si); in pxa_irda_set_speed()
321 ficp_writel(si, ICCR0_ITR | ICCR0_RXE, ICCR0); in pxa_irda_set_speed()
337 struct pxa_irda *si = netdev_priv(dev); in pxa_irda_sir_irq() local
340 iir = stuart_readl(si, STIIR); in pxa_irda_sir_irq()
344 lsr = stuart_readl(si, STLSR); in pxa_irda_sir_irq()
346 data = stuart_readl(si, STRBR); in pxa_irda_sir_irq()
357 &si->rx_buff, data); in pxa_irda_sir_irq()
359 lsr = stuart_readl(si, STLSR); in pxa_irda_sir_irq()
361 si->last_clk = sched_clock(); in pxa_irda_sir_irq()
370 async_unwrap_char(dev, &dev->stats, &si->rx_buff, in pxa_irda_sir_irq()
371 stuart_readl(si, STRBR)); in pxa_irda_sir_irq()
372 } while (stuart_readl(si, STLSR) & LSR_DR); in pxa_irda_sir_irq()
373 si->last_clk = sched_clock(); in pxa_irda_sir_irq()
377 while ((si->tx_buff.len) && in pxa_irda_sir_irq()
378 (stuart_readl(si, STLSR) & LSR_TDRQ)) { in pxa_irda_sir_irq()
379 stuart_writel(si, *si->tx_buff.data++, STTHR); in pxa_irda_sir_irq()
380 si->tx_buff.len -= 1; in pxa_irda_sir_irq()
383 if (si->tx_buff.len == 0) { in pxa_irda_sir_irq()
385 dev->stats.tx_bytes += si->tx_buff.data - si->tx_buff.head; in pxa_irda_sir_irq()
388 while ((stuart_readl(si, STLSR) & LSR_TEMT) == 0) in pxa_irda_sir_irq()
390 si->last_clk = sched_clock(); in pxa_irda_sir_irq()
397 if (si->newspeed) { in pxa_irda_sir_irq()
398 pxa_irda_set_speed(si, si->newspeed); in pxa_irda_sir_irq()
399 si->newspeed = 0; in pxa_irda_sir_irq()
402 stuart_writel(si, IrSR_IR_RECEIVE_ON | in pxa_irda_sir_irq()
405 stuart_writel(si, IER_UUE | IER_RLSE | in pxa_irda_sir_irq()
421 struct pxa_irda *si = netdev_priv(dev); in pxa_irda_fir_dma_rx_irq() local
423 dmaengine_terminate_all(si->rxdma); in pxa_irda_fir_dma_rx_irq()
431 struct pxa_irda *si = netdev_priv(dev); in pxa_irda_fir_dma_tx_irq() local
433 dmaengine_terminate_all(si->txdma); in pxa_irda_fir_dma_tx_irq()
434 if (dmaengine_tx_status(si->txdma, si->tx_cookie, NULL) == DMA_ERROR) { in pxa_irda_fir_dma_tx_irq()
438 dev->stats.tx_bytes += si->dma_tx_buff_len; in pxa_irda_fir_dma_tx_irq()
441 while (ficp_readl(si, ICSR1) & ICSR1_TBY) in pxa_irda_fir_dma_tx_irq()
443 si->last_clk = sched_clock(); in pxa_irda_fir_dma_tx_irq()
451 if (si->newspeed) { in pxa_irda_fir_dma_tx_irq()
452 pxa_irda_set_speed(si, si->newspeed); in pxa_irda_fir_dma_tx_irq()
453 si->newspeed = 0; in pxa_irda_fir_dma_tx_irq()
457 ficp_writel(si, 0, ICCR0); in pxa_irda_fir_dma_tx_irq()
458 pxa_irda_fir_dma_rx_start(si); in pxa_irda_fir_dma_tx_irq()
459 while ((ficp_readl(si, ICSR1) & ICSR1_RNE) && i--) in pxa_irda_fir_dma_tx_irq()
460 ficp_readl(si, ICDR); in pxa_irda_fir_dma_tx_irq()
461 ficp_writel(si, ICCR0_ITR | ICCR0_RXE, ICCR0); in pxa_irda_fir_dma_tx_irq()
470 static void pxa_irda_fir_irq_eif(struct pxa_irda *si, struct net_device *dev, int icsr0) in pxa_irda_fir_irq_eif() argument
477 dmaengine_tx_status(si->rxdma, si->rx_cookie, &state); in pxa_irda_fir_irq_eif()
482 stat = ficp_readl(si, ICSR1); in pxa_irda_fir_irq_eif()
484 data = ficp_readl(si, ICDR); in pxa_irda_fir_irq_eif()
497 si->dma_rx_buff[len++] = data; in pxa_irda_fir_irq_eif()
502 } while (ficp_readl(si, ICSR0) & ICSR0_EIF); in pxa_irda_fir_irq_eif()
523 skb_copy_to_linear_data(skb, si->dma_rx_buff, len); in pxa_irda_fir_irq_eif()
541 struct pxa_irda *si = netdev_priv(dev); in pxa_irda_fir_irq() local
545 dmaengine_terminate_all(si->rxdma); in pxa_irda_fir_irq()
546 si->last_clk = sched_clock(); in pxa_irda_fir_irq()
547 icsr0 = ficp_readl(si, ICSR0); in pxa_irda_fir_irq()
557 ficp_writel(si, icsr0 & (ICSR0_FRE | ICSR0_RAB), ICSR0); in pxa_irda_fir_irq()
562 pxa_irda_fir_irq_eif(si, dev, icsr0); in pxa_irda_fir_irq()
565 ficp_writel(si, 0, ICCR0); in pxa_irda_fir_irq()
566 pxa_irda_fir_dma_rx_start(si); in pxa_irda_fir_irq()
567 while ((ficp_readl(si, ICSR1) & ICSR1_RNE) && i--) in pxa_irda_fir_irq()
568 ficp_readl(si, ICDR); in pxa_irda_fir_irq()
569 ficp_writel(si, ICCR0_ITR | ICCR0_RXE, ICCR0); in pxa_irda_fir_irq()
580 struct pxa_irda *si = netdev_priv(dev); in pxa_irda_hard_xmit() local
588 if (speed != si->speed && speed != -1) in pxa_irda_hard_xmit()
589 si->newspeed = speed; in pxa_irda_hard_xmit()
595 if (si->newspeed) { in pxa_irda_hard_xmit()
596 si->newspeed = 0; in pxa_irda_hard_xmit()
597 pxa_irda_set_speed(si, speed); in pxa_irda_hard_xmit()
605 if (!IS_FIR(si)) { in pxa_irda_hard_xmit()
606 si->tx_buff.data = si->tx_buff.head; in pxa_irda_hard_xmit()
607 si->tx_buff.len = async_wrap_skb(skb, si->tx_buff.data, si->tx_buff.truesize); in pxa_irda_hard_xmit()
610 stuart_writel(si, 0, STIER); in pxa_irda_hard_xmit()
611 stuart_writel(si, IrSR_IR_TRANSMIT_ON | IrSR_XMODE_PULSE_1_6, in pxa_irda_hard_xmit()
615 stuart_writel(si, IER_UUE | IER_TIE, STIER); in pxa_irda_hard_xmit()
619 si->dma_tx_buff_len = skb->len; in pxa_irda_hard_xmit()
620 skb_copy_from_linear_data(skb, si->dma_tx_buff, skb->len); in pxa_irda_hard_xmit()
623 while ((sched_clock() - si->last_clk) * 1000 < mtt) in pxa_irda_hard_xmit()
627 dmaengine_terminate_all(si->rxdma); in pxa_irda_hard_xmit()
628 ficp_writel(si, 0, ICCR0); in pxa_irda_hard_xmit()
630 pxa_irda_fir_dma_tx_start(si); in pxa_irda_hard_xmit()
631 ficp_writel(si, ICCR0_ITR | ICCR0_TXE, ICCR0); in pxa_irda_hard_xmit()
641 struct pxa_irda *si = netdev_priv(dev); in pxa_irda_ioctl() local
653 ret = pxa_irda_set_speed(si, in pxa_irda_ioctl()
672 rq->ifr_receiving = IS_FIR(si) ? 0 in pxa_irda_ioctl()
673 : si->rx_buff.state != OUTSIDE_FRAME; in pxa_irda_ioctl()
684 static void pxa_irda_startup(struct pxa_irda *si) in pxa_irda_startup() argument
687 stuart_writel(si, 0, STIER); in pxa_irda_startup()
689 stuart_writel(si, MCR_OUT2, STMCR); in pxa_irda_startup()
691 stuart_writel(si, LCR_WLS0 | LCR_WLS1, STLCR); in pxa_irda_startup()
693 stuart_writel(si, FCR_TRFIFOE | FCR_ITL_32, STFCR); in pxa_irda_startup()
696 ficp_writel(si, 0, ICCR0); in pxa_irda_startup()
698 ficp_writel(si, ICCR2_TXP | ICCR2_TRIG_32, ICCR2); in pxa_irda_startup()
701 si->speed = 4000000; in pxa_irda_startup()
702 pxa_irda_set_speed(si, 9600); in pxa_irda_startup()
707 static void pxa_irda_shutdown(struct pxa_irda *si) in pxa_irda_shutdown() argument
714 stuart_writel(si, 0, STIER); in pxa_irda_shutdown()
716 stuart_writel(si, 0, STISR); in pxa_irda_shutdown()
719 dmaengine_terminate_all(si->rxdma); in pxa_irda_shutdown()
720 dmaengine_terminate_all(si->txdma); in pxa_irda_shutdown()
722 ficp_writel(si, 0, ICCR0); in pxa_irda_shutdown()
725 pxa_irda_disable_clk(si); in pxa_irda_shutdown()
730 pxa_irda_set_mode(si, IR_OFF); in pxa_irda_shutdown()
737 struct pxa_irda *si = netdev_priv(dev); in pxa_irda_start() local
743 si->speed = 9600; in pxa_irda_start()
745 err = request_irq(si->uart_irq, pxa_irda_sir_irq, 0, dev->name, dev); in pxa_irda_start()
749 err = request_irq(si->icp_irq, pxa_irda_fir_irq, 0, dev->name, dev); in pxa_irda_start()
756 disable_irq(si->uart_irq); in pxa_irda_start()
757 disable_irq(si->icp_irq); in pxa_irda_start()
767 config.src_addr = (dma_addr_t)si->irda_base + ICDR; in pxa_irda_start()
768 config.dst_addr = (dma_addr_t)si->irda_base + ICDR; in pxa_irda_start()
772 param.drcmr = si->drcmr_rx; in pxa_irda_start()
773 si->rxdma = dma_request_slave_channel_compat(mask, pxad_filter_fn, in pxa_irda_start()
775 if (!si->rxdma) in pxa_irda_start()
778 param.drcmr = si->drcmr_tx; in pxa_irda_start()
779 si->txdma = dma_request_slave_channel_compat(mask, pxad_filter_fn, in pxa_irda_start()
781 if (!si->txdma) in pxa_irda_start()
784 err = dmaengine_slave_config(si->rxdma, &config); in pxa_irda_start()
787 err = dmaengine_slave_config(si->txdma, &config); in pxa_irda_start()
792 si->dma_rx_buff = dma_alloc_coherent(si->dev, IRDA_FRAME_SIZE_LIMIT, in pxa_irda_start()
793 &si->dma_rx_buff_phy, GFP_KERNEL); in pxa_irda_start()
794 if (!si->dma_rx_buff) in pxa_irda_start()
797 si->dma_tx_buff = dma_alloc_coherent(si->dev, IRDA_FRAME_SIZE_LIMIT, in pxa_irda_start()
798 &si->dma_tx_buff_phy, GFP_KERNEL); in pxa_irda_start()
799 if (!si->dma_tx_buff) in pxa_irda_start()
803 pxa_irda_startup(si); in pxa_irda_start()
808 si->irlap = irlap_open(dev, &si->qos, "pxa"); in pxa_irda_start()
810 if (!si->irlap) in pxa_irda_start()
816 enable_irq(si->uart_irq); in pxa_irda_start()
817 enable_irq(si->icp_irq); in pxa_irda_start()
825 pxa_irda_shutdown(si); in pxa_irda_start()
826 dma_free_coherent(si->dev, IRDA_FRAME_SIZE_LIMIT, si->dma_tx_buff, si->dma_tx_buff_phy); in pxa_irda_start()
828 dma_free_coherent(si->dev, IRDA_FRAME_SIZE_LIMIT, si->dma_rx_buff, si->dma_rx_buff_phy); in pxa_irda_start()
830 dma_release_channel(si->txdma); in pxa_irda_start()
832 dma_release_channel(si->rxdma); in pxa_irda_start()
834 free_irq(si->icp_irq, dev); in pxa_irda_start()
836 free_irq(si->uart_irq, dev); in pxa_irda_start()
844 struct pxa_irda *si = netdev_priv(dev); in pxa_irda_stop() local
848 pxa_irda_shutdown(si); in pxa_irda_stop()
851 if (si->irlap) { in pxa_irda_stop()
852 irlap_close(si->irlap); in pxa_irda_stop()
853 si->irlap = NULL; in pxa_irda_stop()
856 free_irq(si->uart_irq, dev); in pxa_irda_stop()
857 free_irq(si->icp_irq, dev); in pxa_irda_stop()
859 dmaengine_terminate_all(si->rxdma); in pxa_irda_stop()
860 dmaengine_terminate_all(si->txdma); in pxa_irda_stop()
861 dma_release_channel(si->rxdma); in pxa_irda_stop()
862 dma_release_channel(si->txdma); in pxa_irda_stop()
864 if (si->dma_rx_buff) in pxa_irda_stop()
865 dma_free_coherent(si->dev, IRDA_FRAME_SIZE_LIMIT, si->dma_tx_buff, si->dma_tx_buff_phy); in pxa_irda_stop()
866 if (si->dma_tx_buff) in pxa_irda_stop()
867 dma_free_coherent(si->dev, IRDA_FRAME_SIZE_LIMIT, si->dma_rx_buff, si->dma_rx_buff_phy); in pxa_irda_stop()
876 struct pxa_irda *si; in pxa_irda_suspend() local
879 si = netdev_priv(dev); in pxa_irda_suspend()
881 pxa_irda_shutdown(si); in pxa_irda_suspend()
890 struct pxa_irda *si; in pxa_irda_resume() local
893 si = netdev_priv(dev); in pxa_irda_resume()
894 pxa_irda_startup(si); in pxa_irda_resume()
926 struct pxa_irda *si; in pxa_irda_probe() local
955 si = netdev_priv(dev); in pxa_irda_probe()
956 si->dev = &pdev->dev; in pxa_irda_probe()
957 si->pdata = pdev->dev.platform_data; in pxa_irda_probe()
959 si->irda_base = ficp; in pxa_irda_probe()
960 si->stuart_base = stuart; in pxa_irda_probe()
961 si->uart_irq = platform_get_irq(pdev, 0); in pxa_irda_probe()
962 si->icp_irq = platform_get_irq(pdev, 1); in pxa_irda_probe()
964 si->sir_clk = devm_clk_get(&pdev->dev, "UARTCLK"); in pxa_irda_probe()
965 si->fir_clk = devm_clk_get(&pdev->dev, "FICPCLK"); in pxa_irda_probe()
966 if (IS_ERR(si->sir_clk) || IS_ERR(si->fir_clk)) { in pxa_irda_probe()
967 err = PTR_ERR(IS_ERR(si->sir_clk) ? si->sir_clk : si->fir_clk); in pxa_irda_probe()
973 si->drcmr_rx = res->start; in pxa_irda_probe()
976 si->drcmr_tx = res->start; in pxa_irda_probe()
981 err = pxa_irda_init_iobuf(&si->rx_buff, 14384); in pxa_irda_probe()
984 err = pxa_irda_init_iobuf(&si->tx_buff, 4000); in pxa_irda_probe()
988 if (gpio_is_valid(si->pdata->gpio_pwdown)) { in pxa_irda_probe()
989 err = gpio_request(si->pdata->gpio_pwdown, "IrDA switch"); in pxa_irda_probe()
992 err = gpio_direction_output(si->pdata->gpio_pwdown, in pxa_irda_probe()
993 !si->pdata->gpio_pwdown_inverted); in pxa_irda_probe()
995 gpio_free(si->pdata->gpio_pwdown); in pxa_irda_probe()
1000 if (si->pdata->startup) { in pxa_irda_probe()
1001 err = si->pdata->startup(si->dev); in pxa_irda_probe()
1006 if (gpio_is_valid(si->pdata->gpio_pwdown) && si->pdata->startup) in pxa_irda_probe()
1007 dev_warn(si->dev, "gpio_pwdown and startup() both defined!\n"); in pxa_irda_probe()
1011 irda_init_max_qos_capabilies(&si->qos); in pxa_irda_probe()
1014 if (si->pdata->transceiver_cap & IR_SIRMODE) in pxa_irda_probe()
1016 if (si->pdata->transceiver_cap & IR_FIRMODE) in pxa_irda_probe()
1019 si->qos.baud_rate.bits &= baudrate_mask; in pxa_irda_probe()
1020 si->qos.min_turn_time.bits = 7; /* 1ms or more */ in pxa_irda_probe()
1022 irda_qos_bits_to_value(&si->qos); in pxa_irda_probe()
1030 if (si->pdata->shutdown) in pxa_irda_probe()
1031 si->pdata->shutdown(si->dev); in pxa_irda_probe()
1033 kfree(si->tx_buff.head); in pxa_irda_probe()
1035 kfree(si->rx_buff.head); in pxa_irda_probe()
1048 struct pxa_irda *si = netdev_priv(dev); in pxa_irda_remove() local
1050 if (gpio_is_valid(si->pdata->gpio_pwdown)) in pxa_irda_remove()
1051 gpio_free(si->pdata->gpio_pwdown); in pxa_irda_remove()
1052 if (si->pdata->shutdown) in pxa_irda_remove()
1053 si->pdata->shutdown(si->dev); in pxa_irda_remove()
1054 kfree(si->tx_buff.head); in pxa_irda_remove()
1055 kfree(si->rx_buff.head); in pxa_irda_remove()