import PULS_20160108
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / drivers / misc / mediatek / hdmi / Sii8338 / si_cra.c
CommitLineData
6fa3eb70
S
1#include "si_common.h"
2#include "si_cra.h"
3#include "si_cra_internal.h"
4#include "si_cra_cfg.h"
5#include "sii_hal.h"
6#include "hdmi_cust.h"
7#include "si_mhl_tx_api.h"
8
9#if defined(__KERNEL__)
10extern uint8_t I2C_ReadByte(uint8_t deviceID, uint8_t offset);
11extern void I2C_WriteByte(uint8_t deviceID, uint8_t offset, uint8_t value);
12#endif
13
14#if 0 ///SII_I2C_ADDR == (0x76)
15static prefuint_t l_pageInstance[SII_CRA_DEVICE_PAGE_COUNT] = { 1 };
16#else ///default is 0x72
17static prefuint_t l_pageInstance[SII_CRA_DEVICE_PAGE_COUNT] = { 0 };
18#endif
19extern pageConfig_t g_addrDescriptor[SII_CRA_MAX_DEVICE_INSTANCES][SII_CRA_DEVICE_PAGE_COUNT];
20extern SiiReg_t g_siiRegPageBaseReassign[];
21extern SiiReg_t g_siiRegPageBaseRegs[SII_CRA_DEVICE_PAGE_COUNT];
22CraInstanceData_t craInstance = {
23 0,
24 0,
25 SII_SUCCESS,
26 0,
27};
28
29#if !defined(__KERNEL__)
30static SiiResultCodes_t CraReadBlockI2c(prefuint_t busIndex, uint8_t deviceId, uint8_t regAddr,
31 uint8_t *pBuffer, uint16_t count)
32{
33 SiiResultCodes_t status = SII_ERR_FAIL;
34 do {
35 if (I2cSendStart(busIndex, deviceId, &regAddr, 1, false) != PLATFORM_SUCCESS) {
36 break;
37 }
38 if (I2cReceiveStart(busIndex, deviceId, pBuffer, count, true) != PLATFORM_SUCCESS) {
39 break;
40 }
41 status = SII_SUCCESS;
42 } while (0);
43 return (status);
44}
45
46static SiiResultCodes_t CraWriteBlockI2c(prefuint_t busIndex, uint8_t deviceId, uint8_t regAddr,
47 const uint8_t *pBuffer, uint16_t count)
48{
49 SiiResultCodes_t status = SII_ERR_FAIL;
50 do {
51 if (I2cSendStart(busIndex, deviceId, &regAddr, 1, false) != PLATFORM_SUCCESS) {
52 break;
53 }
54 if (I2cSendContinue(busIndex, pBuffer, count, true) != PLATFORM_SUCCESS) {
55 break;
56 }
57 status = SII_SUCCESS;
58 } while (0);
59 return (status);
60}
61#endif
62bool_t SiiCraInitialize(void)
63{
64 prefuint_t i, index;
65 craInstance.lastResultCode = RESULT_CRA_SUCCESS;
66
67 for (i = 0; i < SII_CRA_DEVICE_PAGE_COUNT; i++) {
68#if 1
69 if( get_hdmi_i2c_addr()== 0x76)
70 l_pageInstance[i] = 1;
71 else
72 l_pageInstance[i] = 0;
73#else
74 #if SII_I2C_ADDR == (0x76)
75 l_pageInstance[i] = 1;
76 #else
77 l_pageInstance[i] = 0;
78 #endif
79#endif
80 }
81
82 i = 0;
83 while (g_siiRegPageBaseReassign[i] != 0xFFFF) {
84 index = g_siiRegPageBaseReassign[i] >> 8;
85 if ((index < SII_CRA_DEVICE_PAGE_COUNT) && (g_siiRegPageBaseRegs[index] != 0xFF)) {
86 SiiRegWrite(g_siiRegPageBaseRegs[index],
87 g_siiRegPageBaseReassign[index] & 0x00FF);
88 } else {
89 craInstance.lastResultCode = SII_ERR_INVALID_PARAMETER;
90 break;
91 }
92 i++;
93 }
94 return (craInstance.lastResultCode == RESULT_CRA_SUCCESS);
95}
96
97SiiResultCodes_t SiiCraGetLastResult(void)
98{
99 return (craInstance.lastResultCode);
100}
101
102#if 0
103bool_t SiiRegInstanceSet(SiiReg_t virtualAddress, prefuint_t newInstance)
104{
105 prefuint_t va = virtualAddress >> 8;
106 craInstance.lastResultCode = RESULT_CRA_SUCCESS;
107 if ((va < SII_CRA_DEVICE_PAGE_COUNT) && (newInstance < SII_CRA_MAX_DEVICE_INSTANCES)) {
108 l_pageInstance[va] = newInstance;
109 return (true);
110 }
111 craInstance.lastResultCode = SII_ERR_INVALID_PARAMETER;
112 return (false);
113}
114#endif
115
116void SiiRegReadBlock(SiiReg_t virtualAddr, uint8_t *pBuffer, uint16_t count)
117{
118 uint8_t regOffset = (uint8_t) virtualAddr;
119 pageConfig_t *pPage;
120#if !defined(__KERNEL__)
121 SiiResultCodes_t status = SII_ERR_FAIL;
122#endif
123 virtualAddr >>= 8;
124 pPage = &g_addrDescriptor[l_pageInstance[virtualAddr]][virtualAddr];
125#if !defined(__KERNEL__)
126 switch (pPage->busType) {
127 case DEV_I2C_0:
128 status =
129 CraReadBlockI2c(DEV_I2C_0, (uint8_t) pPage->address, regOffset, pBuffer, count);
130 break;
131 case DEV_I2C_OFFSET:
132 status =
133 CraReadBlockI2c(DEV_I2C_0, (uint8_t) pPage->address,
134 regOffset + (uint8_t) (pPage->address >> 8), pBuffer, count);
135 break;
136 default:
137 break;
138 }
139#else
140 {
141 /*int i;
142 for (i=0; i<count; i++)
143 {
144 *pBuffer = I2C_ReadByte((uint8_t)pPage->address, (regOffset + i));
145 ++pBuffer;
146 } */
147 I2C_ReadBlock((uint8_t) pPage->address, regOffset, pBuffer, count);
148 }
149#endif
150}
151
152uint8_t SiiRegRead(SiiReg_t virtualAddr)
153{
154 uint8_t value = 0xFF;
155 uint8_t regOffset = (uint8_t) virtualAddr;
156 pageConfig_t *pPage;
157#if !defined(__KERNEL__)
158#error
159 SiiResultCodes_t status = SII_ERR_FAIL;
160#endif
161 virtualAddr >>= 8;
162 pPage = &g_addrDescriptor[l_pageInstance[virtualAddr]][virtualAddr];
163#if !defined(__KERNEL__)
164 switch (pPage->busType) {
165 case DEV_I2C_0:
166 status = CraReadBlockI2c(DEV_I2C_0, (uint8_t) pPage->address, regOffset, &value, 1);
167 break;
168 case DEV_I2C_OFFSET:
169 status =
170 CraReadBlockI2c(DEV_I2C_0, (uint8_t) pPage->address,
171 regOffset + (uint8_t) (pPage->address >> 8), &value, 1);
172 break;
173 default:
174 break;
175 }
176#else
177 value = I2C_ReadByte((uint8_t) pPage->address, regOffset);
178 /* printk("value=0x%x\n", value); */
179#endif
180 return (value);
181}
182
183void SiiRegWriteBlock(SiiReg_t virtualAddr, const uint8_t *pBuffer, uint16_t count)
184{
185 uint8_t regOffset = (uint8_t) virtualAddr;
186 pageConfig_t *pPage;
187#if !defined(__KERNEL__)
188 SiiResultCodes_t status = SII_ERR_FAIL;
189#endif
190 virtualAddr >>= 8;
191 pPage = &g_addrDescriptor[l_pageInstance[virtualAddr]][virtualAddr];
192#if !defined(__KERNEL__)
193 switch (pPage->busType) {
194 case DEV_I2C_0:
195 status =
196 CraWriteBlockI2c(DEV_I2C_0, (uint8_t) pPage->address, regOffset, pBuffer,
197 count);
198 break;
199 case DEV_I2C_OFFSET:
200 status =
201 CraWriteBlockI2c(DEV_I2C_0, (uint8_t) pPage->address,
202 regOffset + (uint8_t) (pPage->address >> 8), pBuffer, count);
203 break;
204 default:
205 break;
206 }
207#else
208 {
209 int i;
210 for (i = 0; i < count; i++) {
211 I2C_WriteByte((uint8_t) pPage->address, (regOffset + i), *pBuffer);
212 ++pBuffer;
213 }
214 }
215#endif
216}
217
218void SiiRegWrite(SiiReg_t virtualAddr, uint8_t value)
219{
220 uint8_t regOffset = (uint8_t) virtualAddr;
221 pageConfig_t *pPage;
222#if !defined(__KERNEL__)
223 SiiResultCodes_t status = SII_ERR_FAIL;
224#endif
225 virtualAddr >>= 8;
226 pPage = &g_addrDescriptor[l_pageInstance[virtualAddr]][virtualAddr];
227#if !defined(__KERNEL__)
228 switch (pPage->busType) {
229 case DEV_I2C_0:
230 case DEV_I2C_1:
231 case DEV_I2C_2:
232 case DEV_I2C_3:
233 status =
234 CraWriteBlockI2c(pPage->busType, (uint8_t) pPage->address, regOffset, &value,
235 1);
236 break;
237 case DEV_I2C_OFFSET:
238 case DEV_I2C_1_OFFSET:
239 case DEV_I2C_2_OFFSET:
240 case DEV_I2C_3_OFFSET:
241 status =
242 CraWriteBlockI2c(pPage->busType - DEV_I2C_OFFSET, (uint8_t) pPage->address,
243 regOffset + (uint8_t) (pPage->address >> 8), &value, 1);
244 break;
245 default:
246 break;
247 }
248#else
249 I2C_WriteByte((uint8_t) pPage->address, regOffset, value);
250#endif
251}
252
253void SiiRegModify(SiiReg_t virtualAddr, uint8_t mask, uint8_t value)
254{
255 uint8_t aByte;
256 aByte = SiiRegRead(virtualAddr);
257 aByte &= (~mask);
258 aByte |= (mask & value);
259 SiiRegWrite(virtualAddr, aByte);
260}
261
262void SiiRegBitsSet(SiiReg_t virtualAddr, uint8_t bitMask, bool_t setBits)
263{
264 uint8_t aByte;
265 aByte = SiiRegRead(virtualAddr);
266 aByte = (setBits) ? (aByte | bitMask) : (aByte & ~bitMask);
267 SiiRegWrite(virtualAddr, aByte);
268}
269
270void SiiRegBitsSetNew(SiiReg_t virtualAddr, uint8_t bitMask, bool_t setBits)
271{
272 uint8_t newByte, oldByte;
273 oldByte = SiiRegRead(virtualAddr);
274 newByte = (setBits) ? (oldByte | bitMask) : (oldByte & ~bitMask);
275 if (oldByte != newByte) {
276 SiiRegWrite(virtualAddr, newByte);
277 }
278}
279
280void SiiRegEdidReadBlock(SiiReg_t segmentAddr, SiiReg_t virtualAddr, uint8_t *pBuffer,
281 uint16_t count)
282{
283#if 0
284 uint8_t regOffset = (uint8_t) virtualAddr;
285 pageConfig_t *pPage;
286#if !defined(__KERNEL__)
287 SiiResultCodes_t status = SII_ERR_FAIL;
288 if ((segmentAddr & 0xFF) != 0) {
289 regOffset = (uint8_t) segmentAddr;
290 segmentAddr >>= 8;
291 pPage = &g_addrDescriptor[l_pageInstance[segmentAddr]][segmentAddr];
292 I2cSendStart(pPage->busType, pPage->address, &regOffset, 1, false);
293 }
294#endif
295 regOffset = (uint8_t) virtualAddr;
296 virtualAddr >>= 8;
297 pPage = &g_addrDescriptor[l_pageInstance[virtualAddr]][virtualAddr];
298#if !defined(__KERNEL__)
299 status = CraReadBlockI2c(pPage->busType, pPage->address, regOffset, pBuffer, count);
300#else
301 {
302 int i;
303 for (i = 0; i < count; i++) {
304 *pBuffer =
305 I2C_ReadByte((uint8_t) pPage->address, (uint8_t) (regOffset + i));
306 ++pBuffer;
307 }
308 }
309#endif
310#endif
311
312 uint8_t Seg_regOffset = 0x00;
313 uint8_t regOffset = (uint8_t) virtualAddr;
314 uint8_t return_value1 = 0, return_value2 = 0;
315
316 if ((segmentAddr & 0xFF) != 0) {
317 Seg_regOffset = (uint8_t) segmentAddr;
318 }
319 regOffset = (uint8_t) virtualAddr;
320
321 TX_DEBUG_PRINT(("Seg_regOffset=0x%x,regOffset=0x%x,count=%d\n", Seg_regOffset, regOffset,
322 count));
323 if (Seg_regOffset == 0)
324 return_value1 = I2C_ReadBlock(0xA0, regOffset, pBuffer, count);
325 else
326 return_value2 =
327 I2C_ReadSegmentBlockEDID(0xA0, Seg_regOffset, regOffset, pBuffer, count);
328 if (return_value1 > 0)
329 TX_DEBUG_PRINT(("IIC_SCL_TIMEOUT,return_value1\n"));
330 if (return_value2 > 0)
331 TX_DEBUG_PRINT(("IIC_SCL_TIMEOUT,return_value2\n"));
332
333}