26 #define WW_RING_BASE_ADDR 0x32
29 #define LP55231_ENGCTRL1_REG 0x00
30 #define LP55231_ENGCTRL2_REG 0x01
31 #define LP55231_D1_CRT_CTRL_REG 0x26
32 #define LP55231_MISC_REG 0x36
33 #define LP55231_VARIABLE_REG 0x3c
34 #define LP55231_RESET_REG 0x3d
35 #define LP55231_ENG1_PROG_START 0x4c
36 #define LP55231_PROG_PAGE_REG 0x4f
37 #define LP55231_PROG_BASE_REG 0x50
40 #define LP55231_CRT_CTRL_DEFAULT 0xaf
43 #define LP55231_ENGCTRL1_CHIP_EN 0x40
44 #define LP55231_ENGCTRL1_ALL_ENG_GO 0x2a
47 #define LP55231_ENGCTRL2_ALL_DISABLE 0
48 #define LP55231_ENGCTRL2_ALL_LOAD 0x15
49 #define LP55231_ENGCTRL2_ALL_RUN 0x2a
52 #define LP55231_MISC_AUTOINCR (1 << 6)
53 #define LP55231_MISC_PUMP_1X (1 << 3)
54 #define LP55231_MISC_INT_CLK (3 << 0)
60 #define LP55231_VARIABLE_COOKIE 0xb4
63 #define LP55231_RESET_VALUE 0xff
69 #define LP55231_PROG_PAGE_SIZE 32
70 #define LP55231_PROG_PAGES 6
71 #define LP55231_MAX_PROG_SIZE (LP55231_PROG_PAGE_SIZE * LP55231_PROG_PAGES)
104 int seg_count,
int reset)
106 int rv, max_attempts = 2;
108 while (max_attempts--) {
119 "%s: dev %#x, reg %#x, %s transaction error.\n",
120 __func__, segs->
slave, segs->
buf[0],
121 seg_count == 1 ?
"write" :
"read");
189 "WW_RING: no controller found at address %#2.2x\n",
219 "%s: program of size %#x does not fit at addr %#x\n",
220 __func__,
count, load_addr);
227 if (segment_size >
count)
228 segment_size =
count;
232 program, segment_size);
234 count -= segment_size;
235 program += segment_size;
302 for (i = 0; i < 9; i++) {
306 "%s: read %#2.2x from register %#x\n", __func__,
368 #define LP55231_I2C_BASE_ADDR 0x32
392 "WW_RING: will keep going anyway\n");
395 "WW_RING: LED ring not present\n");
void * memcpy(void *dest, const void *src, size_t n)
static const u32 pattern[8]
#define printk(level,...)
static int i2c_transfer(unsigned int bus, struct i2c_msg *segments, int count)
#define BIOS_INFO
BIOS_INFO - Expected events.
#define BIOS_WARNING
BIOS_WARNING - Bad configuration.
static const uintptr_t i2c_bus[]
const uint8_t * program_text
uint8_t engine_start_addr[LP55231_NUM_OF_ENGINES]
uint8_t data_buffer[LP55231_PROG_PAGE_SIZE+1]
enum display_pattern led_pattern
const TiLp55231Program * programs[WW_RING_NUM_LED_CONTROLLERS]
struct i2c_msg - an I2C transaction segment beginning with START @addr: Slave address,...
static void __noreturn reset(void)
#define LP55231_D1_CRT_CTRL_REG
#define LP55231_ENG1_PROG_START
static void ledc_write_program(TiLp55231 *ledc, uint8_t load_addr, const uint8_t *program, unsigned int count)
#define LP55231_PROG_PAGE_REG
static int ledc_write(TiLp55231 *ledc, uint8_t start_addr, const uint8_t *data, unsigned int count)
#define LP55231_RESET_VALUE
#define LP55231_RESET_REG
#define LP55231_ENGCTRL2_ALL_RUN
int ww_ring_display_pattern(unsigned int i2c_bus, enum display_pattern pattern)
static void ledc_write_engctrl2(TiLp55231 *ledc, uint8_t value)
static int ledc_init_validate(TiLp55231 *ledc)
static void ledc_run_program(TiLp55231 *ledc, const TiLp55231Program *program_desc)
#define LP55231_CRT_CTRL_DEFAULT
#define LP55231_VARIABLE_COOKIE
#define LP55231_ENGCTRL2_ALL_DISABLE
static TiLp55231 lp55231s[WW_RING_NUM_LED_CONTROLLERS]
#define LP55231_I2C_BASE_ADDR
#define LP55231_ENGCTRL2_ALL_LOAD
#define LP55231_ENGCTRL1_CHIP_EN
#define LP55231_MISC_PUMP_1X
#define LP55231_VARIABLE_REG
#define LP55231_PROG_BASE_REG
#define LP55231_ENGCTRL1_REG
static int ledc_read(TiLp55231 *ledc, uint8_t addr, uint8_t *data)
#define LP55231_MAX_PROG_SIZE
#define LP55231_ENGCTRL1_ALL_ENG_GO
static int ledc_reset(TiLp55231 *ledc)
#define LP55231_MISC_INT_CLK
static void ww_ring_init(unsigned int i2c_bus)
#define LP55231_MISC_AUTOINCR
#define LP55231_ENGCTRL2_REG
#define LP55231_PROG_PAGE_SIZE
static int ledc_transfer(TiLp55231 *ledc, struct i2c_msg *segs, int seg_count, int reset)
const WwRingStateProg wwr_state_programs[]
#define WW_RING_NUM_LED_CONTROLLERS