diff options
Diffstat (limited to 'drivers/video/fbdev/mxc/hannstar_cabc.c')
-rw-r--r-- | drivers/video/fbdev/mxc/hannstar_cabc.c | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/drivers/video/fbdev/mxc/hannstar_cabc.c b/drivers/video/fbdev/mxc/hannstar_cabc.c new file mode 100644 index 000000000000..14528c8c6511 --- /dev/null +++ b/drivers/video/fbdev/mxc/hannstar_cabc.c @@ -0,0 +1,82 @@ +/* + * Copyright (C) 2014-2015 Freescale Semiconductor, Inc. All Rights Reserved. + * + * The code contained herein is licensed under the GNU General Public + * License. You may obtain a copy of the GNU General Public License + * Version 2 or later at the following locations: + * + * http://www.opensource.org/licenses/gpl-license.html + * http://www.gnu.org/copyleft/gpl.html + */ + +#include <linux/device.h> +#include <linux/err.h> +#include <linux/init.h> +#include <linux/module.h> +#include <linux/of.h> +#include <linux/of_gpio.h> +#include <linux/platform_device.h> + +#define DRIVER_NAME "hannstar-cabc" + +static const struct of_device_id cabc_dt_ids[] = { + { .compatible = "hannstar,cabc", }, + { /* sentinel */ } +}; +MODULE_DEVICE_TABLE(of, cabc_dt_ids); + +static int cabc_probe(struct platform_device *pdev) +{ + struct device_node *np = pdev->dev.of_node, *pp; + int cabc_gpio, ret = 0; + bool cabc_enable; + unsigned long gpio_flag; + enum of_gpio_flags flags; + + for_each_child_of_node(np, pp) { + if (!of_find_property(pp, "gpios", NULL)) { + dev_warn(&pdev->dev, "Found interface without " + "gpios\n"); + continue; + } + + cabc_gpio = of_get_gpio_flags(pp, 0, &flags); + if (!gpio_is_valid(cabc_gpio)) { + ret = cabc_gpio; + if (ret != -EPROBE_DEFER) + dev_err(&pdev->dev, + "Failed to get gpio flags, " + "error: %d\n", ret); + return ret; + } + + cabc_enable = of_property_read_bool(pp, "cabc-enable"); + + if (flags & OF_GPIO_ACTIVE_LOW) + gpio_flag = cabc_enable ? + GPIOF_OUT_INIT_LOW : GPIOF_OUT_INIT_HIGH; + else + gpio_flag = cabc_enable ? + GPIOF_OUT_INIT_HIGH : GPIOF_OUT_INIT_LOW; + + devm_gpio_request_one(&pdev->dev, cabc_gpio, + gpio_flag, "hannstar-cabc"); + } + + return ret; +} + +static struct platform_driver cabc_driver = { + .probe = cabc_probe, + .driver = { + .of_match_table = cabc_dt_ids, + .name = DRIVER_NAME, + .owner = THIS_MODULE, + }, +}; +module_platform_driver(cabc_driver); + +MODULE_AUTHOR("Freescale Semiconductor, Inc."); +MODULE_DESCRIPTION("Hannstar CABC driver"); +MODULE_LICENSE("GPL"); +MODULE_ALIAS("platform:" DRIVER_NAME); |