xref: /OK3568_Linux_fs/kernel/drivers/gpu/drm/gma500/psb_intel_modes.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-only
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Copyright (c) 2007 Intel Corporation
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Authers: Jesse Barnes <jesse.barnes@intel.com>
6*4882a593Smuzhiyun  */
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun #include <linux/i2c.h>
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun #include "psb_intel_drv.h"
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun /**
13*4882a593Smuzhiyun  * psb_intel_ddc_probe
14*4882a593Smuzhiyun  *
15*4882a593Smuzhiyun  */
psb_intel_ddc_probe(struct i2c_adapter * adapter)16*4882a593Smuzhiyun bool psb_intel_ddc_probe(struct i2c_adapter *adapter)
17*4882a593Smuzhiyun {
18*4882a593Smuzhiyun 	u8 out_buf[] = { 0x0, 0x0 };
19*4882a593Smuzhiyun 	u8 buf[2];
20*4882a593Smuzhiyun 	int ret;
21*4882a593Smuzhiyun 	struct i2c_msg msgs[] = {
22*4882a593Smuzhiyun 		{
23*4882a593Smuzhiyun 		 .addr = 0x50,
24*4882a593Smuzhiyun 		 .flags = 0,
25*4882a593Smuzhiyun 		 .len = 1,
26*4882a593Smuzhiyun 		 .buf = out_buf,
27*4882a593Smuzhiyun 		 },
28*4882a593Smuzhiyun 		{
29*4882a593Smuzhiyun 		 .addr = 0x50,
30*4882a593Smuzhiyun 		 .flags = I2C_M_RD,
31*4882a593Smuzhiyun 		 .len = 1,
32*4882a593Smuzhiyun 		 .buf = buf,
33*4882a593Smuzhiyun 		 }
34*4882a593Smuzhiyun 	};
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun 	ret = i2c_transfer(adapter, msgs, 2);
37*4882a593Smuzhiyun 	if (ret == 2)
38*4882a593Smuzhiyun 		return true;
39*4882a593Smuzhiyun 
40*4882a593Smuzhiyun 	return false;
41*4882a593Smuzhiyun }
42*4882a593Smuzhiyun 
43*4882a593Smuzhiyun /**
44*4882a593Smuzhiyun  * psb_intel_ddc_get_modes - get modelist from monitor
45*4882a593Smuzhiyun  * @connector: DRM connector device to use
46*4882a593Smuzhiyun  *
47*4882a593Smuzhiyun  * Fetch the EDID information from @connector using the DDC bus.
48*4882a593Smuzhiyun  */
psb_intel_ddc_get_modes(struct drm_connector * connector,struct i2c_adapter * adapter)49*4882a593Smuzhiyun int psb_intel_ddc_get_modes(struct drm_connector *connector,
50*4882a593Smuzhiyun 			    struct i2c_adapter *adapter)
51*4882a593Smuzhiyun {
52*4882a593Smuzhiyun 	struct edid *edid;
53*4882a593Smuzhiyun 	int ret = 0;
54*4882a593Smuzhiyun 
55*4882a593Smuzhiyun 	edid = drm_get_edid(connector, adapter);
56*4882a593Smuzhiyun 	if (edid) {
57*4882a593Smuzhiyun 		drm_connector_update_edid_property(connector, edid);
58*4882a593Smuzhiyun 		ret = drm_add_edid_modes(connector, edid);
59*4882a593Smuzhiyun 		kfree(edid);
60*4882a593Smuzhiyun 	}
61*4882a593Smuzhiyun 	return ret;
62*4882a593Smuzhiyun }
63