]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
auxdisplay: charlcd: Partially revert "Move hwidth and bwidth to struct hd44780_common"
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Mon, 24 Feb 2025 17:27:38 +0000 (19:27 +0200)
committerAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Mon, 10 Mar 2025 16:02:31 +0000 (18:02 +0200)
Commit 2545c1c948a6 ("auxdisplay: Move hwidth and bwidth to struct
hd44780_common") makes charlcd_alloc() argument-less effectively dropping
the single allocation for the struct charlcd_priv object along with
the driver specific one. Restore that behaviour here.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Reviewed-by: Geert Uytterhoeven <geert@linux-m68k.org>
drivers/auxdisplay/charlcd.c
drivers/auxdisplay/charlcd.h
drivers/auxdisplay/hd44780.c
drivers/auxdisplay/lcd2s.c
drivers/auxdisplay/panel.c

index 19b619376d48b9223666af9a09715b480adf97d3..09020bb8ad15fa7d52ad81d91e41a6e015c2085c 100644 (file)
@@ -595,18 +595,19 @@ static int charlcd_init(struct charlcd *lcd)
        return 0;
 }
 
-struct charlcd *charlcd_alloc(void)
+struct charlcd *charlcd_alloc(unsigned int drvdata_size)
 {
        struct charlcd_priv *priv;
        struct charlcd *lcd;
 
-       priv = kzalloc(sizeof(*priv), GFP_KERNEL);
+       priv = kzalloc(sizeof(*priv) + drvdata_size, GFP_KERNEL);
        if (!priv)
                return NULL;
 
        priv->esc_seq.len = -1;
 
        lcd = &priv->lcd;
+       lcd->drvdata = priv->drvdata;
 
        return lcd;
 }
index 4d4287209d04c4c8f8e983de25c8c91a313b6370..d10b89740bcae7bde2d22ae420d1289723dfafab 100644 (file)
@@ -51,7 +51,7 @@ struct charlcd {
                unsigned long y;
        } addr;
 
-       void *drvdata;
+       void *drvdata;                  /* Set by charlcd_alloc() */
 };
 
 /**
@@ -95,7 +95,8 @@ struct charlcd_ops {
 };
 
 void charlcd_backlight(struct charlcd *lcd, enum charlcd_onoff on);
-struct charlcd *charlcd_alloc(void);
+
+struct charlcd *charlcd_alloc(unsigned int drvdata_size);
 void charlcd_free(struct charlcd *lcd);
 
 int charlcd_register(struct charlcd *lcd);
index 9d0ae9c02e9ba2c5560c9423a2314b246c460f6b..1d67fe3243412424c5b7b7994dbd7f303c374bc6 100644 (file)
@@ -226,7 +226,7 @@ static int hd44780_probe(struct platform_device *pdev)
        if (!hdc)
                return -ENOMEM;
 
-       lcd = charlcd_alloc();
+       lcd = charlcd_alloc(0);
        if (!lcd)
                goto fail1;
 
index a28daa4ffbf75204648a59f65f888717bf889924..c71ebb925971b67415089416502ddedba5ce01fa 100644 (file)
@@ -307,7 +307,7 @@ static int lcd2s_i2c_probe(struct i2c_client *i2c)
        if (err < 0)
                return err;
 
-       lcd = charlcd_alloc();
+       lcd = charlcd_alloc(0);
        if (!lcd)
                return -ENOMEM;
 
index 6dc8798d01f98c96ee487e0b1bf19e2003c03a6d..4da142692d55f8ab5dbd04e11a1e13e32803003d 100644 (file)
@@ -835,7 +835,7 @@ static void lcd_init(void)
        if (!hdc)
                return;
 
-       charlcd = charlcd_alloc();
+       charlcd = charlcd_alloc(0);
        if (!charlcd) {
                kfree(hdc);
                return;