static int rsb_init(void) { int ret; ret = rsb_init_controller(); if (ret) return ret; /* Start with 400 KHz to issue the I2C->RSB switch command. */ ret = rsb_set_bus_speed(SUNXI_OSC24M_CLK_IN_HZ, 400000); if (ret) return ret; /* * Initiate an I2C transaction to write 0x7c into register 0x3e, * switching the PMIC to RSB mode. */ ret = rsb_set_device_mode(0x7c3e00); if (ret) return ret; /* Now in RSB mode, switch to the recommended 3 MHz. */ ret = rsb_set_bus_speed(SUNXI_OSC24M_CLK_IN_HZ, 3000000); if (ret) return ret; /* Associate the 8-bit runtime address with the 12-bit bus address. */ return rsb_assign_runtime_address(AXP803_HW_ADDR, AXP803_RT_ADDR); }
int rsb_init(void) { struct sunxi_rsb_reg * const rsb = (struct sunxi_rsb_reg *)SUNXI_RSB_BASE; rsb_cfg_io(); /* Enable RSB and PIO clk, and de-assert their resets */ prcm_apb0_enable(PRCM_APB0_GATE_PIO | PRCM_APB0_GATE_RSB); writel(RSB_CTRL_SOFT_RST, &rsb->ctrl); rsb_set_clk(); return rsb_set_device_mode(); }
/* * The axp221 uses the p2wi bus, the axp223 is identical (for all registers * used sofar) but uses the rsb bus. These functions abstract this. */ static int pmic_bus_init(void) { #ifdef CONFIG_MACH_SUN6I p2wi_init(); return p2wi_change_to_p2wi_mode(AXP221_CHIP_ADDR, AXP221_CTRL_ADDR, AXP221_INIT_DATA); #else int ret; rsb_init(); ret = rsb_set_device_mode(AXP223_DEVICE_MODE_DATA); if (ret) return ret; return rsb_set_device_address(AXP223_DEVICE_ADDR, AXP223_RUNTIME_ADDR); #endif }