soc: amlogic: canvas: add support for Meson8, Meson8b and Meson8m2
The canvas IP on Meson8, Meson8b and Meson8m2 is mostly identical to the one on GXBB and newer. The only known difference so far is that that the "endianness" bits are not supported on Meson8m2 and earlier. Add new compatible strings and a check in meson_canvas_config() to validate that the endianness bits cannot be configured on the 32-bit SoCs. Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com> Reviewed-by: Maxime Jourdan <mjourdan@baylibre.com> Signed-off-by: Kevin Hilman <khilman@baylibre.com>
This commit is contained in:
Родитель
a0b2ff5315
Коммит
9a98fdf5b6
|
@ -35,6 +35,7 @@ struct meson_canvas {
|
||||||
void __iomem *reg_base;
|
void __iomem *reg_base;
|
||||||
spinlock_t lock; /* canvas device lock */
|
spinlock_t lock; /* canvas device lock */
|
||||||
u8 used[NUM_CANVAS];
|
u8 used[NUM_CANVAS];
|
||||||
|
bool supports_endianness;
|
||||||
};
|
};
|
||||||
|
|
||||||
static void canvas_write(struct meson_canvas *canvas, u32 reg, u32 val)
|
static void canvas_write(struct meson_canvas *canvas, u32 reg, u32 val)
|
||||||
|
@ -86,6 +87,12 @@ int meson_canvas_config(struct meson_canvas *canvas, u8 canvas_index,
|
||||||
{
|
{
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
|
if (endian && !canvas->supports_endianness) {
|
||||||
|
dev_err(canvas->dev,
|
||||||
|
"Endianness is not supported on this SoC\n");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
spin_lock_irqsave(&canvas->lock, flags);
|
spin_lock_irqsave(&canvas->lock, flags);
|
||||||
if (!canvas->used[canvas_index]) {
|
if (!canvas->used[canvas_index]) {
|
||||||
dev_err(canvas->dev,
|
dev_err(canvas->dev,
|
||||||
|
@ -172,6 +179,8 @@ static int meson_canvas_probe(struct platform_device *pdev)
|
||||||
if (IS_ERR(canvas->reg_base))
|
if (IS_ERR(canvas->reg_base))
|
||||||
return PTR_ERR(canvas->reg_base);
|
return PTR_ERR(canvas->reg_base);
|
||||||
|
|
||||||
|
canvas->supports_endianness = of_device_get_match_data(dev);
|
||||||
|
|
||||||
canvas->dev = dev;
|
canvas->dev = dev;
|
||||||
spin_lock_init(&canvas->lock);
|
spin_lock_init(&canvas->lock);
|
||||||
dev_set_drvdata(dev, canvas);
|
dev_set_drvdata(dev, canvas);
|
||||||
|
@ -180,7 +189,10 @@ static int meson_canvas_probe(struct platform_device *pdev)
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct of_device_id canvas_dt_match[] = {
|
static const struct of_device_id canvas_dt_match[] = {
|
||||||
{ .compatible = "amlogic,canvas" },
|
{ .compatible = "amlogic,meson8-canvas", .data = (void *)false, },
|
||||||
|
{ .compatible = "amlogic,meson8b-canvas", .data = (void *)false, },
|
||||||
|
{ .compatible = "amlogic,meson8m2-canvas", .data = (void *)false, },
|
||||||
|
{ .compatible = "amlogic,canvas", .data = (void *)true, },
|
||||||
{}
|
{}
|
||||||
};
|
};
|
||||||
MODULE_DEVICE_TABLE(of, canvas_dt_match);
|
MODULE_DEVICE_TABLE(of, canvas_dt_match);
|
||||||
|
|
Загрузка…
Ссылка в новой задаче