Commit e9582e0d authored by Komal Shah's avatar Komal Shah Committed by Tony Lindgren

[PATCH] ARM: OMAP: IrDA: Update

Move dma related parameters to platform data and also
few more cosmetic changes.
Signed-off-by: default avatarKomal Shah <komal_shah802003@yahoo.com>
Signed-off-by: default avatarTony Lindgren <tony@atomide.com>
parent 640be08d
...@@ -40,6 +40,7 @@ ...@@ -40,6 +40,7 @@
#include <asm/arch/irda.h> #include <asm/arch/irda.h>
#include <asm/arch/usb.h> #include <asm/arch/usb.h>
#include <asm/arch/keypad.h> #include <asm/arch/keypad.h>
#include <asm/arch/dma.h>
#include <asm/arch/common.h> #include <asm/arch/common.h>
extern int omap_gpio_init(void); extern int omap_gpio_init(void);
...@@ -254,6 +255,12 @@ static int h2_transceiver_mode(struct device *dev, int state) ...@@ -254,6 +255,12 @@ static int h2_transceiver_mode(struct device *dev, int state)
static struct omap_irda_config h2_irda_data = { static struct omap_irda_config h2_irda_data = {
.transceiver_cap = IR_SIRMODE | IR_MIRMODE | IR_FIRMODE, .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[] = { static struct resource h2_irda_resources[] = {
......
...@@ -43,6 +43,7 @@ ...@@ -43,6 +43,7 @@
#include <asm/arch/irda.h> #include <asm/arch/irda.h>
#include <asm/arch/usb.h> #include <asm/arch/usb.h>
#include <asm/arch/keypad.h> #include <asm/arch/keypad.h>
#include <asm/arch/dma.h>
#include <asm/arch/common.h> #include <asm/arch/common.h>
extern int omap_gpio_init(void); extern int omap_gpio_init(void);
...@@ -329,6 +330,12 @@ static struct omap_irda_config h3_irda_data = { ...@@ -329,6 +330,12 @@ static struct omap_irda_config h3_irda_data = {
.transceiver_cap = IR_SIRMODE | IR_MIRMODE | IR_FIRMODE, .transceiver_cap = IR_SIRMODE | IR_MIRMODE | IR_FIRMODE,
.transceiver_mode = h3_transceiver_mode, .transceiver_mode = h3_transceiver_mode,
.select_irda = h3_select_irda, .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[] = { static struct resource h3_irda_resources[] = {
......
...@@ -35,6 +35,7 @@ ...@@ -35,6 +35,7 @@
#include <asm/arch/common.h> #include <asm/arch/common.h>
#include <asm/arch/keypad.h> #include <asm/arch/keypad.h>
#include <asm/arch/menelaus.h> #include <asm/arch/menelaus.h>
#include <asm/arch/dma.h>
#include "prcm-regs.h" #include "prcm-regs.h"
#include <asm/io.h> #include <asm/io.h>
...@@ -214,6 +215,12 @@ static struct omap_irda_config h4_irda_data = { ...@@ -214,6 +215,12 @@ static struct omap_irda_config h4_irda_data = {
.transceiver_cap = IR_SIRMODE | IR_MIRMODE | IR_FIRMODE, .transceiver_cap = IR_SIRMODE | IR_MIRMODE | IR_FIRMODE,
.transceiver_mode = h4_transceiver_mode, .transceiver_mode = h4_transceiver_mode,
.select_irda = h4_select_irda, .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[] = { static struct resource h4_irda_resources[] = {
......
...@@ -157,21 +157,9 @@ static int omap_irda_set_speed(struct net_device *dev, int speed); ...@@ -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) 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 */ /* 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); 0, 0);
omap_enable_dma_irq(si->rx_dma_channel, 0x01); omap_enable_dma_irq(si->rx_dma_channel, 0x01);
...@@ -182,29 +170,17 @@ static void omap_irda_start_rx_dma(struct omap_irda *si) ...@@ -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, omap_set_dma_transfer_params(si->rx_dma_channel, 0x0,
IRDA_FRAME_SIZE_LIMIT, 0x1, IRDA_FRAME_SIZE_LIMIT, 0x1,
0x0, trigger, 0); 0x0, si->pdata->rx_trigger, 0);
omap_start_dma(si->rx_dma_channel); omap_start_dma(si->rx_dma_channel);
} }
static void omap_start_tx_dma(struct omap_irda *si, int size) 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 */ /* Configure DMA */
omap_set_dma_dest_params(si->tx_dma_channel, 0x03, 0x0, 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_enable_dma_irq(si->tx_dma_channel, 0x01);
omap_set_dma_src_params(si->tx_dma_channel, 0x0, 0x1, 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) ...@@ -212,7 +188,7 @@ static void omap_start_tx_dma(struct omap_irda *si, int size)
0, 0); 0, 0);
omap_set_dma_transfer_params(si->tx_dma_channel, 0x0, size, 0x1, omap_set_dma_transfer_params(si->tx_dma_channel, 0x0, size, 0x1,
0x0, trigger, 0); 0x0, si->pdata->tx_trigger, 0);
/* Start DMA */ /* Start DMA */
omap_start_dma(si->tx_dma_channel); 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) ...@@ -454,10 +430,8 @@ static int omap_irda_hard_xmit(struct sk_buff *skb, struct net_device *dev)
if (speed != si->speed && speed != -1) if (speed != si->speed && speed != -1)
si->newspeed = speed; si->newspeed = speed;
if (xbofs) { if (xbofs) /* Set number of addtional BOFS */
/* Set number of addtional BOFS */
uart_reg_out(UART3_EBLR, xbofs + 1); uart_reg_out(UART3_EBLR, xbofs + 1);
}
/* /*
* If this is an empty frame, we can bypass a lot. * 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) ...@@ -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 * We are unable to set the speed if the
* device is not running. * device is not running.
*/ */
if (si->open) { if (si->open)
ret = omap_irda_set_speed(dev, ret = omap_irda_set_speed(dev,
rq->ifr_baudrate); rq->ifr_baudrate);
} else { else {
printk(KERN_ERR "omap_irda_ioctl: SIOCSBANDWIDTH: !netif_running\n"); printk(KERN_ERR "omap_irda_ioctl: SIOCSBANDWIDTH: !netif_running\n");
ret = 0; ret = 0;
} }
...@@ -553,8 +527,6 @@ static int omap_irda_start(struct net_device *dev) ...@@ -553,8 +527,6 @@ static int omap_irda_start(struct net_device *dev)
{ {
struct omap_irda *si = dev->priv; struct omap_irda *si = dev->priv;
int err; int err;
int rx_channel = OMAP_DMA_NO_DEVICE;
int tx_channel = OMAP_DMA_NO_DEVICE;
si->speed = 9600; si->speed = 9600;
...@@ -567,27 +539,15 @@ static int omap_irda_start(struct net_device *dev) ...@@ -567,27 +539,15 @@ static int omap_irda_start(struct net_device *dev)
*/ */
disable_irq(dev->irq); 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 */ /* 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, (void *)omap_irda_rx_dma_callback,
dev, &(si->rx_dma_channel))) { dev, &(si->rx_dma_channel))) {
printk(KERN_ERR "Failed to request IrDA Rx DMA\n"); printk(KERN_ERR "Failed to request IrDA Rx DMA\n");
goto err_irq; 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, (void *)omap_irda_tx_dma_callback,
dev, &(si->tx_dma_channel))) { dev, &(si->tx_dma_channel))) {
printk(KERN_ERR "Failed to request IrDA Tx DMA\n"); printk(KERN_ERR "Failed to request IrDA Tx DMA\n");
...@@ -600,11 +560,21 @@ static int omap_irda_start(struct net_device *dev) ...@@ -600,11 +560,21 @@ static int omap_irda_start(struct net_device *dev)
&(si->rx_buf_dma_phys), &(si->rx_buf_dma_phys),
GFP_KERNEL); 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 = si->tx_buf_dma_virt =
dma_alloc_coherent(NULL, IRDA_FRAME_SIZE_LIMIT, dma_alloc_coherent(NULL, IRDA_FRAME_SIZE_LIMIT,
&(si->tx_buf_dma_phys), &(si->tx_buf_dma_phys),
GFP_KERNEL); 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. * Setup the serial port for the specified config.
*/ */
...@@ -642,6 +612,11 @@ err_irlap: ...@@ -642,6 +612,11 @@ err_irlap:
si->open = 0; si->open = 0;
omap_irda_shutdown(si); omap_irda_shutdown(si);
err_startup: 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: err_irq:
free_irq(dev->irq, dev); free_irq(dev->irq, dev);
return err; return err;
...@@ -819,18 +794,20 @@ static int omap_irda_probe(struct platform_device *pdev) ...@@ -819,18 +794,20 @@ static int omap_irda_probe(struct platform_device *pdev)
{ {
struct net_device *dev; struct net_device *dev;
struct omap_irda *si; struct omap_irda *si;
struct omap_irda_config *pdata = pdev->dev.platform_data;
unsigned int baudrate_mask; unsigned int baudrate_mask;
int err = 0; int err = 0;
int irq = NO_IRQ; int irq = NO_IRQ;
if (!pdev->dev.platform_data) { if (!pdata) {
printk(KERN_ERR "IrDA Platform data not supplied\n"); printk(KERN_ERR "IrDA Platform data not supplied\n");
return -ENOENT; return -ENOENT;
} }
dev = alloc_irdadev(sizeof(struct omap_irda)); if (!pdata->rx_channel || !pdata->tx_channel) {
if (!dev) printk(KERN_ERR "IrDA invalid rx/tx channel value\n");
goto err_mem_1; return -ENOENT;
}
irq = platform_get_irq(pdev, 0); irq = platform_get_irq(pdev, 0);
if (irq <= 0) { if (irq <= 0) {
...@@ -838,9 +815,14 @@ static int omap_irda_probe(struct platform_device *pdev) ...@@ -838,9 +815,14 @@ static int omap_irda_probe(struct platform_device *pdev)
return -ENOENT; return -ENOENT;
} }
dev = alloc_irdadev(sizeof(struct omap_irda));
if (!dev)
goto err_mem_1;
si = dev->priv; si = dev->priv;
si->dev = &pdev->dev; si->dev = &pdev->dev;
si->pdata = pdev->dev.platform_data; si->pdata = pdata;
dev->hard_start_xmit = omap_irda_hard_xmit; dev->hard_start_xmit = omap_irda_hard_xmit;
dev->open = omap_irda_start; dev->open = omap_irda_start;
...@@ -865,9 +847,8 @@ static int omap_irda_probe(struct platform_device *pdev) ...@@ -865,9 +847,8 @@ static int omap_irda_probe(struct platform_device *pdev)
irda_qos_bits_to_value(&si->qos); irda_qos_bits_to_value(&si->qos);
/* Any better way to avoid this? No. */ /* 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); INIT_WORK(&si->pdata->gpio_expa, NULL, NULL);
}
err = register_netdev(dev); err = register_netdev(dev);
if (!err) if (!err)
...@@ -900,7 +881,7 @@ static struct platform_driver omapir_driver = { ...@@ -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) static int __init omap_irda_init(void)
{ {
......
/* /*
* linux/include/asm-arm/arch-omap/irda.h * 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 * 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 * it under the terms of the GNU General Public License version 2 as
...@@ -25,6 +25,12 @@ struct omap_irda_config { ...@@ -25,6 +25,12 @@ struct omap_irda_config {
* having calls which can sleep in irda_set_speed. * having calls which can sleep in irda_set_speed.
*/ */
struct work_struct gpio_expa; 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 #endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment