Hi Girish, On Thu, Jul 3, 2008 at 12:15 PM, Girish. S. G. <girishsg@xxxxxx> wrote: > This adds board specific changes to support IrDA on 3430 > > Signed-off-by: Girish S G <girishsg@xxxxxx> > --- > arch/arm/configs/omap_3430sdp_defconfig | 34 +++++++ > arch/arm/mach-omap2/board-3430sdp.c | 145 ++++++++++++++++++++++++++++++++ > arch/arm/mach-omap2/mux.c | 16 +++ > include/asm-arm/arch-omap/gpio.h | 3 > include/asm-arm/arch-omap/mux.h | 9 + > 5 files changed, 204 insertions(+), 3 deletions(-) > > Index: linux-omap-2.6/arch/arm/configs/omap_3430sdp_defconfig > =================================================================== > --- linux-omap-2.6.orig/arch/arm/configs/omap_3430sdp_defconfig 2008-07-02 > 18:54:15.000000000 +0530 > +++ linux-omap-2.6/arch/arm/configs/omap_3430sdp_defconfig 2008-07-02 > 18:56:41.000000000 +0530 > @@ -392,7 +392,39 @@ > # CONFIG_NET_PKTGEN is not set > # CONFIG_HAMRADIO is not set > # CONFIG_CAN is not set > -# CONFIG_IRDA is not set > +CONFIG_IRDA=y > + > +# > +# IrDA protocols > +# > +# CONFIG_IRLAN is not set > +CONFIG_IRCOMM=y > +# CONFIG_IRDA_ULTRA is not set > + > +# > +# IrDA options > +# > +CONFIG_IRDA_CACHE_LAST_LSAP=y > +CONFIG_IRDA_FAST_RR=y > +# CONFIG_IRDA_DEBUG is not set > + > +# > +# Infrared-port device drivers > +# > + > +# > +# SIR device drivers > +# > +# CONFIG_IRTTY_SIR is not set > + > +# > +# Dongle support > +# > + > +# > +# FIR device drivers > +# > +CONFIG_OMAP_IR=y > # CONFIG_BT is not set > # CONFIG_AF_RXRPC is not set > > Index: linux-omap-2.6/arch/arm/mach-omap2/board-3430sdp.c > =================================================================== > --- linux-omap-2.6.orig/arch/arm/mach-omap2/board-3430sdp.c 2008-07-02 > 18:54:15.000000000 +0530 > +++ linux-omap-2.6/arch/arm/mach-omap2/board-3430sdp.c 2008-07-02 > 18:56:41.000000000 +0530 > @@ -32,6 +32,7 @@ > #include <asm/arch/mcspi.h> > #include <asm/arch/gpio.h> > #include <asm/arch/mux.h> > +#include <asm/arch/irda.h> > #include <asm/arch/board.h> > #include <asm/arch/usb-musb.h> > #include <asm/arch/usb-ehci.h> > @@ -46,6 +47,9 @@ > > #define SDP3430_SMC91X_CS 3 > > +#define ENABLE_VAUX1_DEDICATED 0x03 > +#define ENABLE_VAUX1_DEV_GRP 0x20 > + > #define ENABLE_VAUX3_DEDICATED 0x03 > #define ENABLE_VAUX3_DEV_GRP 0x20 > > @@ -70,6 +74,146 @@ > .resource = sdp3430_smc91x_resources, > }; > > +/* IrDA > + */ > +#if defined(CONFIG_OMAP_IR) || defined(CONFIG_OMAP_IR_MODULE) > + > +#define IRDA_SD 164 /* gpio 164 */ > +#define IRDA_TX 166 /* gpio 166 */ > +#define IRDA_SD_PIN T21_3430_GPIO164 > +#define IRDA_TX_PIN V21_3430_GPIO166 > + > +#define IRDA_VAUX_EN 1 > +#define IRDA_VAUX_DIS 0 > + > +/* > + * This enable(1)/disable(0) the voltage for IrDA: uses twl4030 calls > + */ > +static int irda_vaux_control(int vaux_cntrl) > +{ > + int ret = 0; > + > +#ifdef CONFIG_TWL4030_CORE > + /* check for return value of ldo_use: if success it returns 0 */ > + if (vaux_cntrl == IRDA_VAUX_EN) { > + if (ret != twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, > + ENABLE_VAUX1_DEDICATED, TWL4030_VAUX1_DEDICATED)) > + return -EIO; > + if (ret != twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, > + ENABLE_VAUX1_DEV_GRP, TWL4030_VAUX1_DEV_GRP)) > + return -EIO; > + } else if (vaux_cntrl == IRDA_VAUX_DIS) { > + if (ret != twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, > + 0x00, TWL4030_VAUX1_DEDICATED)) > + return -EIO; > + if (ret != twl4030_i2c_write_u8(TWL4030_MODULE_PM_RECEIVER, > + 0x00, TWL4030_VAUX1_DEV_GRP)) > + return -EIO; > + } > +#else > + ret = -EIO; > +#endif > + return ret; > +} > + > +static int select_irda(struct device *dev, int state) > +{ > + int err; > + if (state == IR_SEL) { > + err = irda_vaux_control(IRDA_VAUX_EN); > + if (err != 0) { > + printk(KERN_ERR "OMAP: IrDA vaux enable failed\n"); > + return err; > + } > + > + omap_cfg_reg(R21_3430_UART3_CTS_RCTX); > + omap_cfg_reg(T21_3430_UART3_RTS_SD); > + omap_cfg_reg(U21_3430_UART3_RX_IRRX); > + omap_cfg_reg(V21_3430_UART3_TX_IRTX); > + > + omap_request_gpio(IRDA_SD); > + omap_request_gpio(IRDA_TX); > + omap_cfg_reg(IRDA_SD_PIN); > + omap_set_gpio_direction(IRDA_SD, GPIO_DIR_OUTPUT); > + omap_set_gpio_direction(IRDA_TX, GPIO_DIR_OUTPUT); > + omap_set_gpio_dataout(IRDA_SD, 0); > + } else { > + omap_free_gpio(IRDA_SD); > + omap_free_gpio(IRDA_TX); > + err = irda_vaux_control(IRDA_VAUX_EN); > + if (err != 0) { > + printk(KERN_ERR "OMAP: IrDA vaux Enable failed\n"); > + return err; > + } > + } > + > + return 0; > +} > + > +static int transceiver_mode(struct device *dev, int mode) > +{ > + omap_cfg_reg(IRDA_SD_PIN); > + omap_cfg_reg(IRDA_TX_PIN); > + > + if (mode & IR_SIRMODE) { > + /* SIR */ > + omap_set_gpio_dataout(IRDA_SD, 1); > + udelay(1); > + omap_set_gpio_dataout(IRDA_TX, 0); > + udelay(1); > + omap_set_gpio_dataout(IRDA_SD, 0); > + udelay(1); > + } else { > + /* MIR/FIR */ > + omap_set_gpio_dataout(IRDA_SD, 1); > + udelay(1); > + omap_set_gpio_dataout(IRDA_TX, 1); > + udelay(1); > + omap_set_gpio_dataout(IRDA_SD, 0); > + udelay(1); > + omap_set_gpio_dataout(IRDA_TX, 0); > + udelay(1); > + } > + > + omap_cfg_reg(T21_3430_UART3_RTS_SD); > + omap_cfg_reg(V21_3430_UART3_TX_IRTX); > + return 0; > +} > +#else > +static int select_irda(struct device *dev, int state) { return 0; } > +static int transceiver_mode(struct device *dev, int mode) { return 0; } > +#endif > + > +static struct omap_irda_config irda_data = { > + .transceiver_cap = IR_SIRMODE | IR_MIRMODE | IR_FIRMODE, > + .transceiver_mode = transceiver_mode, > + .select_irda = select_irda, Please rename this hooks to 3430sdp_transceiver_mode and 3430sdp_select_irda. Check board_h4.c for example. > + .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, > +}; Actually rx_channel to rx_trigger are not platform data and it is long pending cleanup. It would great if we can convert this to platform_resource, as it is chip specific not board specific. -- ---Trilok Soni http://triloksoni.wordpress.com -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html