1/* 2 * Copyright (C) 1998 Itai Nahshon, Michael Schimek 3 * 4 * The original code was derived from and inspired by 5 * the I2C driver from the Linux kernel. 6 * (c) 1998 Gerd Knorr <kraxel@cs.tu-berlin.de> 7 */ 8 9#ifdef HAVE_XORG_CONFIG_H 10#include <xorg-config.h> 11#endif 12 13#include <sys/time.h> 14#include <string.h> 15 16#include "misc.h" 17#include "xf86.h" 18#include "xf86_OSproc.h" 19 20#include <X11/X.h> 21#include <X11/Xos.h> 22#include <X11/Xproto.h> 23#include "scrnintstr.h" 24#include "regionstr.h" 25#include "windowstr.h" 26#include "pixmapstr.h" 27#include "validate.h" 28#include "resource.h" 29#include "gcstruct.h" 30#include "dixstruct.h" 31 32#include "xf86i2c.h" 33 34#define I2C_TIMEOUT(x) /*(x)*/ /* Report timeouts */ 35#define I2C_TRACE(x) /*(x)*/ /* Report progress */ 36 37/* This is the default I2CUDelay function if not supplied by the driver. 38 * High level I2C interfaces implementing the bus protocol in hardware 39 * should supply this function too. 40 * 41 * Delay execution at least usec microseconds. 42 * All values 0 to 1e6 inclusive must be expected. 43 */ 44 45static void 46I2CUDelay(I2CBusPtr b, int usec) 47{ 48 struct timeval begin, cur; 49 long d_secs, d_usecs; 50 long diff; 51 52 if (usec > 0) { 53 X_GETTIMEOFDAY(&begin); 54 do { 55 /* It would be nice to use {xf86}usleep, 56 * but usleep (1) takes >10000 usec ! 57 */ 58 X_GETTIMEOFDAY(&cur); 59 d_secs = (cur.tv_sec - begin.tv_sec); 60 d_usecs = (cur.tv_usec - begin.tv_usec); 61 diff = d_secs * 1000000 + d_usecs; 62 } while (diff >= 0 && diff < (usec + 1)); 63 } 64} 65 66/* Most drivers will register just with GetBits/PutBits functions. 67 * The following functions implement a software I2C protocol 68 * by using the promitive functions given by the driver. 69 * ================================================================ 70 * 71 * It is assumed that there is just one master on the I2C bus, therefore 72 * there is no explicit test for conflits. 73 */ 74 75#define RISEFALLTIME 2 /* usec, actually 300 to 1000 ns according to the i2c specs */ 76 77/* Some devices will hold SCL low to slow down the bus or until 78 * ready for transmission. 79 * 80 * This condition will be noticed when the master tries to raise 81 * the SCL line. You can set the timeout to zero if the slave device 82 * does not support this clock synchronization. 83 */ 84 85static Bool 86I2CRaiseSCL(I2CBusPtr b, int sda, int timeout) 87{ 88 int i, scl; 89 90 b->I2CPutBits(b, 1, sda); 91 b->I2CUDelay(b, b->RiseFallTime); 92 93 for (i = timeout; i > 0; i -= b->RiseFallTime) { 94 b->I2CGetBits(b, &scl, &sda); 95 if (scl) 96 break; 97 b->I2CUDelay(b, b->RiseFallTime); 98 } 99 100 if (i <= 0) { 101 I2C_TIMEOUT(ErrorF 102 ("[I2CRaiseSCL(<%s>, %d, %d) timeout]", b->BusName, sda, 103 timeout)); 104 return FALSE; 105 } 106 107 return TRUE; 108} 109 110/* Send a start signal on the I2C bus. The start signal notifies 111 * devices that a new transaction is initiated by the bus master. 112 * 113 * The start signal is always followed by a slave address. 114 * Slave addresses are 8+ bits. The first 7 bits identify the 115 * device and the last bit signals if this is a read (1) or 116 * write (0) operation. 117 * 118 * There may be more than one start signal on one transaction. 119 * This happens for example on some devices that allow reading 120 * of registers. First send a start bit followed by the device 121 * address (with the last bit 0) and the register number. Then send 122 * a new start bit with the device address (with the last bit 1) 123 * and then read the value from the device. 124 * 125 * Note this is function does not implement a multiple master 126 * arbitration procedure. 127 */ 128 129static Bool 130I2CStart(I2CBusPtr b, int timeout) 131{ 132 if (!I2CRaiseSCL(b, 1, timeout)) 133 return FALSE; 134 135 b->I2CPutBits(b, 1, 0); 136 b->I2CUDelay(b, b->HoldTime); 137 b->I2CPutBits(b, 0, 0); 138 b->I2CUDelay(b, b->HoldTime); 139 140 I2C_TRACE(ErrorF("\ni2c: <")); 141 142 return TRUE; 143} 144 145/* This is the default I2CStop function if not supplied by the driver. 146 * 147 * Signal devices on the I2C bus that a transaction on the 148 * bus has finished. There may be more than one start signal 149 * on a transaction but only one stop signal. 150 */ 151 152static void 153I2CStop(I2CDevPtr d) 154{ 155 I2CBusPtr b = d->pI2CBus; 156 157 b->I2CPutBits(b, 0, 0); 158 b->I2CUDelay(b, b->RiseFallTime); 159 160 b->I2CPutBits(b, 1, 0); 161 b->I2CUDelay(b, b->HoldTime); 162 b->I2CPutBits(b, 1, 1); 163 b->I2CUDelay(b, b->HoldTime); 164 165 I2C_TRACE(ErrorF(">\n")); 166} 167 168/* Write/Read a single bit to/from a device. 169 * Return FALSE if a timeout occurs. 170 */ 171 172static Bool 173I2CWriteBit(I2CBusPtr b, int sda, int timeout) 174{ 175 Bool r; 176 177 b->I2CPutBits(b, 0, sda); 178 b->I2CUDelay(b, b->RiseFallTime); 179 180 r = I2CRaiseSCL(b, sda, timeout); 181 b->I2CUDelay(b, b->HoldTime); 182 183 b->I2CPutBits(b, 0, sda); 184 b->I2CUDelay(b, b->HoldTime); 185 186 return r; 187} 188 189static Bool 190I2CReadBit(I2CBusPtr b, int *psda, int timeout) 191{ 192 Bool r; 193 int scl; 194 195 r = I2CRaiseSCL(b, 1, timeout); 196 b->I2CUDelay(b, b->HoldTime); 197 198 b->I2CGetBits(b, &scl, psda); 199 200 b->I2CPutBits(b, 0, 1); 201 b->I2CUDelay(b, b->HoldTime); 202 203 return r; 204} 205 206/* This is the default I2CPutByte function if not supplied by the driver. 207 * 208 * A single byte is sent to the device. 209 * The function returns FALSE if a timeout occurs, you should send 210 * a stop condition afterwards to reset the bus. 211 * 212 * A timeout occurs, 213 * if the slave pulls SCL to slow down the bus more than ByteTimeout usecs, 214 * or slows down the bus for more than BitTimeout usecs for each bit, 215 * or does not send an ACK bit (0) to acknowledge the transmission within 216 * AcknTimeout usecs, but a NACK (1) bit. 217 * 218 * AcknTimeout must be at least b->HoldTime, the other timeouts can be 219 * zero according to the comment on I2CRaiseSCL. 220 */ 221 222static Bool 223I2CPutByte(I2CDevPtr d, I2CByte data) 224{ 225 Bool r; 226 int i, scl, sda; 227 I2CBusPtr b = d->pI2CBus; 228 229 if (!I2CWriteBit(b, (data >> 7) & 1, d->ByteTimeout)) 230 return FALSE; 231 232 for (i = 6; i >= 0; i--) 233 if (!I2CWriteBit(b, (data >> i) & 1, d->BitTimeout)) 234 return FALSE; 235 236 b->I2CPutBits(b, 0, 1); 237 b->I2CUDelay(b, b->RiseFallTime); 238 239 r = I2CRaiseSCL(b, 1, b->HoldTime); 240 241 if (r) { 242 for (i = d->AcknTimeout; i > 0; i -= b->HoldTime) { 243 b->I2CUDelay(b, b->HoldTime); 244 b->I2CGetBits(b, &scl, &sda); 245 if (sda == 0) 246 break; 247 } 248 249 if (i <= 0) { 250 I2C_TIMEOUT(ErrorF("[I2CPutByte(<%s>, 0x%02x, %d, %d, %d) timeout]", 251 b->BusName, data, d->BitTimeout, 252 d->ByteTimeout, d->AcknTimeout)); 253 r = FALSE; 254 } 255 256 I2C_TRACE(ErrorF("W%02x%c ", (int) data, sda ? '-' : '+')); 257 } 258 259 b->I2CPutBits(b, 0, 1); 260 b->I2CUDelay(b, b->HoldTime); 261 262 return r; 263} 264 265/* This is the default I2CGetByte function if not supplied by the driver. 266 * 267 * A single byte is read from the device. 268 * The function returns FALSE if a timeout occurs, you should send 269 * a stop condition afterwards to reset the bus. 270 * 271 * A timeout occurs, 272 * if the slave pulls SCL to slow down the bus more than ByteTimeout usecs, 273 * or slows down the bus for more than b->BitTimeout usecs for each bit. 274 * 275 * ByteTimeout must be at least b->HoldTime, the other timeouts can be 276 * zero according to the comment on I2CRaiseSCL. 277 * 278 * For the <last> byte in a sequence the acknowledge bit NACK (1), 279 * otherwise ACK (0) will be sent. 280 */ 281 282static Bool 283I2CGetByte(I2CDevPtr d, I2CByte * data, Bool last) 284{ 285 int i, sda; 286 I2CBusPtr b = d->pI2CBus; 287 288 b->I2CPutBits(b, 0, 1); 289 b->I2CUDelay(b, b->RiseFallTime); 290 291 if (!I2CReadBit(b, &sda, d->ByteTimeout)) 292 return FALSE; 293 294 *data = (sda > 0) << 7; 295 296 for (i = 6; i >= 0; i--) 297 if (!I2CReadBit(b, &sda, d->BitTimeout)) 298 return FALSE; 299 else 300 *data |= (sda > 0) << i; 301 302 if (!I2CWriteBit(b, last ? 1 : 0, d->BitTimeout)) 303 return FALSE; 304 305 I2C_TRACE(ErrorF("R%02x%c ", (int) *data, last ? '+' : '-')); 306 307 return TRUE; 308} 309 310/* This is the default I2CAddress function if not supplied by the driver. 311 * 312 * It creates the start condition, followed by the d->SlaveAddr. 313 * Higher level functions must call this routine rather than 314 * I2CStart/PutByte because a hardware I2C master may not be able 315 * to send a slave address without a start condition. 316 * 317 * The same timeouts apply as with I2CPutByte and additional a 318 * StartTimeout, similar to the ByteTimeout but for the start 319 * condition. 320 * 321 * In case of a timeout, the bus is left in a clean idle condition. 322 * I. e. you *must not* send a Stop. If this function succeeds, you *must*. 323 * 324 * The slave address format is 16 bit, with the legacy _8_bit_ slave address 325 * in the least significant byte. This is, the slave address must include the 326 * R/_W flag as least significant bit. 327 * 328 * The most significant byte of the address will be sent _after_ the LSB, 329 * but only if the LSB indicates: 330 * a) an 11 bit address, this is LSB = 1111 0xxx. 331 * b) a 'general call address', this is LSB = 0000 000x - see the I2C specs 332 * for more. 333 */ 334 335static Bool 336I2CAddress(I2CDevPtr d, I2CSlaveAddr addr) 337{ 338 if (I2CStart(d->pI2CBus, d->StartTimeout)) { 339 if (I2CPutByte(d, addr & 0xFF)) { 340 if ((addr & 0xF8) != 0xF0 && (addr & 0xFE) != 0x00) 341 return TRUE; 342 343 if (I2CPutByte(d, (addr >> 8) & 0xFF)) 344 return TRUE; 345 } 346 347 I2CStop(d); 348 } 349 350 return FALSE; 351} 352 353/* These are the hardware independent I2C helper functions. 354 * ======================================================== 355 */ 356 357/* Function for probing. Just send the slave address 358 * and return true if the device responds. The slave address 359 * must have the lsb set to reflect a read (1) or write (0) access. 360 * Don't expect a read- or write-only device will respond otherwise. 361 */ 362 363Bool 364xf86I2CProbeAddress(I2CBusPtr b, I2CSlaveAddr addr) 365{ 366 int r; 367 I2CDevRec d; 368 369 d.DevName = "Probing"; 370 d.BitTimeout = b->BitTimeout; 371 d.ByteTimeout = b->ByteTimeout; 372 d.AcknTimeout = b->AcknTimeout; 373 d.StartTimeout = b->StartTimeout; 374 d.SlaveAddr = addr; 375 d.pI2CBus = b; 376 d.NextDev = NULL; 377 378 r = b->I2CAddress(&d, addr); 379 380 if (r) 381 b->I2CStop(&d); 382 383 return r; 384} 385 386/* All functions below are related to devices and take the 387 * slave address and timeout values from an I2CDevRec. They 388 * return FALSE in case of an error (presumably a timeout). 389 */ 390 391/* General purpose read and write function. 392 * 393 * 1st, if nWrite > 0 394 * Send a start condition 395 * Send the slave address (1 or 2 bytes) with write flag 396 * Write n bytes from WriteBuffer 397 * 2nd, if nRead > 0 398 * Send a start condition [again] 399 * Send the slave address (1 or 2 bytes) with read flag 400 * Read n bytes to ReadBuffer 401 * 3rd, if a Start condition has been successfully sent, 402 * Send a Stop condition. 403 * 404 * The function exits immediately when an error occurs, 405 * not processing any data left. However, step 3 will 406 * be executed anyway to leave the bus in clean idle state. 407 */ 408 409static Bool 410I2CWriteRead(I2CDevPtr d, 411 I2CByte * WriteBuffer, int nWrite, I2CByte * ReadBuffer, int nRead) 412{ 413 Bool r = TRUE; 414 I2CBusPtr b = d->pI2CBus; 415 int s = 0; 416 417 if (r && nWrite > 0) { 418 r = b->I2CAddress(d, d->SlaveAddr & ~1); 419 if (r) { 420 for (; nWrite > 0; WriteBuffer++, nWrite--) 421 if (!(r = b->I2CPutByte(d, *WriteBuffer))) 422 break; 423 s++; 424 } 425 } 426 427 if (r && nRead > 0) { 428 r = b->I2CAddress(d, d->SlaveAddr | 1); 429 if (r) { 430 for (; nRead > 0; ReadBuffer++, nRead--) 431 if (!(r = b->I2CGetByte(d, ReadBuffer, nRead == 1))) 432 break; 433 s++; 434 } 435 } 436 437 if (s) 438 b->I2CStop(d); 439 440 return r; 441} 442 443/* wrapper - for compatibility and convenience */ 444 445Bool 446xf86I2CWriteRead(I2CDevPtr d, 447 I2CByte * WriteBuffer, int nWrite, 448 I2CByte * ReadBuffer, int nRead) 449{ 450 I2CBusPtr b = d->pI2CBus; 451 452 return b->I2CWriteRead(d, WriteBuffer, nWrite, ReadBuffer, nRead); 453} 454 455/* Read a byte, the only readable register of a device. 456 */ 457 458Bool 459xf86I2CReadStatus(I2CDevPtr d, I2CByte * pbyte) 460{ 461 return xf86I2CWriteRead(d, NULL, 0, pbyte, 1); 462} 463 464/* Read a byte from one of the registers determined by its sub-address. 465 */ 466 467Bool 468xf86I2CReadByte(I2CDevPtr d, I2CByte subaddr, I2CByte * pbyte) 469{ 470 return xf86I2CWriteRead(d, &subaddr, 1, pbyte, 1); 471} 472 473/* Read bytes from subsequent registers determined by the 474 * sub-address of the first register. 475 */ 476 477Bool 478xf86I2CReadBytes(I2CDevPtr d, I2CByte subaddr, I2CByte * pbyte, int n) 479{ 480 return xf86I2CWriteRead(d, &subaddr, 1, pbyte, n); 481} 482 483/* Read a word (high byte, then low byte) from one of the registers 484 * determined by its sub-address. 485 */ 486 487Bool 488xf86I2CReadWord(I2CDevPtr d, I2CByte subaddr, unsigned short *pword) 489{ 490 I2CByte rb[2]; 491 492 if (!xf86I2CWriteRead(d, &subaddr, 1, rb, 2)) 493 return FALSE; 494 495 *pword = (rb[0] << 8) | rb[1]; 496 497 return TRUE; 498} 499 500/* Write a byte to one of the registers determined by its sub-address. 501 */ 502 503Bool 504xf86I2CWriteByte(I2CDevPtr d, I2CByte subaddr, I2CByte byte) 505{ 506 I2CByte wb[2]; 507 508 wb[0] = subaddr; 509 wb[1] = byte; 510 511 return xf86I2CWriteRead(d, wb, 2, NULL, 0); 512} 513 514/* Write bytes to subsequent registers determined by the 515 * sub-address of the first register. 516 */ 517 518Bool 519xf86I2CWriteBytes(I2CDevPtr d, I2CByte subaddr, 520 I2CByte * WriteBuffer, int nWrite) 521{ 522 I2CBusPtr b = d->pI2CBus; 523 Bool r = TRUE; 524 525 if (nWrite > 0) { 526 r = b->I2CAddress(d, d->SlaveAddr & ~1); 527 if (r) { 528 if ((r = b->I2CPutByte(d, subaddr))) 529 for (; nWrite > 0; WriteBuffer++, nWrite--) 530 if (!(r = b->I2CPutByte(d, *WriteBuffer))) 531 break; 532 533 b->I2CStop(d); 534 } 535 } 536 537 return r; 538} 539 540/* Write a word (high byte, then low byte) to one of the registers 541 * determined by its sub-address. 542 */ 543 544Bool 545xf86I2CWriteWord(I2CDevPtr d, I2CByte subaddr, unsigned short word) 546{ 547 I2CByte wb[3]; 548 549 wb[0] = subaddr; 550 wb[1] = word >> 8; 551 wb[2] = word & 0xFF; 552 553 return xf86I2CWriteRead(d, wb, 3, NULL, 0); 554} 555 556/* Write a vector of bytes to not adjacent registers. This vector is, 557 * 1st byte sub-address, 2nd byte value, 3rd byte sub-address asf. 558 * This function is intended to initialize devices. Note this function 559 * exits immediately when an error occurs, some registers may 560 * remain uninitialized. 561 */ 562 563Bool 564xf86I2CWriteVec(I2CDevPtr d, I2CByte * vec, int nValues) 565{ 566 I2CBusPtr b = d->pI2CBus; 567 Bool r = TRUE; 568 int s = 0; 569 570 if (nValues > 0) { 571 for (; nValues > 0; nValues--, vec += 2) { 572 if (!(r = b->I2CAddress(d, d->SlaveAddr & ~1))) 573 break; 574 575 s++; 576 577 if (!(r = b->I2CPutByte(d, vec[0]))) 578 break; 579 580 if (!(r = b->I2CPutByte(d, vec[1]))) 581 break; 582 } 583 584 if (s > 0) 585 b->I2CStop(d); 586 } 587 588 return r; 589} 590 591/* Administrative functions. 592 * ========================= 593 */ 594 595/* Allocates an I2CDevRec for you and initializes with proper defaults 596 * you may modify before calling xf86I2CDevInit. Your I2CDevRec must 597 * contain at least a SlaveAddr, and a pI2CBus pointer to the bus this 598 * device shall be linked to. 599 * 600 * See function I2CAddress for the slave address format. Always set 601 * the least significant bit, indicating a read or write access, to zero. 602 */ 603 604I2CDevPtr 605xf86CreateI2CDevRec(void) 606{ 607 return calloc(1, sizeof(I2CDevRec)); 608} 609 610/* Unlink an I2C device. If you got the I2CDevRec from xf86CreateI2CDevRec 611 * you should set <unalloc> to free it. 612 */ 613 614void 615xf86DestroyI2CDevRec(I2CDevPtr d, Bool unalloc) 616{ 617 if (d && d->pI2CBus) { 618 I2CDevPtr *p; 619 620 /* Remove this from the list of active I2C devices. */ 621 622 for (p = &d->pI2CBus->FirstDev; *p != NULL; p = &(*p)->NextDev) 623 if (*p == d) { 624 *p = (*p)->NextDev; 625 break; 626 } 627 628 xf86DrvMsg(d->pI2CBus->scrnIndex, X_INFO, 629 "I2C device \"%s:%s\" removed.\n", 630 d->pI2CBus->BusName, d->DevName); 631 } 632 633 if (unalloc) 634 free(d); 635} 636 637/* I2C transmissions are related to an I2CDevRec you must link to a 638 * previously registered bus (see xf86I2CBusInit) before attempting 639 * to read and write data. You may call xf86I2CProbeAddress first to 640 * see if the device in question is present on this bus. 641 * 642 * xf86I2CDevInit will not allocate an I2CBusRec for you, instead you 643 * may enter a pointer to a statically allocated I2CDevRec or the (modified) 644 * result of xf86CreateI2CDevRec. 645 * 646 * If you don't specify timeouts for the device (n <= 0), it will inherit 647 * the bus-wide defaults. The function returns TRUE on success. 648 */ 649 650Bool 651xf86I2CDevInit(I2CDevPtr d) 652{ 653 I2CBusPtr b; 654 655 if (d == NULL || 656 (b = d->pI2CBus) == NULL || 657 (d->SlaveAddr & 1) || xf86I2CFindDev(b, d->SlaveAddr) != NULL) 658 return FALSE; 659 660 if (d->BitTimeout <= 0) 661 d->BitTimeout = b->BitTimeout; 662 if (d->ByteTimeout <= 0) 663 d->ByteTimeout = b->ByteTimeout; 664 if (d->AcknTimeout <= 0) 665 d->AcknTimeout = b->AcknTimeout; 666 if (d->StartTimeout <= 0) 667 d->StartTimeout = b->StartTimeout; 668 669 d->NextDev = b->FirstDev; 670 b->FirstDev = d; 671 672 xf86DrvMsg(b->scrnIndex, X_INFO, 673 "I2C device \"%s:%s\" registered at address 0x%02X.\n", 674 b->BusName, d->DevName, d->SlaveAddr); 675 676 return TRUE; 677} 678 679I2CDevPtr 680xf86I2CFindDev(I2CBusPtr b, I2CSlaveAddr addr) 681{ 682 I2CDevPtr d; 683 684 if (b) { 685 for (d = b->FirstDev; d != NULL; d = d->NextDev) 686 if (d->SlaveAddr == addr) 687 return d; 688 } 689 690 return NULL; 691} 692 693static I2CBusPtr I2CBusList; 694 695/* Allocates an I2CBusRec for you and initializes with proper defaults 696 * you may modify before calling xf86I2CBusInit. Your I2CBusRec must 697 * contain at least a BusName, a scrnIndex (or -1), and a complete set 698 * of either high or low level I2C function pointers. You may pass 699 * bus-wide timeouts, otherwise inplausible values will be replaced 700 * with safe defaults. 701 */ 702 703I2CBusPtr 704xf86CreateI2CBusRec(void) 705{ 706 I2CBusPtr b; 707 708 b = (I2CBusPtr) calloc(1, sizeof(I2CBusRec)); 709 710 if (b != NULL) { 711 b->scrnIndex = -1; 712 b->pScrn = NULL; 713 b->HoldTime = 5; /* 100 kHz bus */ 714 b->BitTimeout = 5; 715 b->ByteTimeout = 5; 716 b->AcknTimeout = 5; 717 b->StartTimeout = 5; 718 b->RiseFallTime = RISEFALLTIME; 719 } 720 721 return b; 722} 723 724/* Unregister an I2C bus. If you got the I2CBusRec from xf86CreateI2CBusRec 725 * you should set <unalloc> to free it. If you set <devs_too>, the function 726 * xf86DestroyI2CDevRec will be called for all devices linked to the bus 727 * first, passing down the <unalloc> option. 728 */ 729 730void 731xf86DestroyI2CBusRec(I2CBusPtr b, Bool unalloc, Bool devs_too) 732{ 733 if (b) { 734 I2CBusPtr *p; 735 736 /* Remove this from the list of active I2C buses */ 737 738 for (p = &I2CBusList; *p != NULL; p = &(*p)->NextBus) 739 if (*p == b) { 740 *p = (*p)->NextBus; 741 break; 742 } 743 744 if (b->FirstDev != NULL) { 745 if (devs_too) { 746 I2CDevPtr d; 747 748 while ((d = b->FirstDev) != NULL) { 749 b->FirstDev = d->NextDev; 750 xf86DestroyI2CDevRec(d, unalloc); 751 } 752 } 753 else { 754 if (unalloc) { 755 xf86Msg(X_ERROR, 756 "i2c bug: Attempt to remove I2C bus \"%s\", " 757 "but device list is not empty.\n", b->BusName); 758 return; 759 } 760 } 761 } 762 763 xf86DrvMsg(b->scrnIndex, X_INFO, "I2C bus \"%s\" removed.\n", 764 b->BusName); 765 766 if (unalloc) 767 free(b); 768 } 769} 770 771/* I2C masters have to register themselves using this function. 772 * It will not allocate an I2CBusRec for you, instead you may enter 773 * a pointer to a statically allocated I2CBusRec or the (modified) 774 * result of xf86CreateI2CBusRec. Returns TRUE on success. 775 * 776 * At this point there won't be any traffic on the I2C bus. 777 */ 778 779Bool 780xf86I2CBusInit(I2CBusPtr b) 781{ 782 /* I2C buses must be identified by a unique scrnIndex 783 * and name. If scrnIndex is unspecified (a negative value), 784 * then the name must be unique throughout the server. 785 */ 786 787 if (b->BusName == NULL || xf86I2CFindBus(b->scrnIndex, b->BusName) != NULL) 788 return FALSE; 789 790 /* If the high level functions are not 791 * supplied, use the generic functions. 792 * In this case we need the low-level 793 * function. 794 */ 795 if (b->I2CWriteRead == NULL) { 796 b->I2CWriteRead = I2CWriteRead; 797 798 if (b->I2CPutBits == NULL || b->I2CGetBits == NULL) { 799 if (b->I2CPutByte == NULL || 800 b->I2CGetByte == NULL || 801 b->I2CAddress == NULL || 802 b->I2CStart == NULL || b->I2CStop == NULL) 803 return FALSE; 804 } 805 else { 806 b->I2CPutByte = I2CPutByte; 807 b->I2CGetByte = I2CGetByte; 808 b->I2CAddress = I2CAddress; 809 b->I2CStop = I2CStop; 810 b->I2CStart = I2CStart; 811 } 812 } 813 814 if (b->I2CUDelay == NULL) 815 b->I2CUDelay = I2CUDelay; 816 817 if (b->HoldTime < 2) 818 b->HoldTime = 5; 819 if (b->BitTimeout <= 0) 820 b->BitTimeout = b->HoldTime; 821 if (b->ByteTimeout <= 0) 822 b->ByteTimeout = b->HoldTime; 823 if (b->AcknTimeout <= 0) 824 b->AcknTimeout = b->HoldTime; 825 if (b->StartTimeout <= 0) 826 b->StartTimeout = b->HoldTime; 827 828 /* Put new bus on list. */ 829 830 b->NextBus = I2CBusList; 831 I2CBusList = b; 832 833 xf86DrvMsg(b->scrnIndex, X_INFO, "I2C bus \"%s\" initialized.\n", 834 b->BusName); 835 836 return TRUE; 837} 838 839I2CBusPtr 840xf86I2CFindBus(int scrnIndex, char *name) 841{ 842 I2CBusPtr p; 843 844 if (name != NULL) 845 for (p = I2CBusList; p != NULL; p = p->NextBus) 846 if (scrnIndex < 0 || p->scrnIndex == scrnIndex) 847 if (!strcmp(p->BusName, name)) 848 return p; 849 850 return NULL; 851} 852 853/* 854 * Return an array of I2CBusPtr's related to a screen. The caller is 855 * responsible for freeing the array. 856 */ 857int 858xf86I2CGetScreenBuses(int scrnIndex, I2CBusPtr ** pppI2CBus) 859{ 860 I2CBusPtr pI2CBus; 861 int n = 0; 862 863 if (pppI2CBus) 864 *pppI2CBus = NULL; 865 866 for (pI2CBus = I2CBusList; pI2CBus; pI2CBus = pI2CBus->NextBus) { 867 if ((pI2CBus->scrnIndex >= 0) && (pI2CBus->scrnIndex != scrnIndex)) 868 continue; 869 870 n++; 871 872 if (!pppI2CBus) 873 continue; 874 875 *pppI2CBus = xnfreallocarray(*pppI2CBus, n, sizeof(I2CBusPtr)); 876 (*pppI2CBus)[n - 1] = pI2CBus; 877 } 878 879 return n; 880} 881