[PATCH 2/2] ARM:OMAP2: irda support 3430
This adds board specific changes to support IrDA on 3430 Signed-off-by: Girish S G [EMAIL PROTECTED] --- 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.0 +0530 +++ linux-omap-2.6/arch/arm/configs/omap_3430sdp_defconfig 2008-07-02 18:56:41.0 +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.0 +0530 +++ linux-omap-2.6/arch/arm/mach-omap2/board-3430sdp.c 2008-07-02 18:56:41.0 +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 @@ #defineSDP3430_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) + +#defineIRDA_SD 164 /* gpio 164 */ +#defineIRDA_TX 166 /* gpio 166 */ +#defineIRDA_SD_PIN T21_3430_GPIO164 +#defineIRDA_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
Re: [PATCH 2/2] ARM:OMAP2: irda support 3430
- Original Message - From: Trilok Soni [EMAIL PROTECTED] +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. I think it can be made irda_transceiver_mode/irda_select. And, as this is in 3430 board file, prefixing it with 3430sdp serves no purpose i guess. + .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. Yes, I agree. -girish -- To unsubscribe from this list: send the line unsubscribe linux-omap in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH 2/2] ARM:OMAP2: irda support 3430
Hi Girish, On Thu, Jul 3, 2008 at 12:15 PM, Girish. S. G. [EMAIL PROTECTED] wrote: This adds board specific changes to support IrDA on 3430 Signed-off-by: Girish S G [EMAIL PROTECTED] --- 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.0 +0530 +++ linux-omap-2.6/arch/arm/configs/omap_3430sdp_defconfig 2008-07-02 18:56:41.0 +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.0 +0530 +++ linux-omap-2.6/arch/arm/mach-omap2/board-3430sdp.c 2008-07-02 18:56:41.0 +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 @@ #defineSDP3430_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) + +#defineIRDA_SD 164 /* gpio 164 */ +#defineIRDA_TX 166 /* gpio 166 */ +#defineIRDA_SD_PIN T21_3430_GPIO164 +#defineIRDA_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); +