Commit a08aad54 authored by Dave Airlie's avatar Dave Airlie

Merge tag 'drm/panel/for-4.1-rc1' of git://anongit.freedesktop.org/tegra/linux into drm-next

drm/panel: Changes for v4.1-rc1

This set of changes adds support for a whole bunch of new panels, mostly
simple ones. There's now also support for panels to provide display
timings rather than fixed modes, which should allow panels to work with
a larger number of display drivers. Eventually drivers should migrate to
this new interface and the fixed modes removed from panels.

There are also a couple of sparse fixes for the PS8622 and PS8625 bridge
drivers.

* tag 'drm/panel/for-4.1-rc1' of git://anongit.freedesktop.org/tegra/linux:
  drm/panel: Add support for Ampire AM-800480R3TMQW-A1H 800x480 7" panel
  of: Add vendor prefix for Ampire Co., Ltd.
  drm/panel: Add display timing for HannStar HSD070PWW1
  drm/panel: simple: Add display timing support
  drm/panel: Add display timing support
  drm/panel: Add support for OrtusTech COM43H4M85ULC panel
  of: Add vendor prefix for Ortus Technology Co., Ltd.
  drm/panel: Add bus format for Giantplus GPG482739QS5 panel
  drm/panel: simple: Add support for AUO b101ean01 panel
  drm/panel: simple: Add support for Innolux ZJ070NA-01P
  drm/panel: simple: Add support for Innolux AT043TN24
  drm/panel: simple: Add support for Shelly SCA07010-BFN-LNN
  drm/panel: simple: Add support for Samsung LTN140AT29 panel
  drm: Remove unused DRM_MODE_OBJECT_BRIDGE
  drm/bridge: ptn3460: Fix sparse warnings
  drm/bridge: ps8622: Fix sparse warnings
  drm/bridge: Add I2C based driver for ps8622/ps8625 bridge
parents 1ddd36ed 1c550fa1
Ampire AM-800480R3TMQW-A1H 7.0" WVGA TFT LCD panel
Required properties:
- compatible: should be "ampire,am800480r3tmqwa1h"
This binding is compatible with the simple-panel binding, which is specified
in simple-panel.txt in this directory.
AU Optronics Corporation 10.1" WSVGA TFT LCD panel
Required properties:
- compatible: should be "auo,b101ean01"
This binding is compatible with the simple-panel binding, which is specified
in simple-panel.txt in this directory.
Innolux AT043TN24 4.3" WQVGA TFT LCD panel
Required properties:
- compatible: should be "innolux,at043tn24"
This binding is compatible with the simple-panel binding, which is specified
in simple-panel.txt in this directory.
Innolux Corporation 7.0" WSVGA (1024x600) TFT LCD panel
Required properties:
- compatible: should be "innolux,zj070na-01p"
This binding is compatible with the simple-panel binding, which is specified
in simple-panel.txt in this directory.
OrtusTech COM43H4M85ULC Blanview 3.7" TFT-LCD panel
Required properties:
- compatible: should be "ortustech,com43h4m85ulc"
This binding is compatible with the simple-panel binding, which is specified
in simple-panel.txt in this directory.
Samsung Electronics 14" WXGA (1366x768) TFT LCD panel
Required properties:
- compatible: should be "samsung,ltn140at29-301"
This binding is compatible with the simple-panel binding, which is specified
in simple-panel.txt in this directory.
Shelly SCA07010-BFN-LNN 7.0" WVGA TFT LCD panel
Required properties:
- compatible: should be "shelly,sca07010-bfn-lnn"
This binding is compatible with the simple-panel binding, which is specified
in simple-panel.txt in this directory.
...@@ -17,6 +17,7 @@ altr Altera Corp. ...@@ -17,6 +17,7 @@ altr Altera Corp.
amcc Applied Micro Circuits Corporation (APM, formally AMCC) amcc Applied Micro Circuits Corporation (APM, formally AMCC)
amd Advanced Micro Devices (AMD), Inc. amd Advanced Micro Devices (AMD), Inc.
amlogic Amlogic, Inc. amlogic Amlogic, Inc.
ampire Ampire Co., Ltd.
ams AMS AG ams AMS AG
amstaos AMS-Taos Inc. amstaos AMS-Taos Inc.
apm Applied Micro Circuits Corporation (APM) apm Applied Micro Circuits Corporation (APM)
...@@ -132,6 +133,7 @@ nvidia NVIDIA ...@@ -132,6 +133,7 @@ nvidia NVIDIA
nxp NXP Semiconductors nxp NXP Semiconductors
onnn ON Semiconductor Corp. onnn ON Semiconductor Corp.
opencores OpenCores.org opencores OpenCores.org
ortustech Ortus Technology Co., Ltd.
ovti OmniVision Technologies ovti OmniVision Technologies
panasonic Panasonic Corporation panasonic Panasonic Corporation
parade Parade Technologies Inc. parade Parade Technologies Inc.
......
...@@ -11,3 +11,14 @@ config DRM_PTN3460 ...@@ -11,3 +11,14 @@ config DRM_PTN3460
select DRM_PANEL select DRM_PANEL
---help--- ---help---
ptn3460 eDP-LVDS bridge chip driver. ptn3460 eDP-LVDS bridge chip driver.
config DRM_PS8622
tristate "Parade eDP/LVDS bridge"
depends on DRM
depends on OF
select DRM_PANEL
select DRM_KMS_HELPER
select BACKLIGHT_LCD_SUPPORT
select BACKLIGHT_CLASS_DEVICE
---help---
parade eDP-LVDS bridge chip driver.
ccflags-y := -Iinclude/drm ccflags-y := -Iinclude/drm
obj-$(CONFIG_DRM_PS8622) += ps8622.o
obj-$(CONFIG_DRM_PTN3460) += ptn3460.o obj-$(CONFIG_DRM_PTN3460) += ptn3460.o
obj-$(CONFIG_DRM_DW_HDMI) += dw_hdmi.o obj-$(CONFIG_DRM_DW_HDMI) += dw_hdmi.o
This diff is collapsed.
...@@ -265,7 +265,7 @@ static struct drm_connector_funcs ptn3460_connector_funcs = { ...@@ -265,7 +265,7 @@ static struct drm_connector_funcs ptn3460_connector_funcs = {
.destroy = ptn3460_connector_destroy, .destroy = ptn3460_connector_destroy,
}; };
int ptn3460_bridge_attach(struct drm_bridge *bridge) static int ptn3460_bridge_attach(struct drm_bridge *bridge)
{ {
struct ptn3460_bridge *ptn_bridge = bridge_to_ptn3460(bridge); struct ptn3460_bridge *ptn_bridge = bridge_to_ptn3460(bridge);
int ret; int ret;
......
...@@ -11,6 +11,7 @@ config DRM_PANEL_SIMPLE ...@@ -11,6 +11,7 @@ config DRM_PANEL_SIMPLE
tristate "support for simple panels" tristate "support for simple panels"
depends on OF depends on OF
depends on BACKLIGHT_CLASS_DEVICE depends on BACKLIGHT_CLASS_DEVICE
select VIDEOMODE_HELPERS
help help
DRM panel driver for dumb panels that need at most a regulator and DRM panel driver for dumb panels that need at most a regulator and
a GPIO to be powered up. Optionally a backlight can be attached so a GPIO to be powered up. Optionally a backlight can be attached so
......
...@@ -33,9 +33,14 @@ ...@@ -33,9 +33,14 @@
#include <drm/drm_mipi_dsi.h> #include <drm/drm_mipi_dsi.h>
#include <drm/drm_panel.h> #include <drm/drm_panel.h>
#include <video/display_timing.h>
#include <video/videomode.h>
struct panel_desc { struct panel_desc {
const struct drm_display_mode *modes; const struct drm_display_mode *modes;
unsigned int num_modes; unsigned int num_modes;
const struct display_timing *timings;
unsigned int num_timings;
unsigned int bpc; unsigned int bpc;
...@@ -94,6 +99,25 @@ static int panel_simple_get_fixed_modes(struct panel_simple *panel) ...@@ -94,6 +99,25 @@ static int panel_simple_get_fixed_modes(struct panel_simple *panel)
if (!panel->desc) if (!panel->desc)
return 0; return 0;
for (i = 0; i < panel->desc->num_timings; i++) {
const struct display_timing *dt = &panel->desc->timings[i];
struct videomode vm;
videomode_from_timing(dt, &vm);
mode = drm_mode_create(drm);
if (!mode) {
dev_err(drm->dev, "failed to add mode %ux%u\n",
dt->hactive.typ, dt->vactive.typ);
continue;
}
drm_display_mode_from_videomode(&vm, mode);
drm_mode_set_name(mode);
drm_mode_probed_add(connector, mode);
num++;
}
for (i = 0; i < panel->desc->num_modes; i++) { for (i = 0; i < panel->desc->num_modes; i++) {
const struct drm_display_mode *m = &panel->desc->modes[i]; const struct drm_display_mode *m = &panel->desc->modes[i];
...@@ -226,12 +250,30 @@ static int panel_simple_get_modes(struct drm_panel *panel) ...@@ -226,12 +250,30 @@ static int panel_simple_get_modes(struct drm_panel *panel)
return num; return num;
} }
static int panel_simple_get_timings(struct drm_panel *panel,
unsigned int num_timings,
struct display_timing *timings)
{
struct panel_simple *p = to_panel_simple(panel);
unsigned int i;
if (p->desc->num_timings < num_timings)
num_timings = p->desc->num_timings;
if (timings)
for (i = 0; i < num_timings; i++)
timings[i] = p->desc->timings[i];
return p->desc->num_timings;
}
static const struct drm_panel_funcs panel_simple_funcs = { static const struct drm_panel_funcs panel_simple_funcs = {
.disable = panel_simple_disable, .disable = panel_simple_disable,
.unprepare = panel_simple_unprepare, .unprepare = panel_simple_unprepare,
.prepare = panel_simple_prepare, .prepare = panel_simple_prepare,
.enable = panel_simple_enable, .enable = panel_simple_enable,
.get_modes = panel_simple_get_modes, .get_modes = panel_simple_get_modes,
.get_timings = panel_simple_get_timings,
}; };
static int panel_simple_probe(struct device *dev, const struct panel_desc *desc) static int panel_simple_probe(struct device *dev, const struct panel_desc *desc)
...@@ -327,6 +369,31 @@ static void panel_simple_shutdown(struct device *dev) ...@@ -327,6 +369,31 @@ static void panel_simple_shutdown(struct device *dev)
panel_simple_disable(&panel->base); panel_simple_disable(&panel->base);
} }
static const struct drm_display_mode ampire_am800480r3tmqwa1h_mode = {
.clock = 33333,
.hdisplay = 800,
.hsync_start = 800 + 0,
.hsync_end = 800 + 0 + 255,
.htotal = 800 + 0 + 255 + 0,
.vdisplay = 480,
.vsync_start = 480 + 2,
.vsync_end = 480 + 2 + 45,
.vtotal = 480 + 2 + 45 + 0,
.vrefresh = 60,
.flags = DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC,
};
static const struct panel_desc ampire_am800480r3tmqwa1h = {
.modes = &ampire_am800480r3tmqwa1h_mode,
.num_modes = 1,
.bpc = 6,
.size = {
.width = 152,
.height = 91,
},
.bus_format = MEDIA_BUS_FMT_RGB666_1X18,
};
static const struct drm_display_mode auo_b101aw03_mode = { static const struct drm_display_mode auo_b101aw03_mode = {
.clock = 51450, .clock = 51450,
.hdisplay = 1024, .hdisplay = 1024,
...@@ -350,6 +417,29 @@ static const struct panel_desc auo_b101aw03 = { ...@@ -350,6 +417,29 @@ static const struct panel_desc auo_b101aw03 = {
}, },
}; };
static const struct drm_display_mode auo_b101ean01_mode = {
.clock = 72500,
.hdisplay = 1280,
.hsync_start = 1280 + 119,
.hsync_end = 1280 + 119 + 32,
.htotal = 1280 + 119 + 32 + 21,
.vdisplay = 800,
.vsync_start = 800 + 4,
.vsync_end = 800 + 4 + 20,
.vtotal = 800 + 4 + 20 + 8,
.vrefresh = 60,
};
static const struct panel_desc auo_b101ean01 = {
.modes = &auo_b101ean01_mode,
.num_modes = 1,
.bpc = 6,
.size = {
.width = 217,
.height = 136,
},
};
static const struct drm_display_mode auo_b101xtn01_mode = { static const struct drm_display_mode auo_b101xtn01_mode = {
.clock = 72000, .clock = 72000,
.hdisplay = 1366, .hdisplay = 1366,
...@@ -615,24 +705,25 @@ static const struct panel_desc giantplus_gpg482739qs5 = { ...@@ -615,24 +705,25 @@ static const struct panel_desc giantplus_gpg482739qs5 = {
.width = 95, .width = 95,
.height = 54, .height = 54,
}, },
.bus_format = MEDIA_BUS_FMT_RGB888_1X24,
}; };
static const struct drm_display_mode hannstar_hsd070pww1_mode = { static const struct display_timing hannstar_hsd070pww1_timing = {
.clock = 71100, .pixelclock = { 64300000, 71100000, 82000000 },
.hdisplay = 1280, .hactive = { 1280, 1280, 1280 },
.hsync_start = 1280 + 1, .hfront_porch = { 1, 1, 10 },
.hsync_end = 1280 + 1 + 158, .hback_porch = { 1, 1, 10 },
.htotal = 1280 + 1 + 158 + 1, .hsync_len = { 52, 158, 661 },
.vdisplay = 800, .vactive = { 800, 800, 800 },
.vsync_start = 800 + 1, .vfront_porch = { 1, 1, 10 },
.vsync_end = 800 + 1 + 21, .vback_porch = { 1, 1, 10 },
.vtotal = 800 + 1 + 21 + 1, .vsync_len = { 1, 21, 203 },
.vrefresh = 60, .flags = DISPLAY_FLAGS_DE_HIGH,
}; };
static const struct panel_desc hannstar_hsd070pww1 = { static const struct panel_desc hannstar_hsd070pww1 = {
.modes = &hannstar_hsd070pww1_mode, .timings = &hannstar_hsd070pww1_timing,
.num_modes = 1, .num_timings = 1,
.bpc = 6, .bpc = 6,
.size = { .size = {
.width = 151, .width = 151,
...@@ -663,6 +754,31 @@ static const struct panel_desc hitachi_tx23d38vm0caa = { ...@@ -663,6 +754,31 @@ static const struct panel_desc hitachi_tx23d38vm0caa = {
}, },
}; };
static const struct drm_display_mode innolux_at043tn24_mode = {
.clock = 9000,
.hdisplay = 480,
.hsync_start = 480 + 2,
.hsync_end = 480 + 2 + 41,
.htotal = 480 + 2 + 41 + 2,
.vdisplay = 272,
.vsync_start = 272 + 2,
.vsync_end = 272 + 2 + 11,
.vtotal = 272 + 2 + 11 + 2,
.vrefresh = 60,
.flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC,
};
static const struct panel_desc innolux_at043tn24 = {
.modes = &innolux_at043tn24_mode,
.num_modes = 1,
.bpc = 8,
.size = {
.width = 95,
.height = 54,
},
.bus_format = MEDIA_BUS_FMT_RGB888_1X24,
};
static const struct drm_display_mode innolux_g121i1_l01_mode = { static const struct drm_display_mode innolux_g121i1_l01_mode = {
.clock = 71000, .clock = 71000,
.hdisplay = 1280, .hdisplay = 1280,
...@@ -733,6 +849,29 @@ static const struct panel_desc innolux_n156bge_l21 = { ...@@ -733,6 +849,29 @@ static const struct panel_desc innolux_n156bge_l21 = {
}, },
}; };
static const struct drm_display_mode innolux_zj070na_01p_mode = {
.clock = 51501,
.hdisplay = 1024,
.hsync_start = 1024 + 128,
.hsync_end = 1024 + 128 + 64,
.htotal = 1024 + 128 + 64 + 128,
.vdisplay = 600,
.vsync_start = 600 + 16,
.vsync_end = 600 + 16 + 4,
.vtotal = 600 + 16 + 4 + 16,
.vrefresh = 60,
};
static const struct panel_desc innolux_zj070na_01p = {
.modes = &innolux_zj070na_01p_mode,
.num_modes = 1,
.bpc = 6,
.size = {
.width = 1024,
.height = 600,
},
};
static const struct drm_display_mode lg_lp129qe_mode = { static const struct drm_display_mode lg_lp129qe_mode = {
.clock = 285250, .clock = 285250,
.hdisplay = 2560, .hdisplay = 2560,
...@@ -756,6 +895,30 @@ static const struct panel_desc lg_lp129qe = { ...@@ -756,6 +895,30 @@ static const struct panel_desc lg_lp129qe = {
}, },
}; };
static const struct drm_display_mode ortustech_com43h4m85ulc_mode = {
.clock = 25000,
.hdisplay = 480,
.hsync_start = 480 + 10,
.hsync_end = 480 + 10 + 10,
.htotal = 480 + 10 + 10 + 15,
.vdisplay = 800,
.vsync_start = 800 + 3,
.vsync_end = 800 + 3 + 3,
.vtotal = 800 + 3 + 3 + 3,
.vrefresh = 60,
};
static const struct panel_desc ortustech_com43h4m85ulc = {
.modes = &ortustech_com43h4m85ulc_mode,
.num_modes = 1,
.bpc = 8,
.size = {
.width = 56,
.height = 93,
},
.bus_format = MEDIA_BUS_FMT_RGB888_1X24,
};
static const struct drm_display_mode samsung_ltn101nt05_mode = { static const struct drm_display_mode samsung_ltn101nt05_mode = {
.clock = 54030, .clock = 54030,
.hdisplay = 1024, .hdisplay = 1024,
...@@ -779,10 +942,62 @@ static const struct panel_desc samsung_ltn101nt05 = { ...@@ -779,10 +942,62 @@ static const struct panel_desc samsung_ltn101nt05 = {
}, },
}; };
static const struct drm_display_mode samsung_ltn140at29_301_mode = {
.clock = 76300,
.hdisplay = 1366,
.hsync_start = 1366 + 64,
.hsync_end = 1366 + 64 + 48,
.htotal = 1366 + 64 + 48 + 128,
.vdisplay = 768,
.vsync_start = 768 + 2,
.vsync_end = 768 + 2 + 5,
.vtotal = 768 + 2 + 5 + 17,
.vrefresh = 60,
};
static const struct panel_desc samsung_ltn140at29_301 = {
.modes = &samsung_ltn140at29_301_mode,
.num_modes = 1,
.bpc = 6,
.size = {
.width = 320,
.height = 187,
},
};
static const struct drm_display_mode shelly_sca07010_bfn_lnn_mode = {
.clock = 33300,
.hdisplay = 800,
.hsync_start = 800 + 1,
.hsync_end = 800 + 1 + 64,
.htotal = 800 + 1 + 64 + 64,
.vdisplay = 480,
.vsync_start = 480 + 1,
.vsync_end = 480 + 1 + 23,
.vtotal = 480 + 1 + 23 + 22,
.vrefresh = 60,
};
static const struct panel_desc shelly_sca07010_bfn_lnn = {
.modes = &shelly_sca07010_bfn_lnn_mode,
.num_modes = 1,
.size = {
.width = 152,
.height = 91,
},
.bus_format = MEDIA_BUS_FMT_RGB666_1X18,
};
static const struct of_device_id platform_of_match[] = { static const struct of_device_id platform_of_match[] = {
{ {
.compatible = "ampire,am800480r3tmqwa1h",
.data = &ampire_am800480r3tmqwa1h,
}, {
.compatible = "auo,b101aw03", .compatible = "auo,b101aw03",
.data = &auo_b101aw03, .data = &auo_b101aw03,
}, {
.compatible = "auo,b101ean01",
.data = &auo_b101ean01,
}, { }, {
.compatible = "auo,b101xtn01", .compatible = "auo,b101xtn01",
.data = &auo_b101xtn01, .data = &auo_b101xtn01,
...@@ -825,6 +1040,9 @@ static const struct of_device_id platform_of_match[] = { ...@@ -825,6 +1040,9 @@ static const struct of_device_id platform_of_match[] = {
}, { }, {
.compatible = "hit,tx23d38vm0caa", .compatible = "hit,tx23d38vm0caa",
.data = &hitachi_tx23d38vm0caa .data = &hitachi_tx23d38vm0caa
}, {
.compatible = "innolux,at043tn24",
.data = &innolux_at043tn24,
}, { }, {
.compatible ="innolux,g121i1-l01", .compatible ="innolux,g121i1-l01",
.data = &innolux_g121i1_l01 .data = &innolux_g121i1_l01
...@@ -834,12 +1052,24 @@ static const struct of_device_id platform_of_match[] = { ...@@ -834,12 +1052,24 @@ static const struct of_device_id platform_of_match[] = {
}, { }, {
.compatible = "innolux,n156bge-l21", .compatible = "innolux,n156bge-l21",
.data = &innolux_n156bge_l21, .data = &innolux_n156bge_l21,
}, {
.compatible = "innolux,zj070na-01p",
.data = &innolux_zj070na_01p,
}, { }, {
.compatible = "lg,lp129qe", .compatible = "lg,lp129qe",
.data = &lg_lp129qe, .data = &lg_lp129qe,
}, {
.compatible = "ortustech,com43h4m85ulc",
.data = &ortustech_com43h4m85ulc,
}, { }, {
.compatible = "samsung,ltn101nt05", .compatible = "samsung,ltn101nt05",
.data = &samsung_ltn101nt05, .data = &samsung_ltn101nt05,
}, {
.compatible = "samsung,ltn140at29-301",
.data = &samsung_ltn140at29_301,
}, {
.compatible = "shelly,sca07010-bfn-lnn",
.data = &shelly_sca07010_bfn_lnn,
}, { }, {
/* sentinel */ /* sentinel */
} }
......
...@@ -53,7 +53,6 @@ struct fence; ...@@ -53,7 +53,6 @@ struct fence;
#define DRM_MODE_OBJECT_FB 0xfbfbfbfb #define DRM_MODE_OBJECT_FB 0xfbfbfbfb
#define DRM_MODE_OBJECT_BLOB 0xbbbbbbbb #define DRM_MODE_OBJECT_BLOB 0xbbbbbbbb
#define DRM_MODE_OBJECT_PLANE 0xeeeeeeee #define DRM_MODE_OBJECT_PLANE 0xeeeeeeee
#define DRM_MODE_OBJECT_BRIDGE 0xbdbdbdbd
#define DRM_MODE_OBJECT_ANY 0 #define DRM_MODE_OBJECT_ANY 0
struct drm_mode_object { struct drm_mode_object {
......
...@@ -29,6 +29,7 @@ ...@@ -29,6 +29,7 @@
struct drm_connector; struct drm_connector;
struct drm_device; struct drm_device;
struct drm_panel; struct drm_panel;
struct display_timing;
/** /**
* struct drm_panel_funcs - perform operations on a given panel * struct drm_panel_funcs - perform operations on a given panel
...@@ -38,6 +39,8 @@ struct drm_panel; ...@@ -38,6 +39,8 @@ struct drm_panel;
* @enable: enable panel (turn on back light, etc.) * @enable: enable panel (turn on back light, etc.)
* @get_modes: add modes to the connector that the panel is attached to and * @get_modes: add modes to the connector that the panel is attached to and
* return the number of modes added * return the number of modes added
* @get_timings: copy display timings into the provided array and return
* the number of display timings available
* *
* The .prepare() function is typically called before the display controller * The .prepare() function is typically called before the display controller
* starts to transmit video data. Panel drivers can use this to turn the panel * starts to transmit video data. Panel drivers can use this to turn the panel
...@@ -68,6 +71,8 @@ struct drm_panel_funcs { ...@@ -68,6 +71,8 @@ struct drm_panel_funcs {
int (*prepare)(struct drm_panel *panel); int (*prepare)(struct drm_panel *panel);
int (*enable)(struct drm_panel *panel); int (*enable)(struct drm_panel *panel);
int (*get_modes)(struct drm_panel *panel); int (*get_modes)(struct drm_panel *panel);
int (*get_timings)(struct drm_panel *panel, unsigned int num_timings,
struct display_timing *timings);
}; };
struct drm_panel { struct drm_panel {
......
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