Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e0046bb3 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

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()
parents 1fa8109f cc5d04d8
Loading
Loading
Loading
Loading
+33 −5
Original line number Diff line number Diff line
@@ -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
+1 −1
Original line number Diff line number Diff line
@@ -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
+35 −20
Original line number Diff line number Diff line
@@ -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-");
+3 −1
Original line number Diff line number Diff line
@@ -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;
}

+2 −2
Original line number Diff line number Diff line
@@ -1620,7 +1620,7 @@ static void panel_attach(struct parport *port)
	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;
	}

Loading