From mboxrd@z Thu Jan 1 00:00:00 1970 From: Krzysztof Kozlowski Date: Mon, 30 Apr 2018 17:29:45 +0000 Subject: [PATCH 2/2] backlight: Remove ld9040 driver Message-Id: <20180430172945.20938-2-krzk@kernel.org> List-Id: References: <20180430172945.20938-1-krzk@kernel.org> In-Reply-To: <20180430172945.20938-1-krzk@kernel.org> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: Lee Jones , Daniel Thompson , Jingoo Han , Bartlomiej Zolnierkiewicz , linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-fbdev@vger.kernel.org Cc: Krzysztof Kozlowski , Marek Szyprowski The driver for LD9040 AMOLED LCD panel was superseded with DRM driver panel-samsung-ld9040.c. It does not support DeviceTree and respective possible user (Exynos4210 Universal C210) is DeviceTree-only and uses DRM version of driver.. Suggested-by: Marek Szyprowski Cc: Marek Szyprowski Cc: Inki Dae Signed-off-by: Krzysztof Kozlowski --- drivers/video/backlight/Kconfig | 8 - drivers/video/backlight/Makefile | 1 - drivers/video/backlight/ld9040.c | 811 --------------------------------- drivers/video/backlight/ld9040_gamma.h | 202 -------- 4 files changed, 1022 deletions(-) delete mode 100644 drivers/video/backlight/ld9040.c delete mode 100644 drivers/video/backlight/ld9040_gamma.h diff --git a/drivers/video/backlight/Kconfig b/drivers/video/backlight/Kconfig index be0c130b6597..2202daf2ab4f 100644 --- a/drivers/video/backlight/Kconfig +++ b/drivers/video/backlight/Kconfig @@ -111,14 +111,6 @@ config LCD_HP700 If you have an HP Jornada 700 series handheld (710/720/728) say Y to enable LCD control driver. -config LCD_LD9040 - tristate "LD9040 AMOLED LCD Driver" - depends on SPI && BACKLIGHT_CLASS_DEVICE - default n - help - If you have an LD9040 Panel, say Y to enable its - control driver. - config LCD_AMS369FG06 tristate "AMS369FG06 AMOLED LCD Driver" depends on SPI && BACKLIGHT_CLASS_DEVICE diff --git a/drivers/video/backlight/Makefile b/drivers/video/backlight/Makefile index 8773fdd64e99..0b327c0cb750 100644 --- a/drivers/video/backlight/Makefile +++ b/drivers/video/backlight/Makefile @@ -9,7 +9,6 @@ obj-$(CONFIG_LCD_HX8357) += hx8357.o obj-$(CONFIG_LCD_ILI922X) += ili922x.o obj-$(CONFIG_LCD_ILI9320) += ili9320.o obj-$(CONFIG_LCD_L4F00242T03) += l4f00242t03.o -obj-$(CONFIG_LCD_LD9040) += ld9040.o obj-$(CONFIG_LCD_LMS283GF05) += lms283gf05.o obj-$(CONFIG_LCD_LMS501KF03) += lms501kf03.o obj-$(CONFIG_LCD_LTV350QV) += ltv350qv.o diff --git a/drivers/video/backlight/ld9040.c b/drivers/video/backlight/ld9040.c deleted file mode 100644 index 677f8abba27c..000000000000 --- a/drivers/video/backlight/ld9040.c +++ /dev/null @@ -1,811 +0,0 @@ -/* - * ld9040 AMOLED LCD panel driver. - * - * Copyright (c) 2011 Samsung Electronics - * Author: Donghwa Lee - * Derived from drivers/video/backlight/s6e63m0.c - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "ld9040_gamma.h" - -#define SLEEPMSEC 0x1000 -#define ENDDEF 0x2000 -#define DEFMASK 0xFF00 -#define COMMAND_ONLY 0xFE -#define DATA_ONLY 0xFF - -#define MIN_BRIGHTNESS 0 -#define MAX_BRIGHTNESS 24 - -struct ld9040 { - struct device *dev; - struct spi_device *spi; - unsigned int power; - unsigned int current_brightness; - - struct lcd_device *ld; - struct backlight_device *bd; - struct lcd_platform_data *lcd_pd; - - struct mutex lock; - bool enabled; -}; - -static struct regulator_bulk_data supplies[] = { - { .supply = "vdd3", }, - { .supply = "vci", }, -}; - -static void ld9040_regulator_enable(struct ld9040 *lcd) -{ - int ret = 0; - struct lcd_platform_data *pd = NULL; - - pd = lcd->lcd_pd; - mutex_lock(&lcd->lock); - if (!lcd->enabled) { - ret = regulator_bulk_enable(ARRAY_SIZE(supplies), supplies); - if (ret) - goto out; - - lcd->enabled = true; - } - msleep(pd->power_on_delay); -out: - mutex_unlock(&lcd->lock); -} - -static void ld9040_regulator_disable(struct ld9040 *lcd) -{ - int ret = 0; - - mutex_lock(&lcd->lock); - if (lcd->enabled) { - ret = regulator_bulk_disable(ARRAY_SIZE(supplies), supplies); - if (ret) - goto out; - - lcd->enabled = false; - } -out: - mutex_unlock(&lcd->lock); -} - -static const unsigned short seq_swreset[] = { - 0x01, COMMAND_ONLY, - ENDDEF, 0x00 -}; - -static const unsigned short seq_user_setting[] = { - 0xF0, 0x5A, - - DATA_ONLY, 0x5A, - ENDDEF, 0x00 -}; - -static const unsigned short seq_elvss_on[] = { - 0xB1, 0x0D, - - DATA_ONLY, 0x00, - DATA_ONLY, 0x16, - ENDDEF, 0x00 -}; - -static const unsigned short seq_gtcon[] = { - 0xF7, 0x09, - - DATA_ONLY, 0x00, - DATA_ONLY, 0x00, - ENDDEF, 0x00 -}; - -static const unsigned short seq_panel_condition[] = { - 0xF8, 0x05, - - DATA_ONLY, 0x65, - DATA_ONLY, 0x96, - DATA_ONLY, 0x71, - DATA_ONLY, 0x7D, - DATA_ONLY, 0x19, - DATA_ONLY, 0x3B, - DATA_ONLY, 0x0D, - DATA_ONLY, 0x19, - DATA_ONLY, 0x7E, - DATA_ONLY, 0x0D, - DATA_ONLY, 0xE2, - DATA_ONLY, 0x00, - DATA_ONLY, 0x00, - DATA_ONLY, 0x7E, - DATA_ONLY, 0x7D, - DATA_ONLY, 0x07, - DATA_ONLY, 0x07, - DATA_ONLY, 0x20, - DATA_ONLY, 0x20, - DATA_ONLY, 0x20, - DATA_ONLY, 0x02, - DATA_ONLY, 0x02, - ENDDEF, 0x00 -}; - -static const unsigned short seq_gamma_set1[] = { - 0xF9, 0x00, - - DATA_ONLY, 0xA7, - DATA_ONLY, 0xB4, - DATA_ONLY, 0xAE, - DATA_ONLY, 0xBF, - DATA_ONLY, 0x00, - DATA_ONLY, 0x91, - DATA_ONLY, 0x00, - DATA_ONLY, 0xB2, - DATA_ONLY, 0xB4, - DATA_ONLY, 0xAA, - DATA_ONLY, 0xBB, - DATA_ONLY, 0x00, - DATA_ONLY, 0xAC, - DATA_ONLY, 0x00, - DATA_ONLY, 0xB3, - DATA_ONLY, 0xB1, - DATA_ONLY, 0xAA, - DATA_ONLY, 0xBC, - DATA_ONLY, 0x00, - DATA_ONLY, 0xB3, - ENDDEF, 0x00 -}; - -static const unsigned short seq_gamma_ctrl[] = { - 0xFB, 0x02, - - DATA_ONLY, 0x5A, - ENDDEF, 0x00 -}; - -static const unsigned short seq_gamma_start[] = { - 0xF9, COMMAND_ONLY, - - ENDDEF, 0x00 -}; - -static const unsigned short seq_apon[] = { - 0xF3, 0x00, - - DATA_ONLY, 0x00, - DATA_ONLY, 0x00, - DATA_ONLY, 0x0A, - DATA_ONLY, 0x02, - ENDDEF, 0x00 -}; - -static const unsigned short seq_display_ctrl[] = { - 0xF2, 0x02, - - DATA_ONLY, 0x08, - DATA_ONLY, 0x08, - DATA_ONLY, 0x10, - DATA_ONLY, 0x10, - ENDDEF, 0x00 -}; - -static const unsigned short seq_manual_pwr[] = { - 0xB0, 0x04, - ENDDEF, 0x00 -}; - -static const unsigned short seq_pwr_ctrl[] = { - 0xF4, 0x0A, - - DATA_ONLY, 0x87, - DATA_ONLY, 0x25, - DATA_ONLY, 0x6A, - DATA_ONLY, 0x44, - DATA_ONLY, 0x02, - DATA_ONLY, 0x88, - ENDDEF, 0x00 -}; - -static const unsigned short seq_sleep_out[] = { - 0x11, COMMAND_ONLY, - ENDDEF, 0x00 -}; - -static const unsigned short seq_sleep_in[] = { - 0x10, COMMAND_ONLY, - ENDDEF, 0x00 -}; - -static const unsigned short seq_display_on[] = { - 0x29, COMMAND_ONLY, - ENDDEF, 0x00 -}; - -static const unsigned short seq_display_off[] = { - 0x28, COMMAND_ONLY, - ENDDEF, 0x00 -}; - -static const unsigned short seq_vci1_1st_en[] = { - 0xF3, 0x10, - - DATA_ONLY, 0x00, - DATA_ONLY, 0x00, - DATA_ONLY, 0x00, - DATA_ONLY, 0x02, - ENDDEF, 0x00 -}; - -static const unsigned short seq_vl1_en[] = { - 0xF3, 0x11, - - DATA_ONLY, 0x00, - DATA_ONLY, 0x00, - DATA_ONLY, 0x00, - DATA_ONLY, 0x02, - ENDDEF, 0x00 -}; - -static const unsigned short seq_vl2_en[] = { - 0xF3, 0x13, - - DATA_ONLY, 0x00, - DATA_ONLY, 0x00, - DATA_ONLY, 0x00, - DATA_ONLY, 0x02, - ENDDEF, 0x00 -}; - -static const unsigned short seq_vci1_2nd_en[] = { - 0xF3, 0x33, - - DATA_ONLY, 0x00, - DATA_ONLY, 0x00, - DATA_ONLY, 0x00, - DATA_ONLY, 0x02, - ENDDEF, 0x00 -}; - -static const unsigned short seq_vl3_en[] = { - 0xF3, 0x37, - - DATA_ONLY, 0x00, - DATA_ONLY, 0x00, - DATA_ONLY, 0x00, - DATA_ONLY, 0x02, - ENDDEF, 0x00 -}; - -static const unsigned short seq_vreg1_amp_en[] = { - 0xF3, 0x37, - - DATA_ONLY, 0x01, - DATA_ONLY, 0x00, - DATA_ONLY, 0x00, - DATA_ONLY, 0x02, - ENDDEF, 0x00 -}; - -static const unsigned short seq_vgh_amp_en[] = { - 0xF3, 0x37, - - DATA_ONLY, 0x11, - DATA_ONLY, 0x00, - DATA_ONLY, 0x00, - DATA_ONLY, 0x02, - ENDDEF, 0x00 -}; - -static const unsigned short seq_vgl_amp_en[] = { - 0xF3, 0x37, - - DATA_ONLY, 0x31, - DATA_ONLY, 0x00, - DATA_ONLY, 0x00, - DATA_ONLY, 0x02, - ENDDEF, 0x00 -}; - -static const unsigned short seq_vmos_amp_en[] = { - 0xF3, 0x37, - - DATA_ONLY, 0xB1, - DATA_ONLY, 0x00, - DATA_ONLY, 0x00, - DATA_ONLY, 0x03, - ENDDEF, 0x00 -}; - -static const unsigned short seq_vint_amp_en[] = { - 0xF3, 0x37, - - DATA_ONLY, 0xF1, - /* DATA_ONLY, 0x71, VMOS/VBL/VBH not used */ - DATA_ONLY, 0x00, - DATA_ONLY, 0x00, - DATA_ONLY, 0x03, - /* DATA_ONLY, 0x02, VMOS/VBL/VBH not used */ - ENDDEF, 0x00 -}; - -static const unsigned short seq_vbh_amp_en[] = { - 0xF3, 0x37, - - DATA_ONLY, 0xF9, - DATA_ONLY, 0x00, - DATA_ONLY, 0x00, - DATA_ONLY, 0x03, - ENDDEF, 0x00 -}; - -static const unsigned short seq_vbl_amp_en[] = { - 0xF3, 0x37, - - DATA_ONLY, 0xFD, - DATA_ONLY, 0x00, - DATA_ONLY, 0x00, - DATA_ONLY, 0x03, - ENDDEF, 0x00 -}; - -static const unsigned short seq_gam_amp_en[] = { - 0xF3, 0x37, - - DATA_ONLY, 0xFF, - /* DATA_ONLY, 0x73, VMOS/VBL/VBH not used */ - DATA_ONLY, 0x00, - DATA_ONLY, 0x00, - DATA_ONLY, 0x03, - /* DATA_ONLY, 0x02, VMOS/VBL/VBH not used */ - ENDDEF, 0x00 -}; - -static const unsigned short seq_sd_amp_en[] = { - 0xF3, 0x37, - - DATA_ONLY, 0xFF, - /* DATA_ONLY, 0x73, VMOS/VBL/VBH not used */ - DATA_ONLY, 0x80, - DATA_ONLY, 0x00, - DATA_ONLY, 0x03, - /* DATA_ONLY, 0x02, VMOS/VBL/VBH not used */ - ENDDEF, 0x00 -}; - -static const unsigned short seq_gls_en[] = { - 0xF3, 0x37, - - DATA_ONLY, 0xFF, - /* DATA_ONLY, 0x73, VMOS/VBL/VBH not used */ - DATA_ONLY, 0x81, - DATA_ONLY, 0x00, - DATA_ONLY, 0x03, - /* DATA_ONLY, 0x02, VMOS/VBL/VBH not used */ - ENDDEF, 0x00 -}; - -static const unsigned short seq_els_en[] = { - 0xF3, 0x37, - - DATA_ONLY, 0xFF, - /* DATA_ONLY, 0x73, VMOS/VBL/VBH not used */ - DATA_ONLY, 0x83, - DATA_ONLY, 0x00, - DATA_ONLY, 0x03, - /* DATA_ONLY, 0x02, VMOS/VBL/VBH not used */ - ENDDEF, 0x00 -}; - -static const unsigned short seq_el_on[] = { - 0xF3, 0x37, - - DATA_ONLY, 0xFF, - /* DATA_ONLY, 0x73, VMOS/VBL/VBH not used */ - DATA_ONLY, 0x87, - DATA_ONLY, 0x00, - DATA_ONLY, 0x03, - /* DATA_ONLY, 0x02, VMOS/VBL/VBH not used */ - ENDDEF, 0x00 -}; - -static int ld9040_spi_write_byte(struct ld9040 *lcd, int addr, int data) -{ - u16 buf[1]; - struct spi_message msg; - - struct spi_transfer xfer = { - .len = 2, - .tx_buf = buf, - }; - - buf[0] = (addr << 8) | data; - - spi_message_init(&msg); - spi_message_add_tail(&xfer, &msg); - - return spi_sync(lcd->spi, &msg); -} - -static int ld9040_spi_write(struct ld9040 *lcd, unsigned char address, - unsigned char command) -{ - int ret = 0; - - if (address != DATA_ONLY) - ret = ld9040_spi_write_byte(lcd, 0x0, address); - if (command != COMMAND_ONLY) - ret = ld9040_spi_write_byte(lcd, 0x1, command); - - return ret; -} - -static int ld9040_panel_send_sequence(struct ld9040 *lcd, - const unsigned short *wbuf) -{ - int ret = 0, i = 0; - - while ((wbuf[i] & DEFMASK) != ENDDEF) { - if ((wbuf[i] & DEFMASK) != SLEEPMSEC) { - ret = ld9040_spi_write(lcd, wbuf[i], wbuf[i+1]); - if (ret) - break; - } else { - msleep(wbuf[i+1]); - } - i += 2; - } - - return ret; -} - -static int _ld9040_gamma_ctl(struct ld9040 *lcd, const unsigned int *gamma) -{ - unsigned int i = 0; - int ret = 0; - - /* start gamma table updating. */ - ret = ld9040_panel_send_sequence(lcd, seq_gamma_start); - if (ret) { - dev_err(lcd->dev, "failed to disable gamma table updating.\n"); - goto gamma_err; - } - - for (i = 0 ; i < GAMMA_TABLE_COUNT; i++) { - ret = ld9040_spi_write(lcd, DATA_ONLY, gamma[i]); - if (ret) { - dev_err(lcd->dev, "failed to set gamma table.\n"); - goto gamma_err; - } - } - - /* update gamma table. */ - ret = ld9040_panel_send_sequence(lcd, seq_gamma_ctrl); - if (ret) - dev_err(lcd->dev, "failed to update gamma table.\n"); - -gamma_err: - return ret; -} - -static int ld9040_gamma_ctl(struct ld9040 *lcd, int gamma) -{ - return _ld9040_gamma_ctl(lcd, gamma_table.gamma_22_table[gamma]); -} - -static int ld9040_ldi_init(struct ld9040 *lcd) -{ - int ret, i; - static const unsigned short *init_seq[] = { - seq_user_setting, - seq_panel_condition, - seq_display_ctrl, - seq_manual_pwr, - seq_elvss_on, - seq_gtcon, - seq_gamma_set1, - seq_gamma_ctrl, - seq_sleep_out, - }; - - for (i = 0; i < ARRAY_SIZE(init_seq); i++) { - ret = ld9040_panel_send_sequence(lcd, init_seq[i]); - /* workaround: minimum delay time for transferring CMD */ - usleep_range(300, 310); - if (ret) - break; - } - - return ret; -} - -static int ld9040_ldi_enable(struct ld9040 *lcd) -{ - return ld9040_panel_send_sequence(lcd, seq_display_on); -} - -static int ld9040_ldi_disable(struct ld9040 *lcd) -{ - int ret; - - ret = ld9040_panel_send_sequence(lcd, seq_display_off); - ret = ld9040_panel_send_sequence(lcd, seq_sleep_in); - - return ret; -} - -static int ld9040_power_is_on(int power) -{ - return power <= FB_BLANK_NORMAL; -} - -static int ld9040_power_on(struct ld9040 *lcd) -{ - int ret = 0; - struct lcd_platform_data *pd; - - pd = lcd->lcd_pd; - - /* lcd power on */ - ld9040_regulator_enable(lcd); - - if (!pd->reset) { - dev_err(lcd->dev, "reset is NULL.\n"); - return -EINVAL; - } - - pd->reset(lcd->ld); - msleep(pd->reset_delay); - - ret = ld9040_ldi_init(lcd); - if (ret) { - dev_err(lcd->dev, "failed to initialize ldi.\n"); - return ret; - } - - ret = ld9040_ldi_enable(lcd); - if (ret) { - dev_err(lcd->dev, "failed to enable ldi.\n"); - return ret; - } - - return 0; -} - -static int ld9040_power_off(struct ld9040 *lcd) -{ - int ret; - struct lcd_platform_data *pd; - - pd = lcd->lcd_pd; - - ret = ld9040_ldi_disable(lcd); - if (ret) { - dev_err(lcd->dev, "lcd setting failed.\n"); - return -EIO; - } - - msleep(pd->power_off_delay); - - /* lcd power off */ - ld9040_regulator_disable(lcd); - - return 0; -} - -static int ld9040_power(struct ld9040 *lcd, int power) -{ - int ret = 0; - - if (ld9040_power_is_on(power) && !ld9040_power_is_on(lcd->power)) - ret = ld9040_power_on(lcd); - else if (!ld9040_power_is_on(power) && ld9040_power_is_on(lcd->power)) - ret = ld9040_power_off(lcd); - - if (!ret) - lcd->power = power; - - return ret; -} - -static int ld9040_set_power(struct lcd_device *ld, int power) -{ - struct ld9040 *lcd = lcd_get_data(ld); - - if (power != FB_BLANK_UNBLANK && power != FB_BLANK_POWERDOWN && - power != FB_BLANK_NORMAL) { - dev_err(lcd->dev, "power value should be 0, 1 or 4.\n"); - return -EINVAL; - } - - return ld9040_power(lcd, power); -} - -static int ld9040_get_power(struct lcd_device *ld) -{ - struct ld9040 *lcd = lcd_get_data(ld); - - return lcd->power; -} - -static int ld9040_set_brightness(struct backlight_device *bd) -{ - int ret = 0, brightness = bd->props.brightness; - struct ld9040 *lcd = bl_get_data(bd); - - if (brightness < MIN_BRIGHTNESS || - brightness > bd->props.max_brightness) { - dev_err(&bd->dev, "lcd brightness should be %d to %d.\n", - MIN_BRIGHTNESS, MAX_BRIGHTNESS); - return -EINVAL; - } - - ret = ld9040_gamma_ctl(lcd, bd->props.brightness); - if (ret) { - dev_err(&bd->dev, "lcd brightness setting failed.\n"); - return -EIO; - } - - return ret; -} - -static struct lcd_ops ld9040_lcd_ops = { - .set_power = ld9040_set_power, - .get_power = ld9040_get_power, -}; - -static const struct backlight_ops ld9040_backlight_ops = { - .update_status = ld9040_set_brightness, -}; - -static int ld9040_probe(struct spi_device *spi) -{ - int ret = 0; - struct ld9040 *lcd = NULL; - struct lcd_device *ld = NULL; - struct backlight_device *bd = NULL; - struct backlight_properties props; - - lcd = devm_kzalloc(&spi->dev, sizeof(struct ld9040), GFP_KERNEL); - if (!lcd) - return -ENOMEM; - - /* ld9040 lcd panel uses 3-wire 9bits SPI Mode. */ - spi->bits_per_word = 9; - - ret = spi_setup(spi); - if (ret < 0) { - dev_err(&spi->dev, "spi setup failed.\n"); - return ret; - } - - lcd->spi = spi; - lcd->dev = &spi->dev; - - lcd->lcd_pd = dev_get_platdata(&spi->dev); - if (!lcd->lcd_pd) { - dev_err(&spi->dev, "platform data is NULL.\n"); - return -EINVAL; - } - - mutex_init(&lcd->lock); - - ret = devm_regulator_bulk_get(lcd->dev, ARRAY_SIZE(supplies), supplies); - if (ret) { - dev_err(lcd->dev, "Failed to get regulators: %d\n", ret); - return ret; - } - - ld = devm_lcd_device_register(&spi->dev, "ld9040", &spi->dev, lcd, - &ld9040_lcd_ops); - if (IS_ERR(ld)) - return PTR_ERR(ld); - - lcd->ld = ld; - - memset(&props, 0, sizeof(struct backlight_properties)); - props.type = BACKLIGHT_RAW; - props.max_brightness = MAX_BRIGHTNESS; - - bd = devm_backlight_device_register(&spi->dev, "ld9040-bl", &spi->dev, - lcd, &ld9040_backlight_ops, &props); - if (IS_ERR(bd)) - return PTR_ERR(bd); - - bd->props.brightness = MAX_BRIGHTNESS; - lcd->bd = bd; - - /* - * if lcd panel was on from bootloader like u-boot then - * do not lcd on. - */ - if (!lcd->lcd_pd->lcd_enabled) { - /* - * if lcd panel was off from bootloader then - * current lcd status is powerdown and then - * it enables lcd panel. - */ - lcd->power = FB_BLANK_POWERDOWN; - - ld9040_power(lcd, FB_BLANK_UNBLANK); - } else { - lcd->power = FB_BLANK_UNBLANK; - } - - spi_set_drvdata(spi, lcd); - - dev_info(&spi->dev, "ld9040 panel driver has been probed.\n"); - return 0; -} - -static int ld9040_remove(struct spi_device *spi) -{ - struct ld9040 *lcd = spi_get_drvdata(spi); - - ld9040_power(lcd, FB_BLANK_POWERDOWN); - return 0; -} - -#ifdef CONFIG_PM_SLEEP -static int ld9040_suspend(struct device *dev) -{ - struct ld9040 *lcd = dev_get_drvdata(dev); - - dev_dbg(dev, "lcd->power = %d\n", lcd->power); - - /* - * when lcd panel is suspend, lcd panel becomes off - * regardless of status. - */ - return ld9040_power(lcd, FB_BLANK_POWERDOWN); -} - -static int ld9040_resume(struct device *dev) -{ - struct ld9040 *lcd = dev_get_drvdata(dev); - - lcd->power = FB_BLANK_POWERDOWN; - - return ld9040_power(lcd, FB_BLANK_UNBLANK); -} -#endif - -static SIMPLE_DEV_PM_OPS(ld9040_pm_ops, ld9040_suspend, ld9040_resume); - -/* Power down all displays on reboot, poweroff or halt. */ -static void ld9040_shutdown(struct spi_device *spi) -{ - struct ld9040 *lcd = spi_get_drvdata(spi); - - ld9040_power(lcd, FB_BLANK_POWERDOWN); -} - -static struct spi_driver ld9040_driver = { - .driver = { - .name = "ld9040", - .pm = &ld9040_pm_ops, - }, - .probe = ld9040_probe, - .remove = ld9040_remove, - .shutdown = ld9040_shutdown, -}; - -module_spi_driver(ld9040_driver); - -MODULE_AUTHOR("Donghwa Lee "); -MODULE_DESCRIPTION("ld9040 LCD Driver"); -MODULE_LICENSE("GPL"); diff --git a/drivers/video/backlight/ld9040_gamma.h b/drivers/video/backlight/ld9040_gamma.h deleted file mode 100644 index c5e586d97385..000000000000 --- a/drivers/video/backlight/ld9040_gamma.h +++ /dev/null @@ -1,202 +0,0 @@ -/* - * Gamma level definitions. - * - * Copyright (c) 2011 Samsung Electronics - * InKi Dae - * Donghwa Lee - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. -*/ - -#ifndef _LD9040_BRIGHTNESS_H -#define _LD9040_BRIGHTNESS_H - -#define MAX_GAMMA_LEVEL 25 -#define GAMMA_TABLE_COUNT 21 - -/* gamma value: 2.2 */ -static const unsigned int ld9040_22_300[] = { - 0x00, 0xa7, 0xb4, 0xae, 0xbf, 0x00, 0x91, - 0x00, 0xb2, 0xb4, 0xaa, 0xbb, 0x00, 0xac, - 0x00, 0xb3, 0xb1, 0xaa, 0xbc, 0x00, 0xb3 -}; - -static const unsigned int ld9040_22_290[] = { - 0x00, 0xa9, 0xb7, 0xae, 0xbd, 0x00, 0x89, - 0x00, 0xb7, 0xb6, 0xa8, 0xba, 0x00, 0xa4, - 0x00, 0xb1, 0xb4, 0xaa, 0xbb, 0x00, 0xaa -}; - -static const unsigned int ld9040_22_280[] = { - 0x00, 0xa9, 0xb6, 0xad, 0xbf, 0x00, 0x86, - 0x00, 0xb8, 0xb5, 0xa8, 0xbc, 0x00, 0xa0, - 0x00, 0xb3, 0xb3, 0xa9, 0xbc, 0x00, 0xa7 -}; - -static const unsigned int ld9040_22_270[] = { - 0x00, 0xa8, 0xb8, 0xae, 0xbe, 0x00, 0x84, - 0x00, 0xb9, 0xb7, 0xa8, 0xbc, 0x00, 0x9d, - 0x00, 0xb2, 0xb5, 0xaa, 0xbc, 0x00, 0xa4 - -}; -static const unsigned int ld9040_22_260[] = { - 0x00, 0xa4, 0xb8, 0xb0, 0xbf, 0x00, 0x80, - 0x00, 0xb8, 0xb6, 0xaa, 0xbc, 0x00, 0x9a, - 0x00, 0xb0, 0xb5, 0xab, 0xbd, 0x00, 0xa0 -}; - -static const unsigned int ld9040_22_250[] = { - 0x00, 0xa4, 0xb9, 0xaf, 0xc1, 0x00, 0x7d, - 0x00, 0xb9, 0xb6, 0xaa, 0xbb, 0x00, 0x97, - 0x00, 0xb1, 0xb5, 0xaa, 0xbf, 0x00, 0x9d -}; - -static const unsigned int ld9040_22_240[] = { - 0x00, 0xa2, 0xb9, 0xaf, 0xc2, 0x00, 0x7a, - 0x00, 0xb9, 0xb7, 0xaa, 0xbd, 0x00, 0x94, - 0x00, 0xb0, 0xb5, 0xab, 0xbf, 0x00, 0x9a -}; - -static const unsigned int ld9040_22_230[] = { - 0x00, 0xa0, 0xb9, 0xaf, 0xc3, 0x00, 0x77, - 0x00, 0xb9, 0xb7, 0xab, 0xbe, 0x00, 0x90, - 0x00, 0xb0, 0xb6, 0xab, 0xbf, 0x00, 0x97 -}; - -static const unsigned int ld9040_22_220[] = { - 0x00, 0x9e, 0xba, 0xb0, 0xc2, 0x00, 0x75, - 0x00, 0xb9, 0xb8, 0xab, 0xbe, 0x00, 0x8e, - 0x00, 0xb0, 0xb6, 0xac, 0xbf, 0x00, 0x94 -}; - -static const unsigned int ld9040_22_210[] = { - 0x00, 0x9c, 0xb9, 0xb0, 0xc4, 0x00, 0x72, - 0x00, 0xb8, 0xb8, 0xac, 0xbf, 0x00, 0x8a, - 0x00, 0xb0, 0xb6, 0xac, 0xc0, 0x00, 0x91 -}; - -static const unsigned int ld9040_22_200[] = { - 0x00, 0x9a, 0xba, 0xb1, 0xc4, 0x00, 0x6f, - 0x00, 0xb8, 0xb8, 0xad, 0xc0, 0x00, 0x86, - 0x00, 0xb0, 0xb7, 0xad, 0xc0, 0x00, 0x8d -}; - -static const unsigned int ld9040_22_190[] = { - 0x00, 0x97, 0xba, 0xb2, 0xc5, 0x00, 0x6c, - 0x00, 0xb8, 0xb8, 0xae, 0xc1, 0x00, 0x82, - 0x00, 0xb0, 0xb6, 0xae, 0xc2, 0x00, 0x89 -}; - -static const unsigned int ld9040_22_180[] = { - 0x00, 0x93, 0xba, 0xb3, 0xc5, 0x00, 0x69, - 0x00, 0xb8, 0xb9, 0xae, 0xc1, 0x00, 0x7f, - 0x00, 0xb0, 0xb6, 0xae, 0xc3, 0x00, 0x85 -}; - -static const unsigned int ld9040_22_170[] = { - 0x00, 0x8b, 0xb9, 0xb3, 0xc7, 0x00, 0x65, - 0x00, 0xb7, 0xb8, 0xaf, 0xc3, 0x00, 0x7a, - 0x00, 0x80, 0xb6, 0xae, 0xc4, 0x00, 0x81 -}; - -static const unsigned int ld9040_22_160[] = { - 0x00, 0x89, 0xba, 0xb3, 0xc8, 0x00, 0x62, - 0x00, 0xb6, 0xba, 0xaf, 0xc3, 0x00, 0x76, - 0x00, 0xaf, 0xb7, 0xae, 0xc4, 0x00, 0x7e -}; - -static const unsigned int ld9040_22_150[] = { - 0x00, 0x82, 0xba, 0xb4, 0xc7, 0x00, 0x5f, - 0x00, 0xb5, 0xba, 0xb0, 0xc3, 0x00, 0x72, - 0x00, 0xae, 0xb8, 0xb0, 0xc3, 0x00, 0x7a -}; - -static const unsigned int ld9040_22_140[] = { - 0x00, 0x7b, 0xbb, 0xb4, 0xc8, 0x00, 0x5b, - 0x00, 0xb5, 0xba, 0xb1, 0xc4, 0x00, 0x6e, - 0x00, 0xae, 0xb9, 0xb0, 0xc5, 0x00, 0x75 -}; - -static const unsigned int ld9040_22_130[] = { - 0x00, 0x71, 0xbb, 0xb5, 0xc8, 0x00, 0x57, - 0x00, 0xb5, 0xbb, 0xb0, 0xc5, 0x00, 0x6a, - 0x00, 0xae, 0xb9, 0xb1, 0xc6, 0x00, 0x70 -}; - -static const unsigned int ld9040_22_120[] = { - 0x00, 0x47, 0xba, 0xb6, 0xca, 0x00, 0x53, - 0x00, 0xb5, 0xbb, 0xb3, 0xc6, 0x00, 0x65, - 0x00, 0xae, 0xb8, 0xb3, 0xc7, 0x00, 0x6c -}; - -static const unsigned int ld9040_22_110[] = { - 0x00, 0x13, 0xbb, 0xb7, 0xca, 0x00, 0x4f, - 0x00, 0xb4, 0xbb, 0xb3, 0xc7, 0x00, 0x60, - 0x00, 0xad, 0xb8, 0xb4, 0xc7, 0x00, 0x67 -}; - -static const unsigned int ld9040_22_100[] = { - 0x00, 0x13, 0xba, 0xb8, 0xcb, 0x00, 0x4b, - 0x00, 0xb3, 0xbc, 0xb4, 0xc7, 0x00, 0x5c, - 0x00, 0xac, 0xb8, 0xb4, 0xc8, 0x00, 0x62 -}; - -static const unsigned int ld9040_22_90[] = { - 0x00, 0x13, 0xb9, 0xb8, 0xcd, 0x00, 0x46, - 0x00, 0xb1, 0xbc, 0xb5, 0xc8, 0x00, 0x56, - 0x00, 0xaa, 0xb8, 0xb4, 0xc9, 0x00, 0x5d -}; - -static const unsigned int ld9040_22_80[] = { - 0x00, 0x13, 0xba, 0xb9, 0xcd, 0x00, 0x41, - 0x00, 0xb0, 0xbe, 0xb5, 0xc9, 0x00, 0x51, - 0x00, 0xa9, 0xb9, 0xb5, 0xca, 0x00, 0x57 -}; - -static const unsigned int ld9040_22_70[] = { - 0x00, 0x13, 0xb9, 0xb9, 0xd0, 0x00, 0x3c, - 0x00, 0xaf, 0xbf, 0xb6, 0xcb, 0x00, 0x4b, - 0x00, 0xa8, 0xb9, 0xb5, 0xcc, 0x00, 0x52 -}; - -static const unsigned int ld9040_22_50[] = { - 0x00, 0x13, 0xb2, 0xba, 0xd2, 0x00, 0x30, - 0x00, 0xaf, 0xc0, 0xb8, 0xcd, 0x00, 0x3d, - 0x00, 0xa8, 0xb8, 0xb7, 0xcd, 0x00, 0x44 -}; - -struct ld9040_gamma { - unsigned int *gamma_22_table[MAX_GAMMA_LEVEL]; -}; - -static struct ld9040_gamma gamma_table = { - .gamma_22_table[0] = (unsigned int *)&ld9040_22_50, - .gamma_22_table[1] = (unsigned int *)&ld9040_22_70, - .gamma_22_table[2] = (unsigned int *)&ld9040_22_80, - .gamma_22_table[3] = (unsigned int *)&ld9040_22_90, - .gamma_22_table[4] = (unsigned int *)&ld9040_22_100, - .gamma_22_table[5] = (unsigned int *)&ld9040_22_110, - .gamma_22_table[6] = (unsigned int *)&ld9040_22_120, - .gamma_22_table[7] = (unsigned int *)&ld9040_22_130, - .gamma_22_table[8] = (unsigned int *)&ld9040_22_140, - .gamma_22_table[9] = (unsigned int *)&ld9040_22_150, - .gamma_22_table[10] = (unsigned int *)&ld9040_22_160, - .gamma_22_table[11] = (unsigned int *)&ld9040_22_170, - .gamma_22_table[12] = (unsigned int *)&ld9040_22_180, - .gamma_22_table[13] = (unsigned int *)&ld9040_22_190, - .gamma_22_table[14] = (unsigned int *)&ld9040_22_200, - .gamma_22_table[15] = (unsigned int *)&ld9040_22_210, - .gamma_22_table[16] = (unsigned int *)&ld9040_22_220, - .gamma_22_table[17] = (unsigned int *)&ld9040_22_230, - .gamma_22_table[18] = (unsigned int *)&ld9040_22_240, - .gamma_22_table[19] = (unsigned int *)&ld9040_22_250, - .gamma_22_table[20] = (unsigned int *)&ld9040_22_260, - .gamma_22_table[21] = (unsigned int *)&ld9040_22_270, - .gamma_22_table[22] = (unsigned int *)&ld9040_22_280, - .gamma_22_table[23] = (unsigned int *)&ld9040_22_290, - .gamma_22_table[24] = (unsigned int *)&ld9040_22_300, -}; - -#endif -- 2.14.1 From mboxrd@z Thu Jan 1 00:00:00 1970 From: Krzysztof Kozlowski Subject: [PATCH 2/2] backlight: Remove ld9040 driver Date: Mon, 30 Apr 2018 19:29:45 +0200 Message-ID: <20180430172945.20938-2-krzk@kernel.org> References: <20180430172945.20938-1-krzk@kernel.org> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by gabe.freedesktop.org (Postfix) with ESMTPS id 194BD6E265 for ; Mon, 30 Apr 2018 17:30:18 +0000 (UTC) In-Reply-To: <20180430172945.20938-1-krzk@kernel.org> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Lee Jones , Daniel Thompson , Jingoo Han , Bartlomiej Zolnierkiewicz , linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-fbdev@vger.kernel.org Cc: Krzysztof Kozlowski , Marek Szyprowski List-Id: dri-devel@lists.freedesktop.org VGhlIGRyaXZlciBmb3IgTEQ5MDQwIEFNT0xFRCBMQ0QgcGFuZWwgd2FzIHN1cGVyc2VkZWQgd2l0 aCBEUk0gZHJpdmVyCnBhbmVsLXNhbXN1bmctbGQ5MDQwLmMuICBJdCBkb2VzIG5vdCBzdXBwb3J0 IERldmljZVRyZWUgYW5kIHJlc3BlY3RpdmUKcG9zc2libGUgdXNlciAoRXh5bm9zNDIxMCBVbml2 ZXJzYWwgQzIxMCkgaXMgRGV2aWNlVHJlZS1vbmx5IGFuZCB1c2VzCkRSTSB2ZXJzaW9uIG9mIGRy aXZlci4uCgpTdWdnZXN0ZWQtYnk6IE1hcmVrIFN6eXByb3dza2kgPG0uc3p5cHJvd3NraUBzYW1z dW5nLmNvbT4KQ2M6IE1hcmVrIFN6eXByb3dza2kgPG0uc3p5cHJvd3NraUBzYW1zdW5nLmNvbT4K Q2M6IElua2kgRGFlIDxpbmtpLmRhZUBzYW1zdW5nLmNvbT4KU2lnbmVkLW9mZi1ieTogS3J6eXN6 dG9mIEtvemxvd3NraSA8a3J6a0BrZXJuZWwub3JnPgotLS0KIGRyaXZlcnMvdmlkZW8vYmFja2xp Z2h0L0tjb25maWcgICAgICAgIHwgICA4IC0KIGRyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L01ha2Vm aWxlICAgICAgIHwgICAxIC0KIGRyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2xkOTA0MC5jICAgICAg IHwgODExIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogZHJpdmVycy92aWRlby9i YWNrbGlnaHQvbGQ5MDQwX2dhbW1hLmggfCAyMDIgLS0tLS0tLS0KIDQgZmlsZXMgY2hhbmdlZCwg MTAyMiBkZWxldGlvbnMoLSkKIGRlbGV0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL3ZpZGVvL2JhY2ts aWdodC9sZDkwNDAuYwogZGVsZXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvdmlkZW8vYmFja2xpZ2h0 L2xkOTA0MF9nYW1tYS5oCgpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvS2Nv bmZpZyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L0tjb25maWcKaW5kZXggYmUwYzEzMGI2NTk3 Li4yMjAyZGFmMmFiNGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L0tjb25m aWcKKysrIGIvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvS2NvbmZpZwpAQCAtMTExLDE0ICsxMTEs NiBAQCBjb25maWcgTENEX0hQNzAwCiAJICBJZiB5b3UgaGF2ZSBhbiBIUCBKb3JuYWRhIDcwMCBz ZXJpZXMgaGFuZGhlbGQgKDcxMC83MjAvNzI4KQogCSAgc2F5IFkgdG8gZW5hYmxlIExDRCBjb250 cm9sIGRyaXZlci4KIAotY29uZmlnIExDRF9MRDkwNDAKLQl0cmlzdGF0ZSAiTEQ5MDQwIEFNT0xF RCBMQ0QgRHJpdmVyIgotCWRlcGVuZHMgb24gU1BJICYmIEJBQ0tMSUdIVF9DTEFTU19ERVZJQ0UK LQlkZWZhdWx0IG4KLQloZWxwCi0JICBJZiB5b3UgaGF2ZSBhbiBMRDkwNDAgUGFuZWwsIHNheSBZ IHRvIGVuYWJsZSBpdHMKLQkgIGNvbnRyb2wgZHJpdmVyLgotCiBjb25maWcgTENEX0FNUzM2OUZH MDYKIAl0cmlzdGF0ZSAiQU1TMzY5RkcwNiBBTU9MRUQgTENEIERyaXZlciIKIAlkZXBlbmRzIG9u IFNQSSAmJiBCQUNLTElHSFRfQ0xBU1NfREVWSUNFCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVv L2JhY2tsaWdodC9NYWtlZmlsZSBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L01ha2VmaWxlCmlu ZGV4IDg3NzNmZGQ2NGU5OS4uMGIzMjdjMGNiNzUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVv L2JhY2tsaWdodC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9NYWtlZmls ZQpAQCAtOSw3ICs5LDYgQEAgb2JqLSQoQ09ORklHX0xDRF9IWDgzNTcpCQkrPSBoeDgzNTcubwog b2JqLSQoQ09ORklHX0xDRF9JTEk5MjJYKQkJKz0gaWxpOTIyeC5vCiBvYmotJChDT05GSUdfTENE X0lMSTkzMjApCQkrPSBpbGk5MzIwLm8KIG9iai0kKENPTkZJR19MQ0RfTDRGMDAyNDJUMDMpCQkr PSBsNGYwMDI0MnQwMy5vCi1vYmotJChDT05GSUdfTENEX0xEOTA0MCkJCSs9IGxkOTA0MC5vCiBv YmotJChDT05GSUdfTENEX0xNUzI4M0dGMDUpCQkrPSBsbXMyODNnZjA1Lm8KIG9iai0kKENPTkZJ R19MQ0RfTE1TNTAxS0YwMykJCSs9IGxtczUwMWtmMDMubwogb2JqLSQoQ09ORklHX0xDRF9MVFYz NTBRVikJCSs9IGx0djM1MHF2Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0 L2xkOTA0MC5jIGIvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvbGQ5MDQwLmMKZGVsZXRlZCBmaWxl IG1vZGUgMTAwNjQ0CmluZGV4IDY3N2Y4YWJiYTI3Yy4uMDAwMDAwMDAwMDAwCi0tLSBhL2RyaXZl cnMvdmlkZW8vYmFja2xpZ2h0L2xkOTA0MC5jCisrKyAvZGV2L251bGwKQEAgLTEsODExICswLDAg QEAKLS8qCi0gKiBsZDkwNDAgQU1PTEVEIExDRCBwYW5lbCBkcml2ZXIuCi0gKgotICogQ29weXJp Z2h0IChjKSAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MKLSAqIEF1dGhvcjogRG9uZ2h3YSBMZWUg IDxkaDA5LmxlZUBzYW1zdW5nLmNvbT4KLSAqIERlcml2ZWQgZnJvbSBkcml2ZXJzL3ZpZGVvL2Jh Y2tsaWdodC9zNmU2M20wLmMKLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsg eW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRl cm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhl Ci0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExp Y2Vuc2UsIG9yIChhdCB5b3VyCi0gKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICovCi0K LSNpbmNsdWRlIDxsaW51eC9iYWNrbGlnaHQuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgot I2luY2x1ZGUgPGxpbnV4L2ZiLmg+Ci0jaW5jbHVkZSA8bGludXgvZ3Bpby5oPgotI2luY2x1ZGUg PGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2lycS5oPgotI2luY2x1ZGUgPGxp bnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2xjZC5oPgotI2luY2x1ZGUgPGxpbnV4L21v ZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgotI2luY2x1ZGUg PGxpbnV4L3NwaS9zcGkuaD4KLSNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0KLSNpbmNsdWRlICJs ZDkwNDBfZ2FtbWEuaCIKLQotI2RlZmluZSBTTEVFUE1TRUMJCTB4MTAwMAotI2RlZmluZSBFTkRE RUYJCQkweDIwMDAKLSNkZWZpbmUJREVGTUFTSwkJCTB4RkYwMAotI2RlZmluZSBDT01NQU5EX09O TFkJCTB4RkUKLSNkZWZpbmUgREFUQV9PTkxZCQkweEZGCi0KLSNkZWZpbmUgTUlOX0JSSUdIVE5F U1MJCTAKLSNkZWZpbmUgTUFYX0JSSUdIVE5FU1MJCTI0Ci0KLXN0cnVjdCBsZDkwNDAgewotCXN0 cnVjdCBkZXZpY2UJCQkqZGV2OwotCXN0cnVjdCBzcGlfZGV2aWNlCQkqc3BpOwotCXVuc2lnbmVk IGludAkJCXBvd2VyOwotCXVuc2lnbmVkIGludAkJCWN1cnJlbnRfYnJpZ2h0bmVzczsKLQotCXN0 cnVjdCBsY2RfZGV2aWNlCQkqbGQ7Ci0Jc3RydWN0IGJhY2tsaWdodF9kZXZpY2UJCSpiZDsKLQlz dHJ1Y3QgbGNkX3BsYXRmb3JtX2RhdGEJKmxjZF9wZDsKLQotCXN0cnVjdCBtdXRleAkJCWxvY2s7 Ci0JYm9vbCAgZW5hYmxlZDsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2J1bGtfZGF0 YSBzdXBwbGllc1tdID0gewotCXsgLnN1cHBseSA9ICJ2ZGQzIiwgfSwKLQl7IC5zdXBwbHkgPSAi dmNpIiwgfSwKLX07Ci0KLXN0YXRpYyB2b2lkIGxkOTA0MF9yZWd1bGF0b3JfZW5hYmxlKHN0cnVj dCBsZDkwNDAgKmxjZCkKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgbGNkX3BsYXRmb3JtX2Rh dGEgKnBkID0gTlVMTDsKLQotCXBkID0gbGNkLT5sY2RfcGQ7Ci0JbXV0ZXhfbG9jaygmbGNkLT5s b2NrKTsKLQlpZiAoIWxjZC0+ZW5hYmxlZCkgewotCQlyZXQgPSByZWd1bGF0b3JfYnVsa19lbmFi bGUoQVJSQVlfU0laRShzdXBwbGllcyksIHN1cHBsaWVzKTsKLQkJaWYgKHJldCkKLQkJCWdvdG8g b3V0OwotCi0JCWxjZC0+ZW5hYmxlZCA9IHRydWU7Ci0JfQotCW1zbGVlcChwZC0+cG93ZXJfb25f ZGVsYXkpOwotb3V0OgotCW11dGV4X3VubG9jaygmbGNkLT5sb2NrKTsKLX0KLQotc3RhdGljIHZv aWQgbGQ5MDQwX3JlZ3VsYXRvcl9kaXNhYmxlKHN0cnVjdCBsZDkwNDAgKmxjZCkKLXsKLQlpbnQg cmV0ID0gMDsKLQotCW11dGV4X2xvY2soJmxjZC0+bG9jayk7Ci0JaWYgKGxjZC0+ZW5hYmxlZCkg ewotCQlyZXQgPSByZWd1bGF0b3JfYnVsa19kaXNhYmxlKEFSUkFZX1NJWkUoc3VwcGxpZXMpLCBz dXBwbGllcyk7Ci0JCWlmIChyZXQpCi0JCQlnb3RvIG91dDsKLQotCQlsY2QtPmVuYWJsZWQgPSBm YWxzZTsKLQl9Ci1vdXQ6Ci0JbXV0ZXhfdW5sb2NrKCZsY2QtPmxvY2spOwotfQotCi1zdGF0aWMg Y29uc3QgdW5zaWduZWQgc2hvcnQgc2VxX3N3cmVzZXRbXSA9IHsKLQkweDAxLCBDT01NQU5EX09O TFksCi0JRU5EREVGLCAweDAwCi19OwotCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgc2Vx X3VzZXJfc2V0dGluZ1tdID0gewotCTB4RjAsIDB4NUEsCi0KLQlEQVRBX09OTFksIDB4NUEsCi0J RU5EREVGLCAweDAwCi19OwotCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgc2VxX2VsdnNz X29uW10gPSB7Ci0JMHhCMSwgMHgwRCwKLQotCURBVEFfT05MWSwgMHgwMCwKLQlEQVRBX09OTFks IDB4MTYsCi0JRU5EREVGLCAweDAwCi19OwotCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQg c2VxX2d0Y29uW10gPSB7Ci0JMHhGNywgMHgwOSwKLQotCURBVEFfT05MWSwgMHgwMCwKLQlEQVRB X09OTFksIDB4MDAsCi0JRU5EREVGLCAweDAwCi19OwotCi1zdGF0aWMgY29uc3QgdW5zaWduZWQg c2hvcnQgc2VxX3BhbmVsX2NvbmRpdGlvbltdID0gewotCTB4RjgsIDB4MDUsCi0KLQlEQVRBX09O TFksIDB4NjUsCi0JREFUQV9PTkxZLCAweDk2LAotCURBVEFfT05MWSwgMHg3MSwKLQlEQVRBX09O TFksIDB4N0QsCi0JREFUQV9PTkxZLCAweDE5LAotCURBVEFfT05MWSwgMHgzQiwKLQlEQVRBX09O TFksIDB4MEQsCi0JREFUQV9PTkxZLCAweDE5LAotCURBVEFfT05MWSwgMHg3RSwKLQlEQVRBX09O TFksIDB4MEQsCi0JREFUQV9PTkxZLCAweEUyLAotCURBVEFfT05MWSwgMHgwMCwKLQlEQVRBX09O TFksIDB4MDAsCi0JREFUQV9PTkxZLCAweDdFLAotCURBVEFfT05MWSwgMHg3RCwKLQlEQVRBX09O TFksIDB4MDcsCi0JREFUQV9PTkxZLCAweDA3LAotCURBVEFfT05MWSwgMHgyMCwKLQlEQVRBX09O TFksIDB4MjAsCi0JREFUQV9PTkxZLCAweDIwLAotCURBVEFfT05MWSwgMHgwMiwKLQlEQVRBX09O TFksIDB4MDIsCi0JRU5EREVGLCAweDAwCi19OwotCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgc2hv cnQgc2VxX2dhbW1hX3NldDFbXSA9IHsKLQkweEY5LCAweDAwLAotCi0JREFUQV9PTkxZLCAweEE3 LAotCURBVEFfT05MWSwgMHhCNCwKLQlEQVRBX09OTFksIDB4QUUsCi0JREFUQV9PTkxZLCAweEJG LAotCURBVEFfT05MWSwgMHgwMCwKLQlEQVRBX09OTFksIDB4OTEsCi0JREFUQV9PTkxZLCAweDAw LAotCURBVEFfT05MWSwgMHhCMiwKLQlEQVRBX09OTFksIDB4QjQsCi0JREFUQV9PTkxZLCAweEFB LAotCURBVEFfT05MWSwgMHhCQiwKLQlEQVRBX09OTFksIDB4MDAsCi0JREFUQV9PTkxZLCAweEFD LAotCURBVEFfT05MWSwgMHgwMCwKLQlEQVRBX09OTFksIDB4QjMsCi0JREFUQV9PTkxZLCAweEIx LAotCURBVEFfT05MWSwgMHhBQSwKLQlEQVRBX09OTFksIDB4QkMsCi0JREFUQV9PTkxZLCAweDAw LAotCURBVEFfT05MWSwgMHhCMywKLQlFTkRERUYsIDB4MDAKLX07Ci0KLXN0YXRpYyBjb25zdCB1 bnNpZ25lZCBzaG9ydCBzZXFfZ2FtbWFfY3RybFtdID0gewotCTB4RkIsIDB4MDIsCi0KLQlEQVRB X09OTFksIDB4NUEsCi0JRU5EREVGLCAweDAwCi19OwotCi1zdGF0aWMgY29uc3QgdW5zaWduZWQg c2hvcnQgc2VxX2dhbW1hX3N0YXJ0W10gPSB7Ci0JMHhGOSwgQ09NTUFORF9PTkxZLAotCi0JRU5E REVGLCAweDAwCi19OwotCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgc2VxX2Fwb25bXSA9 IHsKLQkweEYzLCAweDAwLAotCi0JREFUQV9PTkxZLCAweDAwLAotCURBVEFfT05MWSwgMHgwMCwK LQlEQVRBX09OTFksIDB4MEEsCi0JREFUQV9PTkxZLCAweDAyLAotCUVORERFRiwgMHgwMAotfTsK LQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IHNlcV9kaXNwbGF5X2N0cmxbXSA9IHsKLQkw eEYyLCAweDAyLAotCi0JREFUQV9PTkxZLCAweDA4LAotCURBVEFfT05MWSwgMHgwOCwKLQlEQVRB X09OTFksIDB4MTAsCi0JREFUQV9PTkxZLCAweDEwLAotCUVORERFRiwgMHgwMAotfTsKLQotc3Rh dGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IHNlcV9tYW51YWxfcHdyW10gPSB7Ci0JMHhCMCwgMHgw NCwKLQlFTkRERUYsIDB4MDAKLX07Ci0KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBzZXFf cHdyX2N0cmxbXSA9IHsKLQkweEY0LCAweDBBLAotCi0JREFUQV9PTkxZLCAweDg3LAotCURBVEFf T05MWSwgMHgyNSwKLQlEQVRBX09OTFksIDB4NkEsCi0JREFUQV9PTkxZLCAweDQ0LAotCURBVEFf T05MWSwgMHgwMiwKLQlEQVRBX09OTFksIDB4ODgsCi0JRU5EREVGLCAweDAwCi19OwotCi1zdGF0 aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgc2VxX3NsZWVwX291dFtdID0gewotCTB4MTEsIENPTU1B TkRfT05MWSwKLQlFTkRERUYsIDB4MDAKLX07Ci0KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9y dCBzZXFfc2xlZXBfaW5bXSA9IHsKLQkweDEwLCBDT01NQU5EX09OTFksCi0JRU5EREVGLCAweDAw Ci19OwotCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgc2VxX2Rpc3BsYXlfb25bXSA9IHsK LQkweDI5LCBDT01NQU5EX09OTFksCi0JRU5EREVGLCAweDAwCi19OwotCi1zdGF0aWMgY29uc3Qg dW5zaWduZWQgc2hvcnQgc2VxX2Rpc3BsYXlfb2ZmW10gPSB7Ci0JMHgyOCwgQ09NTUFORF9PTkxZ LAotCUVORERFRiwgMHgwMAotfTsKLQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IHNlcV92 Y2kxXzFzdF9lbltdID0gewotCTB4RjMsIDB4MTAsCi0KLQlEQVRBX09OTFksIDB4MDAsCi0JREFU QV9PTkxZLCAweDAwLAotCURBVEFfT05MWSwgMHgwMCwKLQlEQVRBX09OTFksIDB4MDIsCi0JRU5E REVGLCAweDAwCi19OwotCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgc2VxX3ZsMV9lbltd ID0gewotCTB4RjMsIDB4MTEsCi0KLQlEQVRBX09OTFksIDB4MDAsCi0JREFUQV9PTkxZLCAweDAw LAotCURBVEFfT05MWSwgMHgwMCwKLQlEQVRBX09OTFksIDB4MDIsCi0JRU5EREVGLCAweDAwCi19 OwotCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgc2VxX3ZsMl9lbltdID0gewotCTB4RjMs IDB4MTMsCi0KLQlEQVRBX09OTFksIDB4MDAsCi0JREFUQV9PTkxZLCAweDAwLAotCURBVEFfT05M WSwgMHgwMCwKLQlEQVRBX09OTFksIDB4MDIsCi0JRU5EREVGLCAweDAwCi19OwotCi1zdGF0aWMg Y29uc3QgdW5zaWduZWQgc2hvcnQgc2VxX3ZjaTFfMm5kX2VuW10gPSB7Ci0JMHhGMywgMHgzMywK LQotCURBVEFfT05MWSwgMHgwMCwKLQlEQVRBX09OTFksIDB4MDAsCi0JREFUQV9PTkxZLCAweDAw LAotCURBVEFfT05MWSwgMHgwMiwKLQlFTkRERUYsIDB4MDAKLX07Ci0KLXN0YXRpYyBjb25zdCB1 bnNpZ25lZCBzaG9ydCBzZXFfdmwzX2VuW10gPSB7Ci0JMHhGMywgMHgzNywKLQotCURBVEFfT05M WSwgMHgwMCwKLQlEQVRBX09OTFksIDB4MDAsCi0JREFUQV9PTkxZLCAweDAwLAotCURBVEFfT05M WSwgMHgwMiwKLQlFTkRERUYsIDB4MDAKLX07Ci0KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9y dCBzZXFfdnJlZzFfYW1wX2VuW10gPSB7Ci0JMHhGMywgMHgzNywKLQotCURBVEFfT05MWSwgMHgw MSwKLQlEQVRBX09OTFksIDB4MDAsCi0JREFUQV9PTkxZLCAweDAwLAotCURBVEFfT05MWSwgMHgw MiwKLQlFTkRERUYsIDB4MDAKLX07Ci0KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBzZXFf dmdoX2FtcF9lbltdID0gewotCTB4RjMsIDB4MzcsCi0KLQlEQVRBX09OTFksIDB4MTEsCi0JREFU QV9PTkxZLCAweDAwLAotCURBVEFfT05MWSwgMHgwMCwKLQlEQVRBX09OTFksIDB4MDIsCi0JRU5E REVGLCAweDAwCi19OwotCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgc2VxX3ZnbF9hbXBf ZW5bXSA9IHsKLQkweEYzLCAweDM3LAotCi0JREFUQV9PTkxZLCAweDMxLAotCURBVEFfT05MWSwg MHgwMCwKLQlEQVRBX09OTFksIDB4MDAsCi0JREFUQV9PTkxZLCAweDAyLAotCUVORERFRiwgMHgw MAotfTsKLQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IHNlcV92bW9zX2FtcF9lbltdID0g ewotCTB4RjMsIDB4MzcsCi0KLQlEQVRBX09OTFksIDB4QjEsCi0JREFUQV9PTkxZLCAweDAwLAot CURBVEFfT05MWSwgMHgwMCwKLQlEQVRBX09OTFksIDB4MDMsCi0JRU5EREVGLCAweDAwCi19Owot Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgc2VxX3ZpbnRfYW1wX2VuW10gPSB7Ci0JMHhG MywgMHgzNywKLQotCURBVEFfT05MWSwgMHhGMSwKLQkvKiBEQVRBX09OTFksIDB4NzEsCVZNT1Mv VkJML1ZCSCBub3QgdXNlZCAqLwotCURBVEFfT05MWSwgMHgwMCwKLQlEQVRBX09OTFksIDB4MDAs Ci0JREFUQV9PTkxZLCAweDAzLAotCS8qIERBVEFfT05MWSwgMHgwMiwJVk1PUy9WQkwvVkJIIG5v dCB1c2VkICovCi0JRU5EREVGLCAweDAwCi19OwotCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgc2hv cnQgc2VxX3ZiaF9hbXBfZW5bXSA9IHsKLQkweEYzLCAweDM3LAotCi0JREFUQV9PTkxZLCAweEY5 LAotCURBVEFfT05MWSwgMHgwMCwKLQlEQVRBX09OTFksIDB4MDAsCi0JREFUQV9PTkxZLCAweDAz LAotCUVORERFRiwgMHgwMAotfTsKLQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IHNlcV92 YmxfYW1wX2VuW10gPSB7Ci0JMHhGMywgMHgzNywKLQotCURBVEFfT05MWSwgMHhGRCwKLQlEQVRB X09OTFksIDB4MDAsCi0JREFUQV9PTkxZLCAweDAwLAotCURBVEFfT05MWSwgMHgwMywKLQlFTkRE RUYsIDB4MDAKLX07Ci0KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBzZXFfZ2FtX2FtcF9l bltdID0gewotCTB4RjMsIDB4MzcsCi0KLQlEQVRBX09OTFksIDB4RkYsCi0JLyogREFUQV9PTkxZ LCAweDczLAlWTU9TL1ZCTC9WQkggbm90IHVzZWQgKi8KLQlEQVRBX09OTFksIDB4MDAsCi0JREFU QV9PTkxZLCAweDAwLAotCURBVEFfT05MWSwgMHgwMywKLQkvKiBEQVRBX09OTFksIDB4MDIsCVZN T1MvVkJML1ZCSCBub3QgdXNlZCAqLwotCUVORERFRiwgMHgwMAotfTsKLQotc3RhdGljIGNvbnN0 IHVuc2lnbmVkIHNob3J0IHNlcV9zZF9hbXBfZW5bXSA9IHsKLQkweEYzLCAweDM3LAotCi0JREFU QV9PTkxZLCAweEZGLAotCS8qIERBVEFfT05MWSwgMHg3MywJVk1PUy9WQkwvVkJIIG5vdCB1c2Vk ICovCi0JREFUQV9PTkxZLCAweDgwLAotCURBVEFfT05MWSwgMHgwMCwKLQlEQVRBX09OTFksIDB4 MDMsCi0JLyogREFUQV9PTkxZLCAweDAyLAlWTU9TL1ZCTC9WQkggbm90IHVzZWQgKi8KLQlFTkRE RUYsIDB4MDAKLX07Ci0KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBzZXFfZ2xzX2VuW10g PSB7Ci0JMHhGMywgMHgzNywKLQotCURBVEFfT05MWSwgMHhGRiwKLQkvKiBEQVRBX09OTFksIDB4 NzMsCVZNT1MvVkJML1ZCSCBub3QgdXNlZCAqLwotCURBVEFfT05MWSwgMHg4MSwKLQlEQVRBX09O TFksIDB4MDAsCi0JREFUQV9PTkxZLCAweDAzLAotCS8qIERBVEFfT05MWSwgMHgwMiwJVk1PUy9W QkwvVkJIIG5vdCB1c2VkICovCi0JRU5EREVGLCAweDAwCi19OwotCi1zdGF0aWMgY29uc3QgdW5z aWduZWQgc2hvcnQgc2VxX2Vsc19lbltdID0gewotCTB4RjMsIDB4MzcsCi0KLQlEQVRBX09OTFks IDB4RkYsCi0JLyogREFUQV9PTkxZLCAweDczLAlWTU9TL1ZCTC9WQkggbm90IHVzZWQgKi8KLQlE QVRBX09OTFksIDB4ODMsCi0JREFUQV9PTkxZLCAweDAwLAotCURBVEFfT05MWSwgMHgwMywKLQkv KiBEQVRBX09OTFksIDB4MDIsCVZNT1MvVkJML1ZCSCBub3QgdXNlZCAqLwotCUVORERFRiwgMHgw MAotfTsKLQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IHNlcV9lbF9vbltdID0gewotCTB4 RjMsIDB4MzcsCi0KLQlEQVRBX09OTFksIDB4RkYsCi0JLyogREFUQV9PTkxZLCAweDczLAlWTU9T L1ZCTC9WQkggbm90IHVzZWQgKi8KLQlEQVRBX09OTFksIDB4ODcsCi0JREFUQV9PTkxZLCAweDAw LAotCURBVEFfT05MWSwgMHgwMywKLQkvKiBEQVRBX09OTFksIDB4MDIsCVZNT1MvVkJML1ZCSCBu b3QgdXNlZCAqLwotCUVORERFRiwgMHgwMAotfTsKLQotc3RhdGljIGludCBsZDkwNDBfc3BpX3dy aXRlX2J5dGUoc3RydWN0IGxkOTA0MCAqbGNkLCBpbnQgYWRkciwgaW50IGRhdGEpCi17Ci0JdTE2 IGJ1ZlsxXTsKLQlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOwotCi0Jc3RydWN0IHNwaV90cmFuc2Zl ciB4ZmVyID0gewotCQkubGVuCQk9IDIsCi0JCS50eF9idWYJCT0gYnVmLAotCX07Ci0KLQlidWZb MF0gPSAoYWRkciA8PCA4KSB8IGRhdGE7Ci0KLQlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOwotCXNw aV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyLCAmbXNnKTsKLQotCXJldHVybiBzcGlfc3luYyhsY2Qt PnNwaSwgJm1zZyk7Ci19Ci0KLXN0YXRpYyBpbnQgbGQ5MDQwX3NwaV93cml0ZShzdHJ1Y3QgbGQ5 MDQwICpsY2QsIHVuc2lnbmVkIGNoYXIgYWRkcmVzcywKLQl1bnNpZ25lZCBjaGFyIGNvbW1hbmQp Ci17Ci0JaW50IHJldCA9IDA7Ci0KLQlpZiAoYWRkcmVzcyAhPSBEQVRBX09OTFkpCi0JCXJldCA9 IGxkOTA0MF9zcGlfd3JpdGVfYnl0ZShsY2QsIDB4MCwgYWRkcmVzcyk7Ci0JaWYgKGNvbW1hbmQg IT0gQ09NTUFORF9PTkxZKQotCQlyZXQgPSBsZDkwNDBfc3BpX3dyaXRlX2J5dGUobGNkLCAweDEs IGNvbW1hbmQpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBsZDkwNDBfcGFuZWxf c2VuZF9zZXF1ZW5jZShzdHJ1Y3QgbGQ5MDQwICpsY2QsCi0JY29uc3QgdW5zaWduZWQgc2hvcnQg KndidWYpCi17Ci0JaW50IHJldCA9IDAsIGkgPSAwOwotCi0Jd2hpbGUgKCh3YnVmW2ldICYgREVG TUFTSykgIT0gRU5EREVGKSB7Ci0JCWlmICgod2J1ZltpXSAmIERFRk1BU0spICE9IFNMRUVQTVNF QykgewotCQkJcmV0ID0gbGQ5MDQwX3NwaV93cml0ZShsY2QsIHdidWZbaV0sIHdidWZbaSsxXSk7 Ci0JCQlpZiAocmV0KQotCQkJCWJyZWFrOwotCQl9IGVsc2UgewotCQkJbXNsZWVwKHdidWZbaSsx XSk7Ci0JCX0KLQkJaSArPSAyOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQg X2xkOTA0MF9nYW1tYV9jdGwoc3RydWN0IGxkOTA0MCAqbGNkLCBjb25zdCB1bnNpZ25lZCBpbnQg KmdhbW1hKQotewotCXVuc2lnbmVkIGludCBpID0gMDsKLQlpbnQgcmV0ID0gMDsKLQotCS8qIHN0 YXJ0IGdhbW1hIHRhYmxlIHVwZGF0aW5nLiAqLwotCXJldCA9IGxkOTA0MF9wYW5lbF9zZW5kX3Nl cXVlbmNlKGxjZCwgc2VxX2dhbW1hX3N0YXJ0KTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIobGNk LT5kZXYsICJmYWlsZWQgdG8gZGlzYWJsZSBnYW1tYSB0YWJsZSB1cGRhdGluZy5cbiIpOwotCQln b3RvIGdhbW1hX2VycjsKLQl9Ci0KLQlmb3IgKGkgPSAwIDsgaSA8IEdBTU1BX1RBQkxFX0NPVU5U OyBpKyspIHsKLQkJcmV0ID0gbGQ5MDQwX3NwaV93cml0ZShsY2QsIERBVEFfT05MWSwgZ2FtbWFb aV0pOwotCQlpZiAocmV0KSB7Ci0JCQlkZXZfZXJyKGxjZC0+ZGV2LCAiZmFpbGVkIHRvIHNldCBn YW1tYSB0YWJsZS5cbiIpOwotCQkJZ290byBnYW1tYV9lcnI7Ci0JCX0KLQl9Ci0KLQkvKiB1cGRh dGUgZ2FtbWEgdGFibGUuICovCi0JcmV0ID0gbGQ5MDQwX3BhbmVsX3NlbmRfc2VxdWVuY2UobGNk LCBzZXFfZ2FtbWFfY3RybCk7Ci0JaWYgKHJldCkKLQkJZGV2X2VycihsY2QtPmRldiwgImZhaWxl ZCB0byB1cGRhdGUgZ2FtbWEgdGFibGUuXG4iKTsKLQotZ2FtbWFfZXJyOgotCXJldHVybiByZXQ7 Ci19Ci0KLXN0YXRpYyBpbnQgbGQ5MDQwX2dhbW1hX2N0bChzdHJ1Y3QgbGQ5MDQwICpsY2QsIGlu dCBnYW1tYSkKLXsKLQlyZXR1cm4gX2xkOTA0MF9nYW1tYV9jdGwobGNkLCBnYW1tYV90YWJsZS5n YW1tYV8yMl90YWJsZVtnYW1tYV0pOwotfQotCi1zdGF0aWMgaW50IGxkOTA0MF9sZGlfaW5pdChz dHJ1Y3QgbGQ5MDQwICpsY2QpCi17Ci0JaW50IHJldCwgaTsKLQlzdGF0aWMgY29uc3QgdW5zaWdu ZWQgc2hvcnQgKmluaXRfc2VxW10gPSB7Ci0JCXNlcV91c2VyX3NldHRpbmcsCi0JCXNlcV9wYW5l bF9jb25kaXRpb24sCi0JCXNlcV9kaXNwbGF5X2N0cmwsCi0JCXNlcV9tYW51YWxfcHdyLAotCQlz ZXFfZWx2c3Nfb24sCi0JCXNlcV9ndGNvbiwKLQkJc2VxX2dhbW1hX3NldDEsCi0JCXNlcV9nYW1t YV9jdHJsLAotCQlzZXFfc2xlZXBfb3V0LAotCX07Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlf U0laRShpbml0X3NlcSk7IGkrKykgewotCQlyZXQgPSBsZDkwNDBfcGFuZWxfc2VuZF9zZXF1ZW5j ZShsY2QsIGluaXRfc2VxW2ldKTsKLQkJLyogd29ya2Fyb3VuZDogbWluaW11bSBkZWxheSB0aW1l IGZvciB0cmFuc2ZlcnJpbmcgQ01EICovCi0JCXVzbGVlcF9yYW5nZSgzMDAsIDMxMCk7Ci0JCWlm IChyZXQpCi0JCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGxk OTA0MF9sZGlfZW5hYmxlKHN0cnVjdCBsZDkwNDAgKmxjZCkKLXsKLQlyZXR1cm4gbGQ5MDQwX3Bh bmVsX3NlbmRfc2VxdWVuY2UobGNkLCBzZXFfZGlzcGxheV9vbik7Ci19Ci0KLXN0YXRpYyBpbnQg bGQ5MDQwX2xkaV9kaXNhYmxlKHN0cnVjdCBsZDkwNDAgKmxjZCkKLXsKLQlpbnQgcmV0OwotCi0J cmV0ID0gbGQ5MDQwX3BhbmVsX3NlbmRfc2VxdWVuY2UobGNkLCBzZXFfZGlzcGxheV9vZmYpOwot CXJldCA9IGxkOTA0MF9wYW5lbF9zZW5kX3NlcXVlbmNlKGxjZCwgc2VxX3NsZWVwX2luKTsKLQot CXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbGQ5MDQwX3Bvd2VyX2lzX29uKGludCBwb3dl cikKLXsKLQlyZXR1cm4gcG93ZXIgPD0gRkJfQkxBTktfTk9STUFMOwotfQotCi1zdGF0aWMgaW50 IGxkOTA0MF9wb3dlcl9vbihzdHJ1Y3QgbGQ5MDQwICpsY2QpCi17Ci0JaW50IHJldCA9IDA7Ci0J c3RydWN0IGxjZF9wbGF0Zm9ybV9kYXRhICpwZDsKLQotCXBkID0gbGNkLT5sY2RfcGQ7Ci0KLQkv KiBsY2QgcG93ZXIgb24gKi8KLQlsZDkwNDBfcmVndWxhdG9yX2VuYWJsZShsY2QpOwotCi0JaWYg KCFwZC0+cmVzZXQpIHsKLQkJZGV2X2VycihsY2QtPmRldiwgInJlc2V0IGlzIE5VTEwuXG4iKTsK LQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcGQtPnJlc2V0KGxjZC0+bGQpOwotCW1zbGVlcChw ZC0+cmVzZXRfZGVsYXkpOwotCi0JcmV0ID0gbGQ5MDQwX2xkaV9pbml0KGxjZCk7Ci0JaWYgKHJl dCkgewotCQlkZXZfZXJyKGxjZC0+ZGV2LCAiZmFpbGVkIHRvIGluaXRpYWxpemUgbGRpLlxuIik7 Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcmV0ID0gbGQ5MDQwX2xkaV9lbmFibGUobGNkKTsKLQlp ZiAocmV0KSB7Ci0JCWRldl9lcnIobGNkLT5kZXYsICJmYWlsZWQgdG8gZW5hYmxlIGxkaS5cbiIp OwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGxkOTA0 MF9wb3dlcl9vZmYoc3RydWN0IGxkOTA0MCAqbGNkKQotewotCWludCByZXQ7Ci0Jc3RydWN0IGxj ZF9wbGF0Zm9ybV9kYXRhICpwZDsKLQotCXBkID0gbGNkLT5sY2RfcGQ7Ci0KLQlyZXQgPSBsZDkw NDBfbGRpX2Rpc2FibGUobGNkKTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIobGNkLT5kZXYsICJs Y2Qgc2V0dGluZyBmYWlsZWQuXG4iKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JbXNsZWVwKHBk LT5wb3dlcl9vZmZfZGVsYXkpOwotCi0JLyogbGNkIHBvd2VyIG9mZiAqLwotCWxkOTA0MF9yZWd1 bGF0b3JfZGlzYWJsZShsY2QpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbGQ5MDQw X3Bvd2VyKHN0cnVjdCBsZDkwNDAgKmxjZCwgaW50IHBvd2VyKQotewotCWludCByZXQgPSAwOwot Ci0JaWYgKGxkOTA0MF9wb3dlcl9pc19vbihwb3dlcikgJiYgIWxkOTA0MF9wb3dlcl9pc19vbihs Y2QtPnBvd2VyKSkKLQkJcmV0ID0gbGQ5MDQwX3Bvd2VyX29uKGxjZCk7Ci0JZWxzZSBpZiAoIWxk OTA0MF9wb3dlcl9pc19vbihwb3dlcikgJiYgbGQ5MDQwX3Bvd2VyX2lzX29uKGxjZC0+cG93ZXIp KQotCQlyZXQgPSBsZDkwNDBfcG93ZXJfb2ZmKGxjZCk7Ci0KLQlpZiAoIXJldCkKLQkJbGNkLT5w b3dlciA9IHBvd2VyOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBsZDkwNDBfc2V0 X3Bvd2VyKHN0cnVjdCBsY2RfZGV2aWNlICpsZCwgaW50IHBvd2VyKQotewotCXN0cnVjdCBsZDkw NDAgKmxjZCA9IGxjZF9nZXRfZGF0YShsZCk7Ci0KLQlpZiAocG93ZXIgIT0gRkJfQkxBTktfVU5C TEFOSyAmJiBwb3dlciAhPSBGQl9CTEFOS19QT1dFUkRPV04gJiYKLQkJcG93ZXIgIT0gRkJfQkxB TktfTk9STUFMKSB7Ci0JCWRldl9lcnIobGNkLT5kZXYsICJwb3dlciB2YWx1ZSBzaG91bGQgYmUg MCwgMSBvciA0LlxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXJldHVybiBsZDkwNDBf cG93ZXIobGNkLCBwb3dlcik7Ci19Ci0KLXN0YXRpYyBpbnQgbGQ5MDQwX2dldF9wb3dlcihzdHJ1 Y3QgbGNkX2RldmljZSAqbGQpCi17Ci0Jc3RydWN0IGxkOTA0MCAqbGNkID0gbGNkX2dldF9kYXRh KGxkKTsKLQotCXJldHVybiBsY2QtPnBvd2VyOwotfQotCi1zdGF0aWMgaW50IGxkOTA0MF9zZXRf YnJpZ2h0bmVzcyhzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQpCi17Ci0JaW50IHJldCA9IDAs IGJyaWdodG5lc3MgPSBiZC0+cHJvcHMuYnJpZ2h0bmVzczsKLQlzdHJ1Y3QgbGQ5MDQwICpsY2Qg PSBibF9nZXRfZGF0YShiZCk7Ci0KLQlpZiAoYnJpZ2h0bmVzcyA8IE1JTl9CUklHSFRORVNTIHx8 Ci0JCWJyaWdodG5lc3MgPiBiZC0+cHJvcHMubWF4X2JyaWdodG5lc3MpIHsKLQkJZGV2X2Vycigm YmQtPmRldiwgImxjZCBicmlnaHRuZXNzIHNob3VsZCBiZSAlZCB0byAlZC5cbiIsCi0JCQlNSU5f QlJJR0hUTkVTUywgTUFYX0JSSUdIVE5FU1MpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQly ZXQgPSBsZDkwNDBfZ2FtbWFfY3RsKGxjZCwgYmQtPnByb3BzLmJyaWdodG5lc3MpOwotCWlmIChy ZXQpIHsKLQkJZGV2X2VycigmYmQtPmRldiwgImxjZCBicmlnaHRuZXNzIHNldHRpbmcgZmFpbGVk LlxuIik7Ci0JCXJldHVybiAtRUlPOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBz dHJ1Y3QgbGNkX29wcyBsZDkwNDBfbGNkX29wcyA9IHsKLQkuc2V0X3Bvd2VyID0gbGQ5MDQwX3Nl dF9wb3dlciwKLQkuZ2V0X3Bvd2VyID0gbGQ5MDQwX2dldF9wb3dlciwKLX07Ci0KLXN0YXRpYyBj b25zdCBzdHJ1Y3QgYmFja2xpZ2h0X29wcyBsZDkwNDBfYmFja2xpZ2h0X29wcyAgPSB7Ci0JLnVw ZGF0ZV9zdGF0dXMgPSBsZDkwNDBfc2V0X2JyaWdodG5lc3MsCi19OwotCi1zdGF0aWMgaW50IGxk OTA0MF9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQotewotCWludCByZXQgPSAwOwotCXN0 cnVjdCBsZDkwNDAgKmxjZCA9IE5VTEw7Ci0Jc3RydWN0IGxjZF9kZXZpY2UgKmxkID0gTlVMTDsK LQlzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQgPSBOVUxMOwotCXN0cnVjdCBiYWNrbGlnaHRf cHJvcGVydGllcyBwcm9wczsKLQotCWxjZCA9IGRldm1fa3phbGxvYygmc3BpLT5kZXYsIHNpemVv ZihzdHJ1Y3QgbGQ5MDQwKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFsY2QpCi0JCXJldHVybiAtRU5P TUVNOwotCi0JLyogbGQ5MDQwIGxjZCBwYW5lbCB1c2VzIDMtd2lyZSA5Yml0cyBTUEkgTW9kZS4g Ki8KLQlzcGktPmJpdHNfcGVyX3dvcmQgPSA5OwotCi0JcmV0ID0gc3BpX3NldHVwKHNwaSk7Ci0J aWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycigmc3BpLT5kZXYsICJzcGkgc2V0dXAgZmFpbGVkLlxu Iik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JbGNkLT5zcGkgPSBzcGk7Ci0JbGNkLT5kZXYgPSAm c3BpLT5kZXY7Ci0KLQlsY2QtPmxjZF9wZCA9IGRldl9nZXRfcGxhdGRhdGEoJnNwaS0+ZGV2KTsK LQlpZiAoIWxjZC0+bGNkX3BkKSB7Ci0JCWRldl9lcnIoJnNwaS0+ZGV2LCAicGxhdGZvcm0gZGF0 YSBpcyBOVUxMLlxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCW11dGV4X2luaXQoJmxj ZC0+bG9jayk7Ci0KLQlyZXQgPSBkZXZtX3JlZ3VsYXRvcl9idWxrX2dldChsY2QtPmRldiwgQVJS QVlfU0laRShzdXBwbGllcyksIHN1cHBsaWVzKTsKLQlpZiAocmV0KSB7Ci0JCWRldl9lcnIobGNk LT5kZXYsICJGYWlsZWQgdG8gZ2V0IHJlZ3VsYXRvcnM6ICVkXG4iLCByZXQpOwotCQlyZXR1cm4g cmV0OwotCX0KLQotCWxkID0gZGV2bV9sY2RfZGV2aWNlX3JlZ2lzdGVyKCZzcGktPmRldiwgImxk OTA0MCIsICZzcGktPmRldiwgbGNkLAotCQkJCQkmbGQ5MDQwX2xjZF9vcHMpOwotCWlmIChJU19F UlIobGQpKQotCQlyZXR1cm4gUFRSX0VSUihsZCk7Ci0KLQlsY2QtPmxkID0gbGQ7Ci0KLQltZW1z ZXQoJnByb3BzLCAwLCBzaXplb2Yoc3RydWN0IGJhY2tsaWdodF9wcm9wZXJ0aWVzKSk7Ci0JcHJv cHMudHlwZSA9IEJBQ0tMSUdIVF9SQVc7Ci0JcHJvcHMubWF4X2JyaWdodG5lc3MgPSBNQVhfQlJJ R0hUTkVTUzsKLQotCWJkID0gZGV2bV9iYWNrbGlnaHRfZGV2aWNlX3JlZ2lzdGVyKCZzcGktPmRl diwgImxkOTA0MC1ibCIsICZzcGktPmRldiwKLQkJCQkJbGNkLCAmbGQ5MDQwX2JhY2tsaWdodF9v cHMsICZwcm9wcyk7Ci0JaWYgKElTX0VSUihiZCkpCi0JCXJldHVybiBQVFJfRVJSKGJkKTsKLQot CWJkLT5wcm9wcy5icmlnaHRuZXNzID0gTUFYX0JSSUdIVE5FU1M7Ci0JbGNkLT5iZCA9IGJkOwot Ci0JLyoKLQkgKiBpZiBsY2QgcGFuZWwgd2FzIG9uIGZyb20gYm9vdGxvYWRlciBsaWtlIHUtYm9v dCB0aGVuCi0JICogZG8gbm90IGxjZCBvbi4KLQkgKi8KLQlpZiAoIWxjZC0+bGNkX3BkLT5sY2Rf ZW5hYmxlZCkgewotCQkvKgotCQkgKiBpZiBsY2QgcGFuZWwgd2FzIG9mZiBmcm9tIGJvb3Rsb2Fk ZXIgdGhlbgotCQkgKiBjdXJyZW50IGxjZCBzdGF0dXMgaXMgcG93ZXJkb3duIGFuZCB0aGVuCi0J CSAqIGl0IGVuYWJsZXMgbGNkIHBhbmVsLgotCQkgKi8KLQkJbGNkLT5wb3dlciA9IEZCX0JMQU5L X1BPV0VSRE9XTjsKLQotCQlsZDkwNDBfcG93ZXIobGNkLCBGQl9CTEFOS19VTkJMQU5LKTsKLQl9 IGVsc2UgewotCQlsY2QtPnBvd2VyID0gRkJfQkxBTktfVU5CTEFOSzsKLQl9Ci0KLQlzcGlfc2V0 X2RydmRhdGEoc3BpLCBsY2QpOwotCi0JZGV2X2luZm8oJnNwaS0+ZGV2LCAibGQ5MDQwIHBhbmVs IGRyaXZlciBoYXMgYmVlbiBwcm9iZWQuXG4iKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGlu dCBsZDkwNDBfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCi17Ci0Jc3RydWN0IGxkOTA0 MCAqbGNkID0gc3BpX2dldF9kcnZkYXRhKHNwaSk7Ci0KLQlsZDkwNDBfcG93ZXIobGNkLCBGQl9C TEFOS19QT1dFUkRPV04pOwotCXJldHVybiAwOwotfQotCi0jaWZkZWYgQ09ORklHX1BNX1NMRUVQ Ci1zdGF0aWMgaW50IGxkOTA0MF9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1 Y3QgbGQ5MDQwICpsY2QgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQotCWRldl9kYmcoZGV2LCAi bGNkLT5wb3dlciA9ICVkXG4iLCBsY2QtPnBvd2VyKTsKLQotCS8qCi0JICogd2hlbiBsY2QgcGFu ZWwgaXMgc3VzcGVuZCwgbGNkIHBhbmVsIGJlY29tZXMgb2ZmCi0JICogcmVnYXJkbGVzcyBvZiBz dGF0dXMuCi0JICovCi0JcmV0dXJuIGxkOTA0MF9wb3dlcihsY2QsIEZCX0JMQU5LX1BPV0VSRE9X Tik7Ci19Ci0KLXN0YXRpYyBpbnQgbGQ5MDQwX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCi17 Ci0Jc3RydWN0IGxkOTA0MCAqbGNkID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0KLQlsY2QtPnBv d2VyID0gRkJfQkxBTktfUE9XRVJET1dOOwotCi0JcmV0dXJuIGxkOTA0MF9wb3dlcihsY2QsIEZC X0JMQU5LX1VOQkxBTkspOwotfQotI2VuZGlmCi0KLXN0YXRpYyBTSU1QTEVfREVWX1BNX09QUyhs ZDkwNDBfcG1fb3BzLCBsZDkwNDBfc3VzcGVuZCwgbGQ5MDQwX3Jlc3VtZSk7Ci0KLS8qIFBvd2Vy IGRvd24gYWxsIGRpc3BsYXlzIG9uIHJlYm9vdCwgcG93ZXJvZmYgb3IgaGFsdC4gKi8KLXN0YXRp YyB2b2lkIGxkOTA0MF9zaHV0ZG93bihzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQotewotCXN0cnVj dCBsZDkwNDAgKmxjZCA9IHNwaV9nZXRfZHJ2ZGF0YShzcGkpOwotCi0JbGQ5MDQwX3Bvd2VyKGxj ZCwgRkJfQkxBTktfUE9XRVJET1dOKTsKLX0KLQotc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIGxk OTA0MF9kcml2ZXIgPSB7Ci0JLmRyaXZlciA9IHsKLQkJLm5hbWUJPSAibGQ5MDQwIiwKLQkJLnBt CT0gJmxkOTA0MF9wbV9vcHMsCi0JfSwKLQkucHJvYmUJCT0gbGQ5MDQwX3Byb2JlLAotCS5yZW1v dmUJCT0gbGQ5MDQwX3JlbW92ZSwKLQkuc2h1dGRvd24JPSBsZDkwNDBfc2h1dGRvd24sCi19Owot Ci1tb2R1bGVfc3BpX2RyaXZlcihsZDkwNDBfZHJpdmVyKTsKLQotTU9EVUxFX0FVVEhPUigiRG9u Z2h3YSBMZWUgPGRoMDkubGVlQHNhbXN1bmcuY29tPiIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKCJs ZDkwNDAgTENEIERyaXZlciIpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEv ZHJpdmVycy92aWRlby9iYWNrbGlnaHQvbGQ5MDQwX2dhbW1hLmggYi9kcml2ZXJzL3ZpZGVvL2Jh Y2tsaWdodC9sZDkwNDBfZ2FtbWEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVl NTg2ZDk3Mzg1Li4wMDAwMDAwMDAwMDAKLS0tIGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvbGQ5 MDQwX2dhbW1hLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotLyoKLSAqIEdhbW1h IGxldmVsIGRlZmluaXRpb25zLgotICoKLSAqIENvcHlyaWdodCAoYykgMjAxMSBTYW1zdW5nIEVs ZWN0cm9uaWNzCi0gKiBJbktpIERhZSA8aW5raS5kYWVAc2Ftc3VuZy5jb20+Ci0gKiBEb25naHdh IExlZSA8ZGgwOS5sZWVAc2Ftc3VuZy5jb20+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUg c29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVu ZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAy IGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSovCi0K LSNpZm5kZWYgX0xEOTA0MF9CUklHSFRORVNTX0gKLSNkZWZpbmUgX0xEOTA0MF9CUklHSFRORVNT X0gKLQotI2RlZmluZSBNQVhfR0FNTUFfTEVWRUwJCTI1Ci0jZGVmaW5lIEdBTU1BX1RBQkxFX0NP VU5UCTIxCi0KLS8qIGdhbW1hIHZhbHVlOiAyLjIgKi8KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBp bnQgbGQ5MDQwXzIyXzMwMFtdID0gewotCTB4MDAsIDB4YTcsIDB4YjQsIDB4YWUsIDB4YmYsIDB4 MDAsIDB4OTEsCi0JMHgwMCwgMHhiMiwgMHhiNCwgMHhhYSwgMHhiYiwgMHgwMCwgMHhhYywKLQkw eDAwLCAweGIzLCAweGIxLCAweGFhLCAweGJjLCAweDAwLCAweGIzCi19OwotCi1zdGF0aWMgY29u c3QgdW5zaWduZWQgaW50IGxkOTA0MF8yMl8yOTBbXSA9IHsKLQkweDAwLCAweGE5LCAweGI3LCAw eGFlLCAweGJkLCAweDAwLCAweDg5LAotCTB4MDAsIDB4YjcsIDB4YjYsIDB4YTgsIDB4YmEsIDB4 MDAsIDB4YTQsCi0JMHgwMCwgMHhiMSwgMHhiNCwgMHhhYSwgMHhiYiwgMHgwMCwgMHhhYQotfTsK LQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBsZDkwNDBfMjJfMjgwW10gPSB7Ci0JMHgwMCwg MHhhOSwgMHhiNiwgMHhhZCwgMHhiZiwgMHgwMCwgMHg4NiwKLQkweDAwLCAweGI4LCAweGI1LCAw eGE4LCAweGJjLCAweDAwLCAweGEwLAotCTB4MDAsIDB4YjMsIDB4YjMsIDB4YTksIDB4YmMsIDB4 MDAsIDB4YTcKLX07Ci0KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbGQ5MDQwXzIyXzI3MFtd ID0gewotCTB4MDAsIDB4YTgsIDB4YjgsIDB4YWUsIDB4YmUsIDB4MDAsIDB4ODQsCi0JMHgwMCwg MHhiOSwgMHhiNywgMHhhOCwgMHhiYywgMHgwMCwgMHg5ZCwKLQkweDAwLCAweGIyLCAweGI1LCAw eGFhLCAweGJjLCAweDAwLCAweGE0Ci0KLX07Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGxk OTA0MF8yMl8yNjBbXSA9IHsKLQkweDAwLCAweGE0LCAweGI4LCAweGIwLCAweGJmLCAweDAwLCAw eDgwLAotCTB4MDAsIDB4YjgsIDB4YjYsIDB4YWEsIDB4YmMsIDB4MDAsIDB4OWEsCi0JMHgwMCwg MHhiMCwgMHhiNSwgMHhhYiwgMHhiZCwgMHgwMCwgMHhhMAotfTsKLQotc3RhdGljIGNvbnN0IHVu c2lnbmVkIGludCBsZDkwNDBfMjJfMjUwW10gPSB7Ci0JMHgwMCwgMHhhNCwgMHhiOSwgMHhhZiwg MHhjMSwgMHgwMCwgMHg3ZCwKLQkweDAwLCAweGI5LCAweGI2LCAweGFhLCAweGJiLCAweDAwLCAw eDk3LAotCTB4MDAsIDB4YjEsIDB4YjUsIDB4YWEsIDB4YmYsIDB4MDAsIDB4OWQKLX07Ci0KLXN0 YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbGQ5MDQwXzIyXzI0MFtdID0gewotCTB4MDAsIDB4YTIs IDB4YjksIDB4YWYsIDB4YzIsIDB4MDAsIDB4N2EsCi0JMHgwMCwgMHhiOSwgMHhiNywgMHhhYSwg MHhiZCwgMHgwMCwgMHg5NCwKLQkweDAwLCAweGIwLCAweGI1LCAweGFiLCAweGJmLCAweDAwLCAw eDlhCi19OwotCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGxkOTA0MF8yMl8yMzBbXSA9IHsK LQkweDAwLCAweGEwLCAweGI5LCAweGFmLCAweGMzLCAweDAwLCAweDc3LAotCTB4MDAsIDB4Yjks IDB4YjcsIDB4YWIsIDB4YmUsIDB4MDAsIDB4OTAsCi0JMHgwMCwgMHhiMCwgMHhiNiwgMHhhYiwg MHhiZiwgMHgwMCwgMHg5NwotfTsKLQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBsZDkwNDBf MjJfMjIwW10gPSB7Ci0JMHgwMCwgMHg5ZSwgMHhiYSwgMHhiMCwgMHhjMiwgMHgwMCwgMHg3NSwK LQkweDAwLCAweGI5LCAweGI4LCAweGFiLCAweGJlLCAweDAwLCAweDhlLAotCTB4MDAsIDB4YjAs IDB4YjYsIDB4YWMsIDB4YmYsIDB4MDAsIDB4OTQKLX07Ci0KLXN0YXRpYyBjb25zdCB1bnNpZ25l ZCBpbnQgbGQ5MDQwXzIyXzIxMFtdID0gewotCTB4MDAsIDB4OWMsIDB4YjksIDB4YjAsIDB4YzQs IDB4MDAsIDB4NzIsCi0JMHgwMCwgMHhiOCwgMHhiOCwgMHhhYywgMHhiZiwgMHgwMCwgMHg4YSwK LQkweDAwLCAweGIwLCAweGI2LCAweGFjLCAweGMwLCAweDAwLCAweDkxCi19OwotCi1zdGF0aWMg Y29uc3QgdW5zaWduZWQgaW50IGxkOTA0MF8yMl8yMDBbXSA9IHsKLQkweDAwLCAweDlhLCAweGJh LCAweGIxLCAweGM0LCAweDAwLCAweDZmLAotCTB4MDAsIDB4YjgsIDB4YjgsIDB4YWQsIDB4YzAs IDB4MDAsIDB4ODYsCi0JMHgwMCwgMHhiMCwgMHhiNywgMHhhZCwgMHhjMCwgMHgwMCwgMHg4ZAot fTsKLQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBsZDkwNDBfMjJfMTkwW10gPSB7Ci0JMHgw MCwgMHg5NywgMHhiYSwgMHhiMiwgMHhjNSwgMHgwMCwgMHg2YywKLQkweDAwLCAweGI4LCAweGI4 LCAweGFlLCAweGMxLCAweDAwLCAweDgyLAotCTB4MDAsIDB4YjAsIDB4YjYsIDB4YWUsIDB4YzIs IDB4MDAsIDB4ODkKLX07Ci0KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbGQ5MDQwXzIyXzE4 MFtdID0gewotCTB4MDAsIDB4OTMsIDB4YmEsIDB4YjMsIDB4YzUsIDB4MDAsIDB4NjksCi0JMHgw MCwgMHhiOCwgMHhiOSwgMHhhZSwgMHhjMSwgMHgwMCwgMHg3ZiwKLQkweDAwLCAweGIwLCAweGI2 LCAweGFlLCAweGMzLCAweDAwLCAweDg1Ci19OwotCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50 IGxkOTA0MF8yMl8xNzBbXSA9IHsKLQkweDAwLCAweDhiLCAweGI5LCAweGIzLCAweGM3LCAweDAw LCAweDY1LAotCTB4MDAsIDB4YjcsIDB4YjgsIDB4YWYsIDB4YzMsIDB4MDAsIDB4N2EsCi0JMHgw MCwgMHg4MCwgMHhiNiwgMHhhZSwgMHhjNCwgMHgwMCwgMHg4MQotfTsKLQotc3RhdGljIGNvbnN0 IHVuc2lnbmVkIGludCBsZDkwNDBfMjJfMTYwW10gPSB7Ci0JMHgwMCwgMHg4OSwgMHhiYSwgMHhi MywgMHhjOCwgMHgwMCwgMHg2MiwKLQkweDAwLCAweGI2LCAweGJhLCAweGFmLCAweGMzLCAweDAw LCAweDc2LAotCTB4MDAsIDB4YWYsIDB4YjcsIDB4YWUsIDB4YzQsIDB4MDAsIDB4N2UKLX07Ci0K LXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbGQ5MDQwXzIyXzE1MFtdID0gewotCTB4MDAsIDB4 ODIsIDB4YmEsIDB4YjQsIDB4YzcsIDB4MDAsIDB4NWYsCi0JMHgwMCwgMHhiNSwgMHhiYSwgMHhi MCwgMHhjMywgMHgwMCwgMHg3MiwKLQkweDAwLCAweGFlLCAweGI4LCAweGIwLCAweGMzLCAweDAw LCAweDdhCi19OwotCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGxkOTA0MF8yMl8xNDBbXSA9 IHsKLQkweDAwLCAweDdiLCAweGJiLCAweGI0LCAweGM4LCAweDAwLCAweDViLAotCTB4MDAsIDB4 YjUsIDB4YmEsIDB4YjEsIDB4YzQsIDB4MDAsIDB4NmUsCi0JMHgwMCwgMHhhZSwgMHhiOSwgMHhi MCwgMHhjNSwgMHgwMCwgMHg3NQotfTsKLQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBsZDkw NDBfMjJfMTMwW10gPSB7Ci0JMHgwMCwgMHg3MSwgMHhiYiwgMHhiNSwgMHhjOCwgMHgwMCwgMHg1 NywKLQkweDAwLCAweGI1LCAweGJiLCAweGIwLCAweGM1LCAweDAwLCAweDZhLAotCTB4MDAsIDB4 YWUsIDB4YjksIDB4YjEsIDB4YzYsIDB4MDAsIDB4NzAKLX07Ci0KLXN0YXRpYyBjb25zdCB1bnNp Z25lZCBpbnQgbGQ5MDQwXzIyXzEyMFtdID0gewotCTB4MDAsIDB4NDcsIDB4YmEsIDB4YjYsIDB4 Y2EsIDB4MDAsIDB4NTMsCi0JMHgwMCwgMHhiNSwgMHhiYiwgMHhiMywgMHhjNiwgMHgwMCwgMHg2 NSwKLQkweDAwLCAweGFlLCAweGI4LCAweGIzLCAweGM3LCAweDAwLCAweDZjCi19OwotCi1zdGF0 aWMgY29uc3QgdW5zaWduZWQgaW50IGxkOTA0MF8yMl8xMTBbXSA9IHsKLQkweDAwLCAweDEzLCAw eGJiLCAweGI3LCAweGNhLCAweDAwLCAweDRmLAotCTB4MDAsIDB4YjQsIDB4YmIsIDB4YjMsIDB4 YzcsIDB4MDAsIDB4NjAsCi0JMHgwMCwgMHhhZCwgMHhiOCwgMHhiNCwgMHhjNywgMHgwMCwgMHg2 NwotfTsKLQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBsZDkwNDBfMjJfMTAwW10gPSB7Ci0J MHgwMCwgMHgxMywgMHhiYSwgMHhiOCwgMHhjYiwgMHgwMCwgMHg0YiwKLQkweDAwLCAweGIzLCAw eGJjLCAweGI0LCAweGM3LCAweDAwLCAweDVjLAotCTB4MDAsIDB4YWMsIDB4YjgsIDB4YjQsIDB4 YzgsIDB4MDAsIDB4NjIKLX07Ci0KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbGQ5MDQwXzIy XzkwW10gPSB7Ci0JMHgwMCwgMHgxMywgMHhiOSwgMHhiOCwgMHhjZCwgMHgwMCwgMHg0NiwKLQkw eDAwLCAweGIxLCAweGJjLCAweGI1LCAweGM4LCAweDAwLCAweDU2LAotCTB4MDAsIDB4YWEsIDB4 YjgsIDB4YjQsIDB4YzksIDB4MDAsIDB4NWQKLX07Ci0KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBp bnQgbGQ5MDQwXzIyXzgwW10gPSB7Ci0JMHgwMCwgMHgxMywgMHhiYSwgMHhiOSwgMHhjZCwgMHgw MCwgMHg0MSwKLQkweDAwLCAweGIwLCAweGJlLCAweGI1LCAweGM5LCAweDAwLCAweDUxLAotCTB4 MDAsIDB4YTksIDB4YjksIDB4YjUsIDB4Y2EsIDB4MDAsIDB4NTcKLX07Ci0KLXN0YXRpYyBjb25z dCB1bnNpZ25lZCBpbnQgbGQ5MDQwXzIyXzcwW10gPSB7Ci0JMHgwMCwgMHgxMywgMHhiOSwgMHhi OSwgMHhkMCwgMHgwMCwgMHgzYywKLQkweDAwLCAweGFmLCAweGJmLCAweGI2LCAweGNiLCAweDAw LCAweDRiLAotCTB4MDAsIDB4YTgsIDB4YjksIDB4YjUsIDB4Y2MsIDB4MDAsIDB4NTIKLX07Ci0K LXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbGQ5MDQwXzIyXzUwW10gPSB7Ci0JMHgwMCwgMHgx MywgMHhiMiwgMHhiYSwgMHhkMiwgMHgwMCwgMHgzMCwKLQkweDAwLCAweGFmLCAweGMwLCAweGI4 LCAweGNkLCAweDAwLCAweDNkLAotCTB4MDAsIDB4YTgsIDB4YjgsIDB4YjcsIDB4Y2QsIDB4MDAs IDB4NDQKLX07Ci0KLXN0cnVjdCBsZDkwNDBfZ2FtbWEgewotCXVuc2lnbmVkIGludCAqZ2FtbWFf MjJfdGFibGVbTUFYX0dBTU1BX0xFVkVMXTsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbGQ5MDQwX2dh bW1hIGdhbW1hX3RhYmxlID0gewotCS5nYW1tYV8yMl90YWJsZVswXSA9ICh1bnNpZ25lZCBpbnQg KikmbGQ5MDQwXzIyXzUwLAotCS5nYW1tYV8yMl90YWJsZVsxXSA9ICh1bnNpZ25lZCBpbnQgKikm bGQ5MDQwXzIyXzcwLAotCS5nYW1tYV8yMl90YWJsZVsyXSA9ICh1bnNpZ25lZCBpbnQgKikmbGQ5 MDQwXzIyXzgwLAotCS5nYW1tYV8yMl90YWJsZVszXSA9ICh1bnNpZ25lZCBpbnQgKikmbGQ5MDQw XzIyXzkwLAotCS5nYW1tYV8yMl90YWJsZVs0XSA9ICh1bnNpZ25lZCBpbnQgKikmbGQ5MDQwXzIy XzEwMCwKLQkuZ2FtbWFfMjJfdGFibGVbNV0gPSAodW5zaWduZWQgaW50ICopJmxkOTA0MF8yMl8x MTAsCi0JLmdhbW1hXzIyX3RhYmxlWzZdID0gKHVuc2lnbmVkIGludCAqKSZsZDkwNDBfMjJfMTIw LAotCS5nYW1tYV8yMl90YWJsZVs3XSA9ICh1bnNpZ25lZCBpbnQgKikmbGQ5MDQwXzIyXzEzMCwK LQkuZ2FtbWFfMjJfdGFibGVbOF0gPSAodW5zaWduZWQgaW50ICopJmxkOTA0MF8yMl8xNDAsCi0J LmdhbW1hXzIyX3RhYmxlWzldID0gKHVuc2lnbmVkIGludCAqKSZsZDkwNDBfMjJfMTUwLAotCS5n YW1tYV8yMl90YWJsZVsxMF0gPSAodW5zaWduZWQgaW50ICopJmxkOTA0MF8yMl8xNjAsCi0JLmdh bW1hXzIyX3RhYmxlWzExXSA9ICh1bnNpZ25lZCBpbnQgKikmbGQ5MDQwXzIyXzE3MCwKLQkuZ2Ft bWFfMjJfdGFibGVbMTJdID0gKHVuc2lnbmVkIGludCAqKSZsZDkwNDBfMjJfMTgwLAotCS5nYW1t YV8yMl90YWJsZVsxM10gPSAodW5zaWduZWQgaW50ICopJmxkOTA0MF8yMl8xOTAsCi0JLmdhbW1h XzIyX3RhYmxlWzE0XSA9ICh1bnNpZ25lZCBpbnQgKikmbGQ5MDQwXzIyXzIwMCwKLQkuZ2FtbWFf MjJfdGFibGVbMTVdID0gKHVuc2lnbmVkIGludCAqKSZsZDkwNDBfMjJfMjEwLAotCS5nYW1tYV8y Ml90YWJsZVsxNl0gPSAodW5zaWduZWQgaW50ICopJmxkOTA0MF8yMl8yMjAsCi0JLmdhbW1hXzIy X3RhYmxlWzE3XSA9ICh1bnNpZ25lZCBpbnQgKikmbGQ5MDQwXzIyXzIzMCwKLQkuZ2FtbWFfMjJf dGFibGVbMThdID0gKHVuc2lnbmVkIGludCAqKSZsZDkwNDBfMjJfMjQwLAotCS5nYW1tYV8yMl90 YWJsZVsxOV0gPSAodW5zaWduZWQgaW50ICopJmxkOTA0MF8yMl8yNTAsCi0JLmdhbW1hXzIyX3Rh YmxlWzIwXSA9ICh1bnNpZ25lZCBpbnQgKikmbGQ5MDQwXzIyXzI2MCwKLQkuZ2FtbWFfMjJfdGFi bGVbMjFdID0gKHVuc2lnbmVkIGludCAqKSZsZDkwNDBfMjJfMjcwLAotCS5nYW1tYV8yMl90YWJs ZVsyMl0gPSAodW5zaWduZWQgaW50ICopJmxkOTA0MF8yMl8yODAsCi0JLmdhbW1hXzIyX3RhYmxl WzIzXSA9ICh1bnNpZ25lZCBpbnQgKikmbGQ5MDQwXzIyXzI5MCwKLQkuZ2FtbWFfMjJfdGFibGVb MjRdID0gKHVuc2lnbmVkIGludCAqKSZsZDkwNDBfMjJfMzAwLAotfTsKLQotI2VuZGlmCi0tIAoy LjE0LjEKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmRy aS1kZXZlbCBtYWlsaW5nIGxpc3QKZHJpLWRldmVsQGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRw czovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2RyaS1kZXZlbAo= From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753879AbeD3Ra1 (ORCPT ); Mon, 30 Apr 2018 13:30:27 -0400 Received: from mail.kernel.org ([198.145.29.99]:56094 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753044AbeD3RaS (ORCPT ); Mon, 30 Apr 2018 13:30:18 -0400 DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org DDEF022D88 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=kernel.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=krzk@kernel.org From: Krzysztof Kozlowski To: Lee Jones , Daniel Thompson , Jingoo Han , Bartlomiej Zolnierkiewicz , linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-fbdev@vger.kernel.org Cc: Krzysztof Kozlowski , Marek Szyprowski , Inki Dae Subject: [PATCH 2/2] backlight: Remove ld9040 driver Date: Mon, 30 Apr 2018 19:29:45 +0200 Message-Id: <20180430172945.20938-2-krzk@kernel.org> X-Mailer: git-send-email 2.14.1 In-Reply-To: <20180430172945.20938-1-krzk@kernel.org> References: <20180430172945.20938-1-krzk@kernel.org> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The driver for LD9040 AMOLED LCD panel was superseded with DRM driver panel-samsung-ld9040.c. It does not support DeviceTree and respective possible user (Exynos4210 Universal C210) is DeviceTree-only and uses DRM version of driver.. Suggested-by: Marek Szyprowski Cc: Marek Szyprowski Cc: Inki Dae Signed-off-by: Krzysztof Kozlowski --- drivers/video/backlight/Kconfig | 8 - drivers/video/backlight/Makefile | 1 - drivers/video/backlight/ld9040.c | 811 --------------------------------- drivers/video/backlight/ld9040_gamma.h | 202 -------- 4 files changed, 1022 deletions(-) delete mode 100644 drivers/video/backlight/ld9040.c delete mode 100644 drivers/video/backlight/ld9040_gamma.h diff --git a/drivers/video/backlight/Kconfig b/drivers/video/backlight/Kconfig index be0c130b6597..2202daf2ab4f 100644 --- a/drivers/video/backlight/Kconfig +++ b/drivers/video/backlight/Kconfig @@ -111,14 +111,6 @@ config LCD_HP700 If you have an HP Jornada 700 series handheld (710/720/728) say Y to enable LCD control driver. -config LCD_LD9040 - tristate "LD9040 AMOLED LCD Driver" - depends on SPI && BACKLIGHT_CLASS_DEVICE - default n - help - If you have an LD9040 Panel, say Y to enable its - control driver. - config LCD_AMS369FG06 tristate "AMS369FG06 AMOLED LCD Driver" depends on SPI && BACKLIGHT_CLASS_DEVICE diff --git a/drivers/video/backlight/Makefile b/drivers/video/backlight/Makefile index 8773fdd64e99..0b327c0cb750 100644 --- a/drivers/video/backlight/Makefile +++ b/drivers/video/backlight/Makefile @@ -9,7 +9,6 @@ obj-$(CONFIG_LCD_HX8357) += hx8357.o obj-$(CONFIG_LCD_ILI922X) += ili922x.o obj-$(CONFIG_LCD_ILI9320) += ili9320.o obj-$(CONFIG_LCD_L4F00242T03) += l4f00242t03.o -obj-$(CONFIG_LCD_LD9040) += ld9040.o obj-$(CONFIG_LCD_LMS283GF05) += lms283gf05.o obj-$(CONFIG_LCD_LMS501KF03) += lms501kf03.o obj-$(CONFIG_LCD_LTV350QV) += ltv350qv.o diff --git a/drivers/video/backlight/ld9040.c b/drivers/video/backlight/ld9040.c deleted file mode 100644 index 677f8abba27c..000000000000 --- a/drivers/video/backlight/ld9040.c +++ /dev/null @@ -1,811 +0,0 @@ -/* - * ld9040 AMOLED LCD panel driver. - * - * Copyright (c) 2011 Samsung Electronics - * Author: Donghwa Lee - * Derived from drivers/video/backlight/s6e63m0.c - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "ld9040_gamma.h" - -#define SLEEPMSEC 0x1000 -#define ENDDEF 0x2000 -#define DEFMASK 0xFF00 -#define COMMAND_ONLY 0xFE -#define DATA_ONLY 0xFF - -#define MIN_BRIGHTNESS 0 -#define MAX_BRIGHTNESS 24 - -struct ld9040 { - struct device *dev; - struct spi_device *spi; - unsigned int power; - unsigned int current_brightness; - - struct lcd_device *ld; - struct backlight_device *bd; - struct lcd_platform_data *lcd_pd; - - struct mutex lock; - bool enabled; -}; - -static struct regulator_bulk_data supplies[] = { - { .supply = "vdd3", }, - { .supply = "vci", }, -}; - -static void ld9040_regulator_enable(struct ld9040 *lcd) -{ - int ret = 0; - struct lcd_platform_data *pd = NULL; - - pd = lcd->lcd_pd; - mutex_lock(&lcd->lock); - if (!lcd->enabled) { - ret = regulator_bulk_enable(ARRAY_SIZE(supplies), supplies); - if (ret) - goto out; - - lcd->enabled = true; - } - msleep(pd->power_on_delay); -out: - mutex_unlock(&lcd->lock); -} - -static void ld9040_regulator_disable(struct ld9040 *lcd) -{ - int ret = 0; - - mutex_lock(&lcd->lock); - if (lcd->enabled) { - ret = regulator_bulk_disable(ARRAY_SIZE(supplies), supplies); - if (ret) - goto out; - - lcd->enabled = false; - } -out: - mutex_unlock(&lcd->lock); -} - -static const unsigned short seq_swreset[] = { - 0x01, COMMAND_ONLY, - ENDDEF, 0x00 -}; - -static const unsigned short seq_user_setting[] = { - 0xF0, 0x5A, - - DATA_ONLY, 0x5A, - ENDDEF, 0x00 -}; - -static const unsigned short seq_elvss_on[] = { - 0xB1, 0x0D, - - DATA_ONLY, 0x00, - DATA_ONLY, 0x16, - ENDDEF, 0x00 -}; - -static const unsigned short seq_gtcon[] = { - 0xF7, 0x09, - - DATA_ONLY, 0x00, - DATA_ONLY, 0x00, - ENDDEF, 0x00 -}; - -static const unsigned short seq_panel_condition[] = { - 0xF8, 0x05, - - DATA_ONLY, 0x65, - DATA_ONLY, 0x96, - DATA_ONLY, 0x71, - DATA_ONLY, 0x7D, - DATA_ONLY, 0x19, - DATA_ONLY, 0x3B, - DATA_ONLY, 0x0D, - DATA_ONLY, 0x19, - DATA_ONLY, 0x7E, - DATA_ONLY, 0x0D, - DATA_ONLY, 0xE2, - DATA_ONLY, 0x00, - DATA_ONLY, 0x00, - DATA_ONLY, 0x7E, - DATA_ONLY, 0x7D, - DATA_ONLY, 0x07, - DATA_ONLY, 0x07, - DATA_ONLY, 0x20, - DATA_ONLY, 0x20, - DATA_ONLY, 0x20, - DATA_ONLY, 0x02, - DATA_ONLY, 0x02, - ENDDEF, 0x00 -}; - -static const unsigned short seq_gamma_set1[] = { - 0xF9, 0x00, - - DATA_ONLY, 0xA7, - DATA_ONLY, 0xB4, - DATA_ONLY, 0xAE, - DATA_ONLY, 0xBF, - DATA_ONLY, 0x00, - DATA_ONLY, 0x91, - DATA_ONLY, 0x00, - DATA_ONLY, 0xB2, - DATA_ONLY, 0xB4, - DATA_ONLY, 0xAA, - DATA_ONLY, 0xBB, - DATA_ONLY, 0x00, - DATA_ONLY, 0xAC, - DATA_ONLY, 0x00, - DATA_ONLY, 0xB3, - DATA_ONLY, 0xB1, - DATA_ONLY, 0xAA, - DATA_ONLY, 0xBC, - DATA_ONLY, 0x00, - DATA_ONLY, 0xB3, - ENDDEF, 0x00 -}; - -static const unsigned short seq_gamma_ctrl[] = { - 0xFB, 0x02, - - DATA_ONLY, 0x5A, - ENDDEF, 0x00 -}; - -static const unsigned short seq_gamma_start[] = { - 0xF9, COMMAND_ONLY, - - ENDDEF, 0x00 -}; - -static const unsigned short seq_apon[] = { - 0xF3, 0x00, - - DATA_ONLY, 0x00, - DATA_ONLY, 0x00, - DATA_ONLY, 0x0A, - DATA_ONLY, 0x02, - ENDDEF, 0x00 -}; - -static const unsigned short seq_display_ctrl[] = { - 0xF2, 0x02, - - DATA_ONLY, 0x08, - DATA_ONLY, 0x08, - DATA_ONLY, 0x10, - DATA_ONLY, 0x10, - ENDDEF, 0x00 -}; - -static const unsigned short seq_manual_pwr[] = { - 0xB0, 0x04, - ENDDEF, 0x00 -}; - -static const unsigned short seq_pwr_ctrl[] = { - 0xF4, 0x0A, - - DATA_ONLY, 0x87, - DATA_ONLY, 0x25, - DATA_ONLY, 0x6A, - DATA_ONLY, 0x44, - DATA_ONLY, 0x02, - DATA_ONLY, 0x88, - ENDDEF, 0x00 -}; - -static const unsigned short seq_sleep_out[] = { - 0x11, COMMAND_ONLY, - ENDDEF, 0x00 -}; - -static const unsigned short seq_sleep_in[] = { - 0x10, COMMAND_ONLY, - ENDDEF, 0x00 -}; - -static const unsigned short seq_display_on[] = { - 0x29, COMMAND_ONLY, - ENDDEF, 0x00 -}; - -static const unsigned short seq_display_off[] = { - 0x28, COMMAND_ONLY, - ENDDEF, 0x00 -}; - -static const unsigned short seq_vci1_1st_en[] = { - 0xF3, 0x10, - - DATA_ONLY, 0x00, - DATA_ONLY, 0x00, - DATA_ONLY, 0x00, - DATA_ONLY, 0x02, - ENDDEF, 0x00 -}; - -static const unsigned short seq_vl1_en[] = { - 0xF3, 0x11, - - DATA_ONLY, 0x00, - DATA_ONLY, 0x00, - DATA_ONLY, 0x00, - DATA_ONLY, 0x02, - ENDDEF, 0x00 -}; - -static const unsigned short seq_vl2_en[] = { - 0xF3, 0x13, - - DATA_ONLY, 0x00, - DATA_ONLY, 0x00, - DATA_ONLY, 0x00, - DATA_ONLY, 0x02, - ENDDEF, 0x00 -}; - -static const unsigned short seq_vci1_2nd_en[] = { - 0xF3, 0x33, - - DATA_ONLY, 0x00, - DATA_ONLY, 0x00, - DATA_ONLY, 0x00, - DATA_ONLY, 0x02, - ENDDEF, 0x00 -}; - -static const unsigned short seq_vl3_en[] = { - 0xF3, 0x37, - - DATA_ONLY, 0x00, - DATA_ONLY, 0x00, - DATA_ONLY, 0x00, - DATA_ONLY, 0x02, - ENDDEF, 0x00 -}; - -static const unsigned short seq_vreg1_amp_en[] = { - 0xF3, 0x37, - - DATA_ONLY, 0x01, - DATA_ONLY, 0x00, - DATA_ONLY, 0x00, - DATA_ONLY, 0x02, - ENDDEF, 0x00 -}; - -static const unsigned short seq_vgh_amp_en[] = { - 0xF3, 0x37, - - DATA_ONLY, 0x11, - DATA_ONLY, 0x00, - DATA_ONLY, 0x00, - DATA_ONLY, 0x02, - ENDDEF, 0x00 -}; - -static const unsigned short seq_vgl_amp_en[] = { - 0xF3, 0x37, - - DATA_ONLY, 0x31, - DATA_ONLY, 0x00, - DATA_ONLY, 0x00, - DATA_ONLY, 0x02, - ENDDEF, 0x00 -}; - -static const unsigned short seq_vmos_amp_en[] = { - 0xF3, 0x37, - - DATA_ONLY, 0xB1, - DATA_ONLY, 0x00, - DATA_ONLY, 0x00, - DATA_ONLY, 0x03, - ENDDEF, 0x00 -}; - -static const unsigned short seq_vint_amp_en[] = { - 0xF3, 0x37, - - DATA_ONLY, 0xF1, - /* DATA_ONLY, 0x71, VMOS/VBL/VBH not used */ - DATA_ONLY, 0x00, - DATA_ONLY, 0x00, - DATA_ONLY, 0x03, - /* DATA_ONLY, 0x02, VMOS/VBL/VBH not used */ - ENDDEF, 0x00 -}; - -static const unsigned short seq_vbh_amp_en[] = { - 0xF3, 0x37, - - DATA_ONLY, 0xF9, - DATA_ONLY, 0x00, - DATA_ONLY, 0x00, - DATA_ONLY, 0x03, - ENDDEF, 0x00 -}; - -static const unsigned short seq_vbl_amp_en[] = { - 0xF3, 0x37, - - DATA_ONLY, 0xFD, - DATA_ONLY, 0x00, - DATA_ONLY, 0x00, - DATA_ONLY, 0x03, - ENDDEF, 0x00 -}; - -static const unsigned short seq_gam_amp_en[] = { - 0xF3, 0x37, - - DATA_ONLY, 0xFF, - /* DATA_ONLY, 0x73, VMOS/VBL/VBH not used */ - DATA_ONLY, 0x00, - DATA_ONLY, 0x00, - DATA_ONLY, 0x03, - /* DATA_ONLY, 0x02, VMOS/VBL/VBH not used */ - ENDDEF, 0x00 -}; - -static const unsigned short seq_sd_amp_en[] = { - 0xF3, 0x37, - - DATA_ONLY, 0xFF, - /* DATA_ONLY, 0x73, VMOS/VBL/VBH not used */ - DATA_ONLY, 0x80, - DATA_ONLY, 0x00, - DATA_ONLY, 0x03, - /* DATA_ONLY, 0x02, VMOS/VBL/VBH not used */ - ENDDEF, 0x00 -}; - -static const unsigned short seq_gls_en[] = { - 0xF3, 0x37, - - DATA_ONLY, 0xFF, - /* DATA_ONLY, 0x73, VMOS/VBL/VBH not used */ - DATA_ONLY, 0x81, - DATA_ONLY, 0x00, - DATA_ONLY, 0x03, - /* DATA_ONLY, 0x02, VMOS/VBL/VBH not used */ - ENDDEF, 0x00 -}; - -static const unsigned short seq_els_en[] = { - 0xF3, 0x37, - - DATA_ONLY, 0xFF, - /* DATA_ONLY, 0x73, VMOS/VBL/VBH not used */ - DATA_ONLY, 0x83, - DATA_ONLY, 0x00, - DATA_ONLY, 0x03, - /* DATA_ONLY, 0x02, VMOS/VBL/VBH not used */ - ENDDEF, 0x00 -}; - -static const unsigned short seq_el_on[] = { - 0xF3, 0x37, - - DATA_ONLY, 0xFF, - /* DATA_ONLY, 0x73, VMOS/VBL/VBH not used */ - DATA_ONLY, 0x87, - DATA_ONLY, 0x00, - DATA_ONLY, 0x03, - /* DATA_ONLY, 0x02, VMOS/VBL/VBH not used */ - ENDDEF, 0x00 -}; - -static int ld9040_spi_write_byte(struct ld9040 *lcd, int addr, int data) -{ - u16 buf[1]; - struct spi_message msg; - - struct spi_transfer xfer = { - .len = 2, - .tx_buf = buf, - }; - - buf[0] = (addr << 8) | data; - - spi_message_init(&msg); - spi_message_add_tail(&xfer, &msg); - - return spi_sync(lcd->spi, &msg); -} - -static int ld9040_spi_write(struct ld9040 *lcd, unsigned char address, - unsigned char command) -{ - int ret = 0; - - if (address != DATA_ONLY) - ret = ld9040_spi_write_byte(lcd, 0x0, address); - if (command != COMMAND_ONLY) - ret = ld9040_spi_write_byte(lcd, 0x1, command); - - return ret; -} - -static int ld9040_panel_send_sequence(struct ld9040 *lcd, - const unsigned short *wbuf) -{ - int ret = 0, i = 0; - - while ((wbuf[i] & DEFMASK) != ENDDEF) { - if ((wbuf[i] & DEFMASK) != SLEEPMSEC) { - ret = ld9040_spi_write(lcd, wbuf[i], wbuf[i+1]); - if (ret) - break; - } else { - msleep(wbuf[i+1]); - } - i += 2; - } - - return ret; -} - -static int _ld9040_gamma_ctl(struct ld9040 *lcd, const unsigned int *gamma) -{ - unsigned int i = 0; - int ret = 0; - - /* start gamma table updating. */ - ret = ld9040_panel_send_sequence(lcd, seq_gamma_start); - if (ret) { - dev_err(lcd->dev, "failed to disable gamma table updating.\n"); - goto gamma_err; - } - - for (i = 0 ; i < GAMMA_TABLE_COUNT; i++) { - ret = ld9040_spi_write(lcd, DATA_ONLY, gamma[i]); - if (ret) { - dev_err(lcd->dev, "failed to set gamma table.\n"); - goto gamma_err; - } - } - - /* update gamma table. */ - ret = ld9040_panel_send_sequence(lcd, seq_gamma_ctrl); - if (ret) - dev_err(lcd->dev, "failed to update gamma table.\n"); - -gamma_err: - return ret; -} - -static int ld9040_gamma_ctl(struct ld9040 *lcd, int gamma) -{ - return _ld9040_gamma_ctl(lcd, gamma_table.gamma_22_table[gamma]); -} - -static int ld9040_ldi_init(struct ld9040 *lcd) -{ - int ret, i; - static const unsigned short *init_seq[] = { - seq_user_setting, - seq_panel_condition, - seq_display_ctrl, - seq_manual_pwr, - seq_elvss_on, - seq_gtcon, - seq_gamma_set1, - seq_gamma_ctrl, - seq_sleep_out, - }; - - for (i = 0; i < ARRAY_SIZE(init_seq); i++) { - ret = ld9040_panel_send_sequence(lcd, init_seq[i]); - /* workaround: minimum delay time for transferring CMD */ - usleep_range(300, 310); - if (ret) - break; - } - - return ret; -} - -static int ld9040_ldi_enable(struct ld9040 *lcd) -{ - return ld9040_panel_send_sequence(lcd, seq_display_on); -} - -static int ld9040_ldi_disable(struct ld9040 *lcd) -{ - int ret; - - ret = ld9040_panel_send_sequence(lcd, seq_display_off); - ret = ld9040_panel_send_sequence(lcd, seq_sleep_in); - - return ret; -} - -static int ld9040_power_is_on(int power) -{ - return power <= FB_BLANK_NORMAL; -} - -static int ld9040_power_on(struct ld9040 *lcd) -{ - int ret = 0; - struct lcd_platform_data *pd; - - pd = lcd->lcd_pd; - - /* lcd power on */ - ld9040_regulator_enable(lcd); - - if (!pd->reset) { - dev_err(lcd->dev, "reset is NULL.\n"); - return -EINVAL; - } - - pd->reset(lcd->ld); - msleep(pd->reset_delay); - - ret = ld9040_ldi_init(lcd); - if (ret) { - dev_err(lcd->dev, "failed to initialize ldi.\n"); - return ret; - } - - ret = ld9040_ldi_enable(lcd); - if (ret) { - dev_err(lcd->dev, "failed to enable ldi.\n"); - return ret; - } - - return 0; -} - -static int ld9040_power_off(struct ld9040 *lcd) -{ - int ret; - struct lcd_platform_data *pd; - - pd = lcd->lcd_pd; - - ret = ld9040_ldi_disable(lcd); - if (ret) { - dev_err(lcd->dev, "lcd setting failed.\n"); - return -EIO; - } - - msleep(pd->power_off_delay); - - /* lcd power off */ - ld9040_regulator_disable(lcd); - - return 0; -} - -static int ld9040_power(struct ld9040 *lcd, int power) -{ - int ret = 0; - - if (ld9040_power_is_on(power) && !ld9040_power_is_on(lcd->power)) - ret = ld9040_power_on(lcd); - else if (!ld9040_power_is_on(power) && ld9040_power_is_on(lcd->power)) - ret = ld9040_power_off(lcd); - - if (!ret) - lcd->power = power; - - return ret; -} - -static int ld9040_set_power(struct lcd_device *ld, int power) -{ - struct ld9040 *lcd = lcd_get_data(ld); - - if (power != FB_BLANK_UNBLANK && power != FB_BLANK_POWERDOWN && - power != FB_BLANK_NORMAL) { - dev_err(lcd->dev, "power value should be 0, 1 or 4.\n"); - return -EINVAL; - } - - return ld9040_power(lcd, power); -} - -static int ld9040_get_power(struct lcd_device *ld) -{ - struct ld9040 *lcd = lcd_get_data(ld); - - return lcd->power; -} - -static int ld9040_set_brightness(struct backlight_device *bd) -{ - int ret = 0, brightness = bd->props.brightness; - struct ld9040 *lcd = bl_get_data(bd); - - if (brightness < MIN_BRIGHTNESS || - brightness > bd->props.max_brightness) { - dev_err(&bd->dev, "lcd brightness should be %d to %d.\n", - MIN_BRIGHTNESS, MAX_BRIGHTNESS); - return -EINVAL; - } - - ret = ld9040_gamma_ctl(lcd, bd->props.brightness); - if (ret) { - dev_err(&bd->dev, "lcd brightness setting failed.\n"); - return -EIO; - } - - return ret; -} - -static struct lcd_ops ld9040_lcd_ops = { - .set_power = ld9040_set_power, - .get_power = ld9040_get_power, -}; - -static const struct backlight_ops ld9040_backlight_ops = { - .update_status = ld9040_set_brightness, -}; - -static int ld9040_probe(struct spi_device *spi) -{ - int ret = 0; - struct ld9040 *lcd = NULL; - struct lcd_device *ld = NULL; - struct backlight_device *bd = NULL; - struct backlight_properties props; - - lcd = devm_kzalloc(&spi->dev, sizeof(struct ld9040), GFP_KERNEL); - if (!lcd) - return -ENOMEM; - - /* ld9040 lcd panel uses 3-wire 9bits SPI Mode. */ - spi->bits_per_word = 9; - - ret = spi_setup(spi); - if (ret < 0) { - dev_err(&spi->dev, "spi setup failed.\n"); - return ret; - } - - lcd->spi = spi; - lcd->dev = &spi->dev; - - lcd->lcd_pd = dev_get_platdata(&spi->dev); - if (!lcd->lcd_pd) { - dev_err(&spi->dev, "platform data is NULL.\n"); - return -EINVAL; - } - - mutex_init(&lcd->lock); - - ret = devm_regulator_bulk_get(lcd->dev, ARRAY_SIZE(supplies), supplies); - if (ret) { - dev_err(lcd->dev, "Failed to get regulators: %d\n", ret); - return ret; - } - - ld = devm_lcd_device_register(&spi->dev, "ld9040", &spi->dev, lcd, - &ld9040_lcd_ops); - if (IS_ERR(ld)) - return PTR_ERR(ld); - - lcd->ld = ld; - - memset(&props, 0, sizeof(struct backlight_properties)); - props.type = BACKLIGHT_RAW; - props.max_brightness = MAX_BRIGHTNESS; - - bd = devm_backlight_device_register(&spi->dev, "ld9040-bl", &spi->dev, - lcd, &ld9040_backlight_ops, &props); - if (IS_ERR(bd)) - return PTR_ERR(bd); - - bd->props.brightness = MAX_BRIGHTNESS; - lcd->bd = bd; - - /* - * if lcd panel was on from bootloader like u-boot then - * do not lcd on. - */ - if (!lcd->lcd_pd->lcd_enabled) { - /* - * if lcd panel was off from bootloader then - * current lcd status is powerdown and then - * it enables lcd panel. - */ - lcd->power = FB_BLANK_POWERDOWN; - - ld9040_power(lcd, FB_BLANK_UNBLANK); - } else { - lcd->power = FB_BLANK_UNBLANK; - } - - spi_set_drvdata(spi, lcd); - - dev_info(&spi->dev, "ld9040 panel driver has been probed.\n"); - return 0; -} - -static int ld9040_remove(struct spi_device *spi) -{ - struct ld9040 *lcd = spi_get_drvdata(spi); - - ld9040_power(lcd, FB_BLANK_POWERDOWN); - return 0; -} - -#ifdef CONFIG_PM_SLEEP -static int ld9040_suspend(struct device *dev) -{ - struct ld9040 *lcd = dev_get_drvdata(dev); - - dev_dbg(dev, "lcd->power = %d\n", lcd->power); - - /* - * when lcd panel is suspend, lcd panel becomes off - * regardless of status. - */ - return ld9040_power(lcd, FB_BLANK_POWERDOWN); -} - -static int ld9040_resume(struct device *dev) -{ - struct ld9040 *lcd = dev_get_drvdata(dev); - - lcd->power = FB_BLANK_POWERDOWN; - - return ld9040_power(lcd, FB_BLANK_UNBLANK); -} -#endif - -static SIMPLE_DEV_PM_OPS(ld9040_pm_ops, ld9040_suspend, ld9040_resume); - -/* Power down all displays on reboot, poweroff or halt. */ -static void ld9040_shutdown(struct spi_device *spi) -{ - struct ld9040 *lcd = spi_get_drvdata(spi); - - ld9040_power(lcd, FB_BLANK_POWERDOWN); -} - -static struct spi_driver ld9040_driver = { - .driver = { - .name = "ld9040", - .pm = &ld9040_pm_ops, - }, - .probe = ld9040_probe, - .remove = ld9040_remove, - .shutdown = ld9040_shutdown, -}; - -module_spi_driver(ld9040_driver); - -MODULE_AUTHOR("Donghwa Lee "); -MODULE_DESCRIPTION("ld9040 LCD Driver"); -MODULE_LICENSE("GPL"); diff --git a/drivers/video/backlight/ld9040_gamma.h b/drivers/video/backlight/ld9040_gamma.h deleted file mode 100644 index c5e586d97385..000000000000 --- a/drivers/video/backlight/ld9040_gamma.h +++ /dev/null @@ -1,202 +0,0 @@ -/* - * Gamma level definitions. - * - * Copyright (c) 2011 Samsung Electronics - * InKi Dae - * Donghwa Lee - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. -*/ - -#ifndef _LD9040_BRIGHTNESS_H -#define _LD9040_BRIGHTNESS_H - -#define MAX_GAMMA_LEVEL 25 -#define GAMMA_TABLE_COUNT 21 - -/* gamma value: 2.2 */ -static const unsigned int ld9040_22_300[] = { - 0x00, 0xa7, 0xb4, 0xae, 0xbf, 0x00, 0x91, - 0x00, 0xb2, 0xb4, 0xaa, 0xbb, 0x00, 0xac, - 0x00, 0xb3, 0xb1, 0xaa, 0xbc, 0x00, 0xb3 -}; - -static const unsigned int ld9040_22_290[] = { - 0x00, 0xa9, 0xb7, 0xae, 0xbd, 0x00, 0x89, - 0x00, 0xb7, 0xb6, 0xa8, 0xba, 0x00, 0xa4, - 0x00, 0xb1, 0xb4, 0xaa, 0xbb, 0x00, 0xaa -}; - -static const unsigned int ld9040_22_280[] = { - 0x00, 0xa9, 0xb6, 0xad, 0xbf, 0x00, 0x86, - 0x00, 0xb8, 0xb5, 0xa8, 0xbc, 0x00, 0xa0, - 0x00, 0xb3, 0xb3, 0xa9, 0xbc, 0x00, 0xa7 -}; - -static const unsigned int ld9040_22_270[] = { - 0x00, 0xa8, 0xb8, 0xae, 0xbe, 0x00, 0x84, - 0x00, 0xb9, 0xb7, 0xa8, 0xbc, 0x00, 0x9d, - 0x00, 0xb2, 0xb5, 0xaa, 0xbc, 0x00, 0xa4 - -}; -static const unsigned int ld9040_22_260[] = { - 0x00, 0xa4, 0xb8, 0xb0, 0xbf, 0x00, 0x80, - 0x00, 0xb8, 0xb6, 0xaa, 0xbc, 0x00, 0x9a, - 0x00, 0xb0, 0xb5, 0xab, 0xbd, 0x00, 0xa0 -}; - -static const unsigned int ld9040_22_250[] = { - 0x00, 0xa4, 0xb9, 0xaf, 0xc1, 0x00, 0x7d, - 0x00, 0xb9, 0xb6, 0xaa, 0xbb, 0x00, 0x97, - 0x00, 0xb1, 0xb5, 0xaa, 0xbf, 0x00, 0x9d -}; - -static const unsigned int ld9040_22_240[] = { - 0x00, 0xa2, 0xb9, 0xaf, 0xc2, 0x00, 0x7a, - 0x00, 0xb9, 0xb7, 0xaa, 0xbd, 0x00, 0x94, - 0x00, 0xb0, 0xb5, 0xab, 0xbf, 0x00, 0x9a -}; - -static const unsigned int ld9040_22_230[] = { - 0x00, 0xa0, 0xb9, 0xaf, 0xc3, 0x00, 0x77, - 0x00, 0xb9, 0xb7, 0xab, 0xbe, 0x00, 0x90, - 0x00, 0xb0, 0xb6, 0xab, 0xbf, 0x00, 0x97 -}; - -static const unsigned int ld9040_22_220[] = { - 0x00, 0x9e, 0xba, 0xb0, 0xc2, 0x00, 0x75, - 0x00, 0xb9, 0xb8, 0xab, 0xbe, 0x00, 0x8e, - 0x00, 0xb0, 0xb6, 0xac, 0xbf, 0x00, 0x94 -}; - -static const unsigned int ld9040_22_210[] = { - 0x00, 0x9c, 0xb9, 0xb0, 0xc4, 0x00, 0x72, - 0x00, 0xb8, 0xb8, 0xac, 0xbf, 0x00, 0x8a, - 0x00, 0xb0, 0xb6, 0xac, 0xc0, 0x00, 0x91 -}; - -static const unsigned int ld9040_22_200[] = { - 0x00, 0x9a, 0xba, 0xb1, 0xc4, 0x00, 0x6f, - 0x00, 0xb8, 0xb8, 0xad, 0xc0, 0x00, 0x86, - 0x00, 0xb0, 0xb7, 0xad, 0xc0, 0x00, 0x8d -}; - -static const unsigned int ld9040_22_190[] = { - 0x00, 0x97, 0xba, 0xb2, 0xc5, 0x00, 0x6c, - 0x00, 0xb8, 0xb8, 0xae, 0xc1, 0x00, 0x82, - 0x00, 0xb0, 0xb6, 0xae, 0xc2, 0x00, 0x89 -}; - -static const unsigned int ld9040_22_180[] = { - 0x00, 0x93, 0xba, 0xb3, 0xc5, 0x00, 0x69, - 0x00, 0xb8, 0xb9, 0xae, 0xc1, 0x00, 0x7f, - 0x00, 0xb0, 0xb6, 0xae, 0xc3, 0x00, 0x85 -}; - -static const unsigned int ld9040_22_170[] = { - 0x00, 0x8b, 0xb9, 0xb3, 0xc7, 0x00, 0x65, - 0x00, 0xb7, 0xb8, 0xaf, 0xc3, 0x00, 0x7a, - 0x00, 0x80, 0xb6, 0xae, 0xc4, 0x00, 0x81 -}; - -static const unsigned int ld9040_22_160[] = { - 0x00, 0x89, 0xba, 0xb3, 0xc8, 0x00, 0x62, - 0x00, 0xb6, 0xba, 0xaf, 0xc3, 0x00, 0x76, - 0x00, 0xaf, 0xb7, 0xae, 0xc4, 0x00, 0x7e -}; - -static const unsigned int ld9040_22_150[] = { - 0x00, 0x82, 0xba, 0xb4, 0xc7, 0x00, 0x5f, - 0x00, 0xb5, 0xba, 0xb0, 0xc3, 0x00, 0x72, - 0x00, 0xae, 0xb8, 0xb0, 0xc3, 0x00, 0x7a -}; - -static const unsigned int ld9040_22_140[] = { - 0x00, 0x7b, 0xbb, 0xb4, 0xc8, 0x00, 0x5b, - 0x00, 0xb5, 0xba, 0xb1, 0xc4, 0x00, 0x6e, - 0x00, 0xae, 0xb9, 0xb0, 0xc5, 0x00, 0x75 -}; - -static const unsigned int ld9040_22_130[] = { - 0x00, 0x71, 0xbb, 0xb5, 0xc8, 0x00, 0x57, - 0x00, 0xb5, 0xbb, 0xb0, 0xc5, 0x00, 0x6a, - 0x00, 0xae, 0xb9, 0xb1, 0xc6, 0x00, 0x70 -}; - -static const unsigned int ld9040_22_120[] = { - 0x00, 0x47, 0xba, 0xb6, 0xca, 0x00, 0x53, - 0x00, 0xb5, 0xbb, 0xb3, 0xc6, 0x00, 0x65, - 0x00, 0xae, 0xb8, 0xb3, 0xc7, 0x00, 0x6c -}; - -static const unsigned int ld9040_22_110[] = { - 0x00, 0x13, 0xbb, 0xb7, 0xca, 0x00, 0x4f, - 0x00, 0xb4, 0xbb, 0xb3, 0xc7, 0x00, 0x60, - 0x00, 0xad, 0xb8, 0xb4, 0xc7, 0x00, 0x67 -}; - -static const unsigned int ld9040_22_100[] = { - 0x00, 0x13, 0xba, 0xb8, 0xcb, 0x00, 0x4b, - 0x00, 0xb3, 0xbc, 0xb4, 0xc7, 0x00, 0x5c, - 0x00, 0xac, 0xb8, 0xb4, 0xc8, 0x00, 0x62 -}; - -static const unsigned int ld9040_22_90[] = { - 0x00, 0x13, 0xb9, 0xb8, 0xcd, 0x00, 0x46, - 0x00, 0xb1, 0xbc, 0xb5, 0xc8, 0x00, 0x56, - 0x00, 0xaa, 0xb8, 0xb4, 0xc9, 0x00, 0x5d -}; - -static const unsigned int ld9040_22_80[] = { - 0x00, 0x13, 0xba, 0xb9, 0xcd, 0x00, 0x41, - 0x00, 0xb0, 0xbe, 0xb5, 0xc9, 0x00, 0x51, - 0x00, 0xa9, 0xb9, 0xb5, 0xca, 0x00, 0x57 -}; - -static const unsigned int ld9040_22_70[] = { - 0x00, 0x13, 0xb9, 0xb9, 0xd0, 0x00, 0x3c, - 0x00, 0xaf, 0xbf, 0xb6, 0xcb, 0x00, 0x4b, - 0x00, 0xa8, 0xb9, 0xb5, 0xcc, 0x00, 0x52 -}; - -static const unsigned int ld9040_22_50[] = { - 0x00, 0x13, 0xb2, 0xba, 0xd2, 0x00, 0x30, - 0x00, 0xaf, 0xc0, 0xb8, 0xcd, 0x00, 0x3d, - 0x00, 0xa8, 0xb8, 0xb7, 0xcd, 0x00, 0x44 -}; - -struct ld9040_gamma { - unsigned int *gamma_22_table[MAX_GAMMA_LEVEL]; -}; - -static struct ld9040_gamma gamma_table = { - .gamma_22_table[0] = (unsigned int *)&ld9040_22_50, - .gamma_22_table[1] = (unsigned int *)&ld9040_22_70, - .gamma_22_table[2] = (unsigned int *)&ld9040_22_80, - .gamma_22_table[3] = (unsigned int *)&ld9040_22_90, - .gamma_22_table[4] = (unsigned int *)&ld9040_22_100, - .gamma_22_table[5] = (unsigned int *)&ld9040_22_110, - .gamma_22_table[6] = (unsigned int *)&ld9040_22_120, - .gamma_22_table[7] = (unsigned int *)&ld9040_22_130, - .gamma_22_table[8] = (unsigned int *)&ld9040_22_140, - .gamma_22_table[9] = (unsigned int *)&ld9040_22_150, - .gamma_22_table[10] = (unsigned int *)&ld9040_22_160, - .gamma_22_table[11] = (unsigned int *)&ld9040_22_170, - .gamma_22_table[12] = (unsigned int *)&ld9040_22_180, - .gamma_22_table[13] = (unsigned int *)&ld9040_22_190, - .gamma_22_table[14] = (unsigned int *)&ld9040_22_200, - .gamma_22_table[15] = (unsigned int *)&ld9040_22_210, - .gamma_22_table[16] = (unsigned int *)&ld9040_22_220, - .gamma_22_table[17] = (unsigned int *)&ld9040_22_230, - .gamma_22_table[18] = (unsigned int *)&ld9040_22_240, - .gamma_22_table[19] = (unsigned int *)&ld9040_22_250, - .gamma_22_table[20] = (unsigned int *)&ld9040_22_260, - .gamma_22_table[21] = (unsigned int *)&ld9040_22_270, - .gamma_22_table[22] = (unsigned int *)&ld9040_22_280, - .gamma_22_table[23] = (unsigned int *)&ld9040_22_290, - .gamma_22_table[24] = (unsigned int *)&ld9040_22_300, -}; - -#endif -- 2.14.1