mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	drm/panel: Changes for v4.6-rc1
This contains a refactoring of parts of the DSI core to allow creating DSI devices from non-DSI control busses (i.e. I2C, SPI, ...). Other than that there's support for a couple of new panels as well as a few cleanup patches. -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iQIcBAABCAAGBQJW6Vc2AAoJEN0jrNd/PrOhh98P+wdrQqsctsSHFuaCpQ9mpgpO qj8M9R1wfeT279e7HpmI0HEWfoPJtC+G2uzIqhmLyBmM9YJIbJK5Bwh6jsYZoNwV Nx4hpBTBW5lwhJGrttDYVyvox+JO2TVcP2/8g4JHBmRd7UHddyeynhBZTAia5xoW 2sfSs3YgkWzVoTXlWPBAliNHZIoA5DOClO3W5n60ubeIB4nVWHhjwA6SX19tkI8U hUWbazJVwtt9C4UP32fxa5fgViJjT3X0HX9qEk7Wr4CJ85j4dvVrjX/vI++qFSFI YE8/zUZS9k2qe8cJWokGpHgiSOAX7+9IA8aZMGxS3tN9fFrUU11vSjVY/nrboFFP 8NRYC/wC6nd7D7ri0b/yNMPefFfwzCYDubGFAwvGKVXjbd/uwZE3jhLuL0bvICvG QVwhOG5ghbBWigie4bwD41GCRrk2pIuh/EefDSAPYmka4MC53CGWFpFXLs1aRVxL CVbaUzFkcqMpU/gDUuPZk2qDcmBat6yG0wcmX5rUIvUVUNTQKkMUSSEH2dxp7fsV YmXu9orGNgnM45Q92e7tVaBEw1sNWyDhdFaLk4QX9I+No2n4JMk14pxH7VuNXufR EqVafpOxregXDaH9Xtg/jVvW1AF+IH/t3S2uuqhRmP6tLQL0kAhnwh1zgDp1o/Pb pC8GiBIt5hzQApOxyYPI =zrRb -----END PGP SIGNATURE----- Merge tag 'drm/panel/for-4.6-rc1' of http://anongit.freedesktop.org/git/tegra/linux into drm-next drm/panel: Changes for v4.6-rc1 This contains a refactoring of parts of the DSI core to allow creating DSI devices from non-DSI control busses (i.e. I2C, SPI, ...). Other than that there's support for a couple of new panels as well as a few cleanup patches. * tag 'drm/panel/for-4.6-rc1' of http://anongit.freedesktop.org/git/tegra/linux: drm/bridge: Make (pre/post) enable/disable callbacks optional drm/panel: simple: Add URT UMSH-8596MD-xT panels support dt-bindings: Add URT UMSH-8596MD-xT panel bindings of: Add United Radiant Technology Corporation vendor prefix drm/panel: simple: Support for LG lp120up1 panel dt-bindings: Add LG lp120up1 panel bindings drm/panel: simple: Fix g121x1_l03 hsync/vsync polarity drm/dsi: Get DSI host by DT device node drm/dsi: Add routine to unregister a DSI device drm/dsi: Try to match non-DT DSI devices drm/dsi: Use mipi_dsi_device_register_full() for DSI device creation drm/dsi: Check for CONFIG_OF when defining of_mipi_dsi_device_add()
This commit is contained in:
		
						commit
						5e2368a3bb
					
				
					 8 changed files with 262 additions and 16 deletions
				
			
		| 
						 | 
				
			
			@ -0,0 +1,7 @@
 | 
			
		|||
LG 12.0" (1920x1280 pixels) TFT LCD panel
 | 
			
		||||
 | 
			
		||||
Required properties:
 | 
			
		||||
- compatible: should be "lg,lp120up1"
 | 
			
		||||
 | 
			
		||||
This binding is compatible with the simple-panel binding, which is specified
 | 
			
		||||
in simple-panel.txt in this directory.
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,16 @@
 | 
			
		|||
United Radiant Technology UMSH-8596MD-xT 7.0" WVGA TFT LCD panel
 | 
			
		||||
 | 
			
		||||
Supported are LVDS versions (-11T, -19T) and parallel ones
 | 
			
		||||
(-T, -1T, -7T, -20T).
 | 
			
		||||
 | 
			
		||||
Required properties:
 | 
			
		||||
- compatible: should be one of:
 | 
			
		||||
  "urt,umsh-8596md-t",
 | 
			
		||||
  "urt,umsh-8596md-1t",
 | 
			
		||||
  "urt,umsh-8596md-7t",
 | 
			
		||||
  "urt,umsh-8596md-11t",
 | 
			
		||||
  "urt,umsh-8596md-19t",
 | 
			
		||||
  "urt,umsh-8596md-20t".
 | 
			
		||||
 | 
			
		||||
This binding is compatible with the simple-panel binding, which is specified
 | 
			
		||||
in simple-panel.txt in this directory.
 | 
			
		||||
| 
						 | 
				
			
			@ -240,6 +240,7 @@ tplink	TP-LINK Technologies Co., Ltd.
 | 
			
		|||
tronfy	Tronfy
 | 
			
		||||
truly	Truly Semiconductors Limited
 | 
			
		||||
upisemi	uPI Semiconductor Corp.
 | 
			
		||||
urt	United Radiant Technology Corporation
 | 
			
		||||
usi	Universal Scientific Industrial Co., Ltd.
 | 
			
		||||
v3	V3 Semiconductor
 | 
			
		||||
variscite	Variscite Ltd.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -186,6 +186,7 @@ void drm_bridge_disable(struct drm_bridge *bridge)
 | 
			
		|||
 | 
			
		||||
	drm_bridge_disable(bridge->next);
 | 
			
		||||
 | 
			
		||||
	if (bridge->funcs->disable)
 | 
			
		||||
		bridge->funcs->disable(bridge);
 | 
			
		||||
}
 | 
			
		||||
EXPORT_SYMBOL(drm_bridge_disable);
 | 
			
		||||
| 
						 | 
				
			
			@ -206,6 +207,7 @@ void drm_bridge_post_disable(struct drm_bridge *bridge)
 | 
			
		|||
	if (!bridge)
 | 
			
		||||
		return;
 | 
			
		||||
 | 
			
		||||
	if (bridge->funcs->post_disable)
 | 
			
		||||
		bridge->funcs->post_disable(bridge);
 | 
			
		||||
 | 
			
		||||
	drm_bridge_post_disable(bridge->next);
 | 
			
		||||
| 
						 | 
				
			
			@ -256,6 +258,7 @@ void drm_bridge_pre_enable(struct drm_bridge *bridge)
 | 
			
		|||
 | 
			
		||||
	drm_bridge_pre_enable(bridge->next);
 | 
			
		||||
 | 
			
		||||
	if (bridge->funcs->pre_enable)
 | 
			
		||||
		bridge->funcs->pre_enable(bridge);
 | 
			
		||||
}
 | 
			
		||||
EXPORT_SYMBOL(drm_bridge_pre_enable);
 | 
			
		||||
| 
						 | 
				
			
			@ -276,6 +279,7 @@ void drm_bridge_enable(struct drm_bridge *bridge)
 | 
			
		|||
	if (!bridge)
 | 
			
		||||
		return;
 | 
			
		||||
 | 
			
		||||
	if (bridge->funcs->enable)
 | 
			
		||||
		bridge->funcs->enable(bridge);
 | 
			
		||||
 | 
			
		||||
	drm_bridge_enable(bridge->next);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -47,7 +47,17 @@
 | 
			
		|||
 | 
			
		||||
static int mipi_dsi_device_match(struct device *dev, struct device_driver *drv)
 | 
			
		||||
{
 | 
			
		||||
	return of_driver_match_device(dev, drv);
 | 
			
		||||
	struct mipi_dsi_device *dsi = to_mipi_dsi_device(dev);
 | 
			
		||||
 | 
			
		||||
	/* attempt OF style match */
 | 
			
		||||
	if (of_driver_match_device(dev, drv))
 | 
			
		||||
		return 1;
 | 
			
		||||
 | 
			
		||||
	/* compare DSI device and driver names */
 | 
			
		||||
	if (!strcmp(dsi->name, drv->name))
 | 
			
		||||
		return 1;
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static const struct dev_pm_ops mipi_dsi_device_pm_ops = {
 | 
			
		||||
| 
						 | 
				
			
			@ -129,14 +139,20 @@ static int mipi_dsi_device_add(struct mipi_dsi_device *dsi)
 | 
			
		|||
	return device_add(&dsi->dev);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if IS_ENABLED(CONFIG_OF)
 | 
			
		||||
static struct mipi_dsi_device *
 | 
			
		||||
of_mipi_dsi_device_add(struct mipi_dsi_host *host, struct device_node *node)
 | 
			
		||||
{
 | 
			
		||||
	struct mipi_dsi_device *dsi;
 | 
			
		||||
	struct device *dev = host->dev;
 | 
			
		||||
	struct mipi_dsi_device_info info = { };
 | 
			
		||||
	int ret;
 | 
			
		||||
	u32 reg;
 | 
			
		||||
 | 
			
		||||
	if (of_modalias_node(node, info.type, sizeof(info.type)) < 0) {
 | 
			
		||||
		dev_err(dev, "modalias failure on %s\n", node->full_name);
 | 
			
		||||
		return ERR_PTR(-EINVAL);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ret = of_property_read_u32(node, "reg", ®);
 | 
			
		||||
	if (ret) {
 | 
			
		||||
		dev_err(dev, "device node %s has no valid reg property: %d\n",
 | 
			
		||||
| 
						 | 
				
			
			@ -144,32 +160,111 @@ of_mipi_dsi_device_add(struct mipi_dsi_host *host, struct device_node *node)
 | 
			
		|||
		return ERR_PTR(-EINVAL);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (reg > 3) {
 | 
			
		||||
		dev_err(dev, "device node %s has invalid reg property: %u\n",
 | 
			
		||||
			node->full_name, reg);
 | 
			
		||||
	info.channel = reg;
 | 
			
		||||
	info.node = of_node_get(node);
 | 
			
		||||
 | 
			
		||||
	return mipi_dsi_device_register_full(host, &info);
 | 
			
		||||
}
 | 
			
		||||
#else
 | 
			
		||||
static struct mipi_dsi_device *
 | 
			
		||||
of_mipi_dsi_device_add(struct mipi_dsi_host *host, struct device_node *node)
 | 
			
		||||
{
 | 
			
		||||
	return ERR_PTR(-ENODEV);
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * mipi_dsi_device_register_full - create a MIPI DSI device
 | 
			
		||||
 * @host: DSI host to which this device is connected
 | 
			
		||||
 * @info: pointer to template containing DSI device information
 | 
			
		||||
 *
 | 
			
		||||
 * Create a MIPI DSI device by using the device information provided by
 | 
			
		||||
 * mipi_dsi_device_info template
 | 
			
		||||
 *
 | 
			
		||||
 * Returns:
 | 
			
		||||
 * A pointer to the newly created MIPI DSI device, or, a pointer encoded
 | 
			
		||||
 * with an error
 | 
			
		||||
 */
 | 
			
		||||
struct mipi_dsi_device *
 | 
			
		||||
mipi_dsi_device_register_full(struct mipi_dsi_host *host,
 | 
			
		||||
			      const struct mipi_dsi_device_info *info)
 | 
			
		||||
{
 | 
			
		||||
	struct mipi_dsi_device *dsi;
 | 
			
		||||
	struct device *dev = host->dev;
 | 
			
		||||
	int ret;
 | 
			
		||||
 | 
			
		||||
	if (!info) {
 | 
			
		||||
		dev_err(dev, "invalid mipi_dsi_device_info pointer\n");
 | 
			
		||||
		return ERR_PTR(-EINVAL);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (info->channel > 3) {
 | 
			
		||||
		dev_err(dev, "invalid virtual channel: %u\n", info->channel);
 | 
			
		||||
		return ERR_PTR(-EINVAL);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	dsi = mipi_dsi_device_alloc(host);
 | 
			
		||||
	if (IS_ERR(dsi)) {
 | 
			
		||||
		dev_err(dev, "failed to allocate DSI device %s: %ld\n",
 | 
			
		||||
			node->full_name, PTR_ERR(dsi));
 | 
			
		||||
		dev_err(dev, "failed to allocate DSI device %ld\n",
 | 
			
		||||
			PTR_ERR(dsi));
 | 
			
		||||
		return dsi;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	dsi->dev.of_node = of_node_get(node);
 | 
			
		||||
	dsi->channel = reg;
 | 
			
		||||
	dsi->dev.of_node = info->node;
 | 
			
		||||
	dsi->channel = info->channel;
 | 
			
		||||
	strlcpy(dsi->name, info->type, sizeof(dsi->name));
 | 
			
		||||
 | 
			
		||||
	ret = mipi_dsi_device_add(dsi);
 | 
			
		||||
	if (ret) {
 | 
			
		||||
		dev_err(dev, "failed to add DSI device %s: %d\n",
 | 
			
		||||
			node->full_name, ret);
 | 
			
		||||
		dev_err(dev, "failed to add DSI device %d\n", ret);
 | 
			
		||||
		kfree(dsi);
 | 
			
		||||
		return ERR_PTR(ret);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return dsi;
 | 
			
		||||
}
 | 
			
		||||
EXPORT_SYMBOL(mipi_dsi_device_register_full);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * mipi_dsi_device_unregister - unregister MIPI DSI device
 | 
			
		||||
 * @dsi: DSI peripheral device
 | 
			
		||||
 */
 | 
			
		||||
void mipi_dsi_device_unregister(struct mipi_dsi_device *dsi)
 | 
			
		||||
{
 | 
			
		||||
	device_unregister(&dsi->dev);
 | 
			
		||||
}
 | 
			
		||||
EXPORT_SYMBOL(mipi_dsi_device_unregister);
 | 
			
		||||
 | 
			
		||||
static DEFINE_MUTEX(host_lock);
 | 
			
		||||
static LIST_HEAD(host_list);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * of_find_mipi_dsi_host_by_node() - find the MIPI DSI host matching a
 | 
			
		||||
 *				     device tree node
 | 
			
		||||
 * @node: device tree node
 | 
			
		||||
 *
 | 
			
		||||
 * Returns:
 | 
			
		||||
 * A pointer to the MIPI DSI host corresponding to @node or NULL if no
 | 
			
		||||
 * such device exists (or has not been registered yet).
 | 
			
		||||
 */
 | 
			
		||||
struct mipi_dsi_host *of_find_mipi_dsi_host_by_node(struct device_node *node)
 | 
			
		||||
{
 | 
			
		||||
	struct mipi_dsi_host *host;
 | 
			
		||||
 | 
			
		||||
	mutex_lock(&host_lock);
 | 
			
		||||
 | 
			
		||||
	list_for_each_entry(host, &host_list, list) {
 | 
			
		||||
		if (host->dev->of_node == node) {
 | 
			
		||||
			mutex_unlock(&host_lock);
 | 
			
		||||
			return host;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	mutex_unlock(&host_lock);
 | 
			
		||||
 | 
			
		||||
	return NULL;
 | 
			
		||||
}
 | 
			
		||||
EXPORT_SYMBOL(of_find_mipi_dsi_host_by_node);
 | 
			
		||||
 | 
			
		||||
int mipi_dsi_host_register(struct mipi_dsi_host *host)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			@ -182,6 +277,10 @@ int mipi_dsi_host_register(struct mipi_dsi_host *host)
 | 
			
		|||
		of_mipi_dsi_device_add(host, node);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	mutex_lock(&host_lock);
 | 
			
		||||
	list_add_tail(&host->list, &host_list);
 | 
			
		||||
	mutex_unlock(&host_lock);
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
EXPORT_SYMBOL(mipi_dsi_host_register);
 | 
			
		||||
| 
						 | 
				
			
			@ -190,7 +289,7 @@ static int mipi_dsi_remove_device_fn(struct device *dev, void *priv)
 | 
			
		|||
{
 | 
			
		||||
	struct mipi_dsi_device *dsi = to_mipi_dsi_device(dev);
 | 
			
		||||
 | 
			
		||||
	device_unregister(&dsi->dev);
 | 
			
		||||
	mipi_dsi_device_unregister(dsi);
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -198,6 +297,10 @@ static int mipi_dsi_remove_device_fn(struct device *dev, void *priv)
 | 
			
		|||
void mipi_dsi_host_unregister(struct mipi_dsi_host *host)
 | 
			
		||||
{
 | 
			
		||||
	device_for_each_child(host->dev, NULL, mipi_dsi_remove_device_fn);
 | 
			
		||||
 | 
			
		||||
	mutex_lock(&host_lock);
 | 
			
		||||
	list_del_init(&host->list);
 | 
			
		||||
	mutex_unlock(&host_lock);
 | 
			
		||||
}
 | 
			
		||||
EXPORT_SYMBOL(mipi_dsi_host_unregister);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -847,6 +847,7 @@ static const struct drm_display_mode innolux_g121x1_l03_mode = {
 | 
			
		|||
	.vsync_end = 768 + 38 + 1,
 | 
			
		||||
	.vtotal = 768 + 38 + 1 + 0,
 | 
			
		||||
	.vrefresh = 60,
 | 
			
		||||
	.flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static const struct panel_desc innolux_g121x1_l03 = {
 | 
			
		||||
| 
						 | 
				
			
			@ -982,6 +983,29 @@ static const struct panel_desc lg_lb070wv8 = {
 | 
			
		|||
	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static const struct drm_display_mode lg_lp120up1_mode = {
 | 
			
		||||
	.clock = 162300,
 | 
			
		||||
	.hdisplay = 1920,
 | 
			
		||||
	.hsync_start = 1920 + 40,
 | 
			
		||||
	.hsync_end = 1920 + 40 + 40,
 | 
			
		||||
	.htotal = 1920 + 40 + 40+ 80,
 | 
			
		||||
	.vdisplay = 1280,
 | 
			
		||||
	.vsync_start = 1280 + 4,
 | 
			
		||||
	.vsync_end = 1280 + 4 + 4,
 | 
			
		||||
	.vtotal = 1280 + 4 + 4 + 12,
 | 
			
		||||
	.vrefresh = 60,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static const struct panel_desc lg_lp120up1 = {
 | 
			
		||||
	.modes = &lg_lp120up1_mode,
 | 
			
		||||
	.num_modes = 1,
 | 
			
		||||
	.bpc = 8,
 | 
			
		||||
	.size = {
 | 
			
		||||
		.width = 267,
 | 
			
		||||
		.height = 183,
 | 
			
		||||
	},
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static const struct drm_display_mode lg_lp129qe_mode = {
 | 
			
		||||
	.clock = 285250,
 | 
			
		||||
	.hdisplay = 2560,
 | 
			
		||||
| 
						 | 
				
			
			@ -1177,6 +1201,42 @@ static const struct panel_desc shelly_sca07010_bfn_lnn = {
 | 
			
		|||
	.bus_format = MEDIA_BUS_FMT_RGB666_1X18,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static const struct display_timing urt_umsh_8596md_timing = {
 | 
			
		||||
	.pixelclock = { 33260000, 33260000, 33260000 },
 | 
			
		||||
	.hactive = { 800, 800, 800 },
 | 
			
		||||
	.hfront_porch = { 41, 41, 41 },
 | 
			
		||||
	.hback_porch = { 216 - 128, 216 - 128, 216 - 128 },
 | 
			
		||||
	.hsync_len = { 71, 128, 128 },
 | 
			
		||||
	.vactive = { 480, 480, 480 },
 | 
			
		||||
	.vfront_porch = { 10, 10, 10 },
 | 
			
		||||
	.vback_porch = { 35 - 2, 35 - 2, 35 - 2 },
 | 
			
		||||
	.vsync_len = { 2, 2, 2 },
 | 
			
		||||
	.flags = DISPLAY_FLAGS_DE_HIGH | DISPLAY_FLAGS_PIXDATA_NEGEDGE |
 | 
			
		||||
		DISPLAY_FLAGS_HSYNC_LOW | DISPLAY_FLAGS_VSYNC_LOW,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static const struct panel_desc urt_umsh_8596md_lvds = {
 | 
			
		||||
	.timings = &urt_umsh_8596md_timing,
 | 
			
		||||
	.num_timings = 1,
 | 
			
		||||
	.bpc = 6,
 | 
			
		||||
	.size = {
 | 
			
		||||
		.width = 152,
 | 
			
		||||
		.height = 91,
 | 
			
		||||
	},
 | 
			
		||||
	.bus_format = MEDIA_BUS_FMT_RGB666_1X7X3_SPWG,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static const struct panel_desc urt_umsh_8596md_parallel = {
 | 
			
		||||
	.timings = &urt_umsh_8596md_timing,
 | 
			
		||||
	.num_timings = 1,
 | 
			
		||||
	.bpc = 6,
 | 
			
		||||
	.size = {
 | 
			
		||||
		.width = 152,
 | 
			
		||||
		.height = 91,
 | 
			
		||||
	},
 | 
			
		||||
	.bus_format = MEDIA_BUS_FMT_RGB666_1X18,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static const struct of_device_id platform_of_match[] = {
 | 
			
		||||
	{
 | 
			
		||||
		.compatible = "ampire,am800480r3tmqwa1h",
 | 
			
		||||
| 
						 | 
				
			
			@ -1256,6 +1316,9 @@ static const struct of_device_id platform_of_match[] = {
 | 
			
		|||
	}, {
 | 
			
		||||
		.compatible = "lg,lb070wv8",
 | 
			
		||||
		.data = &lg_lb070wv8,
 | 
			
		||||
	}, {
 | 
			
		||||
		.compatible = "lg,lp120up1",
 | 
			
		||||
		.data = &lg_lp120up1,
 | 
			
		||||
	}, {
 | 
			
		||||
		.compatible = "lg,lp129qe",
 | 
			
		||||
		.data = &lg_lp129qe,
 | 
			
		||||
| 
						 | 
				
			
			@ -1280,6 +1343,24 @@ static const struct of_device_id platform_of_match[] = {
 | 
			
		|||
	}, {
 | 
			
		||||
		.compatible = "shelly,sca07010-bfn-lnn",
 | 
			
		||||
		.data = &shelly_sca07010_bfn_lnn,
 | 
			
		||||
	}, {
 | 
			
		||||
		.compatible = "urt,umsh-8596md-t",
 | 
			
		||||
		.data = &urt_umsh_8596md_parallel,
 | 
			
		||||
	}, {
 | 
			
		||||
		.compatible = "urt,umsh-8596md-1t",
 | 
			
		||||
		.data = &urt_umsh_8596md_parallel,
 | 
			
		||||
	}, {
 | 
			
		||||
		.compatible = "urt,umsh-8596md-7t",
 | 
			
		||||
		.data = &urt_umsh_8596md_parallel,
 | 
			
		||||
	}, {
 | 
			
		||||
		.compatible = "urt,umsh-8596md-11t",
 | 
			
		||||
		.data = &urt_umsh_8596md_lvds,
 | 
			
		||||
	}, {
 | 
			
		||||
		.compatible = "urt,umsh-8596md-19t",
 | 
			
		||||
		.data = &urt_umsh_8596md_lvds,
 | 
			
		||||
	}, {
 | 
			
		||||
		.compatible = "urt,umsh-8596md-20t",
 | 
			
		||||
		.data = &urt_umsh_8596md_parallel,
 | 
			
		||||
	}, {
 | 
			
		||||
		/* sentinel */
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1597,6 +1597,8 @@ struct drm_bridge_funcs {
 | 
			
		|||
	 *
 | 
			
		||||
	 * The bridge can assume that the display pipe (i.e. clocks and timing
 | 
			
		||||
	 * signals) feeding it is still running when this callback is called.
 | 
			
		||||
	 *
 | 
			
		||||
	 * The disable callback is optional.
 | 
			
		||||
	 */
 | 
			
		||||
	void (*disable)(struct drm_bridge *bridge);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1613,6 +1615,8 @@ struct drm_bridge_funcs {
 | 
			
		|||
	 * The bridge must assume that the display pipe (i.e. clocks and timing
 | 
			
		||||
	 * singals) feeding it is no longer running when this callback is
 | 
			
		||||
	 * called.
 | 
			
		||||
	 *
 | 
			
		||||
	 * The post_disable callback is optional.
 | 
			
		||||
	 */
 | 
			
		||||
	void (*post_disable)(struct drm_bridge *bridge);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1641,6 +1645,8 @@ struct drm_bridge_funcs {
 | 
			
		|||
	 * will not yet be running when this callback is called. The bridge must
 | 
			
		||||
	 * not enable the display link feeding the next bridge in the chain (if
 | 
			
		||||
	 * there is one) when this callback is called.
 | 
			
		||||
	 *
 | 
			
		||||
	 * The pre_enable callback is optional.
 | 
			
		||||
	 */
 | 
			
		||||
	void (*pre_enable)(struct drm_bridge *bridge);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1658,6 +1664,8 @@ struct drm_bridge_funcs {
 | 
			
		|||
	 * signals) feeding it is running when this callback is called. This
 | 
			
		||||
	 * callback must enable the display link feeding the next bridge in the
 | 
			
		||||
	 * chain if there is one.
 | 
			
		||||
	 *
 | 
			
		||||
	 * The enable callback is optional.
 | 
			
		||||
	 */
 | 
			
		||||
	void (*enable)(struct drm_bridge *bridge);
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -96,14 +96,17 @@ struct mipi_dsi_host_ops {
 | 
			
		|||
 * struct mipi_dsi_host - DSI host device
 | 
			
		||||
 * @dev: driver model device node for this DSI host
 | 
			
		||||
 * @ops: DSI host operations
 | 
			
		||||
 * @list: list management
 | 
			
		||||
 */
 | 
			
		||||
struct mipi_dsi_host {
 | 
			
		||||
	struct device *dev;
 | 
			
		||||
	const struct mipi_dsi_host_ops *ops;
 | 
			
		||||
	struct list_head list;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
int mipi_dsi_host_register(struct mipi_dsi_host *host);
 | 
			
		||||
void mipi_dsi_host_unregister(struct mipi_dsi_host *host);
 | 
			
		||||
struct mipi_dsi_host *of_find_mipi_dsi_host_by_node(struct device_node *node);
 | 
			
		||||
 | 
			
		||||
/* DSI mode flags */
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -139,10 +142,28 @@ enum mipi_dsi_pixel_format {
 | 
			
		|||
	MIPI_DSI_FMT_RGB565,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define DSI_DEV_NAME_SIZE		20
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * struct mipi_dsi_device_info - template for creating a mipi_dsi_device
 | 
			
		||||
 * @type: DSI peripheral chip type
 | 
			
		||||
 * @channel: DSI virtual channel assigned to peripheral
 | 
			
		||||
 * @node: pointer to OF device node or NULL
 | 
			
		||||
 *
 | 
			
		||||
 * This is populated and passed to mipi_dsi_device_new to create a new
 | 
			
		||||
 * DSI device
 | 
			
		||||
 */
 | 
			
		||||
struct mipi_dsi_device_info {
 | 
			
		||||
	char type[DSI_DEV_NAME_SIZE];
 | 
			
		||||
	u32 channel;
 | 
			
		||||
	struct device_node *node;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * struct mipi_dsi_device - DSI peripheral device
 | 
			
		||||
 * @host: DSI host for this peripheral
 | 
			
		||||
 * @dev: driver model device node for this peripheral
 | 
			
		||||
 * @name: DSI peripheral chip type
 | 
			
		||||
 * @channel: virtual channel assigned to the peripheral
 | 
			
		||||
 * @format: pixel format for video mode
 | 
			
		||||
 * @lanes: number of active data lanes
 | 
			
		||||
| 
						 | 
				
			
			@ -152,6 +173,7 @@ struct mipi_dsi_device {
 | 
			
		|||
	struct mipi_dsi_host *host;
 | 
			
		||||
	struct device dev;
 | 
			
		||||
 | 
			
		||||
	char name[DSI_DEV_NAME_SIZE];
 | 
			
		||||
	unsigned int channel;
 | 
			
		||||
	unsigned int lanes;
 | 
			
		||||
	enum mipi_dsi_pixel_format format;
 | 
			
		||||
| 
						 | 
				
			
			@ -188,6 +210,10 @@ static inline int mipi_dsi_pixel_format_to_bpp(enum mipi_dsi_pixel_format fmt)
 | 
			
		|||
	return -EINVAL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct mipi_dsi_device *
 | 
			
		||||
mipi_dsi_device_register_full(struct mipi_dsi_host *host,
 | 
			
		||||
			      const struct mipi_dsi_device_info *info);
 | 
			
		||||
void mipi_dsi_device_unregister(struct mipi_dsi_device *dsi);
 | 
			
		||||
struct mipi_dsi_device *of_find_mipi_dsi_device_by_node(struct device_node *np);
 | 
			
		||||
int mipi_dsi_attach(struct mipi_dsi_device *dsi);
 | 
			
		||||
int mipi_dsi_detach(struct mipi_dsi_device *dsi);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue