| 
									
										
										
										
											2013-08-30 15:10:14 +02:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Copyright (C) 2013, NVIDIA Corporation.  All rights reserved. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Permission is hereby granted, free of charge, to any person obtaining a | 
					
						
							|  |  |  |  * copy of this software and associated documentation files (the "Software"), | 
					
						
							|  |  |  |  * to deal in the Software without restriction, including without limitation | 
					
						
							|  |  |  |  * the rights to use, copy, modify, merge, publish, distribute, sub license, | 
					
						
							|  |  |  |  * and/or sell copies of the Software, and to permit persons to whom the | 
					
						
							|  |  |  |  * Software is furnished to do so, subject to the following conditions: | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * The above copyright notice and this permission notice (including the | 
					
						
							|  |  |  |  * next paragraph) shall be included in all copies or substantial portions | 
					
						
							|  |  |  |  * of the Software. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | 
					
						
							|  |  |  |  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | 
					
						
							|  |  |  |  * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL | 
					
						
							|  |  |  |  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | 
					
						
							|  |  |  |  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | 
					
						
							|  |  |  |  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | 
					
						
							|  |  |  |  * DEALINGS IN THE SOFTWARE. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <linux/backlight.h>
 | 
					
						
							| 
									
										
										
										
											2014-03-01 14:00:58 +09:00
										 |  |  | #include <linux/gpio/consumer.h>
 | 
					
						
							| 
									
										
										
										
											2013-08-30 15:10:14 +02:00
										 |  |  | #include <linux/module.h>
 | 
					
						
							|  |  |  | #include <linux/of_platform.h>
 | 
					
						
							|  |  |  | #include <linux/platform_device.h>
 | 
					
						
							|  |  |  | #include <linux/regulator/consumer.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <drm/drmP.h>
 | 
					
						
							|  |  |  | #include <drm/drm_crtc.h>
 | 
					
						
							| 
									
										
										
										
											2013-11-22 19:27:11 +01:00
										 |  |  | #include <drm/drm_mipi_dsi.h>
 | 
					
						
							| 
									
										
										
										
											2013-08-30 15:10:14 +02:00
										 |  |  | #include <drm/drm_panel.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct panel_desc { | 
					
						
							|  |  |  | 	const struct drm_display_mode *modes; | 
					
						
							|  |  |  | 	unsigned int num_modes; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-19 18:18:28 -07:00
										 |  |  | 	unsigned int bpc; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-30 15:10:14 +02:00
										 |  |  | 	struct { | 
					
						
							|  |  |  | 		unsigned int width; | 
					
						
							|  |  |  | 		unsigned int height; | 
					
						
							|  |  |  | 	} size; | 
					
						
							| 
									
										
										
										
											2014-07-31 23:12:11 +05:30
										 |  |  | 
 | 
					
						
							|  |  |  | 	/**
 | 
					
						
							|  |  |  | 	 * @prepare: the time (in milliseconds) that it takes for the panel to | 
					
						
							|  |  |  | 	 *           become ready and start receiving video data | 
					
						
							|  |  |  | 	 * @enable: the time (in milliseconds) that it takes for the panel to | 
					
						
							|  |  |  | 	 *          display the first valid frame after starting to receive | 
					
						
							|  |  |  | 	 *          video data | 
					
						
							|  |  |  | 	 * @disable: the time (in milliseconds) that it takes for the panel to | 
					
						
							|  |  |  | 	 *           turn the display off (no content is visible) | 
					
						
							|  |  |  | 	 * @unprepare: the time (in milliseconds) that it takes for the panel | 
					
						
							|  |  |  | 	 *             to power itself down completely | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	struct { | 
					
						
							|  |  |  | 		unsigned int prepare; | 
					
						
							|  |  |  | 		unsigned int enable; | 
					
						
							|  |  |  | 		unsigned int disable; | 
					
						
							|  |  |  | 		unsigned int unprepare; | 
					
						
							|  |  |  | 	} delay; | 
					
						
							| 
									
										
										
										
											2014-07-22 13:33:59 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	u32 bus_format; | 
					
						
							| 
									
										
										
										
											2013-08-30 15:10:14 +02:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct panel_simple { | 
					
						
							|  |  |  | 	struct drm_panel base; | 
					
						
							| 
									
										
										
										
											2014-07-31 23:12:10 +05:30
										 |  |  | 	bool prepared; | 
					
						
							| 
									
										
										
										
											2013-08-30 15:10:14 +02:00
										 |  |  | 	bool enabled; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	const struct panel_desc *desc; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	struct backlight_device *backlight; | 
					
						
							|  |  |  | 	struct regulator *supply; | 
					
						
							|  |  |  | 	struct i2c_adapter *ddc; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-01 14:00:58 +09:00
										 |  |  | 	struct gpio_desc *enable_gpio; | 
					
						
							| 
									
										
										
										
											2013-08-30 15:10:14 +02:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static inline struct panel_simple *to_panel_simple(struct drm_panel *panel) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	return container_of(panel, struct panel_simple, base); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int panel_simple_get_fixed_modes(struct panel_simple *panel) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	struct drm_connector *connector = panel->base.connector; | 
					
						
							|  |  |  | 	struct drm_device *drm = panel->base.drm; | 
					
						
							|  |  |  | 	struct drm_display_mode *mode; | 
					
						
							|  |  |  | 	unsigned int i, num = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (!panel->desc) | 
					
						
							|  |  |  | 		return 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	for (i = 0; i < panel->desc->num_modes; i++) { | 
					
						
							|  |  |  | 		const struct drm_display_mode *m = &panel->desc->modes[i]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		mode = drm_mode_duplicate(drm, m); | 
					
						
							|  |  |  | 		if (!mode) { | 
					
						
							|  |  |  | 			dev_err(drm->dev, "failed to add mode %ux%u@%u\n", | 
					
						
							|  |  |  | 				m->hdisplay, m->vdisplay, m->vrefresh); | 
					
						
							|  |  |  | 			continue; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		drm_mode_set_name(mode); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		drm_mode_probed_add(connector, mode); | 
					
						
							|  |  |  | 		num++; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-19 18:18:28 -07:00
										 |  |  | 	connector->display_info.bpc = panel->desc->bpc; | 
					
						
							| 
									
										
										
										
											2013-08-30 15:10:14 +02:00
										 |  |  | 	connector->display_info.width_mm = panel->desc->size.width; | 
					
						
							|  |  |  | 	connector->display_info.height_mm = panel->desc->size.height; | 
					
						
							| 
									
										
										
										
											2014-07-22 13:33:59 +02:00
										 |  |  | 	if (panel->desc->bus_format) | 
					
						
							|  |  |  | 		drm_display_info_set_bus_formats(&connector->display_info, | 
					
						
							|  |  |  | 						 &panel->desc->bus_format, 1); | 
					
						
							| 
									
										
										
										
											2013-08-30 15:10:14 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return num; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int panel_simple_disable(struct drm_panel *panel) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	struct panel_simple *p = to_panel_simple(panel); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (!p->enabled) | 
					
						
							|  |  |  | 		return 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (p->backlight) { | 
					
						
							|  |  |  | 		p->backlight->props.power = FB_BLANK_POWERDOWN; | 
					
						
							|  |  |  | 		backlight_update_status(p->backlight); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-31 23:12:11 +05:30
										 |  |  | 	if (p->desc->delay.disable) | 
					
						
							|  |  |  | 		msleep(p->desc->delay.disable); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-30 15:10:14 +02:00
										 |  |  | 	p->enabled = false; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-31 23:12:04 +05:30
										 |  |  | static int panel_simple_unprepare(struct drm_panel *panel) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2014-07-31 23:12:10 +05:30
										 |  |  | 	struct panel_simple *p = to_panel_simple(panel); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (!p->prepared) | 
					
						
							|  |  |  | 		return 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (p->enable_gpio) | 
					
						
							|  |  |  | 		gpiod_set_value_cansleep(p->enable_gpio, 0); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	regulator_disable(p->supply); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-31 23:12:11 +05:30
										 |  |  | 	if (p->desc->delay.unprepare) | 
					
						
							|  |  |  | 		msleep(p->desc->delay.unprepare); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-31 23:12:10 +05:30
										 |  |  | 	p->prepared = false; | 
					
						
							| 
									
										
										
										
											2014-07-31 23:12:04 +05:30
										 |  |  | 
 | 
					
						
							|  |  |  | 	return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-31 23:12:10 +05:30
										 |  |  | static int panel_simple_prepare(struct drm_panel *panel) | 
					
						
							| 
									
										
										
										
											2013-08-30 15:10:14 +02:00
										 |  |  | { | 
					
						
							|  |  |  | 	struct panel_simple *p = to_panel_simple(panel); | 
					
						
							|  |  |  | 	int err; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-31 23:12:10 +05:30
										 |  |  | 	if (p->prepared) | 
					
						
							| 
									
										
										
										
											2013-08-30 15:10:14 +02:00
										 |  |  | 		return 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	err = regulator_enable(p->supply); | 
					
						
							|  |  |  | 	if (err < 0) { | 
					
						
							|  |  |  | 		dev_err(panel->dev, "failed to enable supply: %d\n", err); | 
					
						
							|  |  |  | 		return err; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-01 14:00:58 +09:00
										 |  |  | 	if (p->enable_gpio) | 
					
						
							| 
									
										
										
										
											2014-03-14 12:03:47 +01:00
										 |  |  | 		gpiod_set_value_cansleep(p->enable_gpio, 1); | 
					
						
							| 
									
										
										
										
											2013-08-30 15:10:14 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-31 23:12:11 +05:30
										 |  |  | 	if (p->desc->delay.prepare) | 
					
						
							|  |  |  | 		msleep(p->desc->delay.prepare); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-31 23:12:10 +05:30
										 |  |  | 	p->prepared = true; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int panel_simple_enable(struct drm_panel *panel) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	struct panel_simple *p = to_panel_simple(panel); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (p->enabled) | 
					
						
							|  |  |  | 		return 0; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-31 23:12:11 +05:30
										 |  |  | 	if (p->desc->delay.enable) | 
					
						
							|  |  |  | 		msleep(p->desc->delay.enable); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-30 15:10:14 +02:00
										 |  |  | 	if (p->backlight) { | 
					
						
							|  |  |  | 		p->backlight->props.power = FB_BLANK_UNBLANK; | 
					
						
							|  |  |  | 		backlight_update_status(p->backlight); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	p->enabled = true; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int panel_simple_get_modes(struct drm_panel *panel) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	struct panel_simple *p = to_panel_simple(panel); | 
					
						
							|  |  |  | 	int num = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* probe EDID if a DDC bus is available */ | 
					
						
							|  |  |  | 	if (p->ddc) { | 
					
						
							|  |  |  | 		struct edid *edid = drm_get_edid(panel->connector, p->ddc); | 
					
						
							| 
									
										
										
										
											2014-01-09 11:37:34 -07:00
										 |  |  | 		drm_mode_connector_update_edid_property(panel->connector, edid); | 
					
						
							| 
									
										
										
										
											2013-08-30 15:10:14 +02:00
										 |  |  | 		if (edid) { | 
					
						
							|  |  |  | 			num += drm_add_edid_modes(panel->connector, edid); | 
					
						
							|  |  |  | 			kfree(edid); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* add hard-coded panel modes */ | 
					
						
							|  |  |  | 	num += panel_simple_get_fixed_modes(p); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return num; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static const struct drm_panel_funcs panel_simple_funcs = { | 
					
						
							|  |  |  | 	.disable = panel_simple_disable, | 
					
						
							| 
									
										
										
										
											2014-07-31 23:12:04 +05:30
										 |  |  | 	.unprepare = panel_simple_unprepare, | 
					
						
							|  |  |  | 	.prepare = panel_simple_prepare, | 
					
						
							| 
									
										
										
										
											2013-08-30 15:10:14 +02:00
										 |  |  | 	.enable = panel_simple_enable, | 
					
						
							|  |  |  | 	.get_modes = panel_simple_get_modes, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int panel_simple_probe(struct device *dev, const struct panel_desc *desc) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	struct device_node *backlight, *ddc; | 
					
						
							|  |  |  | 	struct panel_simple *panel; | 
					
						
							|  |  |  | 	int err; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	panel = devm_kzalloc(dev, sizeof(*panel), GFP_KERNEL); | 
					
						
							|  |  |  | 	if (!panel) | 
					
						
							|  |  |  | 		return -ENOMEM; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	panel->enabled = false; | 
					
						
							| 
									
										
										
										
											2014-07-31 23:12:10 +05:30
										 |  |  | 	panel->prepared = false; | 
					
						
							| 
									
										
										
										
											2013-08-30 15:10:14 +02:00
										 |  |  | 	panel->desc = desc; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	panel->supply = devm_regulator_get(dev, "power"); | 
					
						
							|  |  |  | 	if (IS_ERR(panel->supply)) | 
					
						
							|  |  |  | 		return PTR_ERR(panel->supply); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-23 17:16:58 +09:00
										 |  |  | 	panel->enable_gpio = devm_gpiod_get_optional(dev, "enable", | 
					
						
							|  |  |  | 						     GPIOD_OUT_LOW); | 
					
						
							| 
									
										
										
										
											2014-03-01 14:00:58 +09:00
										 |  |  | 	if (IS_ERR(panel->enable_gpio)) { | 
					
						
							|  |  |  | 		err = PTR_ERR(panel->enable_gpio); | 
					
						
							| 
									
										
										
										
											2014-07-25 23:47:25 +09:00
										 |  |  | 		dev_err(dev, "failed to request GPIO: %d\n", err); | 
					
						
							|  |  |  | 		return err; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2013-08-30 15:10:14 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	backlight = of_parse_phandle(dev->of_node, "backlight", 0); | 
					
						
							|  |  |  | 	if (backlight) { | 
					
						
							|  |  |  | 		panel->backlight = of_find_backlight_by_node(backlight); | 
					
						
							|  |  |  | 		of_node_put(backlight); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-01 14:00:58 +09:00
										 |  |  | 		if (!panel->backlight) | 
					
						
							|  |  |  | 			return -EPROBE_DEFER; | 
					
						
							| 
									
										
										
										
											2013-08-30 15:10:14 +02:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	ddc = of_parse_phandle(dev->of_node, "ddc-i2c-bus", 0); | 
					
						
							|  |  |  | 	if (ddc) { | 
					
						
							|  |  |  | 		panel->ddc = of_find_i2c_adapter_by_node(ddc); | 
					
						
							|  |  |  | 		of_node_put(ddc); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if (!panel->ddc) { | 
					
						
							|  |  |  | 			err = -EPROBE_DEFER; | 
					
						
							|  |  |  | 			goto free_backlight; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	drm_panel_init(&panel->base); | 
					
						
							|  |  |  | 	panel->base.dev = dev; | 
					
						
							|  |  |  | 	panel->base.funcs = &panel_simple_funcs; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	err = drm_panel_add(&panel->base); | 
					
						
							|  |  |  | 	if (err < 0) | 
					
						
							|  |  |  | 		goto free_ddc; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	dev_set_drvdata(dev, panel); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | free_ddc: | 
					
						
							|  |  |  | 	if (panel->ddc) | 
					
						
							|  |  |  | 		put_device(&panel->ddc->dev); | 
					
						
							|  |  |  | free_backlight: | 
					
						
							|  |  |  | 	if (panel->backlight) | 
					
						
							|  |  |  | 		put_device(&panel->backlight->dev); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return err; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int panel_simple_remove(struct device *dev) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	struct panel_simple *panel = dev_get_drvdata(dev); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	drm_panel_detach(&panel->base); | 
					
						
							|  |  |  | 	drm_panel_remove(&panel->base); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	panel_simple_disable(&panel->base); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (panel->ddc) | 
					
						
							|  |  |  | 		put_device(&panel->ddc->dev); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (panel->backlight) | 
					
						
							|  |  |  | 		put_device(&panel->backlight->dev); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-29 17:21:21 +02:00
										 |  |  | static void panel_simple_shutdown(struct device *dev) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	struct panel_simple *panel = dev_get_drvdata(dev); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	panel_simple_disable(&panel->base); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-30 15:10:14 +02:00
										 |  |  | static const struct drm_display_mode auo_b101aw03_mode = { | 
					
						
							|  |  |  | 	.clock = 51450, | 
					
						
							|  |  |  | 	.hdisplay = 1024, | 
					
						
							|  |  |  | 	.hsync_start = 1024 + 156, | 
					
						
							|  |  |  | 	.hsync_end = 1024 + 156 + 8, | 
					
						
							|  |  |  | 	.htotal = 1024 + 156 + 8 + 156, | 
					
						
							|  |  |  | 	.vdisplay = 600, | 
					
						
							|  |  |  | 	.vsync_start = 600 + 16, | 
					
						
							|  |  |  | 	.vsync_end = 600 + 16 + 6, | 
					
						
							|  |  |  | 	.vtotal = 600 + 16 + 6 + 16, | 
					
						
							|  |  |  | 	.vrefresh = 60, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static const struct panel_desc auo_b101aw03 = { | 
					
						
							|  |  |  | 	.modes = &auo_b101aw03_mode, | 
					
						
							|  |  |  | 	.num_modes = 1, | 
					
						
							| 
									
										
										
										
											2014-06-19 18:18:28 -07:00
										 |  |  | 	.bpc = 6, | 
					
						
							| 
									
										
										
										
											2013-08-30 15:10:14 +02:00
										 |  |  | 	.size = { | 
					
						
							|  |  |  | 		.width = 223, | 
					
						
							|  |  |  | 		.height = 125, | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-08-01 17:01:06 -04:00
										 |  |  | static const struct drm_display_mode auo_b101xtn01_mode = { | 
					
						
							|  |  |  | 	.clock = 72000, | 
					
						
							|  |  |  | 	.hdisplay = 1366, | 
					
						
							|  |  |  | 	.hsync_start = 1366 + 20, | 
					
						
							|  |  |  | 	.hsync_end = 1366 + 20 + 70, | 
					
						
							|  |  |  | 	.htotal = 1366 + 20 + 70, | 
					
						
							|  |  |  | 	.vdisplay = 768, | 
					
						
							|  |  |  | 	.vsync_start = 768 + 14, | 
					
						
							|  |  |  | 	.vsync_end = 768 + 14 + 42, | 
					
						
							|  |  |  | 	.vtotal = 768 + 14 + 42, | 
					
						
							|  |  |  | 	.vrefresh = 60, | 
					
						
							|  |  |  | 	.flags = DRM_MODE_FLAG_NVSYNC | DRM_MODE_FLAG_NHSYNC, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static const struct panel_desc auo_b101xtn01 = { | 
					
						
							|  |  |  | 	.modes = &auo_b101xtn01_mode, | 
					
						
							|  |  |  | 	.num_modes = 1, | 
					
						
							|  |  |  | 	.bpc = 6, | 
					
						
							|  |  |  | 	.size = { | 
					
						
							|  |  |  | 		.width = 223, | 
					
						
							|  |  |  | 		.height = 125, | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-01 15:40:02 +05:30
										 |  |  | static const struct drm_display_mode auo_b116xw03_mode = { | 
					
						
							|  |  |  | 	.clock = 70589, | 
					
						
							|  |  |  | 	.hdisplay = 1366, | 
					
						
							|  |  |  | 	.hsync_start = 1366 + 40, | 
					
						
							|  |  |  | 	.hsync_end = 1366 + 40 + 40, | 
					
						
							|  |  |  | 	.htotal = 1366 + 40 + 40 + 32, | 
					
						
							|  |  |  | 	.vdisplay = 768, | 
					
						
							|  |  |  | 	.vsync_start = 768 + 10, | 
					
						
							|  |  |  | 	.vsync_end = 768 + 10 + 12, | 
					
						
							|  |  |  | 	.vtotal = 768 + 10 + 12 + 6, | 
					
						
							|  |  |  | 	.vrefresh = 60, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static const struct panel_desc auo_b116xw03 = { | 
					
						
							|  |  |  | 	.modes = &auo_b116xw03_mode, | 
					
						
							|  |  |  | 	.num_modes = 1, | 
					
						
							|  |  |  | 	.bpc = 6, | 
					
						
							|  |  |  | 	.size = { | 
					
						
							|  |  |  | 		.width = 256, | 
					
						
							|  |  |  | 		.height = 144, | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-23 19:27:59 -07:00
										 |  |  | static const struct drm_display_mode auo_b133xtn01_mode = { | 
					
						
							|  |  |  | 	.clock = 69500, | 
					
						
							|  |  |  | 	.hdisplay = 1366, | 
					
						
							|  |  |  | 	.hsync_start = 1366 + 48, | 
					
						
							|  |  |  | 	.hsync_end = 1366 + 48 + 32, | 
					
						
							|  |  |  | 	.htotal = 1366 + 48 + 32 + 20, | 
					
						
							|  |  |  | 	.vdisplay = 768, | 
					
						
							|  |  |  | 	.vsync_start = 768 + 3, | 
					
						
							|  |  |  | 	.vsync_end = 768 + 3 + 6, | 
					
						
							|  |  |  | 	.vtotal = 768 + 3 + 6 + 13, | 
					
						
							|  |  |  | 	.vrefresh = 60, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static const struct panel_desc auo_b133xtn01 = { | 
					
						
							|  |  |  | 	.modes = &auo_b133xtn01_mode, | 
					
						
							|  |  |  | 	.num_modes = 1, | 
					
						
							| 
									
										
										
										
											2014-06-19 18:18:28 -07:00
										 |  |  | 	.bpc = 6, | 
					
						
							| 
									
										
										
										
											2014-05-23 19:27:59 -07:00
										 |  |  | 	.size = { | 
					
						
							|  |  |  | 		.width = 293, | 
					
						
							|  |  |  | 		.height = 165, | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-31 23:12:12 +05:30
										 |  |  | static const struct drm_display_mode auo_b133htn01_mode = { | 
					
						
							|  |  |  | 	.clock = 150660, | 
					
						
							|  |  |  | 	.hdisplay = 1920, | 
					
						
							|  |  |  | 	.hsync_start = 1920 + 172, | 
					
						
							|  |  |  | 	.hsync_end = 1920 + 172 + 80, | 
					
						
							|  |  |  | 	.htotal = 1920 + 172 + 80 + 60, | 
					
						
							|  |  |  | 	.vdisplay = 1080, | 
					
						
							|  |  |  | 	.vsync_start = 1080 + 25, | 
					
						
							|  |  |  | 	.vsync_end = 1080 + 25 + 10, | 
					
						
							|  |  |  | 	.vtotal = 1080 + 25 + 10 + 10, | 
					
						
							|  |  |  | 	.vrefresh = 60, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static const struct panel_desc auo_b133htn01 = { | 
					
						
							|  |  |  | 	.modes = &auo_b133htn01_mode, | 
					
						
							|  |  |  | 	.num_modes = 1, | 
					
						
							| 
									
										
										
										
											2014-11-06 10:11:01 +01:00
										 |  |  | 	.bpc = 6, | 
					
						
							| 
									
										
										
										
											2014-07-31 23:12:12 +05:30
										 |  |  | 	.size = { | 
					
						
							|  |  |  | 		.width = 293, | 
					
						
							|  |  |  | 		.height = 165, | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 	.delay = { | 
					
						
							|  |  |  | 		.prepare = 105, | 
					
						
							|  |  |  | 		.enable = 20, | 
					
						
							|  |  |  | 		.unprepare = 50, | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-18 16:43:43 +01:00
										 |  |  | static const struct drm_display_mode avic_tm070ddh03_mode = { | 
					
						
							|  |  |  | 	.clock = 51200, | 
					
						
							|  |  |  | 	.hdisplay = 1024, | 
					
						
							|  |  |  | 	.hsync_start = 1024 + 160, | 
					
						
							|  |  |  | 	.hsync_end = 1024 + 160 + 4, | 
					
						
							|  |  |  | 	.htotal = 1024 + 160 + 4 + 156, | 
					
						
							|  |  |  | 	.vdisplay = 600, | 
					
						
							|  |  |  | 	.vsync_start = 600 + 17, | 
					
						
							|  |  |  | 	.vsync_end = 600 + 17 + 1, | 
					
						
							|  |  |  | 	.vtotal = 600 + 17 + 1 + 17, | 
					
						
							|  |  |  | 	.vrefresh = 60, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static const struct panel_desc avic_tm070ddh03 = { | 
					
						
							|  |  |  | 	.modes = &avic_tm070ddh03_mode, | 
					
						
							|  |  |  | 	.num_modes = 1, | 
					
						
							|  |  |  | 	.bpc = 8, | 
					
						
							|  |  |  | 	.size = { | 
					
						
							|  |  |  | 		.width = 154, | 
					
						
							|  |  |  | 		.height = 90, | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 	.delay = { | 
					
						
							|  |  |  | 		.prepare = 20, | 
					
						
							|  |  |  | 		.enable = 200, | 
					
						
							|  |  |  | 		.disable = 200, | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-07 16:46:26 -07:00
										 |  |  | static const struct drm_display_mode chunghwa_claa101wa01a_mode = { | 
					
						
							|  |  |  | 	.clock = 72070, | 
					
						
							|  |  |  | 	.hdisplay = 1366, | 
					
						
							|  |  |  | 	.hsync_start = 1366 + 58, | 
					
						
							|  |  |  | 	.hsync_end = 1366 + 58 + 58, | 
					
						
							|  |  |  | 	.htotal = 1366 + 58 + 58 + 58, | 
					
						
							|  |  |  | 	.vdisplay = 768, | 
					
						
							|  |  |  | 	.vsync_start = 768 + 4, | 
					
						
							|  |  |  | 	.vsync_end = 768 + 4 + 4, | 
					
						
							|  |  |  | 	.vtotal = 768 + 4 + 4 + 4, | 
					
						
							|  |  |  | 	.vrefresh = 60, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static const struct panel_desc chunghwa_claa101wa01a = { | 
					
						
							|  |  |  | 	.modes = &chunghwa_claa101wa01a_mode, | 
					
						
							|  |  |  | 	.num_modes = 1, | 
					
						
							| 
									
										
										
										
											2014-06-19 18:18:28 -07:00
										 |  |  | 	.bpc = 6, | 
					
						
							| 
									
										
										
										
											2014-01-07 16:46:26 -07:00
										 |  |  | 	.size = { | 
					
						
							|  |  |  | 		.width = 220, | 
					
						
							|  |  |  | 		.height = 120, | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-30 15:10:14 +02:00
										 |  |  | static const struct drm_display_mode chunghwa_claa101wb01_mode = { | 
					
						
							|  |  |  | 	.clock = 69300, | 
					
						
							|  |  |  | 	.hdisplay = 1366, | 
					
						
							|  |  |  | 	.hsync_start = 1366 + 48, | 
					
						
							|  |  |  | 	.hsync_end = 1366 + 48 + 32, | 
					
						
							|  |  |  | 	.htotal = 1366 + 48 + 32 + 20, | 
					
						
							|  |  |  | 	.vdisplay = 768, | 
					
						
							|  |  |  | 	.vsync_start = 768 + 16, | 
					
						
							|  |  |  | 	.vsync_end = 768 + 16 + 8, | 
					
						
							|  |  |  | 	.vtotal = 768 + 16 + 8 + 16, | 
					
						
							|  |  |  | 	.vrefresh = 60, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static const struct panel_desc chunghwa_claa101wb01 = { | 
					
						
							|  |  |  | 	.modes = &chunghwa_claa101wb01_mode, | 
					
						
							|  |  |  | 	.num_modes = 1, | 
					
						
							| 
									
										
										
										
											2014-06-19 18:18:28 -07:00
										 |  |  | 	.bpc = 6, | 
					
						
							| 
									
										
										
										
											2013-08-30 15:10:14 +02:00
										 |  |  | 	.size = { | 
					
						
							|  |  |  | 		.width = 223, | 
					
						
							|  |  |  | 		.height = 125, | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-15 11:38:45 +02:00
										 |  |  | static const struct drm_display_mode edt_et057090dhu_mode = { | 
					
						
							|  |  |  | 	.clock = 25175, | 
					
						
							|  |  |  | 	.hdisplay = 640, | 
					
						
							|  |  |  | 	.hsync_start = 640 + 16, | 
					
						
							|  |  |  | 	.hsync_end = 640 + 16 + 30, | 
					
						
							|  |  |  | 	.htotal = 640 + 16 + 30 + 114, | 
					
						
							|  |  |  | 	.vdisplay = 480, | 
					
						
							|  |  |  | 	.vsync_start = 480 + 10, | 
					
						
							|  |  |  | 	.vsync_end = 480 + 10 + 3, | 
					
						
							|  |  |  | 	.vtotal = 480 + 10 + 3 + 32, | 
					
						
							|  |  |  | 	.vrefresh = 60, | 
					
						
							|  |  |  | 	.flags = DRM_MODE_FLAG_NVSYNC | DRM_MODE_FLAG_NHSYNC, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static const struct panel_desc edt_et057090dhu = { | 
					
						
							|  |  |  | 	.modes = &edt_et057090dhu_mode, | 
					
						
							|  |  |  | 	.num_modes = 1, | 
					
						
							| 
									
										
										
										
											2014-06-19 18:18:28 -07:00
										 |  |  | 	.bpc = 6, | 
					
						
							| 
									
										
										
										
											2014-05-15 11:38:45 +02:00
										 |  |  | 	.size = { | 
					
						
							|  |  |  | 		.width = 115, | 
					
						
							|  |  |  | 		.height = 86, | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-15 12:25:47 +02:00
										 |  |  | static const struct drm_display_mode edt_etm0700g0dh6_mode = { | 
					
						
							|  |  |  | 	.clock = 33260, | 
					
						
							|  |  |  | 	.hdisplay = 800, | 
					
						
							|  |  |  | 	.hsync_start = 800 + 40, | 
					
						
							|  |  |  | 	.hsync_end = 800 + 40 + 128, | 
					
						
							|  |  |  | 	.htotal = 800 + 40 + 128 + 88, | 
					
						
							|  |  |  | 	.vdisplay = 480, | 
					
						
							|  |  |  | 	.vsync_start = 480 + 10, | 
					
						
							|  |  |  | 	.vsync_end = 480 + 10 + 2, | 
					
						
							|  |  |  | 	.vtotal = 480 + 10 + 2 + 33, | 
					
						
							|  |  |  | 	.vrefresh = 60, | 
					
						
							|  |  |  | 	.flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static const struct panel_desc edt_etm0700g0dh6 = { | 
					
						
							|  |  |  | 	.modes = &edt_etm0700g0dh6_mode, | 
					
						
							|  |  |  | 	.num_modes = 1, | 
					
						
							| 
									
										
										
										
											2014-06-19 18:18:28 -07:00
										 |  |  | 	.bpc = 6, | 
					
						
							| 
									
										
										
										
											2014-05-15 12:25:47 +02:00
										 |  |  | 	.size = { | 
					
						
							|  |  |  | 		.width = 152, | 
					
						
							|  |  |  | 		.height = 91, | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-06-05 15:53:32 +02:00
										 |  |  | static const struct drm_display_mode foxlink_fl500wvr00_a0t_mode = { | 
					
						
							|  |  |  | 	.clock = 32260, | 
					
						
							|  |  |  | 	.hdisplay = 800, | 
					
						
							|  |  |  | 	.hsync_start = 800 + 168, | 
					
						
							|  |  |  | 	.hsync_end = 800 + 168 + 64, | 
					
						
							|  |  |  | 	.htotal = 800 + 168 + 64 + 88, | 
					
						
							|  |  |  | 	.vdisplay = 480, | 
					
						
							|  |  |  | 	.vsync_start = 480 + 37, | 
					
						
							|  |  |  | 	.vsync_end = 480 + 37 + 2, | 
					
						
							|  |  |  | 	.vtotal = 480 + 37 + 2 + 8, | 
					
						
							|  |  |  | 	.vrefresh = 60, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static const struct panel_desc foxlink_fl500wvr00_a0t = { | 
					
						
							|  |  |  | 	.modes = &foxlink_fl500wvr00_a0t_mode, | 
					
						
							|  |  |  | 	.num_modes = 1, | 
					
						
							| 
									
										
										
										
											2014-11-06 10:11:01 +01:00
										 |  |  | 	.bpc = 8, | 
					
						
							| 
									
										
										
										
											2014-06-05 15:53:32 +02:00
										 |  |  | 	.size = { | 
					
						
							|  |  |  | 		.width = 108, | 
					
						
							|  |  |  | 		.height = 65, | 
					
						
							|  |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2014-07-22 13:35:47 +02:00
										 |  |  | 	.bus_format = MEDIA_BUS_FMT_RGB888_1X24, | 
					
						
							| 
									
										
										
										
											2014-06-05 15:53:32 +02:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-19 10:29:55 +01:00
										 |  |  | static const struct drm_display_mode giantplus_gpg482739qs5_mode = { | 
					
						
							|  |  |  | 	.clock = 9000, | 
					
						
							|  |  |  | 	.hdisplay = 480, | 
					
						
							|  |  |  | 	.hsync_start = 480 + 5, | 
					
						
							|  |  |  | 	.hsync_end = 480 + 5 + 1, | 
					
						
							|  |  |  | 	.htotal = 480 + 5 + 1 + 40, | 
					
						
							|  |  |  | 	.vdisplay = 272, | 
					
						
							|  |  |  | 	.vsync_start = 272 + 8, | 
					
						
							|  |  |  | 	.vsync_end = 272 + 8 + 1, | 
					
						
							|  |  |  | 	.vtotal = 272 + 8 + 1 + 8, | 
					
						
							|  |  |  | 	.vrefresh = 60, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static const struct panel_desc giantplus_gpg482739qs5 = { | 
					
						
							|  |  |  | 	.modes = &giantplus_gpg482739qs5_mode, | 
					
						
							|  |  |  | 	.num_modes = 1, | 
					
						
							|  |  |  | 	.bpc = 8, | 
					
						
							|  |  |  | 	.size = { | 
					
						
							|  |  |  | 		.width = 95, | 
					
						
							|  |  |  | 		.height = 54, | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-23 16:31:06 +02:00
										 |  |  | static const struct drm_display_mode hannstar_hsd070pww1_mode = { | 
					
						
							|  |  |  | 	.clock = 71100, | 
					
						
							|  |  |  | 	.hdisplay = 1280, | 
					
						
							|  |  |  | 	.hsync_start = 1280 + 1, | 
					
						
							|  |  |  | 	.hsync_end = 1280 + 1 + 158, | 
					
						
							|  |  |  | 	.htotal = 1280 + 1 + 158 + 1, | 
					
						
							|  |  |  | 	.vdisplay = 800, | 
					
						
							|  |  |  | 	.vsync_start = 800 + 1, | 
					
						
							|  |  |  | 	.vsync_end = 800 + 1 + 21, | 
					
						
							|  |  |  | 	.vtotal = 800 + 1 + 21 + 1, | 
					
						
							|  |  |  | 	.vrefresh = 60, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static const struct panel_desc hannstar_hsd070pww1 = { | 
					
						
							|  |  |  | 	.modes = &hannstar_hsd070pww1_mode, | 
					
						
							|  |  |  | 	.num_modes = 1, | 
					
						
							|  |  |  | 	.bpc = 6, | 
					
						
							|  |  |  | 	.size = { | 
					
						
							|  |  |  | 		.width = 151, | 
					
						
							|  |  |  | 		.height = 94, | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-06 17:44:35 +01:00
										 |  |  | static const struct drm_display_mode hitachi_tx23d38vm0caa_mode = { | 
					
						
							|  |  |  | 	.clock = 33333, | 
					
						
							|  |  |  | 	.hdisplay = 800, | 
					
						
							|  |  |  | 	.hsync_start = 800 + 85, | 
					
						
							|  |  |  | 	.hsync_end = 800 + 85 + 86, | 
					
						
							|  |  |  | 	.htotal = 800 + 85 + 86 + 85, | 
					
						
							|  |  |  | 	.vdisplay = 480, | 
					
						
							|  |  |  | 	.vsync_start = 480 + 16, | 
					
						
							|  |  |  | 	.vsync_end = 480 + 16 + 13, | 
					
						
							|  |  |  | 	.vtotal = 480 + 16 + 13 + 16, | 
					
						
							|  |  |  | 	.vrefresh = 60, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static const struct panel_desc hitachi_tx23d38vm0caa = { | 
					
						
							|  |  |  | 	.modes = &hitachi_tx23d38vm0caa_mode, | 
					
						
							|  |  |  | 	.num_modes = 1, | 
					
						
							|  |  |  | 	.bpc = 6, | 
					
						
							|  |  |  | 	.size = { | 
					
						
							|  |  |  | 		.width = 195, | 
					
						
							|  |  |  | 		.height = 117, | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-06 17:44:33 +01:00
										 |  |  | static const struct drm_display_mode innolux_g121i1_l01_mode = { | 
					
						
							| 
									
										
										
										
											2014-07-03 14:02:59 +02:00
										 |  |  | 	.clock = 71000, | 
					
						
							| 
									
										
										
										
											2014-11-06 17:44:33 +01:00
										 |  |  | 	.hdisplay = 1280, | 
					
						
							|  |  |  | 	.hsync_start = 1280 + 64, | 
					
						
							|  |  |  | 	.hsync_end = 1280 + 64 + 32, | 
					
						
							|  |  |  | 	.htotal = 1280 + 64 + 32 + 64, | 
					
						
							|  |  |  | 	.vdisplay = 800, | 
					
						
							|  |  |  | 	.vsync_start = 800 + 9, | 
					
						
							|  |  |  | 	.vsync_end = 800 + 9 + 6, | 
					
						
							|  |  |  | 	.vtotal = 800 + 9 + 6 + 9, | 
					
						
							|  |  |  | 	.vrefresh = 60, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static const struct panel_desc innolux_g121i1_l01 = { | 
					
						
							|  |  |  | 	.modes = &innolux_g121i1_l01_mode, | 
					
						
							|  |  |  | 	.num_modes = 1, | 
					
						
							|  |  |  | 	.bpc = 6, | 
					
						
							|  |  |  | 	.size = { | 
					
						
							|  |  |  | 		.width = 261, | 
					
						
							|  |  |  | 		.height = 163, | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-03 14:02:59 +02:00
										 |  |  | static const struct drm_display_mode innolux_n116bge_mode = { | 
					
						
							| 
									
										
										
										
											2014-09-02 10:56:46 +08:00
										 |  |  | 	.clock = 76420, | 
					
						
							| 
									
										
										
										
											2014-07-03 14:02:59 +02:00
										 |  |  | 	.hdisplay = 1366, | 
					
						
							| 
									
										
										
										
											2014-09-02 10:56:46 +08:00
										 |  |  | 	.hsync_start = 1366 + 136, | 
					
						
							|  |  |  | 	.hsync_end = 1366 + 136 + 30, | 
					
						
							|  |  |  | 	.htotal = 1366 + 136 + 30 + 60, | 
					
						
							| 
									
										
										
										
											2014-07-03 14:02:59 +02:00
										 |  |  | 	.vdisplay = 768, | 
					
						
							|  |  |  | 	.vsync_start = 768 + 8, | 
					
						
							| 
									
										
										
										
											2014-09-02 10:56:46 +08:00
										 |  |  | 	.vsync_end = 768 + 8 + 12, | 
					
						
							|  |  |  | 	.vtotal = 768 + 8 + 12 + 12, | 
					
						
							| 
									
										
										
										
											2014-07-03 14:02:59 +02:00
										 |  |  | 	.vrefresh = 60, | 
					
						
							|  |  |  | 	.flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static const struct panel_desc innolux_n116bge = { | 
					
						
							|  |  |  | 	.modes = &innolux_n116bge_mode, | 
					
						
							|  |  |  | 	.num_modes = 1, | 
					
						
							|  |  |  | 	.bpc = 6, | 
					
						
							|  |  |  | 	.size = { | 
					
						
							|  |  |  | 		.width = 256, | 
					
						
							|  |  |  | 		.height = 144, | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-22 08:38:55 +02:00
										 |  |  | static const struct drm_display_mode innolux_n156bge_l21_mode = { | 
					
						
							|  |  |  | 	.clock = 69300, | 
					
						
							|  |  |  | 	.hdisplay = 1366, | 
					
						
							|  |  |  | 	.hsync_start = 1366 + 16, | 
					
						
							|  |  |  | 	.hsync_end = 1366 + 16 + 34, | 
					
						
							|  |  |  | 	.htotal = 1366 + 16 + 34 + 50, | 
					
						
							|  |  |  | 	.vdisplay = 768, | 
					
						
							|  |  |  | 	.vsync_start = 768 + 2, | 
					
						
							|  |  |  | 	.vsync_end = 768 + 2 + 6, | 
					
						
							|  |  |  | 	.vtotal = 768 + 2 + 6 + 12, | 
					
						
							|  |  |  | 	.vrefresh = 60, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static const struct panel_desc innolux_n156bge_l21 = { | 
					
						
							|  |  |  | 	.modes = &innolux_n156bge_l21_mode, | 
					
						
							|  |  |  | 	.num_modes = 1, | 
					
						
							| 
									
										
										
										
											2014-06-19 18:18:28 -07:00
										 |  |  | 	.bpc = 6, | 
					
						
							| 
									
										
										
										
											2014-07-22 08:38:55 +02:00
										 |  |  | 	.size = { | 
					
						
							|  |  |  | 		.width = 344, | 
					
						
							|  |  |  | 		.height = 193, | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-15 15:59:32 +01:00
										 |  |  | static const struct drm_display_mode lg_lp129qe_mode = { | 
					
						
							|  |  |  | 	.clock = 285250, | 
					
						
							|  |  |  | 	.hdisplay = 2560, | 
					
						
							|  |  |  | 	.hsync_start = 2560 + 48, | 
					
						
							|  |  |  | 	.hsync_end = 2560 + 48 + 32, | 
					
						
							|  |  |  | 	.htotal = 2560 + 48 + 32 + 80, | 
					
						
							|  |  |  | 	.vdisplay = 1700, | 
					
						
							|  |  |  | 	.vsync_start = 1700 + 3, | 
					
						
							|  |  |  | 	.vsync_end = 1700 + 3 + 10, | 
					
						
							|  |  |  | 	.vtotal = 1700 + 3 + 10 + 36, | 
					
						
							|  |  |  | 	.vrefresh = 60, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static const struct panel_desc lg_lp129qe = { | 
					
						
							|  |  |  | 	.modes = &lg_lp129qe_mode, | 
					
						
							|  |  |  | 	.num_modes = 1, | 
					
						
							| 
									
										
										
										
											2014-06-19 18:18:28 -07:00
										 |  |  | 	.bpc = 8, | 
					
						
							| 
									
										
										
										
											2013-11-15 15:59:32 +01:00
										 |  |  | 	.size = { | 
					
						
							|  |  |  | 		.width = 272, | 
					
						
							|  |  |  | 		.height = 181, | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-21 21:38:12 +01:00
										 |  |  | static const struct drm_display_mode samsung_ltn101nt05_mode = { | 
					
						
							|  |  |  | 	.clock = 54030, | 
					
						
							|  |  |  | 	.hdisplay = 1024, | 
					
						
							|  |  |  | 	.hsync_start = 1024 + 24, | 
					
						
							|  |  |  | 	.hsync_end = 1024 + 24 + 136, | 
					
						
							|  |  |  | 	.htotal = 1024 + 24 + 136 + 160, | 
					
						
							|  |  |  | 	.vdisplay = 600, | 
					
						
							|  |  |  | 	.vsync_start = 600 + 3, | 
					
						
							|  |  |  | 	.vsync_end = 600 + 3 + 6, | 
					
						
							|  |  |  | 	.vtotal = 600 + 3 + 6 + 61, | 
					
						
							|  |  |  | 	.vrefresh = 60, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static const struct panel_desc samsung_ltn101nt05 = { | 
					
						
							|  |  |  | 	.modes = &samsung_ltn101nt05_mode, | 
					
						
							|  |  |  | 	.num_modes = 1, | 
					
						
							| 
									
										
										
										
											2014-06-19 18:18:28 -07:00
										 |  |  | 	.bpc = 6, | 
					
						
							| 
									
										
										
										
											2013-12-21 21:38:12 +01:00
										 |  |  | 	.size = { | 
					
						
							|  |  |  | 		.width = 1024, | 
					
						
							|  |  |  | 		.height = 600, | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-30 15:10:14 +02:00
										 |  |  | static const struct of_device_id platform_of_match[] = { | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		.compatible = "auo,b101aw03", | 
					
						
							|  |  |  | 		.data = &auo_b101aw03, | 
					
						
							| 
									
										
										
										
											2014-08-01 17:01:06 -04:00
										 |  |  | 	}, { | 
					
						
							|  |  |  | 		.compatible = "auo,b101xtn01", | 
					
						
							|  |  |  | 		.data = &auo_b101xtn01, | 
					
						
							| 
									
										
										
										
											2014-09-01 15:40:02 +05:30
										 |  |  | 	}, { | 
					
						
							|  |  |  | 		.compatible = "auo,b116xw03", | 
					
						
							|  |  |  | 		.data = &auo_b116xw03, | 
					
						
							| 
									
										
										
										
											2014-07-31 23:12:12 +05:30
										 |  |  | 	}, { | 
					
						
							|  |  |  | 		.compatible = "auo,b133htn01", | 
					
						
							|  |  |  | 		.data = &auo_b133htn01, | 
					
						
							| 
									
										
										
										
											2014-05-23 19:27:59 -07:00
										 |  |  | 	}, { | 
					
						
							|  |  |  | 		.compatible = "auo,b133xtn01", | 
					
						
							|  |  |  | 		.data = &auo_b133xtn01, | 
					
						
							| 
									
										
										
										
											2014-12-18 16:43:43 +01:00
										 |  |  | 	}, { | 
					
						
							|  |  |  | 		.compatible = "avic,tm070ddh03", | 
					
						
							|  |  |  | 		.data = &avic_tm070ddh03, | 
					
						
							| 
									
										
										
										
											2014-01-07 16:46:26 -07:00
										 |  |  | 	}, { | 
					
						
							|  |  |  | 		.compatible = "chunghwa,claa101wa01a", | 
					
						
							|  |  |  | 		.data = &chunghwa_claa101wa01a | 
					
						
							| 
									
										
										
										
											2013-08-30 15:10:14 +02:00
										 |  |  | 	}, { | 
					
						
							|  |  |  | 		.compatible = "chunghwa,claa101wb01", | 
					
						
							|  |  |  | 		.data = &chunghwa_claa101wb01 | 
					
						
							| 
									
										
										
										
											2014-05-15 11:38:45 +02:00
										 |  |  | 	}, { | 
					
						
							|  |  |  | 		.compatible = "edt,et057090dhu", | 
					
						
							|  |  |  | 		.data = &edt_et057090dhu, | 
					
						
							| 
									
										
										
										
											2014-05-15 12:25:47 +02:00
										 |  |  | 	}, { | 
					
						
							|  |  |  | 		.compatible = "edt,et070080dh6", | 
					
						
							|  |  |  | 		.data = &edt_etm0700g0dh6, | 
					
						
							|  |  |  | 	}, { | 
					
						
							|  |  |  | 		.compatible = "edt,etm0700g0dh6", | 
					
						
							|  |  |  | 		.data = &edt_etm0700g0dh6, | 
					
						
							| 
									
										
										
										
											2014-06-05 15:53:32 +02:00
										 |  |  | 	}, { | 
					
						
							|  |  |  | 		.compatible = "foxlink,fl500wvr00-a0t", | 
					
						
							|  |  |  | 		.data = &foxlink_fl500wvr00_a0t, | 
					
						
							| 
									
										
										
										
											2014-11-19 10:29:55 +01:00
										 |  |  | 	}, { | 
					
						
							|  |  |  | 		.compatible = "giantplus,gpg482739qs5", | 
					
						
							|  |  |  | 		.data = &giantplus_gpg482739qs5 | 
					
						
							| 
									
										
										
										
											2014-10-23 16:31:06 +02:00
										 |  |  | 	}, { | 
					
						
							|  |  |  | 		.compatible = "hannstar,hsd070pww1", | 
					
						
							|  |  |  | 		.data = &hannstar_hsd070pww1, | 
					
						
							| 
									
										
										
										
											2014-11-06 17:44:35 +01:00
										 |  |  | 	}, { | 
					
						
							|  |  |  | 		.compatible = "hit,tx23d38vm0caa", | 
					
						
							|  |  |  | 		.data = &hitachi_tx23d38vm0caa | 
					
						
							| 
									
										
										
										
											2014-11-06 17:44:33 +01:00
										 |  |  | 	}, { | 
					
						
							|  |  |  | 		.compatible ="innolux,g121i1-l01", | 
					
						
							|  |  |  | 		.data = &innolux_g121i1_l01 | 
					
						
							| 
									
										
										
										
											2014-07-03 14:02:59 +02:00
										 |  |  | 	}, { | 
					
						
							|  |  |  | 		.compatible = "innolux,n116bge", | 
					
						
							|  |  |  | 		.data = &innolux_n116bge, | 
					
						
							| 
									
										
										
										
											2014-07-22 08:38:55 +02:00
										 |  |  | 	}, { | 
					
						
							|  |  |  | 		.compatible = "innolux,n156bge-l21", | 
					
						
							|  |  |  | 		.data = &innolux_n156bge_l21, | 
					
						
							| 
									
										
										
										
											2013-11-15 15:59:32 +01:00
										 |  |  | 	}, { | 
					
						
							|  |  |  | 		.compatible = "lg,lp129qe", | 
					
						
							|  |  |  | 		.data = &lg_lp129qe, | 
					
						
							| 
									
										
										
										
											2013-12-21 21:38:12 +01:00
										 |  |  | 	}, { | 
					
						
							|  |  |  | 		.compatible = "samsung,ltn101nt05", | 
					
						
							|  |  |  | 		.data = &samsung_ltn101nt05, | 
					
						
							| 
									
										
										
										
											2013-08-30 15:10:14 +02:00
										 |  |  | 	}, { | 
					
						
							|  |  |  | 		/* sentinel */ | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | MODULE_DEVICE_TABLE(of, platform_of_match); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int panel_simple_platform_probe(struct platform_device *pdev) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	const struct of_device_id *id; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	id = of_match_node(platform_of_match, pdev->dev.of_node); | 
					
						
							|  |  |  | 	if (!id) | 
					
						
							|  |  |  | 		return -ENODEV; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return panel_simple_probe(&pdev->dev, id->data); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int panel_simple_platform_remove(struct platform_device *pdev) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	return panel_simple_remove(&pdev->dev); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-29 17:21:21 +02:00
										 |  |  | static void panel_simple_platform_shutdown(struct platform_device *pdev) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	panel_simple_shutdown(&pdev->dev); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-30 15:10:14 +02:00
										 |  |  | static struct platform_driver panel_simple_platform_driver = { | 
					
						
							|  |  |  | 	.driver = { | 
					
						
							|  |  |  | 		.name = "panel-simple", | 
					
						
							|  |  |  | 		.of_match_table = platform_of_match, | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 	.probe = panel_simple_platform_probe, | 
					
						
							|  |  |  | 	.remove = panel_simple_platform_remove, | 
					
						
							| 
									
										
										
										
											2014-04-29 17:21:21 +02:00
										 |  |  | 	.shutdown = panel_simple_platform_shutdown, | 
					
						
							| 
									
										
										
										
											2013-08-30 15:10:14 +02:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-22 19:27:11 +01:00
										 |  |  | struct panel_desc_dsi { | 
					
						
							|  |  |  | 	struct panel_desc desc; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-14 11:24:57 +01:00
										 |  |  | 	unsigned long flags; | 
					
						
							| 
									
										
										
										
											2013-11-22 19:27:11 +01:00
										 |  |  | 	enum mipi_dsi_pixel_format format; | 
					
						
							|  |  |  | 	unsigned int lanes; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-21 18:57:10 +09:00
										 |  |  | static const struct drm_display_mode lg_ld070wx3_sl01_mode = { | 
					
						
							|  |  |  | 	.clock = 71000, | 
					
						
							|  |  |  | 	.hdisplay = 800, | 
					
						
							|  |  |  | 	.hsync_start = 800 + 32, | 
					
						
							|  |  |  | 	.hsync_end = 800 + 32 + 1, | 
					
						
							|  |  |  | 	.htotal = 800 + 32 + 1 + 57, | 
					
						
							|  |  |  | 	.vdisplay = 1280, | 
					
						
							|  |  |  | 	.vsync_start = 1280 + 28, | 
					
						
							|  |  |  | 	.vsync_end = 1280 + 28 + 1, | 
					
						
							|  |  |  | 	.vtotal = 1280 + 28 + 1 + 14, | 
					
						
							|  |  |  | 	.vrefresh = 60, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static const struct panel_desc_dsi lg_ld070wx3_sl01 = { | 
					
						
							|  |  |  | 	.desc = { | 
					
						
							|  |  |  | 		.modes = &lg_ld070wx3_sl01_mode, | 
					
						
							|  |  |  | 		.num_modes = 1, | 
					
						
							| 
									
										
										
										
											2014-11-06 10:11:01 +01:00
										 |  |  | 		.bpc = 8, | 
					
						
							| 
									
										
										
										
											2014-01-21 18:57:10 +09:00
										 |  |  | 		.size = { | 
					
						
							|  |  |  | 			.width = 94, | 
					
						
							|  |  |  | 			.height = 151, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2014-07-08 21:32:12 +09:00
										 |  |  | 	.flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_CLOCK_NON_CONTINUOUS, | 
					
						
							| 
									
										
										
										
											2014-01-21 18:57:10 +09:00
										 |  |  | 	.format = MIPI_DSI_FMT_RGB888, | 
					
						
							|  |  |  | 	.lanes = 4, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-21 18:57:09 +09:00
										 |  |  | static const struct drm_display_mode lg_lh500wx1_sd03_mode = { | 
					
						
							|  |  |  | 	.clock = 67000, | 
					
						
							|  |  |  | 	.hdisplay = 720, | 
					
						
							|  |  |  | 	.hsync_start = 720 + 12, | 
					
						
							|  |  |  | 	.hsync_end = 720 + 12 + 4, | 
					
						
							|  |  |  | 	.htotal = 720 + 12 + 4 + 112, | 
					
						
							|  |  |  | 	.vdisplay = 1280, | 
					
						
							|  |  |  | 	.vsync_start = 1280 + 8, | 
					
						
							|  |  |  | 	.vsync_end = 1280 + 8 + 4, | 
					
						
							|  |  |  | 	.vtotal = 1280 + 8 + 4 + 12, | 
					
						
							|  |  |  | 	.vrefresh = 60, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static const struct panel_desc_dsi lg_lh500wx1_sd03 = { | 
					
						
							|  |  |  | 	.desc = { | 
					
						
							|  |  |  | 		.modes = &lg_lh500wx1_sd03_mode, | 
					
						
							|  |  |  | 		.num_modes = 1, | 
					
						
							| 
									
										
										
										
											2014-11-06 10:11:01 +01:00
										 |  |  | 		.bpc = 8, | 
					
						
							| 
									
										
										
										
											2014-01-21 18:57:09 +09:00
										 |  |  | 		.size = { | 
					
						
							|  |  |  | 			.width = 62, | 
					
						
							|  |  |  | 			.height = 110, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 	.flags = MIPI_DSI_MODE_VIDEO, | 
					
						
							|  |  |  | 	.format = MIPI_DSI_FMT_RGB888, | 
					
						
							|  |  |  | 	.lanes = 4, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-30 15:10:14 +02:00
										 |  |  | static const struct drm_display_mode panasonic_vvx10f004b00_mode = { | 
					
						
							|  |  |  | 	.clock = 157200, | 
					
						
							|  |  |  | 	.hdisplay = 1920, | 
					
						
							|  |  |  | 	.hsync_start = 1920 + 154, | 
					
						
							|  |  |  | 	.hsync_end = 1920 + 154 + 16, | 
					
						
							|  |  |  | 	.htotal = 1920 + 154 + 16 + 32, | 
					
						
							|  |  |  | 	.vdisplay = 1200, | 
					
						
							|  |  |  | 	.vsync_start = 1200 + 17, | 
					
						
							|  |  |  | 	.vsync_end = 1200 + 17 + 2, | 
					
						
							|  |  |  | 	.vtotal = 1200 + 17 + 2 + 16, | 
					
						
							|  |  |  | 	.vrefresh = 60, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-22 19:27:11 +01:00
										 |  |  | static const struct panel_desc_dsi panasonic_vvx10f004b00 = { | 
					
						
							|  |  |  | 	.desc = { | 
					
						
							|  |  |  | 		.modes = &panasonic_vvx10f004b00_mode, | 
					
						
							|  |  |  | 		.num_modes = 1, | 
					
						
							| 
									
										
										
										
											2014-11-06 10:11:01 +01:00
										 |  |  | 		.bpc = 8, | 
					
						
							| 
									
										
										
										
											2013-11-22 19:27:11 +01:00
										 |  |  | 		.size = { | 
					
						
							|  |  |  | 			.width = 217, | 
					
						
							|  |  |  | 			.height = 136, | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2013-08-30 15:10:14 +02:00
										 |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2014-07-08 21:32:12 +09:00
										 |  |  | 	.flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_SYNC_PULSE | | 
					
						
							|  |  |  | 		 MIPI_DSI_CLOCK_NON_CONTINUOUS, | 
					
						
							| 
									
										
										
										
											2013-11-22 19:27:11 +01:00
										 |  |  | 	.format = MIPI_DSI_FMT_RGB888, | 
					
						
							|  |  |  | 	.lanes = 4, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static const struct of_device_id dsi_of_match[] = { | 
					
						
							|  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2014-01-21 18:57:10 +09:00
										 |  |  | 		.compatible = "lg,ld070wx3-sl01", | 
					
						
							|  |  |  | 		.data = &lg_ld070wx3_sl01 | 
					
						
							|  |  |  | 	}, { | 
					
						
							| 
									
										
										
										
											2014-01-21 18:57:09 +09:00
										 |  |  | 		.compatible = "lg,lh500wx1-sd03", | 
					
						
							|  |  |  | 		.data = &lg_lh500wx1_sd03 | 
					
						
							|  |  |  | 	}, { | 
					
						
							| 
									
										
										
										
											2013-11-22 19:27:11 +01:00
										 |  |  | 		.compatible = "panasonic,vvx10f004b00", | 
					
						
							|  |  |  | 		.data = &panasonic_vvx10f004b00 | 
					
						
							|  |  |  | 	}, { | 
					
						
							|  |  |  | 		/* sentinel */ | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | MODULE_DEVICE_TABLE(of, dsi_of_match); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int panel_simple_dsi_probe(struct mipi_dsi_device *dsi) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	const struct panel_desc_dsi *desc; | 
					
						
							|  |  |  | 	const struct of_device_id *id; | 
					
						
							|  |  |  | 	int err; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	id = of_match_node(dsi_of_match, dsi->dev.of_node); | 
					
						
							|  |  |  | 	if (!id) | 
					
						
							|  |  |  | 		return -ENODEV; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	desc = id->data; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	err = panel_simple_probe(&dsi->dev, &desc->desc); | 
					
						
							|  |  |  | 	if (err < 0) | 
					
						
							|  |  |  | 		return err; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-14 11:24:57 +01:00
										 |  |  | 	dsi->mode_flags = desc->flags; | 
					
						
							| 
									
										
										
										
											2013-11-22 19:27:11 +01:00
										 |  |  | 	dsi->format = desc->format; | 
					
						
							|  |  |  | 	dsi->lanes = desc->lanes; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return mipi_dsi_attach(dsi); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int panel_simple_dsi_remove(struct mipi_dsi_device *dsi) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	int err; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	err = mipi_dsi_detach(dsi); | 
					
						
							|  |  |  | 	if (err < 0) | 
					
						
							|  |  |  | 		dev_err(&dsi->dev, "failed to detach from DSI host: %d\n", err); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return panel_simple_remove(&dsi->dev); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-29 17:21:21 +02:00
										 |  |  | static void panel_simple_dsi_shutdown(struct mipi_dsi_device *dsi) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	panel_simple_shutdown(&dsi->dev); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-22 19:27:11 +01:00
										 |  |  | static struct mipi_dsi_driver panel_simple_dsi_driver = { | 
					
						
							|  |  |  | 	.driver = { | 
					
						
							|  |  |  | 		.name = "panel-simple-dsi", | 
					
						
							|  |  |  | 		.of_match_table = dsi_of_match, | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 	.probe = panel_simple_dsi_probe, | 
					
						
							|  |  |  | 	.remove = panel_simple_dsi_remove, | 
					
						
							| 
									
										
										
										
											2014-04-29 17:21:21 +02:00
										 |  |  | 	.shutdown = panel_simple_dsi_shutdown, | 
					
						
							| 
									
										
										
										
											2013-08-30 15:10:14 +02:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int __init panel_simple_init(void) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2013-11-22 19:27:11 +01:00
										 |  |  | 	int err; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	err = platform_driver_register(&panel_simple_platform_driver); | 
					
						
							|  |  |  | 	if (err < 0) | 
					
						
							|  |  |  | 		return err; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (IS_ENABLED(CONFIG_DRM_MIPI_DSI)) { | 
					
						
							|  |  |  | 		err = mipi_dsi_driver_register(&panel_simple_dsi_driver); | 
					
						
							|  |  |  | 		if (err < 0) | 
					
						
							|  |  |  | 			return err; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return 0; | 
					
						
							| 
									
										
										
										
											2013-08-30 15:10:14 +02:00
										 |  |  | } | 
					
						
							|  |  |  | module_init(panel_simple_init); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void __exit panel_simple_exit(void) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2013-11-22 19:27:11 +01:00
										 |  |  | 	if (IS_ENABLED(CONFIG_DRM_MIPI_DSI)) | 
					
						
							|  |  |  | 		mipi_dsi_driver_unregister(&panel_simple_dsi_driver); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-30 15:10:14 +02:00
										 |  |  | 	platform_driver_unregister(&panel_simple_platform_driver); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | module_exit(panel_simple_exit); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | MODULE_AUTHOR("Thierry Reding <treding@nvidia.com>"); | 
					
						
							|  |  |  | MODULE_DESCRIPTION("DRM Driver for Simple Panels"); | 
					
						
							|  |  |  | MODULE_LICENSE("GPL and additional rights"); |