| | 515 | |
| | 516 | #if ALGO_BIT_COMPATIBILITY |
| | 517 | #include "i2c-algo-bit.h" |
| | 518 | |
| | 519 | static inline void _hw_setscl(struct i2c_algo_bit_data *old, int state) |
| | 520 | { |
| | 521 | old->setscl(old->data, state & _HS_SCL); |
| | 522 | } |
| | 523 | |
| | 524 | static inline void _hw_setsda(struct i2c_algo_bit_data *old, int state) |
| | 525 | { |
| | 526 | old->setsda(old->data, state & _HS_SDA); |
| | 527 | } |
| | 528 | |
| | 529 | static inline int _hw_getscl(struct i2c_algo_bit_data *old) |
| | 530 | { |
| | 531 | return old->getscl(old->data); |
| | 532 | } |
| | 533 | |
| | 534 | static inline int _hw_getsda(struct i2c_algo_bit_data *old) |
| | 535 | { |
| | 536 | return old->getsda(old->data); |
| | 537 | } |
| | 538 | |
| | 539 | static inline void _hw_timer(int dt) |
| | 540 | { |
| | 541 | udelay(dt); |
| | 542 | } |
| | 543 | |
| | 544 | #define INCLUDE_BITHS_INLINES |
| | 545 | #include "i2c-algo-biths.h" |
| | 546 | static void _ba_setscl(struct i2c_algo_biths_data *adap) |
| | 547 | { |
| | 548 | adap->state = adap->flags; |
| | 549 | i2c_bit_setscl(adap); |
| | 550 | } |
| | 551 | static void _ba_setsda(struct i2c_algo_biths_data *adap) |
| | 552 | { |
| | 553 | adap->state = adap->flags; |
| | 554 | i2c_bit_setsda(adap); |
| | 555 | } |
| | 556 | static int _ba_getscl(struct i2c_algo_biths_data *adap) |
| | 557 | { |
| | 558 | return i2c_bit_getscl(adap); |
| | 559 | } |
| | 560 | static int _ba_getsda(struct i2c_algo_biths_data *adap) |
| | 561 | { |
| | 562 | return i2c_bit_getsda(adap); |
| | 563 | } |
| | 564 | |
| | 565 | static struct i2c_algo_biths_data _ba_template = { |
| | 566 | setsda: _ba_setsda, |
| | 567 | setscl: _ba_setscl, |
| | 568 | getsda: _ba_getsda, |
| | 569 | getscl: _ba_getscl, |
| | 570 | }; |
| | 571 | |
| | 572 | /* |
| | 573 | * registering functions to load algorithms at runtime |
| | 574 | */ |
| | 575 | int i2c_bit_add_bus(struct i2c_adapter *i2c_adap) |
| | 576 | { |
| | 577 | int i; |
| | 578 | struct i2c_algo_bit_data *old_adap = i2c_adap->algo_data; |
| | 579 | struct i2c_algo_biths_data *adap; |
| | 580 | |
| | 581 | adap = kmalloc(sizeof(struct i2c_algo_biths_data), GFP_KERNEL); |
| | 582 | if (adap==NULL) |
| | 583 | return -ENOMEM; |
| | 584 | |
| | 585 | memcpy(adap, &_ba_template, sizeof(struct i2c_algo_biths_data)); |
| | 586 | adap->data = old_adap; |
| | 587 | adap->udelay = (old_adap->udelay+1)>>1; /* 1/4 vs 1/2 cycle */ |
| | 588 | adap->timeout = old_adap->timeout; |
| | 589 | i2c_adap->algo_data = adap; |
| | 590 | |
| | 591 | return i2c_biths_add_bus(i2c_adap); |
| | 592 | } |
| | 593 | |
| | 594 | |
| | 595 | int i2c_bit_del_bus(struct i2c_adapter *i2c_adap) |
| | 596 | { |
| | 597 | int res; |
| | 598 | |
| | 599 | if ((res = i2c_biths_del_bus(i2c_adap)) < 0) |
| | 600 | return res; |
| | 601 | |
| | 602 | kfree(i2c_adap->algo_data); |
| | 603 | return 0; |
| | 604 | } |
| | 605 | |
| | 606 | EXPORT_SYMBOL(i2c_bit_add_bus); |
| | 607 | EXPORT_SYMBOL(i2c_bit_del_bus); |
| | 608 | |
| | 609 | #endif |
| | 610 | |