19a0dfe9bSDmitry Baryshkov /* 29a0dfe9bSDmitry Baryshkov * Copyright (C) 2009 Francisco Jerez. 39a0dfe9bSDmitry Baryshkov * All Rights Reserved. 49a0dfe9bSDmitry Baryshkov * 59a0dfe9bSDmitry Baryshkov * Permission is hereby granted, free of charge, to any person obtaining 69a0dfe9bSDmitry Baryshkov * a copy of this software and associated documentation files (the 79a0dfe9bSDmitry Baryshkov * "Software"), to deal in the Software without restriction, including 89a0dfe9bSDmitry Baryshkov * without limitation the rights to use, copy, modify, merge, publish, 99a0dfe9bSDmitry Baryshkov * distribute, sublicense, and/or sell copies of the Software, and to 109a0dfe9bSDmitry Baryshkov * permit persons to whom the Software is furnished to do so, subject to 119a0dfe9bSDmitry Baryshkov * the following conditions: 129a0dfe9bSDmitry Baryshkov * 139a0dfe9bSDmitry Baryshkov * The above copyright notice and this permission notice (including the 149a0dfe9bSDmitry Baryshkov * next paragraph) shall be included in all copies or substantial 159a0dfe9bSDmitry Baryshkov * portions of the Software. 169a0dfe9bSDmitry Baryshkov * 179a0dfe9bSDmitry Baryshkov * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 189a0dfe9bSDmitry Baryshkov * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 199a0dfe9bSDmitry Baryshkov * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 209a0dfe9bSDmitry Baryshkov * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE 219a0dfe9bSDmitry Baryshkov * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 229a0dfe9bSDmitry Baryshkov * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 239a0dfe9bSDmitry Baryshkov * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 249a0dfe9bSDmitry Baryshkov * 259a0dfe9bSDmitry Baryshkov */ 269a0dfe9bSDmitry Baryshkov 279a0dfe9bSDmitry Baryshkov #ifndef __NOUVEAU_I2C_CH7006_PRIV_H__ 289a0dfe9bSDmitry Baryshkov #define __NOUVEAU_I2C_CH7006_PRIV_H__ 299a0dfe9bSDmitry Baryshkov 309a0dfe9bSDmitry Baryshkov #include <drm/drm_probe_helper.h> 319a0dfe9bSDmitry Baryshkov 32*a7358310SDmitry Baryshkov #include <dispnv04/i2c/encoder_i2c.h> 339a0dfe9bSDmitry Baryshkov #include <dispnv04/i2c/ch7006.h> 349a0dfe9bSDmitry Baryshkov 359a0dfe9bSDmitry Baryshkov typedef int64_t fixed; 369a0dfe9bSDmitry Baryshkov #define fixed1 (1LL << 32) 379a0dfe9bSDmitry Baryshkov 389a0dfe9bSDmitry Baryshkov enum ch7006_tv_norm { 399a0dfe9bSDmitry Baryshkov TV_NORM_PAL, 409a0dfe9bSDmitry Baryshkov TV_NORM_PAL_M, 419a0dfe9bSDmitry Baryshkov TV_NORM_PAL_N, 429a0dfe9bSDmitry Baryshkov TV_NORM_PAL_NC, 439a0dfe9bSDmitry Baryshkov TV_NORM_PAL_60, 449a0dfe9bSDmitry Baryshkov TV_NORM_NTSC_M, 459a0dfe9bSDmitry Baryshkov TV_NORM_NTSC_J, 469a0dfe9bSDmitry Baryshkov NUM_TV_NORMS 479a0dfe9bSDmitry Baryshkov }; 489a0dfe9bSDmitry Baryshkov 499a0dfe9bSDmitry Baryshkov struct ch7006_tv_norm_info { 509a0dfe9bSDmitry Baryshkov fixed vrefresh; 519a0dfe9bSDmitry Baryshkov int vdisplay; 529a0dfe9bSDmitry Baryshkov int vtotal; 539a0dfe9bSDmitry Baryshkov int hvirtual; 549a0dfe9bSDmitry Baryshkov 559a0dfe9bSDmitry Baryshkov fixed subc_freq; 569a0dfe9bSDmitry Baryshkov fixed black_level; 579a0dfe9bSDmitry Baryshkov 589a0dfe9bSDmitry Baryshkov uint32_t dispmode; 599a0dfe9bSDmitry Baryshkov int voffset; 609a0dfe9bSDmitry Baryshkov }; 619a0dfe9bSDmitry Baryshkov 629a0dfe9bSDmitry Baryshkov struct ch7006_mode { 639a0dfe9bSDmitry Baryshkov struct drm_display_mode mode; 649a0dfe9bSDmitry Baryshkov 659a0dfe9bSDmitry Baryshkov int enc_hdisp; 669a0dfe9bSDmitry Baryshkov int enc_vdisp; 679a0dfe9bSDmitry Baryshkov 689a0dfe9bSDmitry Baryshkov fixed subc_coeff; 699a0dfe9bSDmitry Baryshkov uint32_t dispmode; 709a0dfe9bSDmitry Baryshkov 719a0dfe9bSDmitry Baryshkov uint32_t valid_scales; 729a0dfe9bSDmitry Baryshkov uint32_t valid_norms; 739a0dfe9bSDmitry Baryshkov }; 749a0dfe9bSDmitry Baryshkov 759a0dfe9bSDmitry Baryshkov struct ch7006_state { 769a0dfe9bSDmitry Baryshkov uint8_t regs[0x26]; 779a0dfe9bSDmitry Baryshkov }; 789a0dfe9bSDmitry Baryshkov 799a0dfe9bSDmitry Baryshkov struct ch7006_priv { 809a0dfe9bSDmitry Baryshkov struct ch7006_encoder_params params; 819a0dfe9bSDmitry Baryshkov const struct ch7006_mode *mode; 829a0dfe9bSDmitry Baryshkov 839a0dfe9bSDmitry Baryshkov struct ch7006_state state; 849a0dfe9bSDmitry Baryshkov struct ch7006_state saved_state; 859a0dfe9bSDmitry Baryshkov 869a0dfe9bSDmitry Baryshkov struct drm_property *scale_property; 879a0dfe9bSDmitry Baryshkov 889a0dfe9bSDmitry Baryshkov int select_subconnector; 899a0dfe9bSDmitry Baryshkov int subconnector; 909a0dfe9bSDmitry Baryshkov int hmargin; 919a0dfe9bSDmitry Baryshkov int vmargin; 929a0dfe9bSDmitry Baryshkov enum ch7006_tv_norm norm; 939a0dfe9bSDmitry Baryshkov int brightness; 949a0dfe9bSDmitry Baryshkov int contrast; 959a0dfe9bSDmitry Baryshkov int flicker; 969a0dfe9bSDmitry Baryshkov int scale; 979a0dfe9bSDmitry Baryshkov 989a0dfe9bSDmitry Baryshkov int chip_version; 999a0dfe9bSDmitry Baryshkov int last_dpms; 1009a0dfe9bSDmitry Baryshkov }; 1019a0dfe9bSDmitry Baryshkov 1029a0dfe9bSDmitry Baryshkov #define to_ch7006_priv(x) \ 103*a7358310SDmitry Baryshkov ((struct ch7006_priv *)to_encoder_i2c(x)->encoder_i2c_priv) 1049a0dfe9bSDmitry Baryshkov 1059a0dfe9bSDmitry Baryshkov extern int ch7006_debug; 1069a0dfe9bSDmitry Baryshkov extern char *ch7006_tv_norm; 1079a0dfe9bSDmitry Baryshkov extern int ch7006_scale; 1089a0dfe9bSDmitry Baryshkov 1099a0dfe9bSDmitry Baryshkov extern const char * const ch7006_tv_norm_names[]; 1109a0dfe9bSDmitry Baryshkov extern const struct ch7006_tv_norm_info ch7006_tv_norms[]; 1119a0dfe9bSDmitry Baryshkov extern const struct ch7006_mode ch7006_modes[]; 1129a0dfe9bSDmitry Baryshkov 1139a0dfe9bSDmitry Baryshkov const struct ch7006_mode *ch7006_lookup_mode(struct drm_encoder *encoder, 1149a0dfe9bSDmitry Baryshkov const struct drm_display_mode *drm_mode); 1159a0dfe9bSDmitry Baryshkov 1169a0dfe9bSDmitry Baryshkov void ch7006_setup_levels(struct drm_encoder *encoder); 1179a0dfe9bSDmitry Baryshkov void ch7006_setup_subcarrier(struct drm_encoder *encoder); 1189a0dfe9bSDmitry Baryshkov void ch7006_setup_pll(struct drm_encoder *encoder); 1199a0dfe9bSDmitry Baryshkov void ch7006_setup_power_state(struct drm_encoder *encoder); 1209a0dfe9bSDmitry Baryshkov void ch7006_setup_properties(struct drm_encoder *encoder); 1219a0dfe9bSDmitry Baryshkov 1229a0dfe9bSDmitry Baryshkov void ch7006_write(struct i2c_client *client, uint8_t addr, uint8_t val); 1239a0dfe9bSDmitry Baryshkov uint8_t ch7006_read(struct i2c_client *client, uint8_t addr); 1249a0dfe9bSDmitry Baryshkov 1259a0dfe9bSDmitry Baryshkov void ch7006_state_load(struct i2c_client *client, 1269a0dfe9bSDmitry Baryshkov struct ch7006_state *state); 1279a0dfe9bSDmitry Baryshkov void ch7006_state_save(struct i2c_client *client, 1289a0dfe9bSDmitry Baryshkov struct ch7006_state *state); 1299a0dfe9bSDmitry Baryshkov 1309a0dfe9bSDmitry Baryshkov /* Some helper macros */ 1319a0dfe9bSDmitry Baryshkov 1329a0dfe9bSDmitry Baryshkov #define ch7006_dbg(client, format, ...) do { \ 1339a0dfe9bSDmitry Baryshkov if (ch7006_debug) \ 1349a0dfe9bSDmitry Baryshkov dev_printk(KERN_DEBUG, &client->dev, \ 1359a0dfe9bSDmitry Baryshkov "%s: " format, __func__, ## __VA_ARGS__); \ 1369a0dfe9bSDmitry Baryshkov } while (0) 1379a0dfe9bSDmitry Baryshkov #define ch7006_info(client, format, ...) \ 1389a0dfe9bSDmitry Baryshkov dev_info(&client->dev, format, __VA_ARGS__) 1399a0dfe9bSDmitry Baryshkov #define ch7006_err(client, format, ...) \ 1409a0dfe9bSDmitry Baryshkov dev_err(&client->dev, format, __VA_ARGS__) 1419a0dfe9bSDmitry Baryshkov 1429a0dfe9bSDmitry Baryshkov #define __mask(src, bitfield) \ 1439a0dfe9bSDmitry Baryshkov (((2 << (1 ? bitfield)) - 1) & ~((1 << (0 ? bitfield)) - 1)) 1449a0dfe9bSDmitry Baryshkov #define mask(bitfield) __mask(bitfield) 1459a0dfe9bSDmitry Baryshkov 1469a0dfe9bSDmitry Baryshkov #define __bitf(src, bitfield, x) \ 1479a0dfe9bSDmitry Baryshkov (((x) >> (src) << (0 ? bitfield)) & __mask(src, bitfield)) 1489a0dfe9bSDmitry Baryshkov #define bitf(bitfield, x) __bitf(bitfield, x) 1499a0dfe9bSDmitry Baryshkov #define bitfs(bitfield, s) __bitf(bitfield, bitfield##_##s) 1509a0dfe9bSDmitry Baryshkov #define setbitf(state, reg, bitfield, x) \ 1519a0dfe9bSDmitry Baryshkov state->regs[reg] = (state->regs[reg] & ~mask(reg##_##bitfield)) \ 1529a0dfe9bSDmitry Baryshkov | bitf(reg##_##bitfield, x) 1539a0dfe9bSDmitry Baryshkov 1549a0dfe9bSDmitry Baryshkov #define __unbitf(src, bitfield, x) \ 1559a0dfe9bSDmitry Baryshkov ((x & __mask(src, bitfield)) >> (0 ? bitfield) << (src)) 1569a0dfe9bSDmitry Baryshkov #define unbitf(bitfield, x) __unbitf(bitfield, x) 1579a0dfe9bSDmitry Baryshkov 1589a0dfe9bSDmitry Baryshkov static inline int interpolate(int y0, int y1, int y2, int x) 1599a0dfe9bSDmitry Baryshkov { 1609a0dfe9bSDmitry Baryshkov return y1 + (x < 50 ? y1 - y0 : y2 - y1) * (x - 50) / 50; 1619a0dfe9bSDmitry Baryshkov } 1629a0dfe9bSDmitry Baryshkov 1639a0dfe9bSDmitry Baryshkov static inline int32_t round_fixed(fixed x) 1649a0dfe9bSDmitry Baryshkov { 1659a0dfe9bSDmitry Baryshkov return (x + fixed1/2) >> 32; 1669a0dfe9bSDmitry Baryshkov } 1679a0dfe9bSDmitry Baryshkov 1689a0dfe9bSDmitry Baryshkov #define ch7006_load_reg(client, state, reg) ch7006_write(client, reg, state->regs[reg]) 1699a0dfe9bSDmitry Baryshkov #define ch7006_save_reg(client, state, reg) state->regs[reg] = ch7006_read(client, reg) 1709a0dfe9bSDmitry Baryshkov 1719a0dfe9bSDmitry Baryshkov /* Fixed hardware specs */ 1729a0dfe9bSDmitry Baryshkov 1739a0dfe9bSDmitry Baryshkov #define CH7006_FREQ0 14318 1749a0dfe9bSDmitry Baryshkov #define CH7006_MAXN 650 1759a0dfe9bSDmitry Baryshkov #define CH7006_MAXM 315 1769a0dfe9bSDmitry Baryshkov 1779a0dfe9bSDmitry Baryshkov /* Register definitions */ 1789a0dfe9bSDmitry Baryshkov 1799a0dfe9bSDmitry Baryshkov #define CH7006_DISPMODE 0x00 1809a0dfe9bSDmitry Baryshkov #define CH7006_DISPMODE_INPUT_RES 0, 7:5 1819a0dfe9bSDmitry Baryshkov #define CH7006_DISPMODE_INPUT_RES_512x384 0x0 1829a0dfe9bSDmitry Baryshkov #define CH7006_DISPMODE_INPUT_RES_720x400 0x1 1839a0dfe9bSDmitry Baryshkov #define CH7006_DISPMODE_INPUT_RES_640x400 0x2 1849a0dfe9bSDmitry Baryshkov #define CH7006_DISPMODE_INPUT_RES_640x480 0x3 1859a0dfe9bSDmitry Baryshkov #define CH7006_DISPMODE_INPUT_RES_800x600 0x4 1869a0dfe9bSDmitry Baryshkov #define CH7006_DISPMODE_INPUT_RES_NATIVE 0x5 1879a0dfe9bSDmitry Baryshkov #define CH7006_DISPMODE_OUTPUT_STD 0, 4:3 1889a0dfe9bSDmitry Baryshkov #define CH7006_DISPMODE_OUTPUT_STD_PAL 0x0 1899a0dfe9bSDmitry Baryshkov #define CH7006_DISPMODE_OUTPUT_STD_NTSC 0x1 1909a0dfe9bSDmitry Baryshkov #define CH7006_DISPMODE_OUTPUT_STD_PAL_M 0x2 1919a0dfe9bSDmitry Baryshkov #define CH7006_DISPMODE_OUTPUT_STD_NTSC_J 0x3 1929a0dfe9bSDmitry Baryshkov #define CH7006_DISPMODE_SCALING_RATIO 0, 2:0 1939a0dfe9bSDmitry Baryshkov #define CH7006_DISPMODE_SCALING_RATIO_5_4 0x0 1949a0dfe9bSDmitry Baryshkov #define CH7006_DISPMODE_SCALING_RATIO_1_1 0x1 1959a0dfe9bSDmitry Baryshkov #define CH7006_DISPMODE_SCALING_RATIO_7_8 0x2 1969a0dfe9bSDmitry Baryshkov #define CH7006_DISPMODE_SCALING_RATIO_5_6 0x3 1979a0dfe9bSDmitry Baryshkov #define CH7006_DISPMODE_SCALING_RATIO_3_4 0x4 1989a0dfe9bSDmitry Baryshkov #define CH7006_DISPMODE_SCALING_RATIO_7_10 0x5 1999a0dfe9bSDmitry Baryshkov 2009a0dfe9bSDmitry Baryshkov #define CH7006_FFILTER 0x01 2019a0dfe9bSDmitry Baryshkov #define CH7006_FFILTER_TEXT 0, 5:4 2029a0dfe9bSDmitry Baryshkov #define CH7006_FFILTER_LUMA 0, 3:2 2039a0dfe9bSDmitry Baryshkov #define CH7006_FFILTER_CHROMA 0, 1:0 2049a0dfe9bSDmitry Baryshkov #define CH7006_FFILTER_CHROMA_NO_DCRAWL 0x3 2059a0dfe9bSDmitry Baryshkov 2069a0dfe9bSDmitry Baryshkov #define CH7006_BWIDTH 0x03 2079a0dfe9bSDmitry Baryshkov #define CH7006_BWIDTH_5L_FFILER (1 << 7) 2089a0dfe9bSDmitry Baryshkov #define CH7006_BWIDTH_CVBS_NO_CHROMA (1 << 6) 2099a0dfe9bSDmitry Baryshkov #define CH7006_BWIDTH_CHROMA 0, 5:4 2109a0dfe9bSDmitry Baryshkov #define CH7006_BWIDTH_SVIDEO_YPEAK (1 << 3) 2119a0dfe9bSDmitry Baryshkov #define CH7006_BWIDTH_SVIDEO_LUMA 0, 2:1 2129a0dfe9bSDmitry Baryshkov #define CH7006_BWIDTH_CVBS_LUMA 0, 0:0 2139a0dfe9bSDmitry Baryshkov 2149a0dfe9bSDmitry Baryshkov #define CH7006_INPUT_FORMAT 0x04 2159a0dfe9bSDmitry Baryshkov #define CH7006_INPUT_FORMAT_DAC_GAIN (1 << 6) 2169a0dfe9bSDmitry Baryshkov #define CH7006_INPUT_FORMAT_RGB_PASS_THROUGH (1 << 5) 2179a0dfe9bSDmitry Baryshkov #define CH7006_INPUT_FORMAT_FORMAT 0, 3:0 2189a0dfe9bSDmitry Baryshkov #define CH7006_INPUT_FORMAT_FORMAT_RGB16 0x0 2199a0dfe9bSDmitry Baryshkov #define CH7006_INPUT_FORMAT_FORMAT_YCrCb24m16 0x1 2209a0dfe9bSDmitry Baryshkov #define CH7006_INPUT_FORMAT_FORMAT_RGB24m16 0x2 2219a0dfe9bSDmitry Baryshkov #define CH7006_INPUT_FORMAT_FORMAT_RGB15 0x3 2229a0dfe9bSDmitry Baryshkov #define CH7006_INPUT_FORMAT_FORMAT_RGB24m12C 0x4 2239a0dfe9bSDmitry Baryshkov #define CH7006_INPUT_FORMAT_FORMAT_RGB24m12I 0x5 2249a0dfe9bSDmitry Baryshkov #define CH7006_INPUT_FORMAT_FORMAT_RGB24m8 0x6 2259a0dfe9bSDmitry Baryshkov #define CH7006_INPUT_FORMAT_FORMAT_RGB16m8 0x7 2269a0dfe9bSDmitry Baryshkov #define CH7006_INPUT_FORMAT_FORMAT_RGB15m8 0x8 2279a0dfe9bSDmitry Baryshkov #define CH7006_INPUT_FORMAT_FORMAT_YCrCb24m8 0x9 2289a0dfe9bSDmitry Baryshkov 2299a0dfe9bSDmitry Baryshkov #define CH7006_CLKMODE 0x06 2309a0dfe9bSDmitry Baryshkov #define CH7006_CLKMODE_SUBC_LOCK (1 << 7) 2319a0dfe9bSDmitry Baryshkov #define CH7006_CLKMODE_MASTER (1 << 6) 2329a0dfe9bSDmitry Baryshkov #define CH7006_CLKMODE_POS_EDGE (1 << 4) 2339a0dfe9bSDmitry Baryshkov #define CH7006_CLKMODE_XCM 0, 3:2 2349a0dfe9bSDmitry Baryshkov #define CH7006_CLKMODE_PCM 0, 1:0 2359a0dfe9bSDmitry Baryshkov 2369a0dfe9bSDmitry Baryshkov #define CH7006_START_ACTIVE 0x07 2379a0dfe9bSDmitry Baryshkov #define CH7006_START_ACTIVE_0 0, 7:0 2389a0dfe9bSDmitry Baryshkov 2399a0dfe9bSDmitry Baryshkov #define CH7006_POV 0x08 2409a0dfe9bSDmitry Baryshkov #define CH7006_POV_START_ACTIVE_8 8, 2:2 2419a0dfe9bSDmitry Baryshkov #define CH7006_POV_HPOS_8 8, 1:1 2429a0dfe9bSDmitry Baryshkov #define CH7006_POV_VPOS_8 8, 0:0 2439a0dfe9bSDmitry Baryshkov 2449a0dfe9bSDmitry Baryshkov #define CH7006_BLACK_LEVEL 0x09 2459a0dfe9bSDmitry Baryshkov #define CH7006_BLACK_LEVEL_0 0, 7:0 2469a0dfe9bSDmitry Baryshkov 2479a0dfe9bSDmitry Baryshkov #define CH7006_HPOS 0x0a 2489a0dfe9bSDmitry Baryshkov #define CH7006_HPOS_0 0, 7:0 2499a0dfe9bSDmitry Baryshkov 2509a0dfe9bSDmitry Baryshkov #define CH7006_VPOS 0x0b 2519a0dfe9bSDmitry Baryshkov #define CH7006_VPOS_0 0, 7:0 2529a0dfe9bSDmitry Baryshkov 2539a0dfe9bSDmitry Baryshkov #define CH7006_INPUT_SYNC 0x0d 2549a0dfe9bSDmitry Baryshkov #define CH7006_INPUT_SYNC_EMBEDDED (1 << 3) 2559a0dfe9bSDmitry Baryshkov #define CH7006_INPUT_SYNC_OUTPUT (1 << 2) 2569a0dfe9bSDmitry Baryshkov #define CH7006_INPUT_SYNC_PVSYNC (1 << 1) 2579a0dfe9bSDmitry Baryshkov #define CH7006_INPUT_SYNC_PHSYNC (1 << 0) 2589a0dfe9bSDmitry Baryshkov 2599a0dfe9bSDmitry Baryshkov #define CH7006_POWER 0x0e 2609a0dfe9bSDmitry Baryshkov #define CH7006_POWER_SCART (1 << 4) 2619a0dfe9bSDmitry Baryshkov #define CH7006_POWER_RESET (1 << 3) 2629a0dfe9bSDmitry Baryshkov #define CH7006_POWER_LEVEL 0, 2:0 2639a0dfe9bSDmitry Baryshkov #define CH7006_POWER_LEVEL_CVBS_OFF 0x0 2649a0dfe9bSDmitry Baryshkov #define CH7006_POWER_LEVEL_POWER_OFF 0x1 2659a0dfe9bSDmitry Baryshkov #define CH7006_POWER_LEVEL_SVIDEO_OFF 0x2 2669a0dfe9bSDmitry Baryshkov #define CH7006_POWER_LEVEL_NORMAL 0x3 2679a0dfe9bSDmitry Baryshkov #define CH7006_POWER_LEVEL_FULL_POWER_OFF 0x4 2689a0dfe9bSDmitry Baryshkov 2699a0dfe9bSDmitry Baryshkov #define CH7006_DETECT 0x10 2709a0dfe9bSDmitry Baryshkov #define CH7006_DETECT_SVIDEO_Y_TEST (1 << 3) 2719a0dfe9bSDmitry Baryshkov #define CH7006_DETECT_SVIDEO_C_TEST (1 << 2) 2729a0dfe9bSDmitry Baryshkov #define CH7006_DETECT_CVBS_TEST (1 << 1) 2739a0dfe9bSDmitry Baryshkov #define CH7006_DETECT_SENSE (1 << 0) 2749a0dfe9bSDmitry Baryshkov 2759a0dfe9bSDmitry Baryshkov #define CH7006_CONTRAST 0x11 2769a0dfe9bSDmitry Baryshkov #define CH7006_CONTRAST_0 0, 2:0 2779a0dfe9bSDmitry Baryshkov 2789a0dfe9bSDmitry Baryshkov #define CH7006_PLLOV 0x13 2799a0dfe9bSDmitry Baryshkov #define CH7006_PLLOV_N_8 8, 2:1 2809a0dfe9bSDmitry Baryshkov #define CH7006_PLLOV_M_8 8, 0:0 2819a0dfe9bSDmitry Baryshkov 2829a0dfe9bSDmitry Baryshkov #define CH7006_PLLM 0x14 2839a0dfe9bSDmitry Baryshkov #define CH7006_PLLM_0 0, 7:0 2849a0dfe9bSDmitry Baryshkov 2859a0dfe9bSDmitry Baryshkov #define CH7006_PLLN 0x15 2869a0dfe9bSDmitry Baryshkov #define CH7006_PLLN_0 0, 7:0 2879a0dfe9bSDmitry Baryshkov 2889a0dfe9bSDmitry Baryshkov #define CH7006_BCLKOUT 0x17 2899a0dfe9bSDmitry Baryshkov 2909a0dfe9bSDmitry Baryshkov #define CH7006_SUBC_INC0 0x18 2919a0dfe9bSDmitry Baryshkov #define CH7006_SUBC_INC0_28 28, 3:0 2929a0dfe9bSDmitry Baryshkov 2939a0dfe9bSDmitry Baryshkov #define CH7006_SUBC_INC1 0x19 2949a0dfe9bSDmitry Baryshkov #define CH7006_SUBC_INC1_24 24, 3:0 2959a0dfe9bSDmitry Baryshkov 2969a0dfe9bSDmitry Baryshkov #define CH7006_SUBC_INC2 0x1a 2979a0dfe9bSDmitry Baryshkov #define CH7006_SUBC_INC2_20 20, 3:0 2989a0dfe9bSDmitry Baryshkov 2999a0dfe9bSDmitry Baryshkov #define CH7006_SUBC_INC3 0x1b 3009a0dfe9bSDmitry Baryshkov #define CH7006_SUBC_INC3_GPIO1_VAL (1 << 7) 3019a0dfe9bSDmitry Baryshkov #define CH7006_SUBC_INC3_GPIO0_VAL (1 << 6) 3029a0dfe9bSDmitry Baryshkov #define CH7006_SUBC_INC3_POUT_3_3V (1 << 5) 3039a0dfe9bSDmitry Baryshkov #define CH7006_SUBC_INC3_POUT_INV (1 << 4) 3049a0dfe9bSDmitry Baryshkov #define CH7006_SUBC_INC3_16 16, 3:0 3059a0dfe9bSDmitry Baryshkov 3069a0dfe9bSDmitry Baryshkov #define CH7006_SUBC_INC4 0x1c 3079a0dfe9bSDmitry Baryshkov #define CH7006_SUBC_INC4_GPIO1_IN (1 << 7) 3089a0dfe9bSDmitry Baryshkov #define CH7006_SUBC_INC4_GPIO0_IN (1 << 6) 3099a0dfe9bSDmitry Baryshkov #define CH7006_SUBC_INC4_DS_INPUT (1 << 4) 3109a0dfe9bSDmitry Baryshkov #define CH7006_SUBC_INC4_12 12, 3:0 3119a0dfe9bSDmitry Baryshkov 3129a0dfe9bSDmitry Baryshkov #define CH7006_SUBC_INC5 0x1d 3139a0dfe9bSDmitry Baryshkov #define CH7006_SUBC_INC5_8 8, 3:0 3149a0dfe9bSDmitry Baryshkov 3159a0dfe9bSDmitry Baryshkov #define CH7006_SUBC_INC6 0x1e 3169a0dfe9bSDmitry Baryshkov #define CH7006_SUBC_INC6_4 4, 3:0 3179a0dfe9bSDmitry Baryshkov 3189a0dfe9bSDmitry Baryshkov #define CH7006_SUBC_INC7 0x1f 3199a0dfe9bSDmitry Baryshkov #define CH7006_SUBC_INC7_0 0, 3:0 3209a0dfe9bSDmitry Baryshkov 3219a0dfe9bSDmitry Baryshkov #define CH7006_PLL_CONTROL 0x20 3229a0dfe9bSDmitry Baryshkov #define CH7006_PLL_CONTROL_CPI (1 << 5) 3239a0dfe9bSDmitry Baryshkov #define CH7006_PLL_CONTROL_CAPACITOR (1 << 4) 3249a0dfe9bSDmitry Baryshkov #define CH7006_PLL_CONTROL_7STAGES (1 << 3) 3259a0dfe9bSDmitry Baryshkov #define CH7006_PLL_CONTROL_DIGITAL_5V (1 << 2) 3269a0dfe9bSDmitry Baryshkov #define CH7006_PLL_CONTROL_ANALOG_5V (1 << 1) 3279a0dfe9bSDmitry Baryshkov #define CH7006_PLL_CONTROL_MEMORY_5V (1 << 0) 3289a0dfe9bSDmitry Baryshkov 3299a0dfe9bSDmitry Baryshkov #define CH7006_CALC_SUBC_INC0 0x21 3309a0dfe9bSDmitry Baryshkov #define CH7006_CALC_SUBC_INC0_24 24, 4:3 3319a0dfe9bSDmitry Baryshkov #define CH7006_CALC_SUBC_INC0_HYST 0, 2:1 3329a0dfe9bSDmitry Baryshkov #define CH7006_CALC_SUBC_INC0_AUTO (1 << 0) 3339a0dfe9bSDmitry Baryshkov 3349a0dfe9bSDmitry Baryshkov #define CH7006_CALC_SUBC_INC1 0x22 3359a0dfe9bSDmitry Baryshkov #define CH7006_CALC_SUBC_INC1_16 16, 7:0 3369a0dfe9bSDmitry Baryshkov 3379a0dfe9bSDmitry Baryshkov #define CH7006_CALC_SUBC_INC2 0x23 3389a0dfe9bSDmitry Baryshkov #define CH7006_CALC_SUBC_INC2_8 8, 7:0 3399a0dfe9bSDmitry Baryshkov 3409a0dfe9bSDmitry Baryshkov #define CH7006_CALC_SUBC_INC3 0x24 3419a0dfe9bSDmitry Baryshkov #define CH7006_CALC_SUBC_INC3_0 0, 7:0 3429a0dfe9bSDmitry Baryshkov 3439a0dfe9bSDmitry Baryshkov #define CH7006_VERSION_ID 0x25 3449a0dfe9bSDmitry Baryshkov 3459a0dfe9bSDmitry Baryshkov #endif 346