Lines Matching refs:si

131 static inline void pxa_irda_disable_clk(struct pxa_irda *si)  in pxa_irda_disable_clk()  argument
133 if (si->cur_clk) in pxa_irda_disable_clk()
134 clk_disable_unprepare(si->cur_clk); in pxa_irda_disable_clk()
135 si->cur_clk = NULL; in pxa_irda_disable_clk()
138 static inline void pxa_irda_enable_firclk(struct pxa_irda *si) in pxa_irda_enable_firclk() argument
140 si->cur_clk = si->fir_clk; in pxa_irda_enable_firclk()
141 clk_prepare_enable(si->fir_clk); in pxa_irda_enable_firclk()
144 static inline void pxa_irda_enable_sirclk(struct pxa_irda *si) in pxa_irda_enable_sirclk() argument
146 si->cur_clk = si->sir_clk; in pxa_irda_enable_sirclk()
147 clk_prepare_enable(si->sir_clk); in pxa_irda_enable_sirclk()
151 #define IS_FIR(si) ((si)->speed >= 4000000) argument
154 inline static void pxa_irda_fir_dma_rx_start(struct pxa_irda *si) in pxa_irda_fir_dma_rx_start() argument
156 DCSR(si->rxdma) = DCSR_NODESC; in pxa_irda_fir_dma_rx_start()
157 DSADR(si->rxdma) = __PREG(ICDR); in pxa_irda_fir_dma_rx_start()
158 DTADR(si->rxdma) = si->dma_rx_buff_phy; in pxa_irda_fir_dma_rx_start()
159 …DCMD(si->rxdma) = DCMD_INCTRGADDR | DCMD_FLOWSRC | DCMD_WIDTH1 | DCMD_BURST32 | IRDA_FRAME_SIZE_L… in pxa_irda_fir_dma_rx_start()
160 DCSR(si->rxdma) |= DCSR_RUN; in pxa_irda_fir_dma_rx_start()
163 inline static void pxa_irda_fir_dma_tx_start(struct pxa_irda *si) in pxa_irda_fir_dma_tx_start() argument
165 DCSR(si->txdma) = DCSR_NODESC; in pxa_irda_fir_dma_tx_start()
166 DSADR(si->txdma) = si->dma_tx_buff_phy; in pxa_irda_fir_dma_tx_start()
167 DTADR(si->txdma) = __PREG(ICDR); in pxa_irda_fir_dma_tx_start()
168 …DCMD(si->txdma) = DCMD_INCSRCADDR | DCMD_FLOWTRG | DCMD_ENDIRQEN | DCMD_WIDTH1 | DCMD_BURST32 | s… in pxa_irda_fir_dma_tx_start()
169 DCSR(si->txdma) |= DCSR_RUN; in pxa_irda_fir_dma_tx_start()
175 static void pxa_irda_set_mode(struct pxa_irda *si, int mode) in pxa_irda_set_mode() argument
177 if (si->pdata->transceiver_mode) in pxa_irda_set_mode()
178 si->pdata->transceiver_mode(si->dev, mode); in pxa_irda_set_mode()
180 if (gpio_is_valid(si->pdata->gpio_pwdown)) in pxa_irda_set_mode()
181 gpio_set_value(si->pdata->gpio_pwdown, in pxa_irda_set_mode()
183 !si->pdata->gpio_pwdown_inverted); in pxa_irda_set_mode()
184 pxa2xx_transceiver_mode(si->dev, mode); in pxa_irda_set_mode()
191 static int pxa_irda_set_speed(struct pxa_irda *si, int speed) in pxa_irda_set_speed() argument
206 if (IS_FIR(si)) { in pxa_irda_set_speed()
208 DCSR(si->rxdma) &= ~DCSR_RUN; in pxa_irda_set_speed()
211 pxa_irda_disable_clk(si); in pxa_irda_set_speed()
214 pxa_irda_set_mode(si, IR_SIRMODE); in pxa_irda_set_speed()
217 pxa_irda_enable_sirclk(si); in pxa_irda_set_speed()
229 si->speed = speed; in pxa_irda_set_speed()
242 pxa_irda_disable_clk(si); in pxa_irda_set_speed()
248 pxa_irda_set_mode(si, IR_FIRMODE); in pxa_irda_set_speed()
251 pxa_irda_enable_firclk(si); in pxa_irda_set_speed()
253 si->speed = speed; in pxa_irda_set_speed()
254 pxa_irda_fir_dma_rx_start(si); in pxa_irda_set_speed()
271 struct pxa_irda *si = netdev_priv(dev); in pxa_irda_sir_irq() local
291 &si->rx_buff, data); in pxa_irda_sir_irq()
295 si->last_oscr = readl_relaxed(OSCR); in pxa_irda_sir_irq()
304 async_unwrap_char(dev, &dev->stats, &si->rx_buff, STRBR); in pxa_irda_sir_irq()
306 si->last_oscr = readl_relaxed(OSCR); in pxa_irda_sir_irq()
310 while ((si->tx_buff.len) && (STLSR & LSR_TDRQ)) { in pxa_irda_sir_irq()
311 STTHR = *si->tx_buff.data++; in pxa_irda_sir_irq()
312 si->tx_buff.len -= 1; in pxa_irda_sir_irq()
315 if (si->tx_buff.len == 0) { in pxa_irda_sir_irq()
317 dev->stats.tx_bytes += si->tx_buff.data - si->tx_buff.head; in pxa_irda_sir_irq()
322 si->last_oscr = readl_relaxed(OSCR); in pxa_irda_sir_irq()
329 if (si->newspeed) { in pxa_irda_sir_irq()
330 pxa_irda_set_speed(si, si->newspeed); in pxa_irda_sir_irq()
331 si->newspeed = 0; in pxa_irda_sir_irq()
361 struct pxa_irda *si = netdev_priv(dev); in pxa_irda_fir_dma_tx_irq() local
369 dev->stats.tx_bytes += si->dma_tx_buff_len; in pxa_irda_fir_dma_tx_irq()
376 si->last_oscr = readl_relaxed(OSCR); in pxa_irda_fir_dma_tx_irq()
384 if (si->newspeed) { in pxa_irda_fir_dma_tx_irq()
385 pxa_irda_set_speed(si, si->newspeed); in pxa_irda_fir_dma_tx_irq()
386 si->newspeed = 0; in pxa_irda_fir_dma_tx_irq()
391 pxa_irda_fir_dma_rx_start(si); in pxa_irda_fir_dma_tx_irq()
403 static void pxa_irda_fir_irq_eif(struct pxa_irda *si, struct net_device *dev, int icsr0) in pxa_irda_fir_irq_eif() argument
408 len = DTADR(si->rxdma) - si->dma_rx_buff_phy; in pxa_irda_fir_irq_eif()
427 si->dma_rx_buff[len++] = data; in pxa_irda_fir_irq_eif()
453 skb_copy_to_linear_data(skb, si->dma_rx_buff, len); in pxa_irda_fir_irq_eif()
471 struct pxa_irda *si = netdev_priv(dev); in pxa_irda_fir_irq() local
475 DCSR(si->rxdma) &= ~DCSR_RUN; in pxa_irda_fir_irq()
476 si->last_oscr = readl_relaxed(OSCR); in pxa_irda_fir_irq()
492 pxa_irda_fir_irq_eif(si, dev, icsr0); in pxa_irda_fir_irq()
496 pxa_irda_fir_dma_rx_start(si); in pxa_irda_fir_irq()
510 struct pxa_irda *si = netdev_priv(dev); in pxa_irda_hard_xmit() local
518 if (speed != si->speed && speed != -1) in pxa_irda_hard_xmit()
519 si->newspeed = speed; in pxa_irda_hard_xmit()
525 if (si->newspeed) { in pxa_irda_hard_xmit()
526 si->newspeed = 0; in pxa_irda_hard_xmit()
527 pxa_irda_set_speed(si, speed); in pxa_irda_hard_xmit()
535 if (!IS_FIR(si)) { in pxa_irda_hard_xmit()
536 si->tx_buff.data = si->tx_buff.head; in pxa_irda_hard_xmit()
537 si->tx_buff.len = async_wrap_skb(skb, si->tx_buff.data, si->tx_buff.truesize); in pxa_irda_hard_xmit()
548 si->dma_tx_buff_len = skb->len; in pxa_irda_hard_xmit()
549 skb_copy_from_linear_data(skb, si->dma_tx_buff, skb->len); in pxa_irda_hard_xmit()
552 while ((unsigned)(readl_relaxed(OSCR) - si->last_oscr)/4 < mtt) in pxa_irda_hard_xmit()
556 DCSR(si->rxdma) &= ~DCSR_RUN; in pxa_irda_hard_xmit()
559 pxa_irda_fir_dma_tx_start(si); in pxa_irda_hard_xmit()
570 struct pxa_irda *si = netdev_priv(dev); in pxa_irda_ioctl() local
582 ret = pxa_irda_set_speed(si, in pxa_irda_ioctl()
601 rq->ifr_receiving = IS_FIR(si) ? 0 in pxa_irda_ioctl()
602 : si->rx_buff.state != OUTSIDE_FRAME; in pxa_irda_ioctl()
613 static void pxa_irda_startup(struct pxa_irda *si) in pxa_irda_startup() argument
630 DRCMR(17) = si->rxdma | DRCMR_MAPVLD; in pxa_irda_startup()
631 DRCMR(18) = si->txdma | DRCMR_MAPVLD; in pxa_irda_startup()
634 si->speed = 4000000; in pxa_irda_startup()
635 pxa_irda_set_speed(si, 9600); in pxa_irda_startup()
640 static void pxa_irda_shutdown(struct pxa_irda *si) in pxa_irda_shutdown() argument
652 DCSR(si->txdma) &= ~DCSR_RUN; in pxa_irda_shutdown()
653 DCSR(si->rxdma) &= ~DCSR_RUN; in pxa_irda_shutdown()
658 pxa_irda_disable_clk(si); in pxa_irda_shutdown()
666 pxa_irda_set_mode(si, IR_OFF); in pxa_irda_shutdown()
673 struct pxa_irda *si = netdev_priv(dev); in pxa_irda_start() local
676 si->speed = 9600; in pxa_irda_start()
678 err = request_irq(si->uart_irq, pxa_irda_sir_irq, 0, dev->name, dev); in pxa_irda_start()
682 err = request_irq(si->icp_irq, pxa_irda_fir_irq, 0, dev->name, dev); in pxa_irda_start()
689 disable_irq(si->uart_irq); in pxa_irda_start()
690 disable_irq(si->icp_irq); in pxa_irda_start()
693 si->rxdma = pxa_request_dma("FICP_RX",DMA_PRIO_LOW, pxa_irda_fir_dma_rx_irq, dev); in pxa_irda_start()
694 if (si->rxdma < 0) in pxa_irda_start()
697 si->txdma = pxa_request_dma("FICP_TX",DMA_PRIO_LOW, pxa_irda_fir_dma_tx_irq, dev); in pxa_irda_start()
698 if (si->txdma < 0) in pxa_irda_start()
702 si->dma_rx_buff = dma_alloc_coherent(si->dev, IRDA_FRAME_SIZE_LIMIT, in pxa_irda_start()
703 &si->dma_rx_buff_phy, GFP_KERNEL); in pxa_irda_start()
704 if (!si->dma_rx_buff) in pxa_irda_start()
707 si->dma_tx_buff = dma_alloc_coherent(si->dev, IRDA_FRAME_SIZE_LIMIT, in pxa_irda_start()
708 &si->dma_tx_buff_phy, GFP_KERNEL); in pxa_irda_start()
709 if (!si->dma_tx_buff) in pxa_irda_start()
713 pxa_irda_startup(si); in pxa_irda_start()
718 si->irlap = irlap_open(dev, &si->qos, "pxa"); in pxa_irda_start()
720 if (!si->irlap) in pxa_irda_start()
726 enable_irq(si->uart_irq); in pxa_irda_start()
727 enable_irq(si->icp_irq); in pxa_irda_start()
735 pxa_irda_shutdown(si); in pxa_irda_start()
736 dma_free_coherent(si->dev, IRDA_FRAME_SIZE_LIMIT, si->dma_tx_buff, si->dma_tx_buff_phy); in pxa_irda_start()
738 dma_free_coherent(si->dev, IRDA_FRAME_SIZE_LIMIT, si->dma_rx_buff, si->dma_rx_buff_phy); in pxa_irda_start()
740 pxa_free_dma(si->txdma); in pxa_irda_start()
742 pxa_free_dma(si->rxdma); in pxa_irda_start()
744 free_irq(si->icp_irq, dev); in pxa_irda_start()
746 free_irq(si->uart_irq, dev); in pxa_irda_start()
754 struct pxa_irda *si = netdev_priv(dev); in pxa_irda_stop() local
758 pxa_irda_shutdown(si); in pxa_irda_stop()
761 if (si->irlap) { in pxa_irda_stop()
762 irlap_close(si->irlap); in pxa_irda_stop()
763 si->irlap = NULL; in pxa_irda_stop()
766 free_irq(si->uart_irq, dev); in pxa_irda_stop()
767 free_irq(si->icp_irq, dev); in pxa_irda_stop()
769 pxa_free_dma(si->rxdma); in pxa_irda_stop()
770 pxa_free_dma(si->txdma); in pxa_irda_stop()
772 if (si->dma_rx_buff) in pxa_irda_stop()
773 dma_free_coherent(si->dev, IRDA_FRAME_SIZE_LIMIT, si->dma_tx_buff, si->dma_tx_buff_phy); in pxa_irda_stop()
774 if (si->dma_tx_buff) in pxa_irda_stop()
775 dma_free_coherent(si->dev, IRDA_FRAME_SIZE_LIMIT, si->dma_rx_buff, si->dma_rx_buff_phy); in pxa_irda_stop()
784 struct pxa_irda *si; in pxa_irda_suspend() local
787 si = netdev_priv(dev); in pxa_irda_suspend()
789 pxa_irda_shutdown(si); in pxa_irda_suspend()
798 struct pxa_irda *si; in pxa_irda_resume() local
801 si = netdev_priv(dev); in pxa_irda_resume()
802 pxa_irda_startup(si); in pxa_irda_resume()
833 struct pxa_irda *si; in pxa_irda_probe() local
855 si = netdev_priv(dev); in pxa_irda_probe()
856 si->dev = &pdev->dev; in pxa_irda_probe()
857 si->pdata = pdev->dev.platform_data; in pxa_irda_probe()
859 si->uart_irq = platform_get_irq(pdev, 0); in pxa_irda_probe()
860 si->icp_irq = platform_get_irq(pdev, 1); in pxa_irda_probe()
862 si->sir_clk = clk_get(&pdev->dev, "UARTCLK"); in pxa_irda_probe()
863 si->fir_clk = clk_get(&pdev->dev, "FICPCLK"); in pxa_irda_probe()
864 if (IS_ERR(si->sir_clk) || IS_ERR(si->fir_clk)) { in pxa_irda_probe()
865 err = PTR_ERR(IS_ERR(si->sir_clk) ? si->sir_clk : si->fir_clk); in pxa_irda_probe()
872 err = pxa_irda_init_iobuf(&si->rx_buff, 14384); in pxa_irda_probe()
875 err = pxa_irda_init_iobuf(&si->tx_buff, 4000); in pxa_irda_probe()
879 if (gpio_is_valid(si->pdata->gpio_pwdown)) { in pxa_irda_probe()
880 err = gpio_request(si->pdata->gpio_pwdown, "IrDA switch"); in pxa_irda_probe()
883 err = gpio_direction_output(si->pdata->gpio_pwdown, in pxa_irda_probe()
884 !si->pdata->gpio_pwdown_inverted); in pxa_irda_probe()
886 gpio_free(si->pdata->gpio_pwdown); in pxa_irda_probe()
891 if (si->pdata->startup) { in pxa_irda_probe()
892 err = si->pdata->startup(si->dev); in pxa_irda_probe()
897 if (gpio_is_valid(si->pdata->gpio_pwdown) && si->pdata->startup) in pxa_irda_probe()
898 dev_warn(si->dev, "gpio_pwdown and startup() both defined!\n"); in pxa_irda_probe()
902 irda_init_max_qos_capabilies(&si->qos); in pxa_irda_probe()
905 if (si->pdata->transceiver_cap & IR_SIRMODE) in pxa_irda_probe()
907 if (si->pdata->transceiver_cap & IR_FIRMODE) in pxa_irda_probe()
910 si->qos.baud_rate.bits &= baudrate_mask; in pxa_irda_probe()
911 si->qos.min_turn_time.bits = 7; /* 1ms or more */ in pxa_irda_probe()
913 irda_qos_bits_to_value(&si->qos); in pxa_irda_probe()
921 if (si->pdata->shutdown) in pxa_irda_probe()
922 si->pdata->shutdown(si->dev); in pxa_irda_probe()
924 kfree(si->tx_buff.head); in pxa_irda_probe()
926 kfree(si->rx_buff.head); in pxa_irda_probe()
928 if (si->sir_clk && !IS_ERR(si->sir_clk)) in pxa_irda_probe()
929 clk_put(si->sir_clk); in pxa_irda_probe()
930 if (si->fir_clk && !IS_ERR(si->fir_clk)) in pxa_irda_probe()
931 clk_put(si->fir_clk); in pxa_irda_probe()
947 struct pxa_irda *si = netdev_priv(dev); in pxa_irda_remove() local
949 if (gpio_is_valid(si->pdata->gpio_pwdown)) in pxa_irda_remove()
950 gpio_free(si->pdata->gpio_pwdown); in pxa_irda_remove()
951 if (si->pdata->shutdown) in pxa_irda_remove()
952 si->pdata->shutdown(si->dev); in pxa_irda_remove()
953 kfree(si->tx_buff.head); in pxa_irda_remove()
954 kfree(si->rx_buff.head); in pxa_irda_remove()
955 clk_put(si->fir_clk); in pxa_irda_remove()
956 clk_put(si->sir_clk); in pxa_irda_remove()