Update interrupt handling and smbus access

The PD driver expects to access different chip addresses for different
ports and per address values can be different for commands. This
refactors the smbus and pd interfaces:

  * Add chip address parameter to smbus read/write commands.
  * Split poll_for_alert into block_for_interrupt and read_ara.
  * Support multiple ports in driver init.
  * Update Set Notification to send the command to multiple addresses.

BUG=b:319124783, b:320579079
TEST=Ran um_ppm and verified both ports are working

Change-Id: I898d9c118d5618605feab4481fd143e2cc08dc24
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/third_party/usb/um_ppm/+/5231622
Reviewed-by: Jameson Thies <jthies@google.com>
Tested-by: Abhishek Pandit-Subedi <abhishekpandit@google.com>
8 files changed
tree: a4f92dc878aa229f8f7286b7cd81a5ff687df46f
  1. include/
  2. test/
  3. .gitignore
  4. LICENSE
  5. main.c
  6. Makefile
  7. platform_usermode.c
  8. ppm_common.c
  9. ppm_common.h
  10. README.md
  11. rts5453.c
  12. rts5453.h
  13. rts5453_usermode.c
  14. smbus_usermode.c
  15. smbus_usermode.h
  16. um_ppm_chardev.c
  17. um_ppm_chardev.h
README.md

Usermode PPM implementation

Usermode UCSI PPM implementation for evaluation and testing usage. Try using this with the ucsi_um_test kernel driver.

Setup

For usermode implementations, we use libi2c and libgpiod to provide an smbus implementation. You will need the right libraries to build:

sudo apt-get install libi2c-dev libgpiod-dev

Architecture

┌─────────┐
│OPM      │
│kernel or│
│cli      │
└────┬────┘
     │
     │
     ▼          ┌───────────┐
 ┌────────┐     │ PD Driver │
 │        ├────►│           │
 │  PPM   │     ├───────────┤
 │        │     │           │
 └────────┘     │ I2C Driver│
                └───────────┘

The usermode ppm implementation consists of the PPM task, the PD driver and the I2C driver backing it. The OPM will either be a CLI (for locally triggering some functionality) or the ucsi_um_test kernel module.