[PATCH] fbdev: ssd1307fb: fix logical error

2015-05-25 Thread Thomas Niederprüm
The logical not needs to be done after the bit masking.

Fixes: a3998fe03e87 ("fbdev: ssd1307fb: Unify init code and obtain
hw specific bits from DT")

Signed-off-by: Thomas Niederprüm 
Reported-by: Dan Carpenter 
---
 drivers/video/fbdev/ssd1307fb.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/video/fbdev/ssd1307fb.c b/drivers/video/fbdev/ssd1307fb.c
index 8fc224c..9771d56 100644
--- a/drivers/video/fbdev/ssd1307fb.c
+++ b/drivers/video/fbdev/ssd1307fb.c
@@ -368,7 +368,7 @@ static int ssd1307fb_init(struct ssd1307fb_par *par)
if (ret < 0)
return ret;
 
-   compins = 0x02 | (!par->com_seq & 0x1) << 4
+   compins = 0x02 | !(par->com_seq & 0x1) << 4
   | (par->com_lrremap & 0x1) << 5;
ret = ssd1307fb_write_cmd(par->client, compins);
if (ret < 0)
-- 
2.3.0

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH] fbdev: ssd1307fb: fix logical error

2015-05-25 Thread Thomas Niederprüm
The logical not needs to be done after the bit masking.

Fixes: a3998fe03e87 (fbdev: ssd1307fb: Unify init code and obtain
hw specific bits from DT)

Signed-off-by: Thomas Niederprüm nied...@physik.uni-kl.de
Reported-by: Dan Carpenter dan.carpen...@oracle.com
---
 drivers/video/fbdev/ssd1307fb.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/video/fbdev/ssd1307fb.c b/drivers/video/fbdev/ssd1307fb.c
index 8fc224c..9771d56 100644
--- a/drivers/video/fbdev/ssd1307fb.c
+++ b/drivers/video/fbdev/ssd1307fb.c
@@ -368,7 +368,7 @@ static int ssd1307fb_init(struct ssd1307fb_par *par)
if (ret  0)
return ret;
 
-   compins = 0x02 | (!par-com_seq  0x1)  4
+   compins = 0x02 | !(par-com_seq  0x1)  4
   | (par-com_lrremap  0x1)  5;
ret = ssd1307fb_write_cmd(par-client, compins);
if (ret  0)
-- 
2.3.0

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCHv6 05/10] ARM: mxs: fix in tree users of ssd1306

2015-03-31 Thread Thomas Niederprüm
This patch updates the in tree-users of the SSD1306 controller for using
the newly introduced DT properties.

Signed-off-by: Thomas Niederprüm 
---
 arch/arm/boot/dts/imx28-cfa10036.dts | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/arch/arm/boot/dts/imx28-cfa10036.dts 
b/arch/arm/boot/dts/imx28-cfa10036.dts
index b04b6b8..570aa33 100644
--- a/arch/arm/boot/dts/imx28-cfa10036.dts
+++ b/arch/arm/boot/dts/imx28-cfa10036.dts
@@ -99,6 +99,9 @@
solomon,height = <32>;
solomon,width = <128>;
solomon,page-offset = <0>;
+   solomon,com-lrremap;
+   solomon,com-invdir;
+   solomon,com-offset = <32>;
};
};
 
-- 
2.3.0

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCHv6 00/10] Cleanup and add support for SSD1305

2015-03-31 Thread Thomas Niederprüm
Hi,

this patch series is the result of making the ssd1307fb driver work with
a Newhaven OLED display using the Solomon SSD1305 controller. To achieve
this the intialization code for the SSD1306 and the SSD1307 is merged
and based on DT configuration to reflect the various possible wirings
of the SSD130X controller (04/10). Based on these changes it is straight
forward to add support for the SSD1305 controller (06/10).

While working on the driver I realized that it was not possible to
correctly mmap the video memory from userspace since the address handed
to the userspace app is a logical one where it should be a physical one.
Patch 01/10 fixes this. Furthermore the memory reserved by kzalloc is
not page aligned while the address handed to userspace is aligned to the
next page frame. This problem is fixed by using __get_free_pages() in 02/10.

Furthermore a module parameter is added to set the delay for the
deferred io update (07/10). Also the backlight class is implemented to make
the contrast setting available in userspace (09/10).

changes since v1 (thanks to Maxime for the feedback):
- dedicated patch for fixing smem_start address
- remove page reserve upon vmalloc
- remove return value check upon display turn-off at module unload
- use a module parameter refreshrate rather than delaydivider
- allocate fbdefio dynamically
- use sysfs_create_groups to create sysfs entries
- remove contrast, vhcom and dclk properties from DT since they are
  not part of hw description. The contrast module parameter was added
  to set contrast at load time. vhcom and dclk stays at it's default
  values for now.
- add new DT properties to in tree users of ssd130X
- rebased to apply on top of linux-next

changes since v2 (thanks to Maxime again):
- free memory allocated by vmalloc on driver unload
- set default values in the init code to the ones of the existing ssd1307
  init code
- added two ACKs (Maxime Ripard)

changes since v3:
- use backlight class rather than dedicated sysfs files to set the 
  contrast (Thanks to Tomi Valkeinen)
- remove [PATCHv3 08/10] fbdev: ssd1307fb: Add module parameter bitsperpixel
- add new patch to blank the display (unreviewed)
- allocate video memory through __get_free_pages() rather than vmalloc
  (Thanks to Geert Uytterhoeven)
- minor rewordings of the commit messages

changes since v4 (thanks to Maxime):
- added two ACKs (Maxime Ripard)
- fixed typo: s/REFRASHRATE/REFRESHRATE
- updated the documentation to make clear the unit of com-offset
- move addition of the module parameter contrast to a separate patch (09/11)
- fix indentation errors
- get rid of device_id in the device_info struct

changes since v5:
- remove [PATCHv5 09/11] fbdev: ssd1307fb: Add module parameter to set
  the initial contrast
- remove unnecessary variable initialization in the deviceinfo struct as
  pointed out by Maxime
- make the variable dclk_div hold the actual divider rather than the
  corresponding bit value
- remove ret variable in ssd1307fb_blank() (thanks to Olliver Schinagl)
- fixed bit mask for com_invdir as indicated by Olliver
- change initialization of the charge pump as suggested by Olliver
- change the default value for prechargep2 to 0x2 (thanks to Olliver)
- change DT property name "com-sequential" to "com-seq"
- added one ACK (Maxime Ripard)
- added Tested-by Olliver Schinagl

Thomas Niederprüm (10):
  fbdev: ssd1307fb: fix memory address smem_start.
  fbdev: ssd1307fb: Allocate page aligned video memory.
  of: Add Solomon Systech vendor prefix.
  fbdev: ssd1307fb: Unify init code and obtain hw specific bits from DT
  ARM: mxs: fix in tree users of ssd1306
  fbdev: ssd1307fb: Add support for SSD1305
  fbdev: ssd1307fb: Add a module parameter to set the refresh rate
  fbdev: ssd1307fb: Turn off display on driver unload.
  fbdev: ssd1307fb: add backlight controls for setting the contrast
  fbdev: ssd1307fb: Add blank mode

 .../devicetree/bindings/vendor-prefixes.txt|   1 +
 .../devicetree/bindings/video/ssd1307fb.txt|  23 +-
 arch/arm/boot/dts/imx28-cfa10036.dts   |   3 +
 drivers/video/fbdev/Kconfig|   1 +
 drivers/video/fbdev/ssd1307fb.c| 288 +++--
 5 files changed, 234 insertions(+), 82 deletions(-)

-- 
2.3.0

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCHv6 04/10] fbdev: ssd1307fb: Unify init code and obtain hw specific bits from DT

2015-03-31 Thread Thomas Niederprüm
The 130X controllers are very similar from the configuration point of view.
The configuration registers for the SSD1305/6/7 are bit identical (except the
the VHCOM register and the the default values for clock setup register). This
patch unifies the init code of the controller and adds hardware specific
properties to DT that are needed to correctly initialize the device.

The SSD130X can be wired to the OLED panel in various ways. Even for the
same controller this wiring can differ from one display module to another
and can not be probed by software. The added DT properties reflect these
hardware decisions of the display module manufacturer.
The 'com-sequential', 'com-lrremap' and 'com-invdir' values define different
possibilities for the COM signals pin configuration and readout direction
of the video memory. The 'segment-no-remap' allows the inversion of the
memory-to-pin mapping ultimately inverting the order of the controllers
output pins. The 'prechargepX' values need to be adapted according to the
capacitance of the OLEDs pixel cells.

So far these hardware specific bits are hard coded in the init code, making
the driver usable only for one certain wiring of the controller. This patch
makes the driver usable with all possible hardware setups, given a valid hw
description in DT. If these values are not set in DT the default values,
as they are set in the ssd1307 init code right now, are used. This implies
that without the corresponding DT property "segment-no-remap" the segment
remap of the ssd130X controller gets activated. Even though this is not the
default behaviour according to the datasheet it maintains backward
compatibility with older DTBs.

Note that the SSD1306 does not seem to be using the configuration written to
the registers at all. Therefore this patch does not try to maintain these
values without changes in DT. For reference an example is added to the DT
bindings documentation that reproduces the configuration that is set in the
current init code.

Signed-off-by: Thomas Niederprüm 
Tested-by: Olliver Schinagl 
---
 .../devicetree/bindings/video/ssd1307fb.txt|  21 +++
 drivers/video/fbdev/ssd1307fb.c| 177 -
 2 files changed, 125 insertions(+), 73 deletions(-)

diff --git a/Documentation/devicetree/bindings/video/ssd1307fb.txt 
b/Documentation/devicetree/bindings/video/ssd1307fb.txt
index 7a12542..635efa3 100644
--- a/Documentation/devicetree/bindings/video/ssd1307fb.txt
+++ b/Documentation/devicetree/bindings/video/ssd1307fb.txt
@@ -15,6 +15,16 @@ Required properties:
 
 Optional properties:
   - reset-active-low: Is the reset gpio is active on physical low?
+  - solomon,segment-no-remap: Display needs normal (non-inverted) data column
+  to segment mapping
+  - solomon,com-seq: Display uses sequential COM pin configuration
+  - solomon,com-lrremap: Display uses left-right COM pin remap
+  - solomon,com-invdir: Display uses inverted COM pin scan direction
+  - solomon,com-offset: Number of the COM pin wired to the first display line
+  - solomon,prechargep1: Length of deselect period (phase 1) in clock cycles.
+  - solomon,prechargep2: Length of precharge period (phase 2) in clock cycles.
+ This needs to be the higher, the higher the 
capacitance
+ of the OLED's pixels is
 
 [0]: Documentation/devicetree/bindings/pwm/pwm.txt
 
@@ -26,3 +36,14 @@ ssd1307: oled@3c {
 reset-gpios = < 7>;
 reset-active-low;
 };
+
+ssd1306: oled@3c {
+compatible = "solomon,ssd1306fb-i2c";
+reg = <0x3c>;
+pwms = < 4 3000>;
+reset-gpios = < 7>;
+reset-active-low;
+solomon,com-lrremap;
+solomon,com-invdir;
+solomon,com-offset = <32>;
+};
diff --git a/drivers/video/fbdev/ssd1307fb.c b/drivers/video/fbdev/ssd1307fb.c
index 8d34c56..8667c77 100644
--- a/drivers/video/fbdev/ssd1307fb.c
+++ b/drivers/video/fbdev/ssd1307fb.c
@@ -40,20 +40,34 @@
 
 struct ssd1307fb_par;
 
-struct ssd1307fb_ops {
-   int (*init)(struct ssd1307fb_par *);
-   int (*remove)(struct ssd1307fb_par *);
+struct ssd1307fb_deviceinfo {
+   u32 default_vcomh;
+   u32 default_dclk_div;
+   u32 default_dclk_frq;
+   int need_pwm;
+   int need_chargepump;
 };
 
 struct ssd1307fb_par {
+   u32 com_invdir;
+   u32 com_lrremap;
+   u32 com_offset;
+   u32 com_seq;
+   u32 contrast;
+   u32 dclk_div;
+   u32 dclk_frq;
+   struct ssd1307fb_deviceinfo *device_info;
struct i2c_client *client;
u32 height;
struct fb_info *info;
-   struct ssd1307fb_ops *ops;
u32 page_offset;
+   u32 prechargep1;
+   u32 prechargep2;
struct pwm_device *pwm;
u32 pwm_period;
int reset;
+   u32 seg_remap;
+   u32 vcomh;
u32 width;
 };
 
@@ -254,69 +268,46 @@ static struct fb_de

[PATCHv6 02/10] fbdev: ssd1307fb: Allocate page aligned video memory.

2015-03-31 Thread Thomas Niederprüm
Currently the videomemory is allocated by kmalloc, making it a memory
region that is not necessarily page aligend. This leads to problems
upon mmap call, where the video memory's address gets aligned to the
next page boundary. The result is that the userspace program that issued
the mmap call is not able to access the video memory from the start to
the next page boundary.

This patch changes the allocation of the video memory to use
__get_free_pages() in order to obtain memory that is aligned
to page boundaries.

Signed-off-by: Thomas Niederprüm 
Acked-by: Maxime Ripard 
---
 drivers/video/fbdev/ssd1307fb.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/video/fbdev/ssd1307fb.c b/drivers/video/fbdev/ssd1307fb.c
index 61e0ce8..8d34c56 100644
--- a/drivers/video/fbdev/ssd1307fb.c
+++ b/drivers/video/fbdev/ssd1307fb.c
@@ -489,7 +489,8 @@ static int ssd1307fb_probe(struct i2c_client *client,
 
vmem_size = par->width * par->height / 8;
 
-   vmem = devm_kzalloc(>dev, vmem_size, GFP_KERNEL);
+   vmem = (void *)__get_free_pages(GFP_KERNEL | __GFP_ZERO,
+   get_order(vmem_size));
if (!vmem) {
dev_err(>dev, "Couldn't allocate graphical memory.\n");
ret = -ENOMEM;
@@ -573,6 +574,7 @@ static int ssd1307fb_remove(struct i2c_client *client)
if (par->ops->remove)
par->ops->remove(par);
fb_deferred_io_cleanup(info);
+   __free_pages(__va(info->fix.smem_start), get_order(info->fix.smem_len));
framebuffer_release(info);
 
return 0;
-- 
2.3.0

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCHv6 08/10] fbdev: ssd1307fb: Turn off display on driver unload.

2015-03-31 Thread Thomas Niederprüm
This patch turns off the display when the driver is unloaded.

Signed-off-by: Thomas Niederprüm 
Acked-by: Maxime Ripard 
---
 drivers/video/fbdev/ssd1307fb.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/video/fbdev/ssd1307fb.c b/drivers/video/fbdev/ssd1307fb.c
index 85eeda0..5f3d5a8 100644
--- a/drivers/video/fbdev/ssd1307fb.c
+++ b/drivers/video/fbdev/ssd1307fb.c
@@ -620,6 +620,8 @@ static int ssd1307fb_remove(struct i2c_client *client)
struct fb_info *info = i2c_get_clientdata(client);
struct ssd1307fb_par *par = info->par;
 
+   ssd1307fb_write_cmd(par->client, SSD1307FB_DISPLAY_OFF);
+
unregister_framebuffer(info);
if (par->device_info->need_pwm) {
pwm_disable(par->pwm);
-- 
2.3.0

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCHv6 01/10] fbdev: ssd1307fb: fix memory address smem_start.

2015-03-31 Thread Thomas Niederprüm
the smem_start pointer of the framebuffer info struct needs to hold the
physical address rather than the logical address. Right now the logical
address returned by kmalloc is stored. This patch converts this address
to a physical address and thus fixes a driver crash on mmaping the
framebuffer memory due to an access to the wrong memory address.

Signed-off-by: Thomas Niederprüm 
Acked-by: Maxime Ripard 
---
 drivers/video/fbdev/ssd1307fb.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/video/fbdev/ssd1307fb.c b/drivers/video/fbdev/ssd1307fb.c
index f7ed6d9..61e0ce8 100644
--- a/drivers/video/fbdev/ssd1307fb.c
+++ b/drivers/video/fbdev/ssd1307fb.c
@@ -515,7 +515,7 @@ static int ssd1307fb_probe(struct i2c_client *client,
info->var.blue.offset = 0;
 
info->screen_base = (u8 __force __iomem *)vmem;
-   info->fix.smem_start = (unsigned long)vmem;
+   info->fix.smem_start = __pa(vmem);
info->fix.smem_len = vmem_size;
 
fb_deferred_io_init(info);
-- 
2.3.0

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCHv6 07/10] fbdev: ssd1307fb: Add a module parameter to set the refresh rate

2015-03-31 Thread Thomas Niederprüm
This patch adds the module parameter "refreshrate" to set delay for the
deferred io. The refresh rate is given in units of Hertz. The default
refresh rate is 1 Hz. The refresh rate set through the newly introduced
parameter applies to all instances of the driver and for now it is not
possible to change it individually.

Signed-off-by: Thomas Niederprüm 
Acked-by: Maxime Ripard 
---
 drivers/video/fbdev/ssd1307fb.c | 23 +--
 1 file changed, 17 insertions(+), 6 deletions(-)

diff --git a/drivers/video/fbdev/ssd1307fb.c b/drivers/video/fbdev/ssd1307fb.c
index f685d24..85eeda0 100644
--- a/drivers/video/fbdev/ssd1307fb.c
+++ b/drivers/video/fbdev/ssd1307fb.c
@@ -38,6 +38,11 @@
 #defineSSD1307FB_SET_COM_PINS_CONFIG   0xda
 #defineSSD1307FB_SET_VCOMH 0xdb
 
+#define REFRESHRATE 1
+
+static u_int refreshrate = REFRESHRATE;
+module_param(refreshrate, uint, 0);
+
 struct ssd1307fb_par;
 
 struct ssd1307fb_deviceinfo {
@@ -263,11 +268,6 @@ static void ssd1307fb_deferred_io(struct fb_info *info,
ssd1307fb_update_display(info->par);
 }
 
-static struct fb_deferred_io ssd1307fb_defio = {
-   .delay  = HZ,
-   .deferred_io= ssd1307fb_deferred_io,
-};
-
 static int ssd1307fb_init(struct ssd1307fb_par *par)
 {
int ret;
@@ -466,6 +466,7 @@ static int ssd1307fb_probe(struct i2c_client *client,
 {
struct fb_info *info;
struct device_node *node = client->dev.of_node;
+   struct fb_deferred_io *ssd1307fb_defio;
u32 vmem_size;
struct ssd1307fb_par *par;
u8 *vmem;
@@ -536,10 +537,20 @@ static int ssd1307fb_probe(struct i2c_client *client,
goto fb_alloc_error;
}
 
+   ssd1307fb_defio = devm_kzalloc(>dev, sizeof(struct 
fb_deferred_io), GFP_KERNEL);
+   if (!ssd1307fb_defio) {
+   dev_err(>dev, "Couldn't allocate deferred io.\n");
+   ret = -ENOMEM;
+   goto fb_alloc_error;
+   }
+
+   ssd1307fb_defio->delay = HZ / refreshrate;
+   ssd1307fb_defio->deferred_io = ssd1307fb_deferred_io;
+
info->fbops = _ops;
info->fix = ssd1307fb_fix;
info->fix.line_length = par->width / 8;
-   info->fbdefio = _defio;
+   info->fbdefio = ssd1307fb_defio;
 
info->var = ssd1307fb_var;
info->var.xres = par->width;
-- 
2.3.0

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCHv6 06/10] fbdev: ssd1307fb: Add support for SSD1305

2015-03-31 Thread Thomas Niederprüm
This patch adds support for the SSD1305 OLED controller.

Signed-off-by: Thomas Niederprüm 
---
 Documentation/devicetree/bindings/video/ssd1307fb.txt |  2 +-
 drivers/video/fbdev/ssd1307fb.c   | 11 +++
 2 files changed, 12 insertions(+), 1 deletion(-)

diff --git a/Documentation/devicetree/bindings/video/ssd1307fb.txt 
b/Documentation/devicetree/bindings/video/ssd1307fb.txt
index 635efa3..d1be78d 100644
--- a/Documentation/devicetree/bindings/video/ssd1307fb.txt
+++ b/Documentation/devicetree/bindings/video/ssd1307fb.txt
@@ -2,7 +2,7 @@
 
 Required properties:
   - compatible: Should be "solomon,fb-". The only supported bus for
-now is i2c, and the supported chips are ssd1306 and ssd1307.
+now is i2c, and the supported chips are ssd1305, ssd1306 and ssd1307.
   - reg: Should contain address of the controller on the I2C bus. Most likely
  0x3c or 0x3d
   - pwm: Should contain the pwm to use according to the OF device tree PWM
diff --git a/drivers/video/fbdev/ssd1307fb.c b/drivers/video/fbdev/ssd1307fb.c
index 8667c77..f685d24 100644
--- a/drivers/video/fbdev/ssd1307fb.c
+++ b/drivers/video/fbdev/ssd1307fb.c
@@ -424,6 +424,12 @@ static int ssd1307fb_init(struct ssd1307fb_par *par)
return 0;
 }
 
+static struct ssd1307fb_deviceinfo ssd1307fb_ssd1305_deviceinfo = {
+   .default_vcomh = 0x34,
+   .default_dclk_div = 1,
+   .default_dclk_frq = 7,
+};
+
 static struct ssd1307fb_deviceinfo ssd1307fb_ssd1306_deviceinfo = {
.default_vcomh = 0x20,
.default_dclk_div = 1,
@@ -440,6 +446,10 @@ static struct ssd1307fb_deviceinfo 
ssd1307fb_ssd1307_deviceinfo = {
 
 static const struct of_device_id ssd1307fb_of_match[] = {
{
+   .compatible = "solomon,ssd1305fb-i2c",
+   .data = (void *)_ssd1305_deviceinfo,
+   },
+   {
.compatible = "solomon,ssd1306fb-i2c",
.data = (void *)_ssd1306_deviceinfo,
},
@@ -612,6 +622,7 @@ static int ssd1307fb_remove(struct i2c_client *client)
 }
 
 static const struct i2c_device_id ssd1307fb_i2c_id[] = {
+   { "ssd1305fb", 0 },
{ "ssd1306fb", 0 },
{ "ssd1307fb", 0 },
{ }
-- 
2.3.0

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCHv6 03/10] of: Add Solomon Systech vendor prefix.

2015-03-31 Thread Thomas Niederprüm
This patch adds the solomon prefix for Solomon Systech Limited.

Signed-off-by: Thomas Niederprüm 
---
 Documentation/devicetree/bindings/vendor-prefixes.txt | 1 +
 1 file changed, 1 insertion(+)

diff --git a/Documentation/devicetree/bindings/vendor-prefixes.txt 
b/Documentation/devicetree/bindings/vendor-prefixes.txt
index d3f4809..933c8f5 100644
--- a/Documentation/devicetree/bindings/vendor-prefixes.txt
+++ b/Documentation/devicetree/bindings/vendor-prefixes.txt
@@ -169,6 +169,7 @@ sitronixSitronix Technology Corporation
 smsc   Standard Microsystems Corporation
 snps   Synopsys, Inc.
 solidrun   SolidRun
+solomonSolomon Systech Limited
 sony   Sony Corporation
 spansion   Spansion Inc.
 sprd   Spreadtrum Communications Inc.
-- 
2.3.0

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCHv6 09/10] fbdev: ssd1307fb: add backlight controls for setting the contrast

2015-03-31 Thread Thomas Niederprüm
The backlight class is used to create userspace handles for
setting the OLED contrast.

Signed-off-by: Thomas Niederprüm 
Acked-by: Maxime Ripard 
---
 drivers/video/fbdev/Kconfig |  1 +
 drivers/video/fbdev/ssd1307fb.c | 58 +
 2 files changed, 59 insertions(+)

diff --git a/drivers/video/fbdev/Kconfig b/drivers/video/fbdev/Kconfig
index b3dd417..da70bae 100644
--- a/drivers/video/fbdev/Kconfig
+++ b/drivers/video/fbdev/Kconfig
@@ -2478,6 +2478,7 @@ config FB_SSD1307
select FB_SYS_IMAGEBLIT
select FB_DEFERRED_IO
select PWM
+   select FB_BACKLIGHT
help
  This driver implements support for the Solomon SSD1307
  OLED controller over I2C.
diff --git a/drivers/video/fbdev/ssd1307fb.c b/drivers/video/fbdev/ssd1307fb.c
index 5f3d5a8..77efed7 100644
--- a/drivers/video/fbdev/ssd1307fb.c
+++ b/drivers/video/fbdev/ssd1307fb.c
@@ -7,6 +7,7 @@
  */
 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -38,6 +39,8 @@
 #defineSSD1307FB_SET_COM_PINS_CONFIG   0xda
 #defineSSD1307FB_SET_VCOMH 0xdb
 
+#define MAX_CONTRAST 255
+
 #define REFRESHRATE 1
 
 static u_int refreshrate = REFRESHRATE;
@@ -424,6 +427,43 @@ static int ssd1307fb_init(struct ssd1307fb_par *par)
return 0;
 }
 
+static int ssd1307fb_update_bl(struct backlight_device *bdev)
+{
+   struct ssd1307fb_par *par = bl_get_data(bdev);
+   int ret;
+   int brightness = bdev->props.brightness;
+
+   par->contrast = brightness;
+
+   ret = ssd1307fb_write_cmd(par->client, SSD1307FB_CONTRAST);
+   if (ret < 0)
+   return ret;
+   ret = ssd1307fb_write_cmd(par->client, par->contrast);
+   if (ret < 0)
+   return ret;
+   return 0;
+}
+
+static int ssd1307fb_get_brightness(struct backlight_device *bdev)
+{
+   struct ssd1307fb_par *par = bl_get_data(bdev);
+
+   return par->contrast;
+}
+
+static int ssd1307fb_check_fb(struct backlight_device *bdev,
+  struct fb_info *info)
+{
+   return (info->bl_dev == bdev);
+}
+
+static const struct backlight_ops ssd1307fb_bl_ops = {
+   .options= BL_CORE_SUSPENDRESUME,
+   .update_status  = ssd1307fb_update_bl,
+   .get_brightness = ssd1307fb_get_brightness,
+   .check_fb   = ssd1307fb_check_fb,
+};
+
 static struct ssd1307fb_deviceinfo ssd1307fb_ssd1305_deviceinfo = {
.default_vcomh = 0x34,
.default_dclk_div = 1,
@@ -464,6 +504,8 @@ MODULE_DEVICE_TABLE(of, ssd1307fb_of_match);
 static int ssd1307fb_probe(struct i2c_client *client,
   const struct i2c_device_id *id)
 {
+   struct backlight_device *bl;
+   char bl_name[12];
struct fb_info *info;
struct device_node *node = client->dev.of_node;
struct fb_deferred_io *ssd1307fb_defio;
@@ -599,10 +641,24 @@ static int ssd1307fb_probe(struct i2c_client *client,
goto panel_init_error;
}
 
+   snprintf(bl_name, sizeof(bl_name), "ssd1307fb%d", info->node);
+   bl = backlight_device_register(bl_name, >dev, par,
+  _bl_ops, NULL);
+   bl->props.brightness = par->contrast;
+   bl->props.max_brightness = MAX_CONTRAST;
+   info->bl_dev = bl;
+
+   if (IS_ERR(bl)) {
+   dev_err(>dev, "unable to register backlight device: 
%ld\n",
+   PTR_ERR(bl));
+   goto bl_init_error;
+   }
dev_info(>dev, "fb%d: %s framebuffer device registered, using 
%d bytes of video memory\n", info->node, info->fix.id, vmem_size);
 
return 0;
 
+bl_init_error:
+   unregister_framebuffer(info);
 panel_init_error:
if (par->device_info->need_pwm) {
pwm_disable(par->pwm);
@@ -622,6 +678,8 @@ static int ssd1307fb_remove(struct i2c_client *client)
 
ssd1307fb_write_cmd(par->client, SSD1307FB_DISPLAY_OFF);
 
+   backlight_device_unregister(info->bl_dev);
+
unregister_framebuffer(info);
if (par->device_info->need_pwm) {
pwm_disable(par->pwm);
-- 
2.3.0

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCHv6 10/10] fbdev: ssd1307fb: Add blank mode

2015-03-31 Thread Thomas Niederprüm
This patch adds ssd1307fb_blank() to make the framebuffer capable
of blanking.

Signed-off-by: Thomas Niederprüm 
---
 drivers/video/fbdev/ssd1307fb.c | 11 +++
 1 file changed, 11 insertions(+)

diff --git a/drivers/video/fbdev/ssd1307fb.c b/drivers/video/fbdev/ssd1307fb.c
index 77efed7..8fc224c 100644
--- a/drivers/video/fbdev/ssd1307fb.c
+++ b/drivers/video/fbdev/ssd1307fb.c
@@ -235,6 +235,16 @@ static ssize_t ssd1307fb_write(struct fb_info *info, const 
char __user *buf,
return count;
 }
 
+static int ssd1307fb_blank(int blank_mode, struct fb_info *info)
+{
+   struct ssd1307fb_par *par = info->par;
+
+   if (blank_mode != FB_BLANK_UNBLANK)
+   return ssd1307fb_write_cmd(par->client, SSD1307FB_DISPLAY_OFF);
+   else
+   return ssd1307fb_write_cmd(par->client, SSD1307FB_DISPLAY_ON);
+}
+
 static void ssd1307fb_fillrect(struct fb_info *info, const struct fb_fillrect 
*rect)
 {
struct ssd1307fb_par *par = info->par;
@@ -260,6 +270,7 @@ static struct fb_ops ssd1307fb_ops = {
.owner  = THIS_MODULE,
.fb_read= fb_sys_read,
.fb_write   = ssd1307fb_write,
+   .fb_blank   = ssd1307fb_blank,
.fb_fillrect= ssd1307fb_fillrect,
.fb_copyarea= ssd1307fb_copyarea,
.fb_imageblit   = ssd1307fb_imageblit,
-- 
2.3.0

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCHv6 01/10] fbdev: ssd1307fb: fix memory address smem_start.

2015-03-31 Thread Thomas Niederprüm
the smem_start pointer of the framebuffer info struct needs to hold the
physical address rather than the logical address. Right now the logical
address returned by kmalloc is stored. This patch converts this address
to a physical address and thus fixes a driver crash on mmaping the
framebuffer memory due to an access to the wrong memory address.

Signed-off-by: Thomas Niederprüm nied...@physik.uni-kl.de
Acked-by: Maxime Ripard maxime.rip...@free-electrons.com
---
 drivers/video/fbdev/ssd1307fb.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/video/fbdev/ssd1307fb.c b/drivers/video/fbdev/ssd1307fb.c
index f7ed6d9..61e0ce8 100644
--- a/drivers/video/fbdev/ssd1307fb.c
+++ b/drivers/video/fbdev/ssd1307fb.c
@@ -515,7 +515,7 @@ static int ssd1307fb_probe(struct i2c_client *client,
info-var.blue.offset = 0;
 
info-screen_base = (u8 __force __iomem *)vmem;
-   info-fix.smem_start = (unsigned long)vmem;
+   info-fix.smem_start = __pa(vmem);
info-fix.smem_len = vmem_size;
 
fb_deferred_io_init(info);
-- 
2.3.0

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCHv6 06/10] fbdev: ssd1307fb: Add support for SSD1305

2015-03-31 Thread Thomas Niederprüm
This patch adds support for the SSD1305 OLED controller.

Signed-off-by: Thomas Niederprüm nied...@physik.uni-kl.de
---
 Documentation/devicetree/bindings/video/ssd1307fb.txt |  2 +-
 drivers/video/fbdev/ssd1307fb.c   | 11 +++
 2 files changed, 12 insertions(+), 1 deletion(-)

diff --git a/Documentation/devicetree/bindings/video/ssd1307fb.txt 
b/Documentation/devicetree/bindings/video/ssd1307fb.txt
index 635efa3..d1be78d 100644
--- a/Documentation/devicetree/bindings/video/ssd1307fb.txt
+++ b/Documentation/devicetree/bindings/video/ssd1307fb.txt
@@ -2,7 +2,7 @@
 
 Required properties:
   - compatible: Should be solomon,chipfb-bus. The only supported bus for
-now is i2c, and the supported chips are ssd1306 and ssd1307.
+now is i2c, and the supported chips are ssd1305, ssd1306 and ssd1307.
   - reg: Should contain address of the controller on the I2C bus. Most likely
  0x3c or 0x3d
   - pwm: Should contain the pwm to use according to the OF device tree PWM
diff --git a/drivers/video/fbdev/ssd1307fb.c b/drivers/video/fbdev/ssd1307fb.c
index 8667c77..f685d24 100644
--- a/drivers/video/fbdev/ssd1307fb.c
+++ b/drivers/video/fbdev/ssd1307fb.c
@@ -424,6 +424,12 @@ static int ssd1307fb_init(struct ssd1307fb_par *par)
return 0;
 }
 
+static struct ssd1307fb_deviceinfo ssd1307fb_ssd1305_deviceinfo = {
+   .default_vcomh = 0x34,
+   .default_dclk_div = 1,
+   .default_dclk_frq = 7,
+};
+
 static struct ssd1307fb_deviceinfo ssd1307fb_ssd1306_deviceinfo = {
.default_vcomh = 0x20,
.default_dclk_div = 1,
@@ -440,6 +446,10 @@ static struct ssd1307fb_deviceinfo 
ssd1307fb_ssd1307_deviceinfo = {
 
 static const struct of_device_id ssd1307fb_of_match[] = {
{
+   .compatible = solomon,ssd1305fb-i2c,
+   .data = (void *)ssd1307fb_ssd1305_deviceinfo,
+   },
+   {
.compatible = solomon,ssd1306fb-i2c,
.data = (void *)ssd1307fb_ssd1306_deviceinfo,
},
@@ -612,6 +622,7 @@ static int ssd1307fb_remove(struct i2c_client *client)
 }
 
 static const struct i2c_device_id ssd1307fb_i2c_id[] = {
+   { ssd1305fb, 0 },
{ ssd1306fb, 0 },
{ ssd1307fb, 0 },
{ }
-- 
2.3.0

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCHv6 07/10] fbdev: ssd1307fb: Add a module parameter to set the refresh rate

2015-03-31 Thread Thomas Niederprüm
This patch adds the module parameter refreshrate to set delay for the
deferred io. The refresh rate is given in units of Hertz. The default
refresh rate is 1 Hz. The refresh rate set through the newly introduced
parameter applies to all instances of the driver and for now it is not
possible to change it individually.

Signed-off-by: Thomas Niederprüm nied...@physik.uni-kl.de
Acked-by: Maxime Ripard maxime.rip...@free-electrons.com
---
 drivers/video/fbdev/ssd1307fb.c | 23 +--
 1 file changed, 17 insertions(+), 6 deletions(-)

diff --git a/drivers/video/fbdev/ssd1307fb.c b/drivers/video/fbdev/ssd1307fb.c
index f685d24..85eeda0 100644
--- a/drivers/video/fbdev/ssd1307fb.c
+++ b/drivers/video/fbdev/ssd1307fb.c
@@ -38,6 +38,11 @@
 #defineSSD1307FB_SET_COM_PINS_CONFIG   0xda
 #defineSSD1307FB_SET_VCOMH 0xdb
 
+#define REFRESHRATE 1
+
+static u_int refreshrate = REFRESHRATE;
+module_param(refreshrate, uint, 0);
+
 struct ssd1307fb_par;
 
 struct ssd1307fb_deviceinfo {
@@ -263,11 +268,6 @@ static void ssd1307fb_deferred_io(struct fb_info *info,
ssd1307fb_update_display(info-par);
 }
 
-static struct fb_deferred_io ssd1307fb_defio = {
-   .delay  = HZ,
-   .deferred_io= ssd1307fb_deferred_io,
-};
-
 static int ssd1307fb_init(struct ssd1307fb_par *par)
 {
int ret;
@@ -466,6 +466,7 @@ static int ssd1307fb_probe(struct i2c_client *client,
 {
struct fb_info *info;
struct device_node *node = client-dev.of_node;
+   struct fb_deferred_io *ssd1307fb_defio;
u32 vmem_size;
struct ssd1307fb_par *par;
u8 *vmem;
@@ -536,10 +537,20 @@ static int ssd1307fb_probe(struct i2c_client *client,
goto fb_alloc_error;
}
 
+   ssd1307fb_defio = devm_kzalloc(client-dev, sizeof(struct 
fb_deferred_io), GFP_KERNEL);
+   if (!ssd1307fb_defio) {
+   dev_err(client-dev, Couldn't allocate deferred io.\n);
+   ret = -ENOMEM;
+   goto fb_alloc_error;
+   }
+
+   ssd1307fb_defio-delay = HZ / refreshrate;
+   ssd1307fb_defio-deferred_io = ssd1307fb_deferred_io;
+
info-fbops = ssd1307fb_ops;
info-fix = ssd1307fb_fix;
info-fix.line_length = par-width / 8;
-   info-fbdefio = ssd1307fb_defio;
+   info-fbdefio = ssd1307fb_defio;
 
info-var = ssd1307fb_var;
info-var.xres = par-width;
-- 
2.3.0

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCHv6 00/10] Cleanup and add support for SSD1305

2015-03-31 Thread Thomas Niederprüm
Hi,

this patch series is the result of making the ssd1307fb driver work with
a Newhaven OLED display using the Solomon SSD1305 controller. To achieve
this the intialization code for the SSD1306 and the SSD1307 is merged
and based on DT configuration to reflect the various possible wirings
of the SSD130X controller (04/10). Based on these changes it is straight
forward to add support for the SSD1305 controller (06/10).

While working on the driver I realized that it was not possible to
correctly mmap the video memory from userspace since the address handed
to the userspace app is a logical one where it should be a physical one.
Patch 01/10 fixes this. Furthermore the memory reserved by kzalloc is
not page aligned while the address handed to userspace is aligned to the
next page frame. This problem is fixed by using __get_free_pages() in 02/10.

Furthermore a module parameter is added to set the delay for the
deferred io update (07/10). Also the backlight class is implemented to make
the contrast setting available in userspace (09/10).

changes since v1 (thanks to Maxime for the feedback):
- dedicated patch for fixing smem_start address
- remove page reserve upon vmalloc
- remove return value check upon display turn-off at module unload
- use a module parameter refreshrate rather than delaydivider
- allocate fbdefio dynamically
- use sysfs_create_groups to create sysfs entries
- remove contrast, vhcom and dclk properties from DT since they are
  not part of hw description. The contrast module parameter was added
  to set contrast at load time. vhcom and dclk stays at it's default
  values for now.
- add new DT properties to in tree users of ssd130X
- rebased to apply on top of linux-next

changes since v2 (thanks to Maxime again):
- free memory allocated by vmalloc on driver unload
- set default values in the init code to the ones of the existing ssd1307
  init code
- added two ACKs (Maxime Ripard)

changes since v3:
- use backlight class rather than dedicated sysfs files to set the 
  contrast (Thanks to Tomi Valkeinen)
- remove [PATCHv3 08/10] fbdev: ssd1307fb: Add module parameter bitsperpixel
- add new patch to blank the display (unreviewed)
- allocate video memory through __get_free_pages() rather than vmalloc
  (Thanks to Geert Uytterhoeven)
- minor rewordings of the commit messages

changes since v4 (thanks to Maxime):
- added two ACKs (Maxime Ripard)
- fixed typo: s/REFRASHRATE/REFRESHRATE
- updated the documentation to make clear the unit of com-offset
- move addition of the module parameter contrast to a separate patch (09/11)
- fix indentation errors
- get rid of device_id in the device_info struct

changes since v5:
- remove [PATCHv5 09/11] fbdev: ssd1307fb: Add module parameter to set
  the initial contrast
- remove unnecessary variable initialization in the deviceinfo struct as
  pointed out by Maxime
- make the variable dclk_div hold the actual divider rather than the
  corresponding bit value
- remove ret variable in ssd1307fb_blank() (thanks to Olliver Schinagl)
- fixed bit mask for com_invdir as indicated by Olliver
- change initialization of the charge pump as suggested by Olliver
- change the default value for prechargep2 to 0x2 (thanks to Olliver)
- change DT property name com-sequential to com-seq
- added one ACK (Maxime Ripard)
- added Tested-by Olliver Schinagl

Thomas Niederprüm (10):
  fbdev: ssd1307fb: fix memory address smem_start.
  fbdev: ssd1307fb: Allocate page aligned video memory.
  of: Add Solomon Systech vendor prefix.
  fbdev: ssd1307fb: Unify init code and obtain hw specific bits from DT
  ARM: mxs: fix in tree users of ssd1306
  fbdev: ssd1307fb: Add support for SSD1305
  fbdev: ssd1307fb: Add a module parameter to set the refresh rate
  fbdev: ssd1307fb: Turn off display on driver unload.
  fbdev: ssd1307fb: add backlight controls for setting the contrast
  fbdev: ssd1307fb: Add blank mode

 .../devicetree/bindings/vendor-prefixes.txt|   1 +
 .../devicetree/bindings/video/ssd1307fb.txt|  23 +-
 arch/arm/boot/dts/imx28-cfa10036.dts   |   3 +
 drivers/video/fbdev/Kconfig|   1 +
 drivers/video/fbdev/ssd1307fb.c| 288 +++--
 5 files changed, 234 insertions(+), 82 deletions(-)

-- 
2.3.0

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCHv6 04/10] fbdev: ssd1307fb: Unify init code and obtain hw specific bits from DT

2015-03-31 Thread Thomas Niederprüm
The 130X controllers are very similar from the configuration point of view.
The configuration registers for the SSD1305/6/7 are bit identical (except the
the VHCOM register and the the default values for clock setup register). This
patch unifies the init code of the controller and adds hardware specific
properties to DT that are needed to correctly initialize the device.

The SSD130X can be wired to the OLED panel in various ways. Even for the
same controller this wiring can differ from one display module to another
and can not be probed by software. The added DT properties reflect these
hardware decisions of the display module manufacturer.
The 'com-sequential', 'com-lrremap' and 'com-invdir' values define different
possibilities for the COM signals pin configuration and readout direction
of the video memory. The 'segment-no-remap' allows the inversion of the
memory-to-pin mapping ultimately inverting the order of the controllers
output pins. The 'prechargepX' values need to be adapted according to the
capacitance of the OLEDs pixel cells.

So far these hardware specific bits are hard coded in the init code, making
the driver usable only for one certain wiring of the controller. This patch
makes the driver usable with all possible hardware setups, given a valid hw
description in DT. If these values are not set in DT the default values,
as they are set in the ssd1307 init code right now, are used. This implies
that without the corresponding DT property segment-no-remap the segment
remap of the ssd130X controller gets activated. Even though this is not the
default behaviour according to the datasheet it maintains backward
compatibility with older DTBs.

Note that the SSD1306 does not seem to be using the configuration written to
the registers at all. Therefore this patch does not try to maintain these
values without changes in DT. For reference an example is added to the DT
bindings documentation that reproduces the configuration that is set in the
current init code.

Signed-off-by: Thomas Niederprüm nied...@physik.uni-kl.de
Tested-by: Olliver Schinagl o.schin...@ultimaker.com
---
 .../devicetree/bindings/video/ssd1307fb.txt|  21 +++
 drivers/video/fbdev/ssd1307fb.c| 177 -
 2 files changed, 125 insertions(+), 73 deletions(-)

diff --git a/Documentation/devicetree/bindings/video/ssd1307fb.txt 
b/Documentation/devicetree/bindings/video/ssd1307fb.txt
index 7a12542..635efa3 100644
--- a/Documentation/devicetree/bindings/video/ssd1307fb.txt
+++ b/Documentation/devicetree/bindings/video/ssd1307fb.txt
@@ -15,6 +15,16 @@ Required properties:
 
 Optional properties:
   - reset-active-low: Is the reset gpio is active on physical low?
+  - solomon,segment-no-remap: Display needs normal (non-inverted) data column
+  to segment mapping
+  - solomon,com-seq: Display uses sequential COM pin configuration
+  - solomon,com-lrremap: Display uses left-right COM pin remap
+  - solomon,com-invdir: Display uses inverted COM pin scan direction
+  - solomon,com-offset: Number of the COM pin wired to the first display line
+  - solomon,prechargep1: Length of deselect period (phase 1) in clock cycles.
+  - solomon,prechargep2: Length of precharge period (phase 2) in clock cycles.
+ This needs to be the higher, the higher the 
capacitance
+ of the OLED's pixels is
 
 [0]: Documentation/devicetree/bindings/pwm/pwm.txt
 
@@ -26,3 +36,14 @@ ssd1307: oled@3c {
 reset-gpios = gpio2 7;
 reset-active-low;
 };
+
+ssd1306: oled@3c {
+compatible = solomon,ssd1306fb-i2c;
+reg = 0x3c;
+pwms = pwm 4 3000;
+reset-gpios = gpio2 7;
+reset-active-low;
+solomon,com-lrremap;
+solomon,com-invdir;
+solomon,com-offset = 32;
+};
diff --git a/drivers/video/fbdev/ssd1307fb.c b/drivers/video/fbdev/ssd1307fb.c
index 8d34c56..8667c77 100644
--- a/drivers/video/fbdev/ssd1307fb.c
+++ b/drivers/video/fbdev/ssd1307fb.c
@@ -40,20 +40,34 @@
 
 struct ssd1307fb_par;
 
-struct ssd1307fb_ops {
-   int (*init)(struct ssd1307fb_par *);
-   int (*remove)(struct ssd1307fb_par *);
+struct ssd1307fb_deviceinfo {
+   u32 default_vcomh;
+   u32 default_dclk_div;
+   u32 default_dclk_frq;
+   int need_pwm;
+   int need_chargepump;
 };
 
 struct ssd1307fb_par {
+   u32 com_invdir;
+   u32 com_lrremap;
+   u32 com_offset;
+   u32 com_seq;
+   u32 contrast;
+   u32 dclk_div;
+   u32 dclk_frq;
+   struct ssd1307fb_deviceinfo *device_info;
struct i2c_client *client;
u32 height;
struct fb_info *info;
-   struct ssd1307fb_ops *ops;
u32 page_offset;
+   u32 prechargep1;
+   u32 prechargep2;
struct pwm_device *pwm;
u32 pwm_period;
int reset;
+   u32 seg_remap;
+   u32 vcomh;
u32 width;
 };
 
@@ -254,69 +268,46 @@ static struct fb_deferred_io

[PATCHv6 05/10] ARM: mxs: fix in tree users of ssd1306

2015-03-31 Thread Thomas Niederprüm
This patch updates the in tree-users of the SSD1306 controller for using
the newly introduced DT properties.

Signed-off-by: Thomas Niederprüm nied...@physik.uni-kl.de
---
 arch/arm/boot/dts/imx28-cfa10036.dts | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/arch/arm/boot/dts/imx28-cfa10036.dts 
b/arch/arm/boot/dts/imx28-cfa10036.dts
index b04b6b8..570aa33 100644
--- a/arch/arm/boot/dts/imx28-cfa10036.dts
+++ b/arch/arm/boot/dts/imx28-cfa10036.dts
@@ -99,6 +99,9 @@
solomon,height = 32;
solomon,width = 128;
solomon,page-offset = 0;
+   solomon,com-lrremap;
+   solomon,com-invdir;
+   solomon,com-offset = 32;
};
};
 
-- 
2.3.0

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCHv6 02/10] fbdev: ssd1307fb: Allocate page aligned video memory.

2015-03-31 Thread Thomas Niederprüm
Currently the videomemory is allocated by kmalloc, making it a memory
region that is not necessarily page aligend. This leads to problems
upon mmap call, where the video memory's address gets aligned to the
next page boundary. The result is that the userspace program that issued
the mmap call is not able to access the video memory from the start to
the next page boundary.

This patch changes the allocation of the video memory to use
__get_free_pages() in order to obtain memory that is aligned
to page boundaries.

Signed-off-by: Thomas Niederprüm nied...@physik.uni-kl.de
Acked-by: Maxime Ripard maxime.rip...@free-electrons.com
---
 drivers/video/fbdev/ssd1307fb.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/video/fbdev/ssd1307fb.c b/drivers/video/fbdev/ssd1307fb.c
index 61e0ce8..8d34c56 100644
--- a/drivers/video/fbdev/ssd1307fb.c
+++ b/drivers/video/fbdev/ssd1307fb.c
@@ -489,7 +489,8 @@ static int ssd1307fb_probe(struct i2c_client *client,
 
vmem_size = par-width * par-height / 8;
 
-   vmem = devm_kzalloc(client-dev, vmem_size, GFP_KERNEL);
+   vmem = (void *)__get_free_pages(GFP_KERNEL | __GFP_ZERO,
+   get_order(vmem_size));
if (!vmem) {
dev_err(client-dev, Couldn't allocate graphical memory.\n);
ret = -ENOMEM;
@@ -573,6 +574,7 @@ static int ssd1307fb_remove(struct i2c_client *client)
if (par-ops-remove)
par-ops-remove(par);
fb_deferred_io_cleanup(info);
+   __free_pages(__va(info-fix.smem_start), get_order(info-fix.smem_len));
framebuffer_release(info);
 
return 0;
-- 
2.3.0

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCHv6 08/10] fbdev: ssd1307fb: Turn off display on driver unload.

2015-03-31 Thread Thomas Niederprüm
This patch turns off the display when the driver is unloaded.

Signed-off-by: Thomas Niederprüm nied...@physik.uni-kl.de
Acked-by: Maxime Ripard maxime.rip...@free-electrons.com
---
 drivers/video/fbdev/ssd1307fb.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/video/fbdev/ssd1307fb.c b/drivers/video/fbdev/ssd1307fb.c
index 85eeda0..5f3d5a8 100644
--- a/drivers/video/fbdev/ssd1307fb.c
+++ b/drivers/video/fbdev/ssd1307fb.c
@@ -620,6 +620,8 @@ static int ssd1307fb_remove(struct i2c_client *client)
struct fb_info *info = i2c_get_clientdata(client);
struct ssd1307fb_par *par = info-par;
 
+   ssd1307fb_write_cmd(par-client, SSD1307FB_DISPLAY_OFF);
+
unregister_framebuffer(info);
if (par-device_info-need_pwm) {
pwm_disable(par-pwm);
-- 
2.3.0

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCHv6 03/10] of: Add Solomon Systech vendor prefix.

2015-03-31 Thread Thomas Niederprüm
This patch adds the solomon prefix for Solomon Systech Limited.

Signed-off-by: Thomas Niederprüm nied...@physik.uni-kl.de
---
 Documentation/devicetree/bindings/vendor-prefixes.txt | 1 +
 1 file changed, 1 insertion(+)

diff --git a/Documentation/devicetree/bindings/vendor-prefixes.txt 
b/Documentation/devicetree/bindings/vendor-prefixes.txt
index d3f4809..933c8f5 100644
--- a/Documentation/devicetree/bindings/vendor-prefixes.txt
+++ b/Documentation/devicetree/bindings/vendor-prefixes.txt
@@ -169,6 +169,7 @@ sitronixSitronix Technology Corporation
 smsc   Standard Microsystems Corporation
 snps   Synopsys, Inc.
 solidrun   SolidRun
+solomonSolomon Systech Limited
 sony   Sony Corporation
 spansion   Spansion Inc.
 sprd   Spreadtrum Communications Inc.
-- 
2.3.0

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCHv6 09/10] fbdev: ssd1307fb: add backlight controls for setting the contrast

2015-03-31 Thread Thomas Niederprüm
The backlight class is used to create userspace handles for
setting the OLED contrast.

Signed-off-by: Thomas Niederprüm nied...@physik.uni-kl.de
Acked-by: Maxime Ripard maxime.rip...@free-electrons.com
---
 drivers/video/fbdev/Kconfig |  1 +
 drivers/video/fbdev/ssd1307fb.c | 58 +
 2 files changed, 59 insertions(+)

diff --git a/drivers/video/fbdev/Kconfig b/drivers/video/fbdev/Kconfig
index b3dd417..da70bae 100644
--- a/drivers/video/fbdev/Kconfig
+++ b/drivers/video/fbdev/Kconfig
@@ -2478,6 +2478,7 @@ config FB_SSD1307
select FB_SYS_IMAGEBLIT
select FB_DEFERRED_IO
select PWM
+   select FB_BACKLIGHT
help
  This driver implements support for the Solomon SSD1307
  OLED controller over I2C.
diff --git a/drivers/video/fbdev/ssd1307fb.c b/drivers/video/fbdev/ssd1307fb.c
index 5f3d5a8..77efed7 100644
--- a/drivers/video/fbdev/ssd1307fb.c
+++ b/drivers/video/fbdev/ssd1307fb.c
@@ -7,6 +7,7 @@
  */
 
 #include linux/module.h
+#include linux/backlight.h
 #include linux/kernel.h
 #include linux/i2c.h
 #include linux/fb.h
@@ -38,6 +39,8 @@
 #defineSSD1307FB_SET_COM_PINS_CONFIG   0xda
 #defineSSD1307FB_SET_VCOMH 0xdb
 
+#define MAX_CONTRAST 255
+
 #define REFRESHRATE 1
 
 static u_int refreshrate = REFRESHRATE;
@@ -424,6 +427,43 @@ static int ssd1307fb_init(struct ssd1307fb_par *par)
return 0;
 }
 
+static int ssd1307fb_update_bl(struct backlight_device *bdev)
+{
+   struct ssd1307fb_par *par = bl_get_data(bdev);
+   int ret;
+   int brightness = bdev-props.brightness;
+
+   par-contrast = brightness;
+
+   ret = ssd1307fb_write_cmd(par-client, SSD1307FB_CONTRAST);
+   if (ret  0)
+   return ret;
+   ret = ssd1307fb_write_cmd(par-client, par-contrast);
+   if (ret  0)
+   return ret;
+   return 0;
+}
+
+static int ssd1307fb_get_brightness(struct backlight_device *bdev)
+{
+   struct ssd1307fb_par *par = bl_get_data(bdev);
+
+   return par-contrast;
+}
+
+static int ssd1307fb_check_fb(struct backlight_device *bdev,
+  struct fb_info *info)
+{
+   return (info-bl_dev == bdev);
+}
+
+static const struct backlight_ops ssd1307fb_bl_ops = {
+   .options= BL_CORE_SUSPENDRESUME,
+   .update_status  = ssd1307fb_update_bl,
+   .get_brightness = ssd1307fb_get_brightness,
+   .check_fb   = ssd1307fb_check_fb,
+};
+
 static struct ssd1307fb_deviceinfo ssd1307fb_ssd1305_deviceinfo = {
.default_vcomh = 0x34,
.default_dclk_div = 1,
@@ -464,6 +504,8 @@ MODULE_DEVICE_TABLE(of, ssd1307fb_of_match);
 static int ssd1307fb_probe(struct i2c_client *client,
   const struct i2c_device_id *id)
 {
+   struct backlight_device *bl;
+   char bl_name[12];
struct fb_info *info;
struct device_node *node = client-dev.of_node;
struct fb_deferred_io *ssd1307fb_defio;
@@ -599,10 +641,24 @@ static int ssd1307fb_probe(struct i2c_client *client,
goto panel_init_error;
}
 
+   snprintf(bl_name, sizeof(bl_name), ssd1307fb%d, info-node);
+   bl = backlight_device_register(bl_name, client-dev, par,
+  ssd1307fb_bl_ops, NULL);
+   bl-props.brightness = par-contrast;
+   bl-props.max_brightness = MAX_CONTRAST;
+   info-bl_dev = bl;
+
+   if (IS_ERR(bl)) {
+   dev_err(client-dev, unable to register backlight device: 
%ld\n,
+   PTR_ERR(bl));
+   goto bl_init_error;
+   }
dev_info(client-dev, fb%d: %s framebuffer device registered, using 
%d bytes of video memory\n, info-node, info-fix.id, vmem_size);
 
return 0;
 
+bl_init_error:
+   unregister_framebuffer(info);
 panel_init_error:
if (par-device_info-need_pwm) {
pwm_disable(par-pwm);
@@ -622,6 +678,8 @@ static int ssd1307fb_remove(struct i2c_client *client)
 
ssd1307fb_write_cmd(par-client, SSD1307FB_DISPLAY_OFF);
 
+   backlight_device_unregister(info-bl_dev);
+
unregister_framebuffer(info);
if (par-device_info-need_pwm) {
pwm_disable(par-pwm);
-- 
2.3.0

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCHv6 10/10] fbdev: ssd1307fb: Add blank mode

2015-03-31 Thread Thomas Niederprüm
This patch adds ssd1307fb_blank() to make the framebuffer capable
of blanking.

Signed-off-by: Thomas Niederprüm nied...@physik.uni-kl.de
---
 drivers/video/fbdev/ssd1307fb.c | 11 +++
 1 file changed, 11 insertions(+)

diff --git a/drivers/video/fbdev/ssd1307fb.c b/drivers/video/fbdev/ssd1307fb.c
index 77efed7..8fc224c 100644
--- a/drivers/video/fbdev/ssd1307fb.c
+++ b/drivers/video/fbdev/ssd1307fb.c
@@ -235,6 +235,16 @@ static ssize_t ssd1307fb_write(struct fb_info *info, const 
char __user *buf,
return count;
 }
 
+static int ssd1307fb_blank(int blank_mode, struct fb_info *info)
+{
+   struct ssd1307fb_par *par = info-par;
+
+   if (blank_mode != FB_BLANK_UNBLANK)
+   return ssd1307fb_write_cmd(par-client, SSD1307FB_DISPLAY_OFF);
+   else
+   return ssd1307fb_write_cmd(par-client, SSD1307FB_DISPLAY_ON);
+}
+
 static void ssd1307fb_fillrect(struct fb_info *info, const struct fb_fillrect 
*rect)
 {
struct ssd1307fb_par *par = info-par;
@@ -260,6 +270,7 @@ static struct fb_ops ssd1307fb_ops = {
.owner  = THIS_MODULE,
.fb_read= fb_sys_read,
.fb_write   = ssd1307fb_write,
+   .fb_blank   = ssd1307fb_blank,
.fb_fillrect= ssd1307fb_fillrect,
.fb_copyarea= ssd1307fb_copyarea,
.fb_imageblit   = ssd1307fb_imageblit,
-- 
2.3.0

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCHv5 11/11] fbdev: ssd1307fb: Add blank mode

2015-03-25 Thread Thomas Niederprüm
Am Wed, 25 Mar 2015 16:50:05 +0100
schrieb Olliver Schinagl :

> Hey Thomas,
> 
> On 24-03-15 22:23, Thomas Niederprüm wrote:
> > This patch adds ssd1307fb_blank() to make the framebuffer capable
> > of blanking.
> >
> > Signed-off-by: Thomas Niederprüm 
> > ---
> >   drivers/video/fbdev/ssd1307fb.c | 13 +
> >   1 file changed, 13 insertions(+)
> >
> > diff --git a/drivers/video/fbdev/ssd1307fb.c
> > b/drivers/video/fbdev/ssd1307fb.c index 061cc95..9101b27 100644
> > --- a/drivers/video/fbdev/ssd1307fb.c
> > +++ b/drivers/video/fbdev/ssd1307fb.c
> > @@ -238,6 +238,18 @@ static ssize_t ssd1307fb_write(struct fb_info
> > *info, const char __user *buf, return count;
> >   }
> >
> > +static int ssd1307fb_blank(int blank_mode, struct fb_info *info)
> > +{
> > +   struct ssd1307fb_par *par = info->par;
> > +   int ret;
> > +
> > +   if (blank_mode != FB_BLANK_UNBLANK)
> > +   ret = ssd1307fb_write_cmd(par->client,
> > SSD1307FB_DISPLAY_OFF);
> > +   else
> > +   ret = ssd1307fb_write_cmd(par->client,
> > SSD1307FB_DISPLAY_ON);
> I'd probably add an extra return, or drop the ret var at all and just 
> return the function.
> 
> or even shorter :)
> return sd1307fb_write_cmd(par->client, (blank_mode !=
> FB_BLANK_UNBLANK) ? SSD1307FB_DISPLAY_OFF : SSD1307FB_DISPLAY_ON;

Wow, short and elegant. Thanks for the hint, I will include it in v6.

Thomas


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCHv5 09/11] fbdev: ssd1307fb: Add module parameter to set the initial contrast

2015-03-25 Thread Thomas Niederprüm
Am Tue, 24 Mar 2015 15:16:36 -0700
schrieb Maxime Ripard :

> On Tue, Mar 24, 2015 at 10:23:56PM +0100, Thomas Niederprüm wrote:
> > This patch adds the module parameter "contrast" to determine the
> > contrast value that is used to initialize the display. This
> > setting applies to all instances of the driver.
> > 
> > Signed-off-by: Thomas Niederprüm 
> 
> Do we still need this patch given that the next one is doing the exact
> same thing?
I was kind of expecting this objection. I added this module parameter
since it suits my use case where I always run the display at the lowest
possible contrast. With this module parameter I can specify this need
at module load time and I do not need udev or to touch the backlight
controls manually every time the driver is loaded. I see that this is
probably a (too) weak argument, so if nobody complains I will remove
this patch for the next round.

Thomas
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCHv5 04/11] fbdev: ssd1307fb: Unify init code and obtain hw specific bits from DT

2015-03-25 Thread Thomas Niederprüm
Am Wed, 25 Mar 2015 16:49:47 +0100
schrieb Olliver Schinagl :

> Hey Thomas,
> 
> awesome the time you put into this driver. It does what I was working
> on the last few weeks, but with a much bigger bang ;)
> 
> I personally have a ssd1309 and will be submitting the patches for
> that after testing your patch-set.

Yeah, it turned out to be quite some work. But I'm glad to see that it
might turn out useful for you and I'm looking forward to see support
added for even more controllers.

> On 24-03-15 22:23, Thomas Niederprüm wrote:
> > The 130X controllers are very similar from the configuration point
> > of view. The configuration registers for the SSD1305/6/7 are bit
> > identical (except the the VHCOM register and the the default values
> > for clock setup register). This patch unifies the init code of the
> > controller and adds hardware specific properties to DT that are
> > needed to correctly initialize the device.
> >
> > The SSD130X can be wired to the OLED panel in various ways. Even
> > for the same controller this wiring can differ from one display
> > module to another and can not be probed by software. The added DT
> > properties reflect these hardware decisions of the display module
> > manufacturer. The 'com-sequential', 'com-lrremap' and 'com-invdir'
> > values define different possibilities for the COM signals pin
> > configuration and readout direction of the video memory. The
> > 'segment-no-remap' allows the inversion of the memory-to-pin
> > mapping ultimately inverting the order of the controllers output
> > pins. The 'prechargepX' values need to be adapted according to the
> > capacitance of the OLEDs pixel cells.
> >
> > So far these hardware specific bits are hard coded in the init
> > code, making the driver usable only for one certain wiring of the
> > controller. This patch makes the driver usable with all possible
> > hardware setups, given a valid hw description in DT. If these
> > values are not set in DT the default values, as they are set in the
> > ssd1307 init code right now, are used. This implies that without
> > the corresponding DT property "segment-no-remap" the segment remap
> > of the ssd130X controller gets activated. Even though this is not
> > the default behaviour according to the datasheet it maintains
> > backward compatibility with older DTBs.
> >
> > Note that the SSD1306 does not seem to be using the configuration
> > written to the registers at all. Therefore this patch does not try
> > to maintain these values without changes in DT. For reference an
> > example is added to the DT bindings documentation that reproduces
> > the configuration that is set in the current init code.
> >
> > Signed-off-by: Thomas Niederprüm 
> > ---
> >   .../devicetree/bindings/video/ssd1307fb.txt|  21 +++
> >   drivers/video/fbdev/ssd1307fb.c| 192
> > - 2 files changed, 134 insertions(+), 79
> > deletions(-)
> >
> > diff --git a/Documentation/devicetree/bindings/video/ssd1307fb.txt
> > b/Documentation/devicetree/bindings/video/ssd1307fb.txt index
> > 7a12542..637690f 100644 ---
> > a/Documentation/devicetree/bindings/video/ssd1307fb.txt +++
> > b/Documentation/devicetree/bindings/video/ssd1307fb.txt @@ -15,6
> > +15,16 @@ Required properties:
> >
> >   Optional properties:
> > - reset-active-low: Is the reset gpio is active on physical low?
> > +  - solomon,segment-no-remap: Display needs normal (non-inverted)
> > data column
> > +  to segment mapping
> > +  - solomon,com-sequential: Display uses sequential COM pin
> > configuration
> > +  - solomon,com-lrremap: Display uses left-right COM pin remap
> > +  - solomon,com-invdir: Display uses inverted COM pin scan
> > direction
> > +  - solomon,com-offset: Number of the COM pin wired to the first
> > display line
> > +  - solomon,prechargep1: Length of deselect period (phase 1) in
> > clock cycles.
> > +  - solomon,prechargep2: Length of precharge period (phase 2) in
> > clock cycles.
> > + This needs to be the higher, the higher
> > the capacitance
> > + of the OLED's pixels is
> Aren't the height, width and page-offset also optional? They should
> be set to sane defaults when not supplied. Though the default (which
> is the max really) width/height depends on the actual attached
> display to the chip (I mention this in the vcomh section too below,
> the controller's width/height would be the absolute maximum values,
> the display can 

Re: [PATCHv5 04/11] fbdev: ssd1307fb: Unify init code and obtain hw specific bits from DT

2015-03-25 Thread Thomas Niederprüm
Am Tue, 24 Mar 2015 15:14:28 -0700
schrieb Maxime Ripard :

> On Tue, Mar 24, 2015 at 10:23:51PM +0100, Thomas Niederprüm wrote:
> > The 130X controllers are very similar from the configuration point
> > of view. The configuration registers for the SSD1305/6/7 are bit
> > identical (except the the VHCOM register and the the default values
> > for clock setup register). This patch unifies the init code of the
> > controller and adds hardware specific properties to DT that are
> > needed to correctly initialize the device.
> > 
> > The SSD130X can be wired to the OLED panel in various ways. Even
> > for the same controller this wiring can differ from one display
> > module to another and can not be probed by software. The added DT
> > properties reflect these hardware decisions of the display module
> > manufacturer. The 'com-sequential', 'com-lrremap' and 'com-invdir'
> > values define different possibilities for the COM signals pin
> > configuration and readout direction of the video memory. The
> > 'segment-no-remap' allows the inversion of the memory-to-pin
> > mapping ultimately inverting the order of the controllers output
> > pins. The 'prechargepX' values need to be adapted according to the
> > capacitance of the OLEDs pixel cells.
> > 
> > So far these hardware specific bits are hard coded in the init
> > code, making the driver usable only for one certain wiring of the
> > controller. This patch makes the driver usable with all possible
> > hardware setups, given a valid hw description in DT. If these
> > values are not set in DT the default values, as they are set in the
> > ssd1307 init code right now, are used. This implies that without
> > the corresponding DT property "segment-no-remap" the segment remap
> > of the ssd130X controller gets activated. Even though this is not
> > the default behaviour according to the datasheet it maintains
> > backward compatibility with older DTBs.
> > 
> > Note that the SSD1306 does not seem to be using the configuration
> > written to the registers at all. Therefore this patch does not try
> > to maintain these values without changes in DT. For reference an
> > example is added to the DT bindings documentation that reproduces
> > the configuration that is set in the current init code.
> > 
> > Signed-off-by: Thomas Niederprüm 
> > ---
> >  .../devicetree/bindings/video/ssd1307fb.txt|  21 +++
> >  drivers/video/fbdev/ssd1307fb.c| 192
> > - 2 files changed, 134 insertions(+), 79
> > deletions(-)
> > 
> > diff --git a/Documentation/devicetree/bindings/video/ssd1307fb.txt
> > b/Documentation/devicetree/bindings/video/ssd1307fb.txt index
> > 7a12542..637690f 100644 ---
> > a/Documentation/devicetree/bindings/video/ssd1307fb.txt +++
> > b/Documentation/devicetree/bindings/video/ssd1307fb.txt @@ -15,6
> > +15,16 @@ Required properties: 
> >  Optional properties:
> >- reset-active-low: Is the reset gpio is active on physical low?
> > +  - solomon,segment-no-remap: Display needs normal (non-inverted)
> > data column
> > +  to segment mapping
> > +  - solomon,com-sequential: Display uses sequential COM pin
> > configuration
> > +  - solomon,com-lrremap: Display uses left-right COM pin remap
> > +  - solomon,com-invdir: Display uses inverted COM pin scan
> > direction
> > +  - solomon,com-offset: Number of the COM pin wired to the first
> > display line
> > +  - solomon,prechargep1: Length of deselect period (phase 1) in
> > clock cycles.
> > +  - solomon,prechargep2: Length of precharge period (phase 2) in
> > clock cycles.
> > + This needs to be the higher, the higher
> > the capacitance
> > + of the OLED's pixels is
> >  
> >  [0]: Documentation/devicetree/bindings/pwm/pwm.txt
> >  
> > @@ -26,3 +36,14 @@ ssd1307: oled@3c {
> >  reset-gpios = < 7>;
> >  reset-active-low;
> >  };
> > +
> > +ssd1306: oled@3c {
> > +compatible = "solomon,ssd1306fb-i2c";
> > +reg = <0x3c>;
> > +pwms = < 4 3000>;
> > +reset-gpios = < 7>;
> > +reset-active-low;
> > +solomon,com-lrremap;
> > +solomon,com-invdir;
> > +solomon,com-offset = <32>;
> > +};
> > diff --git a/drivers/video/fbdev/ssd1307fb.c
> > b/drivers/video/fbdev/ssd1307fb.c index 8d34c56..d16aad4 100644
> > --- a/drivers/video/fbdev/ssd1307fb.c
&g

Re: [PATCHv5 11/11] fbdev: ssd1307fb: Add blank mode

2015-03-25 Thread Thomas Niederprüm
Am Wed, 25 Mar 2015 16:50:05 +0100
schrieb Olliver Schinagl oli...@schinagl.nl:

 Hey Thomas,
 
 On 24-03-15 22:23, Thomas Niederprüm wrote:
  This patch adds ssd1307fb_blank() to make the framebuffer capable
  of blanking.
 
  Signed-off-by: Thomas Niederprüm nied...@physik.uni-kl.de
  ---
drivers/video/fbdev/ssd1307fb.c | 13 +
1 file changed, 13 insertions(+)
 
  diff --git a/drivers/video/fbdev/ssd1307fb.c
  b/drivers/video/fbdev/ssd1307fb.c index 061cc95..9101b27 100644
  --- a/drivers/video/fbdev/ssd1307fb.c
  +++ b/drivers/video/fbdev/ssd1307fb.c
  @@ -238,6 +238,18 @@ static ssize_t ssd1307fb_write(struct fb_info
  *info, const char __user *buf, return count;
}
 
  +static int ssd1307fb_blank(int blank_mode, struct fb_info *info)
  +{
  +   struct ssd1307fb_par *par = info-par;
  +   int ret;
  +
  +   if (blank_mode != FB_BLANK_UNBLANK)
  +   ret = ssd1307fb_write_cmd(par-client,
  SSD1307FB_DISPLAY_OFF);
  +   else
  +   ret = ssd1307fb_write_cmd(par-client,
  SSD1307FB_DISPLAY_ON);
 I'd probably add an extra return, or drop the ret var at all and just 
 return the function.
 
 or even shorter :)
 return sd1307fb_write_cmd(par-client, (blank_mode !=
 FB_BLANK_UNBLANK) ? SSD1307FB_DISPLAY_OFF : SSD1307FB_DISPLAY_ON;

Wow, short and elegant. Thanks for the hint, I will include it in v6.

Thomas


--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCHv5 04/11] fbdev: ssd1307fb: Unify init code and obtain hw specific bits from DT

2015-03-25 Thread Thomas Niederprüm
Am Tue, 24 Mar 2015 15:14:28 -0700
schrieb Maxime Ripard maxime.rip...@free-electrons.com:

 On Tue, Mar 24, 2015 at 10:23:51PM +0100, Thomas Niederprüm wrote:
  The 130X controllers are very similar from the configuration point
  of view. The configuration registers for the SSD1305/6/7 are bit
  identical (except the the VHCOM register and the the default values
  for clock setup register). This patch unifies the init code of the
  controller and adds hardware specific properties to DT that are
  needed to correctly initialize the device.
  
  The SSD130X can be wired to the OLED panel in various ways. Even
  for the same controller this wiring can differ from one display
  module to another and can not be probed by software. The added DT
  properties reflect these hardware decisions of the display module
  manufacturer. The 'com-sequential', 'com-lrremap' and 'com-invdir'
  values define different possibilities for the COM signals pin
  configuration and readout direction of the video memory. The
  'segment-no-remap' allows the inversion of the memory-to-pin
  mapping ultimately inverting the order of the controllers output
  pins. The 'prechargepX' values need to be adapted according to the
  capacitance of the OLEDs pixel cells.
  
  So far these hardware specific bits are hard coded in the init
  code, making the driver usable only for one certain wiring of the
  controller. This patch makes the driver usable with all possible
  hardware setups, given a valid hw description in DT. If these
  values are not set in DT the default values, as they are set in the
  ssd1307 init code right now, are used. This implies that without
  the corresponding DT property segment-no-remap the segment remap
  of the ssd130X controller gets activated. Even though this is not
  the default behaviour according to the datasheet it maintains
  backward compatibility with older DTBs.
  
  Note that the SSD1306 does not seem to be using the configuration
  written to the registers at all. Therefore this patch does not try
  to maintain these values without changes in DT. For reference an
  example is added to the DT bindings documentation that reproduces
  the configuration that is set in the current init code.
  
  Signed-off-by: Thomas Niederprüm nied...@physik.uni-kl.de
  ---
   .../devicetree/bindings/video/ssd1307fb.txt|  21 +++
   drivers/video/fbdev/ssd1307fb.c| 192
  - 2 files changed, 134 insertions(+), 79
  deletions(-)
  
  diff --git a/Documentation/devicetree/bindings/video/ssd1307fb.txt
  b/Documentation/devicetree/bindings/video/ssd1307fb.txt index
  7a12542..637690f 100644 ---
  a/Documentation/devicetree/bindings/video/ssd1307fb.txt +++
  b/Documentation/devicetree/bindings/video/ssd1307fb.txt @@ -15,6
  +15,16 @@ Required properties: 
   Optional properties:
 - reset-active-low: Is the reset gpio is active on physical low?
  +  - solomon,segment-no-remap: Display needs normal (non-inverted)
  data column
  +  to segment mapping
  +  - solomon,com-sequential: Display uses sequential COM pin
  configuration
  +  - solomon,com-lrremap: Display uses left-right COM pin remap
  +  - solomon,com-invdir: Display uses inverted COM pin scan
  direction
  +  - solomon,com-offset: Number of the COM pin wired to the first
  display line
  +  - solomon,prechargep1: Length of deselect period (phase 1) in
  clock cycles.
  +  - solomon,prechargep2: Length of precharge period (phase 2) in
  clock cycles.
  + This needs to be the higher, the higher
  the capacitance
  + of the OLED's pixels is
   
   [0]: Documentation/devicetree/bindings/pwm/pwm.txt
   
  @@ -26,3 +36,14 @@ ssd1307: oled@3c {
   reset-gpios = gpio2 7;
   reset-active-low;
   };
  +
  +ssd1306: oled@3c {
  +compatible = solomon,ssd1306fb-i2c;
  +reg = 0x3c;
  +pwms = pwm 4 3000;
  +reset-gpios = gpio2 7;
  +reset-active-low;
  +solomon,com-lrremap;
  +solomon,com-invdir;
  +solomon,com-offset = 32;
  +};
  diff --git a/drivers/video/fbdev/ssd1307fb.c
  b/drivers/video/fbdev/ssd1307fb.c index 8d34c56..d16aad4 100644
  --- a/drivers/video/fbdev/ssd1307fb.c
  +++ b/drivers/video/fbdev/ssd1307fb.c
  @@ -40,20 +40,34 @@
   
   struct ssd1307fb_par;
   
  -struct ssd1307fb_ops {
  -   int (*init)(struct ssd1307fb_par *);
  -   int (*remove)(struct ssd1307fb_par *);
  +struct ssd1307fb_deviceinfo {
  +   u32 default_vcomh;
  +   u32 default_dclk_div;
  +   u32 default_dclk_frq;
  +   int need_pwm;
  +   int need_chargepump;
   };
   
   struct ssd1307fb_par {
  +   u32 com_invdir;
  +   u32 com_lrremap;
  +   u32 com_offset;
  +   u32 com_seq;
  +   u32 contrast;
  +   u32 dclk_div;
  +   u32 dclk_frq;
  +   struct ssd1307fb_deviceinfo *device_info;
  struct i2c_client *client;
  u32 height;
  struct fb_info *info;
  -   struct ssd1307fb_ops *ops

Re: [PATCHv5 04/11] fbdev: ssd1307fb: Unify init code and obtain hw specific bits from DT

2015-03-25 Thread Thomas Niederprüm
Am Wed, 25 Mar 2015 16:49:47 +0100
schrieb Olliver Schinagl oli...@schinagl.nl:

 Hey Thomas,
 
 awesome the time you put into this driver. It does what I was working
 on the last few weeks, but with a much bigger bang ;)
 
 I personally have a ssd1309 and will be submitting the patches for
 that after testing your patch-set.

Yeah, it turned out to be quite some work. But I'm glad to see that it
might turn out useful for you and I'm looking forward to see support
added for even more controllers.

 On 24-03-15 22:23, Thomas Niederprüm wrote:
  The 130X controllers are very similar from the configuration point
  of view. The configuration registers for the SSD1305/6/7 are bit
  identical (except the the VHCOM register and the the default values
  for clock setup register). This patch unifies the init code of the
  controller and adds hardware specific properties to DT that are
  needed to correctly initialize the device.
 
  The SSD130X can be wired to the OLED panel in various ways. Even
  for the same controller this wiring can differ from one display
  module to another and can not be probed by software. The added DT
  properties reflect these hardware decisions of the display module
  manufacturer. The 'com-sequential', 'com-lrremap' and 'com-invdir'
  values define different possibilities for the COM signals pin
  configuration and readout direction of the video memory. The
  'segment-no-remap' allows the inversion of the memory-to-pin
  mapping ultimately inverting the order of the controllers output
  pins. The 'prechargepX' values need to be adapted according to the
  capacitance of the OLEDs pixel cells.
 
  So far these hardware specific bits are hard coded in the init
  code, making the driver usable only for one certain wiring of the
  controller. This patch makes the driver usable with all possible
  hardware setups, given a valid hw description in DT. If these
  values are not set in DT the default values, as they are set in the
  ssd1307 init code right now, are used. This implies that without
  the corresponding DT property segment-no-remap the segment remap
  of the ssd130X controller gets activated. Even though this is not
  the default behaviour according to the datasheet it maintains
  backward compatibility with older DTBs.
 
  Note that the SSD1306 does not seem to be using the configuration
  written to the registers at all. Therefore this patch does not try
  to maintain these values without changes in DT. For reference an
  example is added to the DT bindings documentation that reproduces
  the configuration that is set in the current init code.
 
  Signed-off-by: Thomas Niederprüm nied...@physik.uni-kl.de
  ---
.../devicetree/bindings/video/ssd1307fb.txt|  21 +++
drivers/video/fbdev/ssd1307fb.c| 192
  - 2 files changed, 134 insertions(+), 79
  deletions(-)
 
  diff --git a/Documentation/devicetree/bindings/video/ssd1307fb.txt
  b/Documentation/devicetree/bindings/video/ssd1307fb.txt index
  7a12542..637690f 100644 ---
  a/Documentation/devicetree/bindings/video/ssd1307fb.txt +++
  b/Documentation/devicetree/bindings/video/ssd1307fb.txt @@ -15,6
  +15,16 @@ Required properties:
 
Optional properties:
  - reset-active-low: Is the reset gpio is active on physical low?
  +  - solomon,segment-no-remap: Display needs normal (non-inverted)
  data column
  +  to segment mapping
  +  - solomon,com-sequential: Display uses sequential COM pin
  configuration
  +  - solomon,com-lrremap: Display uses left-right COM pin remap
  +  - solomon,com-invdir: Display uses inverted COM pin scan
  direction
  +  - solomon,com-offset: Number of the COM pin wired to the first
  display line
  +  - solomon,prechargep1: Length of deselect period (phase 1) in
  clock cycles.
  +  - solomon,prechargep2: Length of precharge period (phase 2) in
  clock cycles.
  + This needs to be the higher, the higher
  the capacitance
  + of the OLED's pixels is
 Aren't the height, width and page-offset also optional? They should
 be set to sane defaults when not supplied. Though the default (which
 is the max really) width/height depends on the actual attached
 display to the chip (I mention this in the vcomh section too below,
 the controller's width/height would be the absolute maximum values,
 the display can always be smaller).
 
 Same goes to say for the precharge, and probably other parameters. I 
 don't think we have a proper framework to handle the attached
 displays to a controller chip at the moment anyhow?
 
 
[0]: Documentation/devicetree/bindings/pwm/pwm.txt
 
 snip
  +
  +   /* Set COM direction */
  +   com_invdir = 0xc0 | (par-com_invdir  0xf)  3;
 Shouldn't this be par-com_invdir  0x1 ?
 The datasheet only mentions 1 bit change for the ssd1306, ssd1307 and 
 ssd1309. I dont' know what the ssd1305 does here though.

Yes, you are right, it should be  par-com_invdir

Re: [PATCHv5 09/11] fbdev: ssd1307fb: Add module parameter to set the initial contrast

2015-03-25 Thread Thomas Niederprüm
Am Tue, 24 Mar 2015 15:16:36 -0700
schrieb Maxime Ripard maxime.rip...@free-electrons.com:

 On Tue, Mar 24, 2015 at 10:23:56PM +0100, Thomas Niederprüm wrote:
  This patch adds the module parameter contrast to determine the
  contrast value that is used to initialize the display. This
  setting applies to all instances of the driver.
  
  Signed-off-by: Thomas Niederprüm nied...@physik.uni-kl.de
 
 Do we still need this patch given that the next one is doing the exact
 same thing?
I was kind of expecting this objection. I added this module parameter
since it suits my use case where I always run the display at the lowest
possible contrast. With this module parameter I can specify this need
at module load time and I do not need udev or to touch the backlight
controls manually every time the driver is loaded. I see that this is
probably a (too) weak argument, so if nobody complains I will remove
this patch for the next round.

Thomas
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCHv5 05/11] ARM: mxs: fix in tree users of ssd1306

2015-03-24 Thread Thomas Niederprüm
This patch updates the in tree-users of the SSD1306 controller for using
the newly introduced DT properties.

Signed-off-by: Thomas Niederprüm 
---
 arch/arm/boot/dts/imx28-cfa10036.dts | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/arch/arm/boot/dts/imx28-cfa10036.dts 
b/arch/arm/boot/dts/imx28-cfa10036.dts
index b04b6b8..570aa33 100644
--- a/arch/arm/boot/dts/imx28-cfa10036.dts
+++ b/arch/arm/boot/dts/imx28-cfa10036.dts
@@ -99,6 +99,9 @@
solomon,height = <32>;
solomon,width = <128>;
solomon,page-offset = <0>;
+   solomon,com-lrremap;
+   solomon,com-invdir;
+   solomon,com-offset = <32>;
};
};
 
-- 
2.3.0

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCHv5 03/11] of: Add Solomon Systech vendor prefix.

2015-03-24 Thread Thomas Niederprüm
This patch adds the solomon prefix for Solomon Systech Limited.

Signed-off-by: Thomas Niederprüm 
---
 Documentation/devicetree/bindings/vendor-prefixes.txt | 1 +
 1 file changed, 1 insertion(+)

diff --git a/Documentation/devicetree/bindings/vendor-prefixes.txt 
b/Documentation/devicetree/bindings/vendor-prefixes.txt
index d3f4809..933c8f5 100644
--- a/Documentation/devicetree/bindings/vendor-prefixes.txt
+++ b/Documentation/devicetree/bindings/vendor-prefixes.txt
@@ -169,6 +169,7 @@ sitronixSitronix Technology Corporation
 smsc   Standard Microsystems Corporation
 snps   Synopsys, Inc.
 solidrun   SolidRun
+solomonSolomon Systech Limited
 sony   Sony Corporation
 spansion   Spansion Inc.
 sprd   Spreadtrum Communications Inc.
-- 
2.3.0

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCHv5 06/11] fbdev: ssd1307fb: Add support for SSD1305

2015-03-24 Thread Thomas Niederprüm
This patch adds support for the SSD1305 OLED controller.

Signed-off-by: Thomas Niederprüm 
---
 Documentation/devicetree/bindings/video/ssd1307fb.txt |  2 +-
 drivers/video/fbdev/ssd1307fb.c   | 13 +
 2 files changed, 14 insertions(+), 1 deletion(-)

diff --git a/Documentation/devicetree/bindings/video/ssd1307fb.txt 
b/Documentation/devicetree/bindings/video/ssd1307fb.txt
index 637690f..acdf1ae 100644
--- a/Documentation/devicetree/bindings/video/ssd1307fb.txt
+++ b/Documentation/devicetree/bindings/video/ssd1307fb.txt
@@ -2,7 +2,7 @@
 
 Required properties:
   - compatible: Should be "solomon,fb-". The only supported bus for
-now is i2c, and the supported chips are ssd1306 and ssd1307.
+now is i2c, and the supported chips are ssd1305, ssd1306 and ssd1307.
   - reg: Should contain address of the controller on the I2C bus. Most likely
  0x3c or 0x3d
   - pwm: Should contain the pwm to use according to the OF device tree PWM
diff --git a/drivers/video/fbdev/ssd1307fb.c b/drivers/video/fbdev/ssd1307fb.c
index d16aad4..284c527 100644
--- a/drivers/video/fbdev/ssd1307fb.c
+++ b/drivers/video/fbdev/ssd1307fb.c
@@ -425,6 +425,14 @@ static int ssd1307fb_init(struct ssd1307fb_par *par)
return 0;
 }
 
+static struct ssd1307fb_deviceinfo ssd1307fb_ssd1305_deviceinfo = {
+   .default_vcomh = 0x34,
+   .default_dclk_div = 0,
+   .default_dclk_frq = 7,
+   .need_pwm = 0,
+   .need_chargepump = 0,
+};
+
 static struct ssd1307fb_deviceinfo ssd1307fb_ssd1306_deviceinfo = {
.default_vcomh = 0x20,
.default_dclk_div = 0,
@@ -443,6 +451,10 @@ static struct ssd1307fb_deviceinfo 
ssd1307fb_ssd1307_deviceinfo = {
 
 static const struct of_device_id ssd1307fb_of_match[] = {
{
+   .compatible = "solomon,ssd1305fb-i2c",
+   .data = (void *)_ssd1305_deviceinfo,
+   },
+   {
.compatible = "solomon,ssd1306fb-i2c",
.data = (void *)_ssd1306_deviceinfo,
},
@@ -615,6 +627,7 @@ static int ssd1307fb_remove(struct i2c_client *client)
 }
 
 static const struct i2c_device_id ssd1307fb_i2c_id[] = {
+   { "ssd1305fb", 0 },
{ "ssd1306fb", 0 },
{ "ssd1307fb", 0 },
{ }
-- 
2.3.0

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCHv5 04/11] fbdev: ssd1307fb: Unify init code and obtain hw specific bits from DT

2015-03-24 Thread Thomas Niederprüm
The 130X controllers are very similar from the configuration point of view.
The configuration registers for the SSD1305/6/7 are bit identical (except the
the VHCOM register and the the default values for clock setup register). This
patch unifies the init code of the controller and adds hardware specific
properties to DT that are needed to correctly initialize the device.

The SSD130X can be wired to the OLED panel in various ways. Even for the
same controller this wiring can differ from one display module to another
and can not be probed by software. The added DT properties reflect these
hardware decisions of the display module manufacturer.
The 'com-sequential', 'com-lrremap' and 'com-invdir' values define different
possibilities for the COM signals pin configuration and readout direction
of the video memory. The 'segment-no-remap' allows the inversion of the
memory-to-pin mapping ultimately inverting the order of the controllers
output pins. The 'prechargepX' values need to be adapted according to the
capacitance of the OLEDs pixel cells.

So far these hardware specific bits are hard coded in the init code, making
the driver usable only for one certain wiring of the controller. This patch
makes the driver usable with all possible hardware setups, given a valid hw
description in DT. If these values are not set in DT the default values,
as they are set in the ssd1307 init code right now, are used. This implies
that without the corresponding DT property "segment-no-remap" the segment
remap of the ssd130X controller gets activated. Even though this is not the
default behaviour according to the datasheet it maintains backward
compatibility with older DTBs.

Note that the SSD1306 does not seem to be using the configuration written to
the registers at all. Therefore this patch does not try to maintain these
values without changes in DT. For reference an example is added to the DT
bindings documentation that reproduces the configuration that is set in the
current init code.

Signed-off-by: Thomas Niederprüm 
---
 .../devicetree/bindings/video/ssd1307fb.txt|  21 +++
 drivers/video/fbdev/ssd1307fb.c| 192 -
 2 files changed, 134 insertions(+), 79 deletions(-)

diff --git a/Documentation/devicetree/bindings/video/ssd1307fb.txt 
b/Documentation/devicetree/bindings/video/ssd1307fb.txt
index 7a12542..637690f 100644
--- a/Documentation/devicetree/bindings/video/ssd1307fb.txt
+++ b/Documentation/devicetree/bindings/video/ssd1307fb.txt
@@ -15,6 +15,16 @@ Required properties:
 
 Optional properties:
   - reset-active-low: Is the reset gpio is active on physical low?
+  - solomon,segment-no-remap: Display needs normal (non-inverted) data column
+  to segment mapping
+  - solomon,com-sequential: Display uses sequential COM pin configuration
+  - solomon,com-lrremap: Display uses left-right COM pin remap
+  - solomon,com-invdir: Display uses inverted COM pin scan direction
+  - solomon,com-offset: Number of the COM pin wired to the first display line
+  - solomon,prechargep1: Length of deselect period (phase 1) in clock cycles.
+  - solomon,prechargep2: Length of precharge period (phase 2) in clock cycles.
+ This needs to be the higher, the higher the 
capacitance
+ of the OLED's pixels is
 
 [0]: Documentation/devicetree/bindings/pwm/pwm.txt
 
@@ -26,3 +36,14 @@ ssd1307: oled@3c {
 reset-gpios = < 7>;
 reset-active-low;
 };
+
+ssd1306: oled@3c {
+compatible = "solomon,ssd1306fb-i2c";
+reg = <0x3c>;
+pwms = < 4 3000>;
+reset-gpios = < 7>;
+reset-active-low;
+solomon,com-lrremap;
+solomon,com-invdir;
+solomon,com-offset = <32>;
+};
diff --git a/drivers/video/fbdev/ssd1307fb.c b/drivers/video/fbdev/ssd1307fb.c
index 8d34c56..d16aad4 100644
--- a/drivers/video/fbdev/ssd1307fb.c
+++ b/drivers/video/fbdev/ssd1307fb.c
@@ -40,20 +40,34 @@
 
 struct ssd1307fb_par;
 
-struct ssd1307fb_ops {
-   int (*init)(struct ssd1307fb_par *);
-   int (*remove)(struct ssd1307fb_par *);
+struct ssd1307fb_deviceinfo {
+   u32 default_vcomh;
+   u32 default_dclk_div;
+   u32 default_dclk_frq;
+   int need_pwm;
+   int need_chargepump;
 };
 
 struct ssd1307fb_par {
+   u32 com_invdir;
+   u32 com_lrremap;
+   u32 com_offset;
+   u32 com_seq;
+   u32 contrast;
+   u32 dclk_div;
+   u32 dclk_frq;
+   struct ssd1307fb_deviceinfo *device_info;
struct i2c_client *client;
u32 height;
struct fb_info *info;
-   struct ssd1307fb_ops *ops;
u32 page_offset;
+   u32 prechargep1;
+   u32 prechargep2;
struct pwm_device *pwm;
u32 pwm_period;
int reset;
+   u32 seg_remap;
+   u32 vcomh;
u32 width;
 };
 
@@ -254,69 +268,46 @@ static struct fb_deferred_io ssd1307fb_defio =

[PATCHv5 01/11] fbdev: ssd1307fb: fix memory address smem_start.

2015-03-24 Thread Thomas Niederprüm
the smem_start pointer of the framebuffer info struct needs to hold the
physical address rather than the logical address. Right now the logical
address returned by kmalloc is stored. This patch converts this address
to a physical address and thus fixes a driver crash on mmaping the
framebuffer memory due to an access to the wrong memory address.

Signed-off-by: Thomas Niederprüm 
Acked-by: Maxime Ripard 
---
 drivers/video/fbdev/ssd1307fb.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/video/fbdev/ssd1307fb.c b/drivers/video/fbdev/ssd1307fb.c
index f7ed6d9..61e0ce8 100644
--- a/drivers/video/fbdev/ssd1307fb.c
+++ b/drivers/video/fbdev/ssd1307fb.c
@@ -515,7 +515,7 @@ static int ssd1307fb_probe(struct i2c_client *client,
info->var.blue.offset = 0;
 
info->screen_base = (u8 __force __iomem *)vmem;
-   info->fix.smem_start = (unsigned long)vmem;
+   info->fix.smem_start = __pa(vmem);
info->fix.smem_len = vmem_size;
 
fb_deferred_io_init(info);
-- 
2.3.0

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCHv5 10/11] fbdev: ssd1307fb: add backlight controls for setting the contrast

2015-03-24 Thread Thomas Niederprüm
The backlight class is used to create userspace handles for
setting the OLED contrast.

Signed-off-by: Thomas Niederprüm 
Acked-by: Maxime Ripard 
---
 drivers/video/fbdev/Kconfig |  1 +
 drivers/video/fbdev/ssd1307fb.c | 58 +
 2 files changed, 59 insertions(+)

diff --git a/drivers/video/fbdev/Kconfig b/drivers/video/fbdev/Kconfig
index b3dd417..da70bae 100644
--- a/drivers/video/fbdev/Kconfig
+++ b/drivers/video/fbdev/Kconfig
@@ -2478,6 +2478,7 @@ config FB_SSD1307
select FB_SYS_IMAGEBLIT
select FB_DEFERRED_IO
select PWM
+   select FB_BACKLIGHT
help
  This driver implements support for the Solomon SSD1307
  OLED controller over I2C.
diff --git a/drivers/video/fbdev/ssd1307fb.c b/drivers/video/fbdev/ssd1307fb.c
index d5aec5c..061cc95 100644
--- a/drivers/video/fbdev/ssd1307fb.c
+++ b/drivers/video/fbdev/ssd1307fb.c
@@ -7,6 +7,7 @@
  */
 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -38,6 +39,8 @@
 #defineSSD1307FB_SET_COM_PINS_CONFIG   0xda
 #defineSSD1307FB_SET_VCOMH 0xdb
 
+#define MAX_CONTRAST 255
+
 #define REFRESHRATE 1
 
 static u_int refreshrate = REFRESHRATE;
@@ -428,6 +431,43 @@ static int ssd1307fb_init(struct ssd1307fb_par *par)
return 0;
 }
 
+static int ssd1307fb_update_bl(struct backlight_device *bdev)
+{
+   struct ssd1307fb_par *par = bl_get_data(bdev);
+   int ret;
+   int brightness = bdev->props.brightness;
+
+   par->contrast = brightness;
+
+   ret = ssd1307fb_write_cmd(par->client, SSD1307FB_CONTRAST);
+   if (ret < 0)
+   return ret;
+   ret = ssd1307fb_write_cmd(par->client, par->contrast);
+   if (ret < 0)
+   return ret;
+   return 0;
+}
+
+static int ssd1307fb_get_brightness(struct backlight_device *bdev)
+{
+   struct ssd1307fb_par *par = bl_get_data(bdev);
+
+   return par->contrast;
+}
+
+static int ssd1307fb_check_fb(struct backlight_device *bdev,
+  struct fb_info *info)
+{
+   return (info->bl_dev == bdev);
+}
+
+static const struct backlight_ops ssd1307fb_bl_ops = {
+   .options= BL_CORE_SUSPENDRESUME,
+   .update_status  = ssd1307fb_update_bl,
+   .get_brightness = ssd1307fb_get_brightness,
+   .check_fb   = ssd1307fb_check_fb,
+};
+
 static struct ssd1307fb_deviceinfo ssd1307fb_ssd1305_deviceinfo = {
.default_vcomh = 0x34,
.default_dclk_div = 0,
@@ -472,6 +512,8 @@ MODULE_DEVICE_TABLE(of, ssd1307fb_of_match);
 static int ssd1307fb_probe(struct i2c_client *client,
   const struct i2c_device_id *id)
 {
+   struct backlight_device *bl;
+   char bl_name[12];
struct fb_info *info;
struct device_node *node = client->dev.of_node;
struct fb_deferred_io *ssd1307fb_defio;
@@ -607,10 +649,24 @@ static int ssd1307fb_probe(struct i2c_client *client,
goto panel_init_error;
}
 
+   snprintf(bl_name, sizeof(bl_name), "ssd1307fb%d", info->node);
+   bl = backlight_device_register(bl_name, >dev, par,
+  _bl_ops, NULL);
+   bl->props.brightness = contrast;
+   bl->props.max_brightness = MAX_CONTRAST;
+   info->bl_dev = bl;
+
+   if (IS_ERR(bl)) {
+   dev_err(>dev, "unable to register backlight device: 
%ld\n",
+   PTR_ERR(bl));
+   goto bl_init_error;
+   }
dev_info(>dev, "fb%d: %s framebuffer device registered, using 
%d bytes of video memory\n", info->node, info->fix.id, vmem_size);
 
return 0;
 
+bl_init_error:
+   unregister_framebuffer(info);
 panel_init_error:
if (par->device_info->need_pwm) {
pwm_disable(par->pwm);
@@ -630,6 +686,8 @@ static int ssd1307fb_remove(struct i2c_client *client)
 
ssd1307fb_write_cmd(par->client, SSD1307FB_DISPLAY_OFF);
 
+   backlight_device_unregister(info->bl_dev);
+
unregister_framebuffer(info);
if (par->device_info->need_pwm) {
pwm_disable(par->pwm);
-- 
2.3.0

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCHv5 00/11] Cleanup and add support for SSD1305

2015-03-24 Thread Thomas Niederprüm
Hi,

this patch series is the result of making the ssd1307fb driver work with
a Newhaven OLED display using the Solomon SSD1305 controller. To achieve
this the intialization code for the SSD1306 and the SSD1307 is merged
and based on DT configuration to reflect the various possible wirings
of the SSD130X controller (04/11). Based on these changes it is straight
forward to add support for the SSD1305 controller (06/11).

While working on the driver I realized that it was not possible to
correctly mmap the video memory from userspace since the address handed
to the userspace app is a logical one where it should be a physical one.
Patch 01/10 fixes this. Furthermore the memory reserved by kzalloc is
not page aligned while the address handed to userspace is aligned to the
next page frame. This problem is fixed by using __get_free_pages() in 02/11.

Furthermore a module parameter is added to set the delay for the
deferred io update (07/11). Also the backlight class is implemented to make
the contrast setting available in userspace (10/11).

changes since v1 (thanks to Maxime for the feedback):
- dedicated patch for fixing smem_start address
- remove page reserve upon vmalloc
- remove return value check upon display turn-off at module unload
- use a module parameter refreshrate rather than delaydivider
- allocate fbdefio dynamically
- use sysfs_create_groups to create sysfs entries
- remove contrast, vhcom and dclk properties from DT since they are
  not part of hw description. The contrast module parameter was added
  to set contrast at load time. vhcom and dclk stays at it's default
  values for now.
- add new DT properties to in tree users of ssd130X
- rebased to apply on top of linux-next

changes since v2 (thanks to Maxime again):
- free memory allocated by vmalloc on driver unload
- set default values in the init code to the ones of the existing ssd1307
  init code
- added two ACKs (Maxime Ripard)

changes since v3:
- use backlight class rather than dedicated sysfs files to set the 
  contrast (Thanks to Tomi Valkeinen)
- remove [PATCHv3 08/10] fbdev: ssd1307fb: Add module parameter bitsperpixel
- add new patch to blank the display (unreviewed)
- allocate video memory through __get_free_pages() rather than vmalloc
  (Thanks to Geert Uytterhoeven)
- minor rewordings of the commit messages

changes since v4 (thanks to Maxime):
- added two ACKs (Maxime Ripard)
- fixed typo: s/REFRASHRATE/REFRESHRATE
- updated the documentation to make clear the unit of com-offset
- move addition of the module parameter contrast to a separate patch (09/11)
- fix indentation errors
- get rid of device_id in the device_info struct


Thomas Niederprüm (11):
  fbdev: ssd1307fb: fix memory address smem_start.
  fbdev: ssd1307fb: Allocate page aligned video memory.
  of: Add Solomon Systech vendor prefix.
  fbdev: ssd1307fb: Unify init code and obtain hw specific bits from DT
  ARM: mxs: fix in tree users of ssd1306
  fbdev: ssd1307fb: Add support for SSD1305
  fbdev: ssd1307fb: Add a module parameter to set the refresh rate
  fbdev: ssd1307fb: Turn off display on driver unload.
  fbdev: ssd1307fb: Add module parameter to set the initial contrast
  fbdev: ssd1307fb: add backlight controls for setting the contrast
  fbdev: ssd1307fb: Add blank mode

 .../devicetree/bindings/vendor-prefixes.txt|   1 +
 .../devicetree/bindings/video/ssd1307fb.txt|  23 +-
 arch/arm/boot/dts/imx28-cfa10036.dts   |   3 +
 drivers/video/fbdev/Kconfig|   1 +
 drivers/video/fbdev/ssd1307fb.c| 310 +++--
 5 files changed, 250 insertions(+), 88 deletions(-)

-- 
2.3.0

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCHv5 08/11] fbdev: ssd1307fb: Turn off display on driver unload.

2015-03-24 Thread Thomas Niederprüm
This patch turns off the display when the driver is unloaded.

Signed-off-by: Thomas Niederprüm 
Acked-by: Maxime Ripard 
---
 drivers/video/fbdev/ssd1307fb.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/video/fbdev/ssd1307fb.c b/drivers/video/fbdev/ssd1307fb.c
index b38973e..6149827 100644
--- a/drivers/video/fbdev/ssd1307fb.c
+++ b/drivers/video/fbdev/ssd1307fb.c
@@ -625,6 +625,8 @@ static int ssd1307fb_remove(struct i2c_client *client)
struct fb_info *info = i2c_get_clientdata(client);
struct ssd1307fb_par *par = info->par;
 
+   ssd1307fb_write_cmd(par->client, SSD1307FB_DISPLAY_OFF);
+
unregister_framebuffer(info);
if (par->device_info->need_pwm) {
pwm_disable(par->pwm);
-- 
2.3.0

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCHv5 09/11] fbdev: ssd1307fb: Add module parameter to set the initial contrast

2015-03-24 Thread Thomas Niederprüm
This patch adds the module parameter "contrast" to determine the
contrast value that is used to initialize the display. This
setting applies to all instances of the driver.

Signed-off-by: Thomas Niederprüm 
---
 drivers/video/fbdev/ssd1307fb.c | 5 -
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/video/fbdev/ssd1307fb.c b/drivers/video/fbdev/ssd1307fb.c
index 6149827..d5aec5c 100644
--- a/drivers/video/fbdev/ssd1307fb.c
+++ b/drivers/video/fbdev/ssd1307fb.c
@@ -43,6 +43,9 @@
 static u_int refreshrate = REFRESHRATE;
 module_param(refreshrate, uint, 0);
 
+static u_int contrast = 127;
+module_param(contrast, uint, S_IRUGO);
+
 struct ssd1307fb_par;
 
 struct ssd1307fb_deviceinfo {
@@ -525,7 +528,7 @@ static int ssd1307fb_probe(struct i2c_client *client,
par->com_lrremap = of_property_read_bool(node, "solomon,com-lrremap");
par->com_invdir = of_property_read_bool(node, "solomon,com-invdir");
 
-   par->contrast = 127;
+   par->contrast = contrast;
par->vcomh = par->device_info->default_vcomh;
 
/* Setup display timing */
-- 
2.3.0

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCHv5 11/11] fbdev: ssd1307fb: Add blank mode

2015-03-24 Thread Thomas Niederprüm
This patch adds ssd1307fb_blank() to make the framebuffer capable
of blanking.

Signed-off-by: Thomas Niederprüm 
---
 drivers/video/fbdev/ssd1307fb.c | 13 +
 1 file changed, 13 insertions(+)

diff --git a/drivers/video/fbdev/ssd1307fb.c b/drivers/video/fbdev/ssd1307fb.c
index 061cc95..9101b27 100644
--- a/drivers/video/fbdev/ssd1307fb.c
+++ b/drivers/video/fbdev/ssd1307fb.c
@@ -238,6 +238,18 @@ static ssize_t ssd1307fb_write(struct fb_info *info, const 
char __user *buf,
return count;
 }
 
+static int ssd1307fb_blank(int blank_mode, struct fb_info *info)
+{
+   struct ssd1307fb_par *par = info->par;
+   int ret;
+
+   if (blank_mode != FB_BLANK_UNBLANK)
+   ret = ssd1307fb_write_cmd(par->client, SSD1307FB_DISPLAY_OFF);
+   else
+   ret = ssd1307fb_write_cmd(par->client, SSD1307FB_DISPLAY_ON);
+   return ret;
+}
+
 static void ssd1307fb_fillrect(struct fb_info *info, const struct fb_fillrect 
*rect)
 {
struct ssd1307fb_par *par = info->par;
@@ -263,6 +275,7 @@ static struct fb_ops ssd1307fb_ops = {
.owner  = THIS_MODULE,
.fb_read= fb_sys_read,
.fb_write   = ssd1307fb_write,
+   .fb_blank   = ssd1307fb_blank,
.fb_fillrect= ssd1307fb_fillrect,
.fb_copyarea= ssd1307fb_copyarea,
.fb_imageblit   = ssd1307fb_imageblit,
-- 
2.3.0

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCHv5 07/11] fbdev: ssd1307fb: Add a module parameter to set the refresh rate

2015-03-24 Thread Thomas Niederprüm
This patch adds the module parameter "refreshrate" to set delay for the
deferred io. The refresh rate is given in units of Hertz. The default
refresh rate is 1 Hz. The refresh rate set through the newly introduced
parameter applies to all instances of the driver and for now it is not
possible to change it individually.

Signed-off-by: Thomas Niederprüm 
---
 drivers/video/fbdev/ssd1307fb.c | 23 +--
 1 file changed, 17 insertions(+), 6 deletions(-)

diff --git a/drivers/video/fbdev/ssd1307fb.c b/drivers/video/fbdev/ssd1307fb.c
index 284c527..b38973e 100644
--- a/drivers/video/fbdev/ssd1307fb.c
+++ b/drivers/video/fbdev/ssd1307fb.c
@@ -38,6 +38,11 @@
 #defineSSD1307FB_SET_COM_PINS_CONFIG   0xda
 #defineSSD1307FB_SET_VCOMH 0xdb
 
+#define REFRESHRATE 1
+
+static u_int refreshrate = REFRESHRATE;
+module_param(refreshrate, uint, 0);
+
 struct ssd1307fb_par;
 
 struct ssd1307fb_deviceinfo {
@@ -263,11 +268,6 @@ static void ssd1307fb_deferred_io(struct fb_info *info,
ssd1307fb_update_display(info->par);
 }
 
-static struct fb_deferred_io ssd1307fb_defio = {
-   .delay  = HZ,
-   .deferred_io= ssd1307fb_deferred_io,
-};
-
 static int ssd1307fb_init(struct ssd1307fb_par *par)
 {
int ret;
@@ -471,6 +471,7 @@ static int ssd1307fb_probe(struct i2c_client *client,
 {
struct fb_info *info;
struct device_node *node = client->dev.of_node;
+   struct fb_deferred_io *ssd1307fb_defio;
u32 vmem_size;
struct ssd1307fb_par *par;
u8 *vmem;
@@ -541,10 +542,20 @@ static int ssd1307fb_probe(struct i2c_client *client,
goto fb_alloc_error;
}
 
+   ssd1307fb_defio = devm_kzalloc(>dev, sizeof(struct 
fb_deferred_io), GFP_KERNEL);
+   if (!ssd1307fb_defio) {
+   dev_err(>dev, "Couldn't allocate deferred io.\n");
+   ret = -ENOMEM;
+   goto fb_alloc_error;
+   }
+
+   ssd1307fb_defio->delay = HZ / refreshrate;
+   ssd1307fb_defio->deferred_io = ssd1307fb_deferred_io;
+
info->fbops = _ops;
info->fix = ssd1307fb_fix;
info->fix.line_length = par->width / 8;
-   info->fbdefio = _defio;
+   info->fbdefio = ssd1307fb_defio;
 
info->var = ssd1307fb_var;
info->var.xres = par->width;
-- 
2.3.0

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCHv5 02/11] fbdev: ssd1307fb: Allocate page aligned video memory.

2015-03-24 Thread Thomas Niederprüm
Currently the videomemory is allocated by kmalloc, making it a memory
region that is not necessarily page aligend. This leads to problems
upon mmap call, where the video memory's address gets aligned to the
next page boundary. The result is that the userspace program that issued
the mmap call is not able to access the video memory from the start to
the next page boundary.

This patch changes the allocation of the video memory to use
__get_free_pages() in order to obtain memory that is aligned
to page boundaries.

Signed-off-by: Thomas Niederprüm 
Acked-by: Maxime Ripard 
---
 drivers/video/fbdev/ssd1307fb.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/video/fbdev/ssd1307fb.c b/drivers/video/fbdev/ssd1307fb.c
index 61e0ce8..8d34c56 100644
--- a/drivers/video/fbdev/ssd1307fb.c
+++ b/drivers/video/fbdev/ssd1307fb.c
@@ -489,7 +489,8 @@ static int ssd1307fb_probe(struct i2c_client *client,
 
vmem_size = par->width * par->height / 8;
 
-   vmem = devm_kzalloc(>dev, vmem_size, GFP_KERNEL);
+   vmem = (void *)__get_free_pages(GFP_KERNEL | __GFP_ZERO,
+   get_order(vmem_size));
if (!vmem) {
dev_err(>dev, "Couldn't allocate graphical memory.\n");
ret = -ENOMEM;
@@ -573,6 +574,7 @@ static int ssd1307fb_remove(struct i2c_client *client)
if (par->ops->remove)
par->ops->remove(par);
fb_deferred_io_cleanup(info);
+   __free_pages(__va(info->fix.smem_start), get_order(info->fix.smem_len));
framebuffer_release(info);
 
return 0;
-- 
2.3.0

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCHv5 07/11] fbdev: ssd1307fb: Add a module parameter to set the refresh rate

2015-03-24 Thread Thomas Niederprüm
This patch adds the module parameter refreshrate to set delay for the
deferred io. The refresh rate is given in units of Hertz. The default
refresh rate is 1 Hz. The refresh rate set through the newly introduced
parameter applies to all instances of the driver and for now it is not
possible to change it individually.

Signed-off-by: Thomas Niederprüm nied...@physik.uni-kl.de
---
 drivers/video/fbdev/ssd1307fb.c | 23 +--
 1 file changed, 17 insertions(+), 6 deletions(-)

diff --git a/drivers/video/fbdev/ssd1307fb.c b/drivers/video/fbdev/ssd1307fb.c
index 284c527..b38973e 100644
--- a/drivers/video/fbdev/ssd1307fb.c
+++ b/drivers/video/fbdev/ssd1307fb.c
@@ -38,6 +38,11 @@
 #defineSSD1307FB_SET_COM_PINS_CONFIG   0xda
 #defineSSD1307FB_SET_VCOMH 0xdb
 
+#define REFRESHRATE 1
+
+static u_int refreshrate = REFRESHRATE;
+module_param(refreshrate, uint, 0);
+
 struct ssd1307fb_par;
 
 struct ssd1307fb_deviceinfo {
@@ -263,11 +268,6 @@ static void ssd1307fb_deferred_io(struct fb_info *info,
ssd1307fb_update_display(info-par);
 }
 
-static struct fb_deferred_io ssd1307fb_defio = {
-   .delay  = HZ,
-   .deferred_io= ssd1307fb_deferred_io,
-};
-
 static int ssd1307fb_init(struct ssd1307fb_par *par)
 {
int ret;
@@ -471,6 +471,7 @@ static int ssd1307fb_probe(struct i2c_client *client,
 {
struct fb_info *info;
struct device_node *node = client-dev.of_node;
+   struct fb_deferred_io *ssd1307fb_defio;
u32 vmem_size;
struct ssd1307fb_par *par;
u8 *vmem;
@@ -541,10 +542,20 @@ static int ssd1307fb_probe(struct i2c_client *client,
goto fb_alloc_error;
}
 
+   ssd1307fb_defio = devm_kzalloc(client-dev, sizeof(struct 
fb_deferred_io), GFP_KERNEL);
+   if (!ssd1307fb_defio) {
+   dev_err(client-dev, Couldn't allocate deferred io.\n);
+   ret = -ENOMEM;
+   goto fb_alloc_error;
+   }
+
+   ssd1307fb_defio-delay = HZ / refreshrate;
+   ssd1307fb_defio-deferred_io = ssd1307fb_deferred_io;
+
info-fbops = ssd1307fb_ops;
info-fix = ssd1307fb_fix;
info-fix.line_length = par-width / 8;
-   info-fbdefio = ssd1307fb_defio;
+   info-fbdefio = ssd1307fb_defio;
 
info-var = ssd1307fb_var;
info-var.xres = par-width;
-- 
2.3.0

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCHv5 02/11] fbdev: ssd1307fb: Allocate page aligned video memory.

2015-03-24 Thread Thomas Niederprüm
Currently the videomemory is allocated by kmalloc, making it a memory
region that is not necessarily page aligend. This leads to problems
upon mmap call, where the video memory's address gets aligned to the
next page boundary. The result is that the userspace program that issued
the mmap call is not able to access the video memory from the start to
the next page boundary.

This patch changes the allocation of the video memory to use
__get_free_pages() in order to obtain memory that is aligned
to page boundaries.

Signed-off-by: Thomas Niederprüm nied...@physik.uni-kl.de
Acked-by: Maxime Ripard maxime.rip...@free-electrons.com
---
 drivers/video/fbdev/ssd1307fb.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/video/fbdev/ssd1307fb.c b/drivers/video/fbdev/ssd1307fb.c
index 61e0ce8..8d34c56 100644
--- a/drivers/video/fbdev/ssd1307fb.c
+++ b/drivers/video/fbdev/ssd1307fb.c
@@ -489,7 +489,8 @@ static int ssd1307fb_probe(struct i2c_client *client,
 
vmem_size = par-width * par-height / 8;
 
-   vmem = devm_kzalloc(client-dev, vmem_size, GFP_KERNEL);
+   vmem = (void *)__get_free_pages(GFP_KERNEL | __GFP_ZERO,
+   get_order(vmem_size));
if (!vmem) {
dev_err(client-dev, Couldn't allocate graphical memory.\n);
ret = -ENOMEM;
@@ -573,6 +574,7 @@ static int ssd1307fb_remove(struct i2c_client *client)
if (par-ops-remove)
par-ops-remove(par);
fb_deferred_io_cleanup(info);
+   __free_pages(__va(info-fix.smem_start), get_order(info-fix.smem_len));
framebuffer_release(info);
 
return 0;
-- 
2.3.0

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCHv5 11/11] fbdev: ssd1307fb: Add blank mode

2015-03-24 Thread Thomas Niederprüm
This patch adds ssd1307fb_blank() to make the framebuffer capable
of blanking.

Signed-off-by: Thomas Niederprüm nied...@physik.uni-kl.de
---
 drivers/video/fbdev/ssd1307fb.c | 13 +
 1 file changed, 13 insertions(+)

diff --git a/drivers/video/fbdev/ssd1307fb.c b/drivers/video/fbdev/ssd1307fb.c
index 061cc95..9101b27 100644
--- a/drivers/video/fbdev/ssd1307fb.c
+++ b/drivers/video/fbdev/ssd1307fb.c
@@ -238,6 +238,18 @@ static ssize_t ssd1307fb_write(struct fb_info *info, const 
char __user *buf,
return count;
 }
 
+static int ssd1307fb_blank(int blank_mode, struct fb_info *info)
+{
+   struct ssd1307fb_par *par = info-par;
+   int ret;
+
+   if (blank_mode != FB_BLANK_UNBLANK)
+   ret = ssd1307fb_write_cmd(par-client, SSD1307FB_DISPLAY_OFF);
+   else
+   ret = ssd1307fb_write_cmd(par-client, SSD1307FB_DISPLAY_ON);
+   return ret;
+}
+
 static void ssd1307fb_fillrect(struct fb_info *info, const struct fb_fillrect 
*rect)
 {
struct ssd1307fb_par *par = info-par;
@@ -263,6 +275,7 @@ static struct fb_ops ssd1307fb_ops = {
.owner  = THIS_MODULE,
.fb_read= fb_sys_read,
.fb_write   = ssd1307fb_write,
+   .fb_blank   = ssd1307fb_blank,
.fb_fillrect= ssd1307fb_fillrect,
.fb_copyarea= ssd1307fb_copyarea,
.fb_imageblit   = ssd1307fb_imageblit,
-- 
2.3.0

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCHv5 09/11] fbdev: ssd1307fb: Add module parameter to set the initial contrast

2015-03-24 Thread Thomas Niederprüm
This patch adds the module parameter contrast to determine the
contrast value that is used to initialize the display. This
setting applies to all instances of the driver.

Signed-off-by: Thomas Niederprüm nied...@physik.uni-kl.de
---
 drivers/video/fbdev/ssd1307fb.c | 5 -
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/video/fbdev/ssd1307fb.c b/drivers/video/fbdev/ssd1307fb.c
index 6149827..d5aec5c 100644
--- a/drivers/video/fbdev/ssd1307fb.c
+++ b/drivers/video/fbdev/ssd1307fb.c
@@ -43,6 +43,9 @@
 static u_int refreshrate = REFRESHRATE;
 module_param(refreshrate, uint, 0);
 
+static u_int contrast = 127;
+module_param(contrast, uint, S_IRUGO);
+
 struct ssd1307fb_par;
 
 struct ssd1307fb_deviceinfo {
@@ -525,7 +528,7 @@ static int ssd1307fb_probe(struct i2c_client *client,
par-com_lrremap = of_property_read_bool(node, solomon,com-lrremap);
par-com_invdir = of_property_read_bool(node, solomon,com-invdir);
 
-   par-contrast = 127;
+   par-contrast = contrast;
par-vcomh = par-device_info-default_vcomh;
 
/* Setup display timing */
-- 
2.3.0

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCHv5 08/11] fbdev: ssd1307fb: Turn off display on driver unload.

2015-03-24 Thread Thomas Niederprüm
This patch turns off the display when the driver is unloaded.

Signed-off-by: Thomas Niederprüm nied...@physik.uni-kl.de
Acked-by: Maxime Ripard maxime.rip...@free-electrons.com
---
 drivers/video/fbdev/ssd1307fb.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/video/fbdev/ssd1307fb.c b/drivers/video/fbdev/ssd1307fb.c
index b38973e..6149827 100644
--- a/drivers/video/fbdev/ssd1307fb.c
+++ b/drivers/video/fbdev/ssd1307fb.c
@@ -625,6 +625,8 @@ static int ssd1307fb_remove(struct i2c_client *client)
struct fb_info *info = i2c_get_clientdata(client);
struct ssd1307fb_par *par = info-par;
 
+   ssd1307fb_write_cmd(par-client, SSD1307FB_DISPLAY_OFF);
+
unregister_framebuffer(info);
if (par-device_info-need_pwm) {
pwm_disable(par-pwm);
-- 
2.3.0

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCHv5 01/11] fbdev: ssd1307fb: fix memory address smem_start.

2015-03-24 Thread Thomas Niederprüm
the smem_start pointer of the framebuffer info struct needs to hold the
physical address rather than the logical address. Right now the logical
address returned by kmalloc is stored. This patch converts this address
to a physical address and thus fixes a driver crash on mmaping the
framebuffer memory due to an access to the wrong memory address.

Signed-off-by: Thomas Niederprüm nied...@physik.uni-kl.de
Acked-by: Maxime Ripard maxime.rip...@free-electrons.com
---
 drivers/video/fbdev/ssd1307fb.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/video/fbdev/ssd1307fb.c b/drivers/video/fbdev/ssd1307fb.c
index f7ed6d9..61e0ce8 100644
--- a/drivers/video/fbdev/ssd1307fb.c
+++ b/drivers/video/fbdev/ssd1307fb.c
@@ -515,7 +515,7 @@ static int ssd1307fb_probe(struct i2c_client *client,
info-var.blue.offset = 0;
 
info-screen_base = (u8 __force __iomem *)vmem;
-   info-fix.smem_start = (unsigned long)vmem;
+   info-fix.smem_start = __pa(vmem);
info-fix.smem_len = vmem_size;
 
fb_deferred_io_init(info);
-- 
2.3.0

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCHv5 00/11] Cleanup and add support for SSD1305

2015-03-24 Thread Thomas Niederprüm
Hi,

this patch series is the result of making the ssd1307fb driver work with
a Newhaven OLED display using the Solomon SSD1305 controller. To achieve
this the intialization code for the SSD1306 and the SSD1307 is merged
and based on DT configuration to reflect the various possible wirings
of the SSD130X controller (04/11). Based on these changes it is straight
forward to add support for the SSD1305 controller (06/11).

While working on the driver I realized that it was not possible to
correctly mmap the video memory from userspace since the address handed
to the userspace app is a logical one where it should be a physical one.
Patch 01/10 fixes this. Furthermore the memory reserved by kzalloc is
not page aligned while the address handed to userspace is aligned to the
next page frame. This problem is fixed by using __get_free_pages() in 02/11.

Furthermore a module parameter is added to set the delay for the
deferred io update (07/11). Also the backlight class is implemented to make
the contrast setting available in userspace (10/11).

changes since v1 (thanks to Maxime for the feedback):
- dedicated patch for fixing smem_start address
- remove page reserve upon vmalloc
- remove return value check upon display turn-off at module unload
- use a module parameter refreshrate rather than delaydivider
- allocate fbdefio dynamically
- use sysfs_create_groups to create sysfs entries
- remove contrast, vhcom and dclk properties from DT since they are
  not part of hw description. The contrast module parameter was added
  to set contrast at load time. vhcom and dclk stays at it's default
  values for now.
- add new DT properties to in tree users of ssd130X
- rebased to apply on top of linux-next

changes since v2 (thanks to Maxime again):
- free memory allocated by vmalloc on driver unload
- set default values in the init code to the ones of the existing ssd1307
  init code
- added two ACKs (Maxime Ripard)

changes since v3:
- use backlight class rather than dedicated sysfs files to set the 
  contrast (Thanks to Tomi Valkeinen)
- remove [PATCHv3 08/10] fbdev: ssd1307fb: Add module parameter bitsperpixel
- add new patch to blank the display (unreviewed)
- allocate video memory through __get_free_pages() rather than vmalloc
  (Thanks to Geert Uytterhoeven)
- minor rewordings of the commit messages

changes since v4 (thanks to Maxime):
- added two ACKs (Maxime Ripard)
- fixed typo: s/REFRASHRATE/REFRESHRATE
- updated the documentation to make clear the unit of com-offset
- move addition of the module parameter contrast to a separate patch (09/11)
- fix indentation errors
- get rid of device_id in the device_info struct


Thomas Niederprüm (11):
  fbdev: ssd1307fb: fix memory address smem_start.
  fbdev: ssd1307fb: Allocate page aligned video memory.
  of: Add Solomon Systech vendor prefix.
  fbdev: ssd1307fb: Unify init code and obtain hw specific bits from DT
  ARM: mxs: fix in tree users of ssd1306
  fbdev: ssd1307fb: Add support for SSD1305
  fbdev: ssd1307fb: Add a module parameter to set the refresh rate
  fbdev: ssd1307fb: Turn off display on driver unload.
  fbdev: ssd1307fb: Add module parameter to set the initial contrast
  fbdev: ssd1307fb: add backlight controls for setting the contrast
  fbdev: ssd1307fb: Add blank mode

 .../devicetree/bindings/vendor-prefixes.txt|   1 +
 .../devicetree/bindings/video/ssd1307fb.txt|  23 +-
 arch/arm/boot/dts/imx28-cfa10036.dts   |   3 +
 drivers/video/fbdev/Kconfig|   1 +
 drivers/video/fbdev/ssd1307fb.c| 310 +++--
 5 files changed, 250 insertions(+), 88 deletions(-)

-- 
2.3.0

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCHv5 10/11] fbdev: ssd1307fb: add backlight controls for setting the contrast

2015-03-24 Thread Thomas Niederprüm
The backlight class is used to create userspace handles for
setting the OLED contrast.

Signed-off-by: Thomas Niederprüm nied...@physik.uni-kl.de
Acked-by: Maxime Ripard maxime.rip...@free-electrons.com
---
 drivers/video/fbdev/Kconfig |  1 +
 drivers/video/fbdev/ssd1307fb.c | 58 +
 2 files changed, 59 insertions(+)

diff --git a/drivers/video/fbdev/Kconfig b/drivers/video/fbdev/Kconfig
index b3dd417..da70bae 100644
--- a/drivers/video/fbdev/Kconfig
+++ b/drivers/video/fbdev/Kconfig
@@ -2478,6 +2478,7 @@ config FB_SSD1307
select FB_SYS_IMAGEBLIT
select FB_DEFERRED_IO
select PWM
+   select FB_BACKLIGHT
help
  This driver implements support for the Solomon SSD1307
  OLED controller over I2C.
diff --git a/drivers/video/fbdev/ssd1307fb.c b/drivers/video/fbdev/ssd1307fb.c
index d5aec5c..061cc95 100644
--- a/drivers/video/fbdev/ssd1307fb.c
+++ b/drivers/video/fbdev/ssd1307fb.c
@@ -7,6 +7,7 @@
  */
 
 #include linux/module.h
+#include linux/backlight.h
 #include linux/kernel.h
 #include linux/i2c.h
 #include linux/fb.h
@@ -38,6 +39,8 @@
 #defineSSD1307FB_SET_COM_PINS_CONFIG   0xda
 #defineSSD1307FB_SET_VCOMH 0xdb
 
+#define MAX_CONTRAST 255
+
 #define REFRESHRATE 1
 
 static u_int refreshrate = REFRESHRATE;
@@ -428,6 +431,43 @@ static int ssd1307fb_init(struct ssd1307fb_par *par)
return 0;
 }
 
+static int ssd1307fb_update_bl(struct backlight_device *bdev)
+{
+   struct ssd1307fb_par *par = bl_get_data(bdev);
+   int ret;
+   int brightness = bdev-props.brightness;
+
+   par-contrast = brightness;
+
+   ret = ssd1307fb_write_cmd(par-client, SSD1307FB_CONTRAST);
+   if (ret  0)
+   return ret;
+   ret = ssd1307fb_write_cmd(par-client, par-contrast);
+   if (ret  0)
+   return ret;
+   return 0;
+}
+
+static int ssd1307fb_get_brightness(struct backlight_device *bdev)
+{
+   struct ssd1307fb_par *par = bl_get_data(bdev);
+
+   return par-contrast;
+}
+
+static int ssd1307fb_check_fb(struct backlight_device *bdev,
+  struct fb_info *info)
+{
+   return (info-bl_dev == bdev);
+}
+
+static const struct backlight_ops ssd1307fb_bl_ops = {
+   .options= BL_CORE_SUSPENDRESUME,
+   .update_status  = ssd1307fb_update_bl,
+   .get_brightness = ssd1307fb_get_brightness,
+   .check_fb   = ssd1307fb_check_fb,
+};
+
 static struct ssd1307fb_deviceinfo ssd1307fb_ssd1305_deviceinfo = {
.default_vcomh = 0x34,
.default_dclk_div = 0,
@@ -472,6 +512,8 @@ MODULE_DEVICE_TABLE(of, ssd1307fb_of_match);
 static int ssd1307fb_probe(struct i2c_client *client,
   const struct i2c_device_id *id)
 {
+   struct backlight_device *bl;
+   char bl_name[12];
struct fb_info *info;
struct device_node *node = client-dev.of_node;
struct fb_deferred_io *ssd1307fb_defio;
@@ -607,10 +649,24 @@ static int ssd1307fb_probe(struct i2c_client *client,
goto panel_init_error;
}
 
+   snprintf(bl_name, sizeof(bl_name), ssd1307fb%d, info-node);
+   bl = backlight_device_register(bl_name, client-dev, par,
+  ssd1307fb_bl_ops, NULL);
+   bl-props.brightness = contrast;
+   bl-props.max_brightness = MAX_CONTRAST;
+   info-bl_dev = bl;
+
+   if (IS_ERR(bl)) {
+   dev_err(client-dev, unable to register backlight device: 
%ld\n,
+   PTR_ERR(bl));
+   goto bl_init_error;
+   }
dev_info(client-dev, fb%d: %s framebuffer device registered, using 
%d bytes of video memory\n, info-node, info-fix.id, vmem_size);
 
return 0;
 
+bl_init_error:
+   unregister_framebuffer(info);
 panel_init_error:
if (par-device_info-need_pwm) {
pwm_disable(par-pwm);
@@ -630,6 +686,8 @@ static int ssd1307fb_remove(struct i2c_client *client)
 
ssd1307fb_write_cmd(par-client, SSD1307FB_DISPLAY_OFF);
 
+   backlight_device_unregister(info-bl_dev);
+
unregister_framebuffer(info);
if (par-device_info-need_pwm) {
pwm_disable(par-pwm);
-- 
2.3.0

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCHv5 05/11] ARM: mxs: fix in tree users of ssd1306

2015-03-24 Thread Thomas Niederprüm
This patch updates the in tree-users of the SSD1306 controller for using
the newly introduced DT properties.

Signed-off-by: Thomas Niederprüm nied...@physik.uni-kl.de
---
 arch/arm/boot/dts/imx28-cfa10036.dts | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/arch/arm/boot/dts/imx28-cfa10036.dts 
b/arch/arm/boot/dts/imx28-cfa10036.dts
index b04b6b8..570aa33 100644
--- a/arch/arm/boot/dts/imx28-cfa10036.dts
+++ b/arch/arm/boot/dts/imx28-cfa10036.dts
@@ -99,6 +99,9 @@
solomon,height = 32;
solomon,width = 128;
solomon,page-offset = 0;
+   solomon,com-lrremap;
+   solomon,com-invdir;
+   solomon,com-offset = 32;
};
};
 
-- 
2.3.0

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCHv5 03/11] of: Add Solomon Systech vendor prefix.

2015-03-24 Thread Thomas Niederprüm
This patch adds the solomon prefix for Solomon Systech Limited.

Signed-off-by: Thomas Niederprüm nied...@physik.uni-kl.de
---
 Documentation/devicetree/bindings/vendor-prefixes.txt | 1 +
 1 file changed, 1 insertion(+)

diff --git a/Documentation/devicetree/bindings/vendor-prefixes.txt 
b/Documentation/devicetree/bindings/vendor-prefixes.txt
index d3f4809..933c8f5 100644
--- a/Documentation/devicetree/bindings/vendor-prefixes.txt
+++ b/Documentation/devicetree/bindings/vendor-prefixes.txt
@@ -169,6 +169,7 @@ sitronixSitronix Technology Corporation
 smsc   Standard Microsystems Corporation
 snps   Synopsys, Inc.
 solidrun   SolidRun
+solomonSolomon Systech Limited
 sony   Sony Corporation
 spansion   Spansion Inc.
 sprd   Spreadtrum Communications Inc.
-- 
2.3.0

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCHv5 06/11] fbdev: ssd1307fb: Add support for SSD1305

2015-03-24 Thread Thomas Niederprüm
This patch adds support for the SSD1305 OLED controller.

Signed-off-by: Thomas Niederprüm nied...@physik.uni-kl.de
---
 Documentation/devicetree/bindings/video/ssd1307fb.txt |  2 +-
 drivers/video/fbdev/ssd1307fb.c   | 13 +
 2 files changed, 14 insertions(+), 1 deletion(-)

diff --git a/Documentation/devicetree/bindings/video/ssd1307fb.txt 
b/Documentation/devicetree/bindings/video/ssd1307fb.txt
index 637690f..acdf1ae 100644
--- a/Documentation/devicetree/bindings/video/ssd1307fb.txt
+++ b/Documentation/devicetree/bindings/video/ssd1307fb.txt
@@ -2,7 +2,7 @@
 
 Required properties:
   - compatible: Should be solomon,chipfb-bus. The only supported bus for
-now is i2c, and the supported chips are ssd1306 and ssd1307.
+now is i2c, and the supported chips are ssd1305, ssd1306 and ssd1307.
   - reg: Should contain address of the controller on the I2C bus. Most likely
  0x3c or 0x3d
   - pwm: Should contain the pwm to use according to the OF device tree PWM
diff --git a/drivers/video/fbdev/ssd1307fb.c b/drivers/video/fbdev/ssd1307fb.c
index d16aad4..284c527 100644
--- a/drivers/video/fbdev/ssd1307fb.c
+++ b/drivers/video/fbdev/ssd1307fb.c
@@ -425,6 +425,14 @@ static int ssd1307fb_init(struct ssd1307fb_par *par)
return 0;
 }
 
+static struct ssd1307fb_deviceinfo ssd1307fb_ssd1305_deviceinfo = {
+   .default_vcomh = 0x34,
+   .default_dclk_div = 0,
+   .default_dclk_frq = 7,
+   .need_pwm = 0,
+   .need_chargepump = 0,
+};
+
 static struct ssd1307fb_deviceinfo ssd1307fb_ssd1306_deviceinfo = {
.default_vcomh = 0x20,
.default_dclk_div = 0,
@@ -443,6 +451,10 @@ static struct ssd1307fb_deviceinfo 
ssd1307fb_ssd1307_deviceinfo = {
 
 static const struct of_device_id ssd1307fb_of_match[] = {
{
+   .compatible = solomon,ssd1305fb-i2c,
+   .data = (void *)ssd1307fb_ssd1305_deviceinfo,
+   },
+   {
.compatible = solomon,ssd1306fb-i2c,
.data = (void *)ssd1307fb_ssd1306_deviceinfo,
},
@@ -615,6 +627,7 @@ static int ssd1307fb_remove(struct i2c_client *client)
 }
 
 static const struct i2c_device_id ssd1307fb_i2c_id[] = {
+   { ssd1305fb, 0 },
{ ssd1306fb, 0 },
{ ssd1307fb, 0 },
{ }
-- 
2.3.0

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCHv5 04/11] fbdev: ssd1307fb: Unify init code and obtain hw specific bits from DT

2015-03-24 Thread Thomas Niederprüm
The 130X controllers are very similar from the configuration point of view.
The configuration registers for the SSD1305/6/7 are bit identical (except the
the VHCOM register and the the default values for clock setup register). This
patch unifies the init code of the controller and adds hardware specific
properties to DT that are needed to correctly initialize the device.

The SSD130X can be wired to the OLED panel in various ways. Even for the
same controller this wiring can differ from one display module to another
and can not be probed by software. The added DT properties reflect these
hardware decisions of the display module manufacturer.
The 'com-sequential', 'com-lrremap' and 'com-invdir' values define different
possibilities for the COM signals pin configuration and readout direction
of the video memory. The 'segment-no-remap' allows the inversion of the
memory-to-pin mapping ultimately inverting the order of the controllers
output pins. The 'prechargepX' values need to be adapted according to the
capacitance of the OLEDs pixel cells.

So far these hardware specific bits are hard coded in the init code, making
the driver usable only for one certain wiring of the controller. This patch
makes the driver usable with all possible hardware setups, given a valid hw
description in DT. If these values are not set in DT the default values,
as they are set in the ssd1307 init code right now, are used. This implies
that without the corresponding DT property segment-no-remap the segment
remap of the ssd130X controller gets activated. Even though this is not the
default behaviour according to the datasheet it maintains backward
compatibility with older DTBs.

Note that the SSD1306 does not seem to be using the configuration written to
the registers at all. Therefore this patch does not try to maintain these
values without changes in DT. For reference an example is added to the DT
bindings documentation that reproduces the configuration that is set in the
current init code.

Signed-off-by: Thomas Niederprüm nied...@physik.uni-kl.de
---
 .../devicetree/bindings/video/ssd1307fb.txt|  21 +++
 drivers/video/fbdev/ssd1307fb.c| 192 -
 2 files changed, 134 insertions(+), 79 deletions(-)

diff --git a/Documentation/devicetree/bindings/video/ssd1307fb.txt 
b/Documentation/devicetree/bindings/video/ssd1307fb.txt
index 7a12542..637690f 100644
--- a/Documentation/devicetree/bindings/video/ssd1307fb.txt
+++ b/Documentation/devicetree/bindings/video/ssd1307fb.txt
@@ -15,6 +15,16 @@ Required properties:
 
 Optional properties:
   - reset-active-low: Is the reset gpio is active on physical low?
+  - solomon,segment-no-remap: Display needs normal (non-inverted) data column
+  to segment mapping
+  - solomon,com-sequential: Display uses sequential COM pin configuration
+  - solomon,com-lrremap: Display uses left-right COM pin remap
+  - solomon,com-invdir: Display uses inverted COM pin scan direction
+  - solomon,com-offset: Number of the COM pin wired to the first display line
+  - solomon,prechargep1: Length of deselect period (phase 1) in clock cycles.
+  - solomon,prechargep2: Length of precharge period (phase 2) in clock cycles.
+ This needs to be the higher, the higher the 
capacitance
+ of the OLED's pixels is
 
 [0]: Documentation/devicetree/bindings/pwm/pwm.txt
 
@@ -26,3 +36,14 @@ ssd1307: oled@3c {
 reset-gpios = gpio2 7;
 reset-active-low;
 };
+
+ssd1306: oled@3c {
+compatible = solomon,ssd1306fb-i2c;
+reg = 0x3c;
+pwms = pwm 4 3000;
+reset-gpios = gpio2 7;
+reset-active-low;
+solomon,com-lrremap;
+solomon,com-invdir;
+solomon,com-offset = 32;
+};
diff --git a/drivers/video/fbdev/ssd1307fb.c b/drivers/video/fbdev/ssd1307fb.c
index 8d34c56..d16aad4 100644
--- a/drivers/video/fbdev/ssd1307fb.c
+++ b/drivers/video/fbdev/ssd1307fb.c
@@ -40,20 +40,34 @@
 
 struct ssd1307fb_par;
 
-struct ssd1307fb_ops {
-   int (*init)(struct ssd1307fb_par *);
-   int (*remove)(struct ssd1307fb_par *);
+struct ssd1307fb_deviceinfo {
+   u32 default_vcomh;
+   u32 default_dclk_div;
+   u32 default_dclk_frq;
+   int need_pwm;
+   int need_chargepump;
 };
 
 struct ssd1307fb_par {
+   u32 com_invdir;
+   u32 com_lrremap;
+   u32 com_offset;
+   u32 com_seq;
+   u32 contrast;
+   u32 dclk_div;
+   u32 dclk_frq;
+   struct ssd1307fb_deviceinfo *device_info;
struct i2c_client *client;
u32 height;
struct fb_info *info;
-   struct ssd1307fb_ops *ops;
u32 page_offset;
+   u32 prechargep1;
+   u32 prechargep2;
struct pwm_device *pwm;
u32 pwm_period;
int reset;
+   u32 seg_remap;
+   u32 vcomh;
u32 width;
 };
 
@@ -254,69 +268,46 @@ static struct fb_deferred_io ssd1307fb_defio = {
.deferred_io

Re: [PATCHv4 04/10] fbdev: ssd1307fb: Unify init code and obtain hw specific bits from DT

2015-03-20 Thread Thomas Niederprüm
Am Wed, 18 Mar 2015 20:27:19 +0100
schrieb Maxime Ripard :

> Hi Thomas,
> 
> On Mon, Mar 16, 2015 at 06:11:52PM +0100, Thomas Niederprüm wrote:
> > The 130X controllers are very similar from the configuration point
> > of view. The configuration registers for the SSD1305/6/7 are bit
> > identical (except the the VHCOM register and the the default values
> > for clock setup register). This patch unifies the init code of the
> > controller and adds hardware specific properties to DT that are
> > needed to correctly initialize the device.
> > 
> > The SSD130X can be wired to the OLED panel in various ways. Even
> > for the same controller this wiring can differ from one display
> > module to another and can not be probed by software. The added DT
> > properties reflect these hardware decisions of the display module
> > manufacturer. The 'com-sequential', 'com-lrremap' and 'com-invdir'
> > values define different possibilities for the COM signals pin
> > configuration and readout direction of the video memory. The
> > 'segment-no-remap' allows the inversion of the memory-to-pin
> > mapping ultimately inverting the order of the controllers output
> > pins. The 'prechargepX' values need to be adapted according the
> > capacitance of the OLEDs pixel cells.
> > 
> > So far these hardware specific bits are hard coded in the init
> > code, making the driver usable only for one certain wiring of the
> > controller. This patch makes the driver usable with all possible
> > hardware setups, given a valid hw description in DT. If these
> > values are not set in DT the default values, as they are set in the
> > ssd1307 init code right now, are used. This implies that without
> > the corresponding DT property "segment-no-remap" the segment remap
> > of the ssd130X controller gets activated. Even though this is not
> > the default behaviour according to the datasheet it maintains
> > backward compatibility with older DTBs.
> > 
> > Note that the SSD1306 does not seem to be using the configuration
> > written to the registers at all. Therefore this patch does not try
> > to maintain these values without changes in DT. For reference an
> > example is added to the DT bindings documentation that reproduces
> > the configuration that is set in the current init code.
> > 
> > Signed-off-by: Thomas Niederprüm 
> 
> This looks mostly fine, thanks for your effort on this.
> 
> > ---
> >  .../devicetree/bindings/video/ssd1307fb.txt|  21 +++
> >  drivers/video/fbdev/ssd1307fb.c| 195
> > - 2 files changed, 137 insertions(+), 79
> > deletions(-)
> > 
> > diff --git a/Documentation/devicetree/bindings/video/ssd1307fb.txt
> > b/Documentation/devicetree/bindings/video/ssd1307fb.txt index
> > 7a12542..be27562 100644 ---
> > a/Documentation/devicetree/bindings/video/ssd1307fb.txt +++
> > b/Documentation/devicetree/bindings/video/ssd1307fb.txt @@ -15,6
> > +15,16 @@ Required properties: 
> >  Optional properties:
> >- reset-active-low: Is the reset gpio is active on physical low?
> > +  - solomon,segment-no-remap: Display needs normal (non-inverted)
> > data column
> > +  to segment mapping
> > +  - solomon,com-sequential: Display uses sequential COM pin
> > configuration
> > +  - solomon,com-lrremap: Display uses left-right COM pin remap
> > +  - solomon,com-invdir: Display uses inverted COM pin scan
> > direction
> > +  - solomon,com-offset: Offset of the first COM pin wired to the
> > panel
> 
> Documenting the offset unit would be fine.

The com-offset determines which line of the display panel should
receive the first line of video memory. When designing your display
module you could decide to do something crazy and connect the first
lines of your panel to  (for example) pin COM32 onward. By setting the
com-offset to 32 you could still recover the correct image on your
panel. So in some sense the unit of the com-offset is display lines or
number of pins, depending on whether you see it from the controller
side or from the panel side. I will update the documentation to reflect
this.

> 
> > +  - solomon,prechargep1: Length of deselect period (phase 1) in
> > clock cycles.
> > +  - solomon,prechargep2: Length of precharge period (phase 2) in
> > clock cycles.
> > + This needs to be the higher, the higher
> > the capacitance
> > + of the OLED's pixels is
> >  
> >  [0]: Documentation/devicetree/bindings/pwm/pwm.txt
> >  
> > @@ -26,3 +36,14 @@ ssd1307:

Re: [PATCHv4 07/10] fbdev: ssd1307fb: Add a module parameter to set the refresh rate

2015-03-20 Thread Thomas Niederprüm
Am Thu, 19 Mar 2015 14:18:24 +0100
schrieb Maxime Ripard :

> On Mon, Mar 16, 2015 at 06:11:55PM +0100, Thomas Niederprüm wrote:
> > This patch adds the module parameter "refreshrate" to set delay for
> > the deferred io. The refresh rate is given in units of Hertz. The
> > default refresh rate is 1 Hz. The refresh rate set through the
> > newly introduced parameter applies to all instances of the driver
> > and for now it is not possible to change it individually.
> > 
> > Signed-off-by: Thomas Niederprüm 
> > ---
> >  drivers/video/fbdev/ssd1307fb.c | 23 +--
> >  1 file changed, 17 insertions(+), 6 deletions(-)
> > 
> > diff --git a/drivers/video/fbdev/ssd1307fb.c
> > b/drivers/video/fbdev/ssd1307fb.c index 6fecec8..8a8d305 100644
> > --- a/drivers/video/fbdev/ssd1307fb.c
> > +++ b/drivers/video/fbdev/ssd1307fb.c
> > @@ -42,6 +42,11 @@
> >  #defineSSD1307FB_SET_COM_PINS_CONFIG   0xda
> >  #defineSSD1307FB_SET_VCOMH 0xdb
> >  
> > +#define REFRASHRATE 1
> > +
> > +static u_int refreshrate = REFRASHRATE;
> 
> s/REFRASH/REFRESH/ :)

It's written the wrong way and the right way in the same line :) Of
course I will fix that.

Thanks,
Thomas
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH 4/8] fbdev: ssd1307fb: Use vmalloc to allocate video memory.

2015-03-20 Thread Thomas Niederprüm
Am Fri, 20 Mar 2015 17:25:29 +0200
schrieb Tomi Valkeinen :

> On 20/03/15 16:47, Maxime Ripard wrote:
> > On Fri, Mar 20, 2015 at 01:37:50PM +0200, Tomi Valkeinen wrote:
> >> On 15/03/15 00:02, Geert Uytterhoeven wrote:
> >>> On Fri, Mar 13, 2015 at 10:31 PM, Thomas Niederprüm
> >>>  wrote:
> >>>> Am Tue, 10 Mar 2015 13:28:25 +0200
> >>>> schrieb Tomi Valkeinen :
> >>>>> Also, isn't doing __pa() for the memory returned by vmalloc
> >>>>> plain wrong?
> >>>>
> >>>>> What was the crash about when using kmalloc? It would be good
> >>>>> to fix defio, as I don't see why it should not work with
> >>>>> kmalloced memory.
> >>>>
> >>>> The main challenge here is that the memory handed to userspace
> >>>> upon mmap call needs to be page aligned. The memory returned by
> >>>> kmalloc has no such alignment, but the pointer presented to the
> >>>> userspace program gets aligned to next page boundary. It's not
> >>>> clear to me whether there is an easy way to obtain page aligned
> >>>> kmalloc memory. Memory allocated by vmalloc on the other hand is
> >>>> always aligned to page boundaries. This is why I chose to go for
> >>>> vmalloc.
> >>>
> >>> __get_free_pages()?
> >>
> >> I'm not that experienced with mem management, so I have to ask...
> >> __get_free_pages() probably works fine, but isn't vmalloc better
> >> here?
> >>
> >> __get_free_pages() will give you possibly a lot more memory than
> >> you need. And the memory is contiguous, so it could be difficult
> >> to allocate a larger memory area. The driver doesn't need
> >> contiguous memory (except in the virtual sense).
> > 
> > vmalloc also returns pages, so the size will be page-aligned. It
> > doesn't make much of a difference here, since we will only use a
> > single page in both case (the max resolution of these screens is
> > 128x39, with one bit per pixel).
> 
> Ok, that's not much, then =).
> 
> In that case __get_free_pages sounds fine. Even if the resolution
> would be slightly higher, we're only talking about a page or two
> extra.
> 
> Usually double-underscore in front of a func means "don't call this".
> I don't know why this one has the underscores.

This irritated me as well. But since it turned out that there is even a
section on "get_free_page and Friends" in LDD3 that talks about
__get_free_pages() without any word of caution, I assumed it's ok to
call this functions.

Thomas
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH 4/8] fbdev: ssd1307fb: Use vmalloc to allocate video memory.

2015-03-20 Thread Thomas Niederprüm
Am Fri, 20 Mar 2015 16:24:29 +0100
schrieb Geert Uytterhoeven :

> On Fri, Mar 20, 2015 at 3:47 PM, Maxime Ripard
>  wrote:
> > On Fri, Mar 20, 2015 at 01:37:50PM +0200, Tomi Valkeinen wrote:
> >> On 15/03/15 00:02, Geert Uytterhoeven wrote:
> >> > On Fri, Mar 13, 2015 at 10:31 PM, Thomas Niederprüm
> >> >  wrote:
> >> >> Am Tue, 10 Mar 2015 13:28:25 +0200
> >> >> schrieb Tomi Valkeinen :
> >> >>> Also, isn't doing __pa() for the memory returned by vmalloc
> >> >>> plain wrong?
> >> >>
> >> >>> What was the crash about when using kmalloc? It would be good
> >> >>> to fix defio, as I don't see why it should not work with
> >> >>> kmalloced memory.
> >> >>
> >> >> The main challenge here is that the memory handed to userspace
> >> >> upon mmap call needs to be page aligned. The memory returned by
> >> >> kmalloc has no such alignment, but the pointer presented to the
> >> >> userspace program gets aligned to next page boundary. It's not
> >> >> clear to me whether there is an easy way to obtain page aligned
> >> >> kmalloc memory. Memory allocated by vmalloc on the other hand
> >> >> is always aligned to page boundaries. This is why I chose to go
> >> >> for vmalloc.
> >> >
> >> > __get_free_pages()?
> >>
> >> I'm not that experienced with mem management, so I have to ask...
> >> __get_free_pages() probably works fine, but isn't vmalloc better
> >> here?
> >>
> >> __get_free_pages() will give you possibly a lot more memory than
> >> you need. And the memory is contiguous, so it could be difficult
> >> to allocate a larger memory area. The driver doesn't need
> >> contiguous memory (except in the virtual sense).
> >
> > vmalloc also returns pages, so the size will be page-aligned. It
> > doesn't make much of a difference here, since we will only use a
> > single page in both case (the max resolution of these screens is
> > 128x39, with one bit per pixel).
> 
> In that case I recommend get_zeroed_page(), to avoid the vmalloc()
> overhead of setting up a mapping.

I looked into get_zeroed_page() too but I thought __get_free_pages()
might be more future proof since get_zeroed_page() will not reserve
enough memory if more than one page is needed. This might occur if a new
controller pops up that has more pixels than bits in a page or the
driver is used on a system with a small page size. Also
get_zeroed_page() is also just calling __get_free_pages() with the
order parameter set to 0. Therefore I think a call like

__get_free_pages(GFP_KERNEL | __GFP_ZERO, get_order(size)) 

does the same as get_zeroed_page() if only one page is needed but has
the ability to reserve more pages if needed.

Thomas

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCHv4 04/10] fbdev: ssd1307fb: Unify init code and obtain hw specific bits from DT

2015-03-20 Thread Thomas Niederprüm
Am Wed, 18 Mar 2015 20:27:19 +0100
schrieb Maxime Ripard maxime.rip...@free-electrons.com:

 Hi Thomas,
 
 On Mon, Mar 16, 2015 at 06:11:52PM +0100, Thomas Niederprüm wrote:
  The 130X controllers are very similar from the configuration point
  of view. The configuration registers for the SSD1305/6/7 are bit
  identical (except the the VHCOM register and the the default values
  for clock setup register). This patch unifies the init code of the
  controller and adds hardware specific properties to DT that are
  needed to correctly initialize the device.
  
  The SSD130X can be wired to the OLED panel in various ways. Even
  for the same controller this wiring can differ from one display
  module to another and can not be probed by software. The added DT
  properties reflect these hardware decisions of the display module
  manufacturer. The 'com-sequential', 'com-lrremap' and 'com-invdir'
  values define different possibilities for the COM signals pin
  configuration and readout direction of the video memory. The
  'segment-no-remap' allows the inversion of the memory-to-pin
  mapping ultimately inverting the order of the controllers output
  pins. The 'prechargepX' values need to be adapted according the
  capacitance of the OLEDs pixel cells.
  
  So far these hardware specific bits are hard coded in the init
  code, making the driver usable only for one certain wiring of the
  controller. This patch makes the driver usable with all possible
  hardware setups, given a valid hw description in DT. If these
  values are not set in DT the default values, as they are set in the
  ssd1307 init code right now, are used. This implies that without
  the corresponding DT property segment-no-remap the segment remap
  of the ssd130X controller gets activated. Even though this is not
  the default behaviour according to the datasheet it maintains
  backward compatibility with older DTBs.
  
  Note that the SSD1306 does not seem to be using the configuration
  written to the registers at all. Therefore this patch does not try
  to maintain these values without changes in DT. For reference an
  example is added to the DT bindings documentation that reproduces
  the configuration that is set in the current init code.
  
  Signed-off-by: Thomas Niederprüm nied...@physik.uni-kl.de
 
 This looks mostly fine, thanks for your effort on this.
 
  ---
   .../devicetree/bindings/video/ssd1307fb.txt|  21 +++
   drivers/video/fbdev/ssd1307fb.c| 195
  - 2 files changed, 137 insertions(+), 79
  deletions(-)
  
  diff --git a/Documentation/devicetree/bindings/video/ssd1307fb.txt
  b/Documentation/devicetree/bindings/video/ssd1307fb.txt index
  7a12542..be27562 100644 ---
  a/Documentation/devicetree/bindings/video/ssd1307fb.txt +++
  b/Documentation/devicetree/bindings/video/ssd1307fb.txt @@ -15,6
  +15,16 @@ Required properties: 
   Optional properties:
 - reset-active-low: Is the reset gpio is active on physical low?
  +  - solomon,segment-no-remap: Display needs normal (non-inverted)
  data column
  +  to segment mapping
  +  - solomon,com-sequential: Display uses sequential COM pin
  configuration
  +  - solomon,com-lrremap: Display uses left-right COM pin remap
  +  - solomon,com-invdir: Display uses inverted COM pin scan
  direction
  +  - solomon,com-offset: Offset of the first COM pin wired to the
  panel
 
 Documenting the offset unit would be fine.

The com-offset determines which line of the display panel should
receive the first line of video memory. When designing your display
module you could decide to do something crazy and connect the first
lines of your panel to  (for example) pin COM32 onward. By setting the
com-offset to 32 you could still recover the correct image on your
panel. So in some sense the unit of the com-offset is display lines or
number of pins, depending on whether you see it from the controller
side or from the panel side. I will update the documentation to reflect
this.

 
  +  - solomon,prechargep1: Length of deselect period (phase 1) in
  clock cycles.
  +  - solomon,prechargep2: Length of precharge period (phase 2) in
  clock cycles.
  + This needs to be the higher, the higher
  the capacitance
  + of the OLED's pixels is
   
   [0]: Documentation/devicetree/bindings/pwm/pwm.txt
   
  @@ -26,3 +36,14 @@ ssd1307: oled@3c {
   reset-gpios = gpio2 7;
   reset-active-low;
   };
  +
  +ssd1306: oled@3c {
  +compatible = solomon,ssd1306fb-i2c;
  +reg = 0x3c;
  +pwms = pwm 4 3000;
  +reset-gpios = gpio2 7;
  +reset-active-low;
  +solomon,com-lrremap;
  +solomon,com-invdir;
  +solomon,com-offset = 32;
  +};
  diff --git a/drivers/video/fbdev/ssd1307fb.c
  b/drivers/video/fbdev/ssd1307fb.c index 8d34c56..9a66118 100644
  --- a/drivers/video/fbdev/ssd1307fb.c
  +++ b/drivers/video/fbdev/ssd1307fb.c

Re: [PATCHv4 07/10] fbdev: ssd1307fb: Add a module parameter to set the refresh rate

2015-03-20 Thread Thomas Niederprüm
Am Thu, 19 Mar 2015 14:18:24 +0100
schrieb Maxime Ripard maxime.rip...@free-electrons.com:

 On Mon, Mar 16, 2015 at 06:11:55PM +0100, Thomas Niederprüm wrote:
  This patch adds the module parameter refreshrate to set delay for
  the deferred io. The refresh rate is given in units of Hertz. The
  default refresh rate is 1 Hz. The refresh rate set through the
  newly introduced parameter applies to all instances of the driver
  and for now it is not possible to change it individually.
  
  Signed-off-by: Thomas Niederprüm nied...@physik.uni-kl.de
  ---
   drivers/video/fbdev/ssd1307fb.c | 23 +--
   1 file changed, 17 insertions(+), 6 deletions(-)
  
  diff --git a/drivers/video/fbdev/ssd1307fb.c
  b/drivers/video/fbdev/ssd1307fb.c index 6fecec8..8a8d305 100644
  --- a/drivers/video/fbdev/ssd1307fb.c
  +++ b/drivers/video/fbdev/ssd1307fb.c
  @@ -42,6 +42,11 @@
   #defineSSD1307FB_SET_COM_PINS_CONFIG   0xda
   #defineSSD1307FB_SET_VCOMH 0xdb
   
  +#define REFRASHRATE 1
  +
  +static u_int refreshrate = REFRASHRATE;
 
 s/REFRASH/REFRESH/ :)

It's written the wrong way and the right way in the same line :) Of
course I will fix that.

Thanks,
Thomas
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH 4/8] fbdev: ssd1307fb: Use vmalloc to allocate video memory.

2015-03-20 Thread Thomas Niederprüm
Am Fri, 20 Mar 2015 16:24:29 +0100
schrieb Geert Uytterhoeven ge...@linux-m68k.org:

 On Fri, Mar 20, 2015 at 3:47 PM, Maxime Ripard
 maxime.rip...@free-electrons.com wrote:
  On Fri, Mar 20, 2015 at 01:37:50PM +0200, Tomi Valkeinen wrote:
  On 15/03/15 00:02, Geert Uytterhoeven wrote:
   On Fri, Mar 13, 2015 at 10:31 PM, Thomas Niederprüm
   nied...@physik.uni-kl.de wrote:
   Am Tue, 10 Mar 2015 13:28:25 +0200
   schrieb Tomi Valkeinen tomi.valkei...@ti.com:
   Also, isn't doing __pa() for the memory returned by vmalloc
   plain wrong?
  
   What was the crash about when using kmalloc? It would be good
   to fix defio, as I don't see why it should not work with
   kmalloced memory.
  
   The main challenge here is that the memory handed to userspace
   upon mmap call needs to be page aligned. The memory returned by
   kmalloc has no such alignment, but the pointer presented to the
   userspace program gets aligned to next page boundary. It's not
   clear to me whether there is an easy way to obtain page aligned
   kmalloc memory. Memory allocated by vmalloc on the other hand
   is always aligned to page boundaries. This is why I chose to go
   for vmalloc.
  
   __get_free_pages()?
 
  I'm not that experienced with mem management, so I have to ask...
  __get_free_pages() probably works fine, but isn't vmalloc better
  here?
 
  __get_free_pages() will give you possibly a lot more memory than
  you need. And the memory is contiguous, so it could be difficult
  to allocate a larger memory area. The driver doesn't need
  contiguous memory (except in the virtual sense).
 
  vmalloc also returns pages, so the size will be page-aligned. It
  doesn't make much of a difference here, since we will only use a
  single page in both case (the max resolution of these screens is
  128x39, with one bit per pixel).
 
 In that case I recommend get_zeroed_page(), to avoid the vmalloc()
 overhead of setting up a mapping.

I looked into get_zeroed_page() too but I thought __get_free_pages()
might be more future proof since get_zeroed_page() will not reserve
enough memory if more than one page is needed. This might occur if a new
controller pops up that has more pixels than bits in a page or the
driver is used on a system with a small page size. Also
get_zeroed_page() is also just calling __get_free_pages() with the
order parameter set to 0. Therefore I think a call like

__get_free_pages(GFP_KERNEL | __GFP_ZERO, get_order(size)) 

does the same as get_zeroed_page() if only one page is needed but has
the ability to reserve more pages if needed.

Thomas

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH 4/8] fbdev: ssd1307fb: Use vmalloc to allocate video memory.

2015-03-20 Thread Thomas Niederprüm
Am Fri, 20 Mar 2015 17:25:29 +0200
schrieb Tomi Valkeinen tomi.valkei...@ti.com:

 On 20/03/15 16:47, Maxime Ripard wrote:
  On Fri, Mar 20, 2015 at 01:37:50PM +0200, Tomi Valkeinen wrote:
  On 15/03/15 00:02, Geert Uytterhoeven wrote:
  On Fri, Mar 13, 2015 at 10:31 PM, Thomas Niederprüm
  nied...@physik.uni-kl.de wrote:
  Am Tue, 10 Mar 2015 13:28:25 +0200
  schrieb Tomi Valkeinen tomi.valkei...@ti.com:
  Also, isn't doing __pa() for the memory returned by vmalloc
  plain wrong?
 
  What was the crash about when using kmalloc? It would be good
  to fix defio, as I don't see why it should not work with
  kmalloced memory.
 
  The main challenge here is that the memory handed to userspace
  upon mmap call needs to be page aligned. The memory returned by
  kmalloc has no such alignment, but the pointer presented to the
  userspace program gets aligned to next page boundary. It's not
  clear to me whether there is an easy way to obtain page aligned
  kmalloc memory. Memory allocated by vmalloc on the other hand is
  always aligned to page boundaries. This is why I chose to go for
  vmalloc.
 
  __get_free_pages()?
 
  I'm not that experienced with mem management, so I have to ask...
  __get_free_pages() probably works fine, but isn't vmalloc better
  here?
 
  __get_free_pages() will give you possibly a lot more memory than
  you need. And the memory is contiguous, so it could be difficult
  to allocate a larger memory area. The driver doesn't need
  contiguous memory (except in the virtual sense).
  
  vmalloc also returns pages, so the size will be page-aligned. It
  doesn't make much of a difference here, since we will only use a
  single page in both case (the max resolution of these screens is
  128x39, with one bit per pixel).
 
 Ok, that's not much, then =).
 
 In that case __get_free_pages sounds fine. Even if the resolution
 would be slightly higher, we're only talking about a page or two
 extra.
 
 Usually double-underscore in front of a func means don't call this.
 I don't know why this one has the underscores.

This irritated me as well. But since it turned out that there is even a
section on get_free_page and Friends in LDD3 that talks about
__get_free_pages() without any word of caution, I assumed it's ok to
call this functions.

Thomas
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCHv4 05/10] ARM: mxs: fix in tree users of ssd1306

2015-03-16 Thread Thomas Niederprüm
This patch updates the in tree-users of the SSD1306 controller for using
the newly introduced DT properties.

Signed-off-by: Thomas Niederprüm 
---
 arch/arm/boot/dts/imx28-cfa10036.dts | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/arch/arm/boot/dts/imx28-cfa10036.dts 
b/arch/arm/boot/dts/imx28-cfa10036.dts
index b04b6b8..570aa33 100644
--- a/arch/arm/boot/dts/imx28-cfa10036.dts
+++ b/arch/arm/boot/dts/imx28-cfa10036.dts
@@ -99,6 +99,9 @@
solomon,height = <32>;
solomon,width = <128>;
solomon,page-offset = <0>;
+   solomon,com-lrremap;
+   solomon,com-invdir;
+   solomon,com-offset = <32>;
};
};
 
-- 
2.3.0

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCHv4 04/10] fbdev: ssd1307fb: Unify init code and obtain hw specific bits from DT

2015-03-16 Thread Thomas Niederprüm
The 130X controllers are very similar from the configuration point of view.
The configuration registers for the SSD1305/6/7 are bit identical (except the
the VHCOM register and the the default values for clock setup register). This
patch unifies the init code of the controller and adds hardware specific
properties to DT that are needed to correctly initialize the device.

The SSD130X can be wired to the OLED panel in various ways. Even for the
same controller this wiring can differ from one display module to another
and can not be probed by software. The added DT properties reflect these
hardware decisions of the display module manufacturer.
The 'com-sequential', 'com-lrremap' and 'com-invdir' values define different
possibilities for the COM signals pin configuration and readout direction
of the video memory. The 'segment-no-remap' allows the inversion of the
memory-to-pin mapping ultimately inverting the order of the controllers
output pins. The 'prechargepX' values need to be adapted according the
capacitance of the OLEDs pixel cells.

So far these hardware specific bits are hard coded in the init code, making
the driver usable only for one certain wiring of the controller. This patch
makes the driver usable with all possible hardware setups, given a valid hw
description in DT. If these values are not set in DT the default values,
as they are set in the ssd1307 init code right now, are used. This implies
that without the corresponding DT property "segment-no-remap" the segment
remap of the ssd130X controller gets activated. Even though this is not the
default behaviour according to the datasheet it maintains backward
compatibility with older DTBs.

Note that the SSD1306 does not seem to be using the configuration written to
the registers at all. Therefore this patch does not try to maintain these
values without changes in DT. For reference an example is added to the DT
bindings documentation that reproduces the configuration that is set in the
current init code.

Signed-off-by: Thomas Niederprüm 
---
 .../devicetree/bindings/video/ssd1307fb.txt|  21 +++
 drivers/video/fbdev/ssd1307fb.c| 195 -
 2 files changed, 137 insertions(+), 79 deletions(-)

diff --git a/Documentation/devicetree/bindings/video/ssd1307fb.txt 
b/Documentation/devicetree/bindings/video/ssd1307fb.txt
index 7a12542..be27562 100644
--- a/Documentation/devicetree/bindings/video/ssd1307fb.txt
+++ b/Documentation/devicetree/bindings/video/ssd1307fb.txt
@@ -15,6 +15,16 @@ Required properties:
 
 Optional properties:
   - reset-active-low: Is the reset gpio is active on physical low?
+  - solomon,segment-no-remap: Display needs normal (non-inverted) data column
+  to segment mapping
+  - solomon,com-sequential: Display uses sequential COM pin configuration
+  - solomon,com-lrremap: Display uses left-right COM pin remap
+  - solomon,com-invdir: Display uses inverted COM pin scan direction
+  - solomon,com-offset: Offset of the first COM pin wired to the panel
+  - solomon,prechargep1: Length of deselect period (phase 1) in clock cycles.
+  - solomon,prechargep2: Length of precharge period (phase 2) in clock cycles.
+ This needs to be the higher, the higher the 
capacitance
+ of the OLED's pixels is
 
 [0]: Documentation/devicetree/bindings/pwm/pwm.txt
 
@@ -26,3 +36,14 @@ ssd1307: oled@3c {
 reset-gpios = < 7>;
 reset-active-low;
 };
+
+ssd1306: oled@3c {
+compatible = "solomon,ssd1306fb-i2c";
+reg = <0x3c>;
+pwms = < 4 3000>;
+reset-gpios = < 7>;
+reset-active-low;
+solomon,com-lrremap;
+solomon,com-invdir;
+solomon,com-offset = <32>;
+};
diff --git a/drivers/video/fbdev/ssd1307fb.c b/drivers/video/fbdev/ssd1307fb.c
index 8d34c56..9a66118 100644
--- a/drivers/video/fbdev/ssd1307fb.c
+++ b/drivers/video/fbdev/ssd1307fb.c
@@ -16,6 +16,9 @@
 #include 
 #include 
 
+#define DEVID_SSD1306 6
+#define DEVID_SSD1307 7
+
 #define SSD1307FB_DATA 0x40
 #define SSD1307FB_COMMAND  0x80
 
@@ -38,22 +41,38 @@
 #defineSSD1307FB_SET_COM_PINS_CONFIG   0xda
 #defineSSD1307FB_SET_VCOMH 0xdb
 
+static u_int contrast = 128;
+module_param(contrast, uint, S_IRUGO);
+
 struct ssd1307fb_par;
 
-struct ssd1307fb_ops {
-   int (*init)(struct ssd1307fb_par *);
-   int (*remove)(struct ssd1307fb_par *);
+struct ssd1307fb_deviceinfo {
+   int device_id;
+   u32 default_vcomh;
+   u32 default_dclk_div;
+   u32 default_dclk_frq;
 };
 
 struct ssd1307fb_par {
+   u32 com_invdir;
+   u32 com_lrremap;
+   u32 com_offset;
+   u32 com_seq;
+   u32 contrast;
+   u32 dclk_div;
+   u32 dclk_frq;
+   struct ssd1307fb_deviceinfo *device_info;
struct i2c_client *client;
u32 height;
struct fb_info *in

[PATCHv4 06/10] fbdev: ssd1307fb: Add support for SSD1305

2015-03-16 Thread Thomas Niederprüm
This patch adds support for the SSD1305 OLED controller.

Signed-off-by: Thomas Niederprüm 
---
 Documentation/devicetree/bindings/video/ssd1307fb.txt |  2 +-
 drivers/video/fbdev/ssd1307fb.c   | 13 +
 2 files changed, 14 insertions(+), 1 deletion(-)

diff --git a/Documentation/devicetree/bindings/video/ssd1307fb.txt 
b/Documentation/devicetree/bindings/video/ssd1307fb.txt
index be27562..a878fd2 100644
--- a/Documentation/devicetree/bindings/video/ssd1307fb.txt
+++ b/Documentation/devicetree/bindings/video/ssd1307fb.txt
@@ -2,7 +2,7 @@
 
 Required properties:
   - compatible: Should be "solomon,fb-". The only supported bus for
-now is i2c, and the supported chips are ssd1306 and ssd1307.
+now is i2c, and the supported chips are ssd1305, ssd1306 and ssd1307.
   - reg: Should contain address of the controller on the I2C bus. Most likely
  0x3c or 0x3d
   - pwm: Should contain the pwm to use according to the OF device tree PWM
diff --git a/drivers/video/fbdev/ssd1307fb.c b/drivers/video/fbdev/ssd1307fb.c
index 9a66118..6fecec8 100644
--- a/drivers/video/fbdev/ssd1307fb.c
+++ b/drivers/video/fbdev/ssd1307fb.c
@@ -16,6 +16,7 @@
 #include 
 #include 
 
+#define DEVID_SSD1305 5
 #define DEVID_SSD1306 6
 #define DEVID_SSD1307 7
 
@@ -430,6 +431,13 @@ static int ssd1307fb_init(struct ssd1307fb_par *par)
return 0;
 }
 
+static struct ssd1307fb_deviceinfo ssd1307fb_ssd1305_deviceinfo = {
+   .device_id  = DEVID_SSD1305,
+   .default_vcomh = 0x34,
+   .default_dclk_div = 0,
+   .default_dclk_frq = 7,
+};
+
 static struct ssd1307fb_deviceinfo ssd1307fb_ssd1306_deviceinfo = {
.device_id  = DEVID_SSD1306,
.default_vcomh = 0x20,
@@ -446,6 +454,10 @@ static struct ssd1307fb_deviceinfo 
ssd1307fb_ssd1307_deviceinfo = {
 
 static const struct of_device_id ssd1307fb_of_match[] = {
{
+   .compatible = "solomon,ssd1305fb-i2c",
+   .data = (void *)_ssd1305_deviceinfo,
+   },
+   {
.compatible = "solomon,ssd1306fb-i2c",
.data = (void *)_ssd1306_deviceinfo,
},
@@ -618,6 +630,7 @@ static int ssd1307fb_remove(struct i2c_client *client)
 }
 
 static const struct i2c_device_id ssd1307fb_i2c_id[] = {
+   { "ssd1305fb", 0 },
{ "ssd1306fb", 0 },
{ "ssd1307fb", 0 },
{ }
-- 
2.3.0

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCHv4 03/10] of: Add Solomon Systech vendor prefix.

2015-03-16 Thread Thomas Niederprüm
This patch adds the solomon prefix for Solomon Systech Limited.

Signed-off-by: Thomas Niederprüm 
---
 Documentation/devicetree/bindings/vendor-prefixes.txt | 1 +
 1 file changed, 1 insertion(+)

diff --git a/Documentation/devicetree/bindings/vendor-prefixes.txt 
b/Documentation/devicetree/bindings/vendor-prefixes.txt
index d3f4809..933c8f5 100644
--- a/Documentation/devicetree/bindings/vendor-prefixes.txt
+++ b/Documentation/devicetree/bindings/vendor-prefixes.txt
@@ -169,6 +169,7 @@ sitronixSitronix Technology Corporation
 smsc   Standard Microsystems Corporation
 snps   Synopsys, Inc.
 solidrun   SolidRun
+solomonSolomon Systech Limited
 sony   Sony Corporation
 spansion   Spansion Inc.
 sprd   Spreadtrum Communications Inc.
-- 
2.3.0

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCHv4 01/10] fbdev: ssd1307fb: fix memory address smem_start.

2015-03-16 Thread Thomas Niederprüm
the smem_start pointer of the framebuffer info struct needs to hold the
physical address rather than the logical address. Right now the logical
address returned by kmalloc is stored. This patch converts this address
to a physical address and thus fixes a driver crash on mmaping the
framebuffer memory due to an access to the wrong memory address.

Signed-off-by: Thomas Niederprüm 
Acked-by: Maxime Ripard 
---
 drivers/video/fbdev/ssd1307fb.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/video/fbdev/ssd1307fb.c b/drivers/video/fbdev/ssd1307fb.c
index f7ed6d9..61e0ce8 100644
--- a/drivers/video/fbdev/ssd1307fb.c
+++ b/drivers/video/fbdev/ssd1307fb.c
@@ -515,7 +515,7 @@ static int ssd1307fb_probe(struct i2c_client *client,
info->var.blue.offset = 0;
 
info->screen_base = (u8 __force __iomem *)vmem;
-   info->fix.smem_start = (unsigned long)vmem;
+   info->fix.smem_start = __pa(vmem);
info->fix.smem_len = vmem_size;
 
fb_deferred_io_init(info);
-- 
2.3.0

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCHv4 08/10] fbdev: ssd1307fb: Turn off display on driver unload.

2015-03-16 Thread Thomas Niederprüm
This patch turns off the display when the driver is unloaded.

Signed-off-by: Thomas Niederprüm 
Acked-by: Maxime Ripard 
---
 drivers/video/fbdev/ssd1307fb.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/video/fbdev/ssd1307fb.c b/drivers/video/fbdev/ssd1307fb.c
index 8a8d305..0d851f1 100644
--- a/drivers/video/fbdev/ssd1307fb.c
+++ b/drivers/video/fbdev/ssd1307fb.c
@@ -628,6 +628,8 @@ static int ssd1307fb_remove(struct i2c_client *client)
struct fb_info *info = i2c_get_clientdata(client);
struct ssd1307fb_par *par = info->par;
 
+   ssd1307fb_write_cmd(par->client, SSD1307FB_DISPLAY_OFF);
+
unregister_framebuffer(info);
if (par->device_info->device_id == DEVID_SSD1307) {
pwm_disable(par->pwm);
-- 
2.3.0

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCHv4 00/10] Cleanup and add support for SSD1305

2015-03-16 Thread Thomas Niederprüm
This patch series is the result of making the ssd1307fb driver work with
a Newhaven OLED display using the Solomon SSD1305 controller. To achieve
this the intialization code for the SSD1306 and the SSD1307 is merged
and based on DT configuration to reflect the various possible wirings
of the SSD130X controller (04/10). Based on these changes it is straight
forward to add support for the SSD1305 controller (06/10).

While working on the driver I realized that it was not possible to
correctly mmap the video memory from userspace since the address handed
to the userspace app is a logical one where it should be a physical one.
Patch 01/10 fixes this. Furthermore the memory reserved by kzalloc is
not page aligned while the address handed to userspace is aligned to the
next page frame. This problem is fixed by using __get_free_pages() in 02/10.

Furthermore a module parameter is added to set the delay for the
deferred io update (07/10). Also the backlight class is implemented to make
the contrast setting available in userspace (09/10).

changes since v1 (thanks to Maxime for the feedback):
- dedicated patch for fixing smem_start address
- remove page reserve upon vmalloc
- remove return value check upon display turn-off at module unload
- use a module parameter refreshrate rather than delaydivider
- allocate fbdefio dynamically
- use sysfs_create_groups to create sysfs entries
- remove contrast, vhcom and dclk properties from DT since they are
  not part of hw description. The contrast module parameter was added
  to set contrast at load time. vhcom and dclk stays at it's default
  values for now.
- add new DT properties to in tree users of ssd130X
- rebased to apply on top of linux-next

changes since v2 (thanks to Maxime again):
- free memory allocated by vmalloc on driver unload
- set default values in the init code to the ones of the existing ssd1307
  init code
- added two ACKs (Maxime Ripard)

changes since v3:
- use backlight class rather than dedicated sysfs files to set the 
  contrast (Thanks to Tomi Valkeinen)
- remove [PATCHv3 08/10] fbdev: ssd1307fb: Add module parameter bitsperpixel
- add new patch to blank the display (unreviewed)
- allocate video memory through __get_free_pages() rather than vmalloc
  (Thanks to Geert Uytterhoeven)
- minor rewordings of the commit messages

Thomas Niederprüm (10):
  fbdev: ssd1307fb: fix memory address smem_start.
  fbdev: ssd1307fb: Allocate page aligned video memory.
  of: Add Solomon Systech vendor prefix.
  fbdev: ssd1307fb: Unify init code and obtain hw specific bits from DT
  ARM: mxs: fix in tree users of ssd1306
  fbdev: ssd1307fb: Add support for SSD1305
  fbdev: ssd1307fb: Add a module parameter to set the refresh rate
  fbdev: ssd1307fb: Turn off display on driver unload.
  fbdev: ssd1307fb: add backlight controls for setting the contrast
  fbdev: ssd1307fb: Add blank mode

 .../devicetree/bindings/vendor-prefixes.txt|   1 +
 .../devicetree/bindings/video/ssd1307fb.txt|  23 +-
 arch/arm/boot/dts/imx28-cfa10036.dts   |   3 +
 drivers/video/fbdev/Kconfig|   1 +
 drivers/video/fbdev/ssd1307fb.c| 310 +++--
 5 files changed, 250 insertions(+), 88 deletions(-)

-- 
2.3.0

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCHv4 02/10] fbdev: ssd1307fb: Allocate page aligned video memory.

2015-03-16 Thread Thomas Niederprüm
Currently the videomemory is allocated by kmalloc, making it a memory
region that is not necessarily page aligend. This leads to problems
upon mmap call, where the video memory's address gets aligned to the
next page boundary. The result is that the userspace program that issued
the mmap call is not able to access the video memory from the start to
the next page boundary.

This patch changes the allocation of the video memory to use
__get_free_pages() in order to obtain memory that is aligned
to page boundaries.

Signed-off-by: Thomas Niederprüm 
---
 drivers/video/fbdev/ssd1307fb.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/video/fbdev/ssd1307fb.c b/drivers/video/fbdev/ssd1307fb.c
index 61e0ce8..8d34c56 100644
--- a/drivers/video/fbdev/ssd1307fb.c
+++ b/drivers/video/fbdev/ssd1307fb.c
@@ -489,7 +489,8 @@ static int ssd1307fb_probe(struct i2c_client *client,
 
vmem_size = par->width * par->height / 8;
 
-   vmem = devm_kzalloc(>dev, vmem_size, GFP_KERNEL);
+   vmem = (void *)__get_free_pages(GFP_KERNEL | __GFP_ZERO,
+   get_order(vmem_size));
if (!vmem) {
dev_err(>dev, "Couldn't allocate graphical memory.\n");
ret = -ENOMEM;
@@ -573,6 +574,7 @@ static int ssd1307fb_remove(struct i2c_client *client)
if (par->ops->remove)
par->ops->remove(par);
fb_deferred_io_cleanup(info);
+   __free_pages(__va(info->fix.smem_start), get_order(info->fix.smem_len));
framebuffer_release(info);
 
return 0;
-- 
2.3.0

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCHv4 07/10] fbdev: ssd1307fb: Add a module parameter to set the refresh rate

2015-03-16 Thread Thomas Niederprüm
This patch adds the module parameter "refreshrate" to set delay for the
deferred io. The refresh rate is given in units of Hertz. The default
refresh rate is 1 Hz. The refresh rate set through the newly introduced
parameter applies to all instances of the driver and for now it is not
possible to change it individually.

Signed-off-by: Thomas Niederprüm 
---
 drivers/video/fbdev/ssd1307fb.c | 23 +--
 1 file changed, 17 insertions(+), 6 deletions(-)

diff --git a/drivers/video/fbdev/ssd1307fb.c b/drivers/video/fbdev/ssd1307fb.c
index 6fecec8..8a8d305 100644
--- a/drivers/video/fbdev/ssd1307fb.c
+++ b/drivers/video/fbdev/ssd1307fb.c
@@ -42,6 +42,11 @@
 #defineSSD1307FB_SET_COM_PINS_CONFIG   0xda
 #defineSSD1307FB_SET_VCOMH 0xdb
 
+#define REFRASHRATE 1
+
+static u_int refreshrate = REFRASHRATE;
+module_param(refreshrate, uint, 0);
+
 static u_int contrast = 128;
 module_param(contrast, uint, S_IRUGO);
 
@@ -269,11 +274,6 @@ static void ssd1307fb_deferred_io(struct fb_info *info,
ssd1307fb_update_display(info->par);
 }
 
-static struct fb_deferred_io ssd1307fb_defio = {
-   .delay  = HZ,
-   .deferred_io= ssd1307fb_deferred_io,
-};
-
 static int ssd1307fb_init(struct ssd1307fb_par *par)
 {
int ret;
@@ -474,6 +474,7 @@ static int ssd1307fb_probe(struct i2c_client *client,
 {
struct fb_info *info;
struct device_node *node = client->dev.of_node;
+   struct fb_deferred_io *ssd1307fb_defio;
u32 vmem_size;
struct ssd1307fb_par *par;
u8 *vmem;
@@ -544,10 +545,20 @@ static int ssd1307fb_probe(struct i2c_client *client,
goto fb_alloc_error;
}
 
+   ssd1307fb_defio = devm_kzalloc(>dev, sizeof(struct 
fb_deferred_io), GFP_KERNEL);
+   if (!ssd1307fb_defio) {
+   dev_err(>dev, "Couldn't allocate deferred io.\n");
+   ret = -ENOMEM;
+   goto fb_alloc_error;
+   }
+
+   ssd1307fb_defio->delay = HZ / refreshrate;
+   ssd1307fb_defio->deferred_io = ssd1307fb_deferred_io;
+
info->fbops = _ops;
info->fix = ssd1307fb_fix;
info->fix.line_length = par->width / 8;
-   info->fbdefio = _defio;
+   info->fbdefio = ssd1307fb_defio;
 
info->var = ssd1307fb_var;
info->var.xres = par->width;
-- 
2.3.0

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCHv4 09/10] fbdev: ssd1307fb: add backlight controls for setting the contrast

2015-03-16 Thread Thomas Niederprüm
The backlight class is used to create userspace handles for
setting the OLED contrast.

Signed-off-by: Thomas Niederprüm 
---
 drivers/video/fbdev/Kconfig |  1 +
 drivers/video/fbdev/ssd1307fb.c | 58 +
 2 files changed, 59 insertions(+)

diff --git a/drivers/video/fbdev/Kconfig b/drivers/video/fbdev/Kconfig
index b3dd417..da70bae 100644
--- a/drivers/video/fbdev/Kconfig
+++ b/drivers/video/fbdev/Kconfig
@@ -2478,6 +2478,7 @@ config FB_SSD1307
select FB_SYS_IMAGEBLIT
select FB_DEFERRED_IO
select PWM
+   select FB_BACKLIGHT
help
  This driver implements support for the Solomon SSD1307
  OLED controller over I2C.
diff --git a/drivers/video/fbdev/ssd1307fb.c b/drivers/video/fbdev/ssd1307fb.c
index 0d851f1..4ebfcaf 100644
--- a/drivers/video/fbdev/ssd1307fb.c
+++ b/drivers/video/fbdev/ssd1307fb.c
@@ -7,6 +7,7 @@
  */
 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -42,6 +43,8 @@
 #defineSSD1307FB_SET_COM_PINS_CONFIG   0xda
 #defineSSD1307FB_SET_VCOMH 0xdb
 
+#define MAX_CONTRAST 255
+
 #define REFRASHRATE 1
 
 static u_int refreshrate = REFRASHRATE;
@@ -431,6 +434,43 @@ static int ssd1307fb_init(struct ssd1307fb_par *par)
return 0;
 }
 
+static int ssd1307fb_update_bl(struct backlight_device *bdev)
+{
+   struct ssd1307fb_par *par = bl_get_data(bdev);
+   int ret;
+   int brightness = bdev->props.brightness;
+
+   par->contrast = brightness;
+
+   ret = ssd1307fb_write_cmd(par->client, SSD1307FB_CONTRAST);
+   if (ret < 0)
+   return ret;
+   ret = ssd1307fb_write_cmd(par->client, par->contrast);
+   if (ret < 0)
+   return ret;
+   return 0;
+}
+
+static int ssd1307fb_get_brightness(struct backlight_device *bdev)
+{
+   struct ssd1307fb_par *par = bl_get_data(bdev);
+
+   return par->contrast;
+}
+
+static int ssd1307fb_check_fb(struct backlight_device *bdev,
+  struct fb_info *info)
+{
+   return (info->bl_dev == bdev);
+}
+
+static const struct backlight_ops ssd1307fb_bl_ops = {
+   .options= BL_CORE_SUSPENDRESUME,
+   .update_status  = ssd1307fb_update_bl,
+   .get_brightness = ssd1307fb_get_brightness,
+   .check_fb   = ssd1307fb_check_fb,
+};
+
 static struct ssd1307fb_deviceinfo ssd1307fb_ssd1305_deviceinfo = {
.device_id  = DEVID_SSD1305,
.default_vcomh = 0x34,
@@ -472,6 +512,8 @@ MODULE_DEVICE_TABLE(of, ssd1307fb_of_match);
 static int ssd1307fb_probe(struct i2c_client *client,
   const struct i2c_device_id *id)
 {
+   struct backlight_device *bl;
+   char bl_name[12];
struct fb_info *info;
struct device_node *node = client->dev.of_node;
struct fb_deferred_io *ssd1307fb_defio;
@@ -607,10 +649,24 @@ static int ssd1307fb_probe(struct i2c_client *client,
goto panel_init_error;
}
 
+   snprintf(bl_name, sizeof(bl_name), "ssd1307fb%d", info->node);
+   bl = backlight_device_register(bl_name, >dev, par,
+  _bl_ops, NULL);
+   bl->props.brightness = contrast;
+   bl->props.max_brightness = MAX_CONTRAST;
+   info->bl_dev = bl;
+
+   if (IS_ERR(bl)) {
+   dev_err(>dev, "unable to register backlight device: 
%ld\n",
+   PTR_ERR(bl));
+   goto bl_init_error;
+   }
dev_info(>dev, "fb%d: %s framebuffer device registered, using 
%d bytes of video memory\n", info->node, info->fix.id, vmem_size);
 
return 0;
 
+bl_init_error:
+   unregister_framebuffer(info);
 panel_init_error:
if (par->device_info->device_id == DEVID_SSD1307) {
pwm_disable(par->pwm);
@@ -630,6 +686,8 @@ static int ssd1307fb_remove(struct i2c_client *client)
 
ssd1307fb_write_cmd(par->client, SSD1307FB_DISPLAY_OFF);
 
+   backlight_device_unregister(info->bl_dev);
+
unregister_framebuffer(info);
if (par->device_info->device_id == DEVID_SSD1307) {
pwm_disable(par->pwm);
-- 
2.3.0

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCHv4 10/10] fbdev: ssd1307fb: Add blank mode

2015-03-16 Thread Thomas Niederprüm
This patch adds ssd1307fb_blank() to make the framebuffer capable
of blanking.

Signed-off-by: Thomas Niederprüm 
---
 drivers/video/fbdev/ssd1307fb.c | 13 +
 1 file changed, 13 insertions(+)

diff --git a/drivers/video/fbdev/ssd1307fb.c b/drivers/video/fbdev/ssd1307fb.c
index 4ebfcaf..9271bba 100644
--- a/drivers/video/fbdev/ssd1307fb.c
+++ b/drivers/video/fbdev/ssd1307fb.c
@@ -241,6 +241,18 @@ static ssize_t ssd1307fb_write(struct fb_info *info, const 
char __user *buf,
return count;
 }
 
+static int ssd1307fb_blank(int blank_mode, struct fb_info *info)
+{
+   struct ssd1307fb_par *par = info->par;
+   int ret;
+
+   if (blank_mode != FB_BLANK_UNBLANK)
+   ret = ssd1307fb_write_cmd(par->client, SSD1307FB_DISPLAY_OFF);
+   else
+   ret = ssd1307fb_write_cmd(par->client, SSD1307FB_DISPLAY_ON);
+   return ret;
+}
+
 static void ssd1307fb_fillrect(struct fb_info *info, const struct fb_fillrect 
*rect)
 {
struct ssd1307fb_par *par = info->par;
@@ -266,6 +278,7 @@ static struct fb_ops ssd1307fb_ops = {
.owner  = THIS_MODULE,
.fb_read= fb_sys_read,
.fb_write   = ssd1307fb_write,
+   .fb_blank   = ssd1307fb_blank,
.fb_fillrect= ssd1307fb_fillrect,
.fb_copyarea= ssd1307fb_copyarea,
.fb_imageblit   = ssd1307fb_imageblit,
-- 
2.3.0

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCHv4 04/10] fbdev: ssd1307fb: Unify init code and obtain hw specific bits from DT

2015-03-16 Thread Thomas Niederprüm
The 130X controllers are very similar from the configuration point of view.
The configuration registers for the SSD1305/6/7 are bit identical (except the
the VHCOM register and the the default values for clock setup register). This
patch unifies the init code of the controller and adds hardware specific
properties to DT that are needed to correctly initialize the device.

The SSD130X can be wired to the OLED panel in various ways. Even for the
same controller this wiring can differ from one display module to another
and can not be probed by software. The added DT properties reflect these
hardware decisions of the display module manufacturer.
The 'com-sequential', 'com-lrremap' and 'com-invdir' values define different
possibilities for the COM signals pin configuration and readout direction
of the video memory. The 'segment-no-remap' allows the inversion of the
memory-to-pin mapping ultimately inverting the order of the controllers
output pins. The 'prechargepX' values need to be adapted according the
capacitance of the OLEDs pixel cells.

So far these hardware specific bits are hard coded in the init code, making
the driver usable only for one certain wiring of the controller. This patch
makes the driver usable with all possible hardware setups, given a valid hw
description in DT. If these values are not set in DT the default values,
as they are set in the ssd1307 init code right now, are used. This implies
that without the corresponding DT property segment-no-remap the segment
remap of the ssd130X controller gets activated. Even though this is not the
default behaviour according to the datasheet it maintains backward
compatibility with older DTBs.

Note that the SSD1306 does not seem to be using the configuration written to
the registers at all. Therefore this patch does not try to maintain these
values without changes in DT. For reference an example is added to the DT
bindings documentation that reproduces the configuration that is set in the
current init code.

Signed-off-by: Thomas Niederprüm nied...@physik.uni-kl.de
---
 .../devicetree/bindings/video/ssd1307fb.txt|  21 +++
 drivers/video/fbdev/ssd1307fb.c| 195 -
 2 files changed, 137 insertions(+), 79 deletions(-)

diff --git a/Documentation/devicetree/bindings/video/ssd1307fb.txt 
b/Documentation/devicetree/bindings/video/ssd1307fb.txt
index 7a12542..be27562 100644
--- a/Documentation/devicetree/bindings/video/ssd1307fb.txt
+++ b/Documentation/devicetree/bindings/video/ssd1307fb.txt
@@ -15,6 +15,16 @@ Required properties:
 
 Optional properties:
   - reset-active-low: Is the reset gpio is active on physical low?
+  - solomon,segment-no-remap: Display needs normal (non-inverted) data column
+  to segment mapping
+  - solomon,com-sequential: Display uses sequential COM pin configuration
+  - solomon,com-lrremap: Display uses left-right COM pin remap
+  - solomon,com-invdir: Display uses inverted COM pin scan direction
+  - solomon,com-offset: Offset of the first COM pin wired to the panel
+  - solomon,prechargep1: Length of deselect period (phase 1) in clock cycles.
+  - solomon,prechargep2: Length of precharge period (phase 2) in clock cycles.
+ This needs to be the higher, the higher the 
capacitance
+ of the OLED's pixels is
 
 [0]: Documentation/devicetree/bindings/pwm/pwm.txt
 
@@ -26,3 +36,14 @@ ssd1307: oled@3c {
 reset-gpios = gpio2 7;
 reset-active-low;
 };
+
+ssd1306: oled@3c {
+compatible = solomon,ssd1306fb-i2c;
+reg = 0x3c;
+pwms = pwm 4 3000;
+reset-gpios = gpio2 7;
+reset-active-low;
+solomon,com-lrremap;
+solomon,com-invdir;
+solomon,com-offset = 32;
+};
diff --git a/drivers/video/fbdev/ssd1307fb.c b/drivers/video/fbdev/ssd1307fb.c
index 8d34c56..9a66118 100644
--- a/drivers/video/fbdev/ssd1307fb.c
+++ b/drivers/video/fbdev/ssd1307fb.c
@@ -16,6 +16,9 @@
 #include linux/pwm.h
 #include linux/delay.h
 
+#define DEVID_SSD1306 6
+#define DEVID_SSD1307 7
+
 #define SSD1307FB_DATA 0x40
 #define SSD1307FB_COMMAND  0x80
 
@@ -38,22 +41,38 @@
 #defineSSD1307FB_SET_COM_PINS_CONFIG   0xda
 #defineSSD1307FB_SET_VCOMH 0xdb
 
+static u_int contrast = 128;
+module_param(contrast, uint, S_IRUGO);
+
 struct ssd1307fb_par;
 
-struct ssd1307fb_ops {
-   int (*init)(struct ssd1307fb_par *);
-   int (*remove)(struct ssd1307fb_par *);
+struct ssd1307fb_deviceinfo {
+   int device_id;
+   u32 default_vcomh;
+   u32 default_dclk_div;
+   u32 default_dclk_frq;
 };
 
 struct ssd1307fb_par {
+   u32 com_invdir;
+   u32 com_lrremap;
+   u32 com_offset;
+   u32 com_seq;
+   u32 contrast;
+   u32 dclk_div;
+   u32 dclk_frq;
+   struct ssd1307fb_deviceinfo *device_info;
struct i2c_client *client;
u32 height;
struct fb_info *info

[PATCHv4 06/10] fbdev: ssd1307fb: Add support for SSD1305

2015-03-16 Thread Thomas Niederprüm
This patch adds support for the SSD1305 OLED controller.

Signed-off-by: Thomas Niederprüm nied...@physik.uni-kl.de
---
 Documentation/devicetree/bindings/video/ssd1307fb.txt |  2 +-
 drivers/video/fbdev/ssd1307fb.c   | 13 +
 2 files changed, 14 insertions(+), 1 deletion(-)

diff --git a/Documentation/devicetree/bindings/video/ssd1307fb.txt 
b/Documentation/devicetree/bindings/video/ssd1307fb.txt
index be27562..a878fd2 100644
--- a/Documentation/devicetree/bindings/video/ssd1307fb.txt
+++ b/Documentation/devicetree/bindings/video/ssd1307fb.txt
@@ -2,7 +2,7 @@
 
 Required properties:
   - compatible: Should be solomon,chipfb-bus. The only supported bus for
-now is i2c, and the supported chips are ssd1306 and ssd1307.
+now is i2c, and the supported chips are ssd1305, ssd1306 and ssd1307.
   - reg: Should contain address of the controller on the I2C bus. Most likely
  0x3c or 0x3d
   - pwm: Should contain the pwm to use according to the OF device tree PWM
diff --git a/drivers/video/fbdev/ssd1307fb.c b/drivers/video/fbdev/ssd1307fb.c
index 9a66118..6fecec8 100644
--- a/drivers/video/fbdev/ssd1307fb.c
+++ b/drivers/video/fbdev/ssd1307fb.c
@@ -16,6 +16,7 @@
 #include linux/pwm.h
 #include linux/delay.h
 
+#define DEVID_SSD1305 5
 #define DEVID_SSD1306 6
 #define DEVID_SSD1307 7
 
@@ -430,6 +431,13 @@ static int ssd1307fb_init(struct ssd1307fb_par *par)
return 0;
 }
 
+static struct ssd1307fb_deviceinfo ssd1307fb_ssd1305_deviceinfo = {
+   .device_id  = DEVID_SSD1305,
+   .default_vcomh = 0x34,
+   .default_dclk_div = 0,
+   .default_dclk_frq = 7,
+};
+
 static struct ssd1307fb_deviceinfo ssd1307fb_ssd1306_deviceinfo = {
.device_id  = DEVID_SSD1306,
.default_vcomh = 0x20,
@@ -446,6 +454,10 @@ static struct ssd1307fb_deviceinfo 
ssd1307fb_ssd1307_deviceinfo = {
 
 static const struct of_device_id ssd1307fb_of_match[] = {
{
+   .compatible = solomon,ssd1305fb-i2c,
+   .data = (void *)ssd1307fb_ssd1305_deviceinfo,
+   },
+   {
.compatible = solomon,ssd1306fb-i2c,
.data = (void *)ssd1307fb_ssd1306_deviceinfo,
},
@@ -618,6 +630,7 @@ static int ssd1307fb_remove(struct i2c_client *client)
 }
 
 static const struct i2c_device_id ssd1307fb_i2c_id[] = {
+   { ssd1305fb, 0 },
{ ssd1306fb, 0 },
{ ssd1307fb, 0 },
{ }
-- 
2.3.0

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCHv4 03/10] of: Add Solomon Systech vendor prefix.

2015-03-16 Thread Thomas Niederprüm
This patch adds the solomon prefix for Solomon Systech Limited.

Signed-off-by: Thomas Niederprüm nied...@physik.uni-kl.de
---
 Documentation/devicetree/bindings/vendor-prefixes.txt | 1 +
 1 file changed, 1 insertion(+)

diff --git a/Documentation/devicetree/bindings/vendor-prefixes.txt 
b/Documentation/devicetree/bindings/vendor-prefixes.txt
index d3f4809..933c8f5 100644
--- a/Documentation/devicetree/bindings/vendor-prefixes.txt
+++ b/Documentation/devicetree/bindings/vendor-prefixes.txt
@@ -169,6 +169,7 @@ sitronixSitronix Technology Corporation
 smsc   Standard Microsystems Corporation
 snps   Synopsys, Inc.
 solidrun   SolidRun
+solomonSolomon Systech Limited
 sony   Sony Corporation
 spansion   Spansion Inc.
 sprd   Spreadtrum Communications Inc.
-- 
2.3.0

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCHv4 07/10] fbdev: ssd1307fb: Add a module parameter to set the refresh rate

2015-03-16 Thread Thomas Niederprüm
This patch adds the module parameter refreshrate to set delay for the
deferred io. The refresh rate is given in units of Hertz. The default
refresh rate is 1 Hz. The refresh rate set through the newly introduced
parameter applies to all instances of the driver and for now it is not
possible to change it individually.

Signed-off-by: Thomas Niederprüm nied...@physik.uni-kl.de
---
 drivers/video/fbdev/ssd1307fb.c | 23 +--
 1 file changed, 17 insertions(+), 6 deletions(-)

diff --git a/drivers/video/fbdev/ssd1307fb.c b/drivers/video/fbdev/ssd1307fb.c
index 6fecec8..8a8d305 100644
--- a/drivers/video/fbdev/ssd1307fb.c
+++ b/drivers/video/fbdev/ssd1307fb.c
@@ -42,6 +42,11 @@
 #defineSSD1307FB_SET_COM_PINS_CONFIG   0xda
 #defineSSD1307FB_SET_VCOMH 0xdb
 
+#define REFRASHRATE 1
+
+static u_int refreshrate = REFRASHRATE;
+module_param(refreshrate, uint, 0);
+
 static u_int contrast = 128;
 module_param(contrast, uint, S_IRUGO);
 
@@ -269,11 +274,6 @@ static void ssd1307fb_deferred_io(struct fb_info *info,
ssd1307fb_update_display(info-par);
 }
 
-static struct fb_deferred_io ssd1307fb_defio = {
-   .delay  = HZ,
-   .deferred_io= ssd1307fb_deferred_io,
-};
-
 static int ssd1307fb_init(struct ssd1307fb_par *par)
 {
int ret;
@@ -474,6 +474,7 @@ static int ssd1307fb_probe(struct i2c_client *client,
 {
struct fb_info *info;
struct device_node *node = client-dev.of_node;
+   struct fb_deferred_io *ssd1307fb_defio;
u32 vmem_size;
struct ssd1307fb_par *par;
u8 *vmem;
@@ -544,10 +545,20 @@ static int ssd1307fb_probe(struct i2c_client *client,
goto fb_alloc_error;
}
 
+   ssd1307fb_defio = devm_kzalloc(client-dev, sizeof(struct 
fb_deferred_io), GFP_KERNEL);
+   if (!ssd1307fb_defio) {
+   dev_err(client-dev, Couldn't allocate deferred io.\n);
+   ret = -ENOMEM;
+   goto fb_alloc_error;
+   }
+
+   ssd1307fb_defio-delay = HZ / refreshrate;
+   ssd1307fb_defio-deferred_io = ssd1307fb_deferred_io;
+
info-fbops = ssd1307fb_ops;
info-fix = ssd1307fb_fix;
info-fix.line_length = par-width / 8;
-   info-fbdefio = ssd1307fb_defio;
+   info-fbdefio = ssd1307fb_defio;
 
info-var = ssd1307fb_var;
info-var.xres = par-width;
-- 
2.3.0

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCHv4 02/10] fbdev: ssd1307fb: Allocate page aligned video memory.

2015-03-16 Thread Thomas Niederprüm
Currently the videomemory is allocated by kmalloc, making it a memory
region that is not necessarily page aligend. This leads to problems
upon mmap call, where the video memory's address gets aligned to the
next page boundary. The result is that the userspace program that issued
the mmap call is not able to access the video memory from the start to
the next page boundary.

This patch changes the allocation of the video memory to use
__get_free_pages() in order to obtain memory that is aligned
to page boundaries.

Signed-off-by: Thomas Niederprüm nied...@physik.uni-kl.de
---
 drivers/video/fbdev/ssd1307fb.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/video/fbdev/ssd1307fb.c b/drivers/video/fbdev/ssd1307fb.c
index 61e0ce8..8d34c56 100644
--- a/drivers/video/fbdev/ssd1307fb.c
+++ b/drivers/video/fbdev/ssd1307fb.c
@@ -489,7 +489,8 @@ static int ssd1307fb_probe(struct i2c_client *client,
 
vmem_size = par-width * par-height / 8;
 
-   vmem = devm_kzalloc(client-dev, vmem_size, GFP_KERNEL);
+   vmem = (void *)__get_free_pages(GFP_KERNEL | __GFP_ZERO,
+   get_order(vmem_size));
if (!vmem) {
dev_err(client-dev, Couldn't allocate graphical memory.\n);
ret = -ENOMEM;
@@ -573,6 +574,7 @@ static int ssd1307fb_remove(struct i2c_client *client)
if (par-ops-remove)
par-ops-remove(par);
fb_deferred_io_cleanup(info);
+   __free_pages(__va(info-fix.smem_start), get_order(info-fix.smem_len));
framebuffer_release(info);
 
return 0;
-- 
2.3.0

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCHv4 00/10] Cleanup and add support for SSD1305

2015-03-16 Thread Thomas Niederprüm
This patch series is the result of making the ssd1307fb driver work with
a Newhaven OLED display using the Solomon SSD1305 controller. To achieve
this the intialization code for the SSD1306 and the SSD1307 is merged
and based on DT configuration to reflect the various possible wirings
of the SSD130X controller (04/10). Based on these changes it is straight
forward to add support for the SSD1305 controller (06/10).

While working on the driver I realized that it was not possible to
correctly mmap the video memory from userspace since the address handed
to the userspace app is a logical one where it should be a physical one.
Patch 01/10 fixes this. Furthermore the memory reserved by kzalloc is
not page aligned while the address handed to userspace is aligned to the
next page frame. This problem is fixed by using __get_free_pages() in 02/10.

Furthermore a module parameter is added to set the delay for the
deferred io update (07/10). Also the backlight class is implemented to make
the contrast setting available in userspace (09/10).

changes since v1 (thanks to Maxime for the feedback):
- dedicated patch for fixing smem_start address
- remove page reserve upon vmalloc
- remove return value check upon display turn-off at module unload
- use a module parameter refreshrate rather than delaydivider
- allocate fbdefio dynamically
- use sysfs_create_groups to create sysfs entries
- remove contrast, vhcom and dclk properties from DT since they are
  not part of hw description. The contrast module parameter was added
  to set contrast at load time. vhcom and dclk stays at it's default
  values for now.
- add new DT properties to in tree users of ssd130X
- rebased to apply on top of linux-next

changes since v2 (thanks to Maxime again):
- free memory allocated by vmalloc on driver unload
- set default values in the init code to the ones of the existing ssd1307
  init code
- added two ACKs (Maxime Ripard)

changes since v3:
- use backlight class rather than dedicated sysfs files to set the 
  contrast (Thanks to Tomi Valkeinen)
- remove [PATCHv3 08/10] fbdev: ssd1307fb: Add module parameter bitsperpixel
- add new patch to blank the display (unreviewed)
- allocate video memory through __get_free_pages() rather than vmalloc
  (Thanks to Geert Uytterhoeven)
- minor rewordings of the commit messages

Thomas Niederprüm (10):
  fbdev: ssd1307fb: fix memory address smem_start.
  fbdev: ssd1307fb: Allocate page aligned video memory.
  of: Add Solomon Systech vendor prefix.
  fbdev: ssd1307fb: Unify init code and obtain hw specific bits from DT
  ARM: mxs: fix in tree users of ssd1306
  fbdev: ssd1307fb: Add support for SSD1305
  fbdev: ssd1307fb: Add a module parameter to set the refresh rate
  fbdev: ssd1307fb: Turn off display on driver unload.
  fbdev: ssd1307fb: add backlight controls for setting the contrast
  fbdev: ssd1307fb: Add blank mode

 .../devicetree/bindings/vendor-prefixes.txt|   1 +
 .../devicetree/bindings/video/ssd1307fb.txt|  23 +-
 arch/arm/boot/dts/imx28-cfa10036.dts   |   3 +
 drivers/video/fbdev/Kconfig|   1 +
 drivers/video/fbdev/ssd1307fb.c| 310 +++--
 5 files changed, 250 insertions(+), 88 deletions(-)

-- 
2.3.0

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCHv4 09/10] fbdev: ssd1307fb: add backlight controls for setting the contrast

2015-03-16 Thread Thomas Niederprüm
The backlight class is used to create userspace handles for
setting the OLED contrast.

Signed-off-by: Thomas Niederprüm nied...@physik.uni-kl.de
---
 drivers/video/fbdev/Kconfig |  1 +
 drivers/video/fbdev/ssd1307fb.c | 58 +
 2 files changed, 59 insertions(+)

diff --git a/drivers/video/fbdev/Kconfig b/drivers/video/fbdev/Kconfig
index b3dd417..da70bae 100644
--- a/drivers/video/fbdev/Kconfig
+++ b/drivers/video/fbdev/Kconfig
@@ -2478,6 +2478,7 @@ config FB_SSD1307
select FB_SYS_IMAGEBLIT
select FB_DEFERRED_IO
select PWM
+   select FB_BACKLIGHT
help
  This driver implements support for the Solomon SSD1307
  OLED controller over I2C.
diff --git a/drivers/video/fbdev/ssd1307fb.c b/drivers/video/fbdev/ssd1307fb.c
index 0d851f1..4ebfcaf 100644
--- a/drivers/video/fbdev/ssd1307fb.c
+++ b/drivers/video/fbdev/ssd1307fb.c
@@ -7,6 +7,7 @@
  */
 
 #include linux/module.h
+#include linux/backlight.h
 #include linux/kernel.h
 #include linux/i2c.h
 #include linux/fb.h
@@ -42,6 +43,8 @@
 #defineSSD1307FB_SET_COM_PINS_CONFIG   0xda
 #defineSSD1307FB_SET_VCOMH 0xdb
 
+#define MAX_CONTRAST 255
+
 #define REFRASHRATE 1
 
 static u_int refreshrate = REFRASHRATE;
@@ -431,6 +434,43 @@ static int ssd1307fb_init(struct ssd1307fb_par *par)
return 0;
 }
 
+static int ssd1307fb_update_bl(struct backlight_device *bdev)
+{
+   struct ssd1307fb_par *par = bl_get_data(bdev);
+   int ret;
+   int brightness = bdev-props.brightness;
+
+   par-contrast = brightness;
+
+   ret = ssd1307fb_write_cmd(par-client, SSD1307FB_CONTRAST);
+   if (ret  0)
+   return ret;
+   ret = ssd1307fb_write_cmd(par-client, par-contrast);
+   if (ret  0)
+   return ret;
+   return 0;
+}
+
+static int ssd1307fb_get_brightness(struct backlight_device *bdev)
+{
+   struct ssd1307fb_par *par = bl_get_data(bdev);
+
+   return par-contrast;
+}
+
+static int ssd1307fb_check_fb(struct backlight_device *bdev,
+  struct fb_info *info)
+{
+   return (info-bl_dev == bdev);
+}
+
+static const struct backlight_ops ssd1307fb_bl_ops = {
+   .options= BL_CORE_SUSPENDRESUME,
+   .update_status  = ssd1307fb_update_bl,
+   .get_brightness = ssd1307fb_get_brightness,
+   .check_fb   = ssd1307fb_check_fb,
+};
+
 static struct ssd1307fb_deviceinfo ssd1307fb_ssd1305_deviceinfo = {
.device_id  = DEVID_SSD1305,
.default_vcomh = 0x34,
@@ -472,6 +512,8 @@ MODULE_DEVICE_TABLE(of, ssd1307fb_of_match);
 static int ssd1307fb_probe(struct i2c_client *client,
   const struct i2c_device_id *id)
 {
+   struct backlight_device *bl;
+   char bl_name[12];
struct fb_info *info;
struct device_node *node = client-dev.of_node;
struct fb_deferred_io *ssd1307fb_defio;
@@ -607,10 +649,24 @@ static int ssd1307fb_probe(struct i2c_client *client,
goto panel_init_error;
}
 
+   snprintf(bl_name, sizeof(bl_name), ssd1307fb%d, info-node);
+   bl = backlight_device_register(bl_name, client-dev, par,
+  ssd1307fb_bl_ops, NULL);
+   bl-props.brightness = contrast;
+   bl-props.max_brightness = MAX_CONTRAST;
+   info-bl_dev = bl;
+
+   if (IS_ERR(bl)) {
+   dev_err(client-dev, unable to register backlight device: 
%ld\n,
+   PTR_ERR(bl));
+   goto bl_init_error;
+   }
dev_info(client-dev, fb%d: %s framebuffer device registered, using 
%d bytes of video memory\n, info-node, info-fix.id, vmem_size);
 
return 0;
 
+bl_init_error:
+   unregister_framebuffer(info);
 panel_init_error:
if (par-device_info-device_id == DEVID_SSD1307) {
pwm_disable(par-pwm);
@@ -630,6 +686,8 @@ static int ssd1307fb_remove(struct i2c_client *client)
 
ssd1307fb_write_cmd(par-client, SSD1307FB_DISPLAY_OFF);
 
+   backlight_device_unregister(info-bl_dev);
+
unregister_framebuffer(info);
if (par-device_info-device_id == DEVID_SSD1307) {
pwm_disable(par-pwm);
-- 
2.3.0

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCHv4 10/10] fbdev: ssd1307fb: Add blank mode

2015-03-16 Thread Thomas Niederprüm
This patch adds ssd1307fb_blank() to make the framebuffer capable
of blanking.

Signed-off-by: Thomas Niederprüm nied...@physik.uni-kl.de
---
 drivers/video/fbdev/ssd1307fb.c | 13 +
 1 file changed, 13 insertions(+)

diff --git a/drivers/video/fbdev/ssd1307fb.c b/drivers/video/fbdev/ssd1307fb.c
index 4ebfcaf..9271bba 100644
--- a/drivers/video/fbdev/ssd1307fb.c
+++ b/drivers/video/fbdev/ssd1307fb.c
@@ -241,6 +241,18 @@ static ssize_t ssd1307fb_write(struct fb_info *info, const 
char __user *buf,
return count;
 }
 
+static int ssd1307fb_blank(int blank_mode, struct fb_info *info)
+{
+   struct ssd1307fb_par *par = info-par;
+   int ret;
+
+   if (blank_mode != FB_BLANK_UNBLANK)
+   ret = ssd1307fb_write_cmd(par-client, SSD1307FB_DISPLAY_OFF);
+   else
+   ret = ssd1307fb_write_cmd(par-client, SSD1307FB_DISPLAY_ON);
+   return ret;
+}
+
 static void ssd1307fb_fillrect(struct fb_info *info, const struct fb_fillrect 
*rect)
 {
struct ssd1307fb_par *par = info-par;
@@ -266,6 +278,7 @@ static struct fb_ops ssd1307fb_ops = {
.owner  = THIS_MODULE,
.fb_read= fb_sys_read,
.fb_write   = ssd1307fb_write,
+   .fb_blank   = ssd1307fb_blank,
.fb_fillrect= ssd1307fb_fillrect,
.fb_copyarea= ssd1307fb_copyarea,
.fb_imageblit   = ssd1307fb_imageblit,
-- 
2.3.0

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCHv4 01/10] fbdev: ssd1307fb: fix memory address smem_start.

2015-03-16 Thread Thomas Niederprüm
the smem_start pointer of the framebuffer info struct needs to hold the
physical address rather than the logical address. Right now the logical
address returned by kmalloc is stored. This patch converts this address
to a physical address and thus fixes a driver crash on mmaping the
framebuffer memory due to an access to the wrong memory address.

Signed-off-by: Thomas Niederprüm nied...@physik.uni-kl.de
Acked-by: Maxime Ripard maxime.rip...@free-electrons.com
---
 drivers/video/fbdev/ssd1307fb.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/video/fbdev/ssd1307fb.c b/drivers/video/fbdev/ssd1307fb.c
index f7ed6d9..61e0ce8 100644
--- a/drivers/video/fbdev/ssd1307fb.c
+++ b/drivers/video/fbdev/ssd1307fb.c
@@ -515,7 +515,7 @@ static int ssd1307fb_probe(struct i2c_client *client,
info-var.blue.offset = 0;
 
info-screen_base = (u8 __force __iomem *)vmem;
-   info-fix.smem_start = (unsigned long)vmem;
+   info-fix.smem_start = __pa(vmem);
info-fix.smem_len = vmem_size;
 
fb_deferred_io_init(info);
-- 
2.3.0

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCHv4 08/10] fbdev: ssd1307fb: Turn off display on driver unload.

2015-03-16 Thread Thomas Niederprüm
This patch turns off the display when the driver is unloaded.

Signed-off-by: Thomas Niederprüm nied...@physik.uni-kl.de
Acked-by: Maxime Ripard maxime.rip...@free-electrons.com
---
 drivers/video/fbdev/ssd1307fb.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/video/fbdev/ssd1307fb.c b/drivers/video/fbdev/ssd1307fb.c
index 8a8d305..0d851f1 100644
--- a/drivers/video/fbdev/ssd1307fb.c
+++ b/drivers/video/fbdev/ssd1307fb.c
@@ -628,6 +628,8 @@ static int ssd1307fb_remove(struct i2c_client *client)
struct fb_info *info = i2c_get_clientdata(client);
struct ssd1307fb_par *par = info-par;
 
+   ssd1307fb_write_cmd(par-client, SSD1307FB_DISPLAY_OFF);
+
unregister_framebuffer(info);
if (par-device_info-device_id == DEVID_SSD1307) {
pwm_disable(par-pwm);
-- 
2.3.0

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCHv4 05/10] ARM: mxs: fix in tree users of ssd1306

2015-03-16 Thread Thomas Niederprüm
This patch updates the in tree-users of the SSD1306 controller for using
the newly introduced DT properties.

Signed-off-by: Thomas Niederprüm nied...@physik.uni-kl.de
---
 arch/arm/boot/dts/imx28-cfa10036.dts | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/arch/arm/boot/dts/imx28-cfa10036.dts 
b/arch/arm/boot/dts/imx28-cfa10036.dts
index b04b6b8..570aa33 100644
--- a/arch/arm/boot/dts/imx28-cfa10036.dts
+++ b/arch/arm/boot/dts/imx28-cfa10036.dts
@@ -99,6 +99,9 @@
solomon,height = 32;
solomon,width = 128;
solomon,page-offset = 0;
+   solomon,com-lrremap;
+   solomon,com-invdir;
+   solomon,com-offset = 32;
};
};
 
-- 
2.3.0

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH 7/8] fbdev: ssd1307fb: Add sysfs handles to expose contrast and dim setting to userspace.

2015-03-13 Thread Thomas Niederprüm
Am Tue, 10 Mar 2015 12:49:19 +0200
schrieb Tomi Valkeinen :

> On 09/02/15 10:52, Maxime Ripard wrote:
> > On Sat, Feb 07, 2015 at 05:42:44PM +0100, Thomas Niederprüm wrote:
> >>>> +static struct device_attribute device_attrs[] = {
> >>>> +__ATTR(contrast, S_IRUGO|S_IWUSR, show_contrast,
> >>>> store_contrast),
> >>>> +__ATTR(dim, S_IRUGO|S_IWUSR, show_dim, store_dim),
> >>>> +
> >>>> +};
> >>>> +
> >>>
> >>> I would have thought this was something accessible through the
> >>> framebuffer ioctl.
> >>>
> >>> Apparently it's not, at least for the contrast, so maybe it
> >>> should be added there, instead of doing it for a single driver?
> >>
> >> I think the contrast setting for an OLED display is much like the
> >> backlight setting for LCD panel. Since there is also no ioctl to
> >> set the backlight of an LCD I wonder if the contrast of an OLED
> >> should have one.
> > 
> > It's too much of framebuffer interface debate for me here. Tomi?
> 
> We have backlight and contrast already in backlight-class and
> lcd-class (drivers/video/backlight/backlight.c and
> drivers/video/backlight/lcd.c). Are those something that could be
> used here instead of custom sysfs files?

I just gave the backlight-class a try and it works like a charm. I
will include it in v4 and drop the sysfs handles instead. Thanks for the
hint!

Thomas

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH 5/8] fbdev: ssd1307fb: Add module parameter bitsperpixel.

2015-03-13 Thread Thomas Niederprüm
Am Tue, 10 Mar 2015 12:45:49 +0200
schrieb Tomi Valkeinen :

> On 14/02/15 17:54, Maxime Ripard wrote:
> > On Sat, Feb 07, 2015 at 05:05:03PM +0100, Thomas Niederprüm wrote:
> >> Am Sat, 7 Feb 2015 12:20:43 +0100
> >> schrieb Maxime Ripard :
> >>
> >>> On Fri, Feb 06, 2015 at 11:28:11PM +0100, nied...@physik.uni-kl.de
> >>> wrote:
> >>>> From: Thomas Niederprüm 
> >>>>
> >>>> This patch adds a module parameter 'bitsperpixel' to adjust the
> >>>> colordepth of the framebuffer. All values >1 will result in
> >>>> memory map of the requested color depth. However only the MSB of
> >>>> each pixel will be sent to the device. The framebuffer
> >>>> identifies itself as a grayscale display with the specified
> >>>> depth.
> >>>
> >>> I'm not sure this is the right thing to do.
> >>>
> >>> The bits per pixel for this display is rightfully defined, used
> >>> and reported to the userspace, why would you want to change that?
> >>
> >> You are right of course. The display is 1bpp and it reports to be 1
> >> bpp. The problem is that there is almost no userspace library that
> >> can handle 1 bit framebuffers correctly. So it is nice if the
> >> framebuffer (optionally) can expose itself as 8 bits per pixel
> >> grayscale to the userspace program. As an example this allows to
> >> run DirectFB on the framebuffer, which is not possible out of the
> >> box for 1bpp.
> >>
> >> Also note that if do not set the module parameter at load time
> >> the framebuffer will be 1bpp. So you have to actively set that
> >> module parameter to make the framebuffer pretend to be more than
> >> 1bpp.
> >>
> >> In any case I don't cling to that patch, I just thought it was a
> >> nice feature.
> > 
> > I'd say that the right fix would be to patch DirectFB, instead of
> > faking that in the kernel.
> > 
> > But again, that's probably Tomi's call, not mine.
> 
> Right, I'm not thrilled =). I don't think it's a good idea to lie to
> the userspace (except when fixing regressions).

Ok, since Maxime and you agree that this is not desirable I will drop
that patch in v4.

Thomas
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH 4/8] fbdev: ssd1307fb: Use vmalloc to allocate video memory.

2015-03-13 Thread Thomas Niederprüm
Am Tue, 10 Mar 2015 13:28:25 +0200
schrieb Tomi Valkeinen :

> On 14/02/15 16:22, Thomas Niederprüm wrote:
> > Am Thu, 12 Feb 2015 16:11:21 +0100
> > schrieb Maxime Ripard :
> > 
> >> On Sat, Feb 07, 2015 at 04:35:41PM +0100, Thomas Niederprüm wrote:
> >>> Am Sat, 7 Feb 2015 12:18:21 +0100
> >>> schrieb Maxime Ripard :
> >>>
> >>>> Hi,
> >>>>
> >>>> On Fri, Feb 06, 2015 at 11:28:10PM +0100,
> >>>> nied...@physik.uni-kl.de wrote:
> >>>>> From: Thomas Niederprüm 
> >>>>>
> >>>>> It makes sense to use vmalloc to allocate the video buffer
> >>>>> since it has to be page aligned memory for using it with mmap.
> >>>>
> >>>> Please wrap your commit log at 80 chars.
> >>>
> >>> I'll try to do so in future, sorry for that.
> >>>
> >>>>
> >>>> It looks like there's numerous fbdev drivers using this
> >>>> (especially since you copy pasted that code, without mentionning
> >>>> it).
> >>>
> >>> Yes, I should have mentioned that in the commit message. As
> >>> implicitly indicated in the cover letter the rvmalloc() and
> >>> rvfree() are copy pasted from the vfb driver. Honestly, I didn't
> >>> give this one too much thought. It seemed a viable solution to the
> >>> mmap problem. For a bit more history on that, see my comment
> >>> below.
> >>>
> >>>>
> >>>> That should be turned into an allocator so that drivers all get
> >>>> this right.
> >>>>
> >>>>> Also deffered io seems buggy in combination with kmalloc'ed
> >>>>> memory (crash on unloading the module).
> >>>>
> >>>> And maybe that's the real issue to fix.
> >>>
> >>> The problem is solved by using vmalloc ;)
> >>
> >> Yep, but why do you need to mark the reserved pages?
> >>
> >> ...
> > 
> > As far as I understood mmaped memory is marked as userspace memory
> > in the page table and is therefore subject to swapping. The pages
> > are marked reserved to make clear that this memory can not be
> > swapped and thus lock the pages in memory. See discussions [0,1,2]. 
> 
> Why is it a problem if it is swapped? Only CPU uses the memory, as far
> as I can see.

It seems to be no problem at all. I was copying the allocation code
from the vfb driver. The memory is no longer marked as reserved from
v2 on.

> Also, isn't doing __pa() for the memory returned by vmalloc plain
> wrong?

> What was the crash about when using kmalloc? It would be good to fix
> defio, as I don't see why it should not work with kmalloced memory.

The main challenge here is that the memory handed to userspace upon
mmap call needs to be page aligned. The memory returned by kmalloc has
no such alignment, but the pointer presented to the userspace program
gets aligned to next page boundary. It's not clear to me whether there
is an easy way to obtain page aligned kmalloc memory. Memory
allocated by vmalloc on the other hand is always aligned to page
boundaries. This is why I chose to go for vmalloc.

Thomas
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH 7/8] fbdev: ssd1307fb: Add sysfs handles to expose contrast and dim setting to userspace.

2015-03-13 Thread Thomas Niederprüm
Am Tue, 10 Mar 2015 12:49:19 +0200
schrieb Tomi Valkeinen tomi.valkei...@ti.com:

 On 09/02/15 10:52, Maxime Ripard wrote:
  On Sat, Feb 07, 2015 at 05:42:44PM +0100, Thomas Niederprüm wrote:
  +static struct device_attribute device_attrs[] = {
  +__ATTR(contrast, S_IRUGO|S_IWUSR, show_contrast,
  store_contrast),
  +__ATTR(dim, S_IRUGO|S_IWUSR, show_dim, store_dim),
  +
  +};
  +
 
  I would have thought this was something accessible through the
  framebuffer ioctl.
 
  Apparently it's not, at least for the contrast, so maybe it
  should be added there, instead of doing it for a single driver?
 
  I think the contrast setting for an OLED display is much like the
  backlight setting for LCD panel. Since there is also no ioctl to
  set the backlight of an LCD I wonder if the contrast of an OLED
  should have one.
  
  It's too much of framebuffer interface debate for me here. Tomi?
 
 We have backlight and contrast already in backlight-class and
 lcd-class (drivers/video/backlight/backlight.c and
 drivers/video/backlight/lcd.c). Are those something that could be
 used here instead of custom sysfs files?

I just gave the backlight-class a try and it works like a charm. I
will include it in v4 and drop the sysfs handles instead. Thanks for the
hint!

Thomas

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH 4/8] fbdev: ssd1307fb: Use vmalloc to allocate video memory.

2015-03-13 Thread Thomas Niederprüm
Am Tue, 10 Mar 2015 13:28:25 +0200
schrieb Tomi Valkeinen tomi.valkei...@ti.com:

 On 14/02/15 16:22, Thomas Niederprüm wrote:
  Am Thu, 12 Feb 2015 16:11:21 +0100
  schrieb Maxime Ripard maxime.rip...@free-electrons.com:
  
  On Sat, Feb 07, 2015 at 04:35:41PM +0100, Thomas Niederprüm wrote:
  Am Sat, 7 Feb 2015 12:18:21 +0100
  schrieb Maxime Ripard maxime.rip...@free-electrons.com:
 
  Hi,
 
  On Fri, Feb 06, 2015 at 11:28:10PM +0100,
  nied...@physik.uni-kl.de wrote:
  From: Thomas Niederprüm nied...@physik.uni-kl.de
 
  It makes sense to use vmalloc to allocate the video buffer
  since it has to be page aligned memory for using it with mmap.
 
  Please wrap your commit log at 80 chars.
 
  I'll try to do so in future, sorry for that.
 
 
  It looks like there's numerous fbdev drivers using this
  (especially since you copy pasted that code, without mentionning
  it).
 
  Yes, I should have mentioned that in the commit message. As
  implicitly indicated in the cover letter the rvmalloc() and
  rvfree() are copy pasted from the vfb driver. Honestly, I didn't
  give this one too much thought. It seemed a viable solution to the
  mmap problem. For a bit more history on that, see my comment
  below.
 
 
  That should be turned into an allocator so that drivers all get
  this right.
 
  Also deffered io seems buggy in combination with kmalloc'ed
  memory (crash on unloading the module).
 
  And maybe that's the real issue to fix.
 
  The problem is solved by using vmalloc ;)
 
  Yep, but why do you need to mark the reserved pages?
 
  ...
  
  As far as I understood mmaped memory is marked as userspace memory
  in the page table and is therefore subject to swapping. The pages
  are marked reserved to make clear that this memory can not be
  swapped and thus lock the pages in memory. See discussions [0,1,2]. 
 
 Why is it a problem if it is swapped? Only CPU uses the memory, as far
 as I can see.

It seems to be no problem at all. I was copying the allocation code
from the vfb driver. The memory is no longer marked as reserved from
v2 on.

 Also, isn't doing __pa() for the memory returned by vmalloc plain
 wrong?

 What was the crash about when using kmalloc? It would be good to fix
 defio, as I don't see why it should not work with kmalloced memory.

The main challenge here is that the memory handed to userspace upon
mmap call needs to be page aligned. The memory returned by kmalloc has
no such alignment, but the pointer presented to the userspace program
gets aligned to next page boundary. It's not clear to me whether there
is an easy way to obtain page aligned kmalloc memory. Memory
allocated by vmalloc on the other hand is always aligned to page
boundaries. This is why I chose to go for vmalloc.

Thomas
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH 5/8] fbdev: ssd1307fb: Add module parameter bitsperpixel.

2015-03-13 Thread Thomas Niederprüm
Am Tue, 10 Mar 2015 12:45:49 +0200
schrieb Tomi Valkeinen tomi.valkei...@ti.com:

 On 14/02/15 17:54, Maxime Ripard wrote:
  On Sat, Feb 07, 2015 at 05:05:03PM +0100, Thomas Niederprüm wrote:
  Am Sat, 7 Feb 2015 12:20:43 +0100
  schrieb Maxime Ripard maxime.rip...@free-electrons.com:
 
  On Fri, Feb 06, 2015 at 11:28:11PM +0100, nied...@physik.uni-kl.de
  wrote:
  From: Thomas Niederprüm nied...@physik.uni-kl.de
 
  This patch adds a module parameter 'bitsperpixel' to adjust the
  colordepth of the framebuffer. All values 1 will result in
  memory map of the requested color depth. However only the MSB of
  each pixel will be sent to the device. The framebuffer
  identifies itself as a grayscale display with the specified
  depth.
 
  I'm not sure this is the right thing to do.
 
  The bits per pixel for this display is rightfully defined, used
  and reported to the userspace, why would you want to change that?
 
  You are right of course. The display is 1bpp and it reports to be 1
  bpp. The problem is that there is almost no userspace library that
  can handle 1 bit framebuffers correctly. So it is nice if the
  framebuffer (optionally) can expose itself as 8 bits per pixel
  grayscale to the userspace program. As an example this allows to
  run DirectFB on the framebuffer, which is not possible out of the
  box for 1bpp.
 
  Also note that if do not set the module parameter at load time
  the framebuffer will be 1bpp. So you have to actively set that
  module parameter to make the framebuffer pretend to be more than
  1bpp.
 
  In any case I don't cling to that patch, I just thought it was a
  nice feature.
  
  I'd say that the right fix would be to patch DirectFB, instead of
  faking that in the kernel.
  
  But again, that's probably Tomi's call, not mine.
 
 Right, I'm not thrilled =). I don't think it's a good idea to lie to
 the userspace (except when fixing regressions).

Ok, since Maxime and you agree that this is not desirable I will drop
that patch in v4.

Thomas
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCHv3 03/10] of: Add Solomon Systech vendor prefix.

2015-03-09 Thread Thomas Niederprüm
This patch adds the solomon prefix for Solomon Systech Limited.

Signed-off-by: Thomas Niederprüm 
---
 Documentation/devicetree/bindings/vendor-prefixes.txt | 1 +
 1 file changed, 1 insertion(+)

diff --git a/Documentation/devicetree/bindings/vendor-prefixes.txt 
b/Documentation/devicetree/bindings/vendor-prefixes.txt
index d3f4809..933c8f5 100644
--- a/Documentation/devicetree/bindings/vendor-prefixes.txt
+++ b/Documentation/devicetree/bindings/vendor-prefixes.txt
@@ -169,6 +169,7 @@ sitronixSitronix Technology Corporation
 smsc   Standard Microsystems Corporation
 snps   Synopsys, Inc.
 solidrun   SolidRun
+solomonSolomon Systech Limited
 sony   Sony Corporation
 spansion   Spansion Inc.
 sprd   Spreadtrum Communications Inc.
-- 
2.3.0

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCHv3 08/10] fbdev: ssd1307fb: Add module parameter bitsperpixel.

2015-03-09 Thread Thomas Niederprüm
This patch adds a module parameter 'bitsperpixel' to adjust the colordepth
of the framebuffer. All values >1 will result in memory map of the requested
color depth. However only the MSB of each pixel will be sent to the device.
The framebuffer identifies itself as a grayscale display with the specified
depth.

Signed-off-by: Thomas Niederprüm 
---
 drivers/video/fbdev/ssd1307fb.c | 25 -
 1 file changed, 16 insertions(+), 9 deletions(-)

diff --git a/drivers/video/fbdev/ssd1307fb.c b/drivers/video/fbdev/ssd1307fb.c
index 7c8e627..3cf4da1 100644
--- a/drivers/video/fbdev/ssd1307fb.c
+++ b/drivers/video/fbdev/ssd1307fb.c
@@ -44,6 +44,10 @@
 #defineSSD1307FB_SET_VCOMH 0xdb
 
 #define REFRASHRATE 1
+#define BITSPERPIXEL 1
+
+static u_int bitsperpixel = BITSPERPIXEL;
+module_param(bitsperpixel, uint, 0);
 
 static u_int refreshrate = REFRASHRATE;
 module_param(refreshrate, uint, 0);
@@ -99,7 +103,8 @@ static struct fb_fix_screeninfo ssd1307fb_fix = {
 };
 
 static struct fb_var_screeninfo ssd1307fb_var = {
-   .bits_per_pixel = 1,
+   .bits_per_pixel = BITSPERPIXEL,
+   .grayscale = 1,
 };
 
 static struct ssd1307fb_array *ssd1307fb_alloc_array(u32 len, u8 type)
@@ -194,10 +199,11 @@ static void ssd1307fb_update_display(struct ssd1307fb_par 
*par)
array->data[array_idx] = 0;
for (k = 0; k < 8; k++) {
u32 page_length = par->width * i;
-   u32 index = page_length + (par->width * k + j) 
/ 8;
+   u32 index = page_length * bitsperpixel + 
(par->width * k + j) * bitsperpixel / 8;
u8 byte = *(vmem + index);
-   u8 bit = byte & (1 << (j % 8));
-   bit = bit >> (j % 8);
+   u8 bit = byte & (((1 << (bitsperpixel))-1) << 
(j % 8/bitsperpixel));
+
+   bit = (bit >> (j % 8/bitsperpixel)) >> 
(bitsperpixel-1);
array->data[array_idx] |= bit << k;
}
}
@@ -536,7 +542,7 @@ static int ssd1307fb_probe(struct i2c_client *client,
par->dclk_div = par->device_info->default_dclk_div;
par->dclk_frq = par->device_info->default_dclk_frq;
 
-   vmem_size = par->width * par->height / 8;
+   vmem_size = par->width * par->height * bitsperpixel / 8;
 
vmem = vzalloc(vmem_size);
if (!vmem) {
@@ -557,20 +563,21 @@ static int ssd1307fb_probe(struct i2c_client *client,
 
info->fbops = _ops;
info->fix = ssd1307fb_fix;
-   info->fix.line_length = par->width / 8;
+   info->fix.line_length = par->width * bitsperpixel / 8;
info->fbdefio = ssd1307fb_defio;
 
info->var = ssd1307fb_var;
+   info->var.bits_per_pixel = bitsperpixel;
info->var.xres = par->width;
info->var.xres_virtual = par->width;
info->var.yres = par->height;
info->var.yres_virtual = par->height;
 
-   info->var.red.length = 1;
+   info->var.red.length = bitsperpixel;
info->var.red.offset = 0;
-   info->var.green.length = 1;
+   info->var.green.length = bitsperpixel;
info->var.green.offset = 0;
-   info->var.blue.length = 1;
+   info->var.blue.length = bitsperpixel;
info->var.blue.offset = 0;
 
info->screen_base = (u8 __force __iomem *)vmem;
-- 
2.3.0

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCHv3 04/10] fbdev: ssd1307fb: Unify init code and obtain hw specific bits from DT

2015-03-09 Thread Thomas Niederprüm
The 130X controllers are very similar from the configuration point of view.
The configuration registers for the SSD1305/6/7 are bit identical (except the
the VHCOM register and the the default values for clock setup register). This
patch unifies the init code of the controller and adds hardware specific
properties to DT that are needed to correctly initialize the device.

The SSD130X can be wired to the OLED panel in various ways. Even for the
same controller this wiring can differ from one display module to another
and can not be probed by software. The added DT properties reflect these
hardware decisions of the display module manufacturer.
The 'com-sequential', 'com-lrremap' and 'com-invdir' values define different
possibilities for the COM signals pin configuration and readout direction
of the video memory. The 'segment-no-remap' allows the inversion of the
memory-to-pin mapping ultimately inverting the order of the controllers
output pins. The 'prechargepX' values need to be adapted according the
capacitance of the OLEDs pixel cells.

So far these hardware specific bits are hard coded in the init code, making
the driver usable only for one certain wiring of the controller. This patch
makes the driver usable with all possible hardware setups, given a valid hw
description in DT. If these values are not set in DT the default values,
as they are set in the ssd1307 init code right now, are used. This implies
that without the corresponding DT property "segment-no-remap" the segment
remap of the ssd130X controller gets activated. Even though this is not the
default behaviour according to the datasheet it maintains backward
compatibility with older DTBs.

Note that the SSD1306 does not seem to be using the configuration written to
the registers at all. Therefore this patch does not try to maintain these
values without changes in DT. For reference an example is added to the DT
bindings documentation that reproduces the configuration that is set in the
current init code.

Signed-off-by: Thomas Niederprüm 
---
 .../devicetree/bindings/video/ssd1307fb.txt|  21 +++
 drivers/video/fbdev/ssd1307fb.c| 195 -
 2 files changed, 137 insertions(+), 79 deletions(-)

diff --git a/Documentation/devicetree/bindings/video/ssd1307fb.txt 
b/Documentation/devicetree/bindings/video/ssd1307fb.txt
index 7a12542..be27562 100644
--- a/Documentation/devicetree/bindings/video/ssd1307fb.txt
+++ b/Documentation/devicetree/bindings/video/ssd1307fb.txt
@@ -15,6 +15,16 @@ Required properties:
 
 Optional properties:
   - reset-active-low: Is the reset gpio is active on physical low?
+  - solomon,segment-no-remap: Display needs normal (non-inverted) data column
+  to segment mapping
+  - solomon,com-sequential: Display uses sequential COM pin configuration
+  - solomon,com-lrremap: Display uses left-right COM pin remap
+  - solomon,com-invdir: Display uses inverted COM pin scan direction
+  - solomon,com-offset: Offset of the first COM pin wired to the panel
+  - solomon,prechargep1: Length of deselect period (phase 1) in clock cycles.
+  - solomon,prechargep2: Length of precharge period (phase 2) in clock cycles.
+ This needs to be the higher, the higher the 
capacitance
+ of the OLED's pixels is
 
 [0]: Documentation/devicetree/bindings/pwm/pwm.txt
 
@@ -26,3 +36,14 @@ ssd1307: oled@3c {
 reset-gpios = < 7>;
 reset-active-low;
 };
+
+ssd1306: oled@3c {
+compatible = "solomon,ssd1306fb-i2c";
+reg = <0x3c>;
+pwms = < 4 3000>;
+reset-gpios = < 7>;
+reset-active-low;
+solomon,com-lrremap;
+solomon,com-invdir;
+solomon,com-offset = <32>;
+};
diff --git a/drivers/video/fbdev/ssd1307fb.c b/drivers/video/fbdev/ssd1307fb.c
index 310474a..b451361 100644
--- a/drivers/video/fbdev/ssd1307fb.c
+++ b/drivers/video/fbdev/ssd1307fb.c
@@ -17,6 +17,9 @@
 #include 
 #include 
 
+#define DEVID_SSD1306 6
+#define DEVID_SSD1307 7
+
 #define SSD1307FB_DATA 0x40
 #define SSD1307FB_COMMAND  0x80
 
@@ -39,22 +42,38 @@
 #defineSSD1307FB_SET_COM_PINS_CONFIG   0xda
 #defineSSD1307FB_SET_VCOMH 0xdb
 
+static u_int contrast = 128;
+module_param(contrast, uint, S_IRUGO);
+
 struct ssd1307fb_par;
 
-struct ssd1307fb_ops {
-   int (*init)(struct ssd1307fb_par *);
-   int (*remove)(struct ssd1307fb_par *);
+struct ssd1307fb_deviceinfo {
+   int device_id;
+   u32 default_vcomh;
+   u32 default_dclk_div;
+   u32 default_dclk_frq;
 };
 
 struct ssd1307fb_par {
+   u32 com_invdir;
+   u32 com_lrremap;
+   u32 com_offset;
+   u32 com_seq;
+   u32 contrast;
+   u32 dclk_div;
+   u32 dclk_frq;
+   struct ssd1307fb_deviceinfo *device_info;
struct i2c_client *client;
u32 height;
struct fb_info *in

[PATCHv3 09/10] fbdev: ssd1307fb: Add sysfs handles to expose contrast and dim setting to userspace.

2015-03-09 Thread Thomas Niederprüm
This patch adds sysfs handles to enable userspace control over the display
contrast as well as the dim mode. The handles are available as "contrast"
and "dim" in the framebuffers sysfs domain.

Signed-off-by: Thomas Niederprüm 
---
 drivers/video/fbdev/ssd1307fb.c | 90 +
 1 file changed, 90 insertions(+)

diff --git a/drivers/video/fbdev/ssd1307fb.c b/drivers/video/fbdev/ssd1307fb.c
index 3cf4da1..fee6324 100644
--- a/drivers/video/fbdev/ssd1307fb.c
+++ b/drivers/video/fbdev/ssd1307fb.c
@@ -33,6 +33,7 @@
 #define SSD1307FB_CONTRAST 0x81
 #defineSSD1307FB_CHARGE_PUMP   0x8d
 #define SSD1307FB_SEG_REMAP_ON 0xa1
+#define SSD1307FB_DISPLAY_DIM  0xac
 #define SSD1307FB_DISPLAY_OFF  0xae
 #define SSD1307FB_SET_MULTIPLEX_RATIO  0xa8
 #define SSD1307FB_DISPLAY_ON   0xaf
@@ -43,6 +44,9 @@
 #defineSSD1307FB_SET_COM_PINS_CONFIG   0xda
 #defineSSD1307FB_SET_VCOMH 0xdb
 
+#define MIN_CONTRAST 0
+#define MAX_CONTRAST 255
+
 #define REFRASHRATE 1
 #define BITSPERPIXEL 1
 
@@ -73,6 +77,7 @@ struct ssd1307fb_par {
u32 dclk_div;
u32 dclk_frq;
struct ssd1307fb_deviceinfo *device_info;
+   u32 dim;
struct i2c_client *client;
u32 height;
struct fb_info *info;
@@ -476,6 +481,87 @@ static const struct of_device_id ssd1307fb_of_match[] = {
 };
 MODULE_DEVICE_TABLE(of, ssd1307fb_of_match);
 
+static ssize_t show_contrast(struct device *device,
+  struct device_attribute *attr, char *buf)
+{
+   struct fb_info *info = dev_get_drvdata(device);
+   struct ssd1307fb_par *par = info->par;
+
+   return snprintf(buf, PAGE_SIZE, "%d\n", par->contrast);
+}
+
+static ssize_t store_contrast(struct device *device,
+   struct device_attribute *attr,
+   const char *buf, size_t count)
+{
+   struct fb_info *info = dev_get_drvdata(device);
+   struct ssd1307fb_par *par = info->par;
+   unsigned long contrastval;
+   int ret;
+
+   ret = kstrtoul(buf, 0, );
+   if (ret < 0)
+   return ret;
+
+   par->contrast = max_t(ulong, min_t(ulong, contrastval,
+   (ulong)MAX_CONTRAST), (ulong)MIN_CONTRAST);
+
+   ret = ssd1307fb_write_cmd(par->client, SSD1307FB_CONTRAST);
+   ret = ret & ssd1307fb_write_cmd(par->client, par->contrast);
+   if (ret < 0)
+   return ret;
+
+   return count;
+}
+
+
+static ssize_t show_dim(struct device *device,
+  struct device_attribute *attr, char *buf)
+{
+   struct fb_info *info = dev_get_drvdata(device);
+   struct ssd1307fb_par *par = info->par;
+
+   return snprintf(buf, PAGE_SIZE, "%d\n", par->dim);
+}
+
+static ssize_t store_dim(struct device *device,
+   struct device_attribute *attr,
+   const char *buf, size_t count)
+{
+   struct fb_info *info = dev_get_drvdata(device);
+   struct ssd1307fb_par *par = info->par;
+   unsigned long dimval;
+   int ret;
+
+   ret = kstrtoul(buf, 0, );
+   if (ret < 0)
+   return ret;
+
+   par->dim = max_t(ulong, min_t(ulong, dimval, (ulong)1), (ulong)0);
+   if (par->dim)
+   ret = ssd1307fb_write_cmd(par->client, SSD1307FB_DISPLAY_DIM);
+   else
+   ret = ssd1307fb_write_cmd(par->client, SSD1307FB_DISPLAY_ON);
+   if (ret < 0)
+   return ret;
+
+   return count;
+}
+
+static DEVICE_ATTR(contrast, S_IRUGO|S_IWUSR, show_contrast, store_contrast);
+static DEVICE_ATTR(dim, S_IRUGO|S_IWUSR, show_dim, store_dim);
+
+static struct attribute *panel_attrs[] = {
+   _attr_contrast.attr,
+   _attr_dim.attr,
+   NULL,
+};
+
+static struct attribute_group brightness_attr_grp = {
+   .name  = "brightness",
+   .attrs = panel_attrs,
+};
+
 static int ssd1307fb_probe(struct i2c_client *client,
   const struct i2c_device_id *id)
 {
@@ -614,6 +700,10 @@ static int ssd1307fb_probe(struct i2c_client *client,
goto panel_init_error;
}
 
+   ret = sysfs_create_group(>dev->kobj, _attr_grp);
+   if (ret)
+   dev_err(>dev, "Couldn't register sysfs nodes\n");
+
dev_info(>dev, "fb%d: %s framebuffer device registered, using 
%d bytes of video memory\n", info->node, info->fix.id, vmem_size);
 
return 0;
-- 
2.3.0

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCHv3 02/10] fbdev: ssd1307fb: Use vmalloc to allocate video memory.

2015-03-09 Thread Thomas Niederprüm
It makes sense to use vmalloc to allocate the video buffer since it has to be
page aligned memory for using it with mmap. Also deffered io seems buggy in
combination with kmalloc'ed memory (crash on unloading the module).

Signed-off-by: Thomas Niederprüm 
---
 drivers/video/fbdev/ssd1307fb.c | 5 -
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/video/fbdev/ssd1307fb.c b/drivers/video/fbdev/ssd1307fb.c
index 61e0ce8..310474a 100644
--- a/drivers/video/fbdev/ssd1307fb.c
+++ b/drivers/video/fbdev/ssd1307fb.c
@@ -11,6 +11,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -489,7 +490,7 @@ static int ssd1307fb_probe(struct i2c_client *client,
 
vmem_size = par->width * par->height / 8;
 
-   vmem = devm_kzalloc(>dev, vmem_size, GFP_KERNEL);
+   vmem = vzalloc(vmem_size);
if (!vmem) {
dev_err(>dev, "Couldn't allocate graphical memory.\n");
ret = -ENOMEM;
@@ -559,6 +560,7 @@ panel_init_error:
par->ops->remove(par);
 reset_oled_error:
fb_deferred_io_cleanup(info);
+   vfree(vmem);
 fb_alloc_error:
framebuffer_release(info);
return ret;
@@ -573,6 +575,7 @@ static int ssd1307fb_remove(struct i2c_client *client)
if (par->ops->remove)
par->ops->remove(par);
fb_deferred_io_cleanup(info);
+   vfree(__va(info->fix.smem_start));
framebuffer_release(info);
 
return 0;
-- 
2.3.0

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCHv3 07/10] fbdev: ssd1307fb: Add module parameter to set refresh rate of the display

2015-03-09 Thread Thomas Niederprüm
This patch adds the module parameter "refreshrate" to set delay for the
deferred io. The refresh rate is given in units of Hertz. The default
refresh rate is 1 Hz.

Signed-off-by: Thomas Niederprüm 
---
 drivers/video/fbdev/ssd1307fb.c | 23 +--
 1 file changed, 17 insertions(+), 6 deletions(-)

diff --git a/drivers/video/fbdev/ssd1307fb.c b/drivers/video/fbdev/ssd1307fb.c
index 08720be..7c8e627 100644
--- a/drivers/video/fbdev/ssd1307fb.c
+++ b/drivers/video/fbdev/ssd1307fb.c
@@ -43,6 +43,11 @@
 #defineSSD1307FB_SET_COM_PINS_CONFIG   0xda
 #defineSSD1307FB_SET_VCOMH 0xdb
 
+#define REFRASHRATE 1
+
+static u_int refreshrate = REFRASHRATE;
+module_param(refreshrate, uint, 0);
+
 static u_int contrast = 128;
 module_param(contrast, uint, S_IRUGO);
 
@@ -270,11 +275,6 @@ static void ssd1307fb_deferred_io(struct fb_info *info,
ssd1307fb_update_display(info->par);
 }
 
-static struct fb_deferred_io ssd1307fb_defio = {
-   .delay  = HZ,
-   .deferred_io= ssd1307fb_deferred_io,
-};
-
 static int ssd1307fb_init(struct ssd1307fb_par *par)
 {
int ret;
@@ -475,6 +475,7 @@ static int ssd1307fb_probe(struct i2c_client *client,
 {
struct fb_info *info;
struct device_node *node = client->dev.of_node;
+   struct fb_deferred_io *ssd1307fb_defio;
u32 vmem_size;
struct ssd1307fb_par *par;
u8 *vmem;
@@ -544,10 +545,20 @@ static int ssd1307fb_probe(struct i2c_client *client,
goto fb_alloc_error;
}
 
+   ssd1307fb_defio = devm_kzalloc(>dev, sizeof(struct 
fb_deferred_io), GFP_KERNEL);
+   if (!ssd1307fb_defio) {
+   dev_err(>dev, "Couldn't allocate deferred io.\n");
+   ret = -ENOMEM;
+   goto fb_alloc_error;
+   }
+
+   ssd1307fb_defio->delay = HZ / refreshrate;
+   ssd1307fb_defio->deferred_io = ssd1307fb_deferred_io;
+
info->fbops = _ops;
info->fix = ssd1307fb_fix;
info->fix.line_length = par->width / 8;
-   info->fbdefio = _defio;
+   info->fbdefio = ssd1307fb_defio;
 
info->var = ssd1307fb_var;
info->var.xres = par->width;
-- 
2.3.0

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCHv3 01/10] fbdev: ssd1307fb: fix memory address smem_start.

2015-03-09 Thread Thomas Niederprüm
the smem_start pointer of the framebuffer info struct needs to hold the
physical address rather than the virtual address. This patch fixes a
driver crash on mmaping the framebuffer memory due to an access to the
memory address.

Note however that the memory allocated by kzalloc is not page aligned,
while the address presented on a mmap call is aligned to the next page
boudary.

Signed-off-by: Thomas Niederprüm 
Acked-by: Maxime Ripard 
---
 drivers/video/fbdev/ssd1307fb.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/video/fbdev/ssd1307fb.c b/drivers/video/fbdev/ssd1307fb.c
index f7ed6d9..61e0ce8 100644
--- a/drivers/video/fbdev/ssd1307fb.c
+++ b/drivers/video/fbdev/ssd1307fb.c
@@ -515,7 +515,7 @@ static int ssd1307fb_probe(struct i2c_client *client,
info->var.blue.offset = 0;
 
info->screen_base = (u8 __force __iomem *)vmem;
-   info->fix.smem_start = (unsigned long)vmem;
+   info->fix.smem_start = __pa(vmem);
info->fix.smem_len = vmem_size;
 
fb_deferred_io_init(info);
-- 
2.3.0

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCHv3 00/10] fbdev: ssd1307fb: Cleanup and add support for SSD1305

2015-03-09 Thread Thomas Niederprüm
This patch series is the result of making the ssd1307fb driver work with
a Newhaven OLED display using the Solomon SSD1305 controller. To achieve
this the intialization code for the SSD1306 and the SSD1307 is merged
and based on DT configuration to reflect the various possible wirings
of the SSD130X controller (04/10). Based on these changes it is straight
forward to add support for the SSD1305 controller (06/10).

While working on the driver I realized that it was not possible to
correctly mmap the video memory from userspace since the address handed
to the userspace app is a virtual one where it should be a physical one.
Patch 01/10 fixes this. Furthermore the memory reserved by kzalloc is
not page aligned while the address handed to userspace is aligned to the
next page frame. This problem is fixed by using vmalloc in 02/10.

Furthermore module parameters are added to set the bits per pixel
and the delay for the deferred io update. It makes sense to set
the bits per pixel for the video memory to 8 bits since there is
only very poor userspace support for 1 bit framebuffers.

Also sysfs handles are added to make the contrast settings and dim
mode setting available in userspace.

changes since v1 (thanks to Maxime for the feedback):
- dedicated patch for fixing smem_start address
- remove page reserve upon vmalloc
- remove return value check upon display turn-off at module unload
- use a module parameter refreshrate rather than delaydivider
- allocate fbdefio dynamically
- use sysfs_create_groups to create sysfs entries
- remove contrast, vhcom and dclk properties from DT since they are
  not part of hw description. The contrast module parameter was added
  to set contrast at load time. vhcom and dclk stays at it's default
  values for now.
- add new DT properties to in tree users of ssd130X
- rebased to apply on top of linux-next

changes since v2 (thanks to Maxime again):
- free memory allocated by vmalloc on driver unload
- set default values in the init code to the ones of the existing ssd1307
  init code
- added two ACKs (Maxime Ripard)

Thomas Niederprüm (10):
  fbdev: ssd1307fb: fix memory address smem_start.
  fbdev: ssd1307fb: Use vmalloc to allocate video memory.
  of: Add Solomon Systech vendor prefix.
  fbdev: ssd1307fb: Unify init code and obtain hw specific bits from DT
  ARM: mxs: fix in tree users of ssd1306
  fbdev: ssd1307fb: Add support for SSD1305
  fbdev: ssd1307fb: Add module parameter to set refresh rate of the
display
  fbdev: ssd1307fb: Add module parameter bitsperpixel.
  fbdev: ssd1307fb: Add sysfs handles to expose contrast and dim setting
to userspace.
  fbdev: ssd1307fb: Turn off display on driver unload.

 .../devicetree/bindings/vendor-prefixes.txt|   1 +
 .../devicetree/bindings/video/ssd1307fb.txt|  23 +-
 arch/arm/boot/dts/imx28-cfa10036.dts   |   4 +
 drivers/video/fbdev/ssd1307fb.c| 355 +++--
 4 files changed, 286 insertions(+), 97 deletions(-)

-- 
2.3.0

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


  1   2   >