Commit ba14301e authored by Tomi Valkeinen's avatar Tomi Valkeinen Committed by Bartlomiej Zolnierkiewicz

fbdev/ssd1307fb: add support to enable VBAT

SSD1306 needs VBAT when it is wired in charge pump configuration. This
patch adds support to the driver to enable VBAT regulator at init time.

Cc: Rob Herring <robh+dt@kernel.org>
Cc: Maxime Ripard <maxime.ripard@free-electrons.com>
Cc: Benoît Cousson <bcousson@baylibre.com>
Signed-off-by: default avatarTomi Valkeinen <tomi.valkeinen@ti.com>
Reviewed-by: default avatarRoger Quadros <rogerq@ti.com>
Signed-off-by: default avatarJyri Sarha <jsarha@ti.com>
Signed-off-by: default avatarBartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
parent fdde1a81
...@@ -16,6 +16,7 @@ Required properties: ...@@ -16,6 +16,7 @@ Required properties:
Optional properties: Optional properties:
- reset-gpios: The GPIO used to reset the OLED display, if available. See - reset-gpios: The GPIO used to reset the OLED display, if available. See
Documentation/devicetree/bindings/gpio/gpio.txt for details. Documentation/devicetree/bindings/gpio/gpio.txt for details.
- vbat-supply: The supply for VBAT
- solomon,segment-no-remap: Display needs normal (non-inverted) data column - solomon,segment-no-remap: Display needs normal (non-inverted) data column
to segment mapping to segment mapping
- solomon,com-seq: Display uses sequential COM pin configuration - solomon,com-seq: Display uses sequential COM pin configuration
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
#include <linux/of_gpio.h> #include <linux/of_gpio.h>
#include <linux/pwm.h> #include <linux/pwm.h>
#include <linux/uaccess.h> #include <linux/uaccess.h>
#include <linux/regulator/consumer.h>
#define SSD1307FB_DATA 0x40 #define SSD1307FB_DATA 0x40
#define SSD1307FB_COMMAND 0x80 #define SSD1307FB_COMMAND 0x80
...@@ -74,6 +75,7 @@ struct ssd1307fb_par { ...@@ -74,6 +75,7 @@ struct ssd1307fb_par {
struct pwm_device *pwm; struct pwm_device *pwm;
u32 pwm_period; u32 pwm_period;
struct gpio_desc *reset; struct gpio_desc *reset;
struct regulator *vbat_reg;
u32 seg_remap; u32 seg_remap;
u32 vcomh; u32 vcomh;
u32 width; u32 width;
...@@ -574,6 +576,14 @@ static int ssd1307fb_probe(struct i2c_client *client, ...@@ -574,6 +576,14 @@ static int ssd1307fb_probe(struct i2c_client *client,
goto fb_alloc_error; goto fb_alloc_error;
} }
par->vbat_reg = devm_regulator_get_optional(&client->dev, "vbat");
if (IS_ERR(par->vbat_reg)) {
dev_err(&client->dev, "failed to get VBAT regulator: %ld\n",
PTR_ERR(par->vbat_reg));
ret = PTR_ERR(par->vbat_reg);
goto fb_alloc_error;
}
if (of_property_read_u32(node, "solomon,width", &par->width)) if (of_property_read_u32(node, "solomon,width", &par->width))
par->width = 96; par->width = 96;
...@@ -658,9 +668,15 @@ static int ssd1307fb_probe(struct i2c_client *client, ...@@ -658,9 +668,15 @@ static int ssd1307fb_probe(struct i2c_client *client,
udelay(4); udelay(4);
} }
ret = regulator_enable(par->vbat_reg);
if (ret) {
dev_err(&client->dev, "failed to enable VBAT: %d\n", ret);
goto reset_oled_error;
}
ret = ssd1307fb_init(par); ret = ssd1307fb_init(par);
if (ret) if (ret)
goto reset_oled_error; goto regulator_enable_error;
ret = register_framebuffer(info); ret = register_framebuffer(info);
if (ret) { if (ret) {
...@@ -693,6 +709,8 @@ static int ssd1307fb_probe(struct i2c_client *client, ...@@ -693,6 +709,8 @@ static int ssd1307fb_probe(struct i2c_client *client,
pwm_disable(par->pwm); pwm_disable(par->pwm);
pwm_put(par->pwm); pwm_put(par->pwm);
}; };
regulator_enable_error:
regulator_disable(par->vbat_reg);
reset_oled_error: reset_oled_error:
fb_deferred_io_cleanup(info); fb_deferred_io_cleanup(info);
fb_alloc_error: fb_alloc_error:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment