diff options
| -rw-r--r-- | Documentation/devicetree/bindings/gpu/nvidia,tegra20-host1x.txt | 42 | ||||
| -rw-r--r-- | drivers/gpu/drm/tegra/Makefile | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/tegra/dc.h | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/tegra/dpaux.c | 544 | ||||
| -rw-r--r-- | drivers/gpu/drm/tegra/dpaux.h | 73 | ||||
| -rw-r--r-- | drivers/gpu/drm/tegra/drm.c | 19 | ||||
| -rw-r--r-- | drivers/gpu/drm/tegra/drm.h | 20 | ||||
| -rw-r--r-- | drivers/gpu/drm/tegra/output.c | 8 | ||||
| -rw-r--r-- | drivers/gpu/drm/tegra/sor.c | 1092 | ||||
| -rw-r--r-- | drivers/gpu/drm/tegra/sor.h | 278 |
10 files changed, 2077 insertions, 2 deletions
diff --git a/Documentation/devicetree/bindings/gpu/nvidia,tegra20-host1x.txt b/Documentation/devicetree/bindings/gpu/nvidia,tegra20-host1x.txt index efaeec8961b6..efa8b8451f93 100644 --- a/Documentation/devicetree/bindings/gpu/nvidia,tegra20-host1x.txt +++ b/Documentation/devicetree/bindings/gpu/nvidia,tegra20-host1x.txt | |||
| @@ -190,6 +190,48 @@ of the following host1x client modules: | |||
| 190 | - nvidia,edid: supplies a binary EDID blob | 190 | - nvidia,edid: supplies a binary EDID blob |
| 191 | - nvidia,panel: phandle of a display panel | 191 | - nvidia,panel: phandle of a display panel |
| 192 | 192 | ||
| 193 | - sor: serial output resource | ||
| 194 | |||
| 195 | Required properties: | ||
| 196 | - compatible: "nvidia,tegra124-sor" | ||
| 197 | - reg: Physical base address and length of the controller's registers. | ||
| 198 | - interrupts: The interrupt outputs from the controller. | ||
| 199 | - clocks: Must contain an entry for each entry in clock-names. | ||
| 200 | See ../clocks/clock-bindings.txt for details. | ||
| 201 | - clock-names: Must include the following entries: | ||
| 202 | - sor: clock input for the SOR hardware | ||
| 203 | - parent: input for the pixel clock | ||
| 204 | - dp: reference clock for the SOR clock | ||
| 205 | - safe: safe reference for the SOR clock during power up | ||
| 206 | - resets: Must contain an entry for each entry in reset-names. | ||
| 207 | See ../reset/reset.txt for details. | ||
| 208 | - reset-names: Must include the following entries: | ||
| 209 | - sor | ||
| 210 | |||
| 211 | Optional properties: | ||
| 212 | - nvidia,ddc-i2c-bus: phandle of an I2C controller used for DDC EDID probing | ||
| 213 | - nvidia,hpd-gpio: specifies a GPIO used for hotplug detection | ||
| 214 | - nvidia,edid: supplies a binary EDID blob | ||
| 215 | - nvidia,panel: phandle of a display panel | ||
| 216 | |||
| 217 | Optional properties when driving an eDP output: | ||
| 218 | - nvidia,dpaux: phandle to a DispayPort AUX interface | ||
| 219 | |||
| 220 | - dpaux: DisplayPort AUX interface | ||
| 221 | - compatible: "nvidia,tegra124-dpaux" | ||
| 222 | - reg: Physical base address and length of the controller's registers. | ||
| 223 | - interrupts: The interrupt outputs from the controller. | ||
| 224 | - clocks: Must contain an entry for each entry in clock-names. | ||
| 225 | See ../clocks/clock-bindings.txt for details. | ||
| 226 | - clock-names: Must include the following entries: | ||
| 227 | - dpaux: clock input for the DPAUX hardware | ||
| 228 | - parent: reference clock | ||
| 229 | - resets: Must contain an entry for each entry in reset-names. | ||
| 230 | See ../reset/reset.txt for details. | ||
| 231 | - reset-names: Must include the following entries: | ||
| 232 | - dpaux | ||
| 233 | - vdd-supply: phandle of a supply that powers the DisplayPort link | ||
| 234 | |||
| 193 | Example: | 235 | Example: |
| 194 | 236 | ||
| 195 | / { | 237 | / { |
diff --git a/drivers/gpu/drm/tegra/Makefile b/drivers/gpu/drm/tegra/Makefile index 8d220afbd85f..d43f21bb4596 100644 --- a/drivers/gpu/drm/tegra/Makefile +++ b/drivers/gpu/drm/tegra/Makefile | |||
| @@ -11,6 +11,8 @@ tegra-drm-y := \ | |||
| 11 | hdmi.o \ | 11 | hdmi.o \ |
| 12 | mipi-phy.o \ | 12 | mipi-phy.o \ |
| 13 | dsi.o \ | 13 | dsi.o \ |
| 14 | sor.o \ | ||
| 15 | dpaux.o \ | ||
| 14 | gr2d.o \ | 16 | gr2d.o \ |
| 15 | gr3d.o | 17 | gr3d.o |
| 16 | 18 | ||
diff --git a/drivers/gpu/drm/tegra/dc.h b/drivers/gpu/drm/tegra/dc.h index 3c2c0ea1cd87..c94101494826 100644 --- a/drivers/gpu/drm/tegra/dc.h +++ b/drivers/gpu/drm/tegra/dc.h | |||
| @@ -118,6 +118,7 @@ | |||
| 118 | #define DC_DISP_DISP_WIN_OPTIONS 0x402 | 118 | #define DC_DISP_DISP_WIN_OPTIONS 0x402 |
| 119 | #define HDMI_ENABLE (1 << 30) | 119 | #define HDMI_ENABLE (1 << 30) |
| 120 | #define DSI_ENABLE (1 << 29) | 120 | #define DSI_ENABLE (1 << 29) |
| 121 | #define SOR_ENABLE (1 << 25) | ||
| 121 | 122 | ||
| 122 | #define DC_DISP_DISP_MEM_HIGH_PRIORITY 0x403 | 123 | #define DC_DISP_DISP_MEM_HIGH_PRIORITY 0x403 |
| 123 | #define CURSOR_THRESHOLD(x) (((x) & 0x03) << 24) | 124 | #define CURSOR_THRESHOLD(x) (((x) & 0x03) << 24) |
diff --git a/drivers/gpu/drm/tegra/dpaux.c b/drivers/gpu/drm/tegra/dpaux.c new file mode 100644 index 000000000000..d536ed381fbd --- /dev/null +++ b/drivers/gpu/drm/tegra/dpaux.c | |||
| @@ -0,0 +1,544 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2013 NVIDIA Corporation | ||
| 3 | * | ||
| 4 | * This program is free software; you can redistribute it and/or modify | ||
| 5 | * it under the terms of the GNU General Public License version 2 as | ||
| 6 | * published by the Free Software Foundation. | ||
| 7 | */ | ||
| 8 | |||
| 9 | #include <linux/clk.h> | ||
| 10 | #include <linux/delay.h> | ||
| 11 | #include <linux/gpio.h> | ||
| 12 | #include <linux/interrupt.h> | ||
| 13 | #include <linux/io.h> | ||
| 14 | #include <linux/of_gpio.h> | ||
| 15 | #include <linux/platform_device.h> | ||
| 16 | #include <linux/reset.h> | ||
| 17 | #include <linux/regulator/consumer.h> | ||
| 18 | |||
| 19 | #include <drm/drm_dp_helper.h> | ||
| 20 | #include <drm/drm_panel.h> | ||
| 21 | |||
| 22 | #include "dpaux.h" | ||
| 23 | #include "drm.h" | ||
| 24 | |||
| 25 | static DEFINE_MUTEX(dpaux_lock); | ||
| 26 | static LIST_HEAD(dpaux_list); | ||
| 27 | |||
| 28 | struct tegra_dpaux { | ||
| 29 | struct drm_dp_aux aux; | ||
| 30 | struct device *dev; | ||
| 31 | |||
| 32 | void __iomem *regs; | ||
| 33 | int irq; | ||
| 34 | |||
| 35 | struct tegra_output *output; | ||
| 36 | |||
| 37 | struct reset_control *rst; | ||
| 38 | struct clk *clk_parent; | ||
| 39 | struct clk *clk; | ||
| 40 | |||
| 41 | struct regulator *vdd; | ||
| 42 | |||
| 43 | struct completion complete; | ||
| 44 | struct list_head list; | ||
| 45 | }; | ||
| 46 | |||
| 47 | static inline struct tegra_dpaux *to_dpaux(struct drm_dp_aux *aux) | ||
| 48 | { | ||
| 49 | return container_of(aux, struct tegra_dpaux, aux); | ||
| 50 | } | ||
| 51 | |||
| 52 | static inline unsigned long tegra_dpaux_readl(struct tegra_dpaux *dpaux, | ||
| 53 | unsigned long offset) | ||
| 54 | { | ||
| 55 | return readl(dpaux->regs + (offset << 2)); | ||
| 56 | } | ||
| 57 | |||
| 58 | static inline void tegra_dpaux_writel(struct tegra_dpaux *dpaux, | ||
| 59 | unsigned long value, | ||
| 60 | unsigned long offset) | ||
| 61 | { | ||
| 62 | writel(value, dpaux->regs + (offset << 2)); | ||
| 63 | } | ||
| 64 | |||
| 65 | static void tegra_dpaux_write_fifo(struct tegra_dpaux *dpaux, const u8 *buffer, | ||
| 66 | size_t size) | ||
| 67 | { | ||
| 68 | unsigned long offset = DPAUX_DP_AUXDATA_WRITE(0); | ||
| 69 | size_t i, j; | ||
| 70 | |||
| 71 | for (i = 0; i < size; i += 4) { | ||
| 72 | size_t num = min_t(size_t, size - i, 4); | ||
| 73 | unsigned long value = 0; | ||
| 74 | |||
| 75 | for (j = 0; j < num; j++) | ||
| 76 | value |= buffer[i + j] << (j * 8); | ||
| 77 | |||
| 78 | tegra_dpaux_writel(dpaux, value, offset++); | ||
| 79 | } | ||
| 80 | } | ||
| 81 | |||
| 82 | static void tegra_dpaux_read_fifo(struct tegra_dpaux *dpaux, u8 *buffer, | ||
| 83 | size_t size) | ||
| 84 | { | ||
| 85 | unsigned long offset = DPAUX_DP_AUXDATA_READ(0); | ||
| 86 | size_t i, j; | ||
| 87 | |||
| 88 | for (i = 0; i < size; i += 4) { | ||
| 89 | size_t num = min_t(size_t, size - i, 4); | ||
| 90 | unsigned long value; | ||
| 91 | |||
| 92 | value = tegra_dpaux_readl(dpaux, offset++); | ||
| 93 | |||
| 94 | for (j = 0; j < num; j++) | ||
| 95 | buffer[i + j] = value >> (j * 8); | ||
| 96 | } | ||
| 97 | } | ||
| 98 | |||
| 99 | static ssize_t tegra_dpaux_transfer(struct drm_dp_aux *aux, | ||
| 100 | struct drm_dp_aux_msg *msg) | ||
