dvo_ch7017.c revision f9c10a9b96a31b4a82a4fa807400c04f00284068
179e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes/* 279e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes * Copyright © 2006 Intel Corporation 379e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes * 479e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes * Permission is hereby granted, free of charge, to any person obtaining a 579e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes * copy of this software and associated documentation files (the "Software"), 679e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes * to deal in the Software without restriction, including without limitation 779e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes * the rights to use, copy, modify, merge, publish, distribute, sublicense, 879e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes * and/or sell copies of the Software, and to permit persons to whom the 979e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes * Software is furnished to do so, subject to the following conditions: 1079e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes * 1179e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes * The above copyright notice and this permission notice (including the next 1279e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes * paragraph) shall be included in all copies or substantial portions of the 1379e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes * Software. 1479e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes * 1579e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1679e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1779e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 1879e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 1979e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 2079e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 2179e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes * DEALINGS IN THE SOFTWARE. 2279e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes * 2379e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes * Authors: 2479e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes * Eric Anholt <eric@anholt.net> 2579e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes * 2679e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes */ 2779e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes 2879e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#include "dvo.h" 2979e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes 3079e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_TV_DISPLAY_MODE 0x00 3179e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_FLICKER_FILTER 0x01 3279e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_VIDEO_BANDWIDTH 0x02 3379e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_TEXT_ENHANCEMENT 0x03 3479e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_START_ACTIVE_VIDEO 0x04 3579e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_HORIZONTAL_POSITION 0x05 3679e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_VERTICAL_POSITION 0x06 3779e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_BLACK_LEVEL 0x07 3879e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_CONTRAST_ENHANCEMENT 0x08 3979e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_TV_PLL 0x09 4079e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_TV_PLL_M 0x0a 4179e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_TV_PLL_N 0x0b 4279e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_SUB_CARRIER_0 0x0c 4379e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_CIV_CONTROL 0x10 4479e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_CIV_0 0x11 4579e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_CHROMA_BOOST 0x14 4679e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_CLOCK_MODE 0x1c 4779e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_INPUT_CLOCK 0x1d 4879e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_GPIO_CONTROL 0x1e 4979e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_INPUT_DATA_FORMAT 0x1f 5079e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_CONNECTION_DETECT 0x20 5179e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_DAC_CONTROL 0x21 5279e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_BUFFERED_CLOCK_OUTPUT 0x22 5379e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_DEFEAT_VSYNC 0x47 5479e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_TEST_PATTERN 0x48 5579e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes 5679e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_POWER_MANAGEMENT 0x49 5779e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes/** Enables the TV output path. */ 5879e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_TV_EN (1 << 0) 5979e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_DAC0_POWER_DOWN (1 << 1) 6079e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_DAC1_POWER_DOWN (1 << 2) 6179e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_DAC2_POWER_DOWN (1 << 3) 6279e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_DAC3_POWER_DOWN (1 << 4) 6379e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes/** Powers down the TV out block, and DAC0-3 */ 6479e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_TV_POWER_DOWN_EN (1 << 5) 6579e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes 6679e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_VERSION_ID 0x4a 6779e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes 6879e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_DEVICE_ID 0x4b 6979e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_DEVICE_ID_VALUE 0x1b 7079e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7018_DEVICE_ID_VALUE 0x1a 7179e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7019_DEVICE_ID_VALUE 0x19 7279e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes 7379e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_XCLK_D2_ADJUST 0x53 7479e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_UP_SCALER_COEFF_0 0x55 7579e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_UP_SCALER_COEFF_1 0x56 7679e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_UP_SCALER_COEFF_2 0x57 7779e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_UP_SCALER_COEFF_3 0x58 7879e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_UP_SCALER_COEFF_4 0x59 7979e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_UP_SCALER_VERTICAL_INC_0 0x5a 8079e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_UP_SCALER_VERTICAL_INC_1 0x5b 8179e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_GPIO_INVERT 0x5c 8279e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_UP_SCALER_HORIZONTAL_INC_0 0x5d 8379e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_UP_SCALER_HORIZONTAL_INC_1 0x5e 8479e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes 8579e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_HORIZONTAL_ACTIVE_PIXEL_INPUT 0x5f 8679e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes/**< Low bits of horizontal active pixel input */ 8779e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes 8879e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_ACTIVE_INPUT_LINE_OUTPUT 0x60 8979e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes/** High bits of horizontal active pixel input */ 9079e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_LVDS_HAP_INPUT_MASK (0x7 << 0) 9179e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes/** High bits of vertical active line output */ 9279e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_LVDS_VAL_HIGH_MASK (0x7 << 3) 9379e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes 9479e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_VERTICAL_ACTIVE_LINE_OUTPUT 0x61 9579e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes/**< Low bits of vertical active line output */ 9679e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes 9779e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_HORIZONTAL_ACTIVE_PIXEL_OUTPUT 0x62 9879e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes/**< Low bits of horizontal active pixel output */ 9979e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes 10079e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_LVDS_POWER_DOWN 0x63 10179e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes/** High bits of horizontal active pixel output */ 10279e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_LVDS_HAP_HIGH_MASK (0x7 << 0) 10379e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes/** Enables the LVDS power down state transition */ 10479e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_LVDS_POWER_DOWN_EN (1 << 6) 10579e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes/** Enables the LVDS upscaler */ 10679e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_LVDS_UPSCALER_EN (1 << 7) 10779e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_LVDS_POWER_DOWN_DEFAULT_RESERVED 0x08 10879e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes 10979e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_LVDS_ENCODING 0x64 11079e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_LVDS_DITHER_2D (1 << 2) 11179e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_LVDS_DITHER_DIS (1 << 3) 11279e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_LVDS_DUAL_CHANNEL_EN (1 << 4) 11379e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_LVDS_24_BIT (1 << 5) 11479e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes 11579e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_LVDS_ENCODING_2 0x65 11679e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes 11779e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_LVDS_PLL_CONTROL 0x66 11879e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes/** Enables the LVDS panel output path */ 11979e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_LVDS_PANEN (1 << 0) 12079e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes/** Enables the LVDS panel backlight */ 12179e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_LVDS_BKLEN (1 << 3) 12279e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes 12379e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_POWER_SEQUENCING_T1 0x67 12479e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_POWER_SEQUENCING_T2 0x68 12579e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_POWER_SEQUENCING_T3 0x69 12679e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_POWER_SEQUENCING_T4 0x6a 12779e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_POWER_SEQUENCING_T5 0x6b 12879e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_GPIO_DRIVER_TYPE 0x6c 12979e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_GPIO_DATA 0x6d 13079e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_GPIO_DIRECTION_CONTROL 0x6e 13179e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes 13279e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_LVDS_PLL_FEEDBACK_DIV 0x71 13379e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes# define CH7017_LVDS_PLL_FEED_BACK_DIVIDER_SHIFT 4 13479e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes# define CH7017_LVDS_PLL_FEED_FORWARD_DIVIDER_SHIFT 0 13579e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes# define CH7017_LVDS_PLL_FEEDBACK_DEFAULT_RESERVED 0x80 13679e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes 13779e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_LVDS_PLL_VCO_CONTROL 0x72 13879e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes# define CH7017_LVDS_PLL_VCO_DEFAULT_RESERVED 0x80 13979e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes# define CH7017_LVDS_PLL_VCO_SHIFT 4 14079e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes# define CH7017_LVDS_PLL_POST_SCALE_DIV_SHIFT 0 14179e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes 14279e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_OUTPUTS_ENABLE 0x73 14379e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes# define CH7017_CHARGE_PUMP_LOW 0x0 14479e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes# define CH7017_CHARGE_PUMP_HIGH 0x3 14579e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes# define CH7017_LVDS_CHANNEL_A (1 << 3) 14679e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes# define CH7017_LVDS_CHANNEL_B (1 << 4) 14779e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes# define CH7017_TV_DAC_A (1 << 5) 14879e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes# define CH7017_TV_DAC_B (1 << 6) 14979e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes# define CH7017_DDC_SELECT_DC2 (1 << 7) 15079e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes 15179e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_LVDS_OUTPUT_AMPLITUDE 0x74 15279e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_LVDS_PLL_EMI_REDUCTION 0x75 15379e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_LVDS_POWER_DOWN_FLICKER 0x76 15479e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes 15579e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_LVDS_CONTROL_2 0x78 15679e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes# define CH7017_LOOP_FILTER_SHIFT 5 15779e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes# define CH7017_PHASE_DETECTOR_SHIFT 0 15879e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes 15979e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define CH7017_BANG_LIMIT_CONTROL 0x7f 16079e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes 16179e539453b34e35f39299a899d263b0a1f1670bdJesse Barnesstruct ch7017_priv { 16279e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes uint8_t save_hapi; 16379e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes uint8_t save_vali; 16479e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes uint8_t save_valo; 16579e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes uint8_t save_ailo; 16679e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes uint8_t save_lvds_pll_vco; 16779e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes uint8_t save_feedback_div; 16879e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes uint8_t save_lvds_control_2; 16979e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes uint8_t save_outputs_enable; 17079e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes uint8_t save_lvds_power_down; 17179e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes uint8_t save_power_management; 17279e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes}; 17379e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes 17479e539453b34e35f39299a899d263b0a1f1670bdJesse Barnesstatic void ch7017_dump_regs(struct intel_dvo_device *dvo); 17579e539453b34e35f39299a899d263b0a1f1670bdJesse Barnesstatic void ch7017_dpms(struct intel_dvo_device *dvo, int mode); 17679e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes 17779e539453b34e35f39299a899d263b0a1f1670bdJesse Barnesstatic bool ch7017_read(struct intel_dvo_device *dvo, int addr, uint8_t *val) 17879e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes{ 179f9c10a9b96a31b4a82a4fa807400c04f00284068Keith Packard struct i2c_adapter *adapter = dvo->i2c_bus; 180f9c10a9b96a31b4a82a4fa807400c04f00284068Keith Packard struct intel_i2c_chan *i2cbus = container_of(adapter, struct intel_i2c_chan, adapter); 18179e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes u8 out_buf[2]; 18279e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes u8 in_buf[2]; 18379e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes 18479e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes struct i2c_msg msgs[] = { 18579e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes { 186f9c10a9b96a31b4a82a4fa807400c04f00284068Keith Packard .addr = dvo->slave_addr, 18779e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes .flags = 0, 18879e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes .len = 1, 18979e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes .buf = out_buf, 19079e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes }, 19179e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes { 192f9c10a9b96a31b4a82a4fa807400c04f00284068Keith Packard .addr = dvo->slave_addr, 19379e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes .flags = I2C_M_RD, 19479e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes .len = 1, 19579e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes .buf = in_buf, 19679e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes } 19779e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes }; 19879e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes 19979e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes out_buf[0] = addr; 20079e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes out_buf[1] = 0; 20179e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes 20279e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes if (i2c_transfer(&i2cbus->adapter, msgs, 2) == 2) { 20379e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes *val= in_buf[0]; 20479e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes return true; 20579e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes }; 20679e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes 20779e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes return false; 20879e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes} 20979e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes 21079e539453b34e35f39299a899d263b0a1f1670bdJesse Barnesstatic bool ch7017_write(struct intel_dvo_device *dvo, int addr, uint8_t val) 21179e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes{ 212f9c10a9b96a31b4a82a4fa807400c04f00284068Keith Packard struct i2c_adapter *adapter = dvo->i2c_bus; 213f9c10a9b96a31b4a82a4fa807400c04f00284068Keith Packard struct intel_i2c_chan *i2cbus = container_of(adapter, struct intel_i2c_chan, adapter); 21479e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes uint8_t out_buf[2]; 21579e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes struct i2c_msg msg = { 216f9c10a9b96a31b4a82a4fa807400c04f00284068Keith Packard .addr = dvo->slave_addr, 21779e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes .flags = 0, 21879e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes .len = 2, 21979e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes .buf = out_buf, 22079e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes }; 22179e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes 22279e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes out_buf[0] = addr; 22379e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes out_buf[1] = val; 22479e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes 22579e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes if (i2c_transfer(&i2cbus->adapter, &msg, 1) == 1) 22679e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes return true; 22779e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes 22879e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes return false; 22979e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes} 23079e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes 23179e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes/** Probes for a CH7017 on the given bus and slave address. */ 23279e539453b34e35f39299a899d263b0a1f1670bdJesse Barnesstatic bool ch7017_init(struct intel_dvo_device *dvo, 233f9c10a9b96a31b4a82a4fa807400c04f00284068Keith Packard struct i2c_adapter *adapter) 23479e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes{ 235f9c10a9b96a31b4a82a4fa807400c04f00284068Keith Packard struct intel_i2c_chan *i2cbus = container_of(adapter, struct intel_i2c_chan, adapter); 23679e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes struct ch7017_priv *priv; 23779e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes uint8_t val; 23879e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes 23979e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes priv = kzalloc(sizeof(struct ch7017_priv), GFP_KERNEL); 24079e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes if (priv == NULL) 24179e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes return false; 24279e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes 243f9c10a9b96a31b4a82a4fa807400c04f00284068Keith Packard dvo->i2c_bus = adapter; 24479e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes dvo->dev_priv = priv; 24579e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes 24679e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes if (!ch7017_read(dvo, CH7017_DEVICE_ID, &val)) 24779e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes goto fail; 24879e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes 24979e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes if (val != CH7017_DEVICE_ID_VALUE && 25079e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes val != CH7018_DEVICE_ID_VALUE && 25179e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes val != CH7019_DEVICE_ID_VALUE) { 25279e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes DRM_DEBUG("ch701x not detected, got %d: from %s Slave %d.\n", 253f9c10a9b96a31b4a82a4fa807400c04f00284068Keith Packard val, i2cbus->adapter.name,dvo->slave_addr); 25479e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes goto fail; 25579e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes } 25679e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes 25779e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes return true; 25879e539453b34e35f39299a899d263b0a1f1670bdJesse Barnesfail: 25979e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes kfree(priv); 26079e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes return false; 26179e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes} 26279e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes 26379e539453b34e35f39299a899d263b0a1f1670bdJesse Barnesstatic enum drm_connector_status ch7017_detect(struct intel_dvo_device *dvo) 26479e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes{ 26579e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes return connector_status_unknown; 26679e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes} 26779e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes 26879e539453b34e35f39299a899d263b0a1f1670bdJesse Barnesstatic enum drm_mode_status ch7017_mode_valid(struct intel_dvo_device *dvo, 26979e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes struct drm_display_mode *mode) 27079e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes{ 27179e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes if (mode->clock > 160000) 27279e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes return MODE_CLOCK_HIGH; 27379e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes 27479e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes return MODE_OK; 27579e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes} 27679e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes 27779e539453b34e35f39299a899d263b0a1f1670bdJesse Barnesstatic void ch7017_mode_set(struct intel_dvo_device *dvo, 27879e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes struct drm_display_mode *mode, 27979e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes struct drm_display_mode *adjusted_mode) 28079e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes{ 28179e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes uint8_t lvds_pll_feedback_div, lvds_pll_vco_control; 28279e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes uint8_t outputs_enable, lvds_control_2, lvds_power_down; 28379e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes uint8_t horizontal_active_pixel_input; 28479e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes uint8_t horizontal_active_pixel_output, vertical_active_line_output; 28579e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes uint8_t active_input_line_output; 28679e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes 28779e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes DRM_DEBUG("Registers before mode setting\n"); 28879e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes ch7017_dump_regs(dvo); 28979e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes 29079e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes /* LVDS PLL settings from page 75 of 7017-7017ds.pdf*/ 29179e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes if (mode->clock < 100000) { 29279e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes outputs_enable = CH7017_LVDS_CHANNEL_A | CH7017_CHARGE_PUMP_LOW; 29379e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes lvds_pll_feedback_div = CH7017_LVDS_PLL_FEEDBACK_DEFAULT_RESERVED | 29479e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes (2 << CH7017_LVDS_PLL_FEED_BACK_DIVIDER_SHIFT) | 29579e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes (13 << CH7017_LVDS_PLL_FEED_FORWARD_DIVIDER_SHIFT); 29679e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes lvds_pll_vco_control = CH7017_LVDS_PLL_VCO_DEFAULT_RESERVED | 29779e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes (2 << CH7017_LVDS_PLL_VCO_SHIFT) | 29879e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes (3 << CH7017_LVDS_PLL_POST_SCALE_DIV_SHIFT); 29979e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes lvds_control_2 = (1 << CH7017_LOOP_FILTER_SHIFT) | 30079e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes (0 << CH7017_PHASE_DETECTOR_SHIFT); 30179e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes } else { 30279e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes outputs_enable = CH7017_LVDS_CHANNEL_A | CH7017_CHARGE_PUMP_HIGH; 30379e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes lvds_pll_feedback_div = CH7017_LVDS_PLL_FEEDBACK_DEFAULT_RESERVED | 30479e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes (2 << CH7017_LVDS_PLL_FEED_BACK_DIVIDER_SHIFT) | 30579e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes (3 << CH7017_LVDS_PLL_FEED_FORWARD_DIVIDER_SHIFT); 30679e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes lvds_pll_feedback_div = 35; 30779e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes lvds_control_2 = (3 << CH7017_LOOP_FILTER_SHIFT) | 30879e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes (0 << CH7017_PHASE_DETECTOR_SHIFT); 30979e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes if (1) { /* XXX: dual channel panel detection. Assume yes for now. */ 31079e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes outputs_enable |= CH7017_LVDS_CHANNEL_B; 31179e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes lvds_pll_vco_control = CH7017_LVDS_PLL_VCO_DEFAULT_RESERVED | 31279e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes (2 << CH7017_LVDS_PLL_VCO_SHIFT) | 31379e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes (13 << CH7017_LVDS_PLL_POST_SCALE_DIV_SHIFT); 31479e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes } else { 31579e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes lvds_pll_vco_control = CH7017_LVDS_PLL_VCO_DEFAULT_RESERVED | 31679e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes (1 << CH7017_LVDS_PLL_VCO_SHIFT) | 31779e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes (13 << CH7017_LVDS_PLL_POST_SCALE_DIV_SHIFT); 31879e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes } 31979e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes } 32079e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes 32179e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes horizontal_active_pixel_input = mode->hdisplay & 0x00ff; 32279e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes 32379e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes vertical_active_line_output = mode->vdisplay & 0x00ff; 32479e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes horizontal_active_pixel_output = mode->hdisplay & 0x00ff; 32579e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes 32679e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes active_input_line_output = ((mode->hdisplay & 0x0700) >> 8) | 32779e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes (((mode->vdisplay & 0x0700) >> 8) << 3); 32879e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes 32979e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes lvds_power_down = CH7017_LVDS_POWER_DOWN_DEFAULT_RESERVED | 33079e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes (mode->hdisplay & 0x0700) >> 8; 33179e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes 33279e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes ch7017_dpms(dvo, DRM_MODE_DPMS_OFF); 33379e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes ch7017_write(dvo, CH7017_HORIZONTAL_ACTIVE_PIXEL_INPUT, 33479e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes horizontal_active_pixel_input); 33579e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes ch7017_write(dvo, CH7017_HORIZONTAL_ACTIVE_PIXEL_OUTPUT, 33679e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes horizontal_active_pixel_output); 33779e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes ch7017_write(dvo, CH7017_VERTICAL_ACTIVE_LINE_OUTPUT, 33879e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes vertical_active_line_output); 33979e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes ch7017_write(dvo, CH7017_ACTIVE_INPUT_LINE_OUTPUT, 34079e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes active_input_line_output); 34179e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes ch7017_write(dvo, CH7017_LVDS_PLL_VCO_CONTROL, lvds_pll_vco_control); 34279e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes ch7017_write(dvo, CH7017_LVDS_PLL_FEEDBACK_DIV, lvds_pll_feedback_div); 34379e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes ch7017_write(dvo, CH7017_LVDS_CONTROL_2, lvds_control_2); 34479e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes ch7017_write(dvo, CH7017_OUTPUTS_ENABLE, outputs_enable); 34579e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes 34679e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes /* Turn the LVDS back on with new settings. */ 34779e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes ch7017_write(dvo, CH7017_LVDS_POWER_DOWN, lvds_power_down); 34879e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes 34979e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes DRM_DEBUG("Registers after mode setting\n"); 35079e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes ch7017_dump_regs(dvo); 35179e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes} 35279e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes 35379e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes/* set the CH7017 power state */ 35479e539453b34e35f39299a899d263b0a1f1670bdJesse Barnesstatic void ch7017_dpms(struct intel_dvo_device *dvo, int mode) 35579e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes{ 35679e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes uint8_t val; 35779e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes 35879e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes ch7017_read(dvo, CH7017_LVDS_POWER_DOWN, &val); 35979e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes 36079e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes /* Turn off TV/VGA, and never turn it on since we don't support it. */ 36179e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes ch7017_write(dvo, CH7017_POWER_MANAGEMENT, 36279e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes CH7017_DAC0_POWER_DOWN | 36379e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes CH7017_DAC1_POWER_DOWN | 36479e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes CH7017_DAC2_POWER_DOWN | 36579e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes CH7017_DAC3_POWER_DOWN | 36679e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes CH7017_TV_POWER_DOWN_EN); 36779e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes 36879e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes if (mode == DRM_MODE_DPMS_ON) { 36979e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes /* Turn on the LVDS */ 37079e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes ch7017_write(dvo, CH7017_LVDS_POWER_DOWN, 37179e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes val & ~CH7017_LVDS_POWER_DOWN_EN); 37279e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes } else { 37379e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes /* Turn off the LVDS */ 37479e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes ch7017_write(dvo, CH7017_LVDS_POWER_DOWN, 37579e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes val | CH7017_LVDS_POWER_DOWN_EN); 37679e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes } 37779e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes 37879e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes /* XXX: Should actually wait for update power status somehow */ 37979e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes udelay(20000); 38079e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes} 38179e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes 38279e539453b34e35f39299a899d263b0a1f1670bdJesse Barnesstatic void ch7017_dump_regs(struct intel_dvo_device *dvo) 38379e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes{ 38479e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes uint8_t val; 38579e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes 38679e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes#define DUMP(reg) \ 38779e539453b34e35f39299a899d263b0a1f1670bdJesse Barnesdo { \ 38879e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes ch7017_read(dvo, reg, &val); \ 38979e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes DRM_DEBUG(#reg ": %02x\n", val); \ 39079e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes} while (0) 39179e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes 39279e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes DUMP(CH7017_HORIZONTAL_ACTIVE_PIXEL_INPUT); 39379e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes DUMP(CH7017_HORIZONTAL_ACTIVE_PIXEL_OUTPUT); 39479e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes DUMP(CH7017_VERTICAL_ACTIVE_LINE_OUTPUT); 39579e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes DUMP(CH7017_ACTIVE_INPUT_LINE_OUTPUT); 39679e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes DUMP(CH7017_LVDS_PLL_VCO_CONTROL); 39779e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes DUMP(CH7017_LVDS_PLL_FEEDBACK_DIV); 39879e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes DUMP(CH7017_LVDS_CONTROL_2); 39979e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes DUMP(CH7017_OUTPUTS_ENABLE); 40079e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes DUMP(CH7017_LVDS_POWER_DOWN); 40179e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes} 40279e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes 40379e539453b34e35f39299a899d263b0a1f1670bdJesse Barnesstatic void ch7017_save(struct intel_dvo_device *dvo) 40479e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes{ 40579e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes struct ch7017_priv *priv = dvo->dev_priv; 40679e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes 40779e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes ch7017_read(dvo, CH7017_HORIZONTAL_ACTIVE_PIXEL_INPUT, &priv->save_hapi); 40879e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes ch7017_read(dvo, CH7017_VERTICAL_ACTIVE_LINE_OUTPUT, &priv->save_valo); 40979e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes ch7017_read(dvo, CH7017_ACTIVE_INPUT_LINE_OUTPUT, &priv->save_ailo); 41079e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes ch7017_read(dvo, CH7017_LVDS_PLL_VCO_CONTROL, &priv->save_lvds_pll_vco); 41179e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes ch7017_read(dvo, CH7017_LVDS_PLL_FEEDBACK_DIV, &priv->save_feedback_div); 41279e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes ch7017_read(dvo, CH7017_LVDS_CONTROL_2, &priv->save_lvds_control_2); 41379e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes ch7017_read(dvo, CH7017_OUTPUTS_ENABLE, &priv->save_outputs_enable); 41479e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes ch7017_read(dvo, CH7017_LVDS_POWER_DOWN, &priv->save_lvds_power_down); 41579e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes ch7017_read(dvo, CH7017_POWER_MANAGEMENT, &priv->save_power_management); 41679e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes} 41779e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes 41879e539453b34e35f39299a899d263b0a1f1670bdJesse Barnesstatic void ch7017_restore(struct intel_dvo_device *dvo) 41979e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes{ 42079e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes struct ch7017_priv *priv = dvo->dev_priv; 42179e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes 42279e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes /* Power down before changing mode */ 42379e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes ch7017_dpms(dvo, DRM_MODE_DPMS_OFF); 42479e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes 42579e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes ch7017_write(dvo, CH7017_HORIZONTAL_ACTIVE_PIXEL_INPUT, priv->save_hapi); 42679e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes ch7017_write(dvo, CH7017_VERTICAL_ACTIVE_LINE_OUTPUT, priv->save_valo); 42779e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes ch7017_write(dvo, CH7017_ACTIVE_INPUT_LINE_OUTPUT, priv->save_ailo); 42879e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes ch7017_write(dvo, CH7017_LVDS_PLL_VCO_CONTROL, priv->save_lvds_pll_vco); 42979e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes ch7017_write(dvo, CH7017_LVDS_PLL_FEEDBACK_DIV, priv->save_feedback_div); 43079e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes ch7017_write(dvo, CH7017_LVDS_CONTROL_2, priv->save_lvds_control_2); 43179e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes ch7017_write(dvo, CH7017_OUTPUTS_ENABLE, priv->save_outputs_enable); 43279e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes ch7017_write(dvo, CH7017_LVDS_POWER_DOWN, priv->save_lvds_power_down); 43379e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes ch7017_write(dvo, CH7017_POWER_MANAGEMENT, priv->save_power_management); 43479e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes} 43579e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes 43679e539453b34e35f39299a899d263b0a1f1670bdJesse Barnesstatic void ch7017_destroy(struct intel_dvo_device *dvo) 43779e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes{ 43879e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes struct ch7017_priv *priv = dvo->dev_priv; 43979e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes 44079e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes if (priv) { 44179e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes kfree(priv); 44279e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes dvo->dev_priv = NULL; 44379e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes } 44479e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes} 44579e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes 44679e539453b34e35f39299a899d263b0a1f1670bdJesse Barnesstruct intel_dvo_dev_ops ch7017_ops = { 44779e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes .init = ch7017_init, 44879e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes .detect = ch7017_detect, 44979e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes .mode_valid = ch7017_mode_valid, 45079e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes .mode_set = ch7017_mode_set, 45179e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes .dpms = ch7017_dpms, 45279e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes .dump_regs = ch7017_dump_regs, 45379e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes .save = ch7017_save, 45479e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes .restore = ch7017_restore, 45579e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes .destroy = ch7017_destroy, 45679e539453b34e35f39299a899d263b0a1f1670bdJesse Barnes}; 457