GPSR(CORGI_GPIO_IR_ON) = GPIO_bit(CORGI_GPIO_IR_ON);
        else
                GPCR(CORGI_GPIO_IR_ON) = GPIO_bit(CORGI_GPIO_IR_ON);
+       pxa2xx_transceiver_mode(dev, mode);
 }
 
 static struct pxaficp_platform_data corgi_ficp_platform_data = {
 
        } else if (mode & IR_FIRMODE) {
                LUB_MISC_WR |= 1 << 4;
        }
+       pxa2xx_transceiver_mode(dev, mode);
        local_irq_restore(flags);
 }
 
 
 static void magician_irda_transceiver_mode(struct device *dev, int mode)
 {
        gpio_set_value(GPIO83_MAGICIAN_nIR_EN, mode & IR_OFF);
+       pxa2xx_transceiver_mode(dev, mode);
 }
 
 static struct pxaficp_platform_data magician_ficp_info = {
 
        } else if (mode & IR_FIRMODE) {
                MST_MSCWR1 |= MST_MSCWR1_IRDA_FIR;
        }
+       pxa2xx_transceiver_mode(dev, mode);
        if (mode & IR_OFF) {
                MST_MSCWR1 = (MST_MSCWR1 & ~MST_MSCWR1_IRDA_MASK) | MST_MSCWR1_IRDA_OFF;
        } else {
 
        } else {
                GPCR(POODLE_GPIO_IR_ON) = GPIO_bit(POODLE_GPIO_IR_ON);
        }
+       pxa2xx_transceiver_mode(dev, mode);
 }
 
 static struct pxaficp_platform_data poodle_ficp_platform_data = {
 
                set_scoop_gpio(&spitzscoop2_device.dev, SPITZ_SCP2_IR_ON);
        else
                reset_scoop_gpio(&spitzscoop2_device.dev, SPITZ_SCP2_IR_ON);
+       pxa2xx_transceiver_mode(dev, mode);
 }
 
 #ifdef CONFIG_MACH_AKITA
                akita_set_ioexp(&akitaioexp_device.dev, AKITA_IOEXP_IR_ON);
        else
                akita_reset_ioexp(&akitaioexp_device.dev, AKITA_IOEXP_IR_ON);
+       pxa2xx_transceiver_mode(dev, mode);
 }
 #endif
 
 
        GPIO81_SSP2_CLK_OUT,
        GPIO82_SSP2_FRM_OUT,
        GPIO83_SSP2_TXD,
-};
-
-static unsigned long tosa_pin_irda_off[] = {
-       GPIO46_STUART_RXD,
-       GPIO47_GPIO | MFP_LPM_DRIVE_LOW,
-};
 
-static unsigned long tosa_pin_irda_on[] = {
-       GPIO46_STUART_RXD,
-       GPIO47_STUART_TXD,
+       /* IrDA is managed in other way */
+       GPIO46_GPIO,
+       GPIO47_GPIO,
 };
 
-
 /*
  * SCOOP Device
  */
 {
        if (mode & IR_OFF) {
                gpio_set_value(TOSA_GPIO_IR_POWERDWN, 0);
-               pxa2xx_mfp_config(ARRAY_AND_SIZE(tosa_pin_irda_off));
+               pxa2xx_transceiver_mode(dev, mode);
                gpio_direction_output(TOSA_GPIO_IRDA_TX, 0);
        } else {
-               pxa2xx_mfp_config(ARRAY_AND_SIZE(tosa_pin_irda_on));
+               pxa2xx_transceiver_mode(dev, mode);
                gpio_set_value(TOSA_GPIO_IR_POWERDWN, 1);
        }
 }
        int dummy;
 
        pxa2xx_mfp_config(ARRAY_AND_SIZE(tosa_pin_config));
-       pxa2xx_mfp_config(ARRAY_AND_SIZE(tosa_pin_irda_off));
        gpio_set_wake(MFP_PIN_GPIO1, 1);
        /* We can't pass to gpio-keys since it will drop the Reset altfunc */
 
 
                /* Fast mode */
                trizeps_conxs_ircr |= ConXS_IRCR_MODE;
        }
+       pxa2xx_transceiver_mode(dev, mode);
        if (mode & IR_OFF) {
                trizeps_conxs_ircr |= ConXS_IRCR_SD;
        } else {