intel_sdvo.c 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128
  1. /*
  2. * Copyright 2006 Dave Airlie <airlied@linux.ie>
  3. * Copyright © 2006-2007 Intel Corporation
  4. * Jesse Barnes <jesse.barnes@intel.com>
  5. *
  6. * Permission is hereby granted, free of charge, to any person obtaining a
  7. * copy of this software and associated documentation files (the "Software"),
  8. * to deal in the Software without restriction, including without limitation
  9. * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  10. * and/or sell copies of the Software, and to permit persons to whom the
  11. * Software is furnished to do so, subject to the following conditions:
  12. *
  13. * The above copyright notice and this permission notice (including the next
  14. * paragraph) shall be included in all copies or substantial portions of the
  15. * Software.
  16. *
  17. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  18. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  19. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
  20. * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  21. * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  22. * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  23. * DEALINGS IN THE SOFTWARE.
  24. *
  25. * Authors:
  26. * Eric Anholt <eric@anholt.net>
  27. */
  28. #include <linux/i2c.h>
  29. #include <linux/delay.h>
  30. #include "drmP.h"
  31. #include "drm.h"
  32. #include "drm_crtc.h"
  33. #include "intel_drv.h"
  34. #include "i915_drm.h"
  35. #include "i915_drv.h"
  36. #include "intel_sdvo_regs.h"
  37. #undef SDVO_DEBUG
  38. struct intel_sdvo_priv {
  39. struct intel_i2c_chan *i2c_bus;
  40. int slaveaddr;
  41. int output_device;
  42. u16 active_outputs;
  43. struct intel_sdvo_caps caps;
  44. int pixel_clock_min, pixel_clock_max;
  45. int save_sdvo_mult;
  46. u16 save_active_outputs;
  47. struct intel_sdvo_dtd save_input_dtd_1, save_input_dtd_2;
  48. struct intel_sdvo_dtd save_output_dtd[16];
  49. u32 save_SDVOX;
  50. };
  51. /**
  52. * Writes the SDVOB or SDVOC with the given value, but always writes both
  53. * SDVOB and SDVOC to work around apparent hardware issues (according to
  54. * comments in the BIOS).
  55. */
  56. static void intel_sdvo_write_sdvox(struct intel_output *intel_output, u32 val)
  57. {
  58. struct drm_device *dev = intel_output->base.dev;
  59. struct drm_i915_private *dev_priv = dev->dev_private;
  60. struct intel_sdvo_priv *sdvo_priv = intel_output->dev_priv;
  61. u32 bval = val, cval = val;
  62. int i;
  63. if (sdvo_priv->output_device == SDVOB) {
  64. cval = I915_READ(SDVOC);
  65. } else {
  66. bval = I915_READ(SDVOB);
  67. }
  68. /*
  69. * Write the registers twice for luck. Sometimes,
  70. * writing them only once doesn't appear to 'stick'.
  71. * The BIOS does this too. Yay, magic
  72. */
  73. for (i = 0; i < 2; i++)
  74. {
  75. I915_WRITE(SDVOB, bval);
  76. I915_READ(SDVOB);
  77. I915_WRITE(SDVOC, cval);
  78. I915_READ(SDVOC);
  79. }
  80. }
  81. static bool intel_sdvo_read_byte(struct intel_output *intel_output, u8 addr,
  82. u8 *ch)
  83. {
  84. struct intel_sdvo_priv *sdvo_priv = intel_output->dev_priv;
  85. u8 out_buf[2];
  86. u8 buf[2];
  87. int ret;
  88. struct i2c_msg msgs[] = {
  89. {
  90. .addr = sdvo_priv->i2c_bus->slave_addr,
  91. .flags = 0,
  92. .len = 1,
  93. .buf = out_buf,
  94. },
  95. {
  96. .addr = sdvo_priv->i2c_bus->slave_addr,
  97. .flags = I2C_M_RD,
  98. .len = 1,
  99. .buf = buf,
  100. }
  101. };
  102. out_buf[0] = addr;
  103. out_buf[1] = 0;
  104. if ((ret = i2c_transfer(&sdvo_priv->i2c_bus->adapter, msgs, 2)) == 2)
  105. {
  106. *ch = buf[0];
  107. return true;
  108. }
  109. DRM_DEBUG("i2c transfer returned %d\n", ret);
  110. return false;
  111. }
  112. static bool intel_sdvo_write_byte(struct intel_output *intel_output, int addr,
  113. u8 ch)
  114. {
  115. u8 out_buf[2];
  116. struct i2c_msg msgs[] = {
  117. {
  118. .addr = intel_output->i2c_bus->slave_addr,
  119. .flags = 0,
  120. .len = 2,
  121. .buf = out_buf,
  122. }
  123. };
  124. out_buf[0] = addr;
  125. out_buf[1] = ch;
  126. if (i2c_transfer(&intel_output->i2c_bus->adapter, msgs, 1) == 1)
  127. {
  128. return true;
  129. }
  130. return false;
  131. }
  132. #define SDVO_CMD_NAME_ENTRY(cmd) {cmd, #cmd}
  133. /** Mapping of command numbers to names, for debug output */
  134. const static struct _sdvo_cmd_name {
  135. u8 cmd;
  136. char *name;
  137. } sdvo_cmd_names[] = {
  138. SDVO_CMD_NAME_ENTRY(SDVO_CMD_RESET),
  139. SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_DEVICE_CAPS),
  140. SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_FIRMWARE_REV),
  141. SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_TRAINED_INPUTS),
  142. SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_ACTIVE_OUTPUTS),
  143. SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_ACTIVE_OUTPUTS),
  144. SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_IN_OUT_MAP),
  145. SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_IN_OUT_MAP),
  146. SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_ATTACHED_DISPLAYS),
  147. SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_HOT_PLUG_SUPPORT),
  148. SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_ACTIVE_HOT_PLUG),
  149. SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_ACTIVE_HOT_PLUG),
  150. SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_INTERRUPT_EVENT_SOURCE),
  151. SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_TARGET_INPUT),
  152. SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_TARGET_OUTPUT),
  153. SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_INPUT_TIMINGS_PART1),
  154. SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_INPUT_TIMINGS_PART2),
  155. SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_INPUT_TIMINGS_PART1),
  156. SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_INPUT_TIMINGS_PART2),
  157. SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_INPUT_TIMINGS_PART1),
  158. SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_OUTPUT_TIMINGS_PART1),
  159. SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_OUTPUT_TIMINGS_PART2),
  160. SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_OUTPUT_TIMINGS_PART1),
  161. SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_OUTPUT_TIMINGS_PART2),
  162. SDVO_CMD_NAME_ENTRY(SDVO_CMD_CREATE_PREFERRED_INPUT_TIMING),
  163. SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_PREFERRED_INPUT_TIMING_PART1),
  164. SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_PREFERRED_INPUT_TIMING_PART2),
  165. SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_INPUT_PIXEL_CLOCK_RANGE),
  166. SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_OUTPUT_PIXEL_CLOCK_RANGE),
  167. SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_SUPPORTED_CLOCK_RATE_MULTS),
  168. SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_CLOCK_RATE_MULT),
  169. SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_CLOCK_RATE_MULT),
  170. SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_SUPPORTED_TV_FORMATS),
  171. SDVO_CMD_NAME_ENTRY(SDVO_CMD_GET_TV_FORMAT),
  172. SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_TV_FORMAT),
  173. SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_TV_RESOLUTION_SUPPORT),
  174. SDVO_CMD_NAME_ENTRY(SDVO_CMD_SET_CONTROL_BUS_SWITCH),
  175. };
  176. #define SDVO_NAME(dev_priv) ((dev_priv)->output_device == SDVOB ? "SDVOB" : "SDVOC")
  177. #define SDVO_PRIV(output) ((struct intel_sdvo_priv *) (output)->dev_priv)
  178. #ifdef SDVO_DEBUG
  179. static void intel_sdvo_debug_write(struct intel_output *intel_output, u8 cmd,
  180. void *args, int args_len)
  181. {
  182. struct intel_sdvo_priv *sdvo_priv = intel_output->dev_priv;
  183. int i;
  184. DRM_DEBUG("%s: W: %02X ", SDVO_NAME(sdvo_priv), cmd);
  185. for (i = 0; i < args_len; i++)
  186. printk("%02X ", ((u8 *)args)[i]);
  187. for (; i < 8; i++)
  188. printk(" ");
  189. for (i = 0; i < sizeof(sdvo_cmd_names) / sizeof(sdvo_cmd_names[0]); i++) {
  190. if (cmd == sdvo_cmd_names[i].cmd) {
  191. printk("(%s)", sdvo_cmd_names[i].name);
  192. break;
  193. }
  194. }
  195. if (i == sizeof(sdvo_cmd_names)/ sizeof(sdvo_cmd_names[0]))
  196. printk("(%02X)",cmd);
  197. printk("\n");
  198. }
  199. #else
  200. #define intel_sdvo_debug_write(o, c, a, l)
  201. #endif
  202. static void intel_sdvo_write_cmd(struct intel_output *intel_output, u8 cmd,
  203. void *args, int args_len)
  204. {
  205. int i;
  206. intel_sdvo_debug_write(intel_output, cmd, args, args_len);
  207. for (i = 0; i < args_len; i++) {
  208. intel_sdvo_write_byte(intel_output, SDVO_I2C_ARG_0 - i,
  209. ((u8*)args)[i]);
  210. }
  211. intel_sdvo_write_byte(intel_output, SDVO_I2C_OPCODE, cmd);
  212. }
  213. #ifdef SDVO_DEBUG
  214. static const char *cmd_status_names[] = {
  215. "Power on",
  216. "Success",
  217. "Not supported",
  218. "Invalid arg",
  219. "Pending",
  220. "Target not specified",
  221. "Scaling not supported"
  222. };
  223. static void intel_sdvo_debug_response(struct intel_output *intel_output,
  224. void *response, int response_len,
  225. u8 status)
  226. {
  227. struct intel_sdvo_priv *sdvo_priv = intel_output->dev_priv;
  228. DRM_DEBUG("%s: R: ", SDVO_NAME(sdvo_priv));
  229. for (i = 0; i < response_len; i++)
  230. printk("%02X ", ((u8 *)response)[i]);
  231. for (; i < 8; i++)
  232. printk(" ");
  233. if (status <= SDVO_CMD_STATUS_SCALING_NOT_SUPP)
  234. printk("(%s)", cmd_status_names[status]);
  235. else
  236. printk("(??? %d)", status);
  237. printk("\n");
  238. }
  239. #else
  240. #define intel_sdvo_debug_response(o, r, l, s)
  241. #endif
  242. static u8 intel_sdvo_read_response(struct intel_output *intel_output,
  243. void *response, int response_len)
  244. {
  245. int i;
  246. u8 status;
  247. u8 retry = 50;
  248. while (retry--) {
  249. /* Read the command response */
  250. for (i = 0; i < response_len; i++) {
  251. intel_sdvo_read_byte(intel_output,
  252. SDVO_I2C_RETURN_0 + i,
  253. &((u8 *)response)[i]);
  254. }
  255. /* read the return status */
  256. intel_sdvo_read_byte(intel_output, SDVO_I2C_CMD_STATUS,
  257. &status);
  258. intel_sdvo_debug_response(intel_output, response, response_len,
  259. status);
  260. if (status != SDVO_CMD_STATUS_PENDING)
  261. return status;
  262. mdelay(50);
  263. }
  264. return status;
  265. }
  266. static int intel_sdvo_get_pixel_multiplier(struct drm_display_mode *mode)
  267. {
  268. if (mode->clock >= 100000)
  269. return 1;
  270. else if (mode->clock >= 50000)
  271. return 2;
  272. else
  273. return 4;
  274. }
  275. /**
  276. * Don't check status code from this as it switches the bus back to the
  277. * SDVO chips which defeats the purpose of doing a bus switch in the first
  278. * place.
  279. */
  280. static void intel_sdvo_set_control_bus_switch(struct intel_output *intel_output,
  281. u8 target)
  282. {
  283. intel_sdvo_write_cmd(intel_output, SDVO_CMD_SET_CONTROL_BUS_SWITCH, &target, 1);
  284. }
  285. static bool intel_sdvo_set_target_input(struct intel_output *intel_output, bool target_0, bool target_1)
  286. {
  287. struct intel_sdvo_set_target_input_args targets = {0};
  288. u8 status;
  289. if (target_0 && target_1)
  290. return SDVO_CMD_STATUS_NOTSUPP;
  291. if (target_1)
  292. targets.target_1 = 1;
  293. intel_sdvo_write_cmd(intel_output, SDVO_CMD_SET_TARGET_INPUT, &targets,
  294. sizeof(targets));
  295. status = intel_sdvo_read_response(intel_output, NULL, 0);
  296. return (status == SDVO_CMD_STATUS_SUCCESS);
  297. }
  298. /**
  299. * Return whether each input is trained.
  300. *
  301. * This function is making an assumption about the layout of the response,
  302. * which should be checked against the docs.
  303. */
  304. static bool intel_sdvo_get_trained_inputs(struct intel_output *intel_output, bool *input_1, bool *input_2)
  305. {
  306. struct intel_sdvo_get_trained_inputs_response response;
  307. u8 status;
  308. intel_sdvo_write_cmd(intel_output, SDVO_CMD_GET_TRAINED_INPUTS, NULL, 0);
  309. status = intel_sdvo_read_response(intel_output, &response, sizeof(response));
  310. if (status != SDVO_CMD_STATUS_SUCCESS)
  311. return false;
  312. *input_1 = response.input0_trained;
  313. *input_2 = response.input1_trained;
  314. return true;
  315. }
  316. static bool intel_sdvo_get_active_outputs(struct intel_output *intel_output,
  317. u16 *outputs)
  318. {
  319. u8 status;
  320. intel_sdvo_write_cmd(intel_output, SDVO_CMD_GET_ACTIVE_OUTPUTS, NULL, 0);
  321. status = intel_sdvo_read_response(intel_output, outputs, sizeof(*outputs));
  322. return (status == SDVO_CMD_STATUS_SUCCESS);
  323. }
  324. static bool intel_sdvo_set_active_outputs(struct intel_output *intel_output,
  325. u16 outputs)
  326. {
  327. u8 status;
  328. intel_sdvo_write_cmd(intel_output, SDVO_CMD_SET_ACTIVE_OUTPUTS, &outputs,
  329. sizeof(outputs));
  330. status = intel_sdvo_read_response(intel_output, NULL, 0);
  331. return (status == SDVO_CMD_STATUS_SUCCESS);
  332. }
  333. static bool intel_sdvo_set_encoder_power_state(struct intel_output *intel_output,
  334. int mode)
  335. {
  336. u8 status, state = SDVO_ENCODER_STATE_ON;
  337. switch (mode) {
  338. case DRM_MODE_DPMS_ON:
  339. state = SDVO_ENCODER_STATE_ON;
  340. break;
  341. case DRM_MODE_DPMS_STANDBY:
  342. state = SDVO_ENCODER_STATE_STANDBY;
  343. break;
  344. case DRM_MODE_DPMS_SUSPEND:
  345. state = SDVO_ENCODER_STATE_SUSPEND;
  346. break;
  347. case DRM_MODE_DPMS_OFF:
  348. state = SDVO_ENCODER_STATE_OFF;
  349. break;
  350. }
  351. intel_sdvo_write_cmd(intel_output, SDVO_CMD_SET_ENCODER_POWER_STATE, &state,
  352. sizeof(state));
  353. status = intel_sdvo_read_response(intel_output, NULL, 0);
  354. return (status == SDVO_CMD_STATUS_SUCCESS);
  355. }
  356. static bool intel_sdvo_get_input_pixel_clock_range(struct intel_output *intel_output,
  357. int *clock_min,
  358. int *clock_max)
  359. {
  360. struct intel_sdvo_pixel_clock_range clocks;
  361. u8 status;
  362. intel_sdvo_write_cmd(intel_output, SDVO_CMD_GET_INPUT_PIXEL_CLOCK_RANGE,
  363. NULL, 0);
  364. status = intel_sdvo_read_response(intel_output, &clocks, sizeof(clocks));
  365. if (status != SDVO_CMD_STATUS_SUCCESS)
  366. return false;
  367. /* Convert the values from units of 10 kHz to kHz. */
  368. *clock_min = clocks.min * 10;
  369. *clock_max = clocks.max * 10;
  370. return true;
  371. }
  372. static bool intel_sdvo_set_target_output(struct intel_output *intel_output,
  373. u16 outputs)
  374. {
  375. u8 status;
  376. intel_sdvo_write_cmd(intel_output, SDVO_CMD_SET_TARGET_OUTPUT, &outputs,
  377. sizeof(outputs));
  378. status = intel_sdvo_read_response(intel_output, NULL, 0);
  379. return (status == SDVO_CMD_STATUS_SUCCESS);
  380. }
  381. static bool intel_sdvo_get_timing(struct intel_output *intel_output, u8 cmd,
  382. struct intel_sdvo_dtd *dtd)
  383. {
  384. u8 status;
  385. intel_sdvo_write_cmd(intel_output, cmd, NULL, 0);
  386. status = intel_sdvo_read_response(intel_output, &dtd->part1,
  387. sizeof(dtd->part1));
  388. if (status != SDVO_CMD_STATUS_SUCCESS)
  389. return false;
  390. intel_sdvo_write_cmd(intel_output, cmd + 1, NULL, 0);
  391. status = intel_sdvo_read_response(intel_output, &dtd->part2,
  392. sizeof(dtd->part2));
  393. if (status != SDVO_CMD_STATUS_SUCCESS)
  394. return false;
  395. return true;
  396. }
  397. static bool intel_sdvo_get_input_timing(struct intel_output *intel_output,
  398. struct intel_sdvo_dtd *dtd)
  399. {
  400. return intel_sdvo_get_timing(intel_output,
  401. SDVO_CMD_GET_INPUT_TIMINGS_PART1, dtd);
  402. }
  403. static bool intel_sdvo_get_output_timing(struct intel_output *intel_output,
  404. struct intel_sdvo_dtd *dtd)
  405. {
  406. return intel_sdvo_get_timing(intel_output,
  407. SDVO_CMD_GET_OUTPUT_TIMINGS_PART1, dtd);
  408. }
  409. static bool intel_sdvo_set_timing(struct intel_output *intel_output, u8 cmd,
  410. struct intel_sdvo_dtd *dtd)
  411. {
  412. u8 status;
  413. intel_sdvo_write_cmd(intel_output, cmd, &dtd->part1, sizeof(dtd->part1));
  414. status = intel_sdvo_read_response(intel_output, NULL, 0);
  415. if (status != SDVO_CMD_STATUS_SUCCESS)
  416. return false;
  417. intel_sdvo_write_cmd(intel_output, cmd + 1, &dtd->part2, sizeof(dtd->part2));
  418. status = intel_sdvo_read_response(intel_output, NULL, 0);
  419. if (status != SDVO_CMD_STATUS_SUCCESS)
  420. return false;
  421. return true;
  422. }
  423. static bool intel_sdvo_set_input_timing(struct intel_output *intel_output,
  424. struct intel_sdvo_dtd *dtd)
  425. {
  426. return intel_sdvo_set_timing(intel_output,
  427. SDVO_CMD_SET_INPUT_TIMINGS_PART1, dtd);
  428. }
  429. static bool intel_sdvo_set_output_timing(struct intel_output *intel_output,
  430. struct intel_sdvo_dtd *dtd)
  431. {
  432. return intel_sdvo_set_timing(intel_output,
  433. SDVO_CMD_SET_OUTPUT_TIMINGS_PART1, dtd);
  434. }
  435. static int intel_sdvo_get_clock_rate_mult(struct intel_output *intel_output)
  436. {
  437. u8 response, status;
  438. intel_sdvo_write_cmd(intel_output, SDVO_CMD_GET_CLOCK_RATE_MULT, NULL, 0);
  439. status = intel_sdvo_read_response(intel_output, &response, 1);
  440. if (status != SDVO_CMD_STATUS_SUCCESS) {
  441. DRM_DEBUG("Couldn't get SDVO clock rate multiplier\n");
  442. return SDVO_CLOCK_RATE_MULT_1X;
  443. } else {
  444. DRM_DEBUG("Current clock rate multiplier: %d\n", response);
  445. }
  446. return response;
  447. }
  448. static bool intel_sdvo_set_clock_rate_mult(struct intel_output *intel_output, u8 val)
  449. {
  450. u8 status;
  451. intel_sdvo_write_cmd(intel_output, SDVO_CMD_SET_CLOCK_RATE_MULT, &val, 1);
  452. status = intel_sdvo_read_response(intel_output, NULL, 0);
  453. if (status != SDVO_CMD_STATUS_SUCCESS)
  454. return false;
  455. return true;
  456. }
  457. static bool intel_sdvo_mode_fixup(struct drm_encoder *encoder,
  458. struct drm_display_mode *mode,
  459. struct drm_display_mode *adjusted_mode)
  460. {
  461. /* Make the CRTC code factor in the SDVO pixel multiplier. The SDVO
  462. * device will be told of the multiplier during mode_set.
  463. */
  464. adjusted_mode->clock *= intel_sdvo_get_pixel_multiplier(mode);
  465. return true;
  466. }
  467. static void intel_sdvo_mode_set(struct drm_encoder *encoder,
  468. struct drm_display_mode *mode,
  469. struct drm_display_mode *adjusted_mode)
  470. {
  471. struct drm_device *dev = encoder->dev;
  472. struct drm_i915_private *dev_priv = dev->dev_private;
  473. struct drm_crtc *crtc = encoder->crtc;
  474. struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
  475. struct intel_output *intel_output = enc_to_intel_output(encoder);
  476. struct intel_sdvo_priv *sdvo_priv = intel_output->dev_priv;
  477. u16 width, height;
  478. u16 h_blank_len, h_sync_len, v_blank_len, v_sync_len;
  479. u16 h_sync_offset, v_sync_offset;
  480. u32 sdvox;
  481. struct intel_sdvo_dtd output_dtd;
  482. int sdvo_pixel_multiply;
  483. if (!mode)
  484. return;
  485. width = mode->crtc_hdisplay;
  486. height = mode->crtc_vdisplay;
  487. /* do some mode translations */
  488. h_blank_len = mode->crtc_hblank_end - mode->crtc_hblank_start;
  489. h_sync_len = mode->crtc_hsync_end - mode->crtc_hsync_start;
  490. v_blank_len = mode->crtc_vblank_end - mode->crtc_vblank_start;
  491. v_sync_len = mode->crtc_vsync_end - mode->crtc_vsync_start;
  492. h_sync_offset = mode->crtc_hsync_start - mode->crtc_hblank_start;
  493. v_sync_offset = mode->crtc_vsync_start - mode->crtc_vblank_start;
  494. output_dtd.part1.clock = mode->clock / 10;
  495. output_dtd.part1.h_active = width & 0xff;
  496. output_dtd.part1.h_blank = h_blank_len & 0xff;
  497. output_dtd.part1.h_high = (((width >> 8) & 0xf) << 4) |
  498. ((h_blank_len >> 8) & 0xf);
  499. output_dtd.part1.v_active = height & 0xff;
  500. output_dtd.part1.v_blank = v_blank_len & 0xff;
  501. output_dtd.part1.v_high = (((height >> 8) & 0xf) << 4) |
  502. ((v_blank_len >> 8) & 0xf);
  503. output_dtd.part2.h_sync_off = h_sync_offset;
  504. output_dtd.part2.h_sync_width = h_sync_len & 0xff;
  505. output_dtd.part2.v_sync_off_width = (v_sync_offset & 0xf) << 4 |
  506. (v_sync_len & 0xf);
  507. output_dtd.part2.sync_off_width_high = ((h_sync_offset & 0x300) >> 2) |
  508. ((h_sync_len & 0x300) >> 4) | ((v_sync_offset & 0x30) >> 2) |
  509. ((v_sync_len & 0x30) >> 4);
  510. output_dtd.part2.dtd_flags = 0x18;
  511. if (mode->flags & DRM_MODE_FLAG_PHSYNC)
  512. output_dtd.part2.dtd_flags |= 0x2;
  513. if (mode->flags & DRM_MODE_FLAG_PVSYNC)
  514. output_dtd.part2.dtd_flags |= 0x4;
  515. output_dtd.part2.sdvo_flags = 0;
  516. output_dtd.part2.v_sync_off_high = v_sync_offset & 0xc0;
  517. output_dtd.part2.reserved = 0;
  518. /* Set the output timing to the screen */
  519. intel_sdvo_set_target_output(intel_output, sdvo_priv->active_outputs);
  520. intel_sdvo_set_output_timing(intel_output, &output_dtd);
  521. /* Set the input timing to the screen. Assume always input 0. */
  522. intel_sdvo_set_target_input(intel_output, true, false);
  523. /* We would like to use i830_sdvo_create_preferred_input_timing() to
  524. * provide the device with a timing it can support, if it supports that
  525. * feature. However, presumably we would need to adjust the CRTC to
  526. * output the preferred timing, and we don't support that currently.
  527. */
  528. intel_sdvo_set_input_timing(intel_output, &output_dtd);
  529. switch (intel_sdvo_get_pixel_multiplier(mode)) {
  530. case 1:
  531. intel_sdvo_set_clock_rate_mult(intel_output,
  532. SDVO_CLOCK_RATE_MULT_1X);
  533. break;
  534. case 2:
  535. intel_sdvo_set_clock_rate_mult(intel_output,
  536. SDVO_CLOCK_RATE_MULT_2X);
  537. break;
  538. case 4:
  539. intel_sdvo_set_clock_rate_mult(intel_output,
  540. SDVO_CLOCK_RATE_MULT_4X);
  541. break;
  542. }
  543. /* Set the SDVO control regs. */
  544. if (0/*IS_I965GM(dev)*/) {
  545. sdvox = SDVO_BORDER_ENABLE;
  546. } else {
  547. sdvox = I915_READ(sdvo_priv->output_device);
  548. switch (sdvo_priv->output_device) {
  549. case SDVOB:
  550. sdvox &= SDVOB_PRESERVE_MASK;
  551. break;
  552. case SDVOC:
  553. sdvox &= SDVOC_PRESERVE_MASK;
  554. break;
  555. }
  556. sdvox |= (9 << 19) | SDVO_BORDER_ENABLE;
  557. }
  558. if (intel_crtc->pipe == 1)
  559. sdvox |= SDVO_PIPE_B_SELECT;
  560. sdvo_pixel_multiply = intel_sdvo_get_pixel_multiplier(mode);
  561. if (IS_I965G(dev)) {
  562. /* done in crtc_mode_set as the dpll_md reg must be written
  563. early */
  564. } else if (IS_I945G(dev) || IS_I945GM(dev)) {
  565. /* done in crtc_mode_set as it lives inside the
  566. dpll register */
  567. } else {
  568. sdvox |= (sdvo_pixel_multiply - 1) << SDVO_PORT_MULTIPLY_SHIFT;
  569. }
  570. intel_sdvo_write_sdvox(intel_output, sdvox);
  571. }
  572. static void intel_sdvo_dpms(struct drm_encoder *encoder, int mode)
  573. {
  574. struct drm_device *dev = encoder->dev;
  575. struct drm_i915_private *dev_priv = dev->dev_private;
  576. struct intel_output *intel_output = enc_to_intel_output(encoder);
  577. struct intel_sdvo_priv *sdvo_priv = intel_output->dev_priv;
  578. u32 temp;
  579. if (mode != DRM_MODE_DPMS_ON) {
  580. intel_sdvo_set_active_outputs(intel_output, 0);
  581. if (0)
  582. intel_sdvo_set_encoder_power_state(intel_output, mode);
  583. if (mode == DRM_MODE_DPMS_OFF) {
  584. temp = I915_READ(sdvo_priv->output_device);
  585. if ((temp & SDVO_ENABLE) != 0) {
  586. intel_sdvo_write_sdvox(intel_output, temp & ~SDVO_ENABLE);
  587. }
  588. }
  589. } else {
  590. bool input1, input2;
  591. int i;
  592. u8 status;
  593. temp = I915_READ(sdvo_priv->output_device);
  594. if ((temp & SDVO_ENABLE) == 0)
  595. intel_sdvo_write_sdvox(intel_output, temp | SDVO_ENABLE);
  596. for (i = 0; i < 2; i++)
  597. intel_wait_for_vblank(dev);
  598. status = intel_sdvo_get_trained_inputs(intel_output, &input1,
  599. &input2);
  600. /* Warn if the device reported failure to sync.
  601. * A lot of SDVO devices fail to notify of sync, but it's
  602. * a given it the status is a success, we succeeded.
  603. */
  604. if (status == SDVO_CMD_STATUS_SUCCESS && !input1) {
  605. DRM_DEBUG("First %s output reported failure to sync\n",
  606. SDVO_NAME(sdvo_priv));
  607. }
  608. if (0)
  609. intel_sdvo_set_encoder_power_state(intel_output, mode);
  610. intel_sdvo_set_active_outputs(intel_output, sdvo_priv->active_outputs);
  611. }
  612. return;
  613. }
  614. static void intel_sdvo_save(struct drm_connector *connector)
  615. {
  616. struct drm_device *dev = connector->dev;
  617. struct drm_i915_private *dev_priv = dev->dev_private;
  618. struct intel_output *intel_output = to_intel_output(connector);
  619. struct intel_sdvo_priv *sdvo_priv = intel_output->dev_priv;
  620. int o;
  621. sdvo_priv->save_sdvo_mult = intel_sdvo_get_clock_rate_mult(intel_output);
  622. intel_sdvo_get_active_outputs(intel_output, &sdvo_priv->save_active_outputs);
  623. if (sdvo_priv->caps.sdvo_inputs_mask & 0x1) {
  624. intel_sdvo_set_target_input(intel_output, true, false);
  625. intel_sdvo_get_input_timing(intel_output,
  626. &sdvo_priv->save_input_dtd_1);
  627. }
  628. if (sdvo_priv->caps.sdvo_inputs_mask & 0x2) {
  629. intel_sdvo_set_target_input(intel_output, false, true);
  630. intel_sdvo_get_input_timing(intel_output,
  631. &sdvo_priv->save_input_dtd_2);
  632. }
  633. for (o = SDVO_OUTPUT_FIRST; o <= SDVO_OUTPUT_LAST; o++)
  634. {
  635. u16 this_output = (1 << o);
  636. if (sdvo_priv->caps.output_flags & this_output)
  637. {
  638. intel_sdvo_set_target_output(intel_output, this_output);
  639. intel_sdvo_get_output_timing(intel_output,
  640. &sdvo_priv->save_output_dtd[o]);
  641. }
  642. }
  643. sdvo_priv->save_SDVOX = I915_READ(sdvo_priv->output_device);
  644. }
  645. static void intel_sdvo_restore(struct drm_connector *connector)
  646. {
  647. struct drm_device *dev = connector->dev;
  648. struct drm_i915_private *dev_priv = dev->dev_private;
  649. struct intel_output *intel_output = to_intel_output(connector);
  650. struct intel_sdvo_priv *sdvo_priv = intel_output->dev_priv;
  651. int o;
  652. int i;
  653. bool input1, input2;
  654. u8 status;
  655. intel_sdvo_set_active_outputs(intel_output, 0);
  656. for (o = SDVO_OUTPUT_FIRST; o <= SDVO_OUTPUT_LAST; o++)
  657. {
  658. u16 this_output = (1 << o);
  659. if (sdvo_priv->caps.output_flags & this_output) {
  660. intel_sdvo_set_target_output(intel_output, this_output);
  661. intel_sdvo_set_output_timing(intel_output, &sdvo_priv->save_output_dtd[o]);
  662. }
  663. }
  664. if (sdvo_priv->caps.sdvo_inputs_mask & 0x1) {
  665. intel_sdvo_set_target_input(intel_output, true, false);
  666. intel_sdvo_set_input_timing(intel_output, &sdvo_priv->save_input_dtd_1);
  667. }
  668. if (sdvo_priv->caps.sdvo_inputs_mask & 0x2) {
  669. intel_sdvo_set_target_input(intel_output, false, true);
  670. intel_sdvo_set_input_timing(intel_output, &sdvo_priv->save_input_dtd_2);
  671. }
  672. intel_sdvo_set_clock_rate_mult(intel_output, sdvo_priv->save_sdvo_mult);
  673. I915_WRITE(sdvo_priv->output_device, sdvo_priv->save_SDVOX);
  674. if (sdvo_priv->save_SDVOX & SDVO_ENABLE)
  675. {
  676. for (i = 0; i < 2; i++)
  677. intel_wait_for_vblank(dev);
  678. status = intel_sdvo_get_trained_inputs(intel_output, &input1, &input2);
  679. if (status == SDVO_CMD_STATUS_SUCCESS && !input1)
  680. DRM_DEBUG("First %s output reported failure to sync\n",
  681. SDVO_NAME(sdvo_priv));
  682. }
  683. intel_sdvo_set_active_outputs(intel_output, sdvo_priv->save_active_outputs);
  684. }
  685. static int intel_sdvo_mode_valid(struct drm_connector *connector,
  686. struct drm_display_mode *mode)
  687. {
  688. struct intel_output *intel_output = to_intel_output(connector);
  689. struct intel_sdvo_priv *sdvo_priv = intel_output->dev_priv;
  690. if (mode->flags & DRM_MODE_FLAG_DBLSCAN)
  691. return MODE_NO_DBLESCAN;
  692. if (sdvo_priv->pixel_clock_min > mode->clock)
  693. return MODE_CLOCK_LOW;
  694. if (sdvo_priv->pixel_clock_max < mode->clock)
  695. return MODE_CLOCK_HIGH;
  696. return MODE_OK;
  697. }
  698. static bool intel_sdvo_get_capabilities(struct intel_output *intel_output, struct intel_sdvo_caps *caps)
  699. {
  700. u8 status;
  701. intel_sdvo_write_cmd(intel_output, SDVO_CMD_GET_DEVICE_CAPS, NULL, 0);
  702. status = intel_sdvo_read_response(intel_output, caps, sizeof(*caps));
  703. if (status != SDVO_CMD_STATUS_SUCCESS)
  704. return false;
  705. return true;
  706. }
  707. struct drm_connector* intel_sdvo_find(struct drm_device *dev, int sdvoB)
  708. {
  709. struct drm_connector *connector = NULL;
  710. struct intel_output *iout = NULL;
  711. struct intel_sdvo_priv *sdvo;
  712. /* find the sdvo connector */
  713. list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
  714. iout = to_intel_output(connector);
  715. if (iout->type != INTEL_OUTPUT_SDVO)
  716. continue;
  717. sdvo = iout->dev_priv;
  718. if (sdvo->output_device == SDVOB && sdvoB)
  719. return connector;
  720. if (sdvo->output_device == SDVOC && !sdvoB)
  721. return connector;
  722. }
  723. return NULL;
  724. }
  725. int intel_sdvo_supports_hotplug(struct drm_connector *connector)
  726. {
  727. u8 response[2];
  728. u8 status;
  729. struct intel_output *intel_output;
  730. DRM_DEBUG("\n");
  731. if (!connector)
  732. return 0;
  733. intel_output = to_intel_output(connector);
  734. intel_sdvo_write_cmd(intel_output, SDVO_CMD_GET_HOT_PLUG_SUPPORT, NULL, 0);
  735. status = intel_sdvo_read_response(intel_output, &response, 2);
  736. if (response[0] !=0)
  737. return 1;
  738. return 0;
  739. }
  740. void intel_sdvo_set_hotplug(struct drm_connector *connector, int on)
  741. {
  742. u8 response[2];
  743. u8 status;
  744. struct intel_output *intel_output = to_intel_output(connector);
  745. intel_sdvo_write_cmd(intel_output, SDVO_CMD_GET_ACTIVE_HOT_PLUG, NULL, 0);
  746. intel_sdvo_read_response(intel_output, &response, 2);
  747. if (on) {
  748. intel_sdvo_write_cmd(intel_output, SDVO_CMD_GET_HOT_PLUG_SUPPORT, NULL, 0);
  749. status = intel_sdvo_read_response(intel_output, &response, 2);
  750. intel_sdvo_write_cmd(intel_output, SDVO_CMD_SET_ACTIVE_HOT_PLUG, &response, 2);
  751. } else {
  752. response[0] = 0;
  753. response[1] = 0;
  754. intel_sdvo_write_cmd(intel_output, SDVO_CMD_SET_ACTIVE_HOT_PLUG, &response, 2);
  755. }
  756. intel_sdvo_write_cmd(intel_output, SDVO_CMD_GET_ACTIVE_HOT_PLUG, NULL, 0);
  757. intel_sdvo_read_response(intel_output, &response, 2);
  758. }
  759. static enum drm_connector_status intel_sdvo_detect(struct drm_connector *connector)
  760. {
  761. u8 response[2];
  762. u8 status;
  763. struct intel_output *intel_output = to_intel_output(connector);
  764. intel_sdvo_write_cmd(intel_output, SDVO_CMD_GET_ATTACHED_DISPLAYS, NULL, 0);
  765. status = intel_sdvo_read_response(intel_output, &response, 2);
  766. DRM_DEBUG("SDVO response %d %d\n", response[0], response[1]);
  767. if ((response[0] != 0) || (response[1] != 0))
  768. return connector_status_connected;
  769. else
  770. return connector_status_disconnected;
  771. }
  772. static int intel_sdvo_get_modes(struct drm_connector *connector)
  773. {
  774. struct intel_output *intel_output = to_intel_output(connector);
  775. /* set the bus switch and get the modes */
  776. intel_sdvo_set_control_bus_switch(intel_output, SDVO_CONTROL_BUS_DDC2);
  777. intel_ddc_get_modes(intel_output);
  778. if (list_empty(&connector->probed_modes))
  779. return 0;
  780. return 1;
  781. }
  782. static void intel_sdvo_destroy(struct drm_connector *connector)
  783. {
  784. struct intel_output *intel_output = to_intel_output(connector);
  785. if (intel_output->i2c_bus)
  786. intel_i2c_destroy(intel_output->i2c_bus);
  787. drm_sysfs_connector_remove(connector);
  788. drm_connector_cleanup(connector);
  789. kfree(intel_output);
  790. }
  791. static const struct drm_encoder_helper_funcs intel_sdvo_helper_funcs = {
  792. .dpms = intel_sdvo_dpms,
  793. .mode_fixup = intel_sdvo_mode_fixup,
  794. .prepare = intel_encoder_prepare,
  795. .mode_set = intel_sdvo_mode_set,
  796. .commit = intel_encoder_commit,
  797. };
  798. static const struct drm_connector_funcs intel_sdvo_connector_funcs = {
  799. .save = intel_sdvo_save,
  800. .restore = intel_sdvo_restore,
  801. .detect = intel_sdvo_detect,
  802. .fill_modes = drm_helper_probe_single_connector_modes,
  803. .destroy = intel_sdvo_destroy,
  804. };
  805. static const struct drm_connector_helper_funcs intel_sdvo_connector_helper_funcs = {
  806. .get_modes = intel_sdvo_get_modes,
  807. .mode_valid = intel_sdvo_mode_valid,
  808. .best_encoder = intel_best_encoder,
  809. };
  810. static void intel_sdvo_enc_destroy(struct drm_encoder *encoder)
  811. {
  812. drm_encoder_cleanup(encoder);
  813. }
  814. static const struct drm_encoder_funcs intel_sdvo_enc_funcs = {
  815. .destroy = intel_sdvo_enc_destroy,
  816. };
  817. void intel_sdvo_init(struct drm_device *dev, int output_device)
  818. {
  819. struct drm_connector *connector;
  820. struct intel_output *intel_output;
  821. struct intel_sdvo_priv *sdvo_priv;
  822. struct intel_i2c_chan *i2cbus = NULL;
  823. int connector_type;
  824. u8 ch[0x40];
  825. int i;
  826. int encoder_type, output_id;
  827. intel_output = kcalloc(sizeof(struct intel_output)+sizeof(struct intel_sdvo_priv), 1, GFP_KERNEL);
  828. if (!intel_output) {
  829. return;
  830. }
  831. connector = &intel_output->base;
  832. drm_connector_init(dev, connector, &intel_sdvo_connector_funcs,
  833. DRM_MODE_CONNECTOR_Unknown);
  834. drm_connector_helper_add(connector, &intel_sdvo_connector_helper_funcs);
  835. sdvo_priv = (struct intel_sdvo_priv *)(intel_output + 1);
  836. intel_output->type = INTEL_OUTPUT_SDVO;
  837. connector->interlace_allowed = 0;
  838. connector->doublescan_allowed = 0;
  839. /* setup the DDC bus. */
  840. if (output_device == SDVOB)
  841. i2cbus = intel_i2c_create(dev, GPIOE, "SDVOCTRL_E for SDVOB");
  842. else
  843. i2cbus = intel_i2c_create(dev, GPIOE, "SDVOCTRL_E for SDVOC");
  844. if (!i2cbus)
  845. goto err_connector;
  846. sdvo_priv->i2c_bus = i2cbus;
  847. if (output_device == SDVOB) {
  848. output_id = 1;
  849. sdvo_priv->i2c_bus->slave_addr = 0x38;
  850. } else {
  851. output_id = 2;
  852. sdvo_priv->i2c_bus->slave_addr = 0x39;
  853. }
  854. sdvo_priv->output_device = output_device;
  855. intel_output->i2c_bus = i2cbus;
  856. intel_output->dev_priv = sdvo_priv;
  857. /* Read the regs to test if we can talk to the device */
  858. for (i = 0; i < 0x40; i++) {
  859. if (!intel_sdvo_read_byte(intel_output, i, &ch[i])) {
  860. DRM_DEBUG("No SDVO device found on SDVO%c\n",
  861. output_device == SDVOB ? 'B' : 'C');
  862. goto err_i2c;
  863. }
  864. }
  865. intel_sdvo_get_capabilities(intel_output, &sdvo_priv->caps);
  866. memset(&sdvo_priv->active_outputs, 0, sizeof(sdvo_priv->active_outputs));
  867. /* TODO, CVBS, SVID, YPRPB & SCART outputs. */
  868. if (sdvo_priv->caps.output_flags & SDVO_OUTPUT_RGB0)
  869. {
  870. sdvo_priv->active_outputs = SDVO_OUTPUT_RGB0;
  871. connector->display_info.subpixel_order = SubPixelHorizontalRGB;
  872. encoder_type = DRM_MODE_ENCODER_DAC;
  873. connector_type = DRM_MODE_CONNECTOR_VGA;
  874. }
  875. else if (sdvo_priv->caps.output_flags & SDVO_OUTPUT_RGB1)
  876. {
  877. sdvo_priv->active_outputs = SDVO_OUTPUT_RGB1;
  878. connector->display_info.subpixel_order = SubPixelHorizontalRGB;
  879. encoder_type = DRM_MODE_ENCODER_DAC;
  880. connector_type = DRM_MODE_CONNECTOR_VGA;
  881. }
  882. else if (sdvo_priv->caps.output_flags & SDVO_OUTPUT_TMDS0)
  883. {
  884. sdvo_priv->active_outputs = SDVO_OUTPUT_TMDS0;
  885. connector->display_info.subpixel_order = SubPixelHorizontalRGB;
  886. encoder_type = DRM_MODE_ENCODER_TMDS;
  887. connector_type = DRM_MODE_CONNECTOR_DVID;
  888. }
  889. else if (sdvo_priv->caps.output_flags & SDVO_OUTPUT_TMDS1)
  890. {
  891. sdvo_priv->active_outputs = SDVO_OUTPUT_TMDS1;
  892. connector->display_info.subpixel_order = SubPixelHorizontalRGB;
  893. encoder_type = DRM_MODE_ENCODER_TMDS;
  894. connector_type = DRM_MODE_CONNECTOR_DVID;
  895. }
  896. else
  897. {
  898. unsigned char bytes[2];
  899. memcpy (bytes, &sdvo_priv->caps.output_flags, 2);
  900. DRM_DEBUG("%s: No active RGB or TMDS outputs (0x%02x%02x)\n",
  901. SDVO_NAME(sdvo_priv),
  902. bytes[0], bytes[1]);
  903. goto err_i2c;
  904. }
  905. drm_encoder_init(dev, &intel_output->enc, &intel_sdvo_enc_funcs, encoder_type);
  906. drm_encoder_helper_add(&intel_output->enc, &intel_sdvo_helper_funcs);
  907. connector->connector_type = connector_type;
  908. drm_mode_connector_attach_encoder(&intel_output->base, &intel_output->enc);
  909. drm_sysfs_connector_add(connector);
  910. /* Set the input timing to the screen. Assume always input 0. */
  911. intel_sdvo_set_target_input(intel_output, true, false);
  912. intel_sdvo_get_input_pixel_clock_range(intel_output,
  913. &sdvo_priv->pixel_clock_min,
  914. &sdvo_priv->pixel_clock_max);
  915. DRM_DEBUG("%s device VID/DID: %02X:%02X.%02X, "
  916. "clock range %dMHz - %dMHz, "
  917. "input 1: %c, input 2: %c, "
  918. "output 1: %c, output 2: %c\n",
  919. SDVO_NAME(sdvo_priv),
  920. sdvo_priv->caps.vendor_id, sdvo_priv->caps.device_id,
  921. sdvo_priv->caps.device_rev_id,
  922. sdvo_priv->pixel_clock_min / 1000,
  923. sdvo_priv->pixel_clock_max / 1000,
  924. (sdvo_priv->caps.sdvo_inputs_mask & 0x1) ? 'Y' : 'N',
  925. (sdvo_priv->caps.sdvo_inputs_mask & 0x2) ? 'Y' : 'N',
  926. /* check currently supported outputs */
  927. sdvo_priv->caps.output_flags &
  928. (SDVO_OUTPUT_TMDS0 | SDVO_OUTPUT_RGB0) ? 'Y' : 'N',
  929. sdvo_priv->caps.output_flags &
  930. (SDVO_OUTPUT_TMDS1 | SDVO_OUTPUT_RGB1) ? 'Y' : 'N');
  931. intel_output->ddc_bus = i2cbus;
  932. return;
  933. err_i2c:
  934. intel_i2c_destroy(intel_output->i2c_bus);
  935. err_connector:
  936. drm_connector_cleanup(connector);
  937. kfree(intel_output);
  938. return;
  939. }