2 * Copyright (C) 2012 Spreadtrum Communications Inc.
\r
7 #include <asm/arch/sprd_lcd.h>
\r
8 #include <asm/arch/sprd_i2c.h>
\r
11 #define SPRDFB_I2C_TRY_NUM (4)
\r
12 #define msleep(ms) udelay(ms*1000)
\r
14 uint16_t sprdfb_i2c_init(struct sprdfb_device *dev)
\r
20 uint16_t sprdfb_i2c_uninit(struct sprdfb_device *dev)
\r
27 /*write i2c, reg is 8 bit, val is 8 bit*/
\r
28 static int32_t sprdfb_i2c_write_8bits(uint8 addr, uint8_t reg, uint8_t val)
\r
36 FB_PRINT("sprdfb: [%s], sleep %d\n", __FUNCTION__, val);
\r
42 for (i = 0; i < SPRDFB_I2C_TRY_NUM; i++) {
\r
43 ret = I2C_WriteCmdArr(addr, buf_w, 2, TRUE);
\r
44 if (ret != ERR_I2C_NONE) {
\r
45 printf("sprdfb:[%s] write panel reg fai, ret : %d, I2C w addr: 0x%x, \n",
\r
46 __FUNCTION__, ret, addr);
\r
58 /*read i2c, reg is 8 bit, val is 8 bit*/
\r
59 static int32_t sprdfb_i2c_read_8bits(uint8 addr, uint8_t reg, uint8_t *val)
\r
64 for (i = 0; i < SPRDFB_I2C_TRY_NUM; i++) {
\r
65 ret = I2C_WriteCmd(addr, reg , TRUE);
\r
66 if (ret != ERR_I2C_NONE) {
\r
67 printf("sprdfb:[%s]: read i2c reg fail(1), ret: %d, I2C r addr: 0x%x \n",
\r
68 __FUNCTION__, ret, addr);
\r
78 for (i = 0; i < SPRDFB_I2C_TRY_NUM; i++) {
\r
79 ret = I2C_ReadCmd(addr, *val, TRUE);
\r
80 if (ret != ERR_I2C_NONE) {
\r
81 printf("sprdfb:[%s]: read i2c reg fail(2), ret: %d, I2C r addr: 0x%x \n",
\r
82 __FUNCTION__, ret, addr);
\r
95 /*write i2c, reg is 8 or 16 bit, val is 8 or 16bit*/
\r
96 static int32_t sprdfb_i2c_write_16bits(uint8 addr, uint16_t reg, BOOLEAN reg_is_8bit, uint16_t val, BOOLEAN val_is_8bit)
\r
98 uint8_t cmd[4] = { 0 };
\r
100 uint32_t cmd_num = 0;
\r
103 if ((reg_is_8bit && (0xff == reg))||(!reg_is_8bit &&(0xffff == reg))) {
\r
105 FB_PRINT("sprdfb: [%s], sleep %d\n", __FUNCTION__, val);
\r
109 if (!reg_is_8bit) {
\r
110 cmd[cmd_num++] = (uint8_t) ((reg >> 8) & 0xff);
\r
111 cmd[cmd_num++] = (uint8_t) (reg & 0xff);
\r
113 cmd[cmd_num++] = (uint8_t) reg;
\r
116 if (!val_is_8bit) {
\r
117 cmd[cmd_num++] = (uint8_t) ((val >> 8) & 0xff);
\r
118 cmd[cmd_num++] = (uint8_t) (val & 0xff);
\r
120 cmd[cmd_num++] = (uint8_t) val;
\r
123 for (i = 0; i < SPRDFB_I2C_TRY_NUM; i++) {
\r
124 ret = I2C_WriteCmdArr(addr, cmd, cmd_num, TRUE);
\r
125 if (ret != ERR_I2C_NONE) {
\r
126 printf("srpdfb [%s]: write sensor reg fai, ret : %d, I2C w addr: 0x%x, \n",
\r
127 __FUNCTION__, ret, addr);
\r
139 /*read i2c, reg is 8 or 16 bit, val is 8 or 16bit*/
\r
140 static int32_t sprdfb_i2c_read_16bits(uint8 addr, uint16_t reg, BOOLEAN reg_is_8bit, uint16_t *val, BOOLEAN val_is_8bit)
\r
143 uint8_t cmd[2] = { 0 };
\r
144 uint16_t w_cmd_num = 0;
\r
145 uint16_t r_cmd_num = 0;
\r
146 uint8_t buf_r[2] = { 0 };
\r
149 if (!reg_is_8bit) {
\r
150 cmd[w_cmd_num++] = (uint8_t) ((reg >> 8) & 0xff);
\r
151 cmd[w_cmd_num++] = (uint8_t) (reg & 0xff);
\r
153 cmd[w_cmd_num++] = (uint8_t) reg;
\r
156 if (!val_is_8bit) {
\r
162 for (i = 0; i < SPRDFB_I2C_TRY_NUM; i++) {
\r
163 ret = I2C_WriteCmdArr(addr, cmd, w_cmd_num, TRUE);
\r
164 if (ret != ERR_I2C_NONE) {
\r
165 printf("srpdfb [%s]: read panel reg fail(1), ret : %d, I2C w addr: 0x%x, \n",
\r
166 __FUNCTION__,ret, addr);
\r
171 *val = (r_cmd_num == 1) ? (uint16_t) buf_r[0]
\r
172 : (uint16_t) ((buf_r[0] << 8) + buf_r[1]);
\r
178 for (i = 0; i < SPRDFB_I2C_TRY_NUM; i++) {
\r
179 ret = I2C_ReadCmdArr(addr, buf_r, r_cmd_num, TRUE);
\r
180 if (ret != ERR_I2C_NONE) {
\r
181 printf("srpdfb [%s]: read panel reg fail(2), ret : %d, I2C w addr: 0x%x, \n",
\r
182 __FUNCTION__,ret, addr);
\r
187 *val = (r_cmd_num == 1) ? (uint16_t) buf_r[0]
\r
188 : (uint16_t) ((buf_r[0] << 8) + buf_r[1]);
\r
197 /*write i2c with burst mode*/
\r
198 static int32_t sprdfb_i2c_write_burst(uint8 addr, uint8_t* buf, int num)
\r
203 for (i = 0; i < SPRDFB_I2C_TRY_NUM; i++) {
\r
204 ret = I2C_WriteCmdArr(addr, buf, num, TRUE);
\r
205 if (ret != ERR_I2C_NONE) {
\r
206 printf("srpdfb [%s]: write i2c reg fail, ret : %d, I2C w addr: 0x%x, \n",
\r
207 __FUNCTION__, ret, addr);
\r
219 struct ops_i2c sprdfb_i2c_ops = {
\r
220 .i2c_write_8bits = sprdfb_i2c_write_8bits,
\r
221 .i2c_read_8bits = sprdfb_i2c_read_8bits,
\r
222 .i2c_write_16bits = sprdfb_i2c_write_16bits,
\r
223 .i2c_read_16bits = sprdfb_i2c_read_16bits,
\r
224 .i2c_write_burst = sprdfb_i2c_write_burst,
\r