提交 e0046bb3 编写于 作者: L Linus Torvalds

Merge tag 'auxdisplay-for-linus-v5.1-rc2' of git://github.com/ojeda/linux

Pull auxdisplay updates from Miguel Ojeda:
 "A few fixes and improvements for auxdisplay:

   - Series to fix a memory leak in hd44780 while introducing
     charlcd_free(). From Andy Shevchenko

   - Series to clean up the Kconfig menus and a couple of improvements
     for charlcd. From Mans Rullgard"

* tag 'auxdisplay-for-linus-v5.1-rc2' of git://github.com/ojeda/linux:
  auxdisplay: charlcd: make backlight initial state configurable
  auxdisplay: charlcd: simplify init message display
  auxdisplay: deconfuse configuration
  auxdisplay: hd44780: Convert to use charlcd_free()
  auxdisplay: panel: Convert to use charlcd_free()
  auxdisplay: charlcd: Introduce charlcd_free() helper
  auxdisplay: charlcd: Move to_priv() to charlcd namespace
  auxdisplay: hd44780: Fix memory leak on ->remove()
...@@ -164,9 +164,7 @@ config ARM_CHARLCD ...@@ -164,9 +164,7 @@ config ARM_CHARLCD
line and the Linux version on the second line, but that's line and the Linux version on the second line, but that's
still useful. still useful.
endif # AUXDISPLAY menuconfig PARPORT_PANEL
menuconfig PANEL
tristate "Parallel port LCD/Keypad Panel support" tristate "Parallel port LCD/Keypad Panel support"
depends on PARPORT depends on PARPORT
select CHARLCD select CHARLCD
...@@ -178,7 +176,7 @@ menuconfig PANEL ...@@ -178,7 +176,7 @@ menuconfig PANEL
compiled as a module, or linked into the kernel and started at boot. compiled as a module, or linked into the kernel and started at boot.
If you don't understand what all this is about, say N. If you don't understand what all this is about, say N.
if PANEL if PARPORT_PANEL
config PANEL_PARPORT config PANEL_PARPORT
int "Default parallel port number (0=LPT1)" int "Default parallel port number (0=LPT1)"
...@@ -419,8 +417,11 @@ config PANEL_LCD_PIN_BL ...@@ -419,8 +417,11 @@ config PANEL_LCD_PIN_BL
Default for the 'BL' pin in custom profile is '0' (uncontrolled). Default for the 'BL' pin in custom profile is '0' (uncontrolled).
endif # PARPORT_PANEL
config PANEL_CHANGE_MESSAGE config PANEL_CHANGE_MESSAGE
bool "Change LCD initialization message ?" bool "Change LCD initialization message ?"
depends on CHARLCD
default "n" default "n"
---help--- ---help---
This allows you to replace the boot message indicating the kernel version This allows you to replace the boot message indicating the kernel version
...@@ -444,7 +445,34 @@ config PANEL_BOOT_MESSAGE ...@@ -444,7 +445,34 @@ config PANEL_BOOT_MESSAGE
An empty message will only clear the display at driver init time. Any other An empty message will only clear the display at driver init time. Any other
printf()-formatted message is valid with newline and escape codes. printf()-formatted message is valid with newline and escape codes.
endif # PANEL choice
prompt "Backlight initial state"
default CHARLCD_BL_FLASH
config CHARLCD_BL_OFF
bool "Off"
help
Backlight is initially turned off
config CHARLCD_BL_ON
bool "On"
help
Backlight is initially turned on
config CHARLCD_BL_FLASH
bool "Flash"
help
Backlight is flashed briefly on init
endchoice
endif # AUXDISPLAY
config PANEL
tristate "Parallel port LCD/Keypad Panel support (OLD OPTION)"
depends on PARPORT
select AUXDISPLAY
select PARPORT_PANEL
config CHARLCD config CHARLCD
tristate "Character LCD core support" if COMPILE_TEST tristate "Character LCD core support" if COMPILE_TEST
...@@ -10,4 +10,4 @@ obj-$(CONFIG_CFAG12864B) += cfag12864b.o cfag12864bfb.o ...@@ -10,4 +10,4 @@ obj-$(CONFIG_CFAG12864B) += cfag12864b.o cfag12864bfb.o
obj-$(CONFIG_IMG_ASCII_LCD) += img-ascii-lcd.o obj-$(CONFIG_IMG_ASCII_LCD) += img-ascii-lcd.o
obj-$(CONFIG_HD44780) += hd44780.o obj-$(CONFIG_HD44780) += hd44780.o
obj-$(CONFIG_HT16K33) += ht16k33.o obj-$(CONFIG_HT16K33) += ht16k33.o
obj-$(CONFIG_PANEL) += panel.o obj-$(CONFIG_PARPORT_PANEL) += panel.o
...@@ -91,7 +91,7 @@ struct charlcd_priv { ...@@ -91,7 +91,7 @@ struct charlcd_priv {
unsigned long long drvdata[0]; unsigned long long drvdata[0];
}; };
#define to_priv(p) container_of(p, struct charlcd_priv, lcd) #define charlcd_to_priv(p) container_of(p, struct charlcd_priv, lcd)
/* Device single-open policy control */ /* Device single-open policy control */
static atomic_t charlcd_available = ATOMIC_INIT(1); static atomic_t charlcd_available = ATOMIC_INIT(1);
...@@ -105,7 +105,7 @@ static void long_sleep(int ms) ...@@ -105,7 +105,7 @@ static void long_sleep(int ms)
/* turn the backlight on or off */ /* turn the backlight on or off */
static void charlcd_backlight(struct charlcd *lcd, int on) static void charlcd_backlight(struct charlcd *lcd, int on)
{ {
struct charlcd_priv *priv = to_priv(lcd); struct charlcd_priv *priv = charlcd_to_priv(lcd);
if (!lcd->ops->backlight) if (!lcd->ops->backlight)
return; return;
...@@ -134,7 +134,7 @@ static void charlcd_bl_off(struct work_struct *work) ...@@ -134,7 +134,7 @@ static void charlcd_bl_off(struct work_struct *work)
/* turn the backlight on for a little while */ /* turn the backlight on for a little while */
void charlcd_poke(struct charlcd *lcd) void charlcd_poke(struct charlcd *lcd)
{ {
struct charlcd_priv *priv = to_priv(lcd); struct charlcd_priv *priv = charlcd_to_priv(lcd);
if (!lcd->ops->backlight) if (!lcd->ops->backlight)
return; return;
...@@ -152,7 +152,7 @@ EXPORT_SYMBOL_GPL(charlcd_poke); ...@@ -152,7 +152,7 @@ EXPORT_SYMBOL_GPL(charlcd_poke);
static void charlcd_gotoxy(struct charlcd *lcd) static void charlcd_gotoxy(struct charlcd *lcd)
{ {
struct charlcd_priv *priv = to_priv(lcd); struct charlcd_priv *priv = charlcd_to_priv(lcd);
unsigned int addr; unsigned int addr;
/* /*
...@@ -170,7 +170,7 @@ static void charlcd_gotoxy(struct charlcd *lcd) ...@@ -170,7 +170,7 @@ static void charlcd_gotoxy(struct charlcd *lcd)
static void charlcd_home(struct charlcd *lcd) static void charlcd_home(struct charlcd *lcd)
{ {
struct charlcd_priv *priv = to_priv(lcd); struct charlcd_priv *priv = charlcd_to_priv(lcd);
priv->addr.x = 0; priv->addr.x = 0;
priv->addr.y = 0; priv->addr.y = 0;
...@@ -179,7 +179,7 @@ static void charlcd_home(struct charlcd *lcd) ...@@ -179,7 +179,7 @@ static void charlcd_home(struct charlcd *lcd)
static void charlcd_print(struct charlcd *lcd, char c) static void charlcd_print(struct charlcd *lcd, char c)
{ {
struct charlcd_priv *priv = to_priv(lcd); struct charlcd_priv *priv = charlcd_to_priv(lcd);
if (priv->addr.x < lcd->bwidth) { if (priv->addr.x < lcd->bwidth) {
if (lcd->char_conv) if (lcd->char_conv)
...@@ -211,7 +211,7 @@ static void charlcd_clear_fast(struct charlcd *lcd) ...@@ -211,7 +211,7 @@ static void charlcd_clear_fast(struct charlcd *lcd)
/* clears the display and resets X/Y */ /* clears the display and resets X/Y */
static void charlcd_clear_display(struct charlcd *lcd) static void charlcd_clear_display(struct charlcd *lcd)
{ {
struct charlcd_priv *priv = to_priv(lcd); struct charlcd_priv *priv = charlcd_to_priv(lcd);
lcd->ops->write_cmd(lcd, LCD_CMD_DISPLAY_CLEAR); lcd->ops->write_cmd(lcd, LCD_CMD_DISPLAY_CLEAR);
priv->addr.x = 0; priv->addr.x = 0;
...@@ -223,7 +223,7 @@ static void charlcd_clear_display(struct charlcd *lcd) ...@@ -223,7 +223,7 @@ static void charlcd_clear_display(struct charlcd *lcd)
static int charlcd_init_display(struct charlcd *lcd) static int charlcd_init_display(struct charlcd *lcd)
{ {
void (*write_cmd_raw)(struct charlcd *lcd, int cmd); void (*write_cmd_raw)(struct charlcd *lcd, int cmd);
struct charlcd_priv *priv = to_priv(lcd); struct charlcd_priv *priv = charlcd_to_priv(lcd);
u8 init; u8 init;
if (lcd->ifwidth != 4 && lcd->ifwidth != 8) if (lcd->ifwidth != 4 && lcd->ifwidth != 8)
...@@ -369,7 +369,7 @@ static bool parse_xy(const char *s, unsigned long *x, unsigned long *y) ...@@ -369,7 +369,7 @@ static bool parse_xy(const char *s, unsigned long *x, unsigned long *y)
static inline int handle_lcd_special_code(struct charlcd *lcd) static inline int handle_lcd_special_code(struct charlcd *lcd)
{ {
struct charlcd_priv *priv = to_priv(lcd); struct charlcd_priv *priv = charlcd_to_priv(lcd);
/* LCD special codes */ /* LCD special codes */
...@@ -580,7 +580,7 @@ static inline int handle_lcd_special_code(struct charlcd *lcd) ...@@ -580,7 +580,7 @@ static inline int handle_lcd_special_code(struct charlcd *lcd)
static void charlcd_write_char(struct charlcd *lcd, char c) static void charlcd_write_char(struct charlcd *lcd, char c)
{ {
struct charlcd_priv *priv = to_priv(lcd); struct charlcd_priv *priv = charlcd_to_priv(lcd);
/* first, we'll test if we're in escape mode */ /* first, we'll test if we're in escape mode */
if ((c != '\n') && priv->esc_seq.len >= 0) { if ((c != '\n') && priv->esc_seq.len >= 0) {
...@@ -705,7 +705,7 @@ static ssize_t charlcd_write(struct file *file, const char __user *buf, ...@@ -705,7 +705,7 @@ static ssize_t charlcd_write(struct file *file, const char __user *buf,
static int charlcd_open(struct inode *inode, struct file *file) static int charlcd_open(struct inode *inode, struct file *file)
{ {
struct charlcd_priv *priv = to_priv(the_charlcd); struct charlcd_priv *priv = charlcd_to_priv(the_charlcd);
int ret; int ret;
ret = -EBUSY; ret = -EBUSY;
...@@ -763,10 +763,24 @@ static void charlcd_puts(struct charlcd *lcd, const char *s) ...@@ -763,10 +763,24 @@ static void charlcd_puts(struct charlcd *lcd, const char *s)
} }
} }
#ifdef CONFIG_PANEL_BOOT_MESSAGE
#define LCD_INIT_TEXT CONFIG_PANEL_BOOT_MESSAGE
#else
#define LCD_INIT_TEXT "Linux-" UTS_RELEASE "\n"
#endif
#ifdef CONFIG_CHARLCD_BL_ON
#define LCD_INIT_BL "\x1b[L+"
#elif defined(CONFIG_CHARLCD_BL_FLASH)
#define LCD_INIT_BL "\x1b[L*"
#else
#define LCD_INIT_BL "\x1b[L-"
#endif
/* initialize the LCD driver */ /* initialize the LCD driver */
static int charlcd_init(struct charlcd *lcd) static int charlcd_init(struct charlcd *lcd)
{ {
struct charlcd_priv *priv = to_priv(lcd); struct charlcd_priv *priv = charlcd_to_priv(lcd);
int ret; int ret;
if (lcd->ops->backlight) { if (lcd->ops->backlight) {
...@@ -784,13 +798,8 @@ static int charlcd_init(struct charlcd *lcd) ...@@ -784,13 +798,8 @@ static int charlcd_init(struct charlcd *lcd)
return ret; return ret;
/* display a short message */ /* display a short message */
#ifdef CONFIG_PANEL_CHANGE_MESSAGE charlcd_puts(lcd, "\x1b[Lc\x1b[Lb" LCD_INIT_BL LCD_INIT_TEXT);
#ifdef CONFIG_PANEL_BOOT_MESSAGE
charlcd_puts(lcd, "\x1b[Lc\x1b[Lb\x1b[L*" CONFIG_PANEL_BOOT_MESSAGE);
#endif
#else
charlcd_puts(lcd, "\x1b[Lc\x1b[Lb\x1b[L*Linux-" UTS_RELEASE "\n");
#endif
/* clear the display on the next device opening */ /* clear the display on the next device opening */
priv->must_clear = true; priv->must_clear = true;
charlcd_home(lcd); charlcd_home(lcd);
...@@ -818,6 +827,12 @@ struct charlcd *charlcd_alloc(unsigned int drvdata_size) ...@@ -818,6 +827,12 @@ struct charlcd *charlcd_alloc(unsigned int drvdata_size)
} }
EXPORT_SYMBOL_GPL(charlcd_alloc); EXPORT_SYMBOL_GPL(charlcd_alloc);
void charlcd_free(struct charlcd *lcd)
{
kfree(charlcd_to_priv(lcd));
}
EXPORT_SYMBOL_GPL(charlcd_free);
static int panel_notify_sys(struct notifier_block *this, unsigned long code, static int panel_notify_sys(struct notifier_block *this, unsigned long code,
void *unused) void *unused)
{ {
...@@ -866,7 +881,7 @@ EXPORT_SYMBOL_GPL(charlcd_register); ...@@ -866,7 +881,7 @@ EXPORT_SYMBOL_GPL(charlcd_register);
int charlcd_unregister(struct charlcd *lcd) int charlcd_unregister(struct charlcd *lcd)
{ {
struct charlcd_priv *priv = to_priv(lcd); struct charlcd_priv *priv = charlcd_to_priv(lcd);
unregister_reboot_notifier(&panel_notifier); unregister_reboot_notifier(&panel_notifier);
charlcd_puts(lcd, "\x0cLCD driver unloaded.\x1b[Lc\x1b[Lb\x1b[L-"); charlcd_puts(lcd, "\x0cLCD driver unloaded.\x1b[Lc\x1b[Lb\x1b[L-");
......
...@@ -271,7 +271,7 @@ static int hd44780_probe(struct platform_device *pdev) ...@@ -271,7 +271,7 @@ static int hd44780_probe(struct platform_device *pdev)
return 0; return 0;
fail: fail:
kfree(lcd); charlcd_free(lcd);
return ret; return ret;
} }
...@@ -280,6 +280,8 @@ static int hd44780_remove(struct platform_device *pdev) ...@@ -280,6 +280,8 @@ static int hd44780_remove(struct platform_device *pdev)
struct charlcd *lcd = platform_get_drvdata(pdev); struct charlcd *lcd = platform_get_drvdata(pdev);
charlcd_unregister(lcd); charlcd_unregister(lcd);
charlcd_free(lcd);
return 0; return 0;
} }
......
...@@ -1620,7 +1620,7 @@ static void panel_attach(struct parport *port) ...@@ -1620,7 +1620,7 @@ static void panel_attach(struct parport *port)
if (lcd.enabled) if (lcd.enabled)
charlcd_unregister(lcd.charlcd); charlcd_unregister(lcd.charlcd);
err_unreg_device: err_unreg_device:
kfree(lcd.charlcd); charlcd_free(lcd.charlcd);
lcd.charlcd = NULL; lcd.charlcd = NULL;
parport_unregister_device(pprt); parport_unregister_device(pprt);
pprt = NULL; pprt = NULL;
...@@ -1647,7 +1647,7 @@ static void panel_detach(struct parport *port) ...@@ -1647,7 +1647,7 @@ static void panel_detach(struct parport *port)
if (lcd.enabled) { if (lcd.enabled) {
charlcd_unregister(lcd.charlcd); charlcd_unregister(lcd.charlcd);
lcd.initialized = false; lcd.initialized = false;
kfree(lcd.charlcd); charlcd_free(lcd.charlcd);
lcd.charlcd = NULL; lcd.charlcd = NULL;
} }
......
...@@ -35,6 +35,7 @@ struct charlcd_ops { ...@@ -35,6 +35,7 @@ struct charlcd_ops {
}; };
struct charlcd *charlcd_alloc(unsigned int drvdata_size); struct charlcd *charlcd_alloc(unsigned int drvdata_size);
void charlcd_free(struct charlcd *lcd);
int charlcd_register(struct charlcd *lcd); int charlcd_register(struct charlcd *lcd);
int charlcd_unregister(struct charlcd *lcd); int charlcd_unregister(struct charlcd *lcd);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册