From mboxrd@z Thu Jan 1 00:00:00 1970 From: Krzysztof Kozlowski Date: Sun, 02 Sep 2018 15:33:03 +0000 Subject: [PATCH v2 2/2] backlight: Remove ld9040 driver Message-Id: <20180902153303.6590-2-krzk@kernel.org> List-Id: References: <20180902152232.5802-1-krzk@kernel.org> In-Reply-To: <20180902152232.5802-1-krzk@kernel.org> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: Donghwa Lee , Lee Jones , Daniel Thompson , Jingoo Han , Bartlomiej Zolnierkiewicz , Krzysztof Kozlowski , Jonathan Corbet , linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-fbdev@vger.kernel.org Cc: 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 Acked-by: Jingoo Han Acked-by: Daniel Thompson --- Changes since v1: 1. Add Jingoo's and Daniel's acks. --- 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 2373c3cec0c3..71ee978c848f 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 c7a46392a76f..63c507c07437 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 v2 2/2] backlight: Remove ld9040 driver Date: Sun, 2 Sep 2018 17:33:03 +0200 Message-ID: <20180902153303.6590-2-krzk@kernel.org> References: <20180902152232.5802-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 8FD446E054 for ; Sun, 2 Sep 2018 15:33:31 +0000 (UTC) In-Reply-To: <20180902152232.5802-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: Donghwa Lee , Lee Jones , Daniel Thompson , Jingoo Han , Bartlomiej Zolnierkiewicz , Krzysztof Kozlowski , Jonathan Corbet , linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-fbdev@vger.kernel.org Cc: Marek Szyprowski List-Id: dri-devel@lists.freedesktop.org VGhlIGRyaXZlciBmb3IgTEQ5MDQwIEFNT0xFRCBMQ0QgcGFuZWwgd2FzIHN1cGVyc2VkZWQgd2l0 aCBEUk0gZHJpdmVyCnBhbmVsLXNhbXN1bmctbGQ5MDQwLmMuICBJdCBkb2VzIG5vdCBzdXBwb3J0 IERldmljZVRyZWUgYW5kIHJlc3BlY3RpdmUKcG9zc2libGUgdXNlciAoRXh5bm9zNDIxMCBVbml2 ZXJzYWwgQzIxMCkgaXMgRGV2aWNlVHJlZS1vbmx5IGFuZCB1c2VzCkRSTSB2ZXJzaW9uIG9mIGRy aXZlci4KClN1Z2dlc3RlZC1ieTogTWFyZWsgU3p5cHJvd3NraSA8bS5zenlwcm93c2tpQHNhbXN1 bmcuY29tPgpDYzogTWFyZWsgU3p5cHJvd3NraSA8bS5zenlwcm93c2tpQHNhbXN1bmcuY29tPgpD YzogSW5raSBEYWUgPGlua2kuZGFlQHNhbXN1bmcuY29tPgpTaWduZWQtb2ZmLWJ5OiBLcnp5c3p0 b2YgS296bG93c2tpIDxrcnprQGtlcm5lbC5vcmc+CkFja2VkLWJ5OiBKaW5nb28gSGFuIDxqaW5n b29oYW4xQGdtYWlsLmNvbT4KQWNrZWQtYnk6IERhbmllbCBUaG9tcHNvbiA8ZGFuaWVsLnRob21w c29uQGxpbmFyby5vcmc+CgotLS0KCkNoYW5nZXMgc2luY2UgdjE6CjEuIEFkZCBKaW5nb28ncyBh bmQgRGFuaWVsJ3MgYWNrcy4KLS0tCiBkcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9LY29uZmlnICAg ICAgICB8ICAgOCAtCiBkcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9NYWtlZmlsZSAgICAgICB8ICAg MSAtCiBkcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9sZDkwNDAuYyAgICAgICB8IDgxMSAtLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIGRyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2xkOTA0 MF9nYW1tYS5oIHwgMjAyIC0tLS0tLS0tCiA0IGZpbGVzIGNoYW5nZWQsIDEwMjIgZGVsZXRpb25z KC0pCiBkZWxldGUgbW9kZSAxMDA2NDQgZHJpdmVycy92aWRlby9iYWNrbGlnaHQvbGQ5MDQwLmMK IGRlbGV0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9sZDkwNDBfZ2FtbWEu aAoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L0tjb25maWcgYi9kcml2ZXJz L3ZpZGVvL2JhY2tsaWdodC9LY29uZmlnCmluZGV4IDIzNzNjM2NlYzBjMy4uNzFlZTk3OGM4NDhm IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9LY29uZmlnCisrKyBiL2RyaXZl cnMvdmlkZW8vYmFja2xpZ2h0L0tjb25maWcKQEAgLTExMSwxNCArMTExLDYgQEAgY29uZmlnIExD RF9IUDcwMAogCSAgSWYgeW91IGhhdmUgYW4gSFAgSm9ybmFkYSA3MDAgc2VyaWVzIGhhbmRoZWxk ICg3MTAvNzIwLzcyOCkKIAkgIHNheSBZIHRvIGVuYWJsZSBMQ0QgY29udHJvbCBkcml2ZXIuCiAK LWNvbmZpZyBMQ0RfTEQ5MDQwCi0JdHJpc3RhdGUgIkxEOTA0MCBBTU9MRUQgTENEIERyaXZlciIK LQlkZXBlbmRzIG9uIFNQSSAmJiBCQUNLTElHSFRfQ0xBU1NfREVWSUNFCi0JZGVmYXVsdCBuCi0J aGVscAotCSAgSWYgeW91IGhhdmUgYW4gTEQ5MDQwIFBhbmVsLCBzYXkgWSB0byBlbmFibGUgaXRz Ci0JICBjb250cm9sIGRyaXZlci4KLQogY29uZmlnIExDRF9BTVMzNjlGRzA2CiAJdHJpc3RhdGUg IkFNUzM2OUZHMDYgQU1PTEVEIExDRCBEcml2ZXIiCiAJZGVwZW5kcyBvbiBTUEkgJiYgQkFDS0xJ R0hUX0NMQVNTX0RFVklDRQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvTWFr ZWZpbGUgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9NYWtlZmlsZQppbmRleCBjN2E0NjM5MmE3 NmYuLjYzYzUwN2MwNzQzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvTWFr ZWZpbGUKKysrIGIvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvTWFrZWZpbGUKQEAgLTksNyArOSw2 IEBAIG9iai0kKENPTkZJR19MQ0RfSFg4MzU3KQkJKz0gaHg4MzU3Lm8KIG9iai0kKENPTkZJR19M Q0RfSUxJOTIyWCkJCSs9IGlsaTkyMngubwogb2JqLSQoQ09ORklHX0xDRF9JTEk5MzIwKQkJKz0g aWxpOTMyMC5vCiBvYmotJChDT05GSUdfTENEX0w0RjAwMjQyVDAzKQkJKz0gbDRmMDAyNDJ0MDMu bwotb2JqLSQoQ09ORklHX0xDRF9MRDkwNDApCQkrPSBsZDkwNDAubwogb2JqLSQoQ09ORklHX0xD RF9MTVMyODNHRjA1KQkJKz0gbG1zMjgzZ2YwNS5vCiBvYmotJChDT05GSUdfTENEX0xNUzUwMUtG MDMpCQkrPSBsbXM1MDFrZjAzLm8KIG9iai0kKENPTkZJR19MQ0RfTFRWMzUwUVYpCQkrPSBsdHYz NTBxdi5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9sZDkwNDAuYyBiL2Ry aXZlcnMvdmlkZW8vYmFja2xpZ2h0L2xkOTA0MC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NApp bmRleCA2NzdmOGFiYmEyN2MuLjAwMDAwMDAwMDAwMAotLS0gYS9kcml2ZXJzL3ZpZGVvL2JhY2ts aWdodC9sZDkwNDAuYworKysgL2Rldi9udWxsCkBAIC0xLDgxMSArMCwwIEBACi0vKgotICogbGQ5 MDQwIEFNT0xFRCBMQ0QgcGFuZWwgZHJpdmVyLgotICoKLSAqIENvcHlyaWdodCAoYykgMjAxMSBT YW1zdW5nIEVsZWN0cm9uaWNzCi0gKiBBdXRob3I6IERvbmdod2EgTGVlICA8ZGgwOS5sZWVAc2Ft c3VuZy5jb20+Ci0gKiBEZXJpdmVkIGZyb20gZHJpdmVycy92aWRlby9iYWNrbGlnaHQvczZlNjNt MC5jCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0 cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05V IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotICogRnJlZSBTb2Z0 d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQg eW91cgotICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotCi0jaW5jbHVkZSA8bGlu dXgvYmFja2xpZ2h0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51 eC9mYi5oPgotI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1 cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9pcnEuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4K LSNpbmNsdWRlIDxsaW51eC9sY2QuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNs dWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGkvc3Bp Lmg+Ci0jaW5jbHVkZSA8bGludXgvd2FpdC5oPgotCi0jaW5jbHVkZSAibGQ5MDQwX2dhbW1hLmgi Ci0KLSNkZWZpbmUgU0xFRVBNU0VDCQkweDEwMDAKLSNkZWZpbmUgRU5EREVGCQkJMHgyMDAwCi0j ZGVmaW5lCURFRk1BU0sJCQkweEZGMDAKLSNkZWZpbmUgQ09NTUFORF9PTkxZCQkweEZFCi0jZGVm aW5lIERBVEFfT05MWQkJMHhGRgotCi0jZGVmaW5lIE1JTl9CUklHSFRORVNTCQkwCi0jZGVmaW5l IE1BWF9CUklHSFRORVNTCQkyNAotCi1zdHJ1Y3QgbGQ5MDQwIHsKLQlzdHJ1Y3QgZGV2aWNlCQkJ KmRldjsKLQlzdHJ1Y3Qgc3BpX2RldmljZQkJKnNwaTsKLQl1bnNpZ25lZCBpbnQJCQlwb3dlcjsK LQl1bnNpZ25lZCBpbnQJCQljdXJyZW50X2JyaWdodG5lc3M7Ci0KLQlzdHJ1Y3QgbGNkX2Rldmlj ZQkJKmxkOwotCXN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlCQkqYmQ7Ci0Jc3RydWN0IGxjZF9wbGF0 Zm9ybV9kYXRhCSpsY2RfcGQ7Ci0KLQlzdHJ1Y3QgbXV0ZXgJCQlsb2NrOwotCWJvb2wgIGVuYWJs ZWQ7Ci19OwotCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9idWxrX2RhdGEgc3VwcGxpZXNbXSA9 IHsKLQl7IC5zdXBwbHkgPSAidmRkMyIsIH0sCi0JeyAuc3VwcGx5ID0gInZjaSIsIH0sCi19Owot Ci1zdGF0aWMgdm9pZCBsZDkwNDBfcmVndWxhdG9yX2VuYWJsZShzdHJ1Y3QgbGQ5MDQwICpsY2Qp Ci17Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IGxjZF9wbGF0Zm9ybV9kYXRhICpwZCA9IE5VTEw7 Ci0KLQlwZCA9IGxjZC0+bGNkX3BkOwotCW11dGV4X2xvY2soJmxjZC0+bG9jayk7Ci0JaWYgKCFs Y2QtPmVuYWJsZWQpIHsKLQkJcmV0ID0gcmVndWxhdG9yX2J1bGtfZW5hYmxlKEFSUkFZX1NJWkUo c3VwcGxpZXMpLCBzdXBwbGllcyk7Ci0JCWlmIChyZXQpCi0JCQlnb3RvIG91dDsKLQotCQlsY2Qt PmVuYWJsZWQgPSB0cnVlOwotCX0KLQltc2xlZXAocGQtPnBvd2VyX29uX2RlbGF5KTsKLW91dDoK LQltdXRleF91bmxvY2soJmxjZC0+bG9jayk7Ci19Ci0KLXN0YXRpYyB2b2lkIGxkOTA0MF9yZWd1 bGF0b3JfZGlzYWJsZShzdHJ1Y3QgbGQ5MDQwICpsY2QpCi17Ci0JaW50IHJldCA9IDA7Ci0KLQlt dXRleF9sb2NrKCZsY2QtPmxvY2spOwotCWlmIChsY2QtPmVuYWJsZWQpIHsKLQkJcmV0ID0gcmVn dWxhdG9yX2J1bGtfZGlzYWJsZShBUlJBWV9TSVpFKHN1cHBsaWVzKSwgc3VwcGxpZXMpOwotCQlp ZiAocmV0KQotCQkJZ290byBvdXQ7Ci0KLQkJbGNkLT5lbmFibGVkID0gZmFsc2U7Ci0JfQotb3V0 OgotCW11dGV4X3VubG9jaygmbGNkLT5sb2NrKTsKLX0KLQotc3RhdGljIGNvbnN0IHVuc2lnbmVk IHNob3J0IHNlcV9zd3Jlc2V0W10gPSB7Ci0JMHgwMSwgQ09NTUFORF9PTkxZLAotCUVORERFRiwg MHgwMAotfTsKLQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IHNlcV91c2VyX3NldHRpbmdb XSA9IHsKLQkweEYwLCAweDVBLAotCi0JREFUQV9PTkxZLCAweDVBLAotCUVORERFRiwgMHgwMAot fTsKLQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IHNlcV9lbHZzc19vbltdID0gewotCTB4 QjEsIDB4MEQsCi0KLQlEQVRBX09OTFksIDB4MDAsCi0JREFUQV9PTkxZLCAweDE2LAotCUVORERF RiwgMHgwMAotfTsKLQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IHNlcV9ndGNvbltdID0g ewotCTB4RjcsIDB4MDksCi0KLQlEQVRBX09OTFksIDB4MDAsCi0JREFUQV9PTkxZLCAweDAwLAot CUVORERFRiwgMHgwMAotfTsKLQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IHNlcV9wYW5l bF9jb25kaXRpb25bXSA9IHsKLQkweEY4LCAweDA1LAotCi0JREFUQV9PTkxZLCAweDY1LAotCURB VEFfT05MWSwgMHg5NiwKLQlEQVRBX09OTFksIDB4NzEsCi0JREFUQV9PTkxZLCAweDdELAotCURB VEFfT05MWSwgMHgxOSwKLQlEQVRBX09OTFksIDB4M0IsCi0JREFUQV9PTkxZLCAweDBELAotCURB VEFfT05MWSwgMHgxOSwKLQlEQVRBX09OTFksIDB4N0UsCi0JREFUQV9PTkxZLCAweDBELAotCURB VEFfT05MWSwgMHhFMiwKLQlEQVRBX09OTFksIDB4MDAsCi0JREFUQV9PTkxZLCAweDAwLAotCURB VEFfT05MWSwgMHg3RSwKLQlEQVRBX09OTFksIDB4N0QsCi0JREFUQV9PTkxZLCAweDA3LAotCURB VEFfT05MWSwgMHgwNywKLQlEQVRBX09OTFksIDB4MjAsCi0JREFUQV9PTkxZLCAweDIwLAotCURB VEFfT05MWSwgMHgyMCwKLQlEQVRBX09OTFksIDB4MDIsCi0JREFUQV9PTkxZLCAweDAyLAotCUVO RERFRiwgMHgwMAotfTsKLQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IHNlcV9nYW1tYV9z ZXQxW10gPSB7Ci0JMHhGOSwgMHgwMCwKLQotCURBVEFfT05MWSwgMHhBNywKLQlEQVRBX09OTFks IDB4QjQsCi0JREFUQV9PTkxZLCAweEFFLAotCURBVEFfT05MWSwgMHhCRiwKLQlEQVRBX09OTFks IDB4MDAsCi0JREFUQV9PTkxZLCAweDkxLAotCURBVEFfT05MWSwgMHgwMCwKLQlEQVRBX09OTFks IDB4QjIsCi0JREFUQV9PTkxZLCAweEI0LAotCURBVEFfT05MWSwgMHhBQSwKLQlEQVRBX09OTFks IDB4QkIsCi0JREFUQV9PTkxZLCAweDAwLAotCURBVEFfT05MWSwgMHhBQywKLQlEQVRBX09OTFks IDB4MDAsCi0JREFUQV9PTkxZLCAweEIzLAotCURBVEFfT05MWSwgMHhCMSwKLQlEQVRBX09OTFks IDB4QUEsCi0JREFUQV9PTkxZLCAweEJDLAotCURBVEFfT05MWSwgMHgwMCwKLQlEQVRBX09OTFks IDB4QjMsCi0JRU5EREVGLCAweDAwCi19OwotCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQg c2VxX2dhbW1hX2N0cmxbXSA9IHsKLQkweEZCLCAweDAyLAotCi0JREFUQV9PTkxZLCAweDVBLAot CUVORERFRiwgMHgwMAotfTsKLQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IHNlcV9nYW1t YV9zdGFydFtdID0gewotCTB4RjksIENPTU1BTkRfT05MWSwKLQotCUVORERFRiwgMHgwMAotfTsK LQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IHNlcV9hcG9uW10gPSB7Ci0JMHhGMywgMHgw MCwKLQotCURBVEFfT05MWSwgMHgwMCwKLQlEQVRBX09OTFksIDB4MDAsCi0JREFUQV9PTkxZLCAw eDBBLAotCURBVEFfT05MWSwgMHgwMiwKLQlFTkRERUYsIDB4MDAKLX07Ci0KLXN0YXRpYyBjb25z dCB1bnNpZ25lZCBzaG9ydCBzZXFfZGlzcGxheV9jdHJsW10gPSB7Ci0JMHhGMiwgMHgwMiwKLQot CURBVEFfT05MWSwgMHgwOCwKLQlEQVRBX09OTFksIDB4MDgsCi0JREFUQV9PTkxZLCAweDEwLAot CURBVEFfT05MWSwgMHgxMCwKLQlFTkRERUYsIDB4MDAKLX07Ci0KLXN0YXRpYyBjb25zdCB1bnNp Z25lZCBzaG9ydCBzZXFfbWFudWFsX3B3cltdID0gewotCTB4QjAsIDB4MDQsCi0JRU5EREVGLCAw eDAwCi19OwotCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgc2VxX3B3cl9jdHJsW10gPSB7 Ci0JMHhGNCwgMHgwQSwKLQotCURBVEFfT05MWSwgMHg4NywKLQlEQVRBX09OTFksIDB4MjUsCi0J REFUQV9PTkxZLCAweDZBLAotCURBVEFfT05MWSwgMHg0NCwKLQlEQVRBX09OTFksIDB4MDIsCi0J REFUQV9PTkxZLCAweDg4LAotCUVORERFRiwgMHgwMAotfTsKLQotc3RhdGljIGNvbnN0IHVuc2ln bmVkIHNob3J0IHNlcV9zbGVlcF9vdXRbXSA9IHsKLQkweDExLCBDT01NQU5EX09OTFksCi0JRU5E REVGLCAweDAwCi19OwotCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgc2VxX3NsZWVwX2lu W10gPSB7Ci0JMHgxMCwgQ09NTUFORF9PTkxZLAotCUVORERFRiwgMHgwMAotfTsKLQotc3RhdGlj IGNvbnN0IHVuc2lnbmVkIHNob3J0IHNlcV9kaXNwbGF5X29uW10gPSB7Ci0JMHgyOSwgQ09NTUFO RF9PTkxZLAotCUVORERFRiwgMHgwMAotfTsKLQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0 IHNlcV9kaXNwbGF5X29mZltdID0gewotCTB4MjgsIENPTU1BTkRfT05MWSwKLQlFTkRERUYsIDB4 MDAKLX07Ci0KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBzZXFfdmNpMV8xc3RfZW5bXSA9 IHsKLQkweEYzLCAweDEwLAotCi0JREFUQV9PTkxZLCAweDAwLAotCURBVEFfT05MWSwgMHgwMCwK LQlEQVRBX09OTFksIDB4MDAsCi0JREFUQV9PTkxZLCAweDAyLAotCUVORERFRiwgMHgwMAotfTsK LQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IHNlcV92bDFfZW5bXSA9IHsKLQkweEYzLCAw eDExLAotCi0JREFUQV9PTkxZLCAweDAwLAotCURBVEFfT05MWSwgMHgwMCwKLQlEQVRBX09OTFks IDB4MDAsCi0JREFUQV9PTkxZLCAweDAyLAotCUVORERFRiwgMHgwMAotfTsKLQotc3RhdGljIGNv bnN0IHVuc2lnbmVkIHNob3J0IHNlcV92bDJfZW5bXSA9IHsKLQkweEYzLCAweDEzLAotCi0JREFU QV9PTkxZLCAweDAwLAotCURBVEFfT05MWSwgMHgwMCwKLQlEQVRBX09OTFksIDB4MDAsCi0JREFU QV9PTkxZLCAweDAyLAotCUVORERFRiwgMHgwMAotfTsKLQotc3RhdGljIGNvbnN0IHVuc2lnbmVk IHNob3J0IHNlcV92Y2kxXzJuZF9lbltdID0gewotCTB4RjMsIDB4MzMsCi0KLQlEQVRBX09OTFks IDB4MDAsCi0JREFUQV9PTkxZLCAweDAwLAotCURBVEFfT05MWSwgMHgwMCwKLQlEQVRBX09OTFks IDB4MDIsCi0JRU5EREVGLCAweDAwCi19OwotCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQg c2VxX3ZsM19lbltdID0gewotCTB4RjMsIDB4MzcsCi0KLQlEQVRBX09OTFksIDB4MDAsCi0JREFU QV9PTkxZLCAweDAwLAotCURBVEFfT05MWSwgMHgwMCwKLQlEQVRBX09OTFksIDB4MDIsCi0JRU5E REVGLCAweDAwCi19OwotCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgc2VxX3ZyZWcxX2Ft cF9lbltdID0gewotCTB4RjMsIDB4MzcsCi0KLQlEQVRBX09OTFksIDB4MDEsCi0JREFUQV9PTkxZ LCAweDAwLAotCURBVEFfT05MWSwgMHgwMCwKLQlEQVRBX09OTFksIDB4MDIsCi0JRU5EREVGLCAw eDAwCi19OwotCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgc2VxX3ZnaF9hbXBfZW5bXSA9 IHsKLQkweEYzLCAweDM3LAotCi0JREFUQV9PTkxZLCAweDExLAotCURBVEFfT05MWSwgMHgwMCwK LQlEQVRBX09OTFksIDB4MDAsCi0JREFUQV9PTkxZLCAweDAyLAotCUVORERFRiwgMHgwMAotfTsK LQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IHNlcV92Z2xfYW1wX2VuW10gPSB7Ci0JMHhG MywgMHgzNywKLQotCURBVEFfT05MWSwgMHgzMSwKLQlEQVRBX09OTFksIDB4MDAsCi0JREFUQV9P TkxZLCAweDAwLAotCURBVEFfT05MWSwgMHgwMiwKLQlFTkRERUYsIDB4MDAKLX07Ci0KLXN0YXRp YyBjb25zdCB1bnNpZ25lZCBzaG9ydCBzZXFfdm1vc19hbXBfZW5bXSA9IHsKLQkweEYzLCAweDM3 LAotCi0JREFUQV9PTkxZLCAweEIxLAotCURBVEFfT05MWSwgMHgwMCwKLQlEQVRBX09OTFksIDB4 MDAsCi0JREFUQV9PTkxZLCAweDAzLAotCUVORERFRiwgMHgwMAotfTsKLQotc3RhdGljIGNvbnN0 IHVuc2lnbmVkIHNob3J0IHNlcV92aW50X2FtcF9lbltdID0gewotCTB4RjMsIDB4MzcsCi0KLQlE QVRBX09OTFksIDB4RjEsCi0JLyogREFUQV9PTkxZLCAweDcxLAlWTU9TL1ZCTC9WQkggbm90IHVz ZWQgKi8KLQlEQVRBX09OTFksIDB4MDAsCi0JREFUQV9PTkxZLCAweDAwLAotCURBVEFfT05MWSwg MHgwMywKLQkvKiBEQVRBX09OTFksIDB4MDIsCVZNT1MvVkJML1ZCSCBub3QgdXNlZCAqLwotCUVO RERFRiwgMHgwMAotfTsKLQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IHNlcV92YmhfYW1w X2VuW10gPSB7Ci0JMHhGMywgMHgzNywKLQotCURBVEFfT05MWSwgMHhGOSwKLQlEQVRBX09OTFks IDB4MDAsCi0JREFUQV9PTkxZLCAweDAwLAotCURBVEFfT05MWSwgMHgwMywKLQlFTkRERUYsIDB4 MDAKLX07Ci0KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBzZXFfdmJsX2FtcF9lbltdID0g ewotCTB4RjMsIDB4MzcsCi0KLQlEQVRBX09OTFksIDB4RkQsCi0JREFUQV9PTkxZLCAweDAwLAot CURBVEFfT05MWSwgMHgwMCwKLQlEQVRBX09OTFksIDB4MDMsCi0JRU5EREVGLCAweDAwCi19Owot Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgc2VxX2dhbV9hbXBfZW5bXSA9IHsKLQkweEYz LCAweDM3LAotCi0JREFUQV9PTkxZLCAweEZGLAotCS8qIERBVEFfT05MWSwgMHg3MywJVk1PUy9W QkwvVkJIIG5vdCB1c2VkICovCi0JREFUQV9PTkxZLCAweDAwLAotCURBVEFfT05MWSwgMHgwMCwK LQlEQVRBX09OTFksIDB4MDMsCi0JLyogREFUQV9PTkxZLCAweDAyLAlWTU9TL1ZCTC9WQkggbm90 IHVzZWQgKi8KLQlFTkRERUYsIDB4MDAKLX07Ci0KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9y dCBzZXFfc2RfYW1wX2VuW10gPSB7Ci0JMHhGMywgMHgzNywKLQotCURBVEFfT05MWSwgMHhGRiwK LQkvKiBEQVRBX09OTFksIDB4NzMsCVZNT1MvVkJML1ZCSCBub3QgdXNlZCAqLwotCURBVEFfT05M WSwgMHg4MCwKLQlEQVRBX09OTFksIDB4MDAsCi0JREFUQV9PTkxZLCAweDAzLAotCS8qIERBVEFf T05MWSwgMHgwMiwJVk1PUy9WQkwvVkJIIG5vdCB1c2VkICovCi0JRU5EREVGLCAweDAwCi19Owot Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgc2VxX2dsc19lbltdID0gewotCTB4RjMsIDB4 MzcsCi0KLQlEQVRBX09OTFksIDB4RkYsCi0JLyogREFUQV9PTkxZLCAweDczLAlWTU9TL1ZCTC9W Qkggbm90IHVzZWQgKi8KLQlEQVRBX09OTFksIDB4ODEsCi0JREFUQV9PTkxZLCAweDAwLAotCURB VEFfT05MWSwgMHgwMywKLQkvKiBEQVRBX09OTFksIDB4MDIsCVZNT1MvVkJML1ZCSCBub3QgdXNl ZCAqLwotCUVORERFRiwgMHgwMAotfTsKLQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IHNl cV9lbHNfZW5bXSA9IHsKLQkweEYzLCAweDM3LAotCi0JREFUQV9PTkxZLCAweEZGLAotCS8qIERB VEFfT05MWSwgMHg3MywJVk1PUy9WQkwvVkJIIG5vdCB1c2VkICovCi0JREFUQV9PTkxZLCAweDgz LAotCURBVEFfT05MWSwgMHgwMCwKLQlEQVRBX09OTFksIDB4MDMsCi0JLyogREFUQV9PTkxZLCAw eDAyLAlWTU9TL1ZCTC9WQkggbm90IHVzZWQgKi8KLQlFTkRERUYsIDB4MDAKLX07Ci0KLXN0YXRp YyBjb25zdCB1bnNpZ25lZCBzaG9ydCBzZXFfZWxfb25bXSA9IHsKLQkweEYzLCAweDM3LAotCi0J REFUQV9PTkxZLCAweEZGLAotCS8qIERBVEFfT05MWSwgMHg3MywJVk1PUy9WQkwvVkJIIG5vdCB1 c2VkICovCi0JREFUQV9PTkxZLCAweDg3LAotCURBVEFfT05MWSwgMHgwMCwKLQlEQVRBX09OTFks IDB4MDMsCi0JLyogREFUQV9PTkxZLCAweDAyLAlWTU9TL1ZCTC9WQkggbm90IHVzZWQgKi8KLQlF TkRERUYsIDB4MDAKLX07Ci0KLXN0YXRpYyBpbnQgbGQ5MDQwX3NwaV93cml0ZV9ieXRlKHN0cnVj dCBsZDkwNDAgKmxjZCwgaW50IGFkZHIsIGludCBkYXRhKQotewotCXUxNiBidWZbMV07Ci0Jc3Ry dWN0IHNwaV9tZXNzYWdlIG1zZzsKLQotCXN0cnVjdCBzcGlfdHJhbnNmZXIgeGZlciA9IHsKLQkJ LmxlbgkJPSAyLAotCQkudHhfYnVmCQk9IGJ1ZiwKLQl9OwotCi0JYnVmWzBdID0gKGFkZHIgPDwg OCkgfCBkYXRhOwotCi0Jc3BpX21lc3NhZ2VfaW5pdCgmbXNnKTsKLQlzcGlfbWVzc2FnZV9hZGRf dGFpbCgmeGZlciwgJm1zZyk7Ci0KLQlyZXR1cm4gc3BpX3N5bmMobGNkLT5zcGksICZtc2cpOwot fQotCi1zdGF0aWMgaW50IGxkOTA0MF9zcGlfd3JpdGUoc3RydWN0IGxkOTA0MCAqbGNkLCB1bnNp Z25lZCBjaGFyIGFkZHJlc3MsCi0JdW5zaWduZWQgY2hhciBjb21tYW5kKQotewotCWludCByZXQg PSAwOwotCi0JaWYgKGFkZHJlc3MgIT0gREFUQV9PTkxZKQotCQlyZXQgPSBsZDkwNDBfc3BpX3dy aXRlX2J5dGUobGNkLCAweDAsIGFkZHJlc3MpOwotCWlmIChjb21tYW5kICE9IENPTU1BTkRfT05M WSkKLQkJcmV0ID0gbGQ5MDQwX3NwaV93cml0ZV9ieXRlKGxjZCwgMHgxLCBjb21tYW5kKTsKLQot CXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbGQ5MDQwX3BhbmVsX3NlbmRfc2VxdWVuY2Uo c3RydWN0IGxkOTA0MCAqbGNkLAotCWNvbnN0IHVuc2lnbmVkIHNob3J0ICp3YnVmKQotewotCWlu dCByZXQgPSAwLCBpID0gMDsKLQotCXdoaWxlICgod2J1ZltpXSAmIERFRk1BU0spICE9IEVORERF RikgewotCQlpZiAoKHdidWZbaV0gJiBERUZNQVNLKSAhPSBTTEVFUE1TRUMpIHsKLQkJCXJldCA9 IGxkOTA0MF9zcGlfd3JpdGUobGNkLCB3YnVmW2ldLCB3YnVmW2krMV0pOwotCQkJaWYgKHJldCkK LQkJCQlicmVhazsKLQkJfSBlbHNlIHsKLQkJCW1zbGVlcCh3YnVmW2krMV0pOwotCQl9Ci0JCWkg Kz0gMjsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IF9sZDkwNDBfZ2FtbWFf Y3RsKHN0cnVjdCBsZDkwNDAgKmxjZCwgY29uc3QgdW5zaWduZWQgaW50ICpnYW1tYSkKLXsKLQl1 bnNpZ25lZCBpbnQgaSA9IDA7Ci0JaW50IHJldCA9IDA7Ci0KLQkvKiBzdGFydCBnYW1tYSB0YWJs ZSB1cGRhdGluZy4gKi8KLQlyZXQgPSBsZDkwNDBfcGFuZWxfc2VuZF9zZXF1ZW5jZShsY2QsIHNl cV9nYW1tYV9zdGFydCk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKGxjZC0+ZGV2LCAiZmFpbGVk IHRvIGRpc2FibGUgZ2FtbWEgdGFibGUgdXBkYXRpbmcuXG4iKTsKLQkJZ290byBnYW1tYV9lcnI7 Ci0JfQotCi0JZm9yIChpID0gMCA7IGkgPCBHQU1NQV9UQUJMRV9DT1VOVDsgaSsrKSB7Ci0JCXJl dCA9IGxkOTA0MF9zcGlfd3JpdGUobGNkLCBEQVRBX09OTFksIGdhbW1hW2ldKTsKLQkJaWYgKHJl dCkgewotCQkJZGV2X2VycihsY2QtPmRldiwgImZhaWxlZCB0byBzZXQgZ2FtbWEgdGFibGUuXG4i KTsKLQkJCWdvdG8gZ2FtbWFfZXJyOwotCQl9Ci0JfQotCi0JLyogdXBkYXRlIGdhbW1hIHRhYmxl LiAqLwotCXJldCA9IGxkOTA0MF9wYW5lbF9zZW5kX3NlcXVlbmNlKGxjZCwgc2VxX2dhbW1hX2N0 cmwpOwotCWlmIChyZXQpCi0JCWRldl9lcnIobGNkLT5kZXYsICJmYWlsZWQgdG8gdXBkYXRlIGdh bW1hIHRhYmxlLlxuIik7Ci0KLWdhbW1hX2VycjoKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMg aW50IGxkOTA0MF9nYW1tYV9jdGwoc3RydWN0IGxkOTA0MCAqbGNkLCBpbnQgZ2FtbWEpCi17Ci0J cmV0dXJuIF9sZDkwNDBfZ2FtbWFfY3RsKGxjZCwgZ2FtbWFfdGFibGUuZ2FtbWFfMjJfdGFibGVb Z2FtbWFdKTsKLX0KLQotc3RhdGljIGludCBsZDkwNDBfbGRpX2luaXQoc3RydWN0IGxkOTA0MCAq bGNkKQotewotCWludCByZXQsIGk7Ci0Jc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0ICppbml0 X3NlcVtdID0gewotCQlzZXFfdXNlcl9zZXR0aW5nLAotCQlzZXFfcGFuZWxfY29uZGl0aW9uLAot CQlzZXFfZGlzcGxheV9jdHJsLAotCQlzZXFfbWFudWFsX3B3ciwKLQkJc2VxX2VsdnNzX29uLAot CQlzZXFfZ3Rjb24sCi0JCXNlcV9nYW1tYV9zZXQxLAotCQlzZXFfZ2FtbWFfY3RybCwKLQkJc2Vx X3NsZWVwX291dCwKLQl9OwotCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaW5pdF9zZXEp OyBpKyspIHsKLQkJcmV0ID0gbGQ5MDQwX3BhbmVsX3NlbmRfc2VxdWVuY2UobGNkLCBpbml0X3Nl cVtpXSk7Ci0JCS8qIHdvcmthcm91bmQ6IG1pbmltdW0gZGVsYXkgdGltZSBmb3IgdHJhbnNmZXJy aW5nIENNRCAqLwotCQl1c2xlZXBfcmFuZ2UoMzAwLCAzMTApOwotCQlpZiAocmV0KQotCQkJYnJl YWs7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBsZDkwNDBfbGRpX2VuYWJs ZShzdHJ1Y3QgbGQ5MDQwICpsY2QpCi17Ci0JcmV0dXJuIGxkOTA0MF9wYW5lbF9zZW5kX3NlcXVl bmNlKGxjZCwgc2VxX2Rpc3BsYXlfb24pOwotfQotCi1zdGF0aWMgaW50IGxkOTA0MF9sZGlfZGlz YWJsZShzdHJ1Y3QgbGQ5MDQwICpsY2QpCi17Ci0JaW50IHJldDsKLQotCXJldCA9IGxkOTA0MF9w YW5lbF9zZW5kX3NlcXVlbmNlKGxjZCwgc2VxX2Rpc3BsYXlfb2ZmKTsKLQlyZXQgPSBsZDkwNDBf cGFuZWxfc2VuZF9zZXF1ZW5jZShsY2QsIHNlcV9zbGVlcF9pbik7Ci0KLQlyZXR1cm4gcmV0Owot fQotCi1zdGF0aWMgaW50IGxkOTA0MF9wb3dlcl9pc19vbihpbnQgcG93ZXIpCi17Ci0JcmV0dXJu IHBvd2VyIDw9IEZCX0JMQU5LX05PUk1BTDsKLX0KLQotc3RhdGljIGludCBsZDkwNDBfcG93ZXJf b24oc3RydWN0IGxkOTA0MCAqbGNkKQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCBsY2RfcGxh dGZvcm1fZGF0YSAqcGQ7Ci0KLQlwZCA9IGxjZC0+bGNkX3BkOwotCi0JLyogbGNkIHBvd2VyIG9u ICovCi0JbGQ5MDQwX3JlZ3VsYXRvcl9lbmFibGUobGNkKTsKLQotCWlmICghcGQtPnJlc2V0KSB7 Ci0JCWRldl9lcnIobGNkLT5kZXYsICJyZXNldCBpcyBOVUxMLlxuIik7Ci0JCXJldHVybiAtRUlO VkFMOwotCX0KLQotCXBkLT5yZXNldChsY2QtPmxkKTsKLQltc2xlZXAocGQtPnJlc2V0X2RlbGF5 KTsKLQotCXJldCA9IGxkOTA0MF9sZGlfaW5pdChsY2QpOwotCWlmIChyZXQpIHsKLQkJZGV2X2Vy cihsY2QtPmRldiwgImZhaWxlZCB0byBpbml0aWFsaXplIGxkaS5cbiIpOwotCQlyZXR1cm4gcmV0 OwotCX0KLQotCXJldCA9IGxkOTA0MF9sZGlfZW5hYmxlKGxjZCk7Ci0JaWYgKHJldCkgewotCQlk ZXZfZXJyKGxjZC0+ZGV2LCAiZmFpbGVkIHRvIGVuYWJsZSBsZGkuXG4iKTsKLQkJcmV0dXJuIHJl dDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBsZDkwNDBfcG93ZXJfb2ZmKHN0 cnVjdCBsZDkwNDAgKmxjZCkKLXsKLQlpbnQgcmV0OwotCXN0cnVjdCBsY2RfcGxhdGZvcm1fZGF0 YSAqcGQ7Ci0KLQlwZCA9IGxjZC0+bGNkX3BkOwotCi0JcmV0ID0gbGQ5MDQwX2xkaV9kaXNhYmxl KGxjZCk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKGxjZC0+ZGV2LCAibGNkIHNldHRpbmcgZmFp bGVkLlxuIik7Ci0JCXJldHVybiAtRUlPOwotCX0KLQotCW1zbGVlcChwZC0+cG93ZXJfb2ZmX2Rl bGF5KTsKLQotCS8qIGxjZCBwb3dlciBvZmYgKi8KLQlsZDkwNDBfcmVndWxhdG9yX2Rpc2FibGUo bGNkKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGxkOTA0MF9wb3dlcihzdHJ1Y3Qg bGQ5MDQwICpsY2QsIGludCBwb3dlcikKLXsKLQlpbnQgcmV0ID0gMDsKLQotCWlmIChsZDkwNDBf cG93ZXJfaXNfb24ocG93ZXIpICYmICFsZDkwNDBfcG93ZXJfaXNfb24obGNkLT5wb3dlcikpCi0J CXJldCA9IGxkOTA0MF9wb3dlcl9vbihsY2QpOwotCWVsc2UgaWYgKCFsZDkwNDBfcG93ZXJfaXNf b24ocG93ZXIpICYmIGxkOTA0MF9wb3dlcl9pc19vbihsY2QtPnBvd2VyKSkKLQkJcmV0ID0gbGQ5 MDQwX3Bvd2VyX29mZihsY2QpOwotCi0JaWYgKCFyZXQpCi0JCWxjZC0+cG93ZXIgPSBwb3dlcjsK LQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgbGQ5MDQwX3NldF9wb3dlcihzdHJ1Y3Qg bGNkX2RldmljZSAqbGQsIGludCBwb3dlcikKLXsKLQlzdHJ1Y3QgbGQ5MDQwICpsY2QgPSBsY2Rf Z2V0X2RhdGEobGQpOwotCi0JaWYgKHBvd2VyICE9IEZCX0JMQU5LX1VOQkxBTksgJiYgcG93ZXIg IT0gRkJfQkxBTktfUE9XRVJET1dOICYmCi0JCXBvd2VyICE9IEZCX0JMQU5LX05PUk1BTCkgewot CQlkZXZfZXJyKGxjZC0+ZGV2LCAicG93ZXIgdmFsdWUgc2hvdWxkIGJlIDAsIDEgb3IgNC5cbiIp OwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyZXR1cm4gbGQ5MDQwX3Bvd2VyKGxjZCwgcG93 ZXIpOwotfQotCi1zdGF0aWMgaW50IGxkOTA0MF9nZXRfcG93ZXIoc3RydWN0IGxjZF9kZXZpY2Ug KmxkKQotewotCXN0cnVjdCBsZDkwNDAgKmxjZCA9IGxjZF9nZXRfZGF0YShsZCk7Ci0KLQlyZXR1 cm4gbGNkLT5wb3dlcjsKLX0KLQotc3RhdGljIGludCBsZDkwNDBfc2V0X2JyaWdodG5lc3Moc3Ry dWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkKQotewotCWludCByZXQgPSAwLCBicmlnaHRuZXNzID0g YmQtPnByb3BzLmJyaWdodG5lc3M7Ci0Jc3RydWN0IGxkOTA0MCAqbGNkID0gYmxfZ2V0X2RhdGEo YmQpOwotCi0JaWYgKGJyaWdodG5lc3MgPCBNSU5fQlJJR0hUTkVTUyB8fAotCQlicmlnaHRuZXNz ID4gYmQtPnByb3BzLm1heF9icmlnaHRuZXNzKSB7Ci0JCWRldl9lcnIoJmJkLT5kZXYsICJsY2Qg YnJpZ2h0bmVzcyBzaG91bGQgYmUgJWQgdG8gJWQuXG4iLAotCQkJTUlOX0JSSUdIVE5FU1MsIE1B WF9CUklHSFRORVNTKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0ID0gbGQ5MDQwX2dh bW1hX2N0bChsY2QsIGJkLT5wcm9wcy5icmlnaHRuZXNzKTsKLQlpZiAocmV0KSB7Ci0JCWRldl9l cnIoJmJkLT5kZXYsICJsY2QgYnJpZ2h0bmVzcyBzZXR0aW5nIGZhaWxlZC5cbiIpOwotCQlyZXR1 cm4gLUVJTzsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgc3RydWN0IGxjZF9vcHMg bGQ5MDQwX2xjZF9vcHMgPSB7Ci0JLnNldF9wb3dlciA9IGxkOTA0MF9zZXRfcG93ZXIsCi0JLmdl dF9wb3dlciA9IGxkOTA0MF9nZXRfcG93ZXIsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGJh Y2tsaWdodF9vcHMgbGQ5MDQwX2JhY2tsaWdodF9vcHMgID0gewotCS51cGRhdGVfc3RhdHVzID0g bGQ5MDQwX3NldF9icmlnaHRuZXNzLAotfTsKLQotc3RhdGljIGludCBsZDkwNDBfcHJvYmUoc3Ry dWN0IHNwaV9kZXZpY2UgKnNwaSkKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgbGQ5MDQwICps Y2QgPSBOVUxMOwotCXN0cnVjdCBsY2RfZGV2aWNlICpsZCA9IE5VTEw7Ci0Jc3RydWN0IGJhY2ts aWdodF9kZXZpY2UgKmJkID0gTlVMTDsKLQlzdHJ1Y3QgYmFja2xpZ2h0X3Byb3BlcnRpZXMgcHJv cHM7Ci0KLQlsY2QgPSBkZXZtX2t6YWxsb2MoJnNwaS0+ZGV2LCBzaXplb2Yoc3RydWN0IGxkOTA0 MCksIEdGUF9LRVJORUwpOwotCWlmICghbGNkKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCS8qIGxk OTA0MCBsY2QgcGFuZWwgdXNlcyAzLXdpcmUgOWJpdHMgU1BJIE1vZGUuICovCi0Jc3BpLT5iaXRz X3Blcl93b3JkID0gOTsKLQotCXJldCA9IHNwaV9zZXR1cChzcGkpOwotCWlmIChyZXQgPCAwKSB7 Ci0JCWRldl9lcnIoJnNwaS0+ZGV2LCAic3BpIHNldHVwIGZhaWxlZC5cbiIpOwotCQlyZXR1cm4g cmV0OwotCX0KLQotCWxjZC0+c3BpID0gc3BpOwotCWxjZC0+ZGV2ID0gJnNwaS0+ZGV2OwotCi0J bGNkLT5sY2RfcGQgPSBkZXZfZ2V0X3BsYXRkYXRhKCZzcGktPmRldik7Ci0JaWYgKCFsY2QtPmxj ZF9wZCkgewotCQlkZXZfZXJyKCZzcGktPmRldiwgInBsYXRmb3JtIGRhdGEgaXMgTlVMTC5cbiIp OwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQltdXRleF9pbml0KCZsY2QtPmxvY2spOwotCi0J cmV0ID0gZGV2bV9yZWd1bGF0b3JfYnVsa19nZXQobGNkLT5kZXYsIEFSUkFZX1NJWkUoc3VwcGxp ZXMpLCBzdXBwbGllcyk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKGxjZC0+ZGV2LCAiRmFpbGVk IHRvIGdldCByZWd1bGF0b3JzOiAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQls ZCA9IGRldm1fbGNkX2RldmljZV9yZWdpc3Rlcigmc3BpLT5kZXYsICJsZDkwNDAiLCAmc3BpLT5k ZXYsIGxjZCwKLQkJCQkJJmxkOTA0MF9sY2Rfb3BzKTsKLQlpZiAoSVNfRVJSKGxkKSkKLQkJcmV0 dXJuIFBUUl9FUlIobGQpOwotCi0JbGNkLT5sZCA9IGxkOwotCi0JbWVtc2V0KCZwcm9wcywgMCwg c2l6ZW9mKHN0cnVjdCBiYWNrbGlnaHRfcHJvcGVydGllcykpOwotCXByb3BzLnR5cGUgPSBCQUNL TElHSFRfUkFXOwotCXByb3BzLm1heF9icmlnaHRuZXNzID0gTUFYX0JSSUdIVE5FU1M7Ci0KLQli ZCA9IGRldm1fYmFja2xpZ2h0X2RldmljZV9yZWdpc3Rlcigmc3BpLT5kZXYsICJsZDkwNDAtYmwi LCAmc3BpLT5kZXYsCi0JCQkJCWxjZCwgJmxkOTA0MF9iYWNrbGlnaHRfb3BzLCAmcHJvcHMpOwot CWlmIChJU19FUlIoYmQpKQotCQlyZXR1cm4gUFRSX0VSUihiZCk7Ci0KLQliZC0+cHJvcHMuYnJp Z2h0bmVzcyA9IE1BWF9CUklHSFRORVNTOwotCWxjZC0+YmQgPSBiZDsKLQotCS8qCi0JICogaWYg bGNkIHBhbmVsIHdhcyBvbiBmcm9tIGJvb3Rsb2FkZXIgbGlrZSB1LWJvb3QgdGhlbgotCSAqIGRv IG5vdCBsY2Qgb24uCi0JICovCi0JaWYgKCFsY2QtPmxjZF9wZC0+bGNkX2VuYWJsZWQpIHsKLQkJ LyoKLQkJICogaWYgbGNkIHBhbmVsIHdhcyBvZmYgZnJvbSBib290bG9hZGVyIHRoZW4KLQkJICog Y3VycmVudCBsY2Qgc3RhdHVzIGlzIHBvd2VyZG93biBhbmQgdGhlbgotCQkgKiBpdCBlbmFibGVz IGxjZCBwYW5lbC4KLQkJICovCi0JCWxjZC0+cG93ZXIgPSBGQl9CTEFOS19QT1dFUkRPV047Ci0K LQkJbGQ5MDQwX3Bvd2VyKGxjZCwgRkJfQkxBTktfVU5CTEFOSyk7Ci0JfSBlbHNlIHsKLQkJbGNk LT5wb3dlciA9IEZCX0JMQU5LX1VOQkxBTks7Ci0JfQotCi0Jc3BpX3NldF9kcnZkYXRhKHNwaSwg bGNkKTsKLQotCWRldl9pbmZvKCZzcGktPmRldiwgImxkOTA0MCBwYW5lbCBkcml2ZXIgaGFzIGJl ZW4gcHJvYmVkLlxuIik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgbGQ5MDQwX3JlbW92 ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQotewotCXN0cnVjdCBsZDkwNDAgKmxjZCA9IHNwaV9n ZXRfZHJ2ZGF0YShzcGkpOwotCi0JbGQ5MDQwX3Bvd2VyKGxjZCwgRkJfQkxBTktfUE9XRVJET1dO KTsKLQlyZXR1cm4gMDsKLX0KLQotI2lmZGVmIENPTkZJR19QTV9TTEVFUAotc3RhdGljIGludCBs ZDkwNDBfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGxkOTA0MCAqbGNk ID0gZGV2X2dldF9kcnZkYXRhKGRldik7Ci0KLQlkZXZfZGJnKGRldiwgImxjZC0+cG93ZXIgPSAl ZFxuIiwgbGNkLT5wb3dlcik7Ci0KLQkvKgotCSAqIHdoZW4gbGNkIHBhbmVsIGlzIHN1c3BlbmQs IGxjZCBwYW5lbCBiZWNvbWVzIG9mZgotCSAqIHJlZ2FyZGxlc3Mgb2Ygc3RhdHVzLgotCSAqLwot CXJldHVybiBsZDkwNDBfcG93ZXIobGNkLCBGQl9CTEFOS19QT1dFUkRPV04pOwotfQotCi1zdGF0 aWMgaW50IGxkOTA0MF9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQotewotCXN0cnVjdCBsZDkw NDAgKmxjZCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCi0JbGNkLT5wb3dlciA9IEZCX0JMQU5L X1BPV0VSRE9XTjsKLQotCXJldHVybiBsZDkwNDBfcG93ZXIobGNkLCBGQl9CTEFOS19VTkJMQU5L KTsKLX0KLSNlbmRpZgotCi1zdGF0aWMgU0lNUExFX0RFVl9QTV9PUFMobGQ5MDQwX3BtX29wcywg bGQ5MDQwX3N1c3BlbmQsIGxkOTA0MF9yZXN1bWUpOwotCi0vKiBQb3dlciBkb3duIGFsbCBkaXNw bGF5cyBvbiByZWJvb3QsIHBvd2Vyb2ZmIG9yIGhhbHQuICovCi1zdGF0aWMgdm9pZCBsZDkwNDBf c2h1dGRvd24oc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKLXsKLQlzdHJ1Y3QgbGQ5MDQwICpsY2Qg PSBzcGlfZ2V0X2RydmRhdGEoc3BpKTsKLQotCWxkOTA0MF9wb3dlcihsY2QsIEZCX0JMQU5LX1BP V0VSRE9XTik7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBsZDkwNDBfZHJpdmVyID0g ewotCS5kcml2ZXIgPSB7Ci0JCS5uYW1lCT0gImxkOTA0MCIsCi0JCS5wbQk9ICZsZDkwNDBfcG1f b3BzLAotCX0sCi0JLnByb2JlCQk9IGxkOTA0MF9wcm9iZSwKLQkucmVtb3ZlCQk9IGxkOTA0MF9y ZW1vdmUsCi0JLnNodXRkb3duCT0gbGQ5MDQwX3NodXRkb3duLAotfTsKLQotbW9kdWxlX3NwaV9k cml2ZXIobGQ5MDQwX2RyaXZlcik7Ci0KLU1PRFVMRV9BVVRIT1IoIkRvbmdod2EgTGVlIDxkaDA5 LmxlZUBzYW1zdW5nLmNvbT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigibGQ5MDQwIExDRCBEcml2 ZXIiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8v YmFja2xpZ2h0L2xkOTA0MF9nYW1tYS5oIGIvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvbGQ5MDQw X2dhbW1hLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZTU4NmQ5NzM4NS4uMDAw MDAwMDAwMDAwCi0tLSBhL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2xkOTA0MF9nYW1tYS5oCisr KyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLS8qCi0gKiBHYW1tYSBsZXZlbCBkZWZpbml0 aW9ucy4KLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcwotICog SW5LaSBEYWUgPGlua2kuZGFlQHNhbXN1bmcuY29tPgotICogRG9uZ2h3YSBMZWUgPGRoMDkubGVl QHNhbXN1bmcuY29tPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3Ug Y2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMg b2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlz aGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qLwotCi0jaWZuZGVmIF9MRDkw NDBfQlJJR0hUTkVTU19ICi0jZGVmaW5lIF9MRDkwNDBfQlJJR0hUTkVTU19ICi0KLSNkZWZpbmUg TUFYX0dBTU1BX0xFVkVMCQkyNQotI2RlZmluZSBHQU1NQV9UQUJMRV9DT1VOVAkyMQotCi0vKiBn YW1tYSB2YWx1ZTogMi4yICovCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGxkOTA0MF8yMl8z MDBbXSA9IHsKLQkweDAwLCAweGE3LCAweGI0LCAweGFlLCAweGJmLCAweDAwLCAweDkxLAotCTB4 MDAsIDB4YjIsIDB4YjQsIDB4YWEsIDB4YmIsIDB4MDAsIDB4YWMsCi0JMHgwMCwgMHhiMywgMHhi MSwgMHhhYSwgMHhiYywgMHgwMCwgMHhiMwotfTsKLQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGlu dCBsZDkwNDBfMjJfMjkwW10gPSB7Ci0JMHgwMCwgMHhhOSwgMHhiNywgMHhhZSwgMHhiZCwgMHgw MCwgMHg4OSwKLQkweDAwLCAweGI3LCAweGI2LCAweGE4LCAweGJhLCAweDAwLCAweGE0LAotCTB4 MDAsIDB4YjEsIDB4YjQsIDB4YWEsIDB4YmIsIDB4MDAsIDB4YWEKLX07Ci0KLXN0YXRpYyBjb25z dCB1bnNpZ25lZCBpbnQgbGQ5MDQwXzIyXzI4MFtdID0gewotCTB4MDAsIDB4YTksIDB4YjYsIDB4 YWQsIDB4YmYsIDB4MDAsIDB4ODYsCi0JMHgwMCwgMHhiOCwgMHhiNSwgMHhhOCwgMHhiYywgMHgw MCwgMHhhMCwKLQkweDAwLCAweGIzLCAweGIzLCAweGE5LCAweGJjLCAweDAwLCAweGE3Ci19Owot Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGxkOTA0MF8yMl8yNzBbXSA9IHsKLQkweDAwLCAw eGE4LCAweGI4LCAweGFlLCAweGJlLCAweDAwLCAweDg0LAotCTB4MDAsIDB4YjksIDB4YjcsIDB4 YTgsIDB4YmMsIDB4MDAsIDB4OWQsCi0JMHgwMCwgMHhiMiwgMHhiNSwgMHhhYSwgMHhiYywgMHgw MCwgMHhhNAotCi19Owotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBsZDkwNDBfMjJfMjYwW10g PSB7Ci0JMHgwMCwgMHhhNCwgMHhiOCwgMHhiMCwgMHhiZiwgMHgwMCwgMHg4MCwKLQkweDAwLCAw eGI4LCAweGI2LCAweGFhLCAweGJjLCAweDAwLCAweDlhLAotCTB4MDAsIDB4YjAsIDB4YjUsIDB4 YWIsIDB4YmQsIDB4MDAsIDB4YTAKLX07Ci0KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbGQ5 MDQwXzIyXzI1MFtdID0gewotCTB4MDAsIDB4YTQsIDB4YjksIDB4YWYsIDB4YzEsIDB4MDAsIDB4 N2QsCi0JMHgwMCwgMHhiOSwgMHhiNiwgMHhhYSwgMHhiYiwgMHgwMCwgMHg5NywKLQkweDAwLCAw eGIxLCAweGI1LCAweGFhLCAweGJmLCAweDAwLCAweDlkCi19OwotCi1zdGF0aWMgY29uc3QgdW5z aWduZWQgaW50IGxkOTA0MF8yMl8yNDBbXSA9IHsKLQkweDAwLCAweGEyLCAweGI5LCAweGFmLCAw eGMyLCAweDAwLCAweDdhLAotCTB4MDAsIDB4YjksIDB4YjcsIDB4YWEsIDB4YmQsIDB4MDAsIDB4 OTQsCi0JMHgwMCwgMHhiMCwgMHhiNSwgMHhhYiwgMHhiZiwgMHgwMCwgMHg5YQotfTsKLQotc3Rh dGljIGNvbnN0IHVuc2lnbmVkIGludCBsZDkwNDBfMjJfMjMwW10gPSB7Ci0JMHgwMCwgMHhhMCwg MHhiOSwgMHhhZiwgMHhjMywgMHgwMCwgMHg3NywKLQkweDAwLCAweGI5LCAweGI3LCAweGFiLCAw eGJlLCAweDAwLCAweDkwLAotCTB4MDAsIDB4YjAsIDB4YjYsIDB4YWIsIDB4YmYsIDB4MDAsIDB4 OTcKLX07Ci0KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbGQ5MDQwXzIyXzIyMFtdID0gewot CTB4MDAsIDB4OWUsIDB4YmEsIDB4YjAsIDB4YzIsIDB4MDAsIDB4NzUsCi0JMHgwMCwgMHhiOSwg MHhiOCwgMHhhYiwgMHhiZSwgMHgwMCwgMHg4ZSwKLQkweDAwLCAweGIwLCAweGI2LCAweGFjLCAw eGJmLCAweDAwLCAweDk0Ci19OwotCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGxkOTA0MF8y Ml8yMTBbXSA9IHsKLQkweDAwLCAweDljLCAweGI5LCAweGIwLCAweGM0LCAweDAwLCAweDcyLAot CTB4MDAsIDB4YjgsIDB4YjgsIDB4YWMsIDB4YmYsIDB4MDAsIDB4OGEsCi0JMHgwMCwgMHhiMCwg MHhiNiwgMHhhYywgMHhjMCwgMHgwMCwgMHg5MQotfTsKLQotc3RhdGljIGNvbnN0IHVuc2lnbmVk IGludCBsZDkwNDBfMjJfMjAwW10gPSB7Ci0JMHgwMCwgMHg5YSwgMHhiYSwgMHhiMSwgMHhjNCwg MHgwMCwgMHg2ZiwKLQkweDAwLCAweGI4LCAweGI4LCAweGFkLCAweGMwLCAweDAwLCAweDg2LAot CTB4MDAsIDB4YjAsIDB4YjcsIDB4YWQsIDB4YzAsIDB4MDAsIDB4OGQKLX07Ci0KLXN0YXRpYyBj b25zdCB1bnNpZ25lZCBpbnQgbGQ5MDQwXzIyXzE5MFtdID0gewotCTB4MDAsIDB4OTcsIDB4YmEs IDB4YjIsIDB4YzUsIDB4MDAsIDB4NmMsCi0JMHgwMCwgMHhiOCwgMHhiOCwgMHhhZSwgMHhjMSwg MHgwMCwgMHg4MiwKLQkweDAwLCAweGIwLCAweGI2LCAweGFlLCAweGMyLCAweDAwLCAweDg5Ci19 OwotCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGxkOTA0MF8yMl8xODBbXSA9IHsKLQkweDAw LCAweDkzLCAweGJhLCAweGIzLCAweGM1LCAweDAwLCAweDY5LAotCTB4MDAsIDB4YjgsIDB4Yjks IDB4YWUsIDB4YzEsIDB4MDAsIDB4N2YsCi0JMHgwMCwgMHhiMCwgMHhiNiwgMHhhZSwgMHhjMywg MHgwMCwgMHg4NQotfTsKLQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBsZDkwNDBfMjJfMTcw W10gPSB7Ci0JMHgwMCwgMHg4YiwgMHhiOSwgMHhiMywgMHhjNywgMHgwMCwgMHg2NSwKLQkweDAw LCAweGI3LCAweGI4LCAweGFmLCAweGMzLCAweDAwLCAweDdhLAotCTB4MDAsIDB4ODAsIDB4YjYs IDB4YWUsIDB4YzQsIDB4MDAsIDB4ODEKLX07Ci0KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQg bGQ5MDQwXzIyXzE2MFtdID0gewotCTB4MDAsIDB4ODksIDB4YmEsIDB4YjMsIDB4YzgsIDB4MDAs IDB4NjIsCi0JMHgwMCwgMHhiNiwgMHhiYSwgMHhhZiwgMHhjMywgMHgwMCwgMHg3NiwKLQkweDAw LCAweGFmLCAweGI3LCAweGFlLCAweGM0LCAweDAwLCAweDdlCi19OwotCi1zdGF0aWMgY29uc3Qg dW5zaWduZWQgaW50IGxkOTA0MF8yMl8xNTBbXSA9IHsKLQkweDAwLCAweDgyLCAweGJhLCAweGI0 LCAweGM3LCAweDAwLCAweDVmLAotCTB4MDAsIDB4YjUsIDB4YmEsIDB4YjAsIDB4YzMsIDB4MDAs IDB4NzIsCi0JMHgwMCwgMHhhZSwgMHhiOCwgMHhiMCwgMHhjMywgMHgwMCwgMHg3YQotfTsKLQot c3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBsZDkwNDBfMjJfMTQwW10gPSB7Ci0JMHgwMCwgMHg3 YiwgMHhiYiwgMHhiNCwgMHhjOCwgMHgwMCwgMHg1YiwKLQkweDAwLCAweGI1LCAweGJhLCAweGIx LCAweGM0LCAweDAwLCAweDZlLAotCTB4MDAsIDB4YWUsIDB4YjksIDB4YjAsIDB4YzUsIDB4MDAs IDB4NzUKLX07Ci0KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbGQ5MDQwXzIyXzEzMFtdID0g ewotCTB4MDAsIDB4NzEsIDB4YmIsIDB4YjUsIDB4YzgsIDB4MDAsIDB4NTcsCi0JMHgwMCwgMHhi NSwgMHhiYiwgMHhiMCwgMHhjNSwgMHgwMCwgMHg2YSwKLQkweDAwLCAweGFlLCAweGI5LCAweGIx LCAweGM2LCAweDAwLCAweDcwCi19OwotCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGxkOTA0 MF8yMl8xMjBbXSA9IHsKLQkweDAwLCAweDQ3LCAweGJhLCAweGI2LCAweGNhLCAweDAwLCAweDUz LAotCTB4MDAsIDB4YjUsIDB4YmIsIDB4YjMsIDB4YzYsIDB4MDAsIDB4NjUsCi0JMHgwMCwgMHhh ZSwgMHhiOCwgMHhiMywgMHhjNywgMHgwMCwgMHg2YwotfTsKLQotc3RhdGljIGNvbnN0IHVuc2ln bmVkIGludCBsZDkwNDBfMjJfMTEwW10gPSB7Ci0JMHgwMCwgMHgxMywgMHhiYiwgMHhiNywgMHhj YSwgMHgwMCwgMHg0ZiwKLQkweDAwLCAweGI0LCAweGJiLCAweGIzLCAweGM3LCAweDAwLCAweDYw LAotCTB4MDAsIDB4YWQsIDB4YjgsIDB4YjQsIDB4YzcsIDB4MDAsIDB4NjcKLX07Ci0KLXN0YXRp YyBjb25zdCB1bnNpZ25lZCBpbnQgbGQ5MDQwXzIyXzEwMFtdID0gewotCTB4MDAsIDB4MTMsIDB4 YmEsIDB4YjgsIDB4Y2IsIDB4MDAsIDB4NGIsCi0JMHgwMCwgMHhiMywgMHhiYywgMHhiNCwgMHhj NywgMHgwMCwgMHg1YywKLQkweDAwLCAweGFjLCAweGI4LCAweGI0LCAweGM4LCAweDAwLCAweDYy Ci19OwotCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGxkOTA0MF8yMl85MFtdID0gewotCTB4 MDAsIDB4MTMsIDB4YjksIDB4YjgsIDB4Y2QsIDB4MDAsIDB4NDYsCi0JMHgwMCwgMHhiMSwgMHhi YywgMHhiNSwgMHhjOCwgMHgwMCwgMHg1NiwKLQkweDAwLCAweGFhLCAweGI4LCAweGI0LCAweGM5 LCAweDAwLCAweDVkCi19OwotCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGxkOTA0MF8yMl84 MFtdID0gewotCTB4MDAsIDB4MTMsIDB4YmEsIDB4YjksIDB4Y2QsIDB4MDAsIDB4NDEsCi0JMHgw MCwgMHhiMCwgMHhiZSwgMHhiNSwgMHhjOSwgMHgwMCwgMHg1MSwKLQkweDAwLCAweGE5LCAweGI5 LCAweGI1LCAweGNhLCAweDAwLCAweDU3Ci19OwotCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50 IGxkOTA0MF8yMl83MFtdID0gewotCTB4MDAsIDB4MTMsIDB4YjksIDB4YjksIDB4ZDAsIDB4MDAs IDB4M2MsCi0JMHgwMCwgMHhhZiwgMHhiZiwgMHhiNiwgMHhjYiwgMHgwMCwgMHg0YiwKLQkweDAw LCAweGE4LCAweGI5LCAweGI1LCAweGNjLCAweDAwLCAweDUyCi19OwotCi1zdGF0aWMgY29uc3Qg dW5zaWduZWQgaW50IGxkOTA0MF8yMl81MFtdID0gewotCTB4MDAsIDB4MTMsIDB4YjIsIDB4YmEs IDB4ZDIsIDB4MDAsIDB4MzAsCi0JMHgwMCwgMHhhZiwgMHhjMCwgMHhiOCwgMHhjZCwgMHgwMCwg MHgzZCwKLQkweDAwLCAweGE4LCAweGI4LCAweGI3LCAweGNkLCAweDAwLCAweDQ0Ci19OwotCi1z dHJ1Y3QgbGQ5MDQwX2dhbW1hIHsKLQl1bnNpZ25lZCBpbnQgKmdhbW1hXzIyX3RhYmxlW01BWF9H QU1NQV9MRVZFTF07Ci19OwotCi1zdGF0aWMgc3RydWN0IGxkOTA0MF9nYW1tYSBnYW1tYV90YWJs ZSA9IHsKLQkuZ2FtbWFfMjJfdGFibGVbMF0gPSAodW5zaWduZWQgaW50ICopJmxkOTA0MF8yMl81 MCwKLQkuZ2FtbWFfMjJfdGFibGVbMV0gPSAodW5zaWduZWQgaW50ICopJmxkOTA0MF8yMl83MCwK LQkuZ2FtbWFfMjJfdGFibGVbMl0gPSAodW5zaWduZWQgaW50ICopJmxkOTA0MF8yMl84MCwKLQku Z2FtbWFfMjJfdGFibGVbM10gPSAodW5zaWduZWQgaW50ICopJmxkOTA0MF8yMl85MCwKLQkuZ2Ft bWFfMjJfdGFibGVbNF0gPSAodW5zaWduZWQgaW50ICopJmxkOTA0MF8yMl8xMDAsCi0JLmdhbW1h XzIyX3RhYmxlWzVdID0gKHVuc2lnbmVkIGludCAqKSZsZDkwNDBfMjJfMTEwLAotCS5nYW1tYV8y Ml90YWJsZVs2XSA9ICh1bnNpZ25lZCBpbnQgKikmbGQ5MDQwXzIyXzEyMCwKLQkuZ2FtbWFfMjJf dGFibGVbN10gPSAodW5zaWduZWQgaW50ICopJmxkOTA0MF8yMl8xMzAsCi0JLmdhbW1hXzIyX3Rh YmxlWzhdID0gKHVuc2lnbmVkIGludCAqKSZsZDkwNDBfMjJfMTQwLAotCS5nYW1tYV8yMl90YWJs ZVs5XSA9ICh1bnNpZ25lZCBpbnQgKikmbGQ5MDQwXzIyXzE1MCwKLQkuZ2FtbWFfMjJfdGFibGVb MTBdID0gKHVuc2lnbmVkIGludCAqKSZsZDkwNDBfMjJfMTYwLAotCS5nYW1tYV8yMl90YWJsZVsx MV0gPSAodW5zaWduZWQgaW50ICopJmxkOTA0MF8yMl8xNzAsCi0JLmdhbW1hXzIyX3RhYmxlWzEy XSA9ICh1bnNpZ25lZCBpbnQgKikmbGQ5MDQwXzIyXzE4MCwKLQkuZ2FtbWFfMjJfdGFibGVbMTNd ID0gKHVuc2lnbmVkIGludCAqKSZsZDkwNDBfMjJfMTkwLAotCS5nYW1tYV8yMl90YWJsZVsxNF0g PSAodW5zaWduZWQgaW50ICopJmxkOTA0MF8yMl8yMDAsCi0JLmdhbW1hXzIyX3RhYmxlWzE1XSA9 ICh1bnNpZ25lZCBpbnQgKikmbGQ5MDQwXzIyXzIxMCwKLQkuZ2FtbWFfMjJfdGFibGVbMTZdID0g KHVuc2lnbmVkIGludCAqKSZsZDkwNDBfMjJfMjIwLAotCS5nYW1tYV8yMl90YWJsZVsxN10gPSAo dW5zaWduZWQgaW50ICopJmxkOTA0MF8yMl8yMzAsCi0JLmdhbW1hXzIyX3RhYmxlWzE4XSA9ICh1 bnNpZ25lZCBpbnQgKikmbGQ5MDQwXzIyXzI0MCwKLQkuZ2FtbWFfMjJfdGFibGVbMTldID0gKHVu c2lnbmVkIGludCAqKSZsZDkwNDBfMjJfMjUwLAotCS5nYW1tYV8yMl90YWJsZVsyMF0gPSAodW5z aWduZWQgaW50ICopJmxkOTA0MF8yMl8yNjAsCi0JLmdhbW1hXzIyX3RhYmxlWzIxXSA9ICh1bnNp Z25lZCBpbnQgKikmbGQ5MDQwXzIyXzI3MCwKLQkuZ2FtbWFfMjJfdGFibGVbMjJdID0gKHVuc2ln bmVkIGludCAqKSZsZDkwNDBfMjJfMjgwLAotCS5nYW1tYV8yMl90YWJsZVsyM10gPSAodW5zaWdu ZWQgaW50ICopJmxkOTA0MF8yMl8yOTAsCi0JLmdhbW1hXzIyX3RhYmxlWzI0XSA9ICh1bnNpZ25l ZCBpbnQgKikmbGQ5MDQwXzIyXzMwMCwKLX07Ci0KLSNlbmRpZgotLSAKMi4xNC4xCgpfX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpkcmktZGV2ZWwgbWFpbGlu ZyBsaXN0CmRyaS1kZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVl ZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9kcmktZGV2ZWwK From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-3.1 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,MAILING_LIST_MULTI,SPF_PASS,T_DKIMWL_WL_HIGH,URIBL_BLOCKED, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id C4224C433F5 for ; Sun, 2 Sep 2018 15:33:34 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 4BDDD20835 for ; Sun, 2 Sep 2018 15:33:34 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=kernel.org header.i=@kernel.org header.b="QwWeJCOO" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 4BDDD20835 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=kernel.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726944AbeIBTto (ORCPT ); Sun, 2 Sep 2018 15:49:44 -0400 Received: from mail.kernel.org ([198.145.29.99]:39908 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726056AbeIBTto (ORCPT ); Sun, 2 Sep 2018 15:49:44 -0400 Received: from localhost.localdomain (xdsl-188-155-58-14.adslplus.ch [188.155.58.14]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 1B92220835; Sun, 2 Sep 2018 15:33:27 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1535902410; bh=pIMn4pwcXFiaTHfWR3yKMw2tB22BdO7fkyuZGoB3sU0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=QwWeJCOOJJ6LSqpzHxjybBlvjqs9hj+q0rAul0TDPTQ19Av4ztuOjCZ5pYpkgobzy jUNDE8dSfnyuiklgCMP5LRkRkQDilnwdST746VIYswjpDwoj9HtYi+ZwRRF7VkiBie CW21MBjhX8EZz1xnbOtXd+qKNl0xWBFLOATkAnJk= From: Krzysztof Kozlowski To: Donghwa Lee , Lee Jones , Daniel Thompson , Jingoo Han , Bartlomiej Zolnierkiewicz , Krzysztof Kozlowski , Jonathan Corbet , linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-fbdev@vger.kernel.org Cc: Marek Szyprowski , Inki Dae Subject: [PATCH v2 2/2] backlight: Remove ld9040 driver Date: Sun, 2 Sep 2018 17:33:03 +0200 Message-Id: <20180902153303.6590-2-krzk@kernel.org> X-Mailer: git-send-email 2.14.1 In-Reply-To: <20180902152232.5802-1-krzk@kernel.org> References: <20180902152232.5802-1-krzk@kernel.org> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk 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 Acked-by: Jingoo Han Acked-by: Daniel Thompson --- Changes since v1: 1. Add Jingoo's and Daniel's acks. --- 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 2373c3cec0c3..71ee978c848f 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 c7a46392a76f..63c507c07437 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