forked from Minki/linux
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 -----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEEPjU5OPd5QIZ9jqqOGXyLc2htIW0FAlyWPZIACgkQGXyLc2ht IW1Jkg/8DJPkAjGqmhSMXesHj/M4+0sIRq3MDLFoZTLBzWfalCCUeu/f8qun0Eb3 kGHRHuCfu1tJF6EP/k4UcPLvsmrh9iKRc/GYcgyHyuOxxkOhmyxd890FwdpZb5ev Mawv0otK8Helv4W8hxQhO+BN1R2qPVhM7ddQ3dX2190N46Q3SzAvie3itdNzwF6C voT9XfHXjqenSA/xjEZbTfF18zndlGE+inbouyw6vT/O4dIu++ljUVNLOahvUXPt tEiZ3buwfIuF0tFnVllmSJToGlEJ47fdCZ0IP+eK0ay5DzhdDayimd/OdZPHCHL/ DY2Cvp5ugB6BwZLLSVpIGKNL/GAnA4686+zy3uRykCs1eDZsM2gSYe3Xat2aQCpy 101GUfgym+3VFtv+wkYk83Lxr2cCPOc5a700xzx9GSDtXAF+MY+Ahi8UoKnOa9lg 48MKgXMlCN69/Hd/LWQmc8qVAx3AQQxlWroKV8hK9N1ZRklY4J5ZhNkQjfUhO2FF 6U8+s6pq3s2Im3AKvsCoAxWZa+sBPJhH+yYWszxfqap+k8p4Ligku3iQgoM0OaMI mxgv5cSZWeuO/tG7WTiJAuc0KgZen2w04iBYOYL6jyhMdzLjfs24CrJU9y0bLKFd GY7jkxDuv6TsS5GqHalDepXyk1Y41C1jaddz1AcUvBqyVTRPjj0= =MO2/ -----END PGP SIGNATURE----- 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()
This commit is contained in:
commit
e0046bb302
@ -164,9 +164,7 @@ config ARM_CHARLCD
|
||||
line and the Linux version on the second line, but that's
|
||||
still useful.
|
||||
|
||||
endif # AUXDISPLAY
|
||||
|
||||
menuconfig PANEL
|
||||
menuconfig PARPORT_PANEL
|
||||
tristate "Parallel port LCD/Keypad Panel support"
|
||||
depends on PARPORT
|
||||
select CHARLCD
|
||||
@ -178,7 +176,7 @@ menuconfig PANEL
|
||||
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 PANEL
|
||||
if PARPORT_PANEL
|
||||
|
||||
config PANEL_PARPORT
|
||||
int "Default parallel port number (0=LPT1)"
|
||||
@ -419,8 +417,11 @@ config PANEL_LCD_PIN_BL
|
||||
|
||||
Default for the 'BL' pin in custom profile is '0' (uncontrolled).
|
||||
|
||||
endif # PARPORT_PANEL
|
||||
|
||||
config PANEL_CHANGE_MESSAGE
|
||||
bool "Change LCD initialization message ?"
|
||||
depends on CHARLCD
|
||||
default "n"
|
||||
---help---
|
||||
This allows you to replace the boot message indicating the kernel version
|
||||
@ -444,7 +445,34 @@ config PANEL_BOOT_MESSAGE
|
||||
An empty message will only clear the display at driver init time. Any other
|
||||
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
|
||||
tristate "Character LCD core support" if COMPILE_TEST
|
||||
|
@ -10,4 +10,4 @@ obj-$(CONFIG_CFAG12864B) += cfag12864b.o cfag12864bfb.o
|
||||
obj-$(CONFIG_IMG_ASCII_LCD) += img-ascii-lcd.o
|
||||
obj-$(CONFIG_HD44780) += hd44780.o
|
||||
obj-$(CONFIG_HT16K33) += ht16k33.o
|
||||
obj-$(CONFIG_PANEL) += panel.o
|
||||
obj-$(CONFIG_PARPORT_PANEL) += panel.o
|
||||
|
@ -91,7 +91,7 @@ struct charlcd_priv {
|
||||
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 */
|
||||
static atomic_t charlcd_available = ATOMIC_INIT(1);
|
||||
@ -105,7 +105,7 @@ static void long_sleep(int ms)
|
||||
/* turn the backlight on or off */
|
||||
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)
|
||||
return;
|
||||
@ -134,7 +134,7 @@ static void charlcd_bl_off(struct work_struct *work)
|
||||
/* turn the backlight on for a little while */
|
||||
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)
|
||||
return;
|
||||
@ -152,7 +152,7 @@ EXPORT_SYMBOL_GPL(charlcd_poke);
|
||||
|
||||
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;
|
||||
|
||||
/*
|
||||
@ -170,7 +170,7 @@ static void charlcd_gotoxy(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.y = 0;
|
||||
@ -179,7 +179,7 @@ static void charlcd_home(struct charlcd *lcd)
|
||||
|
||||
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 (lcd->char_conv)
|
||||
@ -211,7 +211,7 @@ static void charlcd_clear_fast(struct charlcd *lcd)
|
||||
/* clears the display and resets X/Y */
|
||||
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);
|
||||
priv->addr.x = 0;
|
||||
@ -223,7 +223,7 @@ static void charlcd_clear_display(struct charlcd *lcd)
|
||||
static int charlcd_init_display(struct charlcd *lcd)
|
||||
{
|
||||
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;
|
||||
|
||||
if (lcd->ifwidth != 4 && lcd->ifwidth != 8)
|
||||
@ -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)
|
||||
{
|
||||
struct charlcd_priv *priv = to_priv(lcd);
|
||||
struct charlcd_priv *priv = charlcd_to_priv(lcd);
|
||||
|
||||
/* LCD special codes */
|
||||
|
||||
@ -580,7 +580,7 @@ static inline int handle_lcd_special_code(struct charlcd *lcd)
|
||||
|
||||
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 */
|
||||
if ((c != '\n') && priv->esc_seq.len >= 0) {
|
||||
@ -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)
|
||||
{
|
||||
struct charlcd_priv *priv = to_priv(the_charlcd);
|
||||
struct charlcd_priv *priv = charlcd_to_priv(the_charlcd);
|
||||
int ret;
|
||||
|
||||
ret = -EBUSY;
|
||||
@ -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 */
|
||||
static int charlcd_init(struct charlcd *lcd)
|
||||
{
|
||||
struct charlcd_priv *priv = to_priv(lcd);
|
||||
struct charlcd_priv *priv = charlcd_to_priv(lcd);
|
||||
int ret;
|
||||
|
||||
if (lcd->ops->backlight) {
|
||||
@ -784,13 +798,8 @@ static int charlcd_init(struct charlcd *lcd)
|
||||
return ret;
|
||||
|
||||
/* display a short message */
|
||||
#ifdef CONFIG_PANEL_CHANGE_MESSAGE
|
||||
#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
|
||||
charlcd_puts(lcd, "\x1b[Lc\x1b[Lb" LCD_INIT_BL LCD_INIT_TEXT);
|
||||
|
||||
/* clear the display on the next device opening */
|
||||
priv->must_clear = true;
|
||||
charlcd_home(lcd);
|
||||
@ -818,6 +827,12 @@ struct charlcd *charlcd_alloc(unsigned int drvdata_size)
|
||||
}
|
||||
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,
|
||||
void *unused)
|
||||
{
|
||||
@ -866,7 +881,7 @@ EXPORT_SYMBOL_GPL(charlcd_register);
|
||||
|
||||
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);
|
||||
charlcd_puts(lcd, "\x0cLCD driver unloaded.\x1b[Lc\x1b[Lb\x1b[L-");
|
||||
|
@ -271,7 +271,7 @@ static int hd44780_probe(struct platform_device *pdev)
|
||||
return 0;
|
||||
|
||||
fail:
|
||||
kfree(lcd);
|
||||
charlcd_free(lcd);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -280,6 +280,8 @@ static int hd44780_remove(struct platform_device *pdev)
|
||||
struct charlcd *lcd = platform_get_drvdata(pdev);
|
||||
|
||||
charlcd_unregister(lcd);
|
||||
|
||||
charlcd_free(lcd);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1620,7 +1620,7 @@ err_lcd_unreg:
|
||||
if (lcd.enabled)
|
||||
charlcd_unregister(lcd.charlcd);
|
||||
err_unreg_device:
|
||||
kfree(lcd.charlcd);
|
||||
charlcd_free(lcd.charlcd);
|
||||
lcd.charlcd = NULL;
|
||||
parport_unregister_device(pprt);
|
||||
pprt = NULL;
|
||||
@ -1647,7 +1647,7 @@ static void panel_detach(struct parport *port)
|
||||
if (lcd.enabled) {
|
||||
charlcd_unregister(lcd.charlcd);
|
||||
lcd.initialized = false;
|
||||
kfree(lcd.charlcd);
|
||||
charlcd_free(lcd.charlcd);
|
||||
lcd.charlcd = NULL;
|
||||
}
|
||||
|
||||
|
@ -35,6 +35,7 @@ struct charlcd_ops {
|
||||
};
|
||||
|
||||
struct charlcd *charlcd_alloc(unsigned int drvdata_size);
|
||||
void charlcd_free(struct charlcd *lcd);
|
||||
|
||||
int charlcd_register(struct charlcd *lcd);
|
||||
int charlcd_unregister(struct charlcd *lcd);
|
||||
|
Loading…
Reference in New Issue
Block a user