diff options
Diffstat (limited to 'drivers/gpu/drm/panel/panel-simple.c')
| -rw-r--r-- | drivers/gpu/drm/panel/panel-simple.c | 247 | 
1 files changed, 246 insertions, 1 deletions
| diff --git a/drivers/gpu/drm/panel/panel-simple.c b/drivers/gpu/drm/panel/panel-simple.c index 3ad828eaefe1..b6ecd1552132 100644 --- a/drivers/gpu/drm/panel/panel-simple.c +++ b/drivers/gpu/drm/panel/panel-simple.c @@ -23,6 +23,7 @@  #include <linux/delay.h>  #include <linux/gpio/consumer.h> +#include <linux/iopoll.h>  #include <linux/module.h>  #include <linux/of_platform.h>  #include <linux/platform_device.h> @@ -108,6 +109,7 @@ struct panel_simple {  	struct i2c_adapter *ddc;  	struct gpio_desc *enable_gpio; +	struct gpio_desc *hpd_gpio;  	struct drm_display_mode override_mode;  }; @@ -259,11 +261,37 @@ static int panel_simple_unprepare(struct drm_panel *panel)  	return 0;  } +static int panel_simple_get_hpd_gpio(struct device *dev, +				     struct panel_simple *p, bool from_probe) +{ +	int err; + +	p->hpd_gpio = devm_gpiod_get_optional(dev, "hpd", GPIOD_IN); +	if (IS_ERR(p->hpd_gpio)) { +		err = PTR_ERR(p->hpd_gpio); + +		/* +		 * If we're called from probe we won't consider '-EPROBE_DEFER' +		 * to be an error--we'll leave the error code in "hpd_gpio". +		 * When we try to use it we'll try again.  This allows for +		 * circular dependencies where the component providing the +		 * hpd gpio needs the panel to init before probing. +		 */ +		if (err != -EPROBE_DEFER || !from_probe) { +			dev_err(dev, "failed to get 'hpd' GPIO: %d\n", err); +			return err; +		} +	} + +	return 0; +} +  static int panel_simple_prepare(struct drm_panel *panel)  {  	struct panel_simple *p = to_panel_simple(panel);  	unsigned int delay;  	int err; +	int hpd_asserted;  	if (p->prepared)  		return 0; @@ -282,6 +310,26 @@ static int panel_simple_prepare(struct drm_panel *panel)  	if (delay)  		msleep(delay); +	if (p->hpd_gpio) { +		if (IS_ERR(p->hpd_gpio)) { +			err = panel_simple_get_hpd_gpio(panel->dev, p, false); +			if (err) +				return err; +		} + +		err = readx_poll_timeout(gpiod_get_value_cansleep, p->hpd_gpio, +					 hpd_asserted, hpd_asserted, +					 1000, 2000000); +		if (hpd_asserted < 0) +			err = hpd_asserted; + +		if (err) { +			dev_err(panel->dev, +				"error waiting for hpd GPIO: %d\n", err); +			return err; +		} +	} +  	p->prepared = true;  	return 0; @@ -462,6 +510,11 @@ static int panel_simple_probe(struct device *dev, const struct panel_desc *desc)  	panel->desc = desc;  	panel->no_hpd = of_property_read_bool(dev->of_node, "no-hpd"); +	if (!panel->no_hpd) { +		err = panel_simple_get_hpd_gpio(dev, panel, true); +		if (err) +			return err; +	}  	panel->supply = devm_regulator_get(dev, "power");  	if (IS_ERR(panel->supply)) @@ -836,7 +889,8 @@ static const struct panel_desc auo_g101evn010 = {  		.width = 216,  		.height = 135,  	}, -	.bus_format = MEDIA_BUS_FMT_RGB666_1X18, +	.bus_format = MEDIA_BUS_FMT_RGB666_1X7X3_SPWG, +	.connector_type = DRM_MODE_CONNECTOR_LVDS,  };  static const struct drm_display_mode auo_g104sn02_mode = { @@ -862,6 +916,31 @@ static const struct panel_desc auo_g104sn02 = {  	},  }; +static const struct drm_display_mode auo_g121ean01_mode = { +	.clock = 66700, +	.hdisplay = 1280, +	.hsync_start = 1280 + 58, +	.hsync_end = 1280 + 58 + 8, +	.htotal = 1280 + 58 + 8 + 70, +	.vdisplay = 800, +	.vsync_start = 800 + 6, +	.vsync_end = 800 + 6 + 4, +	.vtotal = 800 + 6 + 4 + 10, +	.vrefresh = 60, +}; + +static const struct panel_desc auo_g121ean01 = { +	.modes = &auo_g121ean01_mode, +	.num_modes = 1, +	.bpc = 8, +	.size = { +		.width = 261, +		.height = 163, +	}, +	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG, +	.connector_type = DRM_MODE_CONNECTOR_LVDS, +}; +  static const struct display_timing auo_g133han01_timings = {  	.pixelclock = { 134000000, 141200000, 149000000 },  	.hactive = { 1920, 1920, 1920 }, @@ -892,6 +971,31 @@ static const struct panel_desc auo_g133han01 = {  	.connector_type = DRM_MODE_CONNECTOR_LVDS,  }; +static const struct drm_display_mode auo_g156xtn01_mode = { +	.clock = 76000, +	.hdisplay = 1366, +	.hsync_start = 1366 + 33, +	.hsync_end = 1366 + 33 + 67, +	.htotal = 1560, +	.vdisplay = 768, +	.vsync_start = 768 + 4, +	.vsync_end = 768 + 4 + 4, +	.vtotal = 806, +	.vrefresh = 60, +}; + +static const struct panel_desc auo_g156xtn01 = { +	.modes = &auo_g156xtn01_mode, +	.num_modes = 1, +	.bpc = 8, +	.size = { +		.width = 344, +		.height = 194, +	}, +	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG, +	.connector_type = DRM_MODE_CONNECTOR_LVDS, +}; +  static const struct display_timing auo_g185han01_timings = {  	.pixelclock = { 120000000, 144000000, 175000000 },  	.hactive = { 1920, 1920, 1920 }, @@ -922,6 +1026,36 @@ static const struct panel_desc auo_g185han01 = {  	.connector_type = DRM_MODE_CONNECTOR_LVDS,  }; +static const struct display_timing auo_g190ean01_timings = { +	.pixelclock = { 90000000, 108000000, 135000000 }, +	.hactive = { 1280, 1280, 1280 }, +	.hfront_porch = { 126, 184, 1266 }, +	.hback_porch = { 84, 122, 844 }, +	.hsync_len = { 70, 102, 704 }, +	.vactive = { 1024, 1024, 1024 }, +	.vfront_porch = { 4, 26, 76 }, +	.vback_porch = { 2, 8, 25 }, +	.vsync_len = { 2, 8, 25 }, +}; + +static const struct panel_desc auo_g190ean01 = { +	.timings = &auo_g190ean01_timings, +	.num_timings = 1, +	.bpc = 8, +	.size = { +		.width = 376, +		.height = 301, +	}, +	.delay = { +		.prepare = 50, +		.enable = 200, +		.disable = 110, +		.unprepare = 1000, +	}, +	.bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG, +	.connector_type = DRM_MODE_CONNECTOR_LVDS, +}; +  static const struct display_timing auo_p320hvn03_timings = {  	.pixelclock = { 106000000, 148500000, 164000000 },  	.hactive = { 1920, 1920, 1920 }, @@ -1092,6 +1226,38 @@ static const struct panel_desc boe_nv101wxmn51 = {  	},  }; +/* Also used for boe_nv133fhm_n62 */ +static const struct drm_display_mode boe_nv133fhm_n61_modes = { +	.clock = 147840, +	.hdisplay = 1920, +	.hsync_start = 1920 + 48, +	.hsync_end = 1920 + 48 + 32, +	.htotal = 1920 + 48 + 32 + 200, +	.vdisplay = 1080, +	.vsync_start = 1080 + 3, +	.vsync_end = 1080 + 3 + 6, +	.vtotal = 1080 + 3 + 6 + 31, +	.vrefresh = 60, +}; + +/* Also used for boe_nv133fhm_n62 */ +static const struct panel_desc boe_nv133fhm_n61 = { +	.modes = &boe_nv133fhm_n61_modes, +	.num_modes = 1, +	.bpc = 6, +	.size = { +		.width = 294, +		.height = 165, +	}, +	.delay = { +		.hpd_absent_delay = 200, +		.unprepare = 500, +	}, +	.bus_format = MEDIA_BUS_FMT_RGB888_1X24, +	.bus_flags = DRM_BUS_FLAG_DATA_MSB_TO_LSB, +	.connector_type = DRM_MODE_CONNECTOR_eDP, +}; +  static const struct drm_display_mode boe_nv140fhmn49_modes[] = {  	{  		.clock = 148500, @@ -1980,6 +2146,37 @@ static const struct panel_desc innolux_zj070na_01p = {  	},  }; +static const struct drm_display_mode ivo_m133nwf4_r0_mode = { +	.clock = 138778, +	.hdisplay = 1920, +	.hsync_start = 1920 + 24, +	.hsync_end = 1920 + 24 + 48, +	.htotal = 1920 + 24 + 48 + 88, +	.vdisplay = 1080, +	.vsync_start = 1080 + 3, +	.vsync_end = 1080 + 3 + 12, +	.vtotal = 1080 + 3 + 12 + 17, +	.vrefresh = 60, +	.flags = DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC, +}; + +static const struct panel_desc ivo_m133nwf4_r0 = { +	.modes = &ivo_m133nwf4_r0_mode, +	.num_modes = 1, +	.bpc = 8, +	.size = { +		.width = 294, +		.height = 165, +	}, +	.delay = { +		.hpd_absent_delay = 200, +		.unprepare = 500, +	}, +	.bus_format = MEDIA_BUS_FMT_RGB888_1X24, +	.bus_flags = DRM_BUS_FLAG_DATA_MSB_TO_LSB, +	.connector_type = DRM_MODE_CONNECTOR_eDP, +}; +  static const struct display_timing koe_tx14d24vm1bpa_timing = {  	.pixelclock = { 5580000, 5850000, 6200000 },  	.hactive = { 320, 320, 320 }, @@ -2168,6 +2365,7 @@ static const struct panel_desc lg_lp120up1 = {  		.width = 267,  		.height = 183,  	}, +	.connector_type = DRM_MODE_CONNECTOR_eDP,  };  static const struct drm_display_mode lg_lp129qe_mode = { @@ -3065,6 +3263,32 @@ static const struct panel_desc shelly_sca07010_bfn_lnn = {  	.bus_format = MEDIA_BUS_FMT_RGB666_1X18,  }; +static const struct drm_display_mode starry_kr070pe2t_mode = { +	.clock = 33000, +	.hdisplay = 800, +	.hsync_start = 800 + 209, +	.hsync_end = 800 + 209 + 1, +	.htotal = 800 + 209 + 1 + 45, +	.vdisplay = 480, +	.vsync_start = 480 + 22, +	.vsync_end = 480 + 22 + 1, +	.vtotal = 480 + 22 + 1 + 22, +	.vrefresh = 60, +}; + +static const struct panel_desc starry_kr070pe2t = { +	.modes = &starry_kr070pe2t_mode, +	.num_modes = 1, +	.bpc = 8, +	.size = { +		.width = 152, +		.height = 86, +	}, +	.bus_format = MEDIA_BUS_FMT_RGB888_1X24, +	.bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_PIXDATA_DRIVE_NEGEDGE, +	.connector_type = DRM_MODE_CONNECTOR_LVDS, +}; +  static const struct drm_display_mode starry_kr122ea0sra_mode = {  	.clock = 147000,  	.hdisplay = 1920, @@ -3455,12 +3679,21 @@ static const struct of_device_id platform_of_match[] = {  		.compatible = "auo,g104sn02",  		.data = &auo_g104sn02,  	}, { +		.compatible = "auo,g121ean01", +		.data = &auo_g121ean01, +	}, {  		.compatible = "auo,g133han01",  		.data = &auo_g133han01,  	}, { +		.compatible = "auo,g156xtn01", +		.data = &auo_g156xtn01, +	}, {  		.compatible = "auo,g185han01",  		.data = &auo_g185han01,  	}, { +		.compatible = "auo,g190ean01", +		.data = &auo_g190ean01, +	}, {  		.compatible = "auo,p320hvn03",  		.data = &auo_p320hvn03,  	}, { @@ -3479,6 +3712,12 @@ static const struct of_device_id platform_of_match[] = {  		.compatible = "boe,nv101wxmn51",  		.data = &boe_nv101wxmn51,  	}, { +		.compatible = "boe,nv133fhm-n61", +		.data = &boe_nv133fhm_n61, +	}, { +		.compatible = "boe,nv133fhm-n62", +		.data = &boe_nv133fhm_n61, +	}, {  		.compatible = "boe,nv140fhmn49",  		.data = &boe_nv140fhmn49,  	}, { @@ -3587,6 +3826,9 @@ static const struct of_device_id platform_of_match[] = {  		.compatible = "innolux,zj070na-01p",  		.data = &innolux_zj070na_01p,  	}, { +		.compatible = "ivo,m133nwf4-r0", +		.data = &ivo_m133nwf4_r0, +	}, {  		.compatible = "koe,tx14d24vm1bpa",  		.data = &koe_tx14d24vm1bpa,  	}, { @@ -3716,6 +3958,9 @@ static const struct of_device_id platform_of_match[] = {  		.compatible = "shelly,sca07010-bfn-lnn",  		.data = &shelly_sca07010_bfn_lnn,  	}, { +		.compatible = "starry,kr070pe2t", +		.data = &starry_kr070pe2t, +	}, {  		.compatible = "starry,kr122ea0sra",  		.data = &starry_kr122ea0sra,  	}, { | 
