radeon_connectors.c 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802
  1. /*
  2. * Copyright 2007-8 Advanced Micro Devices, Inc.
  3. * Copyright 2008 Red Hat Inc.
  4. *
  5. * Permission is hereby granted, free of charge, to any person obtaining a
  6. * copy of this software and associated documentation files (the "Software"),
  7. * to deal in the Software without restriction, including without limitation
  8. * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  9. * and/or sell copies of the Software, and to permit persons to whom the
  10. * Software is furnished to do so, subject to the following conditions:
  11. *
  12. * The above copyright notice and this permission notice shall be included in
  13. * all copies or substantial portions of the Software.
  14. *
  15. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  16. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  17. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
  18. * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
  19. * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  20. * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  21. * OTHER DEALINGS IN THE SOFTWARE.
  22. *
  23. * Authors: Dave Airlie
  24. * Alex Deucher
  25. */
  26. #include "drmP.h"
  27. #include "drm_edid.h"
  28. #include "drm_crtc_helper.h"
  29. #include "radeon_drm.h"
  30. #include "radeon.h"
  31. #include "atom.h"
  32. extern void
  33. radeon_combios_connected_scratch_regs(struct drm_connector *connector,
  34. struct drm_encoder *encoder,
  35. bool connected);
  36. extern void
  37. radeon_atombios_connected_scratch_regs(struct drm_connector *connector,
  38. struct drm_encoder *encoder,
  39. bool connected);
  40. static void
  41. radeon_connector_update_scratch_regs(struct drm_connector *connector, enum drm_connector_status status)
  42. {
  43. struct drm_device *dev = connector->dev;
  44. struct radeon_device *rdev = dev->dev_private;
  45. struct drm_encoder *best_encoder = NULL;
  46. struct drm_encoder *encoder = NULL;
  47. struct drm_connector_helper_funcs *connector_funcs = connector->helper_private;
  48. struct drm_mode_object *obj;
  49. bool connected;
  50. int i;
  51. best_encoder = connector_funcs->best_encoder(connector);
  52. for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
  53. if (connector->encoder_ids[i] == 0)
  54. break;
  55. obj = drm_mode_object_find(connector->dev,
  56. connector->encoder_ids[i],
  57. DRM_MODE_OBJECT_ENCODER);
  58. if (!obj)
  59. continue;
  60. encoder = obj_to_encoder(obj);
  61. if ((encoder == best_encoder) && (status == connector_status_connected))
  62. connected = true;
  63. else
  64. connected = false;
  65. if (rdev->is_atom_bios)
  66. radeon_atombios_connected_scratch_regs(connector, encoder, connected);
  67. else
  68. radeon_combios_connected_scratch_regs(connector, encoder, connected);
  69. }
  70. }
  71. struct drm_encoder *radeon_best_single_encoder(struct drm_connector *connector)
  72. {
  73. int enc_id = connector->encoder_ids[0];
  74. struct drm_mode_object *obj;
  75. struct drm_encoder *encoder;
  76. /* pick the encoder ids */
  77. if (enc_id) {
  78. obj = drm_mode_object_find(connector->dev, enc_id, DRM_MODE_OBJECT_ENCODER);
  79. if (!obj)
  80. return NULL;
  81. encoder = obj_to_encoder(obj);
  82. return encoder;
  83. }
  84. return NULL;
  85. }
  86. /*
  87. * radeon_connector_analog_encoder_conflict_solve
  88. * - search for other connectors sharing this encoder
  89. * if priority is true, then set them disconnected if this is connected
  90. * if priority is false, set us disconnected if they are connected
  91. */
  92. static enum drm_connector_status
  93. radeon_connector_analog_encoder_conflict_solve(struct drm_connector *connector,
  94. struct drm_encoder *encoder,
  95. enum drm_connector_status current_status,
  96. bool priority)
  97. {
  98. struct drm_device *dev = connector->dev;
  99. struct drm_connector *conflict;
  100. int i;
  101. list_for_each_entry(conflict, &dev->mode_config.connector_list, head) {
  102. if (conflict == connector)
  103. continue;
  104. for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
  105. if (conflict->encoder_ids[i] == 0)
  106. break;
  107. /* if the IDs match */
  108. if (conflict->encoder_ids[i] == encoder->base.id) {
  109. if (conflict->status != connector_status_connected)
  110. continue;
  111. if (priority == true) {
  112. DRM_INFO("1: conflicting encoders switching off %s\n", drm_get_connector_name(conflict));
  113. DRM_INFO("in favor of %s\n", drm_get_connector_name(connector));
  114. conflict->status = connector_status_disconnected;
  115. radeon_connector_update_scratch_regs(conflict, connector_status_disconnected);
  116. } else {
  117. DRM_INFO("2: conflicting encoders switching off %s\n", drm_get_connector_name(connector));
  118. DRM_INFO("in favor of %s\n", drm_get_connector_name(conflict));
  119. current_status = connector_status_disconnected;
  120. }
  121. break;
  122. }
  123. }
  124. }
  125. return current_status;
  126. }
  127. static struct drm_display_mode *radeon_fp_native_mode(struct drm_encoder *encoder)
  128. {
  129. struct drm_device *dev = encoder->dev;
  130. struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
  131. struct drm_display_mode *mode = NULL;
  132. struct radeon_native_mode *native_mode = &radeon_encoder->native_mode;
  133. if (native_mode->panel_xres != 0 &&
  134. native_mode->panel_yres != 0 &&
  135. native_mode->dotclock != 0) {
  136. mode = drm_mode_create(dev);
  137. mode->hdisplay = native_mode->panel_xres;
  138. mode->vdisplay = native_mode->panel_yres;
  139. mode->htotal = mode->hdisplay + native_mode->hblank;
  140. mode->hsync_start = mode->hdisplay + native_mode->hoverplus;
  141. mode->hsync_end = mode->hsync_start + native_mode->hsync_width;
  142. mode->vtotal = mode->vdisplay + native_mode->vblank;
  143. mode->vsync_start = mode->vdisplay + native_mode->voverplus;
  144. mode->vsync_end = mode->vsync_start + native_mode->vsync_width;
  145. mode->clock = native_mode->dotclock;
  146. mode->flags = 0;
  147. mode->type = DRM_MODE_TYPE_PREFERRED | DRM_MODE_TYPE_DRIVER;
  148. drm_mode_set_name(mode);
  149. DRM_DEBUG("Adding native panel mode %s\n", mode->name);
  150. }
  151. return mode;
  152. }
  153. static void radeon_add_common_modes(struct drm_encoder *encoder, struct drm_connector *connector)
  154. {
  155. struct drm_device *dev = encoder->dev;
  156. struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
  157. struct drm_display_mode *mode = NULL;
  158. struct radeon_native_mode *native_mode = &radeon_encoder->native_mode;
  159. int i;
  160. struct mode_size {
  161. int w;
  162. int h;
  163. } common_modes[17] = {
  164. { 640, 480},
  165. { 720, 480},
  166. { 800, 600},
  167. { 848, 480},
  168. {1024, 768},
  169. {1152, 768},
  170. {1280, 720},
  171. {1280, 800},
  172. {1280, 854},
  173. {1280, 960},
  174. {1280, 1024},
  175. {1440, 900},
  176. {1400, 1050},
  177. {1680, 1050},
  178. {1600, 1200},
  179. {1920, 1080},
  180. {1920, 1200}
  181. };
  182. for (i = 0; i < 17; i++) {
  183. if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) {
  184. if (common_modes[i].w >= native_mode->panel_xres &&
  185. common_modes[i].h >= native_mode->panel_yres)
  186. continue;
  187. }
  188. if (common_modes[i].w < 320 || common_modes[i].h < 200)
  189. continue;
  190. mode = drm_cvt_mode(dev, common_modes[i].w, common_modes[i].h, 60, false, false);
  191. drm_mode_probed_add(connector, mode);
  192. }
  193. }
  194. int radeon_connector_set_property(struct drm_connector *connector, struct drm_property *property,
  195. uint64_t val)
  196. {
  197. return 0;
  198. }
  199. static int radeon_lvds_get_modes(struct drm_connector *connector)
  200. {
  201. struct radeon_connector *radeon_connector = to_radeon_connector(connector);
  202. struct drm_encoder *encoder;
  203. int ret = 0;
  204. struct drm_display_mode *mode;
  205. if (radeon_connector->ddc_bus) {
  206. ret = radeon_ddc_get_modes(radeon_connector);
  207. if (ret > 0) {
  208. encoder = radeon_best_single_encoder(connector);
  209. if (encoder)
  210. /* add scaled modes */
  211. radeon_add_common_modes(encoder, connector);
  212. return ret;
  213. }
  214. }
  215. encoder = radeon_best_single_encoder(connector);
  216. if (!encoder)
  217. return 0;
  218. /* we have no EDID modes */
  219. mode = radeon_fp_native_mode(encoder);
  220. if (mode) {
  221. ret = 1;
  222. drm_mode_probed_add(connector, mode);
  223. /* add scaled modes */
  224. radeon_add_common_modes(encoder, connector);
  225. }
  226. return ret;
  227. }
  228. static int radeon_lvds_mode_valid(struct drm_connector *connector,
  229. struct drm_display_mode *mode)
  230. {
  231. return MODE_OK;
  232. }
  233. static enum drm_connector_status radeon_lvds_detect(struct drm_connector *connector)
  234. {
  235. enum drm_connector_status ret = connector_status_connected;
  236. /* check acpi lid status ??? */
  237. radeon_connector_update_scratch_regs(connector, ret);
  238. return ret;
  239. }
  240. static void radeon_connector_destroy(struct drm_connector *connector)
  241. {
  242. struct radeon_connector *radeon_connector = to_radeon_connector(connector);
  243. if (radeon_connector->ddc_bus)
  244. radeon_i2c_destroy(radeon_connector->ddc_bus);
  245. kfree(radeon_connector->con_priv);
  246. drm_sysfs_connector_remove(connector);
  247. drm_connector_cleanup(connector);
  248. kfree(connector);
  249. }
  250. struct drm_connector_helper_funcs radeon_lvds_connector_helper_funcs = {
  251. .get_modes = radeon_lvds_get_modes,
  252. .mode_valid = radeon_lvds_mode_valid,
  253. .best_encoder = radeon_best_single_encoder,
  254. };
  255. struct drm_connector_funcs radeon_lvds_connector_funcs = {
  256. .dpms = drm_helper_connector_dpms,
  257. .detect = radeon_lvds_detect,
  258. .fill_modes = drm_helper_probe_single_connector_modes,
  259. .destroy = radeon_connector_destroy,
  260. .set_property = radeon_connector_set_property,
  261. };
  262. static int radeon_vga_get_modes(struct drm_connector *connector)
  263. {
  264. struct radeon_connector *radeon_connector = to_radeon_connector(connector);
  265. int ret;
  266. ret = radeon_ddc_get_modes(radeon_connector);
  267. return ret;
  268. }
  269. static int radeon_vga_mode_valid(struct drm_connector *connector,
  270. struct drm_display_mode *mode)
  271. {
  272. return MODE_OK;
  273. }
  274. static enum drm_connector_status radeon_vga_detect(struct drm_connector *connector)
  275. {
  276. struct radeon_connector *radeon_connector = to_radeon_connector(connector);
  277. struct drm_encoder *encoder;
  278. struct drm_encoder_helper_funcs *encoder_funcs;
  279. bool dret;
  280. enum drm_connector_status ret = connector_status_disconnected;
  281. encoder = radeon_best_single_encoder(connector);
  282. if (!encoder)
  283. ret = connector_status_disconnected;
  284. radeon_i2c_do_lock(radeon_connector, 1);
  285. dret = radeon_ddc_probe(radeon_connector);
  286. radeon_i2c_do_lock(radeon_connector, 0);
  287. if (dret)
  288. ret = connector_status_connected;
  289. else {
  290. encoder_funcs = encoder->helper_private;
  291. ret = encoder_funcs->detect(encoder, connector);
  292. }
  293. if (ret == connector_status_connected)
  294. ret = radeon_connector_analog_encoder_conflict_solve(connector, encoder, ret, true);
  295. radeon_connector_update_scratch_regs(connector, ret);
  296. return ret;
  297. }
  298. struct drm_connector_helper_funcs radeon_vga_connector_helper_funcs = {
  299. .get_modes = radeon_vga_get_modes,
  300. .mode_valid = radeon_vga_mode_valid,
  301. .best_encoder = radeon_best_single_encoder,
  302. };
  303. struct drm_connector_funcs radeon_vga_connector_funcs = {
  304. .dpms = drm_helper_connector_dpms,
  305. .detect = radeon_vga_detect,
  306. .fill_modes = drm_helper_probe_single_connector_modes,
  307. .destroy = radeon_connector_destroy,
  308. .set_property = radeon_connector_set_property,
  309. };
  310. static int radeon_tv_get_modes(struct drm_connector *connector)
  311. {
  312. struct drm_device *dev = connector->dev;
  313. struct radeon_device *rdev = dev->dev_private;
  314. struct drm_display_mode *tv_mode;
  315. struct drm_encoder *encoder;
  316. encoder = radeon_best_single_encoder(connector);
  317. if (!encoder)
  318. return 0;
  319. /* avivo chips can scale any mode */
  320. if (rdev->family >= CHIP_RS600)
  321. /* add scaled modes */
  322. radeon_add_common_modes(encoder, connector);
  323. else {
  324. /* only 800x600 is supported right now on pre-avivo chips */
  325. tv_mode = drm_cvt_mode(dev, 800, 600, 60, false, false);
  326. tv_mode->type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED;
  327. drm_mode_probed_add(connector, tv_mode);
  328. }
  329. return 1;
  330. }
  331. static int radeon_tv_mode_valid(struct drm_connector *connector,
  332. struct drm_display_mode *mode)
  333. {
  334. return MODE_OK;
  335. }
  336. static enum drm_connector_status radeon_tv_detect(struct drm_connector *connector)
  337. {
  338. struct drm_encoder *encoder;
  339. struct drm_encoder_helper_funcs *encoder_funcs;
  340. int ret;
  341. encoder = radeon_best_single_encoder(connector);
  342. if (!encoder)
  343. ret = connector_status_disconnected;
  344. else {
  345. encoder_funcs = encoder->helper_private;
  346. ret = encoder_funcs->detect(encoder, connector);
  347. }
  348. if (ret == connector_status_connected)
  349. ret = radeon_connector_analog_encoder_conflict_solve(connector, encoder, ret, false);
  350. radeon_connector_update_scratch_regs(connector, ret);
  351. return ret;
  352. }
  353. struct drm_connector_helper_funcs radeon_tv_connector_helper_funcs = {
  354. .get_modes = radeon_tv_get_modes,
  355. .mode_valid = radeon_tv_mode_valid,
  356. .best_encoder = radeon_best_single_encoder,
  357. };
  358. struct drm_connector_funcs radeon_tv_connector_funcs = {
  359. .dpms = drm_helper_connector_dpms,
  360. .detect = radeon_tv_detect,
  361. .fill_modes = drm_helper_probe_single_connector_modes,
  362. .destroy = radeon_connector_destroy,
  363. .set_property = radeon_connector_set_property,
  364. };
  365. static int radeon_dvi_get_modes(struct drm_connector *connector)
  366. {
  367. struct radeon_connector *radeon_connector = to_radeon_connector(connector);
  368. int ret;
  369. ret = radeon_ddc_get_modes(radeon_connector);
  370. return ret;
  371. }
  372. /*
  373. * DVI is complicated
  374. * Do a DDC probe, if DDC probe passes, get the full EDID so
  375. * we can do analog/digital monitor detection at this point.
  376. * If the monitor is an analog monitor or we got no DDC,
  377. * we need to find the DAC encoder object for this connector.
  378. * If we got no DDC, we do load detection on the DAC encoder object.
  379. * If we got analog DDC or load detection passes on the DAC encoder
  380. * we have to check if this analog encoder is shared with anyone else (TV)
  381. * if its shared we have to set the other connector to disconnected.
  382. */
  383. static enum drm_connector_status radeon_dvi_detect(struct drm_connector *connector)
  384. {
  385. struct radeon_connector *radeon_connector = to_radeon_connector(connector);
  386. struct drm_encoder *encoder = NULL;
  387. struct drm_encoder_helper_funcs *encoder_funcs;
  388. struct drm_mode_object *obj;
  389. int i;
  390. enum drm_connector_status ret = connector_status_disconnected;
  391. bool dret;
  392. radeon_i2c_do_lock(radeon_connector, 1);
  393. dret = radeon_ddc_probe(radeon_connector);
  394. radeon_i2c_do_lock(radeon_connector, 0);
  395. if (dret) {
  396. radeon_i2c_do_lock(radeon_connector, 1);
  397. radeon_connector->edid = drm_get_edid(&radeon_connector->base, &radeon_connector->ddc_bus->adapter);
  398. radeon_i2c_do_lock(radeon_connector, 0);
  399. if (!radeon_connector->edid) {
  400. DRM_ERROR("DDC responded but not EDID found for %s\n",
  401. drm_get_connector_name(connector));
  402. } else {
  403. radeon_connector->use_digital = !!(radeon_connector->edid->input & DRM_EDID_INPUT_DIGITAL);
  404. /* if this isn't a digital monitor
  405. then we need to make sure we don't have any
  406. TV conflicts */
  407. ret = connector_status_connected;
  408. }
  409. }
  410. if ((ret == connector_status_connected) && (radeon_connector->use_digital == true))
  411. goto out;
  412. /* find analog encoder */
  413. for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
  414. if (connector->encoder_ids[i] == 0)
  415. break;
  416. obj = drm_mode_object_find(connector->dev,
  417. connector->encoder_ids[i],
  418. DRM_MODE_OBJECT_ENCODER);
  419. if (!obj)
  420. continue;
  421. encoder = obj_to_encoder(obj);
  422. encoder_funcs = encoder->helper_private;
  423. if (encoder_funcs->detect) {
  424. if (ret != connector_status_connected) {
  425. ret = encoder_funcs->detect(encoder, connector);
  426. if (ret == connector_status_connected) {
  427. radeon_connector->use_digital = false;
  428. }
  429. }
  430. break;
  431. }
  432. }
  433. if ((ret == connector_status_connected) && (radeon_connector->use_digital == false) &&
  434. encoder) {
  435. ret = radeon_connector_analog_encoder_conflict_solve(connector, encoder, ret, true);
  436. }
  437. out:
  438. /* updated in get modes as well since we need to know if it's analog or digital */
  439. radeon_connector_update_scratch_regs(connector, ret);
  440. return ret;
  441. }
  442. /* okay need to be smart in here about which encoder to pick */
  443. struct drm_encoder *radeon_dvi_encoder(struct drm_connector *connector)
  444. {
  445. int enc_id = connector->encoder_ids[0];
  446. struct radeon_connector *radeon_connector = to_radeon_connector(connector);
  447. struct drm_mode_object *obj;
  448. struct drm_encoder *encoder;
  449. int i;
  450. for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
  451. if (connector->encoder_ids[i] == 0)
  452. break;
  453. obj = drm_mode_object_find(connector->dev, connector->encoder_ids[i], DRM_MODE_OBJECT_ENCODER);
  454. if (!obj)
  455. continue;
  456. encoder = obj_to_encoder(obj);
  457. if (radeon_connector->use_digital == true) {
  458. if (encoder->encoder_type == DRM_MODE_ENCODER_TMDS)
  459. return encoder;
  460. } else {
  461. if (encoder->encoder_type == DRM_MODE_ENCODER_DAC ||
  462. encoder->encoder_type == DRM_MODE_ENCODER_TVDAC)
  463. return encoder;
  464. }
  465. }
  466. /* see if we have a default encoder TODO */
  467. /* then check use digitial */
  468. /* pick the first one */
  469. if (enc_id) {
  470. obj = drm_mode_object_find(connector->dev, enc_id, DRM_MODE_OBJECT_ENCODER);
  471. if (!obj)
  472. return NULL;
  473. encoder = obj_to_encoder(obj);
  474. return encoder;
  475. }
  476. return NULL;
  477. }
  478. struct drm_connector_helper_funcs radeon_dvi_connector_helper_funcs = {
  479. .get_modes = radeon_dvi_get_modes,
  480. .mode_valid = radeon_vga_mode_valid,
  481. .best_encoder = radeon_dvi_encoder,
  482. };
  483. struct drm_connector_funcs radeon_dvi_connector_funcs = {
  484. .dpms = drm_helper_connector_dpms,
  485. .detect = radeon_dvi_detect,
  486. .fill_modes = drm_helper_probe_single_connector_modes,
  487. .set_property = radeon_connector_set_property,
  488. .destroy = radeon_connector_destroy,
  489. };
  490. void
  491. radeon_add_atom_connector(struct drm_device *dev,
  492. uint32_t connector_id,
  493. uint32_t supported_device,
  494. int connector_type,
  495. struct radeon_i2c_bus_rec *i2c_bus,
  496. bool linkb,
  497. uint32_t igp_lane_info)
  498. {
  499. struct drm_connector *connector;
  500. struct radeon_connector *radeon_connector;
  501. struct radeon_connector_atom_dig *radeon_dig_connector;
  502. uint32_t subpixel_order = SubPixelNone;
  503. /* fixme - tv/cv/din */
  504. if (connector_type == DRM_MODE_CONNECTOR_Unknown)
  505. return;
  506. /* see if we already added it */
  507. list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
  508. radeon_connector = to_radeon_connector(connector);
  509. if (radeon_connector->connector_id == connector_id) {
  510. radeon_connector->devices |= supported_device;
  511. return;
  512. }
  513. }
  514. radeon_connector = kzalloc(sizeof(struct radeon_connector), GFP_KERNEL);
  515. if (!radeon_connector)
  516. return;
  517. connector = &radeon_connector->base;
  518. radeon_connector->connector_id = connector_id;
  519. radeon_connector->devices = supported_device;
  520. switch (connector_type) {
  521. case DRM_MODE_CONNECTOR_VGA:
  522. drm_connector_init(dev, &radeon_connector->base, &radeon_vga_connector_funcs, connector_type);
  523. drm_connector_helper_add(&radeon_connector->base, &radeon_vga_connector_helper_funcs);
  524. if (i2c_bus->valid) {
  525. radeon_connector->ddc_bus = radeon_i2c_create(dev, i2c_bus, "VGA");
  526. if (!radeon_connector->ddc_bus)
  527. goto failed;
  528. }
  529. break;
  530. case DRM_MODE_CONNECTOR_DVIA:
  531. drm_connector_init(dev, &radeon_connector->base, &radeon_vga_connector_funcs, connector_type);
  532. drm_connector_helper_add(&radeon_connector->base, &radeon_vga_connector_helper_funcs);
  533. if (i2c_bus->valid) {
  534. radeon_connector->ddc_bus = radeon_i2c_create(dev, i2c_bus, "DVI");
  535. if (!radeon_connector->ddc_bus)
  536. goto failed;
  537. }
  538. break;
  539. case DRM_MODE_CONNECTOR_DVII:
  540. case DRM_MODE_CONNECTOR_DVID:
  541. radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL);
  542. if (!radeon_dig_connector)
  543. goto failed;
  544. radeon_dig_connector->linkb = linkb;
  545. radeon_dig_connector->igp_lane_info = igp_lane_info;
  546. radeon_connector->con_priv = radeon_dig_connector;
  547. drm_connector_init(dev, &radeon_connector->base, &radeon_dvi_connector_funcs, connector_type);
  548. drm_connector_helper_add(&radeon_connector->base, &radeon_dvi_connector_helper_funcs);
  549. if (i2c_bus->valid) {
  550. radeon_connector->ddc_bus = radeon_i2c_create(dev, i2c_bus, "DVI");
  551. if (!radeon_connector->ddc_bus)
  552. goto failed;
  553. }
  554. subpixel_order = SubPixelHorizontalRGB;
  555. break;
  556. case DRM_MODE_CONNECTOR_HDMIA:
  557. case DRM_MODE_CONNECTOR_HDMIB:
  558. radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL);
  559. if (!radeon_dig_connector)
  560. goto failed;
  561. radeon_dig_connector->linkb = linkb;
  562. radeon_dig_connector->igp_lane_info = igp_lane_info;
  563. radeon_connector->con_priv = radeon_dig_connector;
  564. drm_connector_init(dev, &radeon_connector->base, &radeon_dvi_connector_funcs, connector_type);
  565. drm_connector_helper_add(&radeon_connector->base, &radeon_dvi_connector_helper_funcs);
  566. if (i2c_bus->valid) {
  567. radeon_connector->ddc_bus = radeon_i2c_create(dev, i2c_bus, "HDMI");
  568. if (!radeon_connector->ddc_bus)
  569. goto failed;
  570. }
  571. subpixel_order = SubPixelHorizontalRGB;
  572. break;
  573. case DRM_MODE_CONNECTOR_DisplayPort:
  574. radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL);
  575. if (!radeon_dig_connector)
  576. goto failed;
  577. radeon_dig_connector->linkb = linkb;
  578. radeon_dig_connector->igp_lane_info = igp_lane_info;
  579. radeon_connector->con_priv = radeon_dig_connector;
  580. drm_connector_init(dev, &radeon_connector->base, &radeon_dvi_connector_funcs, connector_type);
  581. drm_connector_helper_add(&radeon_connector->base, &radeon_dvi_connector_helper_funcs);
  582. if (i2c_bus->valid) {
  583. radeon_connector->ddc_bus = radeon_i2c_create(dev, i2c_bus, "DP");
  584. if (!radeon_connector->ddc_bus)
  585. goto failed;
  586. }
  587. subpixel_order = SubPixelHorizontalRGB;
  588. break;
  589. case DRM_MODE_CONNECTOR_SVIDEO:
  590. case DRM_MODE_CONNECTOR_Composite:
  591. case DRM_MODE_CONNECTOR_9PinDIN:
  592. if (radeon_tv == 1) {
  593. drm_connector_init(dev, &radeon_connector->base, &radeon_tv_connector_funcs, connector_type);
  594. drm_connector_helper_add(&radeon_connector->base, &radeon_tv_connector_helper_funcs);
  595. }
  596. break;
  597. case DRM_MODE_CONNECTOR_LVDS:
  598. radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL);
  599. if (!radeon_dig_connector)
  600. goto failed;
  601. radeon_dig_connector->linkb = linkb;
  602. radeon_dig_connector->igp_lane_info = igp_lane_info;
  603. radeon_connector->con_priv = radeon_dig_connector;
  604. drm_connector_init(dev, &radeon_connector->base, &radeon_lvds_connector_funcs, connector_type);
  605. drm_connector_helper_add(&radeon_connector->base, &radeon_lvds_connector_helper_funcs);
  606. if (i2c_bus->valid) {
  607. radeon_connector->ddc_bus = radeon_i2c_create(dev, i2c_bus, "LVDS");
  608. if (!radeon_connector->ddc_bus)
  609. goto failed;
  610. }
  611. subpixel_order = SubPixelHorizontalRGB;
  612. break;
  613. }
  614. connector->display_info.subpixel_order = subpixel_order;
  615. drm_sysfs_connector_add(connector);
  616. return;
  617. failed:
  618. if (radeon_connector->ddc_bus)
  619. radeon_i2c_destroy(radeon_connector->ddc_bus);
  620. drm_connector_cleanup(connector);
  621. kfree(connector);
  622. }
  623. void
  624. radeon_add_legacy_connector(struct drm_device *dev,
  625. uint32_t connector_id,
  626. uint32_t supported_device,
  627. int connector_type,
  628. struct radeon_i2c_bus_rec *i2c_bus)
  629. {
  630. struct drm_connector *connector;
  631. struct radeon_connector *radeon_connector;
  632. uint32_t subpixel_order = SubPixelNone;
  633. /* fixme - tv/cv/din */
  634. if (connector_type == DRM_MODE_CONNECTOR_Unknown)
  635. return;
  636. /* see if we already added it */
  637. list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
  638. radeon_connector = to_radeon_connector(connector);
  639. if (radeon_connector->connector_id == connector_id) {
  640. radeon_connector->devices |= supported_device;
  641. return;
  642. }
  643. }
  644. radeon_connector = kzalloc(sizeof(struct radeon_connector), GFP_KERNEL);
  645. if (!radeon_connector)
  646. return;
  647. connector = &radeon_connector->base;
  648. radeon_connector->connector_id = connector_id;
  649. radeon_connector->devices = supported_device;
  650. switch (connector_type) {
  651. case DRM_MODE_CONNECTOR_VGA:
  652. drm_connector_init(dev, &radeon_connector->base, &radeon_vga_connector_funcs, connector_type);
  653. drm_connector_helper_add(&radeon_connector->base, &radeon_vga_connector_helper_funcs);
  654. if (i2c_bus->valid) {
  655. radeon_connector->ddc_bus = radeon_i2c_create(dev, i2c_bus, "VGA");
  656. if (!radeon_connector->ddc_bus)
  657. goto failed;
  658. }
  659. break;
  660. case DRM_MODE_CONNECTOR_DVIA:
  661. drm_connector_init(dev, &radeon_connector->base, &radeon_vga_connector_funcs, connector_type);
  662. drm_connector_helper_add(&radeon_connector->base, &radeon_vga_connector_helper_funcs);
  663. if (i2c_bus->valid) {
  664. radeon_connector->ddc_bus = radeon_i2c_create(dev, i2c_bus, "DVI");
  665. if (!radeon_connector->ddc_bus)
  666. goto failed;
  667. }
  668. break;
  669. case DRM_MODE_CONNECTOR_DVII:
  670. case DRM_MODE_CONNECTOR_DVID:
  671. drm_connector_init(dev, &radeon_connector->base, &radeon_dvi_connector_funcs, connector_type);
  672. drm_connector_helper_add(&radeon_connector->base, &radeon_dvi_connector_helper_funcs);
  673. if (i2c_bus->valid) {
  674. radeon_connector->ddc_bus = radeon_i2c_create(dev, i2c_bus, "DVI");
  675. if (!radeon_connector->ddc_bus)
  676. goto failed;
  677. }
  678. subpixel_order = SubPixelHorizontalRGB;
  679. break;
  680. case DRM_MODE_CONNECTOR_SVIDEO:
  681. case DRM_MODE_CONNECTOR_Composite:
  682. case DRM_MODE_CONNECTOR_9PinDIN:
  683. if (radeon_tv == 1) {
  684. drm_connector_init(dev, &radeon_connector->base, &radeon_tv_connector_funcs, connector_type);
  685. drm_connector_helper_add(&radeon_connector->base, &radeon_tv_connector_helper_funcs);
  686. }
  687. break;
  688. case DRM_MODE_CONNECTOR_LVDS:
  689. drm_connector_init(dev, &radeon_connector->base, &radeon_lvds_connector_funcs, connector_type);
  690. drm_connector_helper_add(&radeon_connector->base, &radeon_lvds_connector_helper_funcs);
  691. if (i2c_bus->valid) {
  692. radeon_connector->ddc_bus = radeon_i2c_create(dev, i2c_bus, "LVDS");
  693. if (!radeon_connector->ddc_bus)
  694. goto failed;
  695. }
  696. subpixel_order = SubPixelHorizontalRGB;
  697. break;
  698. }
  699. connector->display_info.subpixel_order = subpixel_order;
  700. drm_sysfs_connector_add(connector);
  701. return;
  702. failed:
  703. if (radeon_connector->ddc_bus)
  704. radeon_i2c_destroy(radeon_connector->ddc_bus);
  705. drm_connector_cleanup(connector);
  706. kfree(connector);
  707. }