···1919#include <linux/kernel.h>2020#include <linux/init.h>2121#include <linux/delay.h>2222+#include <linux/gpio.h>2223#include <linux/fb.h>2324#include <linux/lcd.h>2425#include <linux/spi/spi.h>···9392 int mode;9493 char buf[2];95949696- void (*notify)(int intensity);9595+ int gpio_backlight_on;9696+ int gpio_backlight_cont;9797+ int gpio_backlight_cont_inverted;9898+9799 void (*kick_battery)(void);98100};99101···397393398394static int corgi_bl_set_intensity(struct corgi_lcd *lcd, int intensity)399395{396396+ int cont;397397+400398 if (intensity > 0x10)401399 intensity += 0x10;402400403401 corgi_ssp_lcdtg_send(lcd, DUTYCTRL_ADRS, intensity);404404- lcd->intensity = intensity;405402406406- if (lcd->notify)407407- lcd->notify(intensity);403403+ /* Bit 5 via GPIO_BACKLIGHT_CONT */404404+ cont = !!(intensity & 0x20) ^ lcd->gpio_backlight_cont_inverted;405405+406406+ if (gpio_is_valid(lcd->gpio_backlight_cont))407407+ gpio_set_value(lcd->gpio_backlight_cont, cont);408408+409409+ if (gpio_is_valid(lcd->gpio_backlight_on))410410+ gpio_set_value(lcd->gpio_backlight_on, intensity);408411409412 if (lcd->kick_battery)410413 lcd->kick_battery();411414415415+ lcd->intensity = intensity;412416 return 0;413417}414418···480468#define corgi_lcd_resume NULL481469#endif482470471471+static int setup_gpio_backlight(struct corgi_lcd *lcd,472472+ struct corgi_lcd_platform_data *pdata)473473+{474474+ struct spi_device *spi = lcd->spi_dev;475475+ int err;476476+477477+ lcd->gpio_backlight_on = -1;478478+ lcd->gpio_backlight_cont = -1;479479+480480+ if (gpio_is_valid(pdata->gpio_backlight_on)) {481481+ err = gpio_request(pdata->gpio_backlight_on, "BL_ON");482482+ if (err) {483483+ dev_err(&spi->dev, "failed to request GPIO%d for "484484+ "backlight_on\n", pdata->gpio_backlight_on);485485+ return err;486486+ }487487+488488+ lcd->gpio_backlight_on = pdata->gpio_backlight_on;489489+ gpio_direction_output(lcd->gpio_backlight_on, 0);490490+ }491491+492492+ if (gpio_is_valid(pdata->gpio_backlight_cont)) {493493+ err = gpio_request(pdata->gpio_backlight_cont, "BL_CONT");494494+ if (err) {495495+ dev_err(&spi->dev, "failed to request GPIO%d for "496496+ "backlight_cont\n", pdata->gpio_backlight_cont);497497+ goto err_free_backlight_on;498498+ }499499+500500+ lcd->gpio_backlight_cont = pdata->gpio_backlight_cont;501501+502502+ /* spitz and akita use both GPIOs for backlight, and503503+ * have inverted polarity of GPIO_BACKLIGHT_CONT504504+ */505505+ if (gpio_is_valid(lcd->gpio_backlight_on)) {506506+ lcd->gpio_backlight_cont_inverted = 1;507507+ gpio_direction_output(lcd->gpio_backlight_cont, 1);508508+ } else {509509+ lcd->gpio_backlight_cont_inverted = 0;510510+ gpio_direction_output(lcd->gpio_backlight_cont, 0);511511+ }512512+ }513513+ return 0;514514+515515+err_free_backlight_on:516516+ if (gpio_is_valid(lcd->gpio_backlight_on))517517+ gpio_free(lcd->gpio_backlight_on);518518+ return err;519519+}520520+483521static int __devinit corgi_lcd_probe(struct spi_device *spi)484522{485523 struct corgi_lcd_platform_data *pdata = spi->dev.platform_data;···568506 lcd->bl_dev->props.brightness = pdata->default_intensity;569507 lcd->bl_dev->props.power = FB_BLANK_UNBLANK;570508571571- lcd->notify = pdata->notify;509509+ ret = setup_gpio_backlight(lcd, pdata);510510+ if (ret)511511+ goto err_unregister_bl;512512+572513 lcd->kick_battery = pdata->kick_battery;573514574515 dev_set_drvdata(&spi->dev, lcd);···582517 the_corgi_lcd = lcd;583518 return 0;584519520520+err_unregister_bl:521521+ backlight_device_unregister(lcd->bl_dev);585522err_unregister_lcd:586523 lcd_device_unregister(lcd->lcd_dev);587524err_free_lcd:···599532 lcd->bl_dev->props.brightness = 0;600533 backlight_update_status(lcd->bl_dev);601534 backlight_device_unregister(lcd->bl_dev);535535+536536+ if (gpio_is_valid(lcd->gpio_backlight_on))537537+ gpio_free(lcd->gpio_backlight_on);538538+539539+ if (gpio_is_valid(lcd->gpio_backlight_cont))540540+ gpio_free(lcd->gpio_backlight_cont);602541603542 corgi_lcd_set_power(lcd->lcd_dev, FB_BLANK_POWERDOWN);604543 lcd_device_unregister(lcd->lcd_dev);
+3
include/linux/spi/corgi_lcd.h
···1010 int default_intensity;1111 int limit_mask;12121313+ int gpio_backlight_on; /* -1 if n/a */1414+ int gpio_backlight_cont; /* -1 if n/a */1515+1316 void (*notify)(int intensity);1417 void (*kick_battery)(void);1518};