189c78134cc54dff016c83367912eb055637fa50cAlan Cox/*
289c78134cc54dff016c83367912eb055637fa50cAlan Cox * Copyright (c) 2007 Intel Corporation
389c78134cc54dff016c83367912eb055637fa50cAlan Cox *
489c78134cc54dff016c83367912eb055637fa50cAlan Cox * This program is free software; you can redistribute it and/or modify it
589c78134cc54dff016c83367912eb055637fa50cAlan Cox * under the terms and conditions of the GNU General Public License,
689c78134cc54dff016c83367912eb055637fa50cAlan Cox * version 2, as published by the Free Software Foundation.
789c78134cc54dff016c83367912eb055637fa50cAlan Cox *
889c78134cc54dff016c83367912eb055637fa50cAlan Cox * This program is distributed in the hope it will be useful, but WITHOUT
989c78134cc54dff016c83367912eb055637fa50cAlan Cox * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1089c78134cc54dff016c83367912eb055637fa50cAlan Cox * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
1189c78134cc54dff016c83367912eb055637fa50cAlan Cox * more details.
1289c78134cc54dff016c83367912eb055637fa50cAlan Cox *
1389c78134cc54dff016c83367912eb055637fa50cAlan Cox * You should have received a copy of the GNU General Public License along with
1489c78134cc54dff016c83367912eb055637fa50cAlan Cox * this program; if not, write to the Free Software Foundation, Inc.,
1589c78134cc54dff016c83367912eb055637fa50cAlan Cox * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
1689c78134cc54dff016c83367912eb055637fa50cAlan Cox *
1789c78134cc54dff016c83367912eb055637fa50cAlan Cox * Authers: Jesse Barnes <jesse.barnes@intel.com>
1889c78134cc54dff016c83367912eb055637fa50cAlan Cox */
1989c78134cc54dff016c83367912eb055637fa50cAlan Cox
2089c78134cc54dff016c83367912eb055637fa50cAlan Cox#include <linux/i2c.h>
2189c78134cc54dff016c83367912eb055637fa50cAlan Cox#include <linux/fb.h>
2289c78134cc54dff016c83367912eb055637fa50cAlan Cox#include <drm/drmP.h>
2389c78134cc54dff016c83367912eb055637fa50cAlan Cox#include "psb_intel_drv.h"
2489c78134cc54dff016c83367912eb055637fa50cAlan Cox
2589c78134cc54dff016c83367912eb055637fa50cAlan Cox/**
2689c78134cc54dff016c83367912eb055637fa50cAlan Cox * psb_intel_ddc_probe
2789c78134cc54dff016c83367912eb055637fa50cAlan Cox *
2889c78134cc54dff016c83367912eb055637fa50cAlan Cox */
29352b16a0e16eb29fd268dafab7816bf85bfc4d21Patrik Jakobssonbool psb_intel_ddc_probe(struct i2c_adapter *adapter)
3089c78134cc54dff016c83367912eb055637fa50cAlan Cox{
3189c78134cc54dff016c83367912eb055637fa50cAlan Cox	u8 out_buf[] = { 0x0, 0x0 };
3289c78134cc54dff016c83367912eb055637fa50cAlan Cox	u8 buf[2];
3389c78134cc54dff016c83367912eb055637fa50cAlan Cox	int ret;
3489c78134cc54dff016c83367912eb055637fa50cAlan Cox	struct i2c_msg msgs[] = {
3589c78134cc54dff016c83367912eb055637fa50cAlan Cox		{
3689c78134cc54dff016c83367912eb055637fa50cAlan Cox		 .addr = 0x50,
3789c78134cc54dff016c83367912eb055637fa50cAlan Cox		 .flags = 0,
3889c78134cc54dff016c83367912eb055637fa50cAlan Cox		 .len = 1,
3989c78134cc54dff016c83367912eb055637fa50cAlan Cox		 .buf = out_buf,
4089c78134cc54dff016c83367912eb055637fa50cAlan Cox		 },
4189c78134cc54dff016c83367912eb055637fa50cAlan Cox		{
4289c78134cc54dff016c83367912eb055637fa50cAlan Cox		 .addr = 0x50,
4389c78134cc54dff016c83367912eb055637fa50cAlan Cox		 .flags = I2C_M_RD,
4489c78134cc54dff016c83367912eb055637fa50cAlan Cox		 .len = 1,
4589c78134cc54dff016c83367912eb055637fa50cAlan Cox		 .buf = buf,
4689c78134cc54dff016c83367912eb055637fa50cAlan Cox		 }
4789c78134cc54dff016c83367912eb055637fa50cAlan Cox	};
4889c78134cc54dff016c83367912eb055637fa50cAlan Cox
49352b16a0e16eb29fd268dafab7816bf85bfc4d21Patrik Jakobsson	ret = i2c_transfer(adapter, msgs, 2);
5089c78134cc54dff016c83367912eb055637fa50cAlan Cox	if (ret == 2)
5189c78134cc54dff016c83367912eb055637fa50cAlan Cox		return true;
5289c78134cc54dff016c83367912eb055637fa50cAlan Cox
5389c78134cc54dff016c83367912eb055637fa50cAlan Cox	return false;
5489c78134cc54dff016c83367912eb055637fa50cAlan Cox}
5589c78134cc54dff016c83367912eb055637fa50cAlan Cox
5689c78134cc54dff016c83367912eb055637fa50cAlan Cox/**
5789c78134cc54dff016c83367912eb055637fa50cAlan Cox * psb_intel_ddc_get_modes - get modelist from monitor
5889c78134cc54dff016c83367912eb055637fa50cAlan Cox * @connector: DRM connector device to use
5989c78134cc54dff016c83367912eb055637fa50cAlan Cox *
6089c78134cc54dff016c83367912eb055637fa50cAlan Cox * Fetch the EDID information from @connector using the DDC bus.
6189c78134cc54dff016c83367912eb055637fa50cAlan Cox */
62352b16a0e16eb29fd268dafab7816bf85bfc4d21Patrik Jakobssonint psb_intel_ddc_get_modes(struct drm_connector *connector,
63352b16a0e16eb29fd268dafab7816bf85bfc4d21Patrik Jakobsson			    struct i2c_adapter *adapter)
6489c78134cc54dff016c83367912eb055637fa50cAlan Cox{
6589c78134cc54dff016c83367912eb055637fa50cAlan Cox	struct edid *edid;
6689c78134cc54dff016c83367912eb055637fa50cAlan Cox	int ret = 0;
6789c78134cc54dff016c83367912eb055637fa50cAlan Cox
68352b16a0e16eb29fd268dafab7816bf85bfc4d21Patrik Jakobsson	edid = drm_get_edid(connector, adapter);
6989c78134cc54dff016c83367912eb055637fa50cAlan Cox	if (edid) {
70352b16a0e16eb29fd268dafab7816bf85bfc4d21Patrik Jakobsson		drm_mode_connector_update_edid_property(connector, edid);
71352b16a0e16eb29fd268dafab7816bf85bfc4d21Patrik Jakobsson		ret = drm_add_edid_modes(connector, edid);
7289c78134cc54dff016c83367912eb055637fa50cAlan Cox		kfree(edid);
7389c78134cc54dff016c83367912eb055637fa50cAlan Cox	}
7489c78134cc54dff016c83367912eb055637fa50cAlan Cox	return ret;
7589c78134cc54dff016c83367912eb055637fa50cAlan Cox}
76