radeon_connectors.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603
  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. extern void
  32. radeon_combios_connected_scratch_regs(struct drm_connector *connector,
  33. struct drm_encoder *encoder,
  34. bool connected);
  35. extern void
  36. radeon_atombios_connected_scratch_regs(struct drm_connector *connector,
  37. struct drm_encoder *encoder,
  38. bool connected);
  39. static void
  40. radeon_connector_update_scratch_regs(struct drm_connector *connector, enum drm_connector_status status)
  41. {
  42. struct drm_device *dev = connector->dev;
  43. struct radeon_device *rdev = dev->dev_private;
  44. struct drm_encoder *best_encoder = NULL;
  45. struct drm_encoder *encoder = NULL;
  46. struct drm_connector_helper_funcs *connector_funcs = connector->helper_private;
  47. struct drm_mode_object *obj;
  48. bool connected;
  49. int i;
  50. best_encoder = connector_funcs->best_encoder(connector);
  51. for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
  52. if (connector->encoder_ids[i] == 0)
  53. break;
  54. obj = drm_mode_object_find(connector->dev,
  55. connector->encoder_ids[i],
  56. DRM_MODE_OBJECT_ENCODER);
  57. if (!obj)
  58. continue;
  59. encoder = obj_to_encoder(obj);
  60. if ((encoder == best_encoder) && (status == connector_status_connected))
  61. connected = true;
  62. else
  63. connected = false;
  64. if (rdev->is_atom_bios)
  65. radeon_atombios_connected_scratch_regs(connector, encoder, connected);
  66. else
  67. radeon_combios_connected_scratch_regs(connector, encoder, connected);
  68. }
  69. }
  70. struct drm_encoder *radeon_best_single_encoder(struct drm_connector *connector)
  71. {
  72. int enc_id = connector->encoder_ids[0];
  73. struct drm_mode_object *obj;
  74. struct drm_encoder *encoder;
  75. /* pick the encoder ids */
  76. if (enc_id) {
  77. obj = drm_mode_object_find(connector->dev, enc_id, DRM_MODE_OBJECT_ENCODER);
  78. if (!obj)
  79. return NULL;
  80. encoder = obj_to_encoder(obj);
  81. return encoder;
  82. }
  83. return NULL;
  84. }
  85. static struct drm_display_mode *radeon_fp_native_mode(struct drm_encoder *encoder)
  86. {
  87. struct drm_device *dev = encoder->dev;
  88. struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
  89. struct drm_display_mode *mode = NULL;
  90. struct radeon_native_mode *native_mode = &radeon_encoder->native_mode;
  91. if (native_mode->panel_xres != 0 &&
  92. native_mode->panel_yres != 0 &&
  93. native_mode->dotclock != 0) {
  94. mode = drm_mode_create(dev);
  95. mode->hdisplay = native_mode->panel_xres;
  96. mode->vdisplay = native_mode->panel_yres;
  97. mode->htotal = mode->hdisplay + native_mode->hblank;
  98. mode->hsync_start = mode->hdisplay + native_mode->hoverplus;
  99. mode->hsync_end = mode->hsync_start + native_mode->hsync_width;
  100. mode->vtotal = mode->vdisplay + native_mode->vblank;
  101. mode->vsync_start = mode->vdisplay + native_mode->voverplus;
  102. mode->vsync_end = mode->vsync_start + native_mode->vsync_width;
  103. mode->clock = native_mode->dotclock;
  104. mode->flags = 0;
  105. mode->type = DRM_MODE_TYPE_PREFERRED | DRM_MODE_TYPE_DRIVER;
  106. drm_mode_set_name(mode);
  107. DRM_DEBUG("Adding native panel mode %s\n", mode->name);
  108. }
  109. return mode;
  110. }
  111. int radeon_connector_set_property(struct drm_connector *connector, struct drm_property *property,
  112. uint64_t val)
  113. {
  114. return 0;
  115. }
  116. static int radeon_lvds_get_modes(struct drm_connector *connector)
  117. {
  118. struct radeon_connector *radeon_connector = to_radeon_connector(connector);
  119. struct drm_encoder *encoder;
  120. int ret = 0;
  121. struct drm_display_mode *mode;
  122. if (radeon_connector->ddc_bus) {
  123. ret = radeon_ddc_get_modes(radeon_connector);
  124. if (ret > 0) {
  125. return ret;
  126. }
  127. }
  128. encoder = radeon_best_single_encoder(connector);
  129. if (!encoder)
  130. return 0;
  131. /* we have no EDID modes */
  132. mode = radeon_fp_native_mode(encoder);
  133. if (mode) {
  134. ret = 1;
  135. drm_mode_probed_add(connector, mode);
  136. }
  137. return ret;
  138. }
  139. static int radeon_lvds_mode_valid(struct drm_connector *connector,
  140. struct drm_display_mode *mode)
  141. {
  142. return MODE_OK;
  143. }
  144. static enum drm_connector_status radeon_lvds_detect(struct drm_connector *connector)
  145. {
  146. enum drm_connector_status ret = connector_status_connected;
  147. /* check acpi lid status ??? */
  148. radeon_connector_update_scratch_regs(connector, ret);
  149. return ret;
  150. }
  151. static void radeon_connector_destroy(struct drm_connector *connector)
  152. {
  153. struct radeon_connector *radeon_connector = to_radeon_connector(connector);
  154. if (radeon_connector->ddc_bus)
  155. radeon_i2c_destroy(radeon_connector->ddc_bus);
  156. kfree(radeon_connector->con_priv);
  157. drm_sysfs_connector_remove(connector);
  158. drm_connector_cleanup(connector);
  159. kfree(connector);
  160. }
  161. struct drm_connector_helper_funcs radeon_lvds_connector_helper_funcs = {
  162. .get_modes = radeon_lvds_get_modes,
  163. .mode_valid = radeon_lvds_mode_valid,
  164. .best_encoder = radeon_best_single_encoder,
  165. };
  166. struct drm_connector_funcs radeon_lvds_connector_funcs = {
  167. .dpms = drm_helper_connector_dpms,
  168. .detect = radeon_lvds_detect,
  169. .fill_modes = drm_helper_probe_single_connector_modes,
  170. .destroy = radeon_connector_destroy,
  171. .set_property = radeon_connector_set_property,
  172. };
  173. static int radeon_vga_get_modes(struct drm_connector *connector)
  174. {
  175. struct radeon_connector *radeon_connector = to_radeon_connector(connector);
  176. int ret;
  177. ret = radeon_ddc_get_modes(radeon_connector);
  178. return ret;
  179. }
  180. static int radeon_vga_mode_valid(struct drm_connector *connector,
  181. struct drm_display_mode *mode)
  182. {
  183. return MODE_OK;
  184. }
  185. static enum drm_connector_status radeon_vga_detect(struct drm_connector *connector)
  186. {
  187. struct radeon_connector *radeon_connector = to_radeon_connector(connector);
  188. struct drm_encoder *encoder;
  189. struct drm_encoder_helper_funcs *encoder_funcs;
  190. bool dret;
  191. enum drm_connector_status ret = connector_status_disconnected;
  192. radeon_i2c_do_lock(radeon_connector, 1);
  193. dret = radeon_ddc_probe(radeon_connector);
  194. radeon_i2c_do_lock(radeon_connector, 0);
  195. if (dret)
  196. ret = connector_status_connected;
  197. else {
  198. /* if EDID fails to a load detect */
  199. encoder = radeon_best_single_encoder(connector);
  200. if (!encoder)
  201. ret = connector_status_disconnected;
  202. else {
  203. encoder_funcs = encoder->helper_private;
  204. ret = encoder_funcs->detect(encoder, connector);
  205. }
  206. }
  207. radeon_connector_update_scratch_regs(connector, ret);
  208. return ret;
  209. }
  210. struct drm_connector_helper_funcs radeon_vga_connector_helper_funcs = {
  211. .get_modes = radeon_vga_get_modes,
  212. .mode_valid = radeon_vga_mode_valid,
  213. .best_encoder = radeon_best_single_encoder,
  214. };
  215. struct drm_connector_funcs radeon_vga_connector_funcs = {
  216. .dpms = drm_helper_connector_dpms,
  217. .detect = radeon_vga_detect,
  218. .fill_modes = drm_helper_probe_single_connector_modes,
  219. .destroy = radeon_connector_destroy,
  220. .set_property = radeon_connector_set_property,
  221. };
  222. static int radeon_dvi_get_modes(struct drm_connector *connector)
  223. {
  224. struct radeon_connector *radeon_connector = to_radeon_connector(connector);
  225. int ret;
  226. ret = radeon_ddc_get_modes(radeon_connector);
  227. /* reset scratch regs here since radeon_dvi_detect doesn't check digital bit */
  228. radeon_connector_update_scratch_regs(connector, connector_status_connected);
  229. return ret;
  230. }
  231. static enum drm_connector_status radeon_dvi_detect(struct drm_connector *connector)
  232. {
  233. struct radeon_connector *radeon_connector = to_radeon_connector(connector);
  234. struct drm_encoder *encoder;
  235. struct drm_encoder_helper_funcs *encoder_funcs;
  236. struct drm_mode_object *obj;
  237. int i;
  238. enum drm_connector_status ret = connector_status_disconnected;
  239. bool dret;
  240. radeon_i2c_do_lock(radeon_connector, 1);
  241. dret = radeon_ddc_probe(radeon_connector);
  242. radeon_i2c_do_lock(radeon_connector, 0);
  243. if (dret)
  244. ret = connector_status_connected;
  245. else {
  246. for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
  247. if (connector->encoder_ids[i] == 0)
  248. break;
  249. obj = drm_mode_object_find(connector->dev,
  250. connector->encoder_ids[i],
  251. DRM_MODE_OBJECT_ENCODER);
  252. if (!obj)
  253. continue;
  254. encoder = obj_to_encoder(obj);
  255. encoder_funcs = encoder->helper_private;
  256. if (encoder_funcs->detect) {
  257. ret = encoder_funcs->detect(encoder, connector);
  258. if (ret == connector_status_connected) {
  259. radeon_connector->use_digital = 0;
  260. break;
  261. }
  262. }
  263. }
  264. }
  265. /* updated in get modes as well since we need to know if it's analog or digital */
  266. radeon_connector_update_scratch_regs(connector, ret);
  267. return ret;
  268. }
  269. /* okay need to be smart in here about which encoder to pick */
  270. struct drm_encoder *radeon_dvi_encoder(struct drm_connector *connector)
  271. {
  272. int enc_id = connector->encoder_ids[0];
  273. struct radeon_connector *radeon_connector = to_radeon_connector(connector);
  274. struct drm_mode_object *obj;
  275. struct drm_encoder *encoder;
  276. int i;
  277. for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
  278. if (connector->encoder_ids[i] == 0)
  279. break;
  280. obj = drm_mode_object_find(connector->dev, connector->encoder_ids[i], DRM_MODE_OBJECT_ENCODER);
  281. if (!obj)
  282. continue;
  283. encoder = obj_to_encoder(obj);
  284. if (radeon_connector->use_digital) {
  285. if (encoder->encoder_type == DRM_MODE_ENCODER_TMDS)
  286. return encoder;
  287. } else {
  288. if (encoder->encoder_type == DRM_MODE_ENCODER_DAC ||
  289. encoder->encoder_type == DRM_MODE_ENCODER_TVDAC)
  290. return encoder;
  291. }
  292. }
  293. /* see if we have a default encoder TODO */
  294. /* then check use digitial */
  295. /* pick the first one */
  296. if (enc_id) {
  297. obj = drm_mode_object_find(connector->dev, enc_id, DRM_MODE_OBJECT_ENCODER);
  298. if (!obj)
  299. return NULL;
  300. encoder = obj_to_encoder(obj);
  301. return encoder;
  302. }
  303. return NULL;
  304. }
  305. struct drm_connector_helper_funcs radeon_dvi_connector_helper_funcs = {
  306. .get_modes = radeon_dvi_get_modes,
  307. .mode_valid = radeon_vga_mode_valid,
  308. .best_encoder = radeon_dvi_encoder,
  309. };
  310. struct drm_connector_funcs radeon_dvi_connector_funcs = {
  311. .dpms = drm_helper_connector_dpms,
  312. .detect = radeon_dvi_detect,
  313. .fill_modes = drm_helper_probe_single_connector_modes,
  314. .set_property = radeon_connector_set_property,
  315. .destroy = radeon_connector_destroy,
  316. };
  317. void
  318. radeon_add_atom_connector(struct drm_device *dev,
  319. uint32_t connector_id,
  320. uint32_t supported_device,
  321. int connector_type,
  322. struct radeon_i2c_bus_rec *i2c_bus,
  323. bool linkb,
  324. uint32_t igp_lane_info)
  325. {
  326. struct drm_connector *connector;
  327. struct radeon_connector *radeon_connector;
  328. struct radeon_connector_atom_dig *radeon_dig_connector;
  329. uint32_t subpixel_order = SubPixelNone;
  330. /* fixme - tv/cv/din */
  331. if ((connector_type == DRM_MODE_CONNECTOR_Unknown) ||
  332. (connector_type == DRM_MODE_CONNECTOR_SVIDEO) ||
  333. (connector_type == DRM_MODE_CONNECTOR_Composite) ||
  334. (connector_type == DRM_MODE_CONNECTOR_9PinDIN))
  335. return;
  336. /* see if we already added it */
  337. list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
  338. radeon_connector = to_radeon_connector(connector);
  339. if (radeon_connector->connector_id == connector_id) {
  340. radeon_connector->devices |= supported_device;
  341. return;
  342. }
  343. }
  344. radeon_connector = kzalloc(sizeof(struct radeon_connector), GFP_KERNEL);
  345. if (!radeon_connector)
  346. return;
  347. connector = &radeon_connector->base;
  348. radeon_connector->connector_id = connector_id;
  349. radeon_connector->devices = supported_device;
  350. switch (connector_type) {
  351. case DRM_MODE_CONNECTOR_VGA:
  352. drm_connector_init(dev, &radeon_connector->base, &radeon_vga_connector_funcs, connector_type);
  353. drm_connector_helper_add(&radeon_connector->base, &radeon_vga_connector_helper_funcs);
  354. if (i2c_bus->valid) {
  355. radeon_connector->ddc_bus = radeon_i2c_create(dev, i2c_bus, "VGA");
  356. if (!radeon_connector->ddc_bus)
  357. goto failed;
  358. }
  359. break;
  360. case DRM_MODE_CONNECTOR_DVIA:
  361. drm_connector_init(dev, &radeon_connector->base, &radeon_vga_connector_funcs, connector_type);
  362. drm_connector_helper_add(&radeon_connector->base, &radeon_vga_connector_helper_funcs);
  363. if (i2c_bus->valid) {
  364. radeon_connector->ddc_bus = radeon_i2c_create(dev, i2c_bus, "DVI");
  365. if (!radeon_connector->ddc_bus)
  366. goto failed;
  367. }
  368. break;
  369. case DRM_MODE_CONNECTOR_DVII:
  370. case DRM_MODE_CONNECTOR_DVID:
  371. radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL);
  372. if (!radeon_dig_connector)
  373. goto failed;
  374. radeon_dig_connector->linkb = linkb;
  375. radeon_dig_connector->igp_lane_info = igp_lane_info;
  376. radeon_connector->con_priv = radeon_dig_connector;
  377. drm_connector_init(dev, &radeon_connector->base, &radeon_dvi_connector_funcs, connector_type);
  378. drm_connector_helper_add(&radeon_connector->base, &radeon_dvi_connector_helper_funcs);
  379. if (i2c_bus->valid) {
  380. radeon_connector->ddc_bus = radeon_i2c_create(dev, i2c_bus, "DVI");
  381. if (!radeon_connector->ddc_bus)
  382. goto failed;
  383. }
  384. subpixel_order = SubPixelHorizontalRGB;
  385. break;
  386. case DRM_MODE_CONNECTOR_HDMIA:
  387. case DRM_MODE_CONNECTOR_HDMIB:
  388. radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL);
  389. if (!radeon_dig_connector)
  390. goto failed;
  391. radeon_dig_connector->linkb = linkb;
  392. radeon_dig_connector->igp_lane_info = igp_lane_info;
  393. radeon_connector->con_priv = radeon_dig_connector;
  394. drm_connector_init(dev, &radeon_connector->base, &radeon_dvi_connector_funcs, connector_type);
  395. drm_connector_helper_add(&radeon_connector->base, &radeon_dvi_connector_helper_funcs);
  396. if (i2c_bus->valid) {
  397. radeon_connector->ddc_bus = radeon_i2c_create(dev, i2c_bus, "HDMI");
  398. if (!radeon_connector->ddc_bus)
  399. goto failed;
  400. }
  401. subpixel_order = SubPixelHorizontalRGB;
  402. break;
  403. case DRM_MODE_CONNECTOR_DisplayPort:
  404. radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL);
  405. if (!radeon_dig_connector)
  406. goto failed;
  407. radeon_dig_connector->linkb = linkb;
  408. radeon_dig_connector->igp_lane_info = igp_lane_info;
  409. radeon_connector->con_priv = radeon_dig_connector;
  410. drm_connector_init(dev, &radeon_connector->base, &radeon_dvi_connector_funcs, connector_type);
  411. drm_connector_helper_add(&radeon_connector->base, &radeon_dvi_connector_helper_funcs);
  412. if (i2c_bus->valid) {
  413. radeon_connector->ddc_bus = radeon_i2c_create(dev, i2c_bus, "DP");
  414. if (!radeon_connector->ddc_bus)
  415. goto failed;
  416. }
  417. subpixel_order = SubPixelHorizontalRGB;
  418. break;
  419. case DRM_MODE_CONNECTOR_SVIDEO:
  420. case DRM_MODE_CONNECTOR_Composite:
  421. case DRM_MODE_CONNECTOR_9PinDIN:
  422. break;
  423. case DRM_MODE_CONNECTOR_LVDS:
  424. radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL);
  425. if (!radeon_dig_connector)
  426. goto failed;
  427. radeon_dig_connector->linkb = linkb;
  428. radeon_dig_connector->igp_lane_info = igp_lane_info;
  429. radeon_connector->con_priv = radeon_dig_connector;
  430. drm_connector_init(dev, &radeon_connector->base, &radeon_lvds_connector_funcs, connector_type);
  431. drm_connector_helper_add(&radeon_connector->base, &radeon_lvds_connector_helper_funcs);
  432. if (i2c_bus->valid) {
  433. radeon_connector->ddc_bus = radeon_i2c_create(dev, i2c_bus, "LVDS");
  434. if (!radeon_connector->ddc_bus)
  435. goto failed;
  436. }
  437. subpixel_order = SubPixelHorizontalRGB;
  438. break;
  439. }
  440. connector->display_info.subpixel_order = subpixel_order;
  441. drm_sysfs_connector_add(connector);
  442. return;
  443. failed:
  444. if (radeon_connector->ddc_bus)
  445. radeon_i2c_destroy(radeon_connector->ddc_bus);
  446. drm_connector_cleanup(connector);
  447. kfree(connector);
  448. }
  449. void
  450. radeon_add_legacy_connector(struct drm_device *dev,
  451. uint32_t connector_id,
  452. uint32_t supported_device,
  453. int connector_type,
  454. struct radeon_i2c_bus_rec *i2c_bus)
  455. {
  456. struct drm_connector *connector;
  457. struct radeon_connector *radeon_connector;
  458. uint32_t subpixel_order = SubPixelNone;
  459. /* fixme - tv/cv/din */
  460. if ((connector_type == DRM_MODE_CONNECTOR_Unknown) ||
  461. (connector_type == DRM_MODE_CONNECTOR_SVIDEO) ||
  462. (connector_type == DRM_MODE_CONNECTOR_Composite) ||
  463. (connector_type == DRM_MODE_CONNECTOR_9PinDIN))
  464. return;
  465. /* see if we already added it */
  466. list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
  467. radeon_connector = to_radeon_connector(connector);
  468. if (radeon_connector->connector_id == connector_id) {
  469. radeon_connector->devices |= supported_device;
  470. return;
  471. }
  472. }
  473. radeon_connector = kzalloc(sizeof(struct radeon_connector), GFP_KERNEL);
  474. if (!radeon_connector)
  475. return;
  476. connector = &radeon_connector->base;
  477. radeon_connector->connector_id = connector_id;
  478. radeon_connector->devices = supported_device;
  479. switch (connector_type) {
  480. case DRM_MODE_CONNECTOR_VGA:
  481. drm_connector_init(dev, &radeon_connector->base, &radeon_vga_connector_funcs, connector_type);
  482. drm_connector_helper_add(&radeon_connector->base, &radeon_vga_connector_helper_funcs);
  483. if (i2c_bus->valid) {
  484. radeon_connector->ddc_bus = radeon_i2c_create(dev, i2c_bus, "VGA");
  485. if (!radeon_connector->ddc_bus)
  486. goto failed;
  487. }
  488. break;
  489. case DRM_MODE_CONNECTOR_DVIA:
  490. drm_connector_init(dev, &radeon_connector->base, &radeon_vga_connector_funcs, connector_type);
  491. drm_connector_helper_add(&radeon_connector->base, &radeon_vga_connector_helper_funcs);
  492. if (i2c_bus->valid) {
  493. radeon_connector->ddc_bus = radeon_i2c_create(dev, i2c_bus, "DVI");
  494. if (!radeon_connector->ddc_bus)
  495. goto failed;
  496. }
  497. break;
  498. case DRM_MODE_CONNECTOR_DVII:
  499. case DRM_MODE_CONNECTOR_DVID:
  500. drm_connector_init(dev, &radeon_connector->base, &radeon_dvi_connector_funcs, connector_type);
  501. drm_connector_helper_add(&radeon_connector->base, &radeon_dvi_connector_helper_funcs);
  502. if (i2c_bus->valid) {
  503. radeon_connector->ddc_bus = radeon_i2c_create(dev, i2c_bus, "DVI");
  504. if (!radeon_connector->ddc_bus)
  505. goto failed;
  506. }
  507. subpixel_order = SubPixelHorizontalRGB;
  508. break;
  509. case DRM_MODE_CONNECTOR_SVIDEO:
  510. case DRM_MODE_CONNECTOR_Composite:
  511. case DRM_MODE_CONNECTOR_9PinDIN:
  512. break;
  513. case DRM_MODE_CONNECTOR_LVDS:
  514. drm_connector_init(dev, &radeon_connector->base, &radeon_lvds_connector_funcs, connector_type);
  515. drm_connector_helper_add(&radeon_connector->base, &radeon_lvds_connector_helper_funcs);
  516. if (i2c_bus->valid) {
  517. radeon_connector->ddc_bus = radeon_i2c_create(dev, i2c_bus, "LVDS");
  518. if (!radeon_connector->ddc_bus)
  519. goto failed;
  520. }
  521. subpixel_order = SubPixelHorizontalRGB;
  522. break;
  523. }
  524. connector->display_info.subpixel_order = subpixel_order;
  525. drm_sysfs_connector_add(connector);
  526. return;
  527. failed:
  528. if (radeon_connector->ddc_bus)
  529. radeon_i2c_destroy(radeon_connector->ddc_bus);
  530. drm_connector_cleanup(connector);
  531. kfree(connector);
  532. }