18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * Copyright (c) 2007 Intel Corporation
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci * Authers: Jesse Barnes <jesse.barnes@intel.com>
68c2ecf20Sopenharmony_ci */
78c2ecf20Sopenharmony_ci
88c2ecf20Sopenharmony_ci#include <linux/i2c.h>
98c2ecf20Sopenharmony_ci
108c2ecf20Sopenharmony_ci#include "psb_intel_drv.h"
118c2ecf20Sopenharmony_ci
128c2ecf20Sopenharmony_ci/**
138c2ecf20Sopenharmony_ci * psb_intel_ddc_probe
148c2ecf20Sopenharmony_ci *
158c2ecf20Sopenharmony_ci */
168c2ecf20Sopenharmony_cibool psb_intel_ddc_probe(struct i2c_adapter *adapter)
178c2ecf20Sopenharmony_ci{
188c2ecf20Sopenharmony_ci	u8 out_buf[] = { 0x0, 0x0 };
198c2ecf20Sopenharmony_ci	u8 buf[2];
208c2ecf20Sopenharmony_ci	int ret;
218c2ecf20Sopenharmony_ci	struct i2c_msg msgs[] = {
228c2ecf20Sopenharmony_ci		{
238c2ecf20Sopenharmony_ci		 .addr = 0x50,
248c2ecf20Sopenharmony_ci		 .flags = 0,
258c2ecf20Sopenharmony_ci		 .len = 1,
268c2ecf20Sopenharmony_ci		 .buf = out_buf,
278c2ecf20Sopenharmony_ci		 },
288c2ecf20Sopenharmony_ci		{
298c2ecf20Sopenharmony_ci		 .addr = 0x50,
308c2ecf20Sopenharmony_ci		 .flags = I2C_M_RD,
318c2ecf20Sopenharmony_ci		 .len = 1,
328c2ecf20Sopenharmony_ci		 .buf = buf,
338c2ecf20Sopenharmony_ci		 }
348c2ecf20Sopenharmony_ci	};
358c2ecf20Sopenharmony_ci
368c2ecf20Sopenharmony_ci	ret = i2c_transfer(adapter, msgs, 2);
378c2ecf20Sopenharmony_ci	if (ret == 2)
388c2ecf20Sopenharmony_ci		return true;
398c2ecf20Sopenharmony_ci
408c2ecf20Sopenharmony_ci	return false;
418c2ecf20Sopenharmony_ci}
428c2ecf20Sopenharmony_ci
438c2ecf20Sopenharmony_ci/**
448c2ecf20Sopenharmony_ci * psb_intel_ddc_get_modes - get modelist from monitor
458c2ecf20Sopenharmony_ci * @connector: DRM connector device to use
468c2ecf20Sopenharmony_ci *
478c2ecf20Sopenharmony_ci * Fetch the EDID information from @connector using the DDC bus.
488c2ecf20Sopenharmony_ci */
498c2ecf20Sopenharmony_ciint psb_intel_ddc_get_modes(struct drm_connector *connector,
508c2ecf20Sopenharmony_ci			    struct i2c_adapter *adapter)
518c2ecf20Sopenharmony_ci{
528c2ecf20Sopenharmony_ci	struct edid *edid;
538c2ecf20Sopenharmony_ci	int ret = 0;
548c2ecf20Sopenharmony_ci
558c2ecf20Sopenharmony_ci	edid = drm_get_edid(connector, adapter);
568c2ecf20Sopenharmony_ci	if (edid) {
578c2ecf20Sopenharmony_ci		drm_connector_update_edid_property(connector, edid);
588c2ecf20Sopenharmony_ci		ret = drm_add_edid_modes(connector, edid);
598c2ecf20Sopenharmony_ci		kfree(edid);
608c2ecf20Sopenharmony_ci	}
618c2ecf20Sopenharmony_ci	return ret;
628c2ecf20Sopenharmony_ci}
63