From fdde1a8148d81617582c138cd1fbdc4594d4c941 Mon Sep 17 00:00:00 2001 From: Jyri Sarha Date: Wed, 8 Feb 2017 16:43:59 +0100 Subject: [PATCH] fbdev: ssd1307fb: Make reset gpio devicetree property optional MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Make reset gpio devicetree property optional. Depending on the board designing there may not be a dedicated gpio for resetting the display. Without a proper reset there may be some junk in the display memory at probe time, so in such a case the display memory is cleared before turning it on. The devicetree binding document is also updated. Cc: Rob Herring Cc: Tomi Valkeinen Cc: Maxime Ripard Cc: Benoît Cousson Signed-off-by: Jyri Sarha Signed-off-by: Bartlomiej Zolnierkiewicz --- .../devicetree/bindings/display/ssd1307fb.txt | 4 ++-- drivers/video/fbdev/ssd1307fb.c | 19 +++++++++++++------ 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/Documentation/devicetree/bindings/display/ssd1307fb.txt b/Documentation/devicetree/bindings/display/ssd1307fb.txt index 4aee67fdf2cf..6617df68d8b8 100644 --- a/Documentation/devicetree/bindings/display/ssd1307fb.txt +++ b/Documentation/devicetree/bindings/display/ssd1307fb.txt @@ -8,14 +8,14 @@ Required properties: 0x3c or 0x3d - pwm: Should contain the pwm to use according to the OF device tree PWM specification [0]. Only required for the ssd1307. - - reset-gpios: Should contain the GPIO used to reset the OLED display. See - Documentation/devicetree/bindings/gpio/gpio.txt for details. - solomon,height: Height in pixel of the screen driven by the controller - solomon,width: Width in pixel of the screen driven by the controller - solomon,page-offset: Offset of pages (band of 8 pixels) that the screen is mapped to. Optional properties: + - reset-gpios: The GPIO used to reset the OLED display, if available. See + Documentation/devicetree/bindings/gpio/gpio.txt for details. - solomon,segment-no-remap: Display needs normal (non-inverted) data column to segment mapping - solomon,com-seq: Display uses sequential COM pin configuration diff --git a/drivers/video/fbdev/ssd1307fb.c b/drivers/video/fbdev/ssd1307fb.c index 8ffaaeeb2f84..89372af7bc5b 100644 --- a/drivers/video/fbdev/ssd1307fb.c +++ b/drivers/video/fbdev/ssd1307fb.c @@ -439,6 +439,10 @@ static int ssd1307fb_init(struct ssd1307fb_par *par) if (ret < 0) return ret; + /* Clear the screen if we could not give reset at probe time */ + if (!par->reset) + ssd1307fb_update_display(par); + /* Turn on the display */ ret = ssd1307fb_write_cmd(par->client, SSD1307FB_DISPLAY_ON); if (ret < 0) @@ -561,7 +565,8 @@ static int ssd1307fb_probe(struct i2c_client *client, par->device_info = of_device_get_match_data(&client->dev); - par->reset = devm_gpiod_get(&client->dev, "reset", GPIOD_OUT_LOW); + par->reset = devm_gpiod_get_optional(&client->dev, "reset", + GPIOD_OUT_LOW); if (IS_ERR(par->reset)) { dev_err(&client->dev, "failed to get reset gpio: %ld\n", PTR_ERR(par->reset)); @@ -645,11 +650,13 @@ static int ssd1307fb_probe(struct i2c_client *client, i2c_set_clientdata(client, info); - /* Reset the screen */ - gpiod_set_value(par->reset, 0); - udelay(4); - gpiod_set_value(par->reset, 1); - udelay(4); + if (par->reset) { + /* Reset the screen */ + gpiod_set_value(par->reset, 0); + udelay(4); + gpiod_set_value(par->reset, 1); + udelay(4); + } ret = ssd1307fb_init(par); if (ret) -- 2.20.1