* [PATCH v12 2/6] video: add of helper for videomode
From: Steffen Trumtrar @ 2012-11-20 15:54 UTC (permalink / raw)
To: devicetree-discuss
Cc: Steffen Trumtrar, Philipp Zabel, Rob Herring, linux-fbdev,
dri-devel, Laurent Pinchart, Thierry Reding,
Guennady Liakhovetski, linux-media, Tomi Valkeinen,
Stephen Warren, kernel, Florian Tobias Schandinat, David Airlie
In-Reply-To: <1353426896-6045-1-git-send-email-s.trumtrar@pengutronix.de>
This adds support for reading display timings from DT or/and convert one of those
timings to a videomode.
The of_display_timing implementation supports multiple children where each
property can have up to 3 values. All children are read into an array, that
can be queried.
of_get_videomode converts exactly one of that timings to a struct videomode.
Signed-off-by: Steffen Trumtrar <s.trumtrar@pengutronix.de>
Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
Acked-by: Stephen Warren <swarren@nvidia.com>
Reviewed-by: Thierry Reding <thierry.reding@avionic-design.de>
Acked-by: Thierry Reding <thierry.reding@avionic-design.de>
Tested-by: Thierry Reding <thierry.reding@avionic-design.de>
Tested-by: Philipp Zabel <p.zabel@pengutronix.de>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
.../devicetree/bindings/video/display-timings.txt | 107 ++++++++++
drivers/video/Kconfig | 13 ++
drivers/video/Makefile | 2 +
drivers/video/of_display_timing.c | 216 ++++++++++++++++++++
drivers/video/of_videomode.c | 48 +++++
include/linux/of_display_timings.h | 20 ++
include/linux/of_videomode.h | 18 ++
7 files changed, 424 insertions(+)
create mode 100644 Documentation/devicetree/bindings/video/display-timings.txt
create mode 100644 drivers/video/of_display_timing.c
create mode 100644 drivers/video/of_videomode.c
create mode 100644 include/linux/of_display_timings.h
create mode 100644 include/linux/of_videomode.h
diff --git a/Documentation/devicetree/bindings/video/display-timings.txt b/Documentation/devicetree/bindings/video/display-timings.txt
new file mode 100644
index 0000000..a05cade
--- /dev/null
+++ b/Documentation/devicetree/bindings/video/display-timings.txt
@@ -0,0 +1,107 @@
+display-timings bindings
+============
+
+display-timings node
+--------------------
+
+required properties:
+ - none
+
+optional properties:
+ - native-mode: The native mode for the display, in case multiple modes are
+ provided. When omitted, assume the first node is the native.
+
+timings subnode
+---------------
+
+required properties:
+ - hactive, vactive: Display resolution
+ - hfront-porch, hback-porch, hsync-len: Horizontal Display timing parameters
+ in pixels
+ vfront-porch, vback-porch, vsync-len: Vertical display timing parameters in
+ lines
+ - clock-frequency: display clock in Hz
+
+optional properties:
+ - hsync-active: Hsync pulse is active low/high/ignored
+ - vsync-active: Vsync pulse is active low/high/ignored
+ - de-active: Data-Enable pulse is active low/high/ignored
+ - pixelclk-inverted: pixelclock is inverted/non-inverted/ignored
+ - interlaced (bool)
+ - doublescan (bool)
+
+All the optional properties that are not bool follow the following logic:
+ <1>: high active
+ <0>: low active
+ omitted: not used on hardware
+
+There are different ways of describing the capabilities of a display. The devicetree
+representation corresponds to the one commonly found in datasheets for displays.
+If a display supports multiple signal timings, the native-mode can be specified.
+
+The parameters are defined as
+
+struct display_timing
+==========+
+ +----------+---------------------------------------------+----------+-------+
+ | | ↑ | | |
+ | | |vback_porch | | |
+ | | ↓ | | |
+ +----------###############################################----------+-------+
+ | # ↑ # | |
+ | # | # | |
+ | hback # | # hfront | hsync |
+ | porch # | hactive # porch | len |
+ |<-------->#<---------------+--------------------------->#<-------->|<----->|
+ | # | # | |
+ | # |vactive # | |
+ | # | # | |
+ | # ↓ # | |
+ +----------###############################################----------+-------+
+ | | ↑ | | |
+ | | |vfront_porch | | |
+ | | ↓ | | |
+ +----------+---------------------------------------------+----------+-------+
+ | | ↑ | | |
+ | | |vsync_len | | |
+ | | ↓ | | |
+ +----------+---------------------------------------------+----------+-------+
+
+
+Example:
+
+ display-timings {
+ native-mode = <&timing0>;
+ timing0: 1920p24 {
+ /* 1920x1080p24 */
+ clock-frequency = <52000000>;
+ hactive = <1920>;
+ vactive = <1080>;
+ hfront-porch = <25>;
+ hback-porch = <25>;
+ hsync-len = <25>;
+ vback-porch = <2>;
+ vfront-porch = <2>;
+ vsync-len = <2>;
+ hsync-active = <1>;
+ };
+ };
+
+Every required property also supports the use of ranges, so the commonly used
+datasheet description with <min typ max>-tuples can be used.
+
+Example:
+
+ timing1: timing {
+ /* 1920x1080p24 */
+ clock-frequency = <148500000>;
+ hactive = <1920>;
+ vactive = <1080>;
+ hsync-len = <0 44 60>;
+ hfront-porch = <80 88 95>;
+ hback-porch = <100 148 160>;
+ vfront-porch = <0 4 6>;
+ vback-porch = <0 36 50>;
+ vsync-len = <0 5 6>;
+ };
diff --git a/drivers/video/Kconfig b/drivers/video/Kconfig
index 2a23b18..807fedd 100644
--- a/drivers/video/Kconfig
+++ b/drivers/video/Kconfig
@@ -39,6 +39,19 @@ config DISPLAY_TIMING
config VIDEOMODE
bool
+config OF_DISPLAY_TIMING
+ bool "Enable OF display timing support"
+ select DISPLAY_TIMING
+ help
+ helper to parse display timings from the devicetree
+
+config OF_VIDEOMODE
+ bool "Enable OF videomode support"
+ select VIDEOMODE
+ select OF_DISPLAY_TIMING
+ help
+ helper to get videomodes from the devicetree
+
menuconfig FB
tristate "Support for frame buffer devices"
---help---
diff --git a/drivers/video/Makefile b/drivers/video/Makefile
index fc30439..b936b00 100644
--- a/drivers/video/Makefile
+++ b/drivers/video/Makefile
@@ -168,4 +168,6 @@ obj-$(CONFIG_FB_VIRTUAL) += vfb.o
#video output switch sysfs driver
obj-$(CONFIG_VIDEO_OUTPUT_CONTROL) += output.o
obj-$(CONFIG_DISPLAY_TIMING) += display_timing.o
+obj-$(CONFIG_OF_DISPLAY_TIMING) += of_display_timing.o
obj-$(CONFIG_VIDEOMODE) += videomode.o
+obj-$(CONFIG_OF_VIDEOMODE) += of_videomode.o
diff --git a/drivers/video/of_display_timing.c b/drivers/video/of_display_timing.c
new file mode 100644
index 0000000..3eb731f
--- /dev/null
+++ b/drivers/video/of_display_timing.c
@@ -0,0 +1,216 @@
+/*
+ * OF helpers for parsing display timings
+ *
+ * Copyright (c) 2012 Steffen Trumtrar <s.trumtrar@pengutronix.de>, Pengutronix
+ *
+ * based on of_videomode.c by Sascha Hauer <s.hauer@pengutronix.de>
+ *
+ * This file is released under the GPLv2
+ */
+#include <linux/of.h>
+#include <linux/slab.h>
+#include <linux/export.h>
+#include <linux/of_display_timings.h>
+
+/**
+ * parse_property - parse timing_entry from device_node
+ * @np: device_node with the property
+ * @name: name of the property
+ * @result: will be set to the return value
+ *
+ * DESCRIPTION:
+ * Every display_timing can be specified with either just the typical value or
+ * a range consisting of min/typ/max. This function helps handling this
+ **/
+static int parse_property(const struct device_node *np, const char *name,
+ struct timing_entry *result)
+{
+ struct property *prop;
+ int length, cells, ret;
+
+ prop = of_find_property(np, name, &length);
+ if (!prop) {
+ pr_err("%s: could not find property %s\n", __func__, name);
+ return -EINVAL;
+ }
+
+ cells = length / sizeof(u32);
+ if (cells = 1) {
+ ret = of_property_read_u32(np, name, &result->typ);
+ result->min = result->typ;
+ result->max = result->typ;
+ } else if (cells = 3) {
+ ret = of_property_read_u32_array(np, name, &result->min, cells);
+ } else {
+ pr_err("%s: illegal timing specification in %s\n", __func__, name);
+ return -EINVAL;
+ }
+
+ return ret;
+}
+
+/**
+ * of_get_display_timing - parse display_timing entry from device_node
+ * @np: device_node with the properties
+ **/
+static struct display_timing *of_get_display_timing(const struct device_node *np)
+{
+ struct display_timing *dt;
+ int ret = 0;
+
+ dt = kzalloc(sizeof(*dt), GFP_KERNEL);
+ if (!dt) {
+ pr_err("%s: could not allocate display_timing struct\n", __func__);
+ return NULL;
+ }
+
+ ret |= parse_property(np, "hback-porch", &dt->hback_porch);
+ ret |= parse_property(np, "hfront-porch", &dt->hfront_porch);
+ ret |= parse_property(np, "hactive", &dt->hactive);
+ ret |= parse_property(np, "hsync-len", &dt->hsync_len);
+ ret |= parse_property(np, "vback-porch", &dt->vback_porch);
+ ret |= parse_property(np, "vfront-porch", &dt->vfront_porch);
+ ret |= parse_property(np, "vactive", &dt->vactive);
+ ret |= parse_property(np, "vsync-len", &dt->vsync_len);
+ ret |= parse_property(np, "clock-frequency", &dt->pixelclock);
+
+ of_property_read_u32(np, "vsync-active", &dt->vsync_pol_active);
+ of_property_read_u32(np, "hsync-active", &dt->hsync_pol_active);
+ of_property_read_u32(np, "de-active", &dt->de_pol_active);
+ of_property_read_u32(np, "pixelclk-inverted", &dt->pixelclk_pol);
+ dt->interlaced = of_property_read_bool(np, "interlaced");
+ dt->doublescan = of_property_read_bool(np, "doublescan");
+
+ if (ret) {
+ pr_err("%s: error reading timing properties\n", __func__);
+ kfree(dt);
+ return NULL;
+ }
+
+ return dt;
+}
+
+/**
+ * of_get_display_timings - parse all display_timing entries from a device_node
+ * @np: device_node with the subnodes
+ **/
+struct display_timings *of_get_display_timings(const struct device_node *np)
+{
+ struct device_node *timings_np;
+ struct device_node *entry;
+ struct device_node *native_mode;
+ struct display_timings *disp;
+
+ if (!np) {
+ pr_err("%s: no devicenode given\n", __func__);
+ return NULL;
+ }
+
+ timings_np = of_find_node_by_name(np, "display-timings");
+ if (!timings_np) {
+ pr_err("%s: could not find display-timings node\n", __func__);
+ return NULL;
+ }
+
+ disp = kzalloc(sizeof(*disp), GFP_KERNEL);
+ if (!disp) {
+ pr_err("%s: could not allocate struct disp'\n", __func__);
+ goto dispfail;
+ }
+
+ entry = of_parse_phandle(timings_np, "native-mode", 0);
+ /* assume first child as native mode if none provided */
+ if (!entry)
+ entry = of_get_next_child(np, NULL);
+ /* if there is no child, it is useless to go on */
+ if (!entry) {
+ pr_err("%s: no timing specifications given\n", __func__);
+ goto entryfail;
+ }
+
+ pr_info("%s: using %s as default timing\n", __func__, entry->name);
+
+ native_mode = entry;
+
+ disp->num_timings = of_get_child_count(timings_np);
+ if (disp->num_timings = 0) {
+ /* should never happen, as entry was already found above */
+ pr_err("%s: no timings specified\n", __func__);
+ goto entryfail;
+ }
+
+ disp->timings = kzalloc(sizeof(struct display_timing *) * disp->num_timings,
+ GFP_KERNEL);
+ if (!disp->timings) {
+ pr_err("%s: could not allocate timings array\n", __func__);
+ goto entryfail;
+ }
+
+ disp->num_timings = 0;
+ disp->native_mode = 0;
+
+ for_each_child_of_node(timings_np, entry) {
+ struct display_timing *dt;
+
+ dt = of_get_display_timing(entry);
+ if (!dt) {
+ /*
+ * to not encourage wrong devicetrees, fail in case of
+ * an error
+ */
+ pr_err("%s: error in timing %d\n", __func__,
+ disp->num_timings + 1);
+ goto timingfail;
+ }
+
+ if (native_mode = entry)
+ disp->native_mode = disp->num_timings;
+
+ disp->timings[disp->num_timings] = dt;
+ disp->num_timings++;
+ }
+ of_node_put(timings_np);
+ of_node_put(native_mode);
+
+ if (disp->num_timings > 0)
+ pr_info("%s: got %d timings. Using timing #%d as default\n",
+ __func__, disp->num_timings, disp->native_mode + 1);
+ else {
+ pr_err("%s: no valid timings specified\n", __func__);
+ display_timings_release(disp);
+ return NULL;
+ }
+ return disp;
+
+timingfail:
+ if (native_mode)
+ of_node_put(native_mode);
+ display_timings_release(disp);
+entryfail:
+ if (disp)
+ kfree(disp);
+dispfail:
+ of_node_put(timings_np);
+ return NULL;
+}
+EXPORT_SYMBOL_GPL(of_get_display_timings);
+
+/**
+ * of_display_timings_exists - check if a display-timings node is provided
+ * @np: device_node with the timing
+ **/
+int of_display_timings_exists(const struct device_node *np)
+{
+ struct device_node *timings_np;
+
+ if (!np)
+ return -EINVAL;
+
+ timings_np = of_parse_phandle(np, "display-timings", 0);
+ if (!timings_np)
+ return -EINVAL;
+
+ of_node_put(timings_np);
+ return 1;
+}
+EXPORT_SYMBOL_GPL(of_display_timings_exists);
diff --git a/drivers/video/of_videomode.c b/drivers/video/of_videomode.c
new file mode 100644
index 0000000..c573f92
--- /dev/null
+++ b/drivers/video/of_videomode.c
@@ -0,0 +1,48 @@
+/*
+ * generic videomode helper
+ *
+ * Copyright (c) 2012 Steffen Trumtrar <s.trumtrar@pengutronix.de>, Pengutronix
+ *
+ * This file is released under the GPLv2
+ */
+#include <linux/of.h>
+#include <linux/of_display_timings.h>
+#include <linux/of_videomode.h>
+#include <linux/export.h>
+
+/**
+ * of_get_videomode - get the videomode #<index> from devicetree
+ * @np - devicenode with the display_timings
+ * @vm - set to return value
+ * @index - index into list of display_timings
+ * DESCRIPTION:
+ * Get a list of all display timings and put the one
+ * specified by index into *vm. This function should only be used, if
+ * only one videomode is to be retrieved. A driver that needs to work
+ * with multiple/all videomodes should work with
+ * of_get_display_timings instead.
+ **/
+int of_get_videomode(const struct device_node *np, struct videomode *vm,
+ int index)
+{
+ struct display_timings *disp;
+ int ret;
+
+ disp = of_get_display_timings(np);
+ if (!disp) {
+ pr_err("%s: no timings specified\n", __func__);
+ return -EINVAL;
+ }
+
+ if (index = OF_USE_NATIVE_MODE)
+ index = disp->native_mode;
+
+ ret = videomode_from_timing(disp, vm, index);
+ if (ret)
+ return ret;
+
+ display_timings_release(disp);
+
+ return 0;
+}
+EXPORT_SYMBOL_GPL(of_get_videomode);
diff --git a/include/linux/of_display_timings.h b/include/linux/of_display_timings.h
new file mode 100644
index 0000000..2b4fa0a
--- /dev/null
+++ b/include/linux/of_display_timings.h
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2012 Steffen Trumtrar <s.trumtrar@pengutronix.de>
+ *
+ * display timings of helpers
+ *
+ * This file is released under the GPLv2
+ */
+
+#ifndef __LINUX_OF_DISPLAY_TIMINGS_H
+#define __LINUX_OF_DISPLAY_TIMINGS_H
+
+#include <linux/display_timing.h>
+#include <linux/of.h>
+
+#define OF_USE_NATIVE_MODE -1
+
+struct display_timings *of_get_display_timings(const struct device_node *np);
+int of_display_timings_exists(const struct device_node *np);
+
+#endif
diff --git a/include/linux/of_videomode.h b/include/linux/of_videomode.h
new file mode 100644
index 0000000..4de5fcc
--- /dev/null
+++ b/include/linux/of_videomode.h
@@ -0,0 +1,18 @@
+/*
+ * Copyright 2012 Steffen Trumtrar <s.trumtrar@pengutronix.de>
+ *
+ * videomode of-helpers
+ *
+ * This file is released under the GPLv2
+ */
+
+#ifndef __LINUX_OF_VIDEOMODE_H
+#define __LINUX_OF_VIDEOMODE_H
+
+#include <linux/videomode.h>
+#include <linux/of.h>
+
+int of_get_videomode(const struct device_node *np, struct videomode *vm,
+ int index);
+
+#endif /* __LINUX_OF_VIDEOMODE_H */
--
1.7.10.4
^ permalink raw reply related
* [PATCH v12 1/6] video: add display_timing and videomode
From: Steffen Trumtrar @ 2012-11-20 15:54 UTC (permalink / raw)
To: devicetree-discuss
Cc: Steffen Trumtrar, Rob Herring, linux-fbdev, dri-devel,
Laurent Pinchart, Thierry Reding, Guennady Liakhovetski,
linux-media, Tomi Valkeinen, Stephen Warren, kernel,
Florian Tobias Schandinat, David Airlie
In-Reply-To: <1353426896-6045-1-git-send-email-s.trumtrar@pengutronix.de>
Add display_timing structure and the according helper functions. This allows
the description of a display via its supported timing parameters.
Every timing parameter can be specified as a single value or a range
<min typ max>.
Also, add helper functions to convert from display timings to a generic videomode
structure. This videomode can then be converted to the corresponding subsystem
mode representation (e.g. fb_videomode).
Signed-off-by: Steffen Trumtrar <s.trumtrar@pengutronix.de>
Reviewed-by: Thierry Reding <thierry.reding@avionic-design.de>
Acked-by: Thierry Reding <thierry.reding@avionic-design.de>
Tested-by: Thierry Reding <thierry.reding@avionic-design.de>
Tested-by: Philipp Zabel <p.zabel@pengutronix.de>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
drivers/video/Kconfig | 6 ++++
drivers/video/Makefile | 2 ++
drivers/video/display_timing.c | 24 ++++++++++++++
drivers/video/videomode.c | 46 ++++++++++++++++++++++++++
include/linux/display_timing.h | 70 ++++++++++++++++++++++++++++++++++++++++
include/linux/videomode.h | 40 +++++++++++++++++++++++
6 files changed, 188 insertions(+)
create mode 100644 drivers/video/display_timing.c
create mode 100644 drivers/video/videomode.c
create mode 100644 include/linux/display_timing.h
create mode 100644 include/linux/videomode.h
diff --git a/drivers/video/Kconfig b/drivers/video/Kconfig
index d08d799..2a23b18 100644
--- a/drivers/video/Kconfig
+++ b/drivers/video/Kconfig
@@ -33,6 +33,12 @@ config VIDEO_OUTPUT_CONTROL
This framework adds support for low-level control of the video
output switch.
+config DISPLAY_TIMING
+ bool
+
+config VIDEOMODE
+ bool
+
menuconfig FB
tristate "Support for frame buffer devices"
---help---
diff --git a/drivers/video/Makefile b/drivers/video/Makefile
index 23e948e..fc30439 100644
--- a/drivers/video/Makefile
+++ b/drivers/video/Makefile
@@ -167,3 +167,5 @@ obj-$(CONFIG_FB_VIRTUAL) += vfb.o
#video output switch sysfs driver
obj-$(CONFIG_VIDEO_OUTPUT_CONTROL) += output.o
+obj-$(CONFIG_DISPLAY_TIMING) += display_timing.o
+obj-$(CONFIG_VIDEOMODE) += videomode.o
diff --git a/drivers/video/display_timing.c b/drivers/video/display_timing.c
new file mode 100644
index 0000000..ac9bbbc
--- /dev/null
+++ b/drivers/video/display_timing.c
@@ -0,0 +1,24 @@
+/*
+ * generic display timing functions
+ *
+ * Copyright (c) 2012 Steffen Trumtrar <s.trumtrar@pengutronix.de>, Pengutronix
+ *
+ * This file is released under the GPLv2
+ */
+
+#include <linux/display_timing.h>
+#include <linux/export.h>
+#include <linux/slab.h>
+
+void display_timings_release(struct display_timings *disp)
+{
+ if (disp->timings) {
+ unsigned int i;
+
+ for (i = 0; i < disp->num_timings; i++)
+ kfree(disp->timings[i]);
+ kfree(disp->timings);
+ }
+ kfree(disp);
+}
+EXPORT_SYMBOL_GPL(display_timings_release);
diff --git a/drivers/video/videomode.c b/drivers/video/videomode.c
new file mode 100644
index 0000000..e24f879
--- /dev/null
+++ b/drivers/video/videomode.c
@@ -0,0 +1,46 @@
+/*
+ * generic display timing functions
+ *
+ * Copyright (c) 2012 Steffen Trumtrar <s.trumtrar@pengutronix.de>, Pengutronix
+ *
+ * This file is released under the GPLv2
+ */
+
+#include <linux/export.h>
+#include <linux/errno.h>
+#include <linux/display_timing.h>
+#include <linux/kernel.h>
+#include <linux/videomode.h>
+
+int videomode_from_timing(const struct display_timings *disp,
+ struct videomode *vm, unsigned int index)
+{
+ struct display_timing *dt;
+
+ dt = display_timings_get(disp, index);
+ if (!dt)
+ return -EINVAL;
+
+ vm->pixelclock = display_timing_get_value(&dt->pixelclock, 0);
+ vm->hactive = display_timing_get_value(&dt->hactive, 0);
+ vm->hfront_porch = display_timing_get_value(&dt->hfront_porch, 0);
+ vm->hback_porch = display_timing_get_value(&dt->hback_porch, 0);
+ vm->hsync_len = display_timing_get_value(&dt->hsync_len, 0);
+
+ vm->vactive = display_timing_get_value(&dt->vactive, 0);
+ vm->vfront_porch = display_timing_get_value(&dt->vfront_porch, 0);
+ vm->vback_porch = display_timing_get_value(&dt->vback_porch, 0);
+ vm->vsync_len = display_timing_get_value(&dt->vsync_len, 0);
+
+ vm->vah = dt->vsync_pol_active;
+ vm->hah = dt->hsync_pol_active;
+ vm->de = dt->de_pol_active;
+ vm->pixelclk_pol = dt->pixelclk_pol;
+
+ vm->interlaced = dt->interlaced;
+ vm->doublescan = dt->doublescan;
+
+ return 0;
+}
+
+EXPORT_SYMBOL_GPL(videomode_from_timing);
diff --git a/include/linux/display_timing.h b/include/linux/display_timing.h
new file mode 100644
index 0000000..d5bf03f
--- /dev/null
+++ b/include/linux/display_timing.h
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2012 Steffen Trumtrar <s.trumtrar@pengutronix.de>
+ *
+ * description of display timings
+ *
+ * This file is released under the GPLv2
+ */
+
+#ifndef __LINUX_DISPLAY_TIMINGS_H
+#define __LINUX_DISPLAY_TIMINGS_H
+
+#include <linux/types.h>
+
+struct timing_entry {
+ u32 min;
+ u32 typ;
+ u32 max;
+};
+
+struct display_timing {
+ struct timing_entry pixelclock;
+
+ struct timing_entry hactive;
+ struct timing_entry hfront_porch;
+ struct timing_entry hback_porch;
+ struct timing_entry hsync_len;
+
+ struct timing_entry vactive;
+ struct timing_entry vfront_porch;
+ struct timing_entry vback_porch;
+ struct timing_entry vsync_len;
+
+ unsigned int vsync_pol_active;
+ unsigned int hsync_pol_active;
+ unsigned int de_pol_active;
+ unsigned int pixelclk_pol;
+ bool interlaced;
+ bool doublescan;
+};
+
+struct display_timings {
+ unsigned int num_timings;
+ unsigned int native_mode;
+
+ struct display_timing **timings;
+};
+
+/*
+ * placeholder function until ranges are really needed
+ * the index parameter should then be used to select one of [min typ max]
+ */
+static inline u32 display_timing_get_value(const struct timing_entry *te,
+ unsigned int index)
+{
+ return te->typ;
+}
+
+static inline struct display_timing *display_timings_get(const struct
+ display_timings *disp,
+ unsigned int index)
+{
+ if (disp->num_timings > index)
+ return disp->timings[index];
+ else
+ return NULL;
+}
+
+void display_timings_release(struct display_timings *disp);
+
+#endif
diff --git a/include/linux/videomode.h b/include/linux/videomode.h
new file mode 100644
index 0000000..5d3e796
--- /dev/null
+++ b/include/linux/videomode.h
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2012 Steffen Trumtrar <s.trumtrar@pengutronix.de>
+ *
+ * generic videomode description
+ *
+ * This file is released under the GPLv2
+ */
+
+#ifndef __LINUX_VIDEOMODE_H
+#define __LINUX_VIDEOMODE_H
+
+#include <linux/display_timing.h>
+
+struct videomode {
+ u32 pixelclock;
+ u32 refreshrate;
+
+ u32 hactive;
+ u32 hfront_porch;
+ u32 hback_porch;
+ u32 hsync_len;
+
+ u32 vactive;
+ u32 vfront_porch;
+ u32 vback_porch;
+ u32 vsync_len;
+
+ u32 hah;
+ u32 vah;
+ u32 de;
+ u32 pixelclk_pol;
+
+ bool interlaced;
+ bool doublescan;
+};
+
+int videomode_from_timing(const struct display_timings *disp,
+ struct videomode *vm, unsigned int index);
+
+#endif
--
1.7.10.4
^ permalink raw reply related
* [PATCH v12 0/6] of: add display helper
From: Steffen Trumtrar @ 2012-11-20 15:54 UTC (permalink / raw)
To: devicetree-discuss
Cc: Steffen Trumtrar, Rob Herring, linux-fbdev, dri-devel,
Laurent Pinchart, Thierry Reding, Guennady Liakhovetski,
linux-media, Tomi Valkeinen, Stephen Warren, kernel,
Florian Tobias Schandinat, David Airlie
Hi!
Changes since v11:
- make pointers const where applicable
- add reviewed-by Laurent Pinchart
Regards,
Steffen
Steffen Trumtrar (6):
video: add display_timing and videomode
video: add of helper for videomode
fbmon: add videomode helpers
fbmon: add of_videomode helpers
drm_modes: add videomode helpers
drm_modes: add of_videomode helpers
.../devicetree/bindings/video/display-timings.txt | 107 ++++++++++
drivers/gpu/drm/drm_modes.c | 70 +++++++
drivers/video/Kconfig | 19 ++
drivers/video/Makefile | 4 +
drivers/video/display_timing.c | 24 +++
drivers/video/fbmon.c | 86 ++++++++
drivers/video/of_display_timing.c | 216 ++++++++++++++++++++
drivers/video/of_videomode.c | 48 +++++
drivers/video/videomode.c | 46 +++++
include/drm/drmP.h | 12 ++
include/linux/display_timing.h | 70 +++++++
include/linux/fb.h | 13 ++
include/linux/of_display_timings.h | 20 ++
include/linux/of_videomode.h | 18 ++
include/linux/videomode.h | 40 ++++
15 files changed, 793 insertions(+)
create mode 100644 Documentation/devicetree/bindings/video/display-timings.txt
create mode 100644 drivers/video/display_timing.c
create mode 100644 drivers/video/of_display_timing.c
create mode 100644 drivers/video/of_videomode.c
create mode 100644 drivers/video/videomode.c
create mode 100644 include/linux/display_timing.h
create mode 100644 include/linux/of_display_timings.h
create mode 100644 include/linux/of_videomode.h
create mode 100644 include/linux/videomode.h
--
1.7.10.4
^ permalink raw reply
* Re: [PATCH 0/5] OMAPFB: use dma_alloc instead of omap's vram
From: Tomi Valkeinen @ 2012-11-20 15:09 UTC (permalink / raw)
To: linux-arm-kernel
In-Reply-To: <20121119220443.GD18567@atomide.com>
[-- Attachment #1: Type: text/plain, Size: 833 bytes --]
On 2012-11-20 00:04, Tony Lindgren wrote:
>> Should we enable CMA by default in omap2plus_defconfig? And perhaps on
>> omap1 also?
>
> Yes if that's now needed for DSS.
DSS works fine without CMA, at least for small displays, and when fb
allocation is done at boot time. So it's not a strict "need".
I'm not sure how easily FB allocations start to fail without CMA, and
how much CMA helps.
I'm not even sure what's the default DMA pool size on OMAP... If it's
the one set with "coherent_pool" kernel parameter, then the default
seems to be 256K, which is quite small for video use. For CMA the
default global area is 16M. Both can, of course, be changed with boot
params or kernel config (at least for CMA).
But I think it makes sense to have CMA by default even if non-CMA kernel
would work.
Tomi
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 897 bytes --]
^ permalink raw reply
* Re: [PATCH 0/2] OMAPDSS: DISPC: Update manager size limits for OMAP5
From: Tomi Valkeinen @ 2012-11-20 14:54 UTC (permalink / raw)
To: Archit Taneja; +Cc: linux-fbdev, linux-omap
In-Reply-To: <1352881216-7490-1-git-send-email-archit@ti.com>
[-- Attachment #1: Type: text/plain, Size: 754 bytes --]
On 2012-11-14 10:20, Archit Taneja wrote:
> Manager width and height can go up to 4K on OMAP5. Make manager width and height
> register field offsets and maximum limits as dispc_features. Create a new
> dispc_feature struct for OMAP5 which highlights this difference.
>
> Archit Taneja (2):
> OMAPDSS: Add overlay manager width and height limits as a dispc
> feature
> OMAPDSS: Add a dispc_features struct for OMAP5
>
> drivers/video/omap2/dss/dispc.c | 47 +++++++++++++++++++++++++++++---
> drivers/video/omap2/dss/dss_features.c | 8 ------
> drivers/video/omap2/dss/dss_features.h | 2 --
> 3 files changed, 43 insertions(+), 14 deletions(-)
>
Thanks, looks fine. I'll apply to omapdss tree.
Tomi
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 897 bytes --]
^ permalink raw reply
* Re: [PATCHv9 1/3] Runtime Interpreted Power Sequences
From: Tomi Valkeinen @ 2012-11-20 14:48 UTC (permalink / raw)
To: linux-arm-kernel
In-Reply-To: <1353149747-31871-2-git-send-email-acourbot@nvidia.com>
[-- Attachment #1: Type: text/plain, Size: 1623 bytes --]
Hi,
On 2012-11-17 12:55, Alexandre Courbot wrote:
A few questions after looking at the documentation:
> +Example
> +-------
> +Here are example sequences declared within a backlight device that use all the
> +supported resources types:
> +
> + backlight {
> + compatible = "pwm-backlight";
> + ...
> +
> + /* resources used by the power sequences */
> + pwms = <&pwm 2 5000000>;
> + pwm-names = "backlight";
> + power-supply = <&backlight_reg>;
> +
> + power-sequences {
> + power-on {
> + step0 {
> + type = "regulator";
> + id = "power";
> + enable;
> + };
> + step1 {
> + type = "delay";
> + delay = <10000>;
> + };
> + step2 {
> + type = "pwm";
> + id = "backlight";
> + enable;
> + };
> + step3 {
> + type = "gpio";
> + gpio = <&gpio 28 0>;
> + value = <1>;
> + };
> + };
I guess there's a reason, but the above looks a bit inconsistent. For
gpio you define the gpio resource inside the step. For power and pwm the
resource is defined before the steps. Why wouldn't "pwm = <&pwm 2
5000000>;" work in step2?
> +When a power sequence is run, its steps is executed one after the other until
> +one step fails or the end of the sequence is reached.
The document doesn't give any hint of what the driver should do if
running the power sequence fails. Run the "opposite" power sequence?
Will that work for all resources? I'm mainly thinking of a case where
each enable of the resource should be matched by a disable, i.e. you
can't call disable if no enable was called.
Tomi
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 897 bytes --]
^ permalink raw reply
* Re: [PATCH] video console: add a driver for lcd2s character display
From: Lars Poeschel @ 2012-11-20 14:21 UTC (permalink / raw)
To: Arnd Bergmann
Cc: Lars Poeschel, FlorianSchandinat, mathieu.poirier, linux-fbdev,
linux-kernel
In-Reply-To: <201211201325.57883.arnd@arndb.de>
On Tuesday 20 November 2012 at 14:25:57, Arnd Bergmann wrote:
> On Tuesday 20 November 2012, Lars Poeschel wrote:
> > From: Lars Poeschel <poeschel@lemonage.de>
> >
> > This driver allows to use a lcd2s 20x4 character display as
> > a linux console output device.
> >
> > Signed-off-by: Lars Poeschel <poeschel@lemonage.de>
>
> The driver looks nice overall, but I found two style issues:
Thank you for your feedback.
> > +static int __devinit lcd2s_i2c_probe(struct i2c_client *i2c,
> > + const struct i2c_device_id *id)
> > +{
> > + struct lcd2s_data *data;
> > +
> > + if (!i2c_check_functionality(i2c->adapter,
> > + I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA))
> > + return -EIO;
> > + data = devm_kzalloc(&i2c->dev, sizeof(struct lcd2s_data),
GFP_KERNEL);
> > + if (!data)
> > + return -ENOMEM;
> > +
> > + data->i2c = i2c;
> > + data->consw.owner = THIS_MODULE;
> > + data->consw.con_startup = lcd2s_startup;
> > + data->consw.con_init = lcd2s_init;
> > + data->consw.con_deinit = lcd2s_deinit;
> > + data->consw.con_clear = lcd2s_clear;
> > + data->consw.con_putc = lcd2s_putc;
> > + data->consw.con_putcs = lcd2s_putcs;
> > + data->consw.con_cursor = lcd2s_cursor;
> > + data->consw.con_scroll = lcd2s_scroll;
> > + data->consw.con_bmove = lcd2s_bmove;
> > + data->consw.con_switch = lcd2s_switch;
> > + data->consw.con_blank = lcd2s_blank;
> > + data->consw.con_set_palette = lcd2s_set_palette;
> > + data->consw.con_scrolldelta = lcd2s_scrolldelta;
> > +
> > + i2c_set_clientdata(i2c, data);
> > +
> > + take_over_console(&data->consw, LCD2S_FIRST, LCD2S_LAST, 1);
> > +
> > + return 0;
> > +}
>
> It's better to define the struct consw as a preinitialized
> 'static const' object, rather than dynamically setting each
> member.
I could not find a place to store the drivers private data inside the struct
vc_data. I wanted to have the struct consw inside the drivers private data
(struct lcd2s_data) to be able to container_of to the drivers private data in
the consw.con_* functions. This makes it possible to use more than one actual
lcd2s display with the same driver. Otherwise I have to store the struct
i2c_client somewhere statically and the driver can control only one display
and has to forbid to be probed a second time. Or am I wrong somewhere ?
Lars
^ permalink raw reply
* [PATCHv7] video: Add support for the Solomon SSD1307 OLED Controller
From: Maxime Ripard @ 2012-11-20 14:20 UTC (permalink / raw)
To: linux-fbdev
This patch adds support for the Solomon SSD1307 OLED
controller found on the Crystalfontz CFA10036 board.
This controller can drive a display with a resolution up
to 128x39 and can operate over I2C or SPI.
The current driver has only been tested on the CFA-10036,
that is using this controller over I2C to driver a 96x16
OLED screen.
Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>
Cc: Brian Lilly <brian@crystalfontz.com>
---
.../devicetree/bindings/video/ssd1307fb.txt | 24 ++
drivers/video/Kconfig | 15 +
drivers/video/Makefile | 1 +
drivers/video/ssd1307fb.c | 396 ++++++++++++++++++++
4 files changed, 436 insertions(+)
create mode 100644 Documentation/devicetree/bindings/video/ssd1307fb.txt
create mode 100644 drivers/video/ssd1307fb.c
diff --git a/Documentation/devicetree/bindings/video/ssd1307fb.txt b/Documentation/devicetree/bindings/video/ssd1307fb.txt
new file mode 100644
index 0000000..3d0060c
--- /dev/null
+++ b/Documentation/devicetree/bindings/video/ssd1307fb.txt
@@ -0,0 +1,24 @@
+* Solomon SSD1307 Framebuffer Driver
+
+Required properties:
+ - compatible: Should be "solomon,ssd1307fb-<bus>". The only supported bus for
+ now is i2c.
+ - 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
+ specification [0]
+ - reset-gpios: Should contain the GPIO used to reset the OLED display
+
+Optional properties:
+ - reset-active-low: Is the reset gpio is active on physical low?
+
+[0]: Documentation/devicetree/bindings/pwm/pwm.txt
+
+Examples:
+ssd1307: oled@3c {
+ compatible = "solomon,ssd1307fb-i2c";
+ reg = <0x3c>;
+ pwms = <&pwm 4 3000>;
+ reset-gpios = <&gpio2 7>;
+ reset-active-low;
+};
diff --git a/drivers/video/Kconfig b/drivers/video/Kconfig
index d08d799..48a7676 100644
--- a/drivers/video/Kconfig
+++ b/drivers/video/Kconfig
@@ -2442,4 +2442,19 @@ config FB_SH_MOBILE_MERAM
Up to 4 memory channels can be configured, allowing 4 RGB or
2 YCbCr framebuffers to be configured.
+config FB_SSD1307
+ tristate "Solomon SSD1307 framebuffer support"
+ depends on FB && I2C
+ depends on OF
+ depends on GENERIC_GPIO
+ select FB_SYS_FOPS
+ select FB_SYS_FILLRECT
+ select FB_SYS_COPYAREA
+ select FB_SYS_IMAGEBLIT
+ select FB_DEFERRED_IO
+ select PWM
+ help
+ This driver implements support for the Solomon SSD1307
+ OLED controller over I2C.
+
endmenu
diff --git a/drivers/video/Makefile b/drivers/video/Makefile
index 23e948e..768a137 100644
--- a/drivers/video/Makefile
+++ b/drivers/video/Makefile
@@ -161,6 +161,7 @@ obj-$(CONFIG_FB_BFIN_7393) += bfin_adv7393fb.o
obj-$(CONFIG_FB_MX3) += mx3fb.o
obj-$(CONFIG_FB_DA8XX) += da8xx-fb.o
obj-$(CONFIG_FB_MXS) += mxsfb.o
+obj-$(CONFIG_FB_SSD1307) += ssd1307fb.o
# the test framebuffer is last
obj-$(CONFIG_FB_VIRTUAL) += vfb.o
diff --git a/drivers/video/ssd1307fb.c b/drivers/video/ssd1307fb.c
new file mode 100644
index 0000000..9e46633
--- /dev/null
+++ b/drivers/video/ssd1307fb.c
@@ -0,0 +1,396 @@
+/*
+ * Driver for the Solomon SSD1307 OLED controler
+ *
+ * Copyright 2012 Free Electrons
+ *
+ * Licensed under the GPLv2 or later.
+ */
+
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/i2c.h>
+#include <linux/fb.h>
+#include <linux/uaccess.h>
+#include <linux/of_device.h>
+#include <linux/of_gpio.h>
+#include <linux/pwm.h>
+#include <linux/delay.h>
+
+#define SSD1307FB_WIDTH 96
+#define SSD1307FB_HEIGHT 16
+
+#define SSD1307FB_DATA 0x40
+#define SSD1307FB_COMMAND 0x80
+
+#define SSD1307FB_CONTRAST 0x81
+#define SSD1307FB_SEG_REMAP_ON 0xa1
+#define SSD1307FB_DISPLAY_OFF 0xae
+#define SSD1307FB_DISPLAY_ON 0xaf
+#define SSD1307FB_START_PAGE_ADDRESS 0xb0
+
+struct ssd1307fb_par {
+ struct i2c_client *client;
+ struct fb_info *info;
+ struct pwm_device *pwm;
+ u32 pwm_period;
+ int reset;
+};
+
+static struct fb_fix_screeninfo ssd1307fb_fix __devinitdata = {
+ .id = "Solomon SSD1307",
+ .type = FB_TYPE_PACKED_PIXELS,
+ .visual = FB_VISUAL_MONO10,
+ .xpanstep = 0,
+ .ypanstep = 0,
+ .ywrapstep = 0,
+ .line_length = SSD1307FB_WIDTH / 8,
+ .accel = FB_ACCEL_NONE,
+};
+
+static struct fb_var_screeninfo ssd1307fb_var __devinitdata = {
+ .xres = SSD1307FB_WIDTH,
+ .yres = SSD1307FB_HEIGHT,
+ .xres_virtual = SSD1307FB_WIDTH,
+ .yres_virtual = SSD1307FB_HEIGHT,
+ .bits_per_pixel = 1,
+};
+
+static int ssd1307fb_write_array(struct i2c_client *client, u8 type, u8* cmd, u32 len)
+{
+ u8 *buf;
+ int ret = 0;
+
+ buf = kzalloc(len + 1, GFP_KERNEL);
+ if (!buf) {
+ dev_err(&client->dev, "Couldn't allocate sending buffer.\n");
+ return -ENOMEM;
+ }
+
+ buf[0] = type;
+ memcpy(buf + 1, cmd, len);
+
+ ret = i2c_master_send(client, buf, len + 1);
+ if (ret != len + 1) {
+ dev_err(&client->dev, "Couldn't send I2C command.\n");
+ goto error;
+ }
+
+error:
+ kfree(buf);
+ return ret;
+}
+
+static inline int ssd1307fb_write_cmd_array(struct i2c_client *client, u8* cmd, u32 len)
+{
+ return ssd1307fb_write_array(client, SSD1307FB_COMMAND, cmd, len);
+}
+
+static inline int ssd1307fb_write_cmd(struct i2c_client *client, u8 cmd)
+{
+ return ssd1307fb_write_cmd_array(client, &cmd, 1);
+}
+
+static inline int ssd1307fb_write_data_array(struct i2c_client *client, u8* cmd, u32 len)
+{
+ return ssd1307fb_write_array(client, SSD1307FB_DATA, cmd, len);
+}
+
+static inline int ssd1307fb_write_data(struct i2c_client *client, u8 data)
+{
+ return ssd1307fb_write_data_array(client, &data, 1);
+}
+
+static void ssd1307fb_update_display(struct ssd1307fb_par *par)
+{
+ u8 *vmem = par->info->screen_base;
+ int i, j, k;
+
+ /*
+ * The screen is divided in pages, each having a height of 8
+ * pixels, and the width of the screen. When sending a byte of
+ * data to the controller, it gives the 8 bits for the current
+ * column. I.e, the first byte are the 8 bits of the first
+ * column, then the 8 bits for the second column, etc.
+ *
+ *
+ * Representation of the screen, assuming it is 5 bits
+ * wide. Each letter-number combination is a bit that controls
+ * one pixel.
+ *
+ * A0 A1 A2 A3 A4
+ * B0 B1 B2 B3 B4
+ * C0 C1 C2 C3 C4
+ * D0 D1 D2 D3 D4
+ * E0 E1 E2 E3 E4
+ * F0 F1 F2 F3 F4
+ * G0 G1 G2 G3 G4
+ * H0 H1 H2 H3 H4
+ *
+ * If you want to update this screen, you need to send 5 bytes:
+ * (1) A0 B0 C0 D0 E0 F0 G0 H0
+ * (2) A1 B1 C1 D1 E1 F1 G1 H1
+ * (3) A2 B2 C2 D2 E2 F2 G2 H2
+ * (4) A3 B3 C3 D3 E3 F3 G3 H3
+ * (5) A4 B4 C4 D4 E4 F4 G4 H4
+ */
+
+ for (i = 0; i < (SSD1307FB_HEIGHT / 8); i++) {
+ ssd1307fb_write_cmd(par->client, SSD1307FB_START_PAGE_ADDRESS + (i + 1));
+ ssd1307fb_write_cmd(par->client, 0x00);
+ ssd1307fb_write_cmd(par->client, 0x10);
+
+ for (j = 0; j < SSD1307FB_WIDTH; j++) {
+ u8 buf = 0;
+ for (k = 0; k < 8; k++) {
+ u32 page_length = SSD1307FB_WIDTH * i;
+ u32 index = page_length + (SSD1307FB_WIDTH * k + j) / 8;
+ u8 byte = *(vmem + index);
+ u8 bit = byte & (1 << (7 - (j % 8)));
+ bit = bit >> (7 - (j % 8));
+ buf |= bit << k;
+ }
+ ssd1307fb_write_data(par->client, buf);
+ }
+ }
+}
+
+
+static ssize_t ssd1307fb_write(struct fb_info *info, const char __user *buf,
+ size_t count, loff_t *ppos)
+{
+ struct ssd1307fb_par *par = info->par;
+ unsigned long total_size;
+ unsigned long p = *ppos;
+ u8 __iomem *dst;
+
+ total_size = info->fix.smem_len;
+
+ if (p > total_size)
+ return -EINVAL;
+
+ if (count + p > total_size)
+ count = total_size - p;
+
+ if (!count)
+ return -EINVAL;
+
+ dst = (void __force *) (info->screen_base + p);
+
+ if (copy_from_user(dst, buf, count))
+ return -EFAULT;
+
+ ssd1307fb_update_display(par);
+
+ *ppos += count;
+
+ return count;
+}
+
+static void ssd1307fb_fillrect(struct fb_info *info, const struct fb_fillrect *rect)
+{
+ struct ssd1307fb_par *par = info->par;
+ sys_fillrect(info, rect);
+ ssd1307fb_update_display(par);
+}
+
+static void ssd1307fb_copyarea(struct fb_info *info, const struct fb_copyarea *area)
+{
+ struct ssd1307fb_par *par = info->par;
+ sys_copyarea(info, area);
+ ssd1307fb_update_display(par);
+}
+
+static void ssd1307fb_imageblit(struct fb_info *info, const struct fb_image *image)
+{
+ struct ssd1307fb_par *par = info->par;
+ sys_imageblit(info, image);
+ ssd1307fb_update_display(par);
+}
+
+static struct fb_ops ssd1307fb_ops = {
+ .owner = THIS_MODULE,
+ .fb_read = fb_sys_read,
+ .fb_write = ssd1307fb_write,
+ .fb_fillrect = ssd1307fb_fillrect,
+ .fb_copyarea = ssd1307fb_copyarea,
+ .fb_imageblit = ssd1307fb_imageblit,
+};
+
+static void ssd1307fb_deferred_io(struct fb_info *info,
+ struct list_head *pagelist)
+{
+ ssd1307fb_update_display(info->par);
+}
+
+static struct fb_deferred_io ssd1307fb_defio = {
+ .delay = HZ,
+ .deferred_io = ssd1307fb_deferred_io,
+};
+
+static int __devinit ssd1307fb_probe(struct i2c_client *client, const struct i2c_device_id *id)
+{
+ struct fb_info *info;
+ u32 vmem_size = SSD1307FB_WIDTH * SSD1307FB_HEIGHT / 8;
+ struct ssd1307fb_par *par;
+ u8 *vmem;
+ int ret;
+
+ if (!client->dev.of_node) {
+ dev_err(&client->dev, "No device tree data found!\n");
+ return -EINVAL;
+ }
+
+ info = framebuffer_alloc(sizeof(struct ssd1307fb_par), &client->dev);
+ if (!info) {
+ dev_err(&client->dev, "Couldn't allocate framebuffer.\n");
+ return -ENOMEM;
+ }
+
+ vmem = devm_kzalloc(&client->dev, vmem_size, GFP_KERNEL);
+ if (!vmem) {
+ dev_err(&client->dev, "Couldn't allocate graphical memory.\n");
+ ret = -ENOMEM;
+ goto fb_alloc_error;
+ }
+
+ info->fbops = &ssd1307fb_ops;
+ info->fix = ssd1307fb_fix;
+ info->fbdefio = &ssd1307fb_defio;
+
+ info->var = ssd1307fb_var;
+ info->var.red.length = 1;
+ info->var.red.offset = 0;
+ info->var.green.length = 1;
+ info->var.green.offset = 0;
+ info->var.blue.length = 1;
+ info->var.blue.offset = 0;
+
+ info->screen_base = (u8 __force __iomem *)vmem;
+ info->fix.smem_start = (unsigned long)vmem;
+ info->fix.smem_len = vmem_size;
+
+ fb_deferred_io_init(info);
+
+ par = info->par;
+ par->info = info;
+ par->client = client;
+
+ par->reset = of_get_named_gpio(client->dev.of_node,
+ "reset-gpios", 0);
+ if (!gpio_is_valid(par->reset)) {
+ ret = -EINVAL;
+ goto reset_oled_error;
+ }
+
+ ret = devm_gpio_request_one(&client->dev, par->reset,
+ GPIOF_OUT_INIT_HIGH,
+ "oled-reset");
+ if (ret) {
+ dev_err(&client->dev,
+ "failed to request gpio %d: %d\n",
+ par->reset, ret);
+ goto reset_oled_error;
+ }
+
+ par->pwm = pwm_get(&client->dev, NULL);
+ if (IS_ERR(par->pwm)) {
+ dev_err(&client->dev, "Could not get PWM from device tree!\n");
+ ret = PTR_ERR(par->pwm);
+ goto pwm_error;
+ }
+
+ par->pwm_period = pwm_get_period(par->pwm);
+
+ dev_dbg(&client->dev, "Using PWM%d with a %dns period.\n", par->pwm->pwm, par->pwm_period);
+
+ ret = register_framebuffer(info);
+ if (ret) {
+ dev_err(&client->dev, "Couldn't register the framebuffer\n");
+ goto fbreg_error;
+ }
+
+ i2c_set_clientdata(client, info);
+
+ /* Reset the screen */
+ gpio_set_value(par->reset, 0);
+ udelay(4);
+ gpio_set_value(par->reset, 1);
+ udelay(4);
+
+ /* Enable the PWM */
+ pwm_config(par->pwm, par->pwm_period / 2, par->pwm_period);
+ pwm_enable(par->pwm);
+
+ /* Map column 127 of the OLED to segment 0 */
+ ret = ssd1307fb_write_cmd(client, SSD1307FB_SEG_REMAP_ON);
+ if (ret < 0) {
+ dev_err(&client->dev, "Couldn't remap the screen.\n");
+ goto remap_error;
+ }
+
+ /* Turn on the display */
+ ret = ssd1307fb_write_cmd(client, SSD1307FB_DISPLAY_ON);
+ if (ret < 0) {
+ dev_err(&client->dev, "Couldn't turn the display on.\n");
+ goto remap_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;
+
+remap_error:
+ unregister_framebuffer(info);
+ pwm_disable(par->pwm);
+fbreg_error:
+ pwm_put(par->pwm);
+pwm_error:
+reset_oled_error:
+ fb_deferred_io_cleanup(info);
+fb_alloc_error:
+ framebuffer_release(info);
+ return ret;
+}
+
+static int __devexit ssd1307fb_remove(struct i2c_client *client)
+{
+ struct fb_info *info = i2c_get_clientdata(client);
+ struct ssd1307fb_par *par = info->par;
+
+ unregister_framebuffer(info);
+ pwm_disable(par->pwm);
+ pwm_put(par->pwm);
+ fb_deferred_io_cleanup(info);
+ framebuffer_release(info);
+
+ return 0;
+}
+
+static const struct i2c_device_id ssd1307fb_i2c_id[] = {
+ { "ssd1307fb", 0 },
+ { }
+};
+MODULE_DEVICE_TABLE(i2c, ssd1307fb_i2c_id);
+
+static const struct of_device_id ssd1307fb_of_match[] = {
+ { .compatible = "solomon,ssd1307fb-i2c" },
+ {},
+};
+MODULE_DEVICE_TABLE(of, ssd1307fb_of_match);
+
+static struct i2c_driver ssd1307fb_driver = {
+ .probe = ssd1307fb_probe,
+ .remove = __devexit_p(ssd1307fb_remove),
+ .id_table = ssd1307fb_i2c_id,
+ .driver = {
+ .name = "ssd1307fb",
+ .of_match_table = of_match_ptr(ssd1307fb_of_match),
+ .owner = THIS_MODULE,
+ },
+};
+
+module_i2c_driver(ssd1307fb_driver);
+
+MODULE_DESCRIPTION("FB driver for the Solomon SSD1307 OLED controler");
+MODULE_AUTHOR("Maxime Ripard <maxime.ripard@free-electrons.com>");
+MODULE_LICENSE("GPL");
--
1.7.9.5
^ permalink raw reply related
* Re: [PATCH] video console: add a driver for lcd2s character display
From: Arnd Bergmann @ 2012-11-20 13:25 UTC (permalink / raw)
To: Lars Poeschel
Cc: FlorianSchandinat, poeschel, mathieu.poirier, linux-fbdev,
linux-kernel
In-Reply-To: <1353416206-3243-1-git-send-email-larsi@wh2.tu-dresden.de>
On Tuesday 20 November 2012, Lars Poeschel wrote:
> From: Lars Poeschel <poeschel@lemonage.de>
>
> This driver allows to use a lcd2s 20x4 character display as
> a linux console output device.
>
> Signed-off-by: Lars Poeschel <poeschel@lemonage.de>
The driver looks nice overall, but I found two style issues:
> +static int __devinit lcd2s_i2c_probe(struct i2c_client *i2c,
> + const struct i2c_device_id *id)
> +{
> + struct lcd2s_data *data;
> +
> + if (!i2c_check_functionality(i2c->adapter,
> + I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA))
> + return -EIO;
> + data = devm_kzalloc(&i2c->dev, sizeof(struct lcd2s_data), GFP_KERNEL);
> + if (!data)
> + return -ENOMEM;
> +
> + data->i2c = i2c;
> + data->consw.owner = THIS_MODULE;
> + data->consw.con_startup = lcd2s_startup;
> + data->consw.con_init = lcd2s_init;
> + data->consw.con_deinit = lcd2s_deinit;
> + data->consw.con_clear = lcd2s_clear;
> + data->consw.con_putc = lcd2s_putc;
> + data->consw.con_putcs = lcd2s_putcs;
> + data->consw.con_cursor = lcd2s_cursor;
> + data->consw.con_scroll = lcd2s_scroll;
> + data->consw.con_bmove = lcd2s_bmove;
> + data->consw.con_switch = lcd2s_switch;
> + data->consw.con_blank = lcd2s_blank;
> + data->consw.con_set_palette = lcd2s_set_palette;
> + data->consw.con_scrolldelta = lcd2s_scrolldelta;
> +
> + i2c_set_clientdata(i2c, data);
> +
> + take_over_console(&data->consw, LCD2S_FIRST, LCD2S_LAST, 1);
> +
> + return 0;
> +}
It's better to define the struct consw as a preinitialized
'static const' object, rather than dynamically setting each
member.
> +static struct i2c_driver lcd2s_i2c_driver = {
> + .driver = {
> + .name = "lcd2s",
> + .owner = THIS_MODULE,
> + },
> + .probe = lcd2s_i2c_probe,
> + .remove = __devexit_p(lcd2s_i2c_remove),
> + .id_table = lcd2s_i2c_id,
> +};
> +
> +static int __init lcd2s_modinit(void)
> +{
> + int ret = 0;
> +
> + ret = i2c_add_driver(&lcd2s_i2c_driver);
> + if (ret != 0)
> + pr_err("Failed to register lcd2s driver\n");
> +
> + return ret;
> +}
> +module_init(lcd2s_modinit)
> +
> +static void __exit lcd2s_exit(void)
> +{
> + i2c_del_driver(&lcd2s_i2c_driver);
> +}
> +module_exit(lcd2s_exit)
Here, you can use module_i2c_driver.
Arnd
^ permalink raw reply
* Re: [PATCH] video: da8xx-fb: clk_get on connection id fck
From: Sekhar Nori @ 2012-11-20 13:14 UTC (permalink / raw)
To: linux-arm-kernel
In-Reply-To: <1353415261-30080-1-git-send-email-prakash.pm@ti.com>
On 11/20/2012 6:11 PM, Manjunathappa wrote:
> do clk_get on connection id "fck" to support OMAP based
> platforms having multiple clocks for module. Without this
> driver change clk_get fails on am335x.
>
> This patch is based on the discussion in community
> http://marc.info/?l=linux-kernel&m\x135166018907827&w=2
>
> Signed-off-by: Manjunathappa <prakash.pm@ti.com>
> Cc: Vaibhav Hiremath <hvaibhav@ti.com>
For the mach-davinci changes:
Acked-by: Sekhar Nori <nsekhar@ti.com>
Florian,
I assume you will want to take this through your tree?
Thanks,
Sekhar
^ permalink raw reply
* [PATCH] video console: add a driver for lcd2s character display
From: Lars Poeschel @ 2012-11-20 12:56 UTC (permalink / raw)
To: FlorianSchandinat
Cc: poeschel, mathieu.poirier, arnd, linux-fbdev, linux-kernel
From: Lars Poeschel <poeschel@lemonage.de>
This driver allows to use a lcd2s 20x4 character display as
a linux console output device.
Signed-off-by: Lars Poeschel <poeschel@lemonage.de>
---
drivers/video/console/Kconfig | 10 +
drivers/video/console/Makefile | 1 +
drivers/video/console/lcd2scon.c | 396 ++++++++++++++++++++++++++++++++++++++
3 files changed, 407 insertions(+)
create mode 100644 drivers/video/console/lcd2scon.c
diff --git a/drivers/video/console/Kconfig b/drivers/video/console/Kconfig
index e2c96d0..44fc3bf 100644
--- a/drivers/video/console/Kconfig
+++ b/drivers/video/console/Kconfig
@@ -129,6 +129,16 @@ config STI_CONSOLE
machines. Say Y here to build support for it into your kernel.
The alternative is to use your primary serial port as a console.
+config LCD2S_CONSOLE
+ tristate "lcd2s 20x4 character display over I2C console"
+ depends on I2C
+ default n
+ help
+ This is a driver that lets you use the lcd2s 20x4 character display
+ from modtronix engineering as a console output device. The display
+ is a simple single color character display. You have to connect it
+ to an I2C bus.
+
config FONTS
bool "Select compiled-in fonts"
depends on FRAMEBUFFER_CONSOLE || STI_CONSOLE
diff --git a/drivers/video/console/Makefile b/drivers/video/console/Makefile
index a862e91..74d5993 100644
--- a/drivers/video/console/Makefile
+++ b/drivers/video/console/Makefile
@@ -23,6 +23,7 @@ font-objs += $(font-objs-y)
obj-$(CONFIG_DUMMY_CONSOLE) += dummycon.o
obj-$(CONFIG_SGI_NEWPORT_CONSOLE) += newport_con.o font.o
obj-$(CONFIG_STI_CONSOLE) += sticon.o sticore.o font.o
+obj-$(CONFIG_LCD2S_CONSOLE) += lcd2scon.o
obj-$(CONFIG_VGA_CONSOLE) += vgacon.o
obj-$(CONFIG_MDA_CONSOLE) += mdacon.o
obj-$(CONFIG_FRAMEBUFFER_CONSOLE) += fbcon.o bitblit.o font.o softcursor.o
diff --git a/drivers/video/console/lcd2scon.c b/drivers/video/console/lcd2scon.c
new file mode 100644
index 0000000..0d967ba
--- /dev/null
+++ b/drivers/video/console/lcd2scon.c
@@ -0,0 +1,396 @@
+/*
+ * console driver for LCD2S 4x20 character displays connected through i2c.
+ *
+ * This is a driver allowing you to use a LCD2S 4x20 from modtronix
+ * engineering as console output device.
+ *
+ * (C) 2012 by Lemonage Software GmbH
+ * Author: Lars Poeschel <poeschel@lemonage.de>
+ * All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ */
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/slab.h>
+#include <linux/kd.h>
+#include <linux/tty.h>
+#include <linux/console_struct.h>
+#include <linux/console.h>
+#include <linux/vt_kern.h>
+#include <linux/i2c.h>
+
+#define LCD2S_CMD_CUR_BLINK_OFF 0x10
+#define LCD2S_CMD_CUR_UL_OFF 0x11
+#define LCD2S_CMD_DISPLAY_OFF 0x12
+#define LCD2S_CMD_CUR_BLINK_ON 0x18
+#define LCD2S_CMD_CUR_UL_ON 0x19
+#define LCD2S_CMD_DISPLAY_ON 0x1a
+#define LCD2S_CMD_BACKLIGHT_OFF 0x20
+#define LCD2S_CMD_BACKLIGHT_ON 0x28
+#define LCD2S_CMD_WRITE 0x80
+#define LCD2S_CMD_SHIFT_UP 0x87
+#define LCD2S_CMD_SHIFT_DOWN 0x88
+#define LCD2S_CMD_CUR_ADDR 0x89
+#define LCD2S_CMD_CUR_POS 0x8a
+#define LCD2S_CMD_CUR_RESET 0x8b
+#define LCD2S_CMD_CLEAR 0x8c
+
+#define LCD2S_FIRST 8
+#define LCD2S_LAST 9
+
+#define LCD2S_ROWS 4
+#define LCD2S_COLS 20
+
+struct lcd2s_data {
+ struct i2c_client *i2c;
+ struct consw consw;
+ int row;
+ int col;
+ unsigned int cur_blink:1;
+ unsigned int cur_ul:1;
+};
+
+#define consw_to_lcd2s_data(x) container_of(x, struct lcd2s_data, consw)
+
+static void lcd2s_set_cursor(struct lcd2s_data *lcd2s, int row, int col)
+{
+ u8 buf[] = { LCD2S_CMD_CUR_POS, row + 1, col + 1};
+
+ if (row = lcd2s->row && col = lcd2s->col)
+ return;
+
+ i2c_master_send(lcd2s->i2c, buf, sizeof(buf));
+ lcd2s->row = row;
+ lcd2s->col = col;
+}
+
+static void lcd2s_reset_cursor(struct lcd2s_data *lcd2s)
+{
+ i2c_smbus_write_byte(lcd2s->i2c, LCD2S_CMD_CUR_RESET);
+ lcd2s->row = 0;
+ lcd2s->col = 0;
+}
+
+static void lcd2s_increase_cursor(struct lcd2s_data *lcd2s,
+ struct vc_data *con, int inc)
+{
+ lcd2s->col += inc;
+ if ((lcd2s->col / con->vc_cols) >= 1) {
+ lcd2s->row += (lcd2s->col / con->vc_cols);
+ lcd2s->col %= con->vc_cols;
+ }
+}
+
+static void lcd2s_cursor_ul_on(struct lcd2s_data *lcd2s)
+{
+ if (!lcd2s->cur_ul) {
+ i2c_smbus_write_byte(lcd2s->i2c, LCD2S_CMD_CUR_UL_ON);
+ lcd2s->cur_ul = 1;
+ }
+}
+
+static void lcd2s_cursor_ul_off(struct lcd2s_data *lcd2s)
+{
+ if (lcd2s->cur_ul) {
+ i2c_smbus_write_byte(lcd2s->i2c, LCD2S_CMD_CUR_UL_OFF);
+ lcd2s->cur_ul = 0;
+ }
+}
+
+static void lcd2s_cursor_blink_on(struct lcd2s_data *lcd2s)
+{
+ if (!lcd2s->cur_blink) {
+ i2c_smbus_write_byte(lcd2s->i2c, LCD2S_CMD_CUR_BLINK_ON);
+ lcd2s->cur_blink = 1;
+ }
+}
+
+static void lcd2s_cursor_blink_off(struct lcd2s_data *lcd2s)
+{
+ if (lcd2s->cur_blink) {
+ i2c_smbus_write_byte(lcd2s->i2c, LCD2S_CMD_CUR_BLINK_OFF);
+ lcd2s->cur_blink = 0;
+ }
+}
+
+static const char *lcd2s_startup(void)
+{
+ return "lcd2s console";
+}
+
+
+/*
+ * init is set if console is currently allocated during init
+ */
+static void lcd2s_init(struct vc_data *con, int init)
+{
+ struct lcd2s_data *lcd2s = consw_to_lcd2s_data(con->vc_sw);
+
+ lcd2s->cur_blink = 0;
+ lcd2s->cur_ul = 0;
+
+ /* turn display on */
+ i2c_smbus_write_byte(lcd2s->i2c, LCD2S_CMD_DISPLAY_ON);
+ i2c_smbus_write_byte(lcd2s->i2c, LCD2S_CMD_BACKLIGHT_ON);
+ i2c_smbus_write_byte(lcd2s->i2c, LCD2S_CMD_CLEAR);
+ lcd2s_cursor_ul_on(lcd2s);
+ lcd2s_reset_cursor(lcd2s);
+
+ con->vc_can_do_color = 0;
+ con->vc_hi_font_mask = 0;
+
+ if (init) {
+ con->vc_rows = LCD2S_ROWS;
+ con->vc_cols = LCD2S_COLS;
+ } else
+ vc_resize(con, LCD2S_COLS, LCD2S_ROWS);
+}
+
+static void lcd2s_deinit(struct vc_data *con)
+{
+ struct lcd2s_data *lcd2s = consw_to_lcd2s_data(con->vc_sw);
+
+ i2c_smbus_write_byte(lcd2s->i2c, LCD2S_CMD_DISPLAY_OFF);
+ i2c_smbus_write_byte(lcd2s->i2c, LCD2S_CMD_BACKLIGHT_OFF);
+ lcd2s_cursor_blink_off(lcd2s);
+ lcd2s_cursor_ul_off(lcd2s);
+}
+
+static void lcd2s_clear(struct vc_data *con, int s_row, int s_col,
+ int height, int width)
+{
+ u8 buf[width];
+ int i;
+ struct lcd2s_data *lcd2s = consw_to_lcd2s_data(con->vc_sw);
+
+ if (width <= 0 || height <= 0)
+ return;
+
+ /* if the whole display is to clear, we have a single command */
+ if (s_col = 0 && s_row = 0 &&
+ height >= con->vc_rows - 1 && width >= con->vc_cols - 1) {
+ i2c_smbus_write_byte(lcd2s->i2c, LCD2S_CMD_CLEAR);
+ return;
+ }
+
+ for (i = 0; i <= width; i++)
+ buf[i] = ' ';
+
+ for (i = s_col; i <= height; i++) {
+ lcd2s_set_cursor(lcd2s, s_row, i);
+ i2c_master_send(lcd2s->i2c, buf, width);
+ }
+}
+
+static void lcd2s_putc(struct vc_data *con, int data, int row, int col)
+{
+ struct lcd2s_data *lcd2s = consw_to_lcd2s_data(con->vc_sw);
+ u8 buf[] = {LCD2S_CMD_WRITE, data};
+
+ lcd2s_set_cursor(lcd2s, row, col);
+
+ i2c_master_send(lcd2s->i2c, buf, sizeof(buf));
+ lcd2s_increase_cursor(lcd2s, con, 1);
+}
+
+static void lcd2s_putcs(struct vc_data *con, const unsigned short *buf,
+ int len, int row, int col)
+{
+ u8 *i2c_buf;
+ int i;
+ struct lcd2s_data *lcd2s = consw_to_lcd2s_data(con->vc_sw);
+
+ i2c_buf = kzalloc(len + 1, GFP_KERNEL);
+ if (!i2c_buf)
+ return;
+
+ lcd2s_set_cursor(lcd2s, row, col);
+
+ i2c_buf[0] = LCD2S_CMD_WRITE;
+ for (i = 0; i < len ; i++)
+ i2c_buf[i + 1] = buf[i];
+
+ i2c_master_send(lcd2s->i2c, i2c_buf, len + 1);
+ kfree(i2c_buf);
+ lcd2s_increase_cursor(lcd2s, con, len);
+}
+
+static void lcd2s_cursor(struct vc_data *con, int mode)
+{
+ struct lcd2s_data *lcd2s = consw_to_lcd2s_data(con->vc_sw);
+
+ switch (mode) {
+ case CM_ERASE:
+ lcd2s_cursor_blink_off(lcd2s);
+ lcd2s_cursor_ul_off(lcd2s);
+ break;
+ case CM_MOVE:
+ case CM_DRAW:
+ lcd2s_set_cursor(lcd2s, con->vc_y, con->vc_x);
+
+ switch (con->vc_cursor_type & CUR_HWMASK) {
+ case CUR_UNDERLINE:
+ lcd2s_cursor_ul_on(lcd2s);
+ lcd2s_cursor_blink_off(lcd2s);
+ break;
+ case CUR_NONE:
+ lcd2s_cursor_blink_off(lcd2s);
+ lcd2s_cursor_ul_off(lcd2s);
+ break;
+ default:
+ lcd2s_cursor_blink_on(lcd2s);
+ lcd2s_cursor_ul_off(lcd2s);
+ break;
+ }
+ break;
+ }
+}
+
+static int lcd2s_scroll(struct vc_data *con, int top, int bot,
+ int dir, int lines)
+{
+ struct lcd2s_data *lcd2s = consw_to_lcd2s_data(con->vc_sw);
+
+ /* we can only scroll the whole display */
+ if (top = 0 && bot = con->vc_rows) {
+ while (lines--) {
+ switch (dir) {
+ case SM_UP:
+ i2c_smbus_write_byte(lcd2s->i2c,
+ LCD2S_CMD_SHIFT_UP);
+ break;
+ case SM_DOWN:
+ i2c_smbus_write_byte(lcd2s->i2c,
+ LCD2S_CMD_SHIFT_DOWN);
+ break;
+ }
+ }
+ return 0;
+ }
+ return 1;
+}
+
+static void lcd2s_bmove(struct vc_data *conp, int s_row, int s_col,
+ int d_row, int d_col, int height, int width)
+{
+}
+
+static int lcd2s_switch(struct vc_data *con)
+{
+ return 1;
+}
+
+static int lcd2s_blank(struct vc_data *con, int blank, int mode_switch)
+{
+ struct lcd2s_data *lcd2s = consw_to_lcd2s_data(con->vc_sw);
+
+ switch (blank) {
+ case 0: /* unblank */
+ i2c_smbus_write_byte(lcd2s->i2c, LCD2S_CMD_DISPLAY_ON);
+ i2c_smbus_write_byte(lcd2s->i2c, LCD2S_CMD_BACKLIGHT_ON);
+ break;
+ case 1: /* normal blanking */
+ i2c_smbus_write_byte(lcd2s->i2c, LCD2S_CMD_DISPLAY_OFF);
+ i2c_smbus_write_byte(lcd2s->i2c, LCD2S_CMD_BACKLIGHT_OFF);
+ break;
+ }
+ return 0;
+}
+
+static int lcd2s_set_palette(struct vc_data *con, unsigned char *table)
+{
+ return -EINVAL;
+}
+
+static int lcd2s_scrolldelta(struct vc_data *con, int lines)
+{
+ return 0;
+}
+
+static int __devinit lcd2s_i2c_probe(struct i2c_client *i2c,
+ const struct i2c_device_id *id)
+{
+ struct lcd2s_data *data;
+
+ if (!i2c_check_functionality(i2c->adapter,
+ I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA))
+ return -EIO;
+ data = devm_kzalloc(&i2c->dev, sizeof(struct lcd2s_data), GFP_KERNEL);
+ if (!data)
+ return -ENOMEM;
+
+ data->i2c = i2c;
+ data->consw.owner = THIS_MODULE;
+ data->consw.con_startup = lcd2s_startup;
+ data->consw.con_init = lcd2s_init;
+ data->consw.con_deinit = lcd2s_deinit;
+ data->consw.con_clear = lcd2s_clear;
+ data->consw.con_putc = lcd2s_putc;
+ data->consw.con_putcs = lcd2s_putcs;
+ data->consw.con_cursor = lcd2s_cursor;
+ data->consw.con_scroll = lcd2s_scroll;
+ data->consw.con_bmove = lcd2s_bmove;
+ data->consw.con_switch = lcd2s_switch;
+ data->consw.con_blank = lcd2s_blank;
+ data->consw.con_set_palette = lcd2s_set_palette;
+ data->consw.con_scrolldelta = lcd2s_scrolldelta;
+
+ i2c_set_clientdata(i2c, data);
+
+ take_over_console(&data->consw, LCD2S_FIRST, LCD2S_LAST, 1);
+
+ return 0;
+}
+
+static __devexit int lcd2s_i2c_remove(struct i2c_client *i2c)
+{
+ struct lcd2s_data *data = i2c_get_clientdata(i2c);
+
+ /* unregister from console subsystem */
+ unregister_con_driver(&data->consw);
+ return 0;
+}
+
+static const struct i2c_device_id lcd2s_i2c_id[] = {
+ { "lcd2s", 0 },
+ { }
+};
+MODULE_DEVICE_TABLE(i2c, lcd2s_i2c_id);
+
+static struct i2c_driver lcd2s_i2c_driver = {
+ .driver = {
+ .name = "lcd2s",
+ .owner = THIS_MODULE,
+ },
+ .probe = lcd2s_i2c_probe,
+ .remove = __devexit_p(lcd2s_i2c_remove),
+ .id_table = lcd2s_i2c_id,
+};
+
+static int __init lcd2s_modinit(void)
+{
+ int ret = 0;
+
+ ret = i2c_add_driver(&lcd2s_i2c_driver);
+ if (ret != 0)
+ pr_err("Failed to register lcd2s driver\n");
+
+ return ret;
+}
+module_init(lcd2s_modinit)
+
+static void __exit lcd2s_exit(void)
+{
+ i2c_del_driver(&lcd2s_i2c_driver);
+}
+module_exit(lcd2s_exit)
+
+MODULE_DESCRIPTION("LCD2S character display console driver");
+MODULE_AUTHOR("Lars Poeschel");
+MODULE_LICENSE("GPL");
--
1.7.10.4
^ permalink raw reply related
* [PATCH] video: da8xx-fb: clk_get on connection id fck
From: Manjunathappa @ 2012-11-20 12:53 UTC (permalink / raw)
To: linux-arm-kernel
do clk_get on connection id "fck" to support OMAP based
platforms having multiple clocks for module. Without this
driver change clk_get fails on am335x.
This patch is based on the discussion in community
http://marc.info/?l=linux-kernel&m\x135166018907827&w=2
Signed-off-by: Manjunathappa <prakash.pm@ti.com>
Cc: Vaibhav Hiremath <hvaibhav@ti.com>
---
arch/arm/mach-davinci/da830.c | 2 +-
arch/arm/mach-davinci/da850.c | 2 +-
arch/arm/mach-davinci/pm_domain.c | 1 +
drivers/video/da8xx-fb.c | 2 +-
4 files changed, 4 insertions(+), 3 deletions(-)
diff --git a/arch/arm/mach-davinci/da830.c b/arch/arm/mach-davinci/da830.c
index deee5c2..ee8504f 100644
--- a/arch/arm/mach-davinci/da830.c
+++ b/arch/arm/mach-davinci/da830.c
@@ -408,7 +408,7 @@ static struct clk_lookup da830_clks[] = {
CLK(NULL, "pwm2", &pwm2_clk),
CLK("eqep.0", NULL, &eqep0_clk),
CLK("eqep.1", NULL, &eqep1_clk),
- CLK("da8xx_lcdc.0", NULL, &lcdc_clk),
+ CLK("da8xx_lcdc.0", "fck", &lcdc_clk),
CLK("davinci-mcasp.0", NULL, &mcasp0_clk),
CLK("davinci-mcasp.1", NULL, &mcasp1_clk),
CLK("davinci-mcasp.2", NULL, &mcasp2_clk),
diff --git a/arch/arm/mach-davinci/da850.c b/arch/arm/mach-davinci/da850.c
index b44dc84..bc75bdd 100644
--- a/arch/arm/mach-davinci/da850.c
+++ b/arch/arm/mach-davinci/da850.c
@@ -389,7 +389,7 @@ static struct clk_lookup da850_clks[] = {
CLK(NULL, "rmii", &rmii_clk),
CLK("davinci_emac.1", NULL, &emac_clk),
CLK("davinci-mcasp.0", NULL, &mcasp_clk),
- CLK("da8xx_lcdc.0", NULL, &lcdc_clk),
+ CLK("da8xx_lcdc.0", "fck", &lcdc_clk),
CLK("davinci_mmc.0", NULL, &mmcsd0_clk),
CLK("davinci_mmc.1", NULL, &mmcsd1_clk),
CLK(NULL, "aemif", &aemif_clk),
diff --git a/arch/arm/mach-davinci/pm_domain.c b/arch/arm/mach-davinci/pm_domain.c
index 00946e2..c90250e 100644
--- a/arch/arm/mach-davinci/pm_domain.c
+++ b/arch/arm/mach-davinci/pm_domain.c
@@ -53,6 +53,7 @@ static struct dev_pm_domain davinci_pm_domain = {
static struct pm_clk_notifier_block platform_bus_notifier = {
.pm_domain = &davinci_pm_domain,
+ .con_ids = { "fck", NULL, },
};
static int __init davinci_pm_runtime_init(void)
diff --git a/drivers/video/da8xx-fb.c b/drivers/video/da8xx-fb.c
index f0f21c8..bb68533 100644
--- a/drivers/video/da8xx-fb.c
+++ b/drivers/video/da8xx-fb.c
@@ -1248,7 +1248,7 @@ static int __devinit fb_probe(struct platform_device *device)
goto err_request_mem;
}
- fb_clk = clk_get(&device->dev, NULL);
+ fb_clk = clk_get(&device->dev, "fck");
if (IS_ERR(fb_clk)) {
dev_err(&device->dev, "Can not get device clock\n");
ret = -ENODEV;
--
1.7.9.5
^ permalink raw reply related
* Re: [PATCH 2/2] video: exynos-mipi-dsi: Adding DT support to exynos mipi driver
From: Shaik Ameer Basha @ 2012-11-20 11:48 UTC (permalink / raw)
To: linux-fbdev
In-Reply-To: <1352547285-12302-3-git-send-email-shaik.ameer@samsung.com>
Hi Donghwa Lee,
On Tue, Nov 20, 2012 at 7:42 AM, Donghwa Lee <dh09.lee@samsung.com> wrote:
> On 10 Nov, 2012 20:34, Shaik Ameer Basha wrote:
>
>> This patch adds the DT support for the exynos mipi-dsi driver.
>> for DT support mipi device node should supply the following
>> information to the mipi-dsi driver.
>> 1] dsim_config information
>> 2] d-phy setting information
>> 3] lcd poweron, reset information
>> 4] fb_videomode information
>> [...]
>
>>
>
>> diff --git a/include/video/exynos_mipi_dsim.h b/include/video/exynos_mipi_dsim.h
>> index 772c770..6d9b01d 100644
>> --- a/include/video/exynos_mipi_dsim.h
>> +++ b/include/video/exynos_mipi_dsim.h
>> @@ -230,6 +230,7 @@ struct mipi_dsim_device {
>> struct mipi_dsim_master_ops *master_ops;
>> struct mipi_dsim_lcd_device *dsim_lcd_dev;
>> struct mipi_dsim_lcd_driver *dsim_lcd_drv;
>> + struct mipi_dsim_phy_config *dsim_phy_config;
>>
>> unsigned int state;
>> unsigned int data_lane;
>> @@ -295,6 +296,32 @@ struct mipi_dsim_master_ops {
>> };
>>
>> /*
>> + * phy node structure for mipi-dsim.
>> + *
>> + * @reg_enable_dphy : base address to memory mapped D-PHY enable register
>> + * @ctrlbit_enable_dphy : control bit for enabling D-PHY
>> + * @reg_reset_dsim : base address to memory mapped DSIM reset register
>> + * @ctrlbit_reset_dsim : control bit for resetting DSIM
>> + */
>> +struct mipi_dsim_phy_config_type1 {
>> + void __iomem *reg_enable_dphy;
>> + int ctrlbit_enable_dphy;
>> + void __iomem *reg_reset_dsim;
>> + int ctrlbit_reset_dsim;
>> +};
>> +
>> +enum mipi_dsim_phy_config_type {
>> + MIPI_DSIM_PHY_CONFIG_TYPE1,
>> +};
>> +
>> +struct mipi_dsim_phy_config {
>> + enum mipi_dsim_phy_config_type type;
>> + union {
>> + struct mipi_dsim_phy_config_type1 phy_cfg_type1;
>> + };
>> +};
>> +
>> +/*
>> * device structure for mipi-dsi based lcd panel.
>> *
>> * @name: name of the device to use with this device, or an
>
>
> Hi,
>
> Does mipi-phy-type1 means MIPI_PHYx_CONTROL register of PMU?
> If so, why did you define only 'type1'? Even if you do not use 'type0'
> on your case, should be defined 'type0' in the 'mipi_dsim_phy_config_type'?
Yes, you are right.
Sorry, I should have used 'type0' as you mentioned.
>
> And Is it correct to access to the PMU registers directly in the mipi
> dsi driver to control mipi-phyx?
As the current way of controlling PHY (i.e., through callbacks from
platform data) is not acceptable,
I had only two options to choose,
1] Controlling PHY in the mipi-dsi driver itself
2] To create a seperate PHY driver for mipi-dsi.
Currently I implemented the first method to removing the PHY related
callbacks from platform data.
I thought, there should not be any issue with directly controlling PMU
registers from mipi-dsi driver.
Please suggest any better implementation for solving this problem.
Thanks,
Shaik Ameer Basha
>
> Thanks,
> Donghwa Lee
> --
> To unsubscribe from this list: send the line "unsubscribe linux-fbdev" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply
* Re: [PATCH v11 0/6] of: add display helper
From: Steffen Trumtrar @ 2012-11-20 11:11 UTC (permalink / raw)
To: Laurent Pinchart
Cc: devicetree-discuss, Rob Herring, linux-fbdev, dri-devel,
Thierry Reding, Guennady Liakhovetski, linux-media,
Tomi Valkeinen, Stephen Warren, kernel, Florian Tobias Schandinat,
David Airlie
In-Reply-To: <5248190.b4XqndYeI2@avalon>
On Tue, Nov 20, 2012 at 11:52:06AM +0100, Laurent Pinchart wrote:
> Hi Steffen,
>
> On Tuesday 20 November 2012 11:39:18 Steffen Trumtrar wrote:
> > On Thu, Nov 15, 2012 at 02:15:06PM +0100, Steffen Trumtrar wrote:
> > > Hi!
> > >
> > > Changes since v10:
> > > - fix function name (drm_)display_mode_from_videomode
> > > - add acked-by, reviewed-by, tested-by
> > >
> > > Regards,
> > > Steffen
> > >
> > > Steffen Trumtrar (6):
> > > video: add display_timing and videomode
> > > video: add of helper for videomode
> > > fbmon: add videomode helpers
> > > fbmon: add of_videomode helpers
> > > drm_modes: add videomode helpers
> > > drm_modes: add of_videomode helpers
> > >
> > > .../devicetree/bindings/video/display-timings.txt | 107 ++++++++++
> > > drivers/gpu/drm/drm_modes.c | 70 +++++++
> > > drivers/video/Kconfig | 19 ++
> > > drivers/video/Makefile | 4 +
> > > drivers/video/display_timing.c | 24 +++
> > > drivers/video/fbmon.c | 86 ++++++++
> > > drivers/video/of_display_timing.c | 212 +++++++++++++++
> > > drivers/video/of_videomode.c | 47 +++++
> > > drivers/video/videomode.c | 45 +++++
> > > include/drm/drmP.h | 12 ++
> > > include/linux/display_timing.h | 69 +++++++
> > > include/linux/fb.h | 12 ++
> > > include/linux/of_display_timings.h | 20 ++
> > > include/linux/of_videomode.h | 17 ++
> > > include/linux/videomode.h | 40 ++++
> > > 15 files changed, 784 insertions(+)
> > > create mode 100644
> > > Documentation/devicetree/bindings/video/display-timings.txt create mode
> > > 100644 drivers/video/display_timing.c
> > > create mode 100644 drivers/video/of_display_timing.c
> > > create mode 100644 drivers/video/of_videomode.c
> > > create mode 100644 drivers/video/videomode.c
> > > create mode 100644 include/linux/display_timing.h
> > > create mode 100644 include/linux/of_display_timings.h
> > > create mode 100644 include/linux/of_videomode.h
> > > create mode 100644 include/linux/videomode.h
> >
> > Ping!
> >
> > Any comments or taker for v11? Errors are fixed, driver is tested and
> > working, DT binding got two ACKs. So, the series is finished as far as I
> > can tell.
>
> Just one last comment, sorry for not bringing this up earlier. Could you
> constify pointer arguments to functions where applicable ? For instance
>
> int videomode_from_timing(struct display_timings *disp, struct videomode *vm,
> unsigned int index);
>
> The function shouldn't modify disp, so you can make it const. Same for most of
> the API functions.
>
Okay. Will do.
> You can then add my
>
> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
>
Thanks.
Regards,
Steffen
--
Pengutronix e.K. | |
Industrial Linux Solutions | http://www.pengutronix.de/ |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
^ permalink raw reply
* Re: [PATCH v11 0/6] of: add display helper
From: Laurent Pinchart @ 2012-11-20 10:52 UTC (permalink / raw)
To: Steffen Trumtrar
Cc: devicetree-discuss, Rob Herring, linux-fbdev, dri-devel,
Thierry Reding, Guennady Liakhovetski, linux-media,
Tomi Valkeinen, Stephen Warren, kernel, Florian Tobias Schandinat,
David Airlie
In-Reply-To: <20121120103918.GB11249@pengutronix.de>
Hi Steffen,
On Tuesday 20 November 2012 11:39:18 Steffen Trumtrar wrote:
> On Thu, Nov 15, 2012 at 02:15:06PM +0100, Steffen Trumtrar wrote:
> > Hi!
> >
> > Changes since v10:
> > - fix function name (drm_)display_mode_from_videomode
> > - add acked-by, reviewed-by, tested-by
> >
> > Regards,
> > Steffen
> >
> > Steffen Trumtrar (6):
> > video: add display_timing and videomode
> > video: add of helper for videomode
> > fbmon: add videomode helpers
> > fbmon: add of_videomode helpers
> > drm_modes: add videomode helpers
> > drm_modes: add of_videomode helpers
> >
> > .../devicetree/bindings/video/display-timings.txt | 107 ++++++++++
> > drivers/gpu/drm/drm_modes.c | 70 +++++++
> > drivers/video/Kconfig | 19 ++
> > drivers/video/Makefile | 4 +
> > drivers/video/display_timing.c | 24 +++
> > drivers/video/fbmon.c | 86 ++++++++
> > drivers/video/of_display_timing.c | 212 +++++++++++++++
> > drivers/video/of_videomode.c | 47 +++++
> > drivers/video/videomode.c | 45 +++++
> > include/drm/drmP.h | 12 ++
> > include/linux/display_timing.h | 69 +++++++
> > include/linux/fb.h | 12 ++
> > include/linux/of_display_timings.h | 20 ++
> > include/linux/of_videomode.h | 17 ++
> > include/linux/videomode.h | 40 ++++
> > 15 files changed, 784 insertions(+)
> > create mode 100644
> > Documentation/devicetree/bindings/video/display-timings.txt create mode
> > 100644 drivers/video/display_timing.c
> > create mode 100644 drivers/video/of_display_timing.c
> > create mode 100644 drivers/video/of_videomode.c
> > create mode 100644 drivers/video/videomode.c
> > create mode 100644 include/linux/display_timing.h
> > create mode 100644 include/linux/of_display_timings.h
> > create mode 100644 include/linux/of_videomode.h
> > create mode 100644 include/linux/videomode.h
>
> Ping!
>
> Any comments or taker for v11? Errors are fixed, driver is tested and
> working, DT binding got two ACKs. So, the series is finished as far as I
> can tell.
Just one last comment, sorry for not bringing this up earlier. Could you
constify pointer arguments to functions where applicable ? For instance
int videomode_from_timing(struct display_timings *disp, struct videomode *vm,
unsigned int index);
The function shouldn't modify disp, so you can make it const. Same for most of
the API functions.
You can then add my
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> As I'm not sure if I reached the right maintainers with the current CC, I
> did another get_maintainers and added Florian Schandinat and David Airlie
> to the list. If I need to resend the series, please tell.
--
Regards,
Laurent Pinchart
^ permalink raw reply
* Re: [PATCH v11 0/6] of: add display helper
From: Steffen Trumtrar @ 2012-11-20 10:39 UTC (permalink / raw)
To: devicetree-discuss
Cc: Rob Herring, linux-fbdev, dri-devel, Laurent Pinchart,
Thierry Reding, Guennady Liakhovetski, linux-media,
Tomi Valkeinen, Stephen Warren, kernel, Florian Tobias Schandinat,
David Airlie
In-Reply-To: <1352985312-18178-1-git-send-email-s.trumtrar@pengutronix.de>
On Thu, Nov 15, 2012 at 02:15:06PM +0100, Steffen Trumtrar wrote:
> Hi!
>
> Changes since v10:
> - fix function name (drm_)display_mode_from_videomode
> - add acked-by, reviewed-by, tested-by
>
> Regards,
> Steffen
>
>
> Steffen Trumtrar (6):
> video: add display_timing and videomode
> video: add of helper for videomode
> fbmon: add videomode helpers
> fbmon: add of_videomode helpers
> drm_modes: add videomode helpers
> drm_modes: add of_videomode helpers
>
> .../devicetree/bindings/video/display-timings.txt | 107 ++++++++++
> drivers/gpu/drm/drm_modes.c | 70 +++++++
> drivers/video/Kconfig | 19 ++
> drivers/video/Makefile | 4 +
> drivers/video/display_timing.c | 24 +++
> drivers/video/fbmon.c | 86 ++++++++
> drivers/video/of_display_timing.c | 212 ++++++++++++++++++++
> drivers/video/of_videomode.c | 47 +++++
> drivers/video/videomode.c | 45 +++++
> include/drm/drmP.h | 12 ++
> include/linux/display_timing.h | 69 +++++++
> include/linux/fb.h | 12 ++
> include/linux/of_display_timings.h | 20 ++
> include/linux/of_videomode.h | 17 ++
> include/linux/videomode.h | 40 ++++
> 15 files changed, 784 insertions(+)
> create mode 100644 Documentation/devicetree/bindings/video/display-timings.txt
> create mode 100644 drivers/video/display_timing.c
> create mode 100644 drivers/video/of_display_timing.c
> create mode 100644 drivers/video/of_videomode.c
> create mode 100644 drivers/video/videomode.c
> create mode 100644 include/linux/display_timing.h
> create mode 100644 include/linux/of_display_timings.h
> create mode 100644 include/linux/of_videomode.h
> create mode 100644 include/linux/videomode.h
>
> --
>
>
>
Ping!
Any comments or taker for v11? Errors are fixed, driver is tested and working,
DT binding got two ACKs. So, the series is finished as far as I can tell.
As I'm not sure if I reached the right maintainers with the current CC, I did
another get_maintainers and added Florian Schandinat and David Airlie to the
list. If I need to resend the series, please tell.
Regards,
Steffen
--
Pengutronix e.K. | |
Industrial Linux Solutions | http://www.pengutronix.de/ |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
^ permalink raw reply
* [PATCH 1/1] video: softcursor: Remove redundant NULL check before kfree
From: Sachin Kamat @ 2012-11-20 9:19 UTC (permalink / raw)
To: linux-fbdev
kfree on a NULL pointer is a no-op.
Signed-off-by: Sachin Kamat <sachin.kamat@linaro.org>
---
drivers/video/console/softcursor.c | 3 +--
1 files changed, 1 insertions(+), 2 deletions(-)
diff --git a/drivers/video/console/softcursor.c b/drivers/video/console/softcursor.c
index 25f835b..46dd8f5 100644
--- a/drivers/video/console/softcursor.c
+++ b/drivers/video/console/softcursor.c
@@ -35,8 +35,7 @@ int soft_cursor(struct fb_info *info, struct fb_cursor *cursor)
dsize = s_pitch * cursor->image.height;
if (dsize + sizeof(struct fb_image) != ops->cursor_size) {
- if (ops->cursor_src != NULL)
- kfree(ops->cursor_src);
+ kfree(ops->cursor_src);
ops->cursor_size = dsize + sizeof(struct fb_image);
ops->cursor_src = kmalloc(ops->cursor_size, GFP_ATOMIC);
--
1.7.4.1
^ permalink raw reply related
* Re: [PATCH 157/493] backlight: remove use of __devinit
From: Jingoo Han @ 2012-11-20 2:21 UTC (permalink / raw)
To: Bill Pemberton
Cc: gregkh@linuxfoundation.org, Richard Purdie,
Florian Tobias Schandinat,
device-drivers-devel@blackfin.uclinux.org,
linux-fbdev@vger.kernel.org, linux-kernel@vger.kernel.org,
Jingoo Han
In-Reply-To: <1353349642-3677-157-git-send-email-wfp5p@virginia.edu>
T24gVHVlc2RheSwgTm92ZW1iZXIgMjAsIDIwMTIgMzoyMiBBTSwgQmlsbCBQZW1iZXJ0b24gd3Jv
dGUNCj4gDQo+IENPTkZJR19IT1RQTFVHIGlzIGdvaW5nIGF3YXkgYXMgYW4gb3B0aW9uIHNvIF9f
ZGV2aW5pdCBpcyBubyBsb25nZXINCj4gbmVlZGVkLg0KPiANCj4gU2lnbmVkLW9mZi1ieTogQmls
bCBQZW1iZXJ0b24gPHdmcDVwQHZpcmdpbmlhLmVkdT4NCj4gQ2M6IFJpY2hhcmQgUHVyZGllIDxy
cHVyZGllQHJwc3lzLm5ldD4NCj4gQ2M6IEZsb3JpYW4gVG9iaWFzIFNjaGFuZGluYXQgPEZsb3Jp
YW5TY2hhbmRpbmF0QGdteC5kZT4NCj4gQ2M6IGRldmljZS1kcml2ZXJzLWRldmVsQGJsYWNrZmlu
LnVjbGludXgub3JnDQo+IENjOiBsaW51eC1mYmRldkB2Z2VyLmtlcm5lbC5vcmcNCj4gLS0tDQo+
ICBkcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9hZHA1NTIwX2JsLmMgICAgICAgICB8IDIgKy0NCj4g
IGRyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2FkcDg4NjBfYmwuYyAgICAgICAgIHwgNiArKystLS0N
Cj4gIGRyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2FkcDg4NzBfYmwuYyAgICAgICAgIHwgNiArKyst
LS0NCj4gIGRyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2FtczM2OWZnMDYuYyAgICAgICAgIHwgMiAr
LQ0KPiAgZHJpdmVycy92aWRlby9iYWNrbGlnaHQvYXBwbGVfYmwuYyAgICAgICAgICAgfCAyICst
DQo+ICBkcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9jb3JnaV9sY2QuYyAgICAgICAgICB8IDIgKy0N
Cj4gIGRyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2VwOTN4eF9ibC5jICAgICAgICAgIHwgMiArLQ0K
PiAgZHJpdmVycy92aWRlby9iYWNrbGlnaHQvaHA2ODBfYmwuYyAgICAgICAgICAgfCAyICstDQo+
ICBkcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9pbGk5MzIwLmMgICAgICAgICAgICB8IDQgKystLQ0K
PiAgZHJpdmVycy92aWRlby9iYWNrbGlnaHQvbDRmMDAyNDJ0MDMuYyAgICAgICAgfCAyICstDQo+
ICBkcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9sbTM1MzNfYmwuYyAgICAgICAgICB8IDQgKystLQ0K
PiAgZHJpdmVycy92aWRlby9iYWNrbGlnaHQvbG0zNjMwX2JsLmMgICAgICAgICAgfCA0ICsrLS0N
Cj4gIGRyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2xtMzYzOV9ibC5jICAgICAgICAgIHwgNCArKy0t
DQo+ICBkcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9sbXMyODNnZjA1LmMgICAgICAgICB8IDIgKy0N
Cj4gIGRyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2x0djM1MHF2LmMgICAgICAgICAgIHwgMiArLQ0K
PiAgZHJpdmVycy92aWRlby9iYWNrbGlnaHQvbWF4ODkyNV9ibC5jICAgICAgICAgfCAyICstDQo+
ICBkcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9wY2Y1MDYzMy1iYWNrbGlnaHQuYyB8IDIgKy0NCj4g
IGRyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L3BsYXRmb3JtX2xjZC5jICAgICAgIHwgMiArLQ0KPiAg
ZHJpdmVycy92aWRlby9iYWNrbGlnaHQvczZlNjNtMC5jICAgICAgICAgICAgfCAyICstDQo+ICBk
cml2ZXJzL3ZpZGVvL2JhY2tsaWdodC90ZG8yNG0uYyAgICAgICAgICAgICB8IDIgKy0NCj4gIGRy
aXZlcnMvdmlkZW8vYmFja2xpZ2h0L3Rvc2FfYmwuYyAgICAgICAgICAgIHwgMiArLQ0KPiAgZHJp
dmVycy92aWRlby9iYWNrbGlnaHQvdG9zYV9sY2QuYyAgICAgICAgICAgfCAyICstDQo+ICBkcml2
ZXJzL3ZpZGVvL2JhY2tsaWdodC92Z2cyNDMyYTQuYyAgICAgICAgICB8IDIgKy0NCj4gIDIzIGZp
bGVzIGNoYW5nZWQsIDMxIGluc2VydGlvbnMoKyksIDMxIGRlbGV0aW9ucygtKQ0KPiANCg0KQWNr
ZWQtYnk6IEppbmdvbyBIYW4gPGpnMS5oYW5Ac2Ftc3VuZy5jb20+DQoNCkJlc3QgcmVnYXJkcywN
CkppbmdvbyBIYW4NCg0K
^ permalink raw reply
* Re: [PATCH 120/493] backlight: remove use of __devexit_p
From: Jingoo Han @ 2012-11-20 2:19 UTC (permalink / raw)
To: Bill Pemberton
Cc: gregkh@linuxfoundation.org, Richard Purdie,
Florian Tobias Schandinat,
device-drivers-devel@blackfin.uclinux.org,
linux-fbdev@vger.kernel.org, linux-kernel@vger.kernel.org,
Jingoo Han
In-Reply-To: <1353349642-3677-120-git-send-email-wfp5p@virginia.edu>
T24gVHVlc2RheSwgTm92ZW1iZXIgMjAsIDIwMTIgMzoyMSBBTSwgQmlsbCBQZW1iZXJ0b24gd3Jv
dGUNCj4gDQo+IENPTkZJR19IT1RQTFVHIGlzIGdvaW5nIGF3YXkgYXMgYW4gb3B0aW9uIHNvIF9f
ZGV2ZXhpdF9wIGlzIG5vIGxvbmdlcg0KPiBuZWVkZWQuDQo+IA0KPiBTaWduZWQtb2ZmLWJ5OiBC
aWxsIFBlbWJlcnRvbiA8d2ZwNXBAdmlyZ2luaWEuZWR1Pg0KPiBDYzogUmljaGFyZCBQdXJkaWUg
PHJwdXJkaWVAcnBzeXMubmV0Pg0KPiBDYzogRmxvcmlhbiBUb2JpYXMgU2NoYW5kaW5hdCA8Rmxv
cmlhblNjaGFuZGluYXRAZ214LmRlPg0KPiBDYzogZGV2aWNlLWRyaXZlcnMtZGV2ZWxAYmxhY2tm
aW4udWNsaW51eC5vcmcNCj4gQ2M6IGxpbnV4LWZiZGV2QHZnZXIua2VybmVsLm9yZw0KPiAtLS0N
Cj4gIGRyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2FkcDU1MjBfYmwuYyAgICAgICAgIHwgMiArLQ0K
PiAgZHJpdmVycy92aWRlby9iYWNrbGlnaHQvYWRwODg2MF9ibC5jICAgICAgICAgfCAyICstDQo+
ICBkcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9hZHA4ODcwX2JsLmMgICAgICAgICB8IDIgKy0NCj4g
IGRyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2FtczM2OWZnMDYuYyAgICAgICAgIHwgMiArLQ0KPiAg
ZHJpdmVycy92aWRlby9iYWNrbGlnaHQvY29yZ2lfbGNkLmMgICAgICAgICAgfCAyICstDQo+ICBk
cml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9lcDkzeHhfYmwuYyAgICAgICAgICB8IDIgKy0NCj4gIGRy
aXZlcnMvdmlkZW8vYmFja2xpZ2h0L2hwNjgwX2JsLmMgICAgICAgICAgIHwgMiArLQ0KPiAgZHJp
dmVycy92aWRlby9iYWNrbGlnaHQvbDRmMDAyNDJ0MDMuYyAgICAgICAgfCAyICstDQo+ICBkcml2
ZXJzL3ZpZGVvL2JhY2tsaWdodC9sZDkwNDAuYyAgICAgICAgICAgICB8IDIgKy0NCj4gIGRyaXZl
cnMvdmlkZW8vYmFja2xpZ2h0L2xtMzUzM19ibC5jICAgICAgICAgIHwgMiArLQ0KPiAgZHJpdmVy
cy92aWRlby9iYWNrbGlnaHQvbG0zNjMwX2JsLmMgICAgICAgICAgfCAyICstDQo+ICBkcml2ZXJz
L3ZpZGVvL2JhY2tsaWdodC9sbTM2MzlfYmwuYyAgICAgICAgICB8IDIgKy0NCj4gIGRyaXZlcnMv
dmlkZW8vYmFja2xpZ2h0L2xtczI4M2dmMDUuYyAgICAgICAgIHwgMiArLQ0KPiAgZHJpdmVycy92
aWRlby9iYWNrbGlnaHQvbHA4NTV4X2JsLmMgICAgICAgICAgfCAyICstDQo+ICBkcml2ZXJzL3Zp
ZGVvL2JhY2tsaWdodC9sdHYzNTBxdi5jICAgICAgICAgICB8IDIgKy0NCj4gIGRyaXZlcnMvdmlk
ZW8vYmFja2xpZ2h0L21heDg5MjVfYmwuYyAgICAgICAgIHwgMiArLQ0KPiAgZHJpdmVycy92aWRl
by9iYWNrbGlnaHQvcGNmNTA2MzMtYmFja2xpZ2h0LmMgfCAyICstDQo+ICBkcml2ZXJzL3ZpZGVv
L2JhY2tsaWdodC9wbGF0Zm9ybV9sY2QuYyAgICAgICB8IDIgKy0NCj4gIGRyaXZlcnMvdmlkZW8v
YmFja2xpZ2h0L3M2ZTYzbTAuYyAgICAgICAgICAgIHwgMiArLQ0KPiAgZHJpdmVycy92aWRlby9i
YWNrbGlnaHQvdGRvMjRtLmMgICAgICAgICAgICAgfCAyICstDQo+ICBkcml2ZXJzL3ZpZGVvL2Jh
Y2tsaWdodC90b3NhX2JsLmMgICAgICAgICAgICB8IDIgKy0NCj4gIGRyaXZlcnMvdmlkZW8vYmFj
a2xpZ2h0L3Rvc2FfbGNkLmMgICAgICAgICAgIHwgMiArLQ0KPiAgZHJpdmVycy92aWRlby9iYWNr
bGlnaHQvdmdnMjQzMmE0LmMgICAgICAgICAgfCAyICstDQo+ICAyMyBmaWxlcyBjaGFuZ2VkLCAy
MyBpbnNlcnRpb25zKCspLCAyMyBkZWxldGlvbnMoLSkNCj4gDQoNCkFja2VkLWJ5OiBKaW5nb28g
SGFuIDxqZzEuaGFuQHNhbXN1bmcuY29tPg0KDQpCZXN0IHJlZ2FyZHMsDQpKaW5nb28gSGFuDQoN
Cg=
^ permalink raw reply
* Re: [PATCH 445/493] backlight: remove use of __devexit
From: Jingoo Han @ 2012-11-20 2:17 UTC (permalink / raw)
To: Bill Pemberton
Cc: gregkh@linuxfoundation.org, Richard Purdie,
Florian Tobias Schandinat,
device-drivers-devel@blackfin.uclinux.org,
linux-fbdev@vger.kernel.org, linux-kernel, Jingoo Han
In-Reply-To: <1353349642-3677-445-git-send-email-wfp5p@virginia.edu>
T24gVHVlc2RheSwgTm92ZW1iZXIgMjAsIDIwMTIgMzoyNyBBTSwgQmlsbCBQZW1iZXJ0b24gd3Jv
dGUNCj4gDQo+IENPTkZJR19IT1RQTFVHIGlzIGdvaW5nIGF3YXkgYXMgYW4gb3B0aW9uIHNvIF9f
ZGV2ZXhpdCBpcyBubw0KPiBsb25nZXIgbmVlZGVkLg0KPiANCj4gU2lnbmVkLW9mZi1ieTogQmls
bCBQZW1iZXJ0b24gPHdmcDVwQHZpcmdpbmlhLmVkdT4NCj4gQ2M6IFJpY2hhcmQgUHVyZGllIDxy
cHVyZGllQHJwc3lzLm5ldD4NCj4gQ2M6IEZsb3JpYW4gVG9iaWFzIFNjaGFuZGluYXQgPEZsb3Jp
YW5TY2hhbmRpbmF0QGdteC5kZT4NCj4gQ2M6IGRldmljZS1kcml2ZXJzLWRldmVsQGJsYWNrZmlu
LnVjbGludXgub3JnDQo+IENjOiBsaW51eC1mYmRldkB2Z2VyLmtlcm5lbC5vcmcNCj4gLS0tDQo+
ICBkcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9hZHA1NTIwX2JsLmMgICAgICAgICB8IDIgKy0NCj4g
IGRyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2FkcDg4NjBfYmwuYyAgICAgICAgIHwgNiArKystLS0N
Cj4gIGRyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2FkcDg4NzBfYmwuYyAgICAgICAgIHwgNiArKyst
LS0NCj4gIGRyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2FtczM2OWZnMDYuYyAgICAgICAgIHwgMiAr
LQ0KPiAgZHJpdmVycy92aWRlby9iYWNrbGlnaHQvYXBwbGVfYmwuYyAgICAgICAgICAgfCAyICst
DQo+ICBkcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9jb3JnaV9sY2QuYyAgICAgICAgICB8IDIgKy0N
Cj4gIGRyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2VwOTN4eF9ibC5jICAgICAgICAgIHwgMiArLQ0K
PiAgZHJpdmVycy92aWRlby9iYWNrbGlnaHQvaHA2ODBfYmwuYyAgICAgICAgICAgfCAyICstDQo+
ICBkcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9pbGk5MzIwLmMgICAgICAgICAgICB8IDIgKy0NCj4g
IGRyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L2w0ZjAwMjQydDAzLmMgICAgICAgIHwgMiArLQ0KPiAg
ZHJpdmVycy92aWRlby9iYWNrbGlnaHQvbGQ5MDQwLmMgICAgICAgICAgICAgfCAyICstDQo+ICBk
cml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9sbTM1MzNfYmwuYyAgICAgICAgICB8IDIgKy0NCj4gIGRy
aXZlcnMvdmlkZW8vYmFja2xpZ2h0L2xtMzYzMF9ibC5jICAgICAgICAgIHwgMiArLQ0KPiAgZHJp
dmVycy92aWRlby9iYWNrbGlnaHQvbG0zNjM5X2JsLmMgICAgICAgICAgfCAyICstDQo+ICBkcml2
ZXJzL3ZpZGVvL2JhY2tsaWdodC9sbXMyODNnZjA1LmMgICAgICAgICB8IDIgKy0NCj4gIGRyaXZl
cnMvdmlkZW8vYmFja2xpZ2h0L2xwODU1eF9ibC5jICAgICAgICAgIHwgMiArLQ0KPiAgZHJpdmVy
cy92aWRlby9iYWNrbGlnaHQvbHR2MzUwcXYuYyAgICAgICAgICAgfCAyICstDQo+ICBkcml2ZXJz
L3ZpZGVvL2JhY2tsaWdodC9tYXg4OTI1X2JsLmMgICAgICAgICB8IDIgKy0NCj4gIGRyaXZlcnMv
dmlkZW8vYmFja2xpZ2h0L3BjZjUwNjMzLWJhY2tsaWdodC5jIHwgMiArLQ0KPiAgZHJpdmVycy92
aWRlby9iYWNrbGlnaHQvcGxhdGZvcm1fbGNkLmMgICAgICAgfCAyICstDQo+ICBkcml2ZXJzL3Zp
ZGVvL2JhY2tsaWdodC9zNmU2M20wLmMgICAgICAgICAgICB8IDIgKy0NCj4gIGRyaXZlcnMvdmlk
ZW8vYmFja2xpZ2h0L3RkbzI0bS5jICAgICAgICAgICAgIHwgMiArLQ0KPiAgZHJpdmVycy92aWRl
by9iYWNrbGlnaHQvdG9zYV9ibC5jICAgICAgICAgICAgfCAyICstDQo+ICBkcml2ZXJzL3ZpZGVv
L2JhY2tsaWdodC90b3NhX2xjZC5jICAgICAgICAgICB8IDIgKy0NCj4gIGRyaXZlcnMvdmlkZW8v
YmFja2xpZ2h0L3ZnZzI0MzJhNC5jICAgICAgICAgIHwgMiArLQ0KPiAgMjUgZmlsZXMgY2hhbmdl
ZCwgMjkgaW5zZXJ0aW9ucygrKSwgMjkgZGVsZXRpb25zKC0pDQo+IA0KDQpBY2tlZC1ieTogSmlu
Z29vIEhhbiA8amcxLmhhbkBzYW1zdW5nLmNvbT4NCg0KQmVzdCByZWdhcmRzLA0KSmluZ29vIEhh
bg0KDQo
^ permalink raw reply
* Re: [PATCH 2/2] video: exynos-mipi-dsi: Adding DT support to exynos mipi driver
From: Donghwa Lee @ 2012-11-20 2:12 UTC (permalink / raw)
To: linux-fbdev
In-Reply-To: <1352547285-12302-3-git-send-email-shaik.ameer@samsung.com>
On 10 Nov, 2012 20:34, Shaik Ameer Basha wrote:
> This patch adds the DT support for the exynos mipi-dsi driver.
> for DT support mipi device node should supply the following
> information to the mipi-dsi driver.
> 1] dsim_config information
> 2] d-phy setting information
> 3] lcd poweron, reset information
> 4] fb_videomode information
> [...]
>
> diff --git a/include/video/exynos_mipi_dsim.h b/include/video/exynos_mipi_dsim.h
> index 772c770..6d9b01d 100644
> --- a/include/video/exynos_mipi_dsim.h
> +++ b/include/video/exynos_mipi_dsim.h
> @@ -230,6 +230,7 @@ struct mipi_dsim_device {
> struct mipi_dsim_master_ops *master_ops;
> struct mipi_dsim_lcd_device *dsim_lcd_dev;
> struct mipi_dsim_lcd_driver *dsim_lcd_drv;
> + struct mipi_dsim_phy_config *dsim_phy_config;
>
> unsigned int state;
> unsigned int data_lane;
> @@ -295,6 +296,32 @@ struct mipi_dsim_master_ops {
> };
>
> /*
> + * phy node structure for mipi-dsim.
> + *
> + * @reg_enable_dphy : base address to memory mapped D-PHY enable register
> + * @ctrlbit_enable_dphy : control bit for enabling D-PHY
> + * @reg_reset_dsim : base address to memory mapped DSIM reset register
> + * @ctrlbit_reset_dsim : control bit for resetting DSIM
> + */
> +struct mipi_dsim_phy_config_type1 {
> + void __iomem *reg_enable_dphy;
> + int ctrlbit_enable_dphy;
> + void __iomem *reg_reset_dsim;
> + int ctrlbit_reset_dsim;
> +};
> +
> +enum mipi_dsim_phy_config_type {
> + MIPI_DSIM_PHY_CONFIG_TYPE1,
> +};
> +
> +struct mipi_dsim_phy_config {
> + enum mipi_dsim_phy_config_type type;
> + union {
> + struct mipi_dsim_phy_config_type1 phy_cfg_type1;
> + };
> +};
> +
> +/*
> * device structure for mipi-dsi based lcd panel.
> *
> * @name: name of the device to use with this device, or an
Hi,
Does mipi-phy-type1 means MIPI_PHYx_CONTROL register of PMU?
If so, why did you define only 'type1'? Even if you do not use 'type0'
on your case, should be defined 'type0' in the 'mipi_dsim_phy_config_type'?
And Is it correct to access to the PMU registers directly in the mipi
dsi driver to control mipi-phyx?
Thanks,
Donghwa Lee
^ permalink raw reply
* Re: [PATCH] video: Add support for the Solomon SSD1307 OLED Controller
From: Andrew Morton @ 2012-11-19 23:26 UTC (permalink / raw)
To: linux-fbdev
In-Reply-To: <1352993527-9113-2-git-send-email-maxime.ripard@free-electrons.com>
On Thu, 15 Nov 2012 16:32:07 +0100
Maxime Ripard <maxime.ripard@free-electrons.com> wrote:
> This patch adds support for the Solomon SSD1307 OLED
> controller found on the Crystalfontz CFA10036 board.
>
> This controller can drive a display with a resolution up
> to 128x39 and can operate over I2C or SPI.
>
> The current driver has only been tested on the CFA-10036,
> that is using this controller over I2C to driver a 96x16
> OLED screen.
>
> ...
>
> +static ssize_t ssd1307fb_write(struct fb_info *info, const char __user *buf,
> + size_t count, loff_t *ppos)
> +{
> + struct ssd1307fb_par *par = info->par;
> + unsigned long total_size;
> + unsigned long p = *ppos;
> + u8 __iomem *dst;
> + int err = 0;
> +
> + total_size = info->screen_size;
> +
> + if (total_size = 0)
> + total_size = info->fix.smem_len;
> +
> + if (p > total_size)
> + return -EFBIG;
> +
> + if (count > total_size) {
> + err = -EFBIG;
> + count = total_size;
> + }
> +
> + if (count + p > total_size) {
> + if (!err)
> + err = -ENOSPC;
> +
> + count = total_size - p;
> + }
> +
> + dst = (void __force *) (info->screen_base + p);
> +
> + if (copy_from_user(dst, buf, count))
> + err = -EFAULT;
> +
> + if (!err)
> + *ppos += count;
> +
> + ssd1307fb_update_display(par);
> +
> + return (err) ? err : count;
> +}
There are a lot of things not to like about this function ;)
EFBIG means "file too large" and ENOSPC means "No space left on
device". A video driver has no business returning these errors. If
these errors occur then our poor user might end up running around
checking his disk free space and looking for huge files. Because we
misled him. These errors are due to invalid syscall arguments, so
how's about we tell the truth and use EINVAL?
Also, the function will under some circumstances return an error, but
it has done the write anyway! What is userspace supposed to do? If it
was well written it may retry the write, or report the error and
terminate. A write() should return the number of bytes written on
success. It's quite OK for that return value to be less than the
number of bytes the user requested, and I suggest that's what you
should do here. Or you could just abort the write altogther and return
-EINVAL if there are any invalid arguments.
>
> ...
>
> + par->reset = of_get_named_gpio(client->dev.of_node,
> + "reset-gpios", 0);
It appears that this driver will be unusable if CONFIG_OF=n, yet we
permit it to be configured on such systems. I think it would be better
to make CONFIG_FB_SSD1307 depend on CONFIG_OF so users don't end up
compiling and bundling unusable drivers?
(otoh, there is a maintainability argument in favor of permitting a
driver to be compiled with x86 allmodconfig)
> + if (!gpio_is_valid(par->reset)) {
> + ret = -EINVAL;
> + goto reset_oled_error;
> + }
> +
>
> ...
>
> + gpio_set_value(par->reset, 0);
A Kconfig dependency on CONFIG_GPIO might also be needed, for the same
reasons.
> + udelay(4);
> + gpio_set_value(par->reset, 1);
> + udelay(4);
>
> ...
>
^ permalink raw reply
* Re: [PATCH 0/5] OMAPFB: use dma_alloc instead of omap's vram
From: Tony Lindgren @ 2012-11-19 22:04 UTC (permalink / raw)
To: linux-arm-kernel
In-Reply-To: <50A601FA.5060401@ti.com>
* Tomi Valkeinen <tomi.valkeinen@ti.com> [121116 01:08]:
> Hi Tony,
>
> On 2012-11-13 00:50, Tony Lindgren wrote:
> > * Tomi Valkeinen <tomi.valkeinen@ti.com> [121112 02:27]:
> >> Hi,
> >>
> >> This series changes omapfb to use standard dma_alloc funcs instead of omap
> >> specific vram allocator. This let's us remove the omap vram allocator, making
> >> omapfb platform independent.
> >>
> >> However, note that using standard dma funcs causes the following downsides:
> >>
> >> 1) dma_alloc_attrs doesn't let us allocate at certain physical address.
> >> However, this should not be a problem as this feature of vram allocator
> >> is only used when reserving the framebuffer that was initialized by the
> >> bootloader, and we don't currently support "passing" a framebuffer from
> >> the bootloader to the kernel anyway.
> >>
> >> 2) dma_alloc_attrs, as of now, always ioremaps the allocated area, and
> >> we don't need the ioremap when using VRFB. This patch uses
> >> DMA_ATTR_NO_KERNEL_MAPPING for the allocation, but the flag is currently
> >> not operational.
> >>
> >> 3) OMAPFB_GET_VRAM_INFO ioctl cannot return real values anymore. I
> >> changed the ioctl to return 64M for all the values, which, I hope, the
> >> applications will interpret as "there's enough vram".
> >>
> >> 4) "vram" kernel parameter to define how much ram to reserve for video use no
> >> longer works. The user needs to enable CMA and use "cma" parameter.
> >
> > Great, thanks for fixing these. Could you please queue these into
> > a separate branch against v3.7-rc5 that I can also merge into
> > omap-for-v3.8/cleanup-headers-prepare-multiplatform-v3?
>
> Should we enable CMA by default in omap2plus_defconfig? And perhaps on
> omap1 also?
Yes if that's now needed for DSS.
> I have to say I don't know the details of the dma allocation, but afaik
> there are no drawbacks with CMA. Although it is still marked
> EXPERIMENTAL in the kconfig...
I guess that's still fine as that's what we're supposed to use :)
Regards,
Tony
^ permalink raw reply
* Re: [PATCH v2] video: Kconfig: Specify the SoCs that make use of FB_IMX
From: Sascha Hauer @ 2012-11-19 19:23 UTC (permalink / raw)
To: linux-fbdev
In-Reply-To: <1353335821-30283-1-git-send-email-fabio.estevam@freescale.com>
On Mon, Nov 19, 2012 at 12:37:01PM -0200, Fabio Estevam wrote:
> FB_IMX is the framebuffer driver used by MX1, MX21, MX25 and MX27 processors.
>
> Pass this information to the Kconfig text to make it clear.
>
> Signed-off-by: Fabio Estevam <fabio.estevam@freescale.com>
Acked-by: Sascha Hauer <s.hauer@pengutronix.de>
Sascha
> ---
> Changes since v1:
> - Add mx1/21 to the list.
>
> drivers/video/Kconfig | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/drivers/video/Kconfig b/drivers/video/Kconfig
> index 0cff083..f0c53b2 100644
> --- a/drivers/video/Kconfig
> +++ b/drivers/video/Kconfig
> @@ -364,7 +364,7 @@ config FB_SA1100
> Y here.
>
> config FB_IMX
> - tristate "Freescale i.MX LCD support"
> + tristate "Freescale i.MX1/21/25/27 LCD support"
> depends on FB && IMX_HAVE_PLATFORM_IMX_FB
> select FB_CFB_FILLRECT
> select FB_CFB_COPYAREA
> --
> 1.7.9.5
>
>
>
--
Pengutronix e.K. | |
Industrial Linux Solutions | http://www.pengutronix.de/ |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
^ permalink raw reply
* [PATCH 446/493] video: remove use of __devexit
From: Bill Pemberton @ 2012-11-19 18:26 UTC (permalink / raw)
To: linux-arm-kernel
In-Reply-To: <1353349642-3677-1-git-send-email-wfp5p@virginia.edu>
CONFIG_HOTPLUG is going away as an option so __devexit is no
longer needed.
Signed-off-by: Bill Pemberton <wfp5p@virginia.edu>
Cc: Jaya Kumar <jayalk@intworks.biz>
Cc: Florian Tobias Schandinat <FlorianSchandinat@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Russell King <linux@arm.linux.org.uk>
Cc: Jingoo Han <jg1.han@samsung.com>
Cc: Inki Dae <inki.dae@samsung.com>
Cc: Donghwa Lee <dh09.lee@samsung.com>
Cc: Kyungmin Park <kyungmin.park@samsung.com>
Cc: Ferenc Bakonyi <fero@drama.obuda.kando.hu>
Cc: Sascha Hauer <kernel@pengutronix.de>
Cc: Maik Broemme <mbroemme@plusserver.de>
Cc: Antonino Daplas <adaplas@gmail.com>
Cc: Tomi Valkeinen <tomi.valkeinen@ti.com>
Cc: Ben Dooks <ben-linux@fluff.org>
Cc: Kukjin Kim <kgene.kim@samsung.com>
Cc: Thomas Winischhofer <thomas@winischhofer.net>
Cc: Michal Januszewski <spock@gentoo.org>
Cc: Tony Prisk <linux@prisktech.co.nz>
Cc: linux-fbdev@vger.kernel.org
Cc: linux-arm-kernel@lists.infradead.org
Cc: linux-geode@lists.infradead.org
Cc: linux-nvidia@lists.surfsouth.com
Cc: linux-omap@vger.kernel.org
Cc: linux-samsung-soc@vger.kernel.org
---
drivers/video/arcfb.c | 2 +-
drivers/video/arkfb.c | 2 +-
drivers/video/asiliantfb.c | 2 +-
drivers/video/aty/aty128fb.c | 2 +-
drivers/video/aty/atyfb_base.c | 4 ++--
drivers/video/aty/radeon_base.c | 2 +-
drivers/video/au1200fb.c | 2 +-
drivers/video/auo_k1900fb.c | 2 +-
drivers/video/auo_k1901fb.c | 2 +-
drivers/video/auo_k190x.c | 2 +-
drivers/video/bf537-lq035.c | 4 ++--
drivers/video/bf54x-lq043fb.c | 2 +-
drivers/video/bfin-lq035q1-fb.c | 2 +-
drivers/video/bfin-t350mcqb-fb.c | 2 +-
drivers/video/bfin_adv7393fb.c | 2 +-
drivers/video/broadsheetfb.c | 2 +-
drivers/video/bw2.c | 2 +-
drivers/video/carminefb.c | 2 +-
drivers/video/cg14.c | 2 +-
drivers/video/cg3.c | 2 +-
drivers/video/cg6.c | 2 +-
drivers/video/chipsfb.c | 2 +-
drivers/video/cirrusfb.c | 6 +++---
drivers/video/cobalt_lcdfb.c | 2 +-
drivers/video/console/sticore.c | 2 +-
drivers/video/cyber2000fb.c | 4 ++--
drivers/video/da8xx-fb.c | 2 +-
drivers/video/ep93xx-fb.c | 2 +-
drivers/video/exynos/exynos_dp_core.c | 2 +-
drivers/video/exynos/exynos_mipi_dsi.c | 2 +-
drivers/video/ffb.c | 2 +-
drivers/video/gbefb.c | 4 ++--
drivers/video/geode/gx1fb_core.c | 4 ++--
drivers/video/geode/gxfb_core.c | 2 +-
drivers/video/geode/lxfb_core.c | 2 +-
drivers/video/grvga.c | 2 +-
drivers/video/gxt4500.c | 2 +-
drivers/video/hecubafb.c | 2 +-
drivers/video/hgafb.c | 2 +-
drivers/video/hitfb.c | 2 +-
drivers/video/hpfb.c | 2 +-
drivers/video/i740fb.c | 2 +-
drivers/video/imsttfb.c | 2 +-
drivers/video/imxfb.c | 2 +-
drivers/video/intelfb/intelfbdrv.c | 4 ++--
drivers/video/jz4740_fb.c | 2 +-
drivers/video/kyro/fbdev.c | 2 +-
drivers/video/leo.c | 2 +-
drivers/video/mb862xx/mb862xxfbdrv.c | 4 ++--
drivers/video/mbx/mbxdebugfs.c | 2 +-
drivers/video/mbx/mbxfb.c | 2 +-
drivers/video/metronomefb.c | 2 +-
drivers/video/mxsfb.c | 4 ++--
drivers/video/neofb.c | 2 +-
drivers/video/nvidia/nvidia.c | 2 +-
drivers/video/omap2/displays/panel-lgphilips-lb035q02.c | 2 +-
drivers/video/omap2/displays/panel-tpo-td043mtea1.c | 2 +-
drivers/video/p9100.c | 2 +-
drivers/video/platinumfb.c | 2 +-
drivers/video/pm2fb.c | 2 +-
drivers/video/pm3fb.c | 2 +-
drivers/video/pvr2fb.c | 2 +-
drivers/video/pxa168fb.c | 2 +-
drivers/video/pxa3xx-gcu.c | 2 +-
drivers/video/pxafb.c | 4 ++--
drivers/video/riva/fbdev.c | 2 +-
drivers/video/s3c-fb.c | 2 +-
drivers/video/s3c2410fb.c | 2 +-
drivers/video/s3fb.c | 2 +-
drivers/video/savage/savagefb_driver.c | 2 +-
drivers/video/sgivwfb.c | 2 +-
drivers/video/sh7760fb.c | 2 +-
drivers/video/sh_mipi_dsi.c | 2 +-
drivers/video/sis/sis_main.c | 2 +-
drivers/video/skeletonfb.c | 4 ++--
drivers/video/sstfb.c | 6 +++---
drivers/video/sunxvr1000.c | 2 +-
drivers/video/sunxvr2500.c | 2 +-
drivers/video/sunxvr500.c | 2 +-
drivers/video/tcx.c | 2 +-
drivers/video/tdfxfb.c | 4 ++--
drivers/video/tgafb.c | 14 +++++++-------
drivers/video/tmiofb.c | 2 +-
drivers/video/tridentfb.c | 2 +-
drivers/video/uvesafb.c | 2 +-
drivers/video/vermilion/vermilion.c | 2 +-
drivers/video/vga16fb.c | 2 +-
drivers/video/via/via-core.c | 2 +-
drivers/video/via/viafbdev.c | 2 +-
drivers/video/vt8500lcdfb.c | 2 +-
drivers/video/vt8623fb.c | 2 +-
drivers/video/w100fb.c | 2 +-
drivers/video/wm8505fb.c | 2 +-
drivers/video/wmt_ge_rops.c | 2 +-
drivers/video/xilinxfb.c | 2 +-
95 files changed, 116 insertions(+), 116 deletions(-)
diff --git a/drivers/video/arcfb.c b/drivers/video/arcfb.c
index 3ef36a9..e43401a 100644
--- a/drivers/video/arcfb.c
+++ b/drivers/video/arcfb.c
@@ -587,7 +587,7 @@ err:
return retval;
}
-static int __devexit arcfb_remove(struct platform_device *dev)
+static int arcfb_remove(struct platform_device *dev)
{
struct fb_info *info = platform_get_drvdata(dev);
diff --git a/drivers/video/arkfb.c b/drivers/video/arkfb.c
index 459b31e..94a51f1 100644
--- a/drivers/video/arkfb.c
+++ b/drivers/video/arkfb.c
@@ -1086,7 +1086,7 @@ err_enable_device:
/* PCI remove */
-static void __devexit ark_pci_remove(struct pci_dev *dev)
+static void ark_pci_remove(struct pci_dev *dev)
{
struct fb_info *info = pci_get_drvdata(dev);
diff --git a/drivers/video/asiliantfb.c b/drivers/video/asiliantfb.c
index d291750..0e5ea94 100644
--- a/drivers/video/asiliantfb.c
+++ b/drivers/video/asiliantfb.c
@@ -581,7 +581,7 @@ asiliantfb_pci_init(struct pci_dev *dp, const struct pci_device_id *ent)
return 0;
}
-static void __devexit asiliantfb_remove(struct pci_dev *dp)
+static void asiliantfb_remove(struct pci_dev *dp)
{
struct fb_info *p = pci_get_drvdata(dp);
diff --git a/drivers/video/aty/aty128fb.c b/drivers/video/aty/aty128fb.c
index e63fc9d..9cdf5a4 100644
--- a/drivers/video/aty/aty128fb.c
+++ b/drivers/video/aty/aty128fb.c
@@ -2156,7 +2156,7 @@ err_free_fb:
return -ENODEV;
}
-static void __devexit aty128_remove(struct pci_dev *pdev)
+static void aty128_remove(struct pci_dev *pdev)
{
struct fb_info *info = pci_get_drvdata(pdev);
struct aty128fb_par *par;
diff --git a/drivers/video/aty/atyfb_base.c b/drivers/video/aty/atyfb_base.c
index a3f117d..bdd98ac 100644
--- a/drivers/video/aty/atyfb_base.c
+++ b/drivers/video/aty/atyfb_base.c
@@ -3714,7 +3714,7 @@ static int __init atyfb_atari_probe(void)
#ifdef CONFIG_PCI
-static void __devexit atyfb_remove(struct fb_info *info)
+static void atyfb_remove(struct fb_info *info)
{
struct atyfb_par *par = (struct atyfb_par *) info->par;
@@ -3762,7 +3762,7 @@ static void __devexit atyfb_remove(struct fb_info *info)
}
-static void __devexit atyfb_pci_remove(struct pci_dev *pdev)
+static void atyfb_pci_remove(struct pci_dev *pdev)
{
struct fb_info *info = pci_get_drvdata(pdev);
diff --git a/drivers/video/aty/radeon_base.c b/drivers/video/aty/radeon_base.c
index 7687179..6416137 100644
--- a/drivers/video/aty/radeon_base.c
+++ b/drivers/video/aty/radeon_base.c
@@ -2407,7 +2407,7 @@ err_out:
-static void __devexit radeonfb_pci_unregister (struct pci_dev *pdev)
+static void radeonfb_pci_unregister (struct pci_dev *pdev)
{
struct fb_info *info = pci_get_drvdata(pdev);
struct radeonfb_info *rinfo = info->par;
diff --git a/drivers/video/au1200fb.c b/drivers/video/au1200fb.c
index b270a5c..1b59054 100644
--- a/drivers/video/au1200fb.c
+++ b/drivers/video/au1200fb.c
@@ -1798,7 +1798,7 @@ failed:
return ret;
}
-static int __devexit au1200fb_drv_remove(struct platform_device *dev)
+static int au1200fb_drv_remove(struct platform_device *dev)
{
struct au1200fb_platdata *pd = platform_get_drvdata(dev);
struct au1200fb_device *fbdev;
diff --git a/drivers/video/auo_k1900fb.c b/drivers/video/auo_k1900fb.c
index 46ec47b..1a9ac6e 100644
--- a/drivers/video/auo_k1900fb.c
+++ b/drivers/video/auo_k1900fb.c
@@ -177,7 +177,7 @@ static int auok1900fb_probe(struct platform_device *pdev)
return auok190x_common_probe(pdev, &init);
}
-static int __devexit auok1900fb_remove(struct platform_device *pdev)
+static int auok1900fb_remove(struct platform_device *pdev)
{
return auok190x_common_remove(pdev);
}
diff --git a/drivers/video/auo_k1901fb.c b/drivers/video/auo_k1901fb.c
index 9eb7eeb..d1db165 100644
--- a/drivers/video/auo_k1901fb.c
+++ b/drivers/video/auo_k1901fb.c
@@ -230,7 +230,7 @@ static int auok1901fb_probe(struct platform_device *pdev)
return auok190x_common_probe(pdev, &init);
}
-static int __devexit auok1901fb_remove(struct platform_device *pdev)
+static int auok1901fb_remove(struct platform_device *pdev)
{
return auok190x_common_remove(pdev);
}
diff --git a/drivers/video/auo_k190x.c b/drivers/video/auo_k190x.c
index 70aa5d4..800898b 100644
--- a/drivers/video/auo_k190x.c
+++ b/drivers/video/auo_k190x.c
@@ -1006,7 +1006,7 @@ err_reg:
}
EXPORT_SYMBOL_GPL(auok190x_common_probe);
-int __devexit auok190x_common_remove(struct platform_device *pdev)
+int auok190x_common_remove(struct platform_device *pdev)
{
struct fb_info *info = platform_get_drvdata(pdev);
struct auok190xfb_par *par = info->par;
diff --git a/drivers/video/bf537-lq035.c b/drivers/video/bf537-lq035.c
index 5b8e95d..44b8c36 100644
--- a/drivers/video/bf537-lq035.c
+++ b/drivers/video/bf537-lq035.c
@@ -108,7 +108,7 @@ static int ad5280_probe(struct i2c_client *client,
return 0;
}
-static int __devexit ad5280_remove(struct i2c_client *client)
+static int ad5280_remove(struct i2c_client *client)
{
ad5280_client = NULL;
return 0;
@@ -816,7 +816,7 @@ out_ports:
return ret;
}
-static int __devexit bfin_lq035_remove(struct platform_device *pdev)
+static int bfin_lq035_remove(struct platform_device *pdev)
{
if (fb_buffer != NULL)
dma_free_coherent(NULL, TOTAL_VIDEO_MEM_SIZE, fb_buffer, 0);
diff --git a/drivers/video/bf54x-lq043fb.c b/drivers/video/bf54x-lq043fb.c
index 9f72580..2726a5b 100644
--- a/drivers/video/bf54x-lq043fb.c
+++ b/drivers/video/bf54x-lq043fb.c
@@ -686,7 +686,7 @@ out1:
return ret;
}
-static int __devexit bfin_bf54x_remove(struct platform_device *pdev)
+static int bfin_bf54x_remove(struct platform_device *pdev)
{
struct fb_info *fbinfo = platform_get_drvdata(pdev);
diff --git a/drivers/video/bfin-lq035q1-fb.c b/drivers/video/bfin-lq035q1-fb.c
index 353fb7c..20c26374 100644
--- a/drivers/video/bfin-lq035q1-fb.c
+++ b/drivers/video/bfin-lq035q1-fb.c
@@ -764,7 +764,7 @@ static int bfin_lq035q1_probe(struct platform_device *pdev)
return ret;
}
-static int __devexit bfin_lq035q1_remove(struct platform_device *pdev)
+static int bfin_lq035q1_remove(struct platform_device *pdev)
{
struct fb_info *fbinfo = platform_get_drvdata(pdev);
struct bfin_lq035q1fb_info *info = fbinfo->par;
diff --git a/drivers/video/bfin-t350mcqb-fb.c b/drivers/video/bfin-t350mcqb-fb.c
index 9456865..d46da01 100644
--- a/drivers/video/bfin-t350mcqb-fb.c
+++ b/drivers/video/bfin-t350mcqb-fb.c
@@ -583,7 +583,7 @@ out1:
return ret;
}
-static int __devexit bfin_t350mcqb_remove(struct platform_device *pdev)
+static int bfin_t350mcqb_remove(struct platform_device *pdev)
{
struct fb_info *fbinfo = platform_get_drvdata(pdev);
diff --git a/drivers/video/bfin_adv7393fb.c b/drivers/video/bfin_adv7393fb.c
index 5754140..90196d3 100644
--- a/drivers/video/bfin_adv7393fb.c
+++ b/drivers/video/bfin_adv7393fb.c
@@ -719,7 +719,7 @@ static int bfin_adv7393_fb_setcolreg(u_int regno, u_int red, u_int green,
return 0;
}
-static int __devexit bfin_adv7393_fb_remove(struct i2c_client *client)
+static int bfin_adv7393_fb_remove(struct i2c_client *client)
{
struct adv7393fb_device *fbdev = i2c_get_clientdata(client);
diff --git a/drivers/video/broadsheetfb.c b/drivers/video/broadsheetfb.c
index bc04699..b09701c 100644
--- a/drivers/video/broadsheetfb.c
+++ b/drivers/video/broadsheetfb.c
@@ -1190,7 +1190,7 @@ err:
}
-static int __devexit broadsheetfb_remove(struct platform_device *dev)
+static int broadsheetfb_remove(struct platform_device *dev)
{
struct fb_info *info = platform_get_drvdata(dev);
diff --git a/drivers/video/bw2.c b/drivers/video/bw2.c
index 7695927..652b693 100644
--- a/drivers/video/bw2.c
+++ b/drivers/video/bw2.c
@@ -352,7 +352,7 @@ out_err:
return err;
}
-static int __devexit bw2_remove(struct platform_device *op)
+static int bw2_remove(struct platform_device *op)
{
struct fb_info *info = dev_get_drvdata(&op->dev);
struct bw2_par *par = info->par;
diff --git a/drivers/video/carminefb.c b/drivers/video/carminefb.c
index ccbe958..5780afa 100644
--- a/drivers/video/carminefb.c
+++ b/drivers/video/carminefb.c
@@ -721,7 +721,7 @@ err_enable_pci:
return ret;
}
-static void __devexit carminefb_remove(struct pci_dev *dev)
+static void carminefb_remove(struct pci_dev *dev)
{
struct carmine_hw *hw = pci_get_drvdata(dev);
struct fb_fix_screeninfo fix;
diff --git a/drivers/video/cg14.c b/drivers/video/cg14.c
index 1b95656..9738ca2 100644
--- a/drivers/video/cg14.c
+++ b/drivers/video/cg14.c
@@ -571,7 +571,7 @@ out_err:
return err;
}
-static int __devexit cg14_remove(struct platform_device *op)
+static int cg14_remove(struct platform_device *op)
{
struct fb_info *info = dev_get_drvdata(&op->dev);
struct cg14_par *par = info->par;
diff --git a/drivers/video/cg3.c b/drivers/video/cg3.c
index 4d20257..a26ecfa 100644
--- a/drivers/video/cg3.c
+++ b/drivers/video/cg3.c
@@ -433,7 +433,7 @@ out_err:
return err;
}
-static int __devexit cg3_remove(struct platform_device *op)
+static int cg3_remove(struct platform_device *op)
{
struct fb_info *info = dev_get_drvdata(&op->dev);
struct cg3_par *par = info->par;
diff --git a/drivers/video/cg6.c b/drivers/video/cg6.c
index 3204e5a..3545dec 100644
--- a/drivers/video/cg6.c
+++ b/drivers/video/cg6.c
@@ -827,7 +827,7 @@ out_err:
return err;
}
-static int __devexit cg6_remove(struct platform_device *op)
+static int cg6_remove(struct platform_device *op)
{
struct fb_info *info = dev_get_drvdata(&op->dev);
struct cg6_par *par = info->par;
diff --git a/drivers/video/chipsfb.c b/drivers/video/chipsfb.c
index 71f46e3..ee60b3c 100644
--- a/drivers/video/chipsfb.c
+++ b/drivers/video/chipsfb.c
@@ -438,7 +438,7 @@ chipsfb_pci_init(struct pci_dev *dp, const struct pci_device_id *ent)
return rc;
}
-static void __devexit chipsfb_remove(struct pci_dev *dp)
+static void chipsfb_remove(struct pci_dev *dp)
{
struct fb_info *p = pci_get_drvdata(dp);
diff --git a/drivers/video/cirrusfb.c b/drivers/video/cirrusfb.c
index f8961c3..12ba41f 100644
--- a/drivers/video/cirrusfb.c
+++ b/drivers/video/cirrusfb.c
@@ -2096,7 +2096,7 @@ err_dealloc_cmap:
return err;
}
-static void __devexit cirrusfb_cleanup(struct fb_info *info)
+static void cirrusfb_cleanup(struct fb_info *info)
{
struct cirrusfb_info *cinfo = info->par;
@@ -2215,7 +2215,7 @@ err_out:
return ret;
}
-static void __devexit cirrusfb_pci_unregister(struct pci_dev *pdev)
+static void cirrusfb_pci_unregister(struct pci_dev *pdev)
{
struct fb_info *info = pci_get_drvdata(pdev);
@@ -2352,7 +2352,7 @@ err_release_fb:
return error;
}
-void __devexit cirrusfb_zorro_unregister(struct zorro_dev *z)
+void cirrusfb_zorro_unregister(struct zorro_dev *z)
{
struct fb_info *info = zorro_get_drvdata(z);
diff --git a/drivers/video/cobalt_lcdfb.c b/drivers/video/cobalt_lcdfb.c
index bea956e..a903149 100644
--- a/drivers/video/cobalt_lcdfb.c
+++ b/drivers/video/cobalt_lcdfb.c
@@ -374,7 +374,7 @@ static int cobalt_lcdfb_probe(struct platform_device *dev)
return 0;
}
-static int __devexit cobalt_lcdfb_remove(struct platform_device *dev)
+static int cobalt_lcdfb_remove(struct platform_device *dev)
{
struct fb_info *info;
diff --git a/drivers/video/console/sticore.c b/drivers/video/console/sticore.c
index a4827da..e5b654c 100644
--- a/drivers/video/console/sticore.c
+++ b/drivers/video/console/sticore.c
@@ -998,7 +998,7 @@ static int sticore_pci_init(struct pci_dev *pd,
}
-static void __devexit sticore_pci_remove(struct pci_dev *pd)
+static void sticore_pci_remove(struct pci_dev *pd)
{
BUG();
}
diff --git a/drivers/video/cyber2000fb.c b/drivers/video/cyber2000fb.c
index b93cabc..bbdcac7 100644
--- a/drivers/video/cyber2000fb.c
+++ b/drivers/video/cyber2000fb.c
@@ -1615,7 +1615,7 @@ failed:
return err;
}
-static void __devexit cyberpro_common_remove(struct cfb_info *cfb)
+static void cyberpro_common_remove(struct cfb_info *cfb)
{
unregister_framebuffer(&cfb->fb);
#ifdef CONFIG_FB_CYBER2000_DDC
@@ -1863,7 +1863,7 @@ failed_release:
return err;
}
-static void __devexit cyberpro_pci_remove(struct pci_dev *dev)
+static void cyberpro_pci_remove(struct pci_dev *dev)
{
struct cfb_info *cfb = pci_get_drvdata(dev);
diff --git a/drivers/video/da8xx-fb.c b/drivers/video/da8xx-fb.c
index 33b286b..229b9bd 100644
--- a/drivers/video/da8xx-fb.c
+++ b/drivers/video/da8xx-fb.c
@@ -1012,7 +1012,7 @@ static inline void lcd_da8xx_cpufreq_deregister(struct da8xx_fb_par *par)
}
#endif
-static int __devexit fb_remove(struct platform_device *dev)
+static int fb_remove(struct platform_device *dev)
{
struct fb_info *info = dev_get_drvdata(&dev->dev);
diff --git a/drivers/video/ep93xx-fb.c b/drivers/video/ep93xx-fb.c
index ef4ca55..3f2519d 100644
--- a/drivers/video/ep93xx-fb.c
+++ b/drivers/video/ep93xx-fb.c
@@ -599,7 +599,7 @@ failed_cmap:
return err;
}
-static int __devexit ep93xxfb_remove(struct platform_device *pdev)
+static int ep93xxfb_remove(struct platform_device *pdev)
{
struct fb_info *info = platform_get_drvdata(pdev);
struct ep93xx_fbi *fbi = info->par;
diff --git a/drivers/video/exynos/exynos_dp_core.c b/drivers/video/exynos/exynos_dp_core.c
index 47f0448..aa845cd 100644
--- a/drivers/video/exynos/exynos_dp_core.c
+++ b/drivers/video/exynos/exynos_dp_core.c
@@ -948,7 +948,7 @@ static int exynos_dp_probe(struct platform_device *pdev)
return 0;
}
-static int __devexit exynos_dp_remove(struct platform_device *pdev)
+static int exynos_dp_remove(struct platform_device *pdev)
{
struct exynos_dp_platdata *pdata = pdev->dev.platform_data;
struct exynos_dp_device *dp = platform_get_drvdata(pdev);
diff --git a/drivers/video/exynos/exynos_mipi_dsi.c b/drivers/video/exynos/exynos_mipi_dsi.c
index 1571db7..4a17cdc 100644
--- a/drivers/video/exynos/exynos_mipi_dsi.c
+++ b/drivers/video/exynos/exynos_mipi_dsi.c
@@ -490,7 +490,7 @@ err_platform_get_irq:
return ret;
}
-static int __devexit exynos_mipi_dsi_remove(struct platform_device *pdev)
+static int exynos_mipi_dsi_remove(struct platform_device *pdev)
{
struct mipi_dsim_device *dsim = platform_get_drvdata(pdev);
struct mipi_dsim_ddi *dsim_ddi, *next;
diff --git a/drivers/video/ffb.c b/drivers/video/ffb.c
index 46aee0e..6d27447 100644
--- a/drivers/video/ffb.c
+++ b/drivers/video/ffb.c
@@ -1022,7 +1022,7 @@ out_err:
return err;
}
-static int __devexit ffb_remove(struct platform_device *op)
+static int ffb_remove(struct platform_device *op)
{
struct fb_info *info = dev_get_drvdata(&op->dev);
struct ffb_par *par = info->par;
diff --git a/drivers/video/gbefb.c b/drivers/video/gbefb.c
index f2e9788..bda5e39 100644
--- a/drivers/video/gbefb.c
+++ b/drivers/video/gbefb.c
@@ -1082,7 +1082,7 @@ static ssize_t gbefb_show_rev(struct device *device, struct device_attribute *at
static DEVICE_ATTR(revision, S_IRUGO, gbefb_show_rev, NULL);
-static void __devexit gbefb_remove_sysfs(struct device *dev)
+static void gbefb_remove_sysfs(struct device *dev)
{
device_remove_file(dev, &dev_attr_size);
device_remove_file(dev, &dev_attr_revision);
@@ -1254,7 +1254,7 @@ out_release_framebuffer:
return ret;
}
-static int __devexit gbefb_remove(struct platform_device* p_dev)
+static int gbefb_remove(struct platform_device* p_dev)
{
struct fb_info *info = platform_get_drvdata(p_dev);
diff --git a/drivers/video/geode/gx1fb_core.c b/drivers/video/geode/gx1fb_core.c
index cf97a70..ebbaada 100644
--- a/drivers/video/geode/gx1fb_core.c
+++ b/drivers/video/geode/gx1fb_core.c
@@ -382,7 +382,7 @@ static int gx1fb_probe(struct pci_dev *pdev, const struct pci_device_id *id)
return ret;
}
-static void __devexit gx1fb_remove(struct pci_dev *pdev)
+static void gx1fb_remove(struct pci_dev *pdev)
{
struct fb_info *info = pci_get_drvdata(pdev);
struct geodefb_par *par = info->par;
@@ -456,7 +456,7 @@ static int __init gx1fb_init(void)
return pci_register_driver(&gx1fb_driver);
}
-static void __devexit gx1fb_cleanup(void)
+static void gx1fb_cleanup(void)
{
pci_unregister_driver(&gx1fb_driver);
}
diff --git a/drivers/video/geode/gxfb_core.c b/drivers/video/geode/gxfb_core.c
index d40a9eb..ca0a422 100644
--- a/drivers/video/geode/gxfb_core.c
+++ b/drivers/video/geode/gxfb_core.c
@@ -455,7 +455,7 @@ static int gxfb_probe(struct pci_dev *pdev,
return ret;
}
-static void __devexit gxfb_remove(struct pci_dev *pdev)
+static void gxfb_remove(struct pci_dev *pdev)
{
struct fb_info *info = pci_get_drvdata(pdev);
struct gxfb_par *par = info->par;
diff --git a/drivers/video/geode/lxfb_core.c b/drivers/video/geode/lxfb_core.c
index 04f0098..af07dce 100644
--- a/drivers/video/geode/lxfb_core.c
+++ b/drivers/video/geode/lxfb_core.c
@@ -590,7 +590,7 @@ err:
return ret;
}
-static void __devexit lxfb_remove(struct pci_dev *pdev)
+static void lxfb_remove(struct pci_dev *pdev)
{
struct fb_info *info = pci_get_drvdata(pdev);
struct lxfb_par *par = info->par;
diff --git a/drivers/video/grvga.c b/drivers/video/grvga.c
index 3cdfacd..8b1dd9a 100644
--- a/drivers/video/grvga.c
+++ b/drivers/video/grvga.c
@@ -512,7 +512,7 @@ free_fb:
return retval;
}
-static int __devexit grvga_remove(struct platform_device *device)
+static int grvga_remove(struct platform_device *device)
{
struct fb_info *info = dev_get_drvdata(&device->dev);
struct grvga_par *par = info->par;
diff --git a/drivers/video/gxt4500.c b/drivers/video/gxt4500.c
index 58d3543..09133de 100644
--- a/drivers/video/gxt4500.c
+++ b/drivers/video/gxt4500.c
@@ -720,7 +720,7 @@ static int gxt4500_probe(struct pci_dev *pdev,
return -ENODEV;
}
-static void __devexit gxt4500_remove(struct pci_dev *pdev)
+static void gxt4500_remove(struct pci_dev *pdev)
{
struct fb_info *info = pci_get_drvdata(pdev);
struct gxt4500_par *par;
diff --git a/drivers/video/hecubafb.c b/drivers/video/hecubafb.c
index 298f977..59d2318 100644
--- a/drivers/video/hecubafb.c
+++ b/drivers/video/hecubafb.c
@@ -280,7 +280,7 @@ err_videomem_alloc:
return retval;
}
-static int __devexit hecubafb_remove(struct platform_device *dev)
+static int hecubafb_remove(struct platform_device *dev)
{
struct fb_info *info = platform_get_drvdata(dev);
diff --git a/drivers/video/hgafb.c b/drivers/video/hgafb.c
index 43b3976..1e9e2d8 100644
--- a/drivers/video/hgafb.c
+++ b/drivers/video/hgafb.c
@@ -592,7 +592,7 @@ static int hgafb_probe(struct platform_device *pdev)
return 0;
}
-static int __devexit hgafb_remove(struct platform_device *pdev)
+static int hgafb_remove(struct platform_device *pdev)
{
struct fb_info *info = platform_get_drvdata(pdev);
diff --git a/drivers/video/hitfb.c b/drivers/video/hitfb.c
index adb6708..c2414d6 100644
--- a/drivers/video/hitfb.c
+++ b/drivers/video/hitfb.c
@@ -417,7 +417,7 @@ err_fb:
return ret;
}
-static int __devexit hitfb_remove(struct platform_device *dev)
+static int hitfb_remove(struct platform_device *dev)
{
struct fb_info *info = platform_get_drvdata(dev);
diff --git a/drivers/video/hpfb.c b/drivers/video/hpfb.c
index aa2abe8..d6bbd98 100644
--- a/drivers/video/hpfb.c
+++ b/drivers/video/hpfb.c
@@ -350,7 +350,7 @@ static int hpfb_dio_probe(struct dio_dev * d, const struct dio_device_id * ent)
return 0;
}
-static void __devexit hpfb_remove_one(struct dio_dev *d)
+static void hpfb_remove_one(struct dio_dev *d)
{
unregister_framebuffer(&fb_info);
if (d->scode >= DIOII_SCBASE)
diff --git a/drivers/video/i740fb.c b/drivers/video/i740fb.c
index 05c7d94..47671f1 100644
--- a/drivers/video/i740fb.c
+++ b/drivers/video/i740fb.c
@@ -1174,7 +1174,7 @@ err_enable_device:
return ret;
}
-static void __devexit i740fb_remove(struct pci_dev *dev)
+static void i740fb_remove(struct pci_dev *dev)
{
struct fb_info *info = pci_get_drvdata(dev);
diff --git a/drivers/video/imsttfb.c b/drivers/video/imsttfb.c
index 7060401..954ac45 100644
--- a/drivers/video/imsttfb.c
+++ b/drivers/video/imsttfb.c
@@ -1534,7 +1534,7 @@ imsttfb_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
return 0;
}
-static void __devexit
+static void
imsttfb_remove(struct pci_dev *pdev)
{
struct fb_info *info = pci_get_drvdata(pdev);
diff --git a/drivers/video/imxfb.c b/drivers/video/imxfb.c
index e1fbfb0..1252678 100644
--- a/drivers/video/imxfb.c
+++ b/drivers/video/imxfb.c
@@ -917,7 +917,7 @@ failed_init:
return ret;
}
-static int __devexit imxfb_remove(struct platform_device *pdev)
+static int imxfb_remove(struct platform_device *pdev)
{
struct imx_fb_platform_data *pdata;
struct fb_info *info = platform_get_drvdata(pdev);
diff --git a/drivers/video/intelfb/intelfbdrv.c b/drivers/video/intelfb/intelfbdrv.c
index 184bbb7..524b87f 100644
--- a/drivers/video/intelfb/intelfbdrv.c
+++ b/drivers/video/intelfb/intelfbdrv.c
@@ -164,7 +164,7 @@ static int intelfb_ioctl(struct fb_info *info,
static int intelfb_pci_register(struct pci_dev *pdev,
const struct pci_device_id *ent);
-static void __devexit intelfb_pci_unregister(struct pci_dev *pdev);
+static void intelfb_pci_unregister(struct pci_dev *pdev);
static int intelfb_set_fbinfo(struct intelfb_info *dinfo);
/*
@@ -921,7 +921,7 @@ err_out_cmap:
return -ENODEV;
}
-static void __devexit
+static void
intelfb_pci_unregister(struct pci_dev *pdev)
{
struct intelfb_info *dinfo = pci_get_drvdata(pdev);
diff --git a/drivers/video/jz4740_fb.c b/drivers/video/jz4740_fb.c
index 9f5003f..d999bb5 100644
--- a/drivers/video/jz4740_fb.c
+++ b/drivers/video/jz4740_fb.c
@@ -725,7 +725,7 @@ err_framebuffer_release:
return ret;
}
-static int __devexit jzfb_remove(struct platform_device *pdev)
+static int jzfb_remove(struct platform_device *pdev)
{
struct jzfb *jzfb = platform_get_drvdata(pdev);
diff --git a/drivers/video/kyro/fbdev.c b/drivers/video/kyro/fbdev.c
index 2f0effd..fea5b52 100644
--- a/drivers/video/kyro/fbdev.c
+++ b/drivers/video/kyro/fbdev.c
@@ -754,7 +754,7 @@ out_unmap:
return -EINVAL;
}
-static void __devexit kyrofb_remove(struct pci_dev *pdev)
+static void kyrofb_remove(struct pci_dev *pdev)
{
struct fb_info *info = pci_get_drvdata(pdev);
struct kyrofb_info *par = info->par;
diff --git a/drivers/video/leo.c b/drivers/video/leo.c
index 8c64c79..b17f500 100644
--- a/drivers/video/leo.c
+++ b/drivers/video/leo.c
@@ -636,7 +636,7 @@ out_err:
return err;
}
-static int __devexit leo_remove(struct platform_device *op)
+static int leo_remove(struct platform_device *op)
{
struct fb_info *info = dev_get_drvdata(&op->dev);
struct leo_par *par = info->par;
diff --git a/drivers/video/mb862xx/mb862xxfbdrv.c b/drivers/video/mb862xx/mb862xxfbdrv.c
index 28ae8fb..a7611b7 100644
--- a/drivers/video/mb862xx/mb862xxfbdrv.c
+++ b/drivers/video/mb862xx/mb862xxfbdrv.c
@@ -786,7 +786,7 @@ fbrel:
return ret;
}
-static int __devexit of_platform_mb862xx_remove(struct platform_device *ofdev)
+static int of_platform_mb862xx_remove(struct platform_device *ofdev)
{
struct fb_info *fbi = dev_get_drvdata(&ofdev->dev);
struct mb862xxfb_par *par = fbi->par;
@@ -1133,7 +1133,7 @@ out:
return ret;
}
-static void __devexit mb862xx_pci_remove(struct pci_dev *pdev)
+static void mb862xx_pci_remove(struct pci_dev *pdev)
{
struct fb_info *fbi = pci_get_drvdata(pdev);
struct mb862xxfb_par *par = fbi->par;
diff --git a/drivers/video/mbx/mbxdebugfs.c b/drivers/video/mbx/mbxdebugfs.c
index 474f94f..4449f24 100644
--- a/drivers/video/mbx/mbxdebugfs.c
+++ b/drivers/video/mbx/mbxdebugfs.c
@@ -236,7 +236,7 @@ static void mbxfb_debugfs_init(struct fb_info *fbi)
fbi, &misc_fops);
}
-static void __devexit mbxfb_debugfs_remove(struct fb_info *fbi)
+static void mbxfb_debugfs_remove(struct fb_info *fbi)
{
struct mbxfb_info *mfbi = fbi->par;
struct mbxfb_debugfs_data *dbg = mfbi->debugfs_data;
diff --git a/drivers/video/mbx/mbxfb.c b/drivers/video/mbx/mbxfb.c
index faa171f..f3a9ede 100644
--- a/drivers/video/mbx/mbxfb.c
+++ b/drivers/video/mbx/mbxfb.c
@@ -1006,7 +1006,7 @@ err1:
return ret;
}
-static int __devexit mbxfb_remove(struct platform_device *dev)
+static int mbxfb_remove(struct platform_device *dev)
{
struct fb_info *fbi = platform_get_drvdata(dev);
diff --git a/drivers/video/metronomefb.c b/drivers/video/metronomefb.c
index 6454888..d3fc9b1 100644
--- a/drivers/video/metronomefb.c
+++ b/drivers/video/metronomefb.c
@@ -741,7 +741,7 @@ err:
return retval;
}
-static int __devexit metronomefb_remove(struct platform_device *dev)
+static int metronomefb_remove(struct platform_device *dev)
{
struct fb_info *info = platform_get_drvdata(dev);
diff --git a/drivers/video/mxsfb.c b/drivers/video/mxsfb.c
index be26b36..a45b37c 100644
--- a/drivers/video/mxsfb.c
+++ b/drivers/video/mxsfb.c
@@ -739,7 +739,7 @@ static int mxsfb_init_fbinfo(struct mxsfb_info *host)
return 0;
}
-static void __devexit mxsfb_free_videomem(struct mxsfb_info *host)
+static void mxsfb_free_videomem(struct mxsfb_info *host)
{
struct fb_info *fb_info = &host->fb_info;
@@ -912,7 +912,7 @@ error_alloc_info:
return ret;
}
-static int __devexit mxsfb_remove(struct platform_device *pdev)
+static int mxsfb_remove(struct platform_device *pdev)
{
struct fb_info *fb_info = platform_get_drvdata(pdev);
struct mxsfb_info *host = to_imxfb_host(fb_info);
diff --git a/drivers/video/neofb.c b/drivers/video/neofb.c
index b86fd96..9770ff3 100644
--- a/drivers/video/neofb.c
+++ b/drivers/video/neofb.c
@@ -2128,7 +2128,7 @@ err_map_mmio:
return err;
}
-static void __devexit neofb_remove(struct pci_dev *dev)
+static void neofb_remove(struct pci_dev *dev)
{
struct fb_info *info = pci_get_drvdata(dev);
diff --git a/drivers/video/nvidia/nvidia.c b/drivers/video/nvidia/nvidia.c
index b7f8feb..fd4e7bf 100644
--- a/drivers/video/nvidia/nvidia.c
+++ b/drivers/video/nvidia/nvidia.c
@@ -1438,7 +1438,7 @@ err_out:
return -ENODEV;
}
-static void __devexit nvidiafb_remove(struct pci_dev *pd)
+static void nvidiafb_remove(struct pci_dev *pd)
{
struct fb_info *info = pci_get_drvdata(pd);
struct nvidia_par *par = info->par;
diff --git a/drivers/video/omap2/displays/panel-lgphilips-lb035q02.c b/drivers/video/omap2/displays/panel-lgphilips-lb035q02.c
index 4ed48af..0b36093 100644
--- a/drivers/video/omap2/displays/panel-lgphilips-lb035q02.c
+++ b/drivers/video/omap2/displays/panel-lgphilips-lb035q02.c
@@ -256,7 +256,7 @@ static int lb035q02_panel_spi_probe(struct spi_device *spi)
return omap_dss_register_driver(&lb035q02_driver);
}
-static int __devexit lb035q02_panel_spi_remove(struct spi_device *spi)
+static int lb035q02_panel_spi_remove(struct spi_device *spi)
{
omap_dss_unregister_driver(&lb035q02_driver);
return 0;
diff --git a/drivers/video/omap2/displays/panel-tpo-td043mtea1.c b/drivers/video/omap2/displays/panel-tpo-td043mtea1.c
index d655389..60f1990 100644
--- a/drivers/video/omap2/displays/panel-tpo-td043mtea1.c
+++ b/drivers/video/omap2/displays/panel-tpo-td043mtea1.c
@@ -548,7 +548,7 @@ static int tpo_td043_spi_probe(struct spi_device *spi)
return 0;
}
-static int __devexit tpo_td043_spi_remove(struct spi_device *spi)
+static int tpo_td043_spi_remove(struct spi_device *spi)
{
struct tpo_td043_device *tpo_td043 = dev_get_drvdata(&spi->dev);
diff --git a/drivers/video/p9100.c b/drivers/video/p9100.c
index 62d8339..4b23af6 100644
--- a/drivers/video/p9100.c
+++ b/drivers/video/p9100.c
@@ -326,7 +326,7 @@ out_err:
return err;
}
-static int __devexit p9100_remove(struct platform_device *op)
+static int p9100_remove(struct platform_device *op)
{
struct fb_info *info = dev_get_drvdata(&op->dev);
struct p9100_par *par = info->par;
diff --git a/drivers/video/platinumfb.c b/drivers/video/platinumfb.c
index f638002..5113bf3 100644
--- a/drivers/video/platinumfb.c
+++ b/drivers/video/platinumfb.c
@@ -645,7 +645,7 @@ static int platinumfb_probe(struct platform_device* odev)
return rc;
}
-static int __devexit platinumfb_remove(struct platform_device* odev)
+static int platinumfb_remove(struct platform_device* odev)
{
struct fb_info *info = dev_get_drvdata(&odev->dev);
struct fb_info_platinum *pinfo = info->par;
diff --git a/drivers/video/pm2fb.c b/drivers/video/pm2fb.c
index f3ab16b..8fbfcc2 100644
--- a/drivers/video/pm2fb.c
+++ b/drivers/video/pm2fb.c
@@ -1727,7 +1727,7 @@ static int pm2fb_probe(struct pci_dev *pdev,
*
* @param pdev PCI device to clean up.
*/
-static void __devexit pm2fb_remove(struct pci_dev *pdev)
+static void pm2fb_remove(struct pci_dev *pdev)
{
struct fb_info *info = pci_get_drvdata(pdev);
struct fb_fix_screeninfo *fix = &info->fix;
diff --git a/drivers/video/pm3fb.c b/drivers/video/pm3fb.c
index 60d608b..dbc75d0 100644
--- a/drivers/video/pm3fb.c
+++ b/drivers/video/pm3fb.c
@@ -1469,7 +1469,7 @@ static int pm3fb_probe(struct pci_dev *dev,
/*
* Cleanup
*/
-static void __devexit pm3fb_remove(struct pci_dev *dev)
+static void pm3fb_remove(struct pci_dev *dev)
{
struct fb_info *info = pci_get_drvdata(dev);
diff --git a/drivers/video/pvr2fb.c b/drivers/video/pvr2fb.c
index 05ca970..2e08e36 100644
--- a/drivers/video/pvr2fb.c
+++ b/drivers/video/pvr2fb.c
@@ -953,7 +953,7 @@ static int pvr2fb_pci_probe(struct pci_dev *pdev,
return pvr2fb_common_init();
}
-static void __devexit pvr2fb_pci_remove(struct pci_dev *pdev)
+static void pvr2fb_pci_remove(struct pci_dev *pdev)
{
if (fb_info->screen_base) {
iounmap(fb_info->screen_base);
diff --git a/drivers/video/pxa168fb.c b/drivers/video/pxa168fb.c
index 49af862..aa9bd1f 100644
--- a/drivers/video/pxa168fb.c
+++ b/drivers/video/pxa168fb.c
@@ -783,7 +783,7 @@ failed_put_clk:
return ret;
}
-static int __devexit pxa168fb_remove(struct platform_device *pdev)
+static int pxa168fb_remove(struct platform_device *pdev)
{
struct pxa168fb_info *fbi = platform_get_drvdata(pdev);
struct fb_info *info;
diff --git a/drivers/video/pxa3xx-gcu.c b/drivers/video/pxa3xx-gcu.c
index f163474..d658902 100644
--- a/drivers/video/pxa3xx-gcu.c
+++ b/drivers/video/pxa3xx-gcu.c
@@ -714,7 +714,7 @@ err_free_priv:
return ret;
}
-static int __devexit
+static int
pxa3xx_gcu_remove(struct platform_device *dev)
{
struct pxa3xx_gcu_priv *priv = platform_get_drvdata(dev);
diff --git a/drivers/video/pxafb.c b/drivers/video/pxafb.c
index 9289bcf..082a602 100644
--- a/drivers/video/pxafb.c
+++ b/drivers/video/pxafb.c
@@ -959,7 +959,7 @@ static void pxafb_overlay_init(struct pxafb_info *fbi)
pr_info("PXA Overlay driver loaded successfully!\n");
}
-static void __devexit pxafb_overlay_exit(struct pxafb_info *fbi)
+static void pxafb_overlay_exit(struct pxafb_info *fbi)
{
int i;
@@ -2263,7 +2263,7 @@ failed:
return ret;
}
-static int __devexit pxafb_remove(struct platform_device *dev)
+static int pxafb_remove(struct platform_device *dev)
{
struct pxafb_info *fbi = platform_get_drvdata(dev);
struct resource *r;
diff --git a/drivers/video/riva/fbdev.c b/drivers/video/riva/fbdev.c
index 0cdf63b..b453625 100644
--- a/drivers/video/riva/fbdev.c
+++ b/drivers/video/riva/fbdev.c
@@ -2105,7 +2105,7 @@ err_ret:
return ret;
}
-static void __devexit rivafb_remove(struct pci_dev *pd)
+static void rivafb_remove(struct pci_dev *pd)
{
struct fb_info *info = pci_get_drvdata(pd);
struct riva_par *par = info->par;
diff --git a/drivers/video/s3c-fb.c b/drivers/video/s3c-fb.c
index 141fefd..def429c 100644
--- a/drivers/video/s3c-fb.c
+++ b/drivers/video/s3c-fb.c
@@ -1519,7 +1519,7 @@ err_bus_clk:
* Shutdown and then release all the resources that the driver allocated
* on initialisation.
*/
-static int __devexit s3c_fb_remove(struct platform_device *pdev)
+static int s3c_fb_remove(struct platform_device *pdev)
{
struct s3c_fb *sfb = platform_get_drvdata(pdev);
int win;
diff --git a/drivers/video/s3c2410fb.c b/drivers/video/s3c2410fb.c
index 528cec6..3ffbdd1 100644
--- a/drivers/video/s3c2410fb.c
+++ b/drivers/video/s3c2410fb.c
@@ -1024,7 +1024,7 @@ static int s3c2412fb_probe(struct platform_device *pdev)
/*
* Cleanup
*/
-static int __devexit s3c2410fb_remove(struct platform_device *pdev)
+static int s3c2410fb_remove(struct platform_device *pdev)
{
struct fb_info *fbinfo = platform_get_drvdata(pdev);
struct s3c2410fb_info *info = fbinfo->par;
diff --git a/drivers/video/s3fb.c b/drivers/video/s3fb.c
index 0ff9a77..47ca86c 100644
--- a/drivers/video/s3fb.c
+++ b/drivers/video/s3fb.c
@@ -1403,7 +1403,7 @@ err_enable_device:
/* PCI remove */
-static void __devexit s3_pci_remove(struct pci_dev *dev)
+static void s3_pci_remove(struct pci_dev *dev)
{
struct fb_info *info = pci_get_drvdata(dev);
struct s3fb_info __maybe_unused *par = info->par;
diff --git a/drivers/video/savage/savagefb_driver.c b/drivers/video/savage/savagefb_driver.c
index 4bfb8c6..8f3b531 100644
--- a/drivers/video/savage/savagefb_driver.c
+++ b/drivers/video/savage/savagefb_driver.c
@@ -2340,7 +2340,7 @@ static int savagefb_probe(struct pci_dev* dev,
return err;
}
-static void __devexit savagefb_remove(struct pci_dev *dev)
+static void savagefb_remove(struct pci_dev *dev)
{
struct fb_info *info = pci_get_drvdata(dev);
diff --git a/drivers/video/sgivwfb.c b/drivers/video/sgivwfb.c
index 23df880..2331fad 100644
--- a/drivers/video/sgivwfb.c
+++ b/drivers/video/sgivwfb.c
@@ -825,7 +825,7 @@ fail_ioremap_regs:
return -ENXIO;
}
-static int __devexit sgivwfb_remove(struct platform_device *dev)
+static int sgivwfb_remove(struct platform_device *dev)
{
struct fb_info *info = platform_get_drvdata(dev);
diff --git a/drivers/video/sh7760fb.c b/drivers/video/sh7760fb.c
index 0ad44d1..5fbb0c7 100644
--- a/drivers/video/sh7760fb.c
+++ b/drivers/video/sh7760fb.c
@@ -557,7 +557,7 @@ out_fb:
return ret;
}
-static int __devexit sh7760fb_remove(struct platform_device *dev)
+static int sh7760fb_remove(struct platform_device *dev)
{
struct fb_info *info = platform_get_drvdata(dev);
struct sh7760fb_par *par = info->par;
diff --git a/drivers/video/sh_mipi_dsi.c b/drivers/video/sh_mipi_dsi.c
index ad47e48..80895c8 100644
--- a/drivers/video/sh_mipi_dsi.c
+++ b/drivers/video/sh_mipi_dsi.c
@@ -550,7 +550,7 @@ efindslot:
return ret;
}
-static int __devexit sh_mipi_remove(struct platform_device *pdev)
+static int sh_mipi_remove(struct platform_device *pdev)
{
struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
struct resource *res2 = platform_get_resource(pdev, IORESOURCE_MEM, 1);
diff --git a/drivers/video/sis/sis_main.c b/drivers/video/sis/sis_main.c
index e60df84..832a8cf 100644
--- a/drivers/video/sis/sis_main.c
+++ b/drivers/video/sis/sis_main.c
@@ -6528,7 +6528,7 @@ error_3: vfree(ivideo->bios_abase);
/* PCI DEVICE HANDLING */
/*****************************************************/
-static void __devexit sisfb_remove(struct pci_dev *pdev)
+static void sisfb_remove(struct pci_dev *pdev)
{
struct sis_video_info *ivideo = pci_get_drvdata(pdev);
struct fb_info *sis_fb_info = ivideo->memyselfandi;
diff --git a/drivers/video/skeletonfb.c b/drivers/video/skeletonfb.c
index dde47f7..8dcc181 100644
--- a/drivers/video/skeletonfb.c
+++ b/drivers/video/skeletonfb.c
@@ -835,8 +835,8 @@ static int xxxfb_probe(struct pci_dev *dev,
/*
* Cleanup
*/
-/* static void __devexit xxxfb_remove(struct platform_device *pdev) */
-static void __devexit xxxfb_remove(struct pci_dev *dev)
+/* static void xxxfb_remove(struct platform_device *pdev) */
+static void xxxfb_remove(struct pci_dev *dev)
{
struct fb_info *info = pci_get_drvdata(dev);
/* or platform_get_drvdata(pdev); */
diff --git a/drivers/video/sstfb.c b/drivers/video/sstfb.c
index 49f9338..8f7c076 100644
--- a/drivers/video/sstfb.c
+++ b/drivers/video/sstfb.c
@@ -1239,7 +1239,7 @@ static int sst_init(struct fb_info *info, struct sstfb_par *par)
return 1;
}
-static void __devexit sst_shutdown(struct fb_info *info)
+static void sst_shutdown(struct fb_info *info)
{
struct sstfb_par *par = info->par;
struct pci_dev *dev = par->dev;
@@ -1458,7 +1458,7 @@ fail_mmio_mem:
return -ENXIO; /* no voodoo detected */
}
-static void __devexit sstfb_remove(struct pci_dev *pdev)
+static void sstfb_remove(struct pci_dev *pdev)
{
struct sstfb_par *par;
struct fb_info *info;
@@ -1505,7 +1505,7 @@ static int sstfb_init(void)
return pci_register_driver(&sstfb_driver);
}
-static void __devexit sstfb_exit(void)
+static void sstfb_exit(void)
{
pci_unregister_driver(&sstfb_driver);
}
diff --git a/drivers/video/sunxvr1000.c b/drivers/video/sunxvr1000.c
index 9e86e3c..cc6f48b 100644
--- a/drivers/video/sunxvr1000.c
+++ b/drivers/video/sunxvr1000.c
@@ -173,7 +173,7 @@ err_out:
return err;
}
-static int __devexit gfb_remove(struct platform_device *op)
+static int gfb_remove(struct platform_device *op)
{
struct fb_info *info = dev_get_drvdata(&op->dev);
struct gfb_info *gp = info->par;
diff --git a/drivers/video/sunxvr2500.c b/drivers/video/sunxvr2500.c
index b6a14d2..b6c2057 100644
--- a/drivers/video/sunxvr2500.c
+++ b/drivers/video/sunxvr2500.c
@@ -219,7 +219,7 @@ err_out:
return err;
}
-static void __devexit s3d_pci_unregister(struct pci_dev *pdev)
+static void s3d_pci_unregister(struct pci_dev *pdev)
{
struct fb_info *info = pci_get_drvdata(pdev);
struct s3d_info *sp = info->par;
diff --git a/drivers/video/sunxvr500.c b/drivers/video/sunxvr500.c
index afcdab1..92202aa 100644
--- a/drivers/video/sunxvr500.c
+++ b/drivers/video/sunxvr500.c
@@ -392,7 +392,7 @@ err_out:
return err;
}
-static void __devexit e3d_pci_unregister(struct pci_dev *pdev)
+static void e3d_pci_unregister(struct pci_dev *pdev)
{
struct fb_info *info = pci_get_drvdata(pdev);
struct e3d_info *ep = info->par;
diff --git a/drivers/video/tcx.c b/drivers/video/tcx.c
index cfdc1bb..c000852 100644
--- a/drivers/video/tcx.c
+++ b/drivers/video/tcx.c
@@ -486,7 +486,7 @@ out_err:
return err;
}
-static int __devexit tcx_remove(struct platform_device *op)
+static int tcx_remove(struct platform_device *op)
{
struct fb_info *info = dev_get_drvdata(&op->dev);
struct tcx_par *par = info->par;
diff --git a/drivers/video/tdfxfb.c b/drivers/video/tdfxfb.c
index 09ec76319..cb8373b 100644
--- a/drivers/video/tdfxfb.c
+++ b/drivers/video/tdfxfb.c
@@ -137,7 +137,7 @@ static struct fb_var_screeninfo tdfx_var = {
*/
static int tdfxfb_probe(struct pci_dev *pdev,
const struct pci_device_id *id);
-static void __devexit tdfxfb_remove(struct pci_dev *pdev);
+static void tdfxfb_remove(struct pci_dev *pdev);
static struct pci_device_id tdfxfb_id_table[] = {
{ PCI_VENDOR_ID_3DFX, PCI_DEVICE_ID_3DFX_BANSHEE,
@@ -1626,7 +1626,7 @@ static void __init tdfxfb_setup(char *options)
* lifetime for the PCI device @pdev.
*
*/
-static void __devexit tdfxfb_remove(struct pci_dev *pdev)
+static void tdfxfb_remove(struct pci_dev *pdev)
{
struct fb_info *info = pci_get_drvdata(pdev);
struct tdfx_par *par = info->par;
diff --git a/drivers/video/tgafb.c b/drivers/video/tgafb.c
index 63fc5ba..945e09f 100644
--- a/drivers/video/tgafb.c
+++ b/drivers/video/tgafb.c
@@ -62,7 +62,7 @@ static void tgafb_copyarea(struct fb_info *, const struct fb_copyarea *);
static int tgafb_pan_display(struct fb_var_screeninfo *var, struct fb_info *info);
static int tgafb_register(struct device *dev);
-static void __devexit tgafb_unregister(struct device *dev);
+static void tgafb_unregister(struct device *dev);
static const char *mode_option;
static const char *mode_option_pci = "640x480@60";
@@ -95,7 +95,7 @@ static struct fb_ops tgafb_ops = {
*/
static int tgafb_pci_register(struct pci_dev *,
const struct pci_device_id *);
-static void __devexit tgafb_pci_unregister(struct pci_dev *);
+static void tgafb_pci_unregister(struct pci_dev *);
static struct pci_device_id const tgafb_pci_table[] = {
{ PCI_DEVICE(PCI_VENDOR_ID_DEC, PCI_DEVICE_ID_DEC_TGA) },
@@ -116,7 +116,7 @@ tgafb_pci_register(struct pci_dev *pdev, const struct pci_device_id *ent)
return tgafb_register(&pdev->dev);
}
-static void __devexit
+static void
tgafb_pci_unregister(struct pci_dev *pdev)
{
tgafb_unregister(&pdev->dev);
@@ -128,7 +128,7 @@ tgafb_pci_unregister(struct pci_dev *pdev)
* TC registration operations
*/
static int tgafb_tc_register(struct device *);
-static int __devexit tgafb_tc_unregister(struct device *);
+static int tgafb_tc_unregister(struct device *);
static struct tc_device_id const tgafb_tc_table[] = {
{ "DEC ", "PMAGD-AA" },
@@ -156,7 +156,7 @@ tgafb_tc_register(struct device *dev)
return status;
}
-static int __devexit
+static int
tgafb_tc_unregister(struct device *dev)
{
put_device(dev);
@@ -1692,7 +1692,7 @@ tgafb_register(struct device *dev)
return ret;
}
-static void __devexit
+static void
tgafb_unregister(struct device *dev)
{
resource_size_t bar0_start = 0, bar0_len = 0;
@@ -1721,7 +1721,7 @@ tgafb_unregister(struct device *dev)
framebuffer_release(info);
}
-static void __devexit
+static void
tgafb_exit(void)
{
tc_unregister_driver(&tgafb_tc_driver);
diff --git a/drivers/video/tmiofb.c b/drivers/video/tmiofb.c
index 91246ab..dc4fb86 100644
--- a/drivers/video/tmiofb.c
+++ b/drivers/video/tmiofb.c
@@ -807,7 +807,7 @@ err_ioremap_ccr:
return retval;
}
-static int __devexit tmiofb_remove(struct platform_device *dev)
+static int tmiofb_remove(struct platform_device *dev)
{
const struct mfd_cell *cell = mfd_get_cell(dev);
struct fb_info *info = platform_get_drvdata(dev);
diff --git a/drivers/video/tridentfb.c b/drivers/video/tridentfb.c
index 03edce6..fe72d6f 100644
--- a/drivers/video/tridentfb.c
+++ b/drivers/video/tridentfb.c
@@ -1543,7 +1543,7 @@ out_unmap1:
return err;
}
-static void __devexit trident_pci_remove(struct pci_dev *dev)
+static void trident_pci_remove(struct pci_dev *dev)
{
struct fb_info *info = pci_get_drvdata(dev);
struct tridentfb_par *par = info->par;
diff --git a/drivers/video/uvesafb.c b/drivers/video/uvesafb.c
index ad5e72d..f9ca933 100644
--- a/drivers/video/uvesafb.c
+++ b/drivers/video/uvesafb.c
@@ -1994,7 +1994,7 @@ static int uvesafb_init(void)
module_init(uvesafb_init);
-static void __devexit uvesafb_exit(void)
+static void uvesafb_exit(void)
{
struct uvesafb_ktask *task;
diff --git a/drivers/video/vermilion/vermilion.c b/drivers/video/vermilion/vermilion.c
index 3e92d0e..48c748a 100644
--- a/drivers/video/vermilion/vermilion.c
+++ b/drivers/video/vermilion/vermilion.c
@@ -393,7 +393,7 @@ static void vmlfb_release_devices(struct vml_par *par)
* Free up allocated resources for a device.
*/
-static void __devexit vml_pci_remove(struct pci_dev *dev)
+static void vml_pci_remove(struct pci_dev *dev)
{
struct fb_info *info;
struct vml_info *vinfo;
diff --git a/drivers/video/vga16fb.c b/drivers/video/vga16fb.c
index 99c0edb..545faec 100644
--- a/drivers/video/vga16fb.c
+++ b/drivers/video/vga16fb.c
@@ -1395,7 +1395,7 @@ static int vga16fb_probe(struct platform_device *dev)
return ret;
}
-static int __devexit vga16fb_remove(struct platform_device *dev)
+static int vga16fb_remove(struct platform_device *dev)
{
struct fb_info *info = platform_get_drvdata(dev);
diff --git a/drivers/video/via/via-core.c b/drivers/video/via/via-core.c
index e0d95d5..6ada670 100644
--- a/drivers/video/via/via-core.c
+++ b/drivers/video/via/via-core.c
@@ -716,7 +716,7 @@ out_disable:
return ret;
}
-static void __devexit via_pci_remove(struct pci_dev *pdev)
+static void via_pci_remove(struct pci_dev *pdev)
{
via_teardown_subdevs();
via_fb_pci_remove(pdev);
diff --git a/drivers/video/via/viafbdev.c b/drivers/video/via/viafbdev.c
index bb41017..325c43c 100644
--- a/drivers/video/via/viafbdev.c
+++ b/drivers/video/via/viafbdev.c
@@ -1945,7 +1945,7 @@ out_fb_release:
return rc;
}
-void __devexit via_fb_pci_remove(struct pci_dev *pdev)
+void via_fb_pci_remove(struct pci_dev *pdev)
{
DEBUG_MSG(KERN_INFO "via_pci_remove!\n");
fb_dealloc_cmap(&viafbinfo->cmap);
diff --git a/drivers/video/vt8500lcdfb.c b/drivers/video/vt8500lcdfb.c
index 1b94610..aa2579c 100644
--- a/drivers/video/vt8500lcdfb.c
+++ b/drivers/video/vt8500lcdfb.c
@@ -469,7 +469,7 @@ failed:
return ret;
}
-static int __devexit vt8500lcd_remove(struct platform_device *pdev)
+static int vt8500lcd_remove(struct platform_device *pdev)
{
struct vt8500lcd_info *fbi = platform_get_drvdata(pdev);
struct resource *res;
diff --git a/drivers/video/vt8623fb.c b/drivers/video/vt8623fb.c
index a3cbe8f..e9557fa 100644
--- a/drivers/video/vt8623fb.c
+++ b/drivers/video/vt8623fb.c
@@ -807,7 +807,7 @@ err_enable_device:
/* PCI remove */
-static void __devexit vt8623_pci_remove(struct pci_dev *dev)
+static void vt8623_pci_remove(struct pci_dev *dev)
{
struct fb_info *info = pci_get_drvdata(dev);
diff --git a/drivers/video/w100fb.c b/drivers/video/w100fb.c
index 1c2eaf2..7a299e95 100644
--- a/drivers/video/w100fb.c
+++ b/drivers/video/w100fb.c
@@ -783,7 +783,7 @@ out:
}
-static int __devexit w100fb_remove(struct platform_device *pdev)
+static int w100fb_remove(struct platform_device *pdev)
{
struct fb_info *info = platform_get_drvdata(pdev);
struct w100fb_par *par=info->par;
diff --git a/drivers/video/wm8505fb.c b/drivers/video/wm8505fb.c
index 456694a..4dd0580 100644
--- a/drivers/video/wm8505fb.c
+++ b/drivers/video/wm8505fb.c
@@ -431,7 +431,7 @@ failed:
return ret;
}
-static int __devexit wm8505fb_remove(struct platform_device *pdev)
+static int wm8505fb_remove(struct platform_device *pdev)
{
struct wm8505fb_info *fbi = platform_get_drvdata(pdev);
struct resource *res;
diff --git a/drivers/video/wmt_ge_rops.c b/drivers/video/wmt_ge_rops.c
index e65361d..4aaeb18 100644
--- a/drivers/video/wmt_ge_rops.c
+++ b/drivers/video/wmt_ge_rops.c
@@ -152,7 +152,7 @@ static int wmt_ge_rops_probe(struct platform_device *pdev)
return 0;
}
-static int __devexit wmt_ge_rops_remove(struct platform_device *pdev)
+static int wmt_ge_rops_remove(struct platform_device *pdev)
{
iounmap(regbase);
return 0;
diff --git a/drivers/video/xilinxfb.c b/drivers/video/xilinxfb.c
index eab07ba..af0b4fd 100644
--- a/drivers/video/xilinxfb.c
+++ b/drivers/video/xilinxfb.c
@@ -485,7 +485,7 @@ static int xilinxfb_of_probe(struct platform_device *op)
return -ENODEV;
}
-static int __devexit xilinxfb_of_remove(struct platform_device *op)
+static int xilinxfb_of_remove(struct platform_device *op)
{
return xilinxfb_release(&op->dev);
}
--
1.8.0
^ permalink raw reply related
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox