root/drivers/gpu/drm/radeon/radeon_i2c.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. radeon_ddc_probe
  2. pre_xfer
  3. post_xfer
  4. get_clock
  5. get_data
  6. set_clock
  7. set_data
  8. radeon_get_i2c_prescale
  9. r100_hw_i2c_xfer
  10. r500_hw_i2c_xfer
  11. radeon_hw_i2c_xfer
  12. radeon_hw_i2c_func
  13. radeon_i2c_create
  14. radeon_i2c_destroy
  15. radeon_i2c_init
  16. radeon_i2c_fini
  17. radeon_i2c_add
  18. radeon_i2c_lookup
  19. radeon_i2c_get_byte
  20. radeon_i2c_put_byte
  21. radeon_router_select_ddc_port
  22. radeon_router_select_cd_port

   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 
  27 #include <linux/export.h>
  28 
  29 #include <drm/drm_device.h>
  30 #include <drm/drm_edid.h>
  31 #include <drm/drm_pci.h>
  32 #include <drm/radeon_drm.h>
  33 
  34 #include "radeon.h"
  35 #include "atom.h"
  36 
  37 extern int radeon_atom_hw_i2c_xfer(struct i2c_adapter *i2c_adap,
  38                                    struct i2c_msg *msgs, int num);
  39 extern u32 radeon_atom_hw_i2c_func(struct i2c_adapter *adap);
  40 
  41 /**
  42  * radeon_ddc_probe
  43  *
  44  */
  45 bool radeon_ddc_probe(struct radeon_connector *radeon_connector, bool use_aux)
  46 {
  47         u8 out = 0x0;
  48         u8 buf[8];
  49         int ret;
  50         struct i2c_msg msgs[] = {
  51                 {
  52                         .addr = DDC_ADDR,
  53                         .flags = 0,
  54                         .len = 1,
  55                         .buf = &out,
  56                 },
  57                 {
  58                         .addr = DDC_ADDR,
  59                         .flags = I2C_M_RD,
  60                         .len = 8,
  61                         .buf = buf,
  62                 }
  63         };
  64 
  65         /* on hw with routers, select right port */
  66         if (radeon_connector->router.ddc_valid)
  67                 radeon_router_select_ddc_port(radeon_connector);
  68 
  69         if (use_aux) {
  70                 ret = i2c_transfer(&radeon_connector->ddc_bus->aux.ddc, msgs, 2);
  71         } else {
  72                 ret = i2c_transfer(&radeon_connector->ddc_bus->adapter, msgs, 2);
  73         }
  74 
  75         if (ret != 2)
  76                 /* Couldn't find an accessible DDC on this connector */
  77                 return false;
  78         /* Probe also for valid EDID header
  79          * EDID header starts with:
  80          * 0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00.
  81          * Only the first 6 bytes must be valid as
  82          * drm_edid_block_valid() can fix the last 2 bytes */
  83         if (drm_edid_header_is_valid(buf) < 6) {
  84                 /* Couldn't find an accessible EDID on this
  85                  * connector */
  86                 return false;
  87         }
  88         return true;
  89 }
  90 
  91 /* bit banging i2c */
  92 
  93 static int pre_xfer(struct i2c_adapter *i2c_adap)
  94 {
  95         struct radeon_i2c_chan *i2c = i2c_get_adapdata(i2c_adap);
  96         struct radeon_device *rdev = i2c->dev->dev_private;
  97         struct radeon_i2c_bus_rec *rec = &i2c->rec;
  98         uint32_t temp;
  99 
 100         mutex_lock(&i2c->mutex);
 101 
 102         /* RV410 appears to have a bug where the hw i2c in reset
 103          * holds the i2c port in a bad state - switch hw i2c away before
 104          * doing DDC - do this for all r200s/r300s/r400s for safety sake
 105          */
 106         if (rec->hw_capable) {
 107                 if ((rdev->family >= CHIP_R200) && !ASIC_IS_AVIVO(rdev)) {
 108                         u32 reg;
 109 
 110                         if (rdev->family >= CHIP_RV350)
 111                                 reg = RADEON_GPIO_MONID;
 112                         else if ((rdev->family == CHIP_R300) ||
 113                                  (rdev->family == CHIP_R350))
 114                                 reg = RADEON_GPIO_DVI_DDC;
 115                         else
 116                                 reg = RADEON_GPIO_CRT2_DDC;
 117 
 118                         mutex_lock(&rdev->dc_hw_i2c_mutex);
 119                         if (rec->a_clk_reg == reg) {
 120                                 WREG32(RADEON_DVI_I2C_CNTL_0, (RADEON_I2C_SOFT_RST |
 121                                                                R200_DVI_I2C_PIN_SEL(R200_SEL_DDC1)));
 122                         } else {
 123                                 WREG32(RADEON_DVI_I2C_CNTL_0, (RADEON_I2C_SOFT_RST |
 124                                                                R200_DVI_I2C_PIN_SEL(R200_SEL_DDC3)));
 125                         }
 126                         mutex_unlock(&rdev->dc_hw_i2c_mutex);
 127                 }
 128         }
 129 
 130         /* switch the pads to ddc mode */
 131         if (ASIC_IS_DCE3(rdev) && rec->hw_capable) {
 132                 temp = RREG32(rec->mask_clk_reg);
 133                 temp &= ~(1 << 16);
 134                 WREG32(rec->mask_clk_reg, temp);
 135         }
 136 
 137         /* clear the output pin values */
 138         temp = RREG32(rec->a_clk_reg) & ~rec->a_clk_mask;
 139         WREG32(rec->a_clk_reg, temp);
 140 
 141         temp = RREG32(rec->a_data_reg) & ~rec->a_data_mask;
 142         WREG32(rec->a_data_reg, temp);
 143 
 144         /* set the pins to input */
 145         temp = RREG32(rec->en_clk_reg) & ~rec->en_clk_mask;
 146         WREG32(rec->en_clk_reg, temp);
 147 
 148         temp = RREG32(rec->en_data_reg) & ~rec->en_data_mask;
 149         WREG32(rec->en_data_reg, temp);
 150 
 151         /* mask the gpio pins for software use */
 152         temp = RREG32(rec->mask_clk_reg) | rec->mask_clk_mask;
 153         WREG32(rec->mask_clk_reg, temp);
 154         temp = RREG32(rec->mask_clk_reg);
 155 
 156         temp = RREG32(rec->mask_data_reg) | rec->mask_data_mask;
 157         WREG32(rec->mask_data_reg, temp);
 158         temp = RREG32(rec->mask_data_reg);
 159 
 160         return 0;
 161 }
 162 
 163 static void post_xfer(struct i2c_adapter *i2c_adap)
 164 {
 165         struct radeon_i2c_chan *i2c = i2c_get_adapdata(i2c_adap);
 166         struct radeon_device *rdev = i2c->dev->dev_private;
 167         struct radeon_i2c_bus_rec *rec = &i2c->rec;
 168         uint32_t temp;
 169 
 170         /* unmask the gpio pins for software use */
 171         temp = RREG32(rec->mask_clk_reg) & ~rec->mask_clk_mask;
 172         WREG32(rec->mask_clk_reg, temp);
 173         temp = RREG32(rec->mask_clk_reg);
 174 
 175         temp = RREG32(rec->mask_data_reg) & ~rec->mask_data_mask;
 176         WREG32(rec->mask_data_reg, temp);
 177         temp = RREG32(rec->mask_data_reg);
 178 
 179         mutex_unlock(&i2c->mutex);
 180 }
 181 
 182 static int get_clock(void *i2c_priv)
 183 {
 184         struct radeon_i2c_chan *i2c = i2c_priv;
 185         struct radeon_device *rdev = i2c->dev->dev_private;
 186         struct radeon_i2c_bus_rec *rec = &i2c->rec;
 187         uint32_t val;
 188 
 189         /* read the value off the pin */
 190         val = RREG32(rec->y_clk_reg);
 191         val &= rec->y_clk_mask;
 192 
 193         return (val != 0);
 194 }
 195 
 196 
 197 static int get_data(void *i2c_priv)
 198 {
 199         struct radeon_i2c_chan *i2c = i2c_priv;
 200         struct radeon_device *rdev = i2c->dev->dev_private;
 201         struct radeon_i2c_bus_rec *rec = &i2c->rec;
 202         uint32_t val;
 203 
 204         /* read the value off the pin */
 205         val = RREG32(rec->y_data_reg);
 206         val &= rec->y_data_mask;
 207 
 208         return (val != 0);
 209 }
 210 
 211 static void set_clock(void *i2c_priv, int clock)
 212 {
 213         struct radeon_i2c_chan *i2c = i2c_priv;
 214         struct radeon_device *rdev = i2c->dev->dev_private;
 215         struct radeon_i2c_bus_rec *rec = &i2c->rec;
 216         uint32_t val;
 217 
 218         /* set pin direction */
 219         val = RREG32(rec->en_clk_reg) & ~rec->en_clk_mask;
 220         val |= clock ? 0 : rec->en_clk_mask;
 221         WREG32(rec->en_clk_reg, val);
 222 }
 223 
 224 static void set_data(void *i2c_priv, int data)
 225 {
 226         struct radeon_i2c_chan *i2c = i2c_priv;
 227         struct radeon_device *rdev = i2c->dev->dev_private;
 228         struct radeon_i2c_bus_rec *rec = &i2c->rec;
 229         uint32_t val;
 230 
 231         /* set pin direction */
 232         val = RREG32(rec->en_data_reg) & ~rec->en_data_mask;
 233         val |= data ? 0 : rec->en_data_mask;
 234         WREG32(rec->en_data_reg, val);
 235 }
 236 
 237 /* hw i2c */
 238 
 239 static u32 radeon_get_i2c_prescale(struct radeon_device *rdev)
 240 {
 241         u32 sclk = rdev->pm.current_sclk;
 242         u32 prescale = 0;
 243         u32 nm;
 244         u8 n, m, loop;
 245         int i2c_clock;
 246 
 247         switch (rdev->family) {
 248         case CHIP_R100:
 249         case CHIP_RV100:
 250         case CHIP_RS100:
 251         case CHIP_RV200:
 252         case CHIP_RS200:
 253         case CHIP_R200:
 254         case CHIP_RV250:
 255         case CHIP_RS300:
 256         case CHIP_RV280:
 257         case CHIP_R300:
 258         case CHIP_R350:
 259         case CHIP_RV350:
 260                 i2c_clock = 60;
 261                 nm = (sclk * 10) / (i2c_clock * 4);
 262                 for (loop = 1; loop < 255; loop++) {
 263                         if ((nm / loop) < loop)
 264                                 break;
 265                 }
 266                 n = loop - 1;
 267                 m = loop - 2;
 268                 prescale = m | (n << 8);
 269                 break;
 270         case CHIP_RV380:
 271         case CHIP_RS400:
 272         case CHIP_RS480:
 273         case CHIP_R420:
 274         case CHIP_R423:
 275         case CHIP_RV410:
 276                 prescale = (((sclk * 10)/(4 * 128 * 100) + 1) << 8) + 128;
 277                 break;
 278         case CHIP_RS600:
 279         case CHIP_RS690:
 280         case CHIP_RS740:
 281                 /* todo */
 282                 break;
 283         case CHIP_RV515:
 284         case CHIP_R520:
 285         case CHIP_RV530:
 286         case CHIP_RV560:
 287         case CHIP_RV570:
 288         case CHIP_R580:
 289                 i2c_clock = 50;
 290                 if (rdev->family == CHIP_R520)
 291                         prescale = (127 << 8) + ((sclk * 10) / (4 * 127 * i2c_clock));
 292                 else
 293                         prescale = (((sclk * 10)/(4 * 128 * 100) + 1) << 8) + 128;
 294                 break;
 295         case CHIP_R600:
 296         case CHIP_RV610:
 297         case CHIP_RV630:
 298         case CHIP_RV670:
 299                 /* todo */
 300                 break;
 301         case CHIP_RV620:
 302         case CHIP_RV635:
 303         case CHIP_RS780:
 304         case CHIP_RS880:
 305         case CHIP_RV770:
 306         case CHIP_RV730:
 307         case CHIP_RV710:
 308         case CHIP_RV740:
 309                 /* todo */
 310                 break;
 311         case CHIP_CEDAR:
 312         case CHIP_REDWOOD:
 313         case CHIP_JUNIPER:
 314         case CHIP_CYPRESS:
 315         case CHIP_HEMLOCK:
 316                 /* todo */
 317                 break;
 318         default:
 319                 DRM_ERROR("i2c: unhandled radeon chip\n");
 320                 break;
 321         }
 322         return prescale;
 323 }
 324 
 325 
 326 /* hw i2c engine for r1xx-4xx hardware
 327  * hw can buffer up to 15 bytes
 328  */
 329 static int r100_hw_i2c_xfer(struct i2c_adapter *i2c_adap,
 330                             struct i2c_msg *msgs, int num)
 331 {
 332         struct radeon_i2c_chan *i2c = i2c_get_adapdata(i2c_adap);
 333         struct radeon_device *rdev = i2c->dev->dev_private;
 334         struct radeon_i2c_bus_rec *rec = &i2c->rec;
 335         struct i2c_msg *p;
 336         int i, j, k, ret = num;
 337         u32 prescale;
 338         u32 i2c_cntl_0, i2c_cntl_1, i2c_data;
 339         u32 tmp, reg;
 340 
 341         mutex_lock(&rdev->dc_hw_i2c_mutex);
 342         /* take the pm lock since we need a constant sclk */
 343         mutex_lock(&rdev->pm.mutex);
 344 
 345         prescale = radeon_get_i2c_prescale(rdev);
 346 
 347         reg = ((prescale << RADEON_I2C_PRESCALE_SHIFT) |
 348                RADEON_I2C_DRIVE_EN |
 349                RADEON_I2C_START |
 350                RADEON_I2C_STOP |
 351                RADEON_I2C_GO);
 352 
 353         if (rdev->is_atom_bios) {
 354                 tmp = RREG32(RADEON_BIOS_6_SCRATCH);
 355                 WREG32(RADEON_BIOS_6_SCRATCH, tmp | ATOM_S6_HW_I2C_BUSY_STATE);
 356         }
 357 
 358         if (rec->mm_i2c) {
 359                 i2c_cntl_0 = RADEON_I2C_CNTL_0;
 360                 i2c_cntl_1 = RADEON_I2C_CNTL_1;
 361                 i2c_data = RADEON_I2C_DATA;
 362         } else {
 363                 i2c_cntl_0 = RADEON_DVI_I2C_CNTL_0;
 364                 i2c_cntl_1 = RADEON_DVI_I2C_CNTL_1;
 365                 i2c_data = RADEON_DVI_I2C_DATA;
 366 
 367                 switch (rdev->family) {
 368                 case CHIP_R100:
 369                 case CHIP_RV100:
 370                 case CHIP_RS100:
 371                 case CHIP_RV200:
 372                 case CHIP_RS200:
 373                 case CHIP_RS300:
 374                         switch (rec->mask_clk_reg) {
 375                         case RADEON_GPIO_DVI_DDC:
 376                                 /* no gpio select bit */
 377                                 break;
 378                         default:
 379                                 DRM_ERROR("gpio not supported with hw i2c\n");
 380                                 ret = -EINVAL;
 381                                 goto done;
 382                         }
 383                         break;
 384                 case CHIP_R200:
 385                         /* only bit 4 on r200 */
 386                         switch (rec->mask_clk_reg) {
 387                         case RADEON_GPIO_DVI_DDC:
 388                                 reg |= R200_DVI_I2C_PIN_SEL(R200_SEL_DDC1);
 389                                 break;
 390                         case RADEON_GPIO_MONID:
 391                                 reg |= R200_DVI_I2C_PIN_SEL(R200_SEL_DDC3);
 392                                 break;
 393                         default:
 394                                 DRM_ERROR("gpio not supported with hw i2c\n");
 395                                 ret = -EINVAL;
 396                                 goto done;
 397                         }
 398                         break;
 399                 case CHIP_RV250:
 400                 case CHIP_RV280:
 401                         /* bits 3 and 4 */
 402                         switch (rec->mask_clk_reg) {
 403                         case RADEON_GPIO_DVI_DDC:
 404                                 reg |= R200_DVI_I2C_PIN_SEL(R200_SEL_DDC1);
 405                                 break;
 406                         case RADEON_GPIO_VGA_DDC:
 407                                 reg |= R200_DVI_I2C_PIN_SEL(R200_SEL_DDC2);
 408                                 break;
 409                         case RADEON_GPIO_CRT2_DDC:
 410                                 reg |= R200_DVI_I2C_PIN_SEL(R200_SEL_DDC3);
 411                                 break;
 412                         default:
 413                                 DRM_ERROR("gpio not supported with hw i2c\n");
 414                                 ret = -EINVAL;
 415                                 goto done;
 416                         }
 417                         break;
 418                 case CHIP_R300:
 419                 case CHIP_R350:
 420                         /* only bit 4 on r300/r350 */
 421                         switch (rec->mask_clk_reg) {
 422                         case RADEON_GPIO_VGA_DDC:
 423                                 reg |= R200_DVI_I2C_PIN_SEL(R200_SEL_DDC1);
 424                                 break;
 425                         case RADEON_GPIO_DVI_DDC:
 426                                 reg |= R200_DVI_I2C_PIN_SEL(R200_SEL_DDC3);
 427                                 break;
 428                         default:
 429                                 DRM_ERROR("gpio not supported with hw i2c\n");
 430                                 ret = -EINVAL;
 431                                 goto done;
 432                         }
 433                         break;
 434                 case CHIP_RV350:
 435                 case CHIP_RV380:
 436                 case CHIP_R420:
 437                 case CHIP_R423:
 438                 case CHIP_RV410:
 439                 case CHIP_RS400:
 440                 case CHIP_RS480:
 441                         /* bits 3 and 4 */
 442                         switch (rec->mask_clk_reg) {
 443                         case RADEON_GPIO_VGA_DDC:
 444                                 reg |= R200_DVI_I2C_PIN_SEL(R200_SEL_DDC1);
 445                                 break;
 446                         case RADEON_GPIO_DVI_DDC:
 447                                 reg |= R200_DVI_I2C_PIN_SEL(R200_SEL_DDC2);
 448                                 break;
 449                         case RADEON_GPIO_MONID:
 450                                 reg |= R200_DVI_I2C_PIN_SEL(R200_SEL_DDC3);
 451                                 break;
 452                         default:
 453                                 DRM_ERROR("gpio not supported with hw i2c\n");
 454                                 ret = -EINVAL;
 455                                 goto done;
 456                         }
 457                         break;
 458                 default:
 459                         DRM_ERROR("unsupported asic\n");
 460                         ret = -EINVAL;
 461                         goto done;
 462                         break;
 463                 }
 464         }
 465 
 466         /* check for bus probe */
 467         p = &msgs[0];
 468         if ((num == 1) && (p->len == 0)) {
 469                 WREG32(i2c_cntl_0, (RADEON_I2C_DONE |
 470                                     RADEON_I2C_NACK |
 471                                     RADEON_I2C_HALT |
 472                                     RADEON_I2C_SOFT_RST));
 473                 WREG32(i2c_data, (p->addr << 1) & 0xff);
 474                 WREG32(i2c_data, 0);
 475                 WREG32(i2c_cntl_1, ((1 << RADEON_I2C_DATA_COUNT_SHIFT) |
 476                                     (1 << RADEON_I2C_ADDR_COUNT_SHIFT) |
 477                                     RADEON_I2C_EN |
 478                                     (48 << RADEON_I2C_TIME_LIMIT_SHIFT)));
 479                 WREG32(i2c_cntl_0, reg);
 480                 for (k = 0; k < 32; k++) {
 481                         udelay(10);
 482                         tmp = RREG32(i2c_cntl_0);
 483                         if (tmp & RADEON_I2C_GO)
 484                                 continue;
 485                         tmp = RREG32(i2c_cntl_0);
 486                         if (tmp & RADEON_I2C_DONE)
 487                                 break;
 488                         else {
 489                                 DRM_DEBUG("i2c write error 0x%08x\n", tmp);
 490                                 WREG32(i2c_cntl_0, tmp | RADEON_I2C_ABORT);
 491                                 ret = -EIO;
 492                                 goto done;
 493                         }
 494                 }
 495                 goto done;
 496         }
 497 
 498         for (i = 0; i < num; i++) {
 499                 p = &msgs[i];
 500                 for (j = 0; j < p->len; j++) {
 501                         if (p->flags & I2C_M_RD) {
 502                                 WREG32(i2c_cntl_0, (RADEON_I2C_DONE |
 503                                                     RADEON_I2C_NACK |
 504                                                     RADEON_I2C_HALT |
 505                                                     RADEON_I2C_SOFT_RST));
 506                                 WREG32(i2c_data, ((p->addr << 1) & 0xff) | 0x1);
 507                                 WREG32(i2c_cntl_1, ((1 << RADEON_I2C_DATA_COUNT_SHIFT) |
 508                                                     (1 << RADEON_I2C_ADDR_COUNT_SHIFT) |
 509                                                     RADEON_I2C_EN |
 510                                                     (48 << RADEON_I2C_TIME_LIMIT_SHIFT)));
 511                                 WREG32(i2c_cntl_0, reg | RADEON_I2C_RECEIVE);
 512                                 for (k = 0; k < 32; k++) {
 513                                         udelay(10);
 514                                         tmp = RREG32(i2c_cntl_0);
 515                                         if (tmp & RADEON_I2C_GO)
 516                                                 continue;
 517                                         tmp = RREG32(i2c_cntl_0);
 518                                         if (tmp & RADEON_I2C_DONE)
 519                                                 break;
 520                                         else {
 521                                                 DRM_DEBUG("i2c read error 0x%08x\n", tmp);
 522                                                 WREG32(i2c_cntl_0, tmp | RADEON_I2C_ABORT);
 523                                                 ret = -EIO;
 524                                                 goto done;
 525                                         }
 526                                 }
 527                                 p->buf[j] = RREG32(i2c_data) & 0xff;
 528                         } else {
 529                                 WREG32(i2c_cntl_0, (RADEON_I2C_DONE |
 530                                                     RADEON_I2C_NACK |
 531                                                     RADEON_I2C_HALT |
 532                                                     RADEON_I2C_SOFT_RST));
 533                                 WREG32(i2c_data, (p->addr << 1) & 0xff);
 534                                 WREG32(i2c_data, p->buf[j]);
 535                                 WREG32(i2c_cntl_1, ((1 << RADEON_I2C_DATA_COUNT_SHIFT) |
 536                                                     (1 << RADEON_I2C_ADDR_COUNT_SHIFT) |
 537                                                     RADEON_I2C_EN |
 538                                                     (48 << RADEON_I2C_TIME_LIMIT_SHIFT)));
 539                                 WREG32(i2c_cntl_0, reg);
 540                                 for (k = 0; k < 32; k++) {
 541                                         udelay(10);
 542                                         tmp = RREG32(i2c_cntl_0);
 543                                         if (tmp & RADEON_I2C_GO)
 544                                                 continue;
 545                                         tmp = RREG32(i2c_cntl_0);
 546                                         if (tmp & RADEON_I2C_DONE)
 547                                                 break;
 548                                         else {
 549                                                 DRM_DEBUG("i2c write error 0x%08x\n", tmp);
 550                                                 WREG32(i2c_cntl_0, tmp | RADEON_I2C_ABORT);
 551                                                 ret = -EIO;
 552                                                 goto done;
 553                                         }
 554                                 }
 555                         }
 556                 }
 557         }
 558 
 559 done:
 560         WREG32(i2c_cntl_0, 0);
 561         WREG32(i2c_cntl_1, 0);
 562         WREG32(i2c_cntl_0, (RADEON_I2C_DONE |
 563                             RADEON_I2C_NACK |
 564                             RADEON_I2C_HALT |
 565                             RADEON_I2C_SOFT_RST));
 566 
 567         if (rdev->is_atom_bios) {
 568                 tmp = RREG32(RADEON_BIOS_6_SCRATCH);
 569                 tmp &= ~ATOM_S6_HW_I2C_BUSY_STATE;
 570                 WREG32(RADEON_BIOS_6_SCRATCH, tmp);
 571         }
 572 
 573         mutex_unlock(&rdev->pm.mutex);
 574         mutex_unlock(&rdev->dc_hw_i2c_mutex);
 575 
 576         return ret;
 577 }
 578 
 579 /* hw i2c engine for r5xx hardware
 580  * hw can buffer up to 15 bytes
 581  */
 582 static int r500_hw_i2c_xfer(struct i2c_adapter *i2c_adap,
 583                             struct i2c_msg *msgs, int num)
 584 {
 585         struct radeon_i2c_chan *i2c = i2c_get_adapdata(i2c_adap);
 586         struct radeon_device *rdev = i2c->dev->dev_private;
 587         struct radeon_i2c_bus_rec *rec = &i2c->rec;
 588         struct i2c_msg *p;
 589         int i, j, remaining, current_count, buffer_offset, ret = num;
 590         u32 prescale;
 591         u32 tmp, reg;
 592         u32 saved1, saved2;
 593 
 594         mutex_lock(&rdev->dc_hw_i2c_mutex);
 595         /* take the pm lock since we need a constant sclk */
 596         mutex_lock(&rdev->pm.mutex);
 597 
 598         prescale = radeon_get_i2c_prescale(rdev);
 599 
 600         /* clear gpio mask bits */
 601         tmp = RREG32(rec->mask_clk_reg);
 602         tmp &= ~rec->mask_clk_mask;
 603         WREG32(rec->mask_clk_reg, tmp);
 604         tmp = RREG32(rec->mask_clk_reg);
 605 
 606         tmp = RREG32(rec->mask_data_reg);
 607         tmp &= ~rec->mask_data_mask;
 608         WREG32(rec->mask_data_reg, tmp);
 609         tmp = RREG32(rec->mask_data_reg);
 610 
 611         /* clear pin values */
 612         tmp = RREG32(rec->a_clk_reg);
 613         tmp &= ~rec->a_clk_mask;
 614         WREG32(rec->a_clk_reg, tmp);
 615         tmp = RREG32(rec->a_clk_reg);
 616 
 617         tmp = RREG32(rec->a_data_reg);
 618         tmp &= ~rec->a_data_mask;
 619         WREG32(rec->a_data_reg, tmp);
 620         tmp = RREG32(rec->a_data_reg);
 621 
 622         /* set the pins to input */
 623         tmp = RREG32(rec->en_clk_reg);
 624         tmp &= ~rec->en_clk_mask;
 625         WREG32(rec->en_clk_reg, tmp);
 626         tmp = RREG32(rec->en_clk_reg);
 627 
 628         tmp = RREG32(rec->en_data_reg);
 629         tmp &= ~rec->en_data_mask;
 630         WREG32(rec->en_data_reg, tmp);
 631         tmp = RREG32(rec->en_data_reg);
 632 
 633         /* */
 634         tmp = RREG32(RADEON_BIOS_6_SCRATCH);
 635         WREG32(RADEON_BIOS_6_SCRATCH, tmp | ATOM_S6_HW_I2C_BUSY_STATE);
 636         saved1 = RREG32(AVIVO_DC_I2C_CONTROL1);
 637         saved2 = RREG32(0x494);
 638         WREG32(0x494, saved2 | 0x1);
 639 
 640         WREG32(AVIVO_DC_I2C_ARBITRATION, AVIVO_DC_I2C_SW_WANTS_TO_USE_I2C);
 641         for (i = 0; i < 50; i++) {
 642                 udelay(1);
 643                 if (RREG32(AVIVO_DC_I2C_ARBITRATION) & AVIVO_DC_I2C_SW_CAN_USE_I2C)
 644                         break;
 645         }
 646         if (i == 50) {
 647                 DRM_ERROR("failed to get i2c bus\n");
 648                 ret = -EBUSY;
 649                 goto done;
 650         }
 651 
 652         reg = AVIVO_DC_I2C_START | AVIVO_DC_I2C_STOP | AVIVO_DC_I2C_EN;
 653         switch (rec->mask_clk_reg) {
 654         case AVIVO_DC_GPIO_DDC1_MASK:
 655                 reg |= AVIVO_DC_I2C_PIN_SELECT(AVIVO_SEL_DDC1);
 656                 break;
 657         case AVIVO_DC_GPIO_DDC2_MASK:
 658                 reg |= AVIVO_DC_I2C_PIN_SELECT(AVIVO_SEL_DDC2);
 659                 break;
 660         case AVIVO_DC_GPIO_DDC3_MASK:
 661                 reg |= AVIVO_DC_I2C_PIN_SELECT(AVIVO_SEL_DDC3);
 662                 break;
 663         default:
 664                 DRM_ERROR("gpio not supported with hw i2c\n");
 665                 ret = -EINVAL;
 666                 goto done;
 667         }
 668 
 669         /* check for bus probe */
 670         p = &msgs[0];
 671         if ((num == 1) && (p->len == 0)) {
 672                 WREG32(AVIVO_DC_I2C_STATUS1, (AVIVO_DC_I2C_DONE |
 673                                               AVIVO_DC_I2C_NACK |
 674                                               AVIVO_DC_I2C_HALT));
 675                 WREG32(AVIVO_DC_I2C_RESET, AVIVO_DC_I2C_SOFT_RESET);
 676                 udelay(1);
 677                 WREG32(AVIVO_DC_I2C_RESET, 0);
 678 
 679                 WREG32(AVIVO_DC_I2C_DATA, (p->addr << 1) & 0xff);
 680                 WREG32(AVIVO_DC_I2C_DATA, 0);
 681 
 682                 WREG32(AVIVO_DC_I2C_CONTROL3, AVIVO_DC_I2C_TIME_LIMIT(48));
 683                 WREG32(AVIVO_DC_I2C_CONTROL2, (AVIVO_DC_I2C_ADDR_COUNT(1) |
 684                                                AVIVO_DC_I2C_DATA_COUNT(1) |
 685                                                (prescale << 16)));
 686                 WREG32(AVIVO_DC_I2C_CONTROL1, reg);
 687                 WREG32(AVIVO_DC_I2C_STATUS1, AVIVO_DC_I2C_GO);
 688                 for (j = 0; j < 200; j++) {
 689                         udelay(50);
 690                         tmp = RREG32(AVIVO_DC_I2C_STATUS1);
 691                         if (tmp & AVIVO_DC_I2C_GO)
 692                                 continue;
 693                         tmp = RREG32(AVIVO_DC_I2C_STATUS1);
 694                         if (tmp & AVIVO_DC_I2C_DONE)
 695                                 break;
 696                         else {
 697                                 DRM_DEBUG("i2c write error 0x%08x\n", tmp);
 698                                 WREG32(AVIVO_DC_I2C_RESET, AVIVO_DC_I2C_ABORT);
 699                                 ret = -EIO;
 700                                 goto done;
 701                         }
 702                 }
 703                 goto done;
 704         }
 705 
 706         for (i = 0; i < num; i++) {
 707                 p = &msgs[i];
 708                 remaining = p->len;
 709                 buffer_offset = 0;
 710                 if (p->flags & I2C_M_RD) {
 711                         while (remaining) {
 712                                 if (remaining > 15)
 713                                         current_count = 15;
 714                                 else
 715                                         current_count = remaining;
 716                                 WREG32(AVIVO_DC_I2C_STATUS1, (AVIVO_DC_I2C_DONE |
 717                                                               AVIVO_DC_I2C_NACK |
 718                                                               AVIVO_DC_I2C_HALT));
 719                                 WREG32(AVIVO_DC_I2C_RESET, AVIVO_DC_I2C_SOFT_RESET);
 720                                 udelay(1);
 721                                 WREG32(AVIVO_DC_I2C_RESET, 0);
 722 
 723                                 WREG32(AVIVO_DC_I2C_DATA, ((p->addr << 1) & 0xff) | 0x1);
 724                                 WREG32(AVIVO_DC_I2C_CONTROL3, AVIVO_DC_I2C_TIME_LIMIT(48));
 725                                 WREG32(AVIVO_DC_I2C_CONTROL2, (AVIVO_DC_I2C_ADDR_COUNT(1) |
 726                                                                AVIVO_DC_I2C_DATA_COUNT(current_count) |
 727                                                                (prescale << 16)));
 728                                 WREG32(AVIVO_DC_I2C_CONTROL1, reg | AVIVO_DC_I2C_RECEIVE);
 729                                 WREG32(AVIVO_DC_I2C_STATUS1, AVIVO_DC_I2C_GO);
 730                                 for (j = 0; j < 200; j++) {
 731                                         udelay(50);
 732                                         tmp = RREG32(AVIVO_DC_I2C_STATUS1);
 733                                         if (tmp & AVIVO_DC_I2C_GO)
 734                                                 continue;
 735                                         tmp = RREG32(AVIVO_DC_I2C_STATUS1);
 736                                         if (tmp & AVIVO_DC_I2C_DONE)
 737                                                 break;
 738                                         else {
 739                                                 DRM_DEBUG("i2c read error 0x%08x\n", tmp);
 740                                                 WREG32(AVIVO_DC_I2C_RESET, AVIVO_DC_I2C_ABORT);
 741                                                 ret = -EIO;
 742                                                 goto done;
 743                                         }
 744                                 }
 745                                 for (j = 0; j < current_count; j++)
 746                                         p->buf[buffer_offset + j] = RREG32(AVIVO_DC_I2C_DATA) & 0xff;
 747                                 remaining -= current_count;
 748                                 buffer_offset += current_count;
 749                         }
 750                 } else {
 751                         while (remaining) {
 752                                 if (remaining > 15)
 753                                         current_count = 15;
 754                                 else
 755                                         current_count = remaining;
 756                                 WREG32(AVIVO_DC_I2C_STATUS1, (AVIVO_DC_I2C_DONE |
 757                                                               AVIVO_DC_I2C_NACK |
 758                                                               AVIVO_DC_I2C_HALT));
 759                                 WREG32(AVIVO_DC_I2C_RESET, AVIVO_DC_I2C_SOFT_RESET);
 760                                 udelay(1);
 761                                 WREG32(AVIVO_DC_I2C_RESET, 0);
 762 
 763                                 WREG32(AVIVO_DC_I2C_DATA, (p->addr << 1) & 0xff);
 764                                 for (j = 0; j < current_count; j++)
 765                                         WREG32(AVIVO_DC_I2C_DATA, p->buf[buffer_offset + j]);
 766 
 767                                 WREG32(AVIVO_DC_I2C_CONTROL3, AVIVO_DC_I2C_TIME_LIMIT(48));
 768                                 WREG32(AVIVO_DC_I2C_CONTROL2, (AVIVO_DC_I2C_ADDR_COUNT(1) |
 769                                                                AVIVO_DC_I2C_DATA_COUNT(current_count) |
 770                                                                (prescale << 16)));
 771                                 WREG32(AVIVO_DC_I2C_CONTROL1, reg);
 772                                 WREG32(AVIVO_DC_I2C_STATUS1, AVIVO_DC_I2C_GO);
 773                                 for (j = 0; j < 200; j++) {
 774                                         udelay(50);
 775                                         tmp = RREG32(AVIVO_DC_I2C_STATUS1);
 776                                         if (tmp & AVIVO_DC_I2C_GO)
 777                                                 continue;
 778                                         tmp = RREG32(AVIVO_DC_I2C_STATUS1);
 779                                         if (tmp & AVIVO_DC_I2C_DONE)
 780                                                 break;
 781                                         else {
 782                                                 DRM_DEBUG("i2c write error 0x%08x\n", tmp);
 783                                                 WREG32(AVIVO_DC_I2C_RESET, AVIVO_DC_I2C_ABORT);
 784                                                 ret = -EIO;
 785                                                 goto done;
 786                                         }
 787                                 }
 788                                 remaining -= current_count;
 789                                 buffer_offset += current_count;
 790                         }
 791                 }
 792         }
 793 
 794 done:
 795         WREG32(AVIVO_DC_I2C_STATUS1, (AVIVO_DC_I2C_DONE |
 796                                       AVIVO_DC_I2C_NACK |
 797                                       AVIVO_DC_I2C_HALT));
 798         WREG32(AVIVO_DC_I2C_RESET, AVIVO_DC_I2C_SOFT_RESET);
 799         udelay(1);
 800         WREG32(AVIVO_DC_I2C_RESET, 0);
 801 
 802         WREG32(AVIVO_DC_I2C_ARBITRATION, AVIVO_DC_I2C_SW_DONE_USING_I2C);
 803         WREG32(AVIVO_DC_I2C_CONTROL1, saved1);
 804         WREG32(0x494, saved2);
 805         tmp = RREG32(RADEON_BIOS_6_SCRATCH);
 806         tmp &= ~ATOM_S6_HW_I2C_BUSY_STATE;
 807         WREG32(RADEON_BIOS_6_SCRATCH, tmp);
 808 
 809         mutex_unlock(&rdev->pm.mutex);
 810         mutex_unlock(&rdev->dc_hw_i2c_mutex);
 811 
 812         return ret;
 813 }
 814 
 815 static int radeon_hw_i2c_xfer(struct i2c_adapter *i2c_adap,
 816                               struct i2c_msg *msgs, int num)
 817 {
 818         struct radeon_i2c_chan *i2c = i2c_get_adapdata(i2c_adap);
 819         struct radeon_device *rdev = i2c->dev->dev_private;
 820         struct radeon_i2c_bus_rec *rec = &i2c->rec;
 821         int ret = 0;
 822 
 823         mutex_lock(&i2c->mutex);
 824 
 825         switch (rdev->family) {
 826         case CHIP_R100:
 827         case CHIP_RV100:
 828         case CHIP_RS100:
 829         case CHIP_RV200:
 830         case CHIP_RS200:
 831         case CHIP_R200:
 832         case CHIP_RV250:
 833         case CHIP_RS300:
 834         case CHIP_RV280:
 835         case CHIP_R300:
 836         case CHIP_R350:
 837         case CHIP_RV350:
 838         case CHIP_RV380:
 839         case CHIP_R420:
 840         case CHIP_R423:
 841         case CHIP_RV410:
 842         case CHIP_RS400:
 843         case CHIP_RS480:
 844                 ret = r100_hw_i2c_xfer(i2c_adap, msgs, num);
 845                 break;
 846         case CHIP_RS600:
 847         case CHIP_RS690:
 848         case CHIP_RS740:
 849                 /* XXX fill in hw i2c implementation */
 850                 break;
 851         case CHIP_RV515:
 852         case CHIP_R520:
 853         case CHIP_RV530:
 854         case CHIP_RV560:
 855         case CHIP_RV570:
 856         case CHIP_R580:
 857                 if (rec->mm_i2c)
 858                         ret = r100_hw_i2c_xfer(i2c_adap, msgs, num);
 859                 else
 860                         ret = r500_hw_i2c_xfer(i2c_adap, msgs, num);
 861                 break;
 862         case CHIP_R600:
 863         case CHIP_RV610:
 864         case CHIP_RV630:
 865         case CHIP_RV670:
 866                 /* XXX fill in hw i2c implementation */
 867                 break;
 868         case CHIP_RV620:
 869         case CHIP_RV635:
 870         case CHIP_RS780:
 871         case CHIP_RS880:
 872         case CHIP_RV770:
 873         case CHIP_RV730:
 874         case CHIP_RV710:
 875         case CHIP_RV740:
 876                 /* XXX fill in hw i2c implementation */
 877                 break;
 878         case CHIP_CEDAR:
 879         case CHIP_REDWOOD:
 880         case CHIP_JUNIPER:
 881         case CHIP_CYPRESS:
 882         case CHIP_HEMLOCK:
 883                 /* XXX fill in hw i2c implementation */
 884                 break;
 885         default:
 886                 DRM_ERROR("i2c: unhandled radeon chip\n");
 887                 ret = -EIO;
 888                 break;
 889         }
 890 
 891         mutex_unlock(&i2c->mutex);
 892 
 893         return ret;
 894 }
 895 
 896 static u32 radeon_hw_i2c_func(struct i2c_adapter *adap)
 897 {
 898         return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL;
 899 }
 900 
 901 static const struct i2c_algorithm radeon_i2c_algo = {
 902         .master_xfer = radeon_hw_i2c_xfer,
 903         .functionality = radeon_hw_i2c_func,
 904 };
 905 
 906 static const struct i2c_algorithm radeon_atom_i2c_algo = {
 907         .master_xfer = radeon_atom_hw_i2c_xfer,
 908         .functionality = radeon_atom_hw_i2c_func,
 909 };
 910 
 911 struct radeon_i2c_chan *radeon_i2c_create(struct drm_device *dev,
 912                                           struct radeon_i2c_bus_rec *rec,
 913                                           const char *name)
 914 {
 915         struct radeon_device *rdev = dev->dev_private;
 916         struct radeon_i2c_chan *i2c;
 917         int ret;
 918 
 919         /* don't add the mm_i2c bus unless hw_i2c is enabled */
 920         if (rec->mm_i2c && (radeon_hw_i2c == 0))
 921                 return NULL;
 922 
 923         i2c = kzalloc(sizeof(struct radeon_i2c_chan), GFP_KERNEL);
 924         if (i2c == NULL)
 925                 return NULL;
 926 
 927         i2c->rec = *rec;
 928         i2c->adapter.owner = THIS_MODULE;
 929         i2c->adapter.class = I2C_CLASS_DDC;
 930         i2c->adapter.dev.parent = &dev->pdev->dev;
 931         i2c->dev = dev;
 932         i2c_set_adapdata(&i2c->adapter, i2c);
 933         mutex_init(&i2c->mutex);
 934         if (rec->mm_i2c ||
 935             (rec->hw_capable &&
 936              radeon_hw_i2c &&
 937              ((rdev->family <= CHIP_RS480) ||
 938               ((rdev->family >= CHIP_RV515) && (rdev->family <= CHIP_R580))))) {
 939                 /* set the radeon hw i2c adapter */
 940                 snprintf(i2c->adapter.name, sizeof(i2c->adapter.name),
 941                          "Radeon i2c hw bus %s", name);
 942                 i2c->adapter.algo = &radeon_i2c_algo;
 943                 ret = i2c_add_adapter(&i2c->adapter);
 944                 if (ret)
 945                         goto out_free;
 946         } else if (rec->hw_capable &&
 947                    radeon_hw_i2c &&
 948                    ASIC_IS_DCE3(rdev)) {
 949                 /* hw i2c using atom */
 950                 snprintf(i2c->adapter.name, sizeof(i2c->adapter.name),
 951                          "Radeon i2c hw bus %s", name);
 952                 i2c->adapter.algo = &radeon_atom_i2c_algo;
 953                 ret = i2c_add_adapter(&i2c->adapter);
 954                 if (ret)
 955                         goto out_free;
 956         } else {
 957                 /* set the radeon bit adapter */
 958                 snprintf(i2c->adapter.name, sizeof(i2c->adapter.name),
 959                          "Radeon i2c bit bus %s", name);
 960                 i2c->adapter.algo_data = &i2c->bit;
 961                 i2c->bit.pre_xfer = pre_xfer;
 962                 i2c->bit.post_xfer = post_xfer;
 963                 i2c->bit.setsda = set_data;
 964                 i2c->bit.setscl = set_clock;
 965                 i2c->bit.getsda = get_data;
 966                 i2c->bit.getscl = get_clock;
 967                 i2c->bit.udelay = 10;
 968                 i2c->bit.timeout = usecs_to_jiffies(2200);      /* from VESA */
 969                 i2c->bit.data = i2c;
 970                 ret = i2c_bit_add_bus(&i2c->adapter);
 971                 if (ret) {
 972                         DRM_ERROR("Failed to register bit i2c %s\n", name);
 973                         goto out_free;
 974                 }
 975         }
 976 
 977         return i2c;
 978 out_free:
 979         kfree(i2c);
 980         return NULL;
 981 
 982 }
 983 
 984 void radeon_i2c_destroy(struct radeon_i2c_chan *i2c)
 985 {
 986         if (!i2c)
 987                 return;
 988         WARN_ON(i2c->has_aux);
 989         i2c_del_adapter(&i2c->adapter);
 990         kfree(i2c);
 991 }
 992 
 993 /* Add the default buses */
 994 void radeon_i2c_init(struct radeon_device *rdev)
 995 {
 996         if (radeon_hw_i2c)
 997                 DRM_INFO("hw_i2c forced on, you may experience display detection problems!\n");
 998 
 999         if (rdev->is_atom_bios)
1000                 radeon_atombios_i2c_init(rdev);
1001         else
1002                 radeon_combios_i2c_init(rdev);
1003 }
1004 
1005 /* remove all the buses */
1006 void radeon_i2c_fini(struct radeon_device *rdev)
1007 {
1008         int i;
1009 
1010         for (i = 0; i < RADEON_MAX_I2C_BUS; i++) {
1011                 if (rdev->i2c_bus[i]) {
1012                         radeon_i2c_destroy(rdev->i2c_bus[i]);
1013                         rdev->i2c_bus[i] = NULL;
1014                 }
1015         }
1016 }
1017 
1018 /* Add additional buses */
1019 void radeon_i2c_add(struct radeon_device *rdev,
1020                     struct radeon_i2c_bus_rec *rec,
1021                     const char *name)
1022 {
1023         struct drm_device *dev = rdev->ddev;
1024         int i;
1025 
1026         for (i = 0; i < RADEON_MAX_I2C_BUS; i++) {
1027                 if (!rdev->i2c_bus[i]) {
1028                         rdev->i2c_bus[i] = radeon_i2c_create(dev, rec, name);
1029                         return;
1030                 }
1031         }
1032 }
1033 
1034 /* looks up bus based on id */
1035 struct radeon_i2c_chan *radeon_i2c_lookup(struct radeon_device *rdev,
1036                                           struct radeon_i2c_bus_rec *i2c_bus)
1037 {
1038         int i;
1039 
1040         for (i = 0; i < RADEON_MAX_I2C_BUS; i++) {
1041                 if (rdev->i2c_bus[i] &&
1042                     (rdev->i2c_bus[i]->rec.i2c_id == i2c_bus->i2c_id)) {
1043                         return rdev->i2c_bus[i];
1044                 }
1045         }
1046         return NULL;
1047 }
1048 
1049 void radeon_i2c_get_byte(struct radeon_i2c_chan *i2c_bus,
1050                          u8 slave_addr,
1051                          u8 addr,
1052                          u8 *val)
1053 {
1054         u8 out_buf[2];
1055         u8 in_buf[2];
1056         struct i2c_msg msgs[] = {
1057                 {
1058                         .addr = slave_addr,
1059                         .flags = 0,
1060                         .len = 1,
1061                         .buf = out_buf,
1062                 },
1063                 {
1064                         .addr = slave_addr,
1065                         .flags = I2C_M_RD,
1066                         .len = 1,
1067                         .buf = in_buf,
1068                 }
1069         };
1070 
1071         out_buf[0] = addr;
1072         out_buf[1] = 0;
1073 
1074         if (i2c_transfer(&i2c_bus->adapter, msgs, 2) == 2) {
1075                 *val = in_buf[0];
1076                 DRM_DEBUG("val = 0x%02x\n", *val);
1077         } else {
1078                 DRM_DEBUG("i2c 0x%02x 0x%02x read failed\n",
1079                           addr, *val);
1080         }
1081 }
1082 
1083 void radeon_i2c_put_byte(struct radeon_i2c_chan *i2c_bus,
1084                          u8 slave_addr,
1085                          u8 addr,
1086                          u8 val)
1087 {
1088         uint8_t out_buf[2];
1089         struct i2c_msg msg = {
1090                 .addr = slave_addr,
1091                 .flags = 0,
1092                 .len = 2,
1093                 .buf = out_buf,
1094         };
1095 
1096         out_buf[0] = addr;
1097         out_buf[1] = val;
1098 
1099         if (i2c_transfer(&i2c_bus->adapter, &msg, 1) != 1)
1100                 DRM_DEBUG("i2c 0x%02x 0x%02x write failed\n",
1101                           addr, val);
1102 }
1103 
1104 /* ddc router switching */
1105 void radeon_router_select_ddc_port(struct radeon_connector *radeon_connector)
1106 {
1107         u8 val;
1108 
1109         if (!radeon_connector->router.ddc_valid)
1110                 return;
1111 
1112         if (!radeon_connector->router_bus)
1113                 return;
1114 
1115         radeon_i2c_get_byte(radeon_connector->router_bus,
1116                             radeon_connector->router.i2c_addr,
1117                             0x3, &val);
1118         val &= ~radeon_connector->router.ddc_mux_control_pin;
1119         radeon_i2c_put_byte(radeon_connector->router_bus,
1120                             radeon_connector->router.i2c_addr,
1121                             0x3, val);
1122         radeon_i2c_get_byte(radeon_connector->router_bus,
1123                             radeon_connector->router.i2c_addr,
1124                             0x1, &val);
1125         val &= ~radeon_connector->router.ddc_mux_control_pin;
1126         val |= radeon_connector->router.ddc_mux_state;
1127         radeon_i2c_put_byte(radeon_connector->router_bus,
1128                             radeon_connector->router.i2c_addr,
1129                             0x1, val);
1130 }
1131 
1132 /* clock/data router switching */
1133 void radeon_router_select_cd_port(struct radeon_connector *radeon_connector)
1134 {
1135         u8 val;
1136 
1137         if (!radeon_connector->router.cd_valid)
1138                 return;
1139 
1140         if (!radeon_connector->router_bus)
1141                 return;
1142 
1143         radeon_i2c_get_byte(radeon_connector->router_bus,
1144                             radeon_connector->router.i2c_addr,
1145                             0x3, &val);
1146         val &= ~radeon_connector->router.cd_mux_control_pin;
1147         radeon_i2c_put_byte(radeon_connector->router_bus,
1148                             radeon_connector->router.i2c_addr,
1149                             0x3, val);
1150         radeon_i2c_get_byte(radeon_connector->router_bus,
1151                             radeon_connector->router.i2c_addr,
1152                             0x1, &val);
1153         val &= ~radeon_connector->router.cd_mux_control_pin;
1154         val |= radeon_connector->router.cd_mux_state;
1155         radeon_i2c_put_byte(radeon_connector->router_bus,
1156                             radeon_connector->router.i2c_addr,
1157                             0x1, val);
1158 }
1159 

/* [<][>][^][v][top][bottom][index][help] */