#include <linux/interrupt.h>
 #include <linux/init.h>
 #include <linux/platform_device.h>
+#include <linux/pwm_backlight.h>
 
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
 #include <asm/arch/mmc.h>
 #include <asm/arch/pxa27x_keypad.h>
 
+#include "devices.h"
 #include "generic.h"
 
 #define MAX_SLOTS      3
 struct platform_mmc_slot zylonite_mmc_slot[MAX_SLOTS];
 
-int gpio_backlight;
 int gpio_eth_irq;
 
 int wm9713_irq;
 };
 
 #if defined(CONFIG_FB_PXA) || defined(CONFIG_FB_PXA_MODULE)
-static void zylonite_backlight_power(int on)
-{
-       gpio_set_value(gpio_backlight, on);
-}
+static struct platform_pwm_backlight_data zylonite_backlight_data = {
+       .pwm_id         = 3,
+       .max_brightness = 100,
+       .dft_brightness = 100,
+       .pwm_period_ns  = 10000,
+};
+
+static struct platform_device zylonite_backlight_device = {
+       .name           = "pwm-backlight",
+       .dev            = {
+               .parent = &pxa27x_device_pwm1.dev,
+               .platform_data  = &zylonite_backlight_data,
+       },
+};
 
 static struct pxafb_mode_info toshiba_ltm035a776c_mode = {
        .pixclock               = 110000,
 static struct pxafb_mach_info zylonite_toshiba_lcd_info = {
        .num_modes              = 1,
        .lcd_conn               = LCD_COLOR_TFT_16BPP | LCD_PCLK_EDGE_FALL,
-       .pxafb_backlight_power  = zylonite_backlight_power,
 };
 
 static struct pxafb_mode_info sharp_ls037_modes[] = {
        .modes                  = sharp_ls037_modes,
        .num_modes              = 2,
        .lcd_conn               = LCD_COLOR_TFT_16BPP | LCD_PCLK_EDGE_FALL,
-       .pxafb_backlight_power  = zylonite_backlight_power,
 };
 
 static void __init zylonite_init_lcd(void)
 {
-       /* backlight GPIO: output, default on */
-       gpio_direction_output(gpio_backlight, 1);
+       platform_device_register(&zylonite_backlight_device);
 
        if (lcd_id & 0x20) {
                set_pxa_fb_info(&zylonite_sharp_lcd_info);
 
        GPIO75_LCD_BIAS,
        GPIO76_LCD_VSYNC,
        GPIO127_LCD_CS_N,
+       GPIO20_PWM3_OUT,        /* backlight */
 
        /* BTUART */
        GPIO111_UART2_RTS,
                /* detect LCD panel */
                zylonite_detect_lcd_panel();
 
-               /* GPIO pin assignment */
-               gpio_backlight = mfp_to_gpio(MFP_PIN_GPIO20);
-
                /* MMC card detect & write protect for controller 0 */
                zylonite_mmc_slot[0].gpio_cd  = EXT_GPIO(0);
                zylonite_mmc_slot[0].gpio_wp  = EXT_GPIO(2);
 
        GPIO15_2_LCD_LCLK,
        GPIO16_2_LCD_PCLK,
        GPIO17_2_LCD_BIAS,
+       GPIO14_PWM3_OUT,        /* backlight */
 
        /* FFUART */
        GPIO41_UART1_RXD | MFP_LPM_EDGE_FALL,
                zylonite_detect_lcd_panel();
 
                /* GPIO pin assignment */
-               gpio_backlight  = mfp_to_gpio(MFP_PIN_GPIO14);
                gpio_eth_irq    = mfp_to_gpio(MFP_PIN_GPIO9);
 
                /* MMC card detect & write protect for controller 0 */