On Mon, Aug 22, 2016 at 3:25 PM, Noralf TrÃnnes <noralf@xxxxxxxxxxx> wrote:
The SimpleDRM driver binds to simple-framebuffer devices and provides a[...]
DRM/KMS API. It provides only a single CRTC+encoder+connector combination
plus one initial mode.
Userspace can create dumb-buffers which can be blit into the real
framebuffer similar to UDL. No access to the real framebuffer is allowed
(compared to earlier version of this driver) to avoid security issues.
Furthermore, this way we can support arbitrary modes as long as we have a
conversion-helper.
The driver was originally written by David Herrmann in 2014.
My main contribution is to make use of drm_simple_kms_helper and
rework the probe path to avoid use of the deprecated drm_platform_init()
and drm_driver.{load,unload}().
Additions have also been made for later changes to the Device Tree binding
document, like support for clocks, regulators and having the node under
/chosen. This code was lifted verbatim from simplefb.c.
Cc: dh.herrmann@xxxxxxxxx
Cc: libv@xxxxxxxxx
Signed-off-by: Noralf TrÃnnes <noralf@xxxxxxxxxxx>
+ /* Count the number of regulator supplies */The regulator API should have functions for this rather than open coding it.
+ for_each_property_of_node(np, prop) {
+ p = strstr(prop->name, SUPPLY_SUFFIX);
+ if (p && p != prop->name)
+ count++;
+ }
From Documentation/devicetree/bindings/display/simple-framebuffer.txt:
+This too.
+ if (!count)
+ return 0;
+
+ sdrm->regulators = devm_kcalloc(&pdev->dev, count,
+ sizeof(struct regulator *),
+ GFP_KERNEL);
+ if (!sdrm->regulators)
+ return -ENOMEM;
+
+ /* Get all the regulators */
+ for_each_property_of_node(np, prop) {
+ char name[32]; /* 32 is max size of property name */
+
+ p = strstr(prop->name, SUPPLY_SUFFIX);
+ if (!p || p == prop->name)
+ continue;
+[...]
+ strlcpy(name, prop->name,
+ strlen(prop->name) - strlen(SUPPLY_SUFFIX) + 1);
+ regulator = devm_regulator_get_optional(&pdev->dev, name);
+ if (IS_ENABLED(CONFIG_OF_ADDRESS) && of_chosen) {Rather than exporting of_chosen, this whole chunk can be replaced with
+ struct device_node *np;
+
+ for_each_child_of_node(of_chosen, np) {
+ if (of_device_is_compatible(np, "simple-framebuffer"))
a of_find_compatible_node call. Yes, that would match if
simple-framebuffer exists somewhere else in the DT, but it is not the
kernel's job to do DT validation.
+ of_platform_device_create(np, NULL, NULL);Rob
+ }
+ }