Changeset 3321
- Timestamp:
- 07/18/99 20:18:10 (14 years ago)
- Location:
- i2c/trunk/kernel
- Files:
-
- 4 modified
-
i2c-algo-bit.c (modified) (1 diff)
-
i2c-algo-pcf.c (modified) (1 diff)
-
i2c-core.c (modified) (9 diffs)
-
i2c.h (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
i2c/trunk/kernel/i2c-algo-bit.c
r3320 r3321 534 534 I2C_ALGO_BIT, 535 535 bit_xfer, 536 NULL, 536 537 NULL, /* slave_xmit */ 537 538 NULL, /* slave_recv */ -
i2c/trunk/kernel/i2c-algo-pcf.c
r3320 r3321 516 516 I2C_ALGO_PCF, 517 517 pcf_xfer, 518 NULL, 518 519 NULL, /* slave_xmit */ 519 520 NULL, /* slave_recv */ -
i2c/trunk/kernel/i2c-core.c
r3320 r3321 21 21 /* ------------------------------------------------------------------------- */ 22 22 23 /* With some changes from Kyösti Mälkki <kmalkki@cc.hut.fi> and even24 Frodo Looijaard <frodol@dds.nl> */23 /* With some changes from Kyösti Mälkki <kmalkki@cc.hut.fi>. 24 All SMBus-related things are written by Frodo Looijaard <frodol@dds.nl> */ 25 25 26 26 #include <linux/module.h> … … 345 345 int ret; 346 346 347 DEB(printk("master_xfer: %s with %d msgs.\n",adap->name,num)); 348 349 I2C_LOCK(adap); 350 ret = adap->algo->master_xfer(adap,msgs,num); 351 I2C_UNLOCK(adap); 352 353 return ret; 347 if (adap->algo->master_xfer) { 348 DEB(printk("master_xfer: %s with %d msgs.\n",adap->name,num)); 349 350 I2C_LOCK(adap); 351 ret = adap->algo->master_xfer(adap,msgs,num); 352 I2C_UNLOCK(adap); 353 354 return ret; 355 } else { 356 printk("I2C adapter %04x: I2C level transfers not supported\n", 357 adap->id); 358 return 0; 359 } 354 360 } 355 361 … … 359 365 struct i2c_adapter *adap=client->adapter; 360 366 struct i2c_msg msg; 361 msg.addr = client->addr; 362 msg.flags = client->flags & ( I2C_M_TEN|I2C_M_TENMASK ); 363 msg.len = count; 364 (const char *)msg.buf = buf; 365 366 DEB(printk("master_send: writing %d bytes on %s.\n", 367 count,client->adapter->name)); 368 369 I2C_LOCK(adap); 370 ret = adap->algo->master_xfer(adap,&msg,1); 371 I2C_UNLOCK(adap); 372 373 /* if everything went ok (i.e. 1 msg transmitted), return #bytes 374 * transmitted, else error code. 375 */ 376 return (ret == 1 )? count : ret; 367 368 if (client->adapter->algo->master_xfer) { 369 msg.addr = client->addr; 370 msg.flags = client->flags & ( I2C_M_TEN|I2C_M_TENMASK ); 371 msg.len = count; 372 (const char *)msg.buf = buf; 373 374 DEB(printk("master_send: writing %d bytes on %s.\n", 375 count,client->adapter->name)); 376 377 I2C_LOCK(adap); 378 ret = adap->algo->master_xfer(adap,&msg,1); 379 I2C_UNLOCK(adap); 380 381 /* if everything went ok (i.e. 1 msg transmitted), return #bytes 382 * transmitted, else error code. 383 */ 384 return (ret == 1 )? count : ret; 385 } else { 386 printk("I2C adapter %04x: I2C level transfers not supported\n", 387 client->adapter->id); 388 return 0; 389 } 377 390 } 378 391 … … 385 398 struct i2c_msg msg; 386 399 387 c = (char*)kmalloc(sizeof(char)*(count+1),GFP_KERNEL); 388 if (0 == c) 389 return -ENOMEM; 390 391 msg.addr = client->addr; 392 msg.flags = client->flags & ( I2C_M_TEN|I2C_M_TENMASK ); 393 msg.len = count+1; 394 (const char *)msg.buf = c; 400 if (client->adapter->algo->master_xfer) { 401 c = (char*)kmalloc(sizeof(char)*(count+1),GFP_KERNEL); 402 if (0 == c) 403 return -ENOMEM; 404 405 msg.addr = client->addr; 406 msg.flags = client->flags & ( I2C_M_TEN|I2C_M_TENMASK ); 407 msg.len = count+1; 408 (const char *)msg.buf = c; 409 410 c[0] = subadress; 411 memcpy(&c[1], buf, sizeof(char)*count); 395 412 396 c[0] = subadress; 397 memcpy(&c[1], buf, sizeof(char)*count); 398 399 DEB(printk("master_send_subadress: writing %d bytes on %s. (sa:0x%02x)\n", 400 count,client->adapter->name,subadress)); 401 402 I2C_LOCK(adap); 403 ret = adap->algo->master_xfer(adap,&msg,1); 404 I2C_UNLOCK(adap); 405 406 /* if everything went ok (i.e. 1 msg transmitted), return #bytes 407 * transmitted, else error code. 408 */ 413 DEB(printk("master_send_subadress: writing %d bytes on %s. (sa:0x%02x)\n", 414 count,client->adapter->name,subadress)); 415 416 I2C_LOCK(adap); 417 ret = adap->algo->master_xfer(adap,&msg,1); 418 I2C_UNLOCK(adap); 419 420 /* if everything went ok (i.e. 1 msg transmitted), return #bytes 421 * transmitted, else error code. 422 */ 409 423 410 kfree(c); 411 412 return (ret == 1 )? count : ret; 424 kfree(c); 425 426 return (ret == 1 )? count : ret; 427 } else { 428 printk("I2C adapter %04x: I2C level transfers not supported\n", 429 client->adapter->id); 430 return 0; 431 } 413 432 } 414 433 … … 420 439 struct i2c_msg msg[2]; 421 440 422 msg[0].addr = client->addr; 423 msg[0].flags = client->flags & ( I2C_M_TEN|I2C_M_TENMASK ); 424 msg[0].len = 1; 425 (const char*)msg[0].buf = (const char*)&subadress; 426 427 msg[1].addr = client->addr; 428 msg[1].flags = client->flags & ( I2C_M_TEN|I2C_M_TENMASK ); 429 msg[1].flags |= I2C_M_RD; 430 msg[1].len = count; 431 (const char*)msg[1].buf = (const char*)buf; 432 433 DEB(printk("master_recv_subadress: reading %d bytes from subadress %d on %s.\n", 434 count,subadress,client->adapter->name)); 435 436 I2C_LOCK(adap); 437 ret = adap->algo->master_xfer(adap,msg,2); 438 I2C_UNLOCK(adap); 439 440 /* if everything went ok (i.e. 1 msg transmitted), 441 return 0, else return error code. 442 */ 443 return (ret == 1 ) ? 0 : ret; 441 if (client->adapter->algo->master_xfer) { 442 msg[0].addr = client->addr; 443 msg[0].flags = client->flags & ( I2C_M_TEN|I2C_M_TENMASK ); 444 msg[0].len = 1; 445 (const char*)msg[0].buf = (const char*)&subadress; 446 447 msg[1].addr = client->addr; 448 msg[1].flags = client->flags & ( I2C_M_TEN|I2C_M_TENMASK ); 449 msg[1].flags |= I2C_M_RD; 450 msg[1].len = count; 451 (const char*)msg[1].buf = (const char*)buf; 452 453 DEB(printk("master_recv_subadress: reading %d bytes from subadress %d on %s.\n", 454 count,subadress,client->adapter->name)); 455 456 I2C_LOCK(adap); 457 ret = adap->algo->master_xfer(adap,msg,2); 458 I2C_UNLOCK(adap); 459 460 /* if everything went ok (i.e. 1 msg transmitted), 461 return 0, else return error code. 462 */ 463 return (ret == 1 ) ? 0 : ret; 464 } else { 465 printk("I2C adapter %04x: I2C level transfers not supported\n", 466 client->adapter->id); 467 return 0; 468 } 444 469 } 445 470 … … 451 476 struct i2c_msg msg; 452 477 int ret; 453 msg.addr = client->addr; 454 msg.flags = client->flags & ( I2C_M_TEN|I2C_M_TENMASK ); 455 msg.flags |= I2C_M_RD; 456 msg.len = count; 457 msg.buf = buf; 458 459 DEB(printk("master_recv: reading %d bytes on %s.\n", 460 count,client->adapter->name)); 461 462 I2C_LOCK(adap); 463 ret = adap->algo->master_xfer(adap,&msg,1); 464 I2C_UNLOCK(adap); 465 466 DEB(printk("master_recv: return:%d (count:%d, addr:0x%02x)\n", 467 ret, count, client->addr)); 468 469 /* if everything went ok (i.e. 1 msg transmitted), return #bytes 470 * transmitted, else error code. 471 */ 472 return (ret == 1 )? count : ret; 478 if (client->adapter->algo->master_xfer) { 479 msg.addr = client->addr; 480 msg.flags = client->flags & ( I2C_M_TEN|I2C_M_TENMASK ); 481 msg.flags |= I2C_M_RD; 482 msg.len = count; 483 msg.buf = buf; 484 485 DEB(printk("master_recv: reading %d bytes on %s.\n", 486 count,client->adapter->name)); 487 488 I2C_LOCK(adap); 489 ret = adap->algo->master_xfer(adap,&msg,1); 490 I2C_UNLOCK(adap); 491 492 DEB(printk("master_recv: return:%d (count:%d, addr:0x%02x)\n", 493 ret, count, client->addr)); 494 495 /* if everything went ok (i.e. 1 msg transmitted), return #bytes 496 * transmitted, else error code. 497 */ 498 return (ret == 1 )? count : ret; 499 } else { 500 printk("I2C adapter %04x: I2C level transfers not supported\n", 501 client->adapter->id); 502 return 0; 503 } 473 504 } 474 505 … … 495 526 } 496 527 528 497 529 int i2c_probe(struct i2c_client *client, int low_addr, int hi_addr) 498 530 { 499 531 int i; 500 532 struct i2c_msg msg; 501 msg.flags=client->flags & (I2C_M_TENMASK | I2C_M_TEN ); 502 msg.buf = NULL; 503 msg.len = 0; 504 I2C_LOCK(client->adapter); 505 for (i = low_addr; i <= hi_addr; i++) { 506 msg.addr=i; 507 /* TODO: implement a control statement in the algo layer 508 * that does address lookup only. 509 */ 510 if (1 == client->adapter-> 511 algo->master_xfer(client->adapter,&msg,1)) 512 break; 513 } 514 I2C_UNLOCK(client->adapter); 515 return (i <= hi_addr) ? (client->addr=i) : -1; 533 if (client->adapter->algo->master_xfer) { 534 msg.flags=client->flags & (I2C_M_TENMASK | I2C_M_TEN ); 535 msg.buf = NULL; 536 msg.len = 0; 537 I2C_LOCK(client->adapter); 538 for (i = low_addr; i <= hi_addr; i++) { 539 msg.addr=i; 540 /* TODO: implement a control statement in the algo layer 541 * that does address lookup only. 542 */ 543 if (1 == client->adapter-> 544 algo->master_xfer(client->adapter,&msg,1)) 545 break; 546 } 547 I2C_UNLOCK(client->adapter); 548 return (i <= hi_addr) ? (client->addr=i) : -1; 549 } else { 550 printk("I2C adapter %04x: I2C level transfers not supported\n", 551 client->adapter->id); 552 return 0; 553 } 516 554 } 517 555 … … 527 565 return -1; 528 566 } 567 568 /* The SMBus parts */ 569 570 extern s32 i2c_smbus_write_quick(struct i2c_adapter * adapter, u8 addr, 571 u8 value) 572 { 573 return i2c_smbus_xfer(adapter,addr,value,0,I2C_SMBUS_QUICK,NULL); 574 } 575 576 extern s32 i2c_smbus_read_byte(struct i2c_adapter * adapter,u8 addr) 577 { 578 union i2c_smbus_data data; 579 if (i2c_smbus_xfer(adapter,addr,I2C_SMBUS_READ,0,I2C_SMBUS_BYTE, 580 &data)) 581 return -1; 582 else 583 return 0x0FF & data.byte; 584 } 585 586 extern s32 i2c_smbus_write_byte(struct i2c_adapter * adapter, u8 addr, 587 u8 value) 588 { 589 return i2c_smbus_xfer(adapter,addr,I2C_SMBUS_WRITE,value, 590 I2C_SMBUS_BYTE,NULL); 591 } 592 593 extern s32 i2c_smbus_read_byte_data(struct i2c_adapter * adapter, 594 u8 addr, u8 command) 595 { 596 union i2c_smbus_data data; 597 if (i2c_smbus_xfer(adapter,addr,I2C_SMBUS_READ,command, 598 I2C_SMBUS_BYTE_DATA,&data)) 599 return -1; 600 else 601 return 0x0FF & data.byte; 602 } 603 604 extern s32 i2c_smbus_write_byte_data(struct i2c_adapter * adapter, 605 u8 addr, u8 command, u8 value) 606 { 607 union i2c_smbus_data data; 608 data.byte = value; 609 return i2c_smbus_xfer(adapter,addr,I2C_SMBUS_WRITE,command, 610 I2C_SMBUS_BYTE_DATA,&data); 611 } 612 613 extern s32 i2c_smbus_read_word_data(struct i2c_adapter * adapter, 614 u8 addr, u8 command) 615 { 616 union i2c_smbus_data data; 617 if (i2c_smbus_xfer(adapter,addr,I2C_SMBUS_READ,command, 618 I2C_SMBUS_WORD_DATA, &data)) 619 return -1; 620 else 621 return 0x0FFFF & data.word; 622 } 623 624 extern s32 i2c_smbus_write_word_data(struct i2c_adapter * adapter, 625 u8 addr, u8 command, u16 value) 626 { 627 union i2c_smbus_data data; 628 data.word = value; 629 return i2c_smbus_xfer(adapter,addr,I2C_SMBUS_WRITE,command, 630 I2C_SMBUS_WORD_DATA,&data); 631 } 632 633 extern s32 i2c_smbus_process_call(struct i2c_adapter * adapter, 634 u8 addr, u8 command, u16 value) 635 { 636 union i2c_smbus_data data; 637 data.word = value; 638 if (i2c_smbus_xfer(adapter,addr,I2C_SMBUS_WRITE,command, 639 I2C_SMBUS_PROC_CALL, &data)) 640 return -1; 641 else 642 return 0x0FFFF & data.word; 643 } 644 645 /* Returns the number of read bytes */ 646 extern s32 i2c_smbus_read_block_data(struct i2c_adapter * adapter, 647 u8 addr, u8 command, u8 *values) 648 { 649 union i2c_smbus_data data; 650 int i; 651 if (i2c_smbus_xfer(adapter,addr,I2C_SMBUS_READ,command, 652 I2C_SMBUS_BLOCK_DATA,&data)) 653 return -1; 654 else { 655 for (i = 1; i <= data.block[0]; i++) 656 values[i-1] = data.block[i]; 657 return data.block[0]; 658 } 659 } 660 661 extern s32 i2c_smbus_write_block_data(struct i2c_adapter * adapter, 662 u8 addr, u8 command, u8 length, 663 u8 *values) 664 { 665 union i2c_smbus_data data; 666 int i; 667 if (length > 32) 668 length = 32; 669 for (i = 1; i <= length; i++) 670 data.block[i] = values[i-1]; 671 data.block[0] = length; 672 return i2c_smbus_xfer(adapter,addr,I2C_SMBUS_WRITE,command, 673 I2C_SMBUS_BLOCK_DATA,&data); 674 } 675 676 /* Simulate a SMBus command using the i2c protocol 677 No checking of parameters is done! */ 678 static s32 i2c_smbus_xfer_emulated(struct i2c_adapter * adapter, u8 addr, 679 char read_write, u8 command, int size, 680 union i2c_smbus_data * data) 681 { 682 /* So we need to generate a series of msgs. In the case of writing, we 683 need to use only one message; when reading, we need two. We initialize 684 most things with sane defaults, to keep the code below somewhat 685 simpler. */ 686 unsigned char msgbuf0[33]; 687 unsigned char msgbuf1[33]; 688 int num = read_write == I2C_SMBUS_READ?2:1; 689 struct i2c_msg msg[2] = { { addr, 0, 1, msgbuf0 }, 690 { addr, I2C_M_RD, 0, msgbuf1 } 691 }; 692 int i; 693 694 msgbuf0[0] = command; 695 switch(size) { 696 case I2C_SMBUS_QUICK: 697 msg[0].len = 0; 698 num = 1; /* Special case: The read/write field is used 699 as data */ 700 break; 701 case I2C_SMBUS_BYTE: 702 if (read_write == I2C_SMBUS_READ) { 703 /* Special case: only a read! */ 704 msg[0].flags = I2C_M_RD; 705 num = 1; 706 } 707 break; 708 case I2C_SMBUS_BYTE_DATA: 709 if (read_write == I2C_SMBUS_READ) 710 msg[1].len = 1; 711 else { 712 msg[0].len = 2; 713 msgbuf0[1] = data->byte; 714 } 715 break; 716 case I2C_SMBUS_WORD_DATA: 717 if (read_write == I2C_SMBUS_READ) 718 msg[1].len = 2; 719 else { 720 msg[0].len=3; 721 msgbuf0[1] = data->word & 0xff; 722 msgbuf0[2] = (data->word >> 8) & 0xff; 723 } 724 break; 725 case I2C_SMBUS_PROC_CALL: 726 num = 2; /* Special case */ 727 msg[0].len = 3; 728 msg[1].len = 2; 729 msgbuf0[1] = data->word & 0xff; 730 msgbuf0[2] = (data->word >> 8) & 0xff; 731 break; 732 case I2C_SMBUS_BLOCK_DATA: 733 if (read_write == I2C_SMBUS_READ) { 734 printk("smbus.o: Block read not supported under " 735 "I2C emulation!\n"); 736 return -1; 737 } else { 738 msg[1].len = data->block[0] + 1; 739 if (msg[1].len > 32) { 740 printk("smbus.o: smbus_access called with " 741 "invalid block write size (%d)\n", 742 msg[1].len); 743 return -1; 744 } 745 for (i = 1; i <= msg[1].len; i++) 746 msgbuf0[i] = data->block[i]; 747 } 748 break; 749 default: 750 printk("smbus.o: smbus_access called with invalid size (%d)\n", 751 size); 752 return -1; 753 } 754 755 if (i2c_transfer(adapter, msg, num) < 0) 756 return -1; 757 758 if (read_write == I2C_SMBUS_READ) 759 switch(size) { 760 case I2C_SMBUS_BYTE: 761 data->byte = msgbuf0[0]; 762 break; 763 case I2C_SMBUS_BYTE_DATA: 764 data->byte = msgbuf1[0]; 765 break; 766 case I2C_SMBUS_WORD_DATA: 767 case I2C_SMBUS_PROC_CALL: 768 data->word = msgbuf1[0] | (msgbuf1[1] << 8); 769 break; 770 } 771 return 0; 772 } 773 774 775 s32 i2c_smbus_xfer(struct i2c_adapter * adapter, u8 addr, char read_write, 776 u8 command, int size, union i2c_smbus_data * data) 777 { 778 s32 res; 779 if (adapter->algo->smbus_xfer) { 780 down(&adapter->lock); 781 res = adapter->algo->smbus_xfer(adapter,addr,read_write, 782 command,size,data); 783 up(&adapter->lock); 784 } else 785 res = i2c_smbus_xfer_emulated(adapter,addr,read_write, 786 command,size,data); 787 return res; 788 } 789 529 790 530 791 int __init i2c_init(void) … … 633 894 EXPORT_SYMBOL(i2c_transfer); 634 895 896 EXPORT_SYMBOL(i2c_smbus_xfer); 897 EXPORT_SYMBOL(i2c_smbus_write_quick); 898 EXPORT_SYMBOL(i2c_smbus_read_byte); 899 EXPORT_SYMBOL(i2c_smbus_write_byte); 900 EXPORT_SYMBOL(i2c_smbus_read_byte_data); 901 EXPORT_SYMBOL(i2c_smbus_write_byte_data); 902 EXPORT_SYMBOL(i2c_smbus_read_word_data); 903 EXPORT_SYMBOL(i2c_smbus_write_word_data); 904 EXPORT_SYMBOL(i2c_smbus_process_call); 905 EXPORT_SYMBOL(i2c_smbus_read_block_data); 906 EXPORT_SYMBOL(i2c_smbus_write_block_data); 907 635 908 int init_module(void) 636 909 { -
i2c/trunk/kernel/i2c.h
r3320 r3321 48 48 struct i2c_client; 49 49 struct i2c_driver; 50 union i2c_smbus_data; 50 51 51 52 … … 96 97 char *buf; /* pointer to msg data */ 97 98 }; 99 100 101 /* This is the very generalized SMBus access routine. You probably do not 102 want to use this, though; one of the functions below may be much easier, 103 and probably just as fast. 104 Note that we use i2c_adapter here, because you do not need a specific 105 smbus adapter to call this function. */ 106 extern s32 i2c_smbus_xfer (struct i2c_adapter * adapter, u8 addr, 107 char read_write, u8 command, int size, 108 union i2c_smbus_data * data); 109 110 /* Now follow the 'nice' access routines. These also document the calling 111 conventions of smbus_access. */ 112 113 extern s32 i2c_smbus_write_quick(struct i2c_adapter * adapter, u8 addr, 114 u8 value); 115 extern s32 i2c_smbus_read_byte(struct i2c_adapter * adapter,u8 addr); 116 extern s32 i2c_smbus_write_byte(struct i2c_adapter * adapter, u8 addr, 117 u8 value); 118 extern s32 i2c_smbus_read_byte_data(struct i2c_adapter * adapter, 119 u8 addr, u8 command); 120 extern s32 i2c_smbus_write_byte_data(struct i2c_adapter * adapter, 121 u8 addr, u8 command, u8 value); 122 extern s32 i2c_smbus_read_word_data(struct i2c_adapter * adapter, 123 u8 addr, u8 command); 124 extern s32 i2c_smbus_write_word_data(struct i2c_adapter * adapter, 125 u8 addr, u8 command, u16 value); 126 extern s32 i2c_smbus_process_call(struct i2c_adapter * adapter, 127 u8 addr, u8 command, u16 value); 128 /* Returns the number of read bytes */ 129 extern s32 i2c_smbus_read_block_data(struct i2c_adapter * adapter, 130 u8 addr, u8 command, u8 *values); 131 extern s32 i2c_smbus_write_block_data(struct i2c_adapter * adapter, 132 u8 addr, u8 command, u8 length, 133 u8 *values); 134 98 135 99 136 /* … … 171 208 char name[32]; /* textual description */ 172 209 unsigned int id; 210 211 /* If a adapter algorithm can't to I2C-level access, set master_xfer 212 to NULL. If an adapter algorithm can do SMBus access, set 213 smbus_xfer. If set to NULL, the SMBus protocol is simulated 214 using common I2C messages */ 173 215 int (*master_xfer)(struct i2c_adapter *adap,struct i2c_msg msgs[], 174 216 int num); 217 int (*smbus_xfer) (struct i2c_adapter *adap, u8 addr, char read_write, 218 u8 command, int size, union i2c_smbus_data * data); 175 219 176 220 /* --- these optional/future use for some adapter types.*/ … … 263 307 264 308 #endif /* __KERNEL__ */ 309 310 /* 311 * Data for SMBus Messages 312 */ 313 union i2c_smbus_data { 314 __u8 byte; 315 __u16 word; 316 __u8 block[33]; /* block[0] is used for length */ 317 }; 318 319 /* smbus_access read or write markers */ 320 #define I2C_SMBUS_READ 1 321 #define I2C_SMBUS_WRITE 0 322 323 /* SMBus transaction types (size parameter in the above functions) 324 Note: these no longer correspond to the (arbitrary) PIIX4 internal codes! */ 325 #define I2C_SMBUS_QUICK 0 326 #define I2C_SMBUS_BYTE 1 327 #define I2C_SMBUS_BYTE_DATA 2 328 #define I2C_SMBUS_WORD_DATA 3 329 #define I2C_SMBUS_PROC_CALL 4 330 #define I2C_SMBUS_BLOCK_DATA 5 265 331 266 332
