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