]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/commitdiff
[PATCH] ARM: OMAP: IrDA: Update
authorKomal Shah <komal_shah802003@yahoo.com>
Fri, 3 Mar 2006 19:39:40 +0000 (11:39 -0800)
committerTony Lindgren <tony@atomide.com>
Fri, 3 Mar 2006 19:39:40 +0000 (11:39 -0800)
Move dma related parameters to platform data and also
few more cosmetic changes.

Signed-off-by: Komal Shah <komal_shah802003@yahoo.com>
Signed-off-by: Tony Lindgren <tony@atomide.com>
arch/arm/mach-omap1/board-h2.c
arch/arm/mach-omap1/board-h3.c
arch/arm/mach-omap2/board-h4.c
drivers/net/irda/omap-ir.c
include/asm-arm/arch-omap/irda.h

index cae38740ee125101ece079b1dff8b8465388ee17..4364d51ebd6d37ff80ccdd8dcc2c797e8c7aee58 100644 (file)
@@ -40,6 +40,7 @@
 #include <asm/arch/irda.h>
 #include <asm/arch/usb.h>
 #include <asm/arch/keypad.h>
+#include <asm/arch/dma.h>
 #include <asm/arch/common.h>
 
 extern int omap_gpio_init(void);
@@ -254,6 +255,12 @@ static int h2_transceiver_mode(struct device *dev, int state)
 
 static struct omap_irda_config h2_irda_data = {
        .transceiver_cap        = IR_SIRMODE | IR_MIRMODE | IR_FIRMODE,
+       .rx_channel             = OMAP_DMA_UART3_RX,
+       .tx_channel             = OMAP_DMA_UART3_TX,
+       .dest_start             = UART3_THR,
+       .src_start              = UART3_RHR,
+       .tx_trigger             = 0,
+       .rx_trigger             = 0,
 };
 
 static struct resource h2_irda_resources[] = {
index 96528226b30095d923d9cf0f1b0301429d32b40d..4b8d0ec73cb76621f55add6719fc999c02a19b8e 100644 (file)
@@ -43,6 +43,7 @@
 #include <asm/arch/irda.h>
 #include <asm/arch/usb.h>
 #include <asm/arch/keypad.h>
+#include <asm/arch/dma.h>
 #include <asm/arch/common.h>
 
 extern int omap_gpio_init(void);
@@ -329,6 +330,12 @@ static struct omap_irda_config h3_irda_data = {
        .transceiver_cap        = IR_SIRMODE | IR_MIRMODE | IR_FIRMODE,
        .transceiver_mode       = h3_transceiver_mode,
        .select_irda            = h3_select_irda,
+       .rx_channel             = OMAP_DMA_UART3_RX,
+       .tx_channel             = OMAP_DMA_UART3_TX,
+       .dest_start             = UART3_THR,
+       .src_start              = UART3_RHR,
+       .tx_trigger             = 0,
+       .rx_trigger             = 0,
 };
 
 static struct resource h3_irda_resources[] = {
index 913ab3d24cd804bfb65c9393a071470ee6b8bec6..4933fce766c8269569b3e4f8bec8843e5c987916 100644 (file)
@@ -35,6 +35,7 @@
 #include <asm/arch/common.h>
 #include <asm/arch/keypad.h>
 #include <asm/arch/menelaus.h>
+#include <asm/arch/dma.h>
 #include "prcm-regs.h"
 
 #include <asm/io.h>
@@ -214,6 +215,12 @@ static struct omap_irda_config h4_irda_data = {
        .transceiver_cap        = IR_SIRMODE | IR_MIRMODE | IR_FIRMODE,
        .transceiver_mode       = h4_transceiver_mode,
        .select_irda            = h4_select_irda,
+       .rx_channel             = OMAP24XX_DMA_UART3_RX,
+       .tx_channel             = OMAP24XX_DMA_UART3_TX,
+       .dest_start             = OMAP_UART3_BASE,
+       .src_start              = OMAP_UART3_BASE,
+       .tx_trigger             = OMAP24XX_DMA_UART3_TX,
+       .rx_trigger             = OMAP24XX_DMA_UART3_RX,
 };
 
 static struct resource h4_irda_resources[] = {
index 5b0b556b4e57c5db665968e1e6eaa8ab6386594b..c2b87811b5b53dd7ae2033c994efb9b99592684e 100644 (file)
@@ -157,21 +157,9 @@ static int omap_irda_set_speed(struct net_device *dev, int speed);
 
 static void omap_irda_start_rx_dma(struct omap_irda *si)
 {
-       /* default for h2/h3 */
-       unsigned long src_start = 0xfffb9800;
-       unsigned int trigger = 0;
-
-       if (machine_is_omap_h2() || machine_is_omap_h3()) {
-               src_start = UART3_RHR;
-               trigger = 0;
-       }
-       if (machine_is_omap_h4()) {
-               src_start = OMAP_UART3_BASE;
-               trigger = OMAP24XX_DMA_UART3_RX;
-       }
-
        /* Configure DMA */
-       omap_set_dma_src_params(si->rx_dma_channel, 0x3, 0x0, src_start,
+       omap_set_dma_src_params(si->rx_dma_channel, 0x3, 0x0,
+                               si->pdata->src_start,
                                0, 0);
 
        omap_enable_dma_irq(si->rx_dma_channel, 0x01);
@@ -182,29 +170,17 @@ static void omap_irda_start_rx_dma(struct omap_irda *si)
 
        omap_set_dma_transfer_params(si->rx_dma_channel, 0x0,
                                IRDA_FRAME_SIZE_LIMIT, 0x1,
-                               0x0, trigger, 0);
+                               0x0, si->pdata->rx_trigger, 0);
 
        omap_start_dma(si->rx_dma_channel);
 }
 
 static void omap_start_tx_dma(struct omap_irda *si, int size)
 {
-       /* default for h2/h3 */
-       unsigned long dest_start = 0xfffb9800;
-       unsigned int trigger = 0;
-
-       if (machine_is_omap_h2() || machine_is_omap_h3()) {
-               dest_start = UART3_THR;
-               trigger = 0;
-       }
-       if (machine_is_omap_h4()) {
-               dest_start = OMAP_UART3_BASE;
-               trigger = OMAP24XX_DMA_UART3_TX;
-       }
-
        /* Configure DMA */
        omap_set_dma_dest_params(si->tx_dma_channel, 0x03, 0x0,
-                               dest_start, 0, 0);
+                               si->pdata->dest_start, 0, 0);
+
        omap_enable_dma_irq(si->tx_dma_channel, 0x01);
 
        omap_set_dma_src_params(si->tx_dma_channel, 0x0, 0x1,
@@ -212,7 +188,7 @@ static void omap_start_tx_dma(struct omap_irda *si, int size)
                                0, 0);
 
        omap_set_dma_transfer_params(si->tx_dma_channel, 0x0, size, 0x1,
-                               0x0, trigger, 0);
+                               0x0, si->pdata->tx_trigger, 0);
 
        /* Start DMA */
        omap_start_dma(si->tx_dma_channel);
@@ -454,10 +430,8 @@ static int omap_irda_hard_xmit(struct sk_buff *skb, struct net_device *dev)
        if (speed != si->speed && speed != -1)
                si->newspeed = speed;
 
-       if (xbofs) {
-               /* Set number of addtional BOFS */
+       if (xbofs) /* Set number of addtional BOFS */
                uart_reg_out(UART3_EBLR, xbofs + 1);
-       }
 
        /*
         * If this is an empty frame, we can bypass a lot.
@@ -514,10 +488,10 @@ omap_irda_ioctl(struct net_device *dev, struct ifreq *ifreq, int cmd)
                         * We are unable to set the speed if the
                         * device is not running.
                         */
-                       if (si->open) {
+                       if (si->open)
                                ret = omap_irda_set_speed(dev,
                                                rq->ifr_baudrate);
-                       else {
+                       else {
                                printk(KERN_ERR "omap_irda_ioctl: SIOCSBANDWIDTH: !netif_running\n");
                                ret = 0;
                        }
@@ -553,8 +527,6 @@ static int omap_irda_start(struct net_device *dev)
 {
        struct omap_irda *si = dev->priv;
        int err;
-       int rx_channel = OMAP_DMA_NO_DEVICE;
-       int tx_channel = OMAP_DMA_NO_DEVICE;
 
        si->speed = 9600;
 
@@ -567,27 +539,15 @@ static int omap_irda_start(struct net_device *dev)
         */
        disable_irq(dev->irq);
 
-       /* FIXME: These info can come from board-* files, if no one
-        * objects
-        */
-       if (machine_is_omap_h2() || machine_is_omap_h3()) {
-               rx_channel = OMAP_DMA_UART3_RX;
-               tx_channel = OMAP_DMA_UART3_TX;
-       }
-       if (machine_is_omap_h4()) {
-               rx_channel = OMAP24XX_DMA_UART3_RX;
-               tx_channel = OMAP24XX_DMA_UART3_TX;
-       }
-
        /*  Request DMA channels for IrDA hardware */
-       if (omap_request_dma(rx_channel, "IrDA Rx DMA",
+       if (omap_request_dma(si->pdata->rx_channel, "IrDA Rx DMA",
                        (void *)omap_irda_rx_dma_callback,
                        dev, &(si->rx_dma_channel))) {
                printk(KERN_ERR "Failed to request IrDA Rx DMA\n");
                goto err_irq;
        }
 
-       if (omap_request_dma(tx_channel, "IrDA Tx DMA",
+       if (omap_request_dma(si->pdata->tx_channel, "IrDA Tx DMA",
                        (void *)omap_irda_tx_dma_callback,
                        dev, &(si->tx_dma_channel))) {
                printk(KERN_ERR "Failed to request IrDA Tx DMA\n");
@@ -600,11 +560,21 @@ static int omap_irda_start(struct net_device *dev)
                                &(si->rx_buf_dma_phys),
                                GFP_KERNEL);
 
+       if (!si->rx_buf_dma_virt) {
+               printk(KERN_ERR "Unable to allocate memory for rx_buf_dma\n");
+               goto err_irq;
+       }
+
        si->tx_buf_dma_virt =
                dma_alloc_coherent(NULL, IRDA_FRAME_SIZE_LIMIT,
                                &(si->tx_buf_dma_phys),
                                GFP_KERNEL);
 
+       if (!si->tx_buf_dma_virt) {
+               printk(KERN_ERR "Unable to allocate memory for tx_buf_dma\n");
+               goto err_mem1;
+       }
+
        /*
         * Setup the serial port for the specified config.
         */
@@ -642,6 +612,11 @@ err_irlap:
        si->open = 0;
        omap_irda_shutdown(si);
 err_startup:
+       dma_free_coherent(NULL, IRDA_FRAME_SIZE_LIMIT,
+                       si->tx_buf_dma_virt, si->tx_buf_dma_phys);
+err_mem1:
+       dma_free_coherent(NULL, IRDA_FRAME_SIZE_LIMIT,
+                       si->rx_buf_dma_virt, si->rx_buf_dma_phys);
 err_irq:
        free_irq(dev->irq, dev);
        return err;
@@ -819,18 +794,20 @@ static int omap_irda_probe(struct platform_device *pdev)
 {
        struct net_device *dev;
        struct omap_irda *si;
+       struct omap_irda_config *pdata = pdev->dev.platform_data;
        unsigned int baudrate_mask;
        int err = 0;
        int irq = NO_IRQ;
 
-       if (!pdev->dev.platform_data) {
+       if (!pdata) {
                printk(KERN_ERR "IrDA Platform data not supplied\n");
                return -ENOENT;
        }
 
-       dev = alloc_irdadev(sizeof(struct omap_irda));
-       if (!dev)
-               goto err_mem_1;
+       if (!pdata->rx_channel || !pdata->tx_channel) {
+               printk(KERN_ERR "IrDA invalid rx/tx channel value\n");
+               return -ENOENT;
+       }
 
        irq = platform_get_irq(pdev, 0);
        if (irq <= 0) {
@@ -838,9 +815,14 @@ static int omap_irda_probe(struct platform_device *pdev)
                return -ENOENT;
        }
 
+       dev = alloc_irdadev(sizeof(struct omap_irda));
+       if (!dev)
+               goto err_mem_1;
+
+
        si = dev->priv;
        si->dev = &pdev->dev;
-       si->pdata = pdev->dev.platform_data;
+       si->pdata = pdata;
 
        dev->hard_start_xmit    = omap_irda_hard_xmit;
        dev->open               = omap_irda_start;
@@ -865,9 +847,8 @@ static int omap_irda_probe(struct platform_device *pdev)
        irda_qos_bits_to_value(&si->qos);
 
        /* Any better way to avoid this? No. */
-       if (machine_is_omap_h3() || machine_is_omap_h4()) {
+       if (machine_is_omap_h3() || machine_is_omap_h4())
                INIT_WORK(&si->pdata->gpio_expa, NULL, NULL);
-       }
 
        err = register_netdev(dev);
        if (!err)
@@ -900,7 +881,7 @@ static struct platform_driver omapir_driver = {
        },
 };
 
-static char __initdata banner[] = KERN_INFO "OMAP IrDA driver\n";
+static char __initdata banner[] = KERN_INFO "OMAP IrDA driver initializing\n";
 
 static int __init omap_irda_init(void)
 {
index ad71e4b56d9f3e0b196f28ae481874ad8d2046b0..805ae3575e44cf76048a2203fc77940c66e16c0c 100644 (file)
@@ -1,7 +1,7 @@
 /*
  *  linux/include/asm-arm/arch-omap/irda.h
  *
- *  Copyright (C) 2005 Komal Shah <komal_shah802003@yahoo.com>
+ *  Copyright (C) 2005-2006 Komal Shah <komal_shah802003@yahoo.com>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 as
@@ -25,6 +25,12 @@ struct omap_irda_config {
         * having calls which can sleep in irda_set_speed.
         */
        struct work_struct gpio_expa;
+       int rx_channel;
+       int tx_channel;
+       unsigned long dest_start;
+       unsigned long src_start;
+       int tx_trigger;
+       int rx_trigger;
 };
 
 #endif