Commit 35f36654 authored by Maxime Ripard's avatar Maxime Ripard

drm/sun4i: frontend: Add a quirk structure

The ACCESS_CTRL bit is not found on all the variants of the frontend, so
let's introduce a structure that will hold whether or not we need to set
it, and associate it with the compatible.

This will be extended for further similar quirks later on.
Reviewed-by: default avatarPaul Kocialkowski <paul.kocialkowski@bootlin.com>
Signed-off-by: default avatarMaxime Ripard <maxime.ripard@bootlin.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20190118145133.21281-19-paul.kocialkowski@bootlin.com
parent 94018601
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#include <linux/clk.h> #include <linux/clk.h>
#include <linux/component.h> #include <linux/component.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/of_device.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/pm_runtime.h> #include <linux/pm_runtime.h>
#include <linux/regmap.h> #include <linux/regmap.h>
...@@ -75,6 +76,7 @@ static void sun4i_frontend_scaler_init(struct sun4i_frontend *frontend) ...@@ -75,6 +76,7 @@ static void sun4i_frontend_scaler_init(struct sun4i_frontend *frontend)
{ {
int i; int i;
if (frontend->data->has_coef_access_ctrl)
regmap_write_bits(frontend->regs, SUN4I_FRONTEND_FRM_CTRL_REG, regmap_write_bits(frontend->regs, SUN4I_FRONTEND_FRM_CTRL_REG,
SUN4I_FRONTEND_FRM_CTRL_COEF_ACCESS_CTRL, SUN4I_FRONTEND_FRM_CTRL_COEF_ACCESS_CTRL,
SUN4I_FRONTEND_FRM_CTRL_COEF_ACCESS_CTRL); SUN4I_FRONTEND_FRM_CTRL_COEF_ACCESS_CTRL);
...@@ -553,6 +555,10 @@ static int sun4i_frontend_bind(struct device *dev, struct device *master, ...@@ -553,6 +555,10 @@ static int sun4i_frontend_bind(struct device *dev, struct device *master,
frontend->dev = dev; frontend->dev = dev;
frontend->node = dev->of_node; frontend->node = dev->of_node;
frontend->data = of_device_get_match_data(dev);
if (!frontend->data)
return -ENODEV;
res = platform_get_resource(pdev, IORESOURCE_MEM, 0); res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
regs = devm_ioremap_resource(dev, res); regs = devm_ioremap_resource(dev, res);
if (IS_ERR(regs)) if (IS_ERR(regs))
...@@ -665,8 +671,15 @@ static const struct dev_pm_ops sun4i_frontend_pm_ops = { ...@@ -665,8 +671,15 @@ static const struct dev_pm_ops sun4i_frontend_pm_ops = {
.runtime_suspend = sun4i_frontend_runtime_suspend, .runtime_suspend = sun4i_frontend_runtime_suspend,
}; };
static const struct sun4i_frontend_data sun8i_a33_frontend = {
.has_coef_access_ctrl = true,
};
const struct of_device_id sun4i_frontend_of_table[] = { const struct of_device_id sun4i_frontend_of_table[] = {
{ .compatible = "allwinner,sun8i-a33-display-frontend" }, {
.compatible = "allwinner,sun8i-a33-display-frontend",
.data = &sun8i_a33_frontend
},
{ } { }
}; };
EXPORT_SYMBOL(sun4i_frontend_of_table); EXPORT_SYMBOL(sun4i_frontend_of_table);
......
...@@ -112,6 +112,10 @@ struct drm_plane; ...@@ -112,6 +112,10 @@ struct drm_plane;
struct regmap; struct regmap;
struct reset_control; struct reset_control;
struct sun4i_frontend_data {
bool has_coef_access_ctrl;
};
struct sun4i_frontend { struct sun4i_frontend {
struct list_head list; struct list_head list;
struct device *dev; struct device *dev;
...@@ -122,6 +126,8 @@ struct sun4i_frontend { ...@@ -122,6 +126,8 @@ struct sun4i_frontend {
struct clk *ram_clk; struct clk *ram_clk;
struct regmap *regs; struct regmap *regs;
struct reset_control *reset; struct reset_control *reset;
const struct sun4i_frontend_data *data;
}; };
extern const struct of_device_id sun4i_frontend_of_table[]; extern const struct of_device_id sun4i_frontend_of_table[];
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment