Both reset GPIO and regulator are optional as per the binding and the
driver can work without if we ignore their absence. Do so.

Signed-off-by: Ahmad Fatoum <[email protected]>
---
 drivers/video/ssd1307fb.c | 43 +++++++++++++++++++++------------------
 1 file changed, 23 insertions(+), 20 deletions(-)

diff --git a/drivers/video/ssd1307fb.c b/drivers/video/ssd1307fb.c
index cc50698670e0..835814bf5306 100644
--- a/drivers/video/ssd1307fb.c
+++ b/drivers/video/ssd1307fb.c
@@ -415,12 +415,8 @@ static int ssd1307fb_probe(struct device_d *dev)
 
        par->reset = of_get_named_gpio(node,
                                         "reset-gpios", 0);
-       if (!gpio_is_valid(par->reset)) {
-               ret = par->reset;
-               if (ret != -EPROBE_DEFER)
-                       dev_err(&client->dev,
-                               "Couldn't get named gpio 'reset-gpios': %s.\n",
-                               strerror(-ret));
+       if (!gpio_is_valid(par->reset) && par->reset == -EPROBE_DEFER) {
+               ret = -EPROBE_DEFER;
                goto fb_alloc_error;
        }
 
@@ -503,14 +499,16 @@ static int ssd1307fb_probe(struct device_d *dev)
 
        info->screen_base = (u8 __force __iomem *)vmem;
 
-       ret = gpio_request_one(par->reset,
-                              GPIOF_OUT_INIT_HIGH,
-                              "oled-reset");
-       if (ret) {
-               dev_err(&client->dev,
-                       "failed to request gpio %d: %d\n",
-                       par->reset, ret);
-               goto reset_oled_error;
+       if (par->reset >= 0) {
+               ret = gpio_request_one(par->reset,
+                                      GPIOF_OUT_INIT_HIGH,
+                                      "oled-reset");
+               if (ret) {
+                       dev_err(&client->dev,
+                               "failed to request gpio %d: %d\n",
+                               par->reset, ret);
+                       goto reset_oled_error;
+               }
        }
 
        ret = regulator_disable(par->vbat);
@@ -519,18 +517,23 @@ static int ssd1307fb_probe(struct device_d *dev)
 
        i2c_set_clientdata(client, info);
 
-       /* Reset the screen */
-       gpio_set_value(par->reset, 0);
-       udelay(4);
+       if (par->reset > 0) {
+               /* Reset the screen */
+               gpio_set_value(par->reset, 0);
+               udelay(4);
+       }
 
        ret = regulator_enable(par->vbat);
        if (ret < 0)
                goto reset_oled_error;
 
-       mdelay(100);
+       if (par->vbat)
+               mdelay(100);
 
-       gpio_set_value(par->reset, 1);
-       udelay(4);
+       if (par->reset > 0) {
+               gpio_set_value(par->reset, 1);
+               udelay(4);
+       }
 
        ret = ssd1307fb_init(par);
        if (ret)
-- 
2.25.0


_______________________________________________
barebox mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/barebox

Reply via email to