2 * Copyright (c) 2015-2018, Renesas Electronics Corporation. All rights reserved.
4 * SPDX-License-Identifier: BSD-3-Clause
7 #include <common/debug.h>
11 #include "cpg_registers.h"
13 #include "rcar_private.h"
15 #define DVFS_RETRY_MAX (2U)
17 #define IIC_DVFS_SET_ICCL_EXTAL_TYPE_0 (0x07)
18 #define IIC_DVFS_SET_ICCL_EXTAL_TYPE_1 (0x09)
19 #define IIC_DVFS_SET_ICCL_EXTAL_TYPE_2 (0x0B)
20 #define IIC_DVFS_SET_ICCL_EXTAL_TYPE_3 (0x0E)
21 #define IIC_DVFS_SET_ICCL_EXTAL_TYPE_E (0x15)
23 #define IIC_DVFS_SET_ICCH_EXTAL_TYPE_0 (0x01)
24 #define IIC_DVFS_SET_ICCH_EXTAL_TYPE_1 (0x02)
25 #define IIC_DVFS_SET_ICCH_EXTAL_TYPE_2 (0x03)
26 #define IIC_DVFS_SET_ICCH_EXTAL_TYPE_3 (0x05)
27 #define IIC_DVFS_SET_ICCH_EXTAL_TYPE_E (0x07)
29 #define CPG_BIT_SMSTPCR9_DVFS (0x04000000)
31 #define IIC_DVFS_REG_BASE (0xE60B0000)
32 #define IIC_DVFS_REG_ICDR (IIC_DVFS_REG_BASE + 0x0000)
33 #define IIC_DVFS_REG_ICCR (IIC_DVFS_REG_BASE + 0x0004)
34 #define IIC_DVFS_REG_ICSR (IIC_DVFS_REG_BASE + 0x0008)
35 #define IIC_DVFS_REG_ICIC (IIC_DVFS_REG_BASE + 0x000C)
36 #define IIC_DVFS_REG_ICCL (IIC_DVFS_REG_BASE + 0x0010)
37 #define IIC_DVFS_REG_ICCH (IIC_DVFS_REG_BASE + 0x0014)
39 #define IIC_DVFS_BIT_ICSR_BUSY (0x10)
40 #define IIC_DVFS_BIT_ICSR_AL (0x08)
41 #define IIC_DVFS_BIT_ICSR_TACK (0x04)
42 #define IIC_DVFS_BIT_ICSR_WAIT (0x02)
43 #define IIC_DVFS_BIT_ICSR_DTE (0x01)
45 #define IIC_DVFS_BIT_ICCR_ENABLE (0x80)
46 #define IIC_DVFS_SET_ICCR_START (0x94)
47 #define IIC_DVFS_SET_ICCR_STOP (0x90)
48 #define IIC_DVFS_SET_ICCR_RETRANSMISSION (0x94)
49 #define IIC_DVFS_SET_ICCR_CHANGE (0x81)
50 #define IIC_DVFS_SET_ICCR_STOP_READ (0xC0)
52 #define IIC_DVFS_BIT_ICIC_TACKE (0x04)
53 #define IIC_DVFS_BIT_ICIC_WAITE (0x02)
54 #define IIC_DVFS_BIT_ICIC_DTEE (0x01)
56 #define DVFS_READ_MODE (0x01)
57 #define DVFS_WRITE_MODE (0x00)
59 #define IIC_DVFS_SET_DUMMY (0x52)
60 #define IIC_DVFS_SET_BUSY_LOOP (500000000U)
72 DVFS_CHANGE_SEND_TO_RECIEVE
,
76 #define DVFS_PROCESS (1)
77 #define DVFS_COMPLETE (0)
78 #define DVFS_ERROR (-1)
81 #define IIC_DVFS_FUNC(__name, ...) \
82 static int32_t __attribute__ ((section (".system_ram"))) \
83 dvfs_ ##__name(__VA_ARGS__)
85 #define RCAR_DVFS_API(__name, ...) \
86 int32_t __attribute__ ((section (".system_ram"))) \
87 rcar_iic_dvfs_ ##__name(__VA_ARGS__)
90 #define IIC_DVFS_FUNC(__name, ...) \
91 static int32_t dvfs_ ##__name(__VA_ARGS__)
93 #define RCAR_DVFS_API(__name, ...) \
94 int32_t rcar_iic_dvfs_ ##__name(__VA_ARGS__)
97 IIC_DVFS_FUNC(check_error
, DVFS_STATE_T
*state
, uint32_t *err
, uint8_t mode
)
99 uint8_t icsr_al
= 0, icsr_tack
= 0;
103 stop
= mode
== DVFS_READ_MODE
? IIC_DVFS_SET_ICCR_STOP_READ
:
104 IIC_DVFS_SET_ICCR_STOP
;
106 reg
= mmio_read_8(IIC_DVFS_REG_ICSR
);
107 icsr_al
= (reg
& IIC_DVFS_BIT_ICSR_AL
) == IIC_DVFS_BIT_ICSR_AL
;
108 icsr_tack
= (reg
& IIC_DVFS_BIT_ICSR_TACK
) == IIC_DVFS_BIT_ICSR_TACK
;
110 if (icsr_al
== 0 && icsr_tack
== 0)
114 reg
= mmio_read_8(IIC_DVFS_REG_ICSR
) & ~IIC_DVFS_BIT_ICSR_AL
;
115 mmio_write_8(IIC_DVFS_REG_ICSR
, reg
);
117 if (*state
== DVFS_SET_SLAVE
)
118 mmio_write_8(IIC_DVFS_REG_ICDR
, IIC_DVFS_SET_DUMMY
);
121 reg
= mmio_read_8(IIC_DVFS_REG_ICSR
) &
122 IIC_DVFS_BIT_ICSR_WAIT
;
125 mmio_write_8(IIC_DVFS_REG_ICCR
, stop
);
127 reg
= mmio_read_8(IIC_DVFS_REG_ICSR
) & ~IIC_DVFS_BIT_ICSR_WAIT
;
128 mmio_write_8(IIC_DVFS_REG_ICSR
, reg
);
132 reg
= mmio_read_8(IIC_DVFS_REG_ICSR
) &
133 IIC_DVFS_BIT_ICSR_BUSY
;
137 if (i
++ > IIC_DVFS_SET_BUSY_LOOP
)
142 mmio_write_8(IIC_DVFS_REG_ICCR
, 0x00U
);
145 if (*err
> DVFS_RETRY_MAX
)
155 mmio_write_8(IIC_DVFS_REG_ICCR
, stop
);
157 reg
= mmio_read_8(IIC_DVFS_REG_ICIC
);
158 reg
&= ~(IIC_DVFS_BIT_ICIC_WAITE
| IIC_DVFS_BIT_ICIC_DTEE
);
159 mmio_write_8(IIC_DVFS_REG_ICIC
, reg
);
161 reg
= mmio_read_8(IIC_DVFS_REG_ICSR
) & ~IIC_DVFS_BIT_ICSR_TACK
;
162 mmio_write_8(IIC_DVFS_REG_ICSR
, reg
);
165 while ((mmio_read_8(IIC_DVFS_REG_ICSR
) & IIC_DVFS_BIT_ICSR_BUSY
) != 0) {
166 if (i
++ > IIC_DVFS_SET_BUSY_LOOP
)
170 mmio_write_8(IIC_DVFS_REG_ICCR
, 0);
173 if (*err
> DVFS_RETRY_MAX
)
181 IIC_DVFS_FUNC(start
, DVFS_STATE_T
* state
)
183 uint8_t iccl
= IIC_DVFS_SET_ICCL_EXTAL_TYPE_E
;
184 uint8_t icch
= IIC_DVFS_SET_ICCH_EXTAL_TYPE_E
;
185 int32_t result
= DVFS_PROCESS
;
186 uint32_t reg
, lsi_product
;
189 mode
= mmio_read_8(IIC_DVFS_REG_ICCR
) | IIC_DVFS_BIT_ICCR_ENABLE
;
190 mmio_write_8(IIC_DVFS_REG_ICCR
, mode
);
192 lsi_product
= mmio_read_32(RCAR_PRR
) & RCAR_PRODUCT_MASK
;
193 if (lsi_product
== RCAR_PRODUCT_E3
)
196 reg
= mmio_read_32(RCAR_MODEMR
) & CHECK_MD13_MD14
;
198 case MD14_MD13_TYPE_0
:
199 iccl
= IIC_DVFS_SET_ICCL_EXTAL_TYPE_0
;
200 icch
= IIC_DVFS_SET_ICCH_EXTAL_TYPE_0
;
202 case MD14_MD13_TYPE_1
:
203 iccl
= IIC_DVFS_SET_ICCL_EXTAL_TYPE_1
;
204 icch
= IIC_DVFS_SET_ICCH_EXTAL_TYPE_1
;
206 case MD14_MD13_TYPE_2
:
207 iccl
= IIC_DVFS_SET_ICCL_EXTAL_TYPE_2
;
208 icch
= IIC_DVFS_SET_ICCH_EXTAL_TYPE_2
;
211 iccl
= IIC_DVFS_SET_ICCL_EXTAL_TYPE_3
;
212 icch
= IIC_DVFS_SET_ICCH_EXTAL_TYPE_3
;
216 mmio_write_8(IIC_DVFS_REG_ICCL
, iccl
);
217 mmio_write_8(IIC_DVFS_REG_ICCH
, icch
);
219 mode
= mmio_read_8(IIC_DVFS_REG_ICIC
)
220 | IIC_DVFS_BIT_ICIC_TACKE
221 | IIC_DVFS_BIT_ICIC_WAITE
| IIC_DVFS_BIT_ICIC_DTEE
;
223 mmio_write_8(IIC_DVFS_REG_ICIC
, mode
);
224 mmio_write_8(IIC_DVFS_REG_ICCR
, IIC_DVFS_SET_ICCR_START
);
226 *state
= DVFS_SET_SLAVE
;
231 IIC_DVFS_FUNC(set_slave
, DVFS_STATE_T
* state
, uint32_t *err
, uint8_t slave
)
237 result
= dvfs_check_error(state
, err
, DVFS_WRITE_MODE
);
238 if (result
== DVFS_ERROR
)
241 mode
= mmio_read_8(IIC_DVFS_REG_ICSR
) & IIC_DVFS_BIT_ICSR_DTE
;
242 if (mode
!= IIC_DVFS_BIT_ICSR_DTE
)
245 mode
= mmio_read_8(IIC_DVFS_REG_ICIC
) & ~IIC_DVFS_BIT_ICIC_DTEE
;
246 mmio_write_8(IIC_DVFS_REG_ICIC
, mode
);
248 address
= slave
<< 1;
249 mmio_write_8(IIC_DVFS_REG_ICDR
, address
);
251 *state
= DVFS_WRITE_ADDR
;
256 IIC_DVFS_FUNC(write_addr
, DVFS_STATE_T
*state
, uint32_t *err
, uint8_t reg_addr
)
261 result
= dvfs_check_error(state
, err
, DVFS_WRITE_MODE
);
262 if (result
== DVFS_ERROR
)
265 mode
= mmio_read_8(IIC_DVFS_REG_ICSR
) & IIC_DVFS_BIT_ICSR_WAIT
;
266 if (mode
!= IIC_DVFS_BIT_ICSR_WAIT
)
269 mmio_write_8(IIC_DVFS_REG_ICDR
, reg_addr
);
271 mode
= mmio_read_8(IIC_DVFS_REG_ICSR
) & ~IIC_DVFS_BIT_ICSR_WAIT
;
272 mmio_write_8(IIC_DVFS_REG_ICSR
, mode
);
274 *state
= DVFS_WRITE_DATA
;
279 IIC_DVFS_FUNC(write_data
, DVFS_STATE_T
*state
, uint32_t *err
, uint8_t reg_data
)
284 result
= dvfs_check_error(state
, err
, DVFS_WRITE_MODE
);
285 if (result
== DVFS_ERROR
)
288 mode
= mmio_read_8(IIC_DVFS_REG_ICSR
) & IIC_DVFS_BIT_ICSR_WAIT
;
289 if (mode
!= IIC_DVFS_BIT_ICSR_WAIT
)
292 mmio_write_8(IIC_DVFS_REG_ICDR
, reg_data
);
294 mode
= mmio_read_8(IIC_DVFS_REG_ICSR
) & ~IIC_DVFS_BIT_ICSR_WAIT
;
295 mmio_write_8(IIC_DVFS_REG_ICSR
, mode
);
302 IIC_DVFS_FUNC(stop
, DVFS_STATE_T
*state
, uint32_t *err
)
307 result
= dvfs_check_error(state
, err
, DVFS_WRITE_MODE
);
308 if (result
== DVFS_ERROR
)
311 mode
= mmio_read_8(IIC_DVFS_REG_ICSR
) & IIC_DVFS_BIT_ICSR_WAIT
;
312 if (mode
!= IIC_DVFS_BIT_ICSR_WAIT
)
315 mmio_write_8(IIC_DVFS_REG_ICCR
, IIC_DVFS_SET_ICCR_STOP
);
317 mode
= mmio_read_8(IIC_DVFS_REG_ICSR
) & ~IIC_DVFS_BIT_ICSR_WAIT
;
318 mmio_write_8(IIC_DVFS_REG_ICSR
, mode
);
325 IIC_DVFS_FUNC(done
, void)
329 for (i
= 0; i
< IIC_DVFS_SET_BUSY_LOOP
; i
++) {
330 if (mmio_read_8(IIC_DVFS_REG_ICSR
) & IIC_DVFS_BIT_ICSR_BUSY
)
337 mmio_write_8(IIC_DVFS_REG_ICCR
, 0);
339 return DVFS_COMPLETE
;
342 IIC_DVFS_FUNC(write_reg_addr_read
, DVFS_STATE_T
*state
, uint32_t *err
,
348 result
= dvfs_check_error(state
, err
, DVFS_WRITE_MODE
);
349 if (result
== DVFS_ERROR
)
352 mode
= mmio_read_8(IIC_DVFS_REG_ICSR
) & IIC_DVFS_BIT_ICSR_WAIT
;
353 if (mode
!= IIC_DVFS_BIT_ICSR_WAIT
)
356 mmio_write_8(IIC_DVFS_REG_ICDR
, reg_addr
);
358 mode
= mmio_read_8(IIC_DVFS_REG_ICSR
) & ~IIC_DVFS_BIT_ICSR_WAIT
;
359 mmio_write_8(IIC_DVFS_REG_ICSR
, mode
);
361 *state
= DVFS_RETRANSMIT
;
366 IIC_DVFS_FUNC(retransmit
, DVFS_STATE_T
*state
, uint32_t *err
)
371 result
= dvfs_check_error(state
, err
, DVFS_WRITE_MODE
);
372 if (result
== DVFS_ERROR
)
375 mode
= mmio_read_8(IIC_DVFS_REG_ICSR
) & IIC_DVFS_BIT_ICSR_WAIT
;
376 if (mode
!= IIC_DVFS_BIT_ICSR_WAIT
)
379 mmio_write_8(IIC_DVFS_REG_ICCR
, IIC_DVFS_SET_ICCR_RETRANSMISSION
);
381 mode
= mmio_read_8(IIC_DVFS_REG_ICSR
) & ~IIC_DVFS_BIT_ICSR_WAIT
;
382 mmio_write_8(IIC_DVFS_REG_ICSR
, mode
);
384 mode
= mmio_read_8(IIC_DVFS_REG_ICIC
) | IIC_DVFS_BIT_ICIC_DTEE
;
385 mmio_write_8(IIC_DVFS_REG_ICIC
, mode
);
387 *state
= DVFS_SET_SLAVE_READ
;
392 IIC_DVFS_FUNC(set_slave_read
, DVFS_STATE_T
*state
, uint32_t *err
,
399 result
= dvfs_check_error(state
, err
, DVFS_WRITE_MODE
);
400 if (result
== DVFS_ERROR
)
403 mode
= mmio_read_8(IIC_DVFS_REG_ICSR
) & IIC_DVFS_BIT_ICSR_DTE
;
404 if (mode
!= IIC_DVFS_BIT_ICSR_DTE
)
407 mode
= mmio_read_8(IIC_DVFS_REG_ICIC
) & ~IIC_DVFS_BIT_ICIC_DTEE
;
408 mmio_write_8(IIC_DVFS_REG_ICIC
, mode
);
410 address
= ((uint8_t) (slave
<< 1) + DVFS_READ_MODE
);
411 mmio_write_8(IIC_DVFS_REG_ICDR
, address
);
413 *state
= DVFS_CHANGE_SEND_TO_RECIEVE
;
418 IIC_DVFS_FUNC(change_send_to_recieve
, DVFS_STATE_T
*state
, uint32_t *err
)
423 result
= dvfs_check_error(state
, err
, DVFS_WRITE_MODE
);
424 if (result
== DVFS_ERROR
)
427 mode
= mmio_read_8(IIC_DVFS_REG_ICSR
) & IIC_DVFS_BIT_ICSR_WAIT
;
428 if (mode
!= IIC_DVFS_BIT_ICSR_WAIT
)
431 mmio_write_8(IIC_DVFS_REG_ICCR
, IIC_DVFS_SET_ICCR_CHANGE
);
433 mode
= mmio_read_8(IIC_DVFS_REG_ICSR
) & ~IIC_DVFS_BIT_ICSR_WAIT
;
434 mmio_write_8(IIC_DVFS_REG_ICSR
, mode
);
436 *state
= DVFS_STOP_READ
;
441 IIC_DVFS_FUNC(stop_read
, DVFS_STATE_T
*state
, uint32_t *err
)
446 result
= dvfs_check_error(state
, err
, DVFS_READ_MODE
);
447 if (result
== DVFS_ERROR
)
450 mode
= mmio_read_8(IIC_DVFS_REG_ICSR
) & IIC_DVFS_BIT_ICSR_WAIT
;
451 if (mode
!= IIC_DVFS_BIT_ICSR_WAIT
)
454 mmio_write_8(IIC_DVFS_REG_ICCR
, IIC_DVFS_SET_ICCR_STOP_READ
);
456 mode
= mmio_read_8(IIC_DVFS_REG_ICSR
) & ~IIC_DVFS_BIT_ICSR_WAIT
;
457 mmio_write_8(IIC_DVFS_REG_ICSR
, mode
);
459 mode
= mmio_read_8(IIC_DVFS_REG_ICIC
) | IIC_DVFS_BIT_ICIC_DTEE
;
460 mmio_write_8(IIC_DVFS_REG_ICIC
, mode
);
467 IIC_DVFS_FUNC(read
, DVFS_STATE_T
*state
, uint8_t *reg_data
)
471 mode
= mmio_read_8(IIC_DVFS_REG_ICSR
) & IIC_DVFS_BIT_ICSR_DTE
;
472 if (mode
!= IIC_DVFS_BIT_ICSR_DTE
)
475 mode
= mmio_read_8(IIC_DVFS_REG_ICIC
) & ~IIC_DVFS_BIT_ICIC_DTEE
;
476 mmio_write_8(IIC_DVFS_REG_ICIC
, mode
);
478 *reg_data
= mmio_read_8(IIC_DVFS_REG_ICDR
);
484 RCAR_DVFS_API(send
, uint8_t slave
, uint8_t reg_addr
, uint8_t reg_data
)
486 DVFS_STATE_T state
= DVFS_START
;
487 int32_t result
= DVFS_PROCESS
;
490 mstpcr_write(SCMSTPCR9
, CPG_MSTPSR9
, CPG_BIT_SMSTPCR9_DVFS
);
491 mmio_write_8(IIC_DVFS_REG_ICCR
, 0);
495 result
= dvfs_start(&state
);
498 result
= dvfs_set_slave(&state
, &err
, slave
);
500 case DVFS_WRITE_ADDR
:
501 result
= dvfs_write_addr(&state
, &err
, reg_addr
);
503 case DVFS_WRITE_DATA
:
504 result
= dvfs_write_data(&state
, &err
, reg_data
);
507 result
= dvfs_stop(&state
, &err
);
510 result
= dvfs_done();
517 if (result
== DVFS_PROCESS
)
523 RCAR_DVFS_API(receive
, uint8_t slave
, uint8_t reg
, uint8_t *data
)
525 DVFS_STATE_T state
= DVFS_START
;
526 int32_t result
= DVFS_PROCESS
;
529 mstpcr_write(SCMSTPCR9
, CPG_MSTPSR9
, CPG_BIT_SMSTPCR9_DVFS
);
530 mmio_write_8(IIC_DVFS_REG_ICCR
, 0);
534 result
= dvfs_start(&state
);
537 result
= dvfs_set_slave(&state
, &err
, slave
);
539 case DVFS_WRITE_ADDR
:
540 result
= dvfs_write_reg_addr_read(&state
, &err
, reg
);
542 case DVFS_RETRANSMIT
:
543 result
= dvfs_retransmit(&state
, &err
);
545 case DVFS_SET_SLAVE_READ
:
546 result
= dvfs_set_slave_read(&state
, &err
, slave
);
548 case DVFS_CHANGE_SEND_TO_RECIEVE
:
549 result
= dvfs_change_send_to_recieve(&state
, &err
);
552 result
= dvfs_stop_read(&state
, &err
);
555 result
= dvfs_read(&state
, data
);
558 result
= dvfs_done();
565 if (result
== DVFS_PROCESS
)