]> Gitweb @ Texas Instruments - Open Source Git Repositories - git.TI.com/gitweb - rpmsg/rpmsg.git/blob - drivers/soc/fsl/qe/ucc.c
Merge tag 'devicetree-fixes-for-4.19-3' of git://git.kernel.org/pub/scm/linux/kernel...
[rpmsg/rpmsg.git] / drivers / soc / fsl / qe / ucc.c
1 /*
2  * arch/powerpc/sysdev/qe_lib/ucc.c
3  *
4  * QE UCC API Set - UCC specific routines implementations.
5  *
6  * Copyright (C) 2006 Freescale Semiconductor, Inc. All rights reserved.
7  *
8  * Authors:     Shlomi Gridish <gridish@freescale.com>
9  *              Li Yang <leoli@freescale.com>
10  *
11  * This program is free software; you can redistribute  it and/or modify it
12  * under  the terms of  the GNU General  Public License as published by the
13  * Free Software Foundation;  either version 2 of the  License, or (at your
14  * option) any later version.
15  */
16 #include <linux/kernel.h>
17 #include <linux/errno.h>
18 #include <linux/stddef.h>
19 #include <linux/spinlock.h>
20 #include <linux/export.h>
22 #include <asm/irq.h>
23 #include <asm/io.h>
24 #include <soc/fsl/qe/immap_qe.h>
25 #include <soc/fsl/qe/qe.h>
26 #include <soc/fsl/qe/ucc.h>
28 #define UCC_TDM_NUM 8
29 #define RX_SYNC_SHIFT_BASE 30
30 #define TX_SYNC_SHIFT_BASE 14
31 #define RX_CLK_SHIFT_BASE 28
32 #define TX_CLK_SHIFT_BASE 12
34 int ucc_set_qe_mux_mii_mng(unsigned int ucc_num)
35 {
36         unsigned long flags;
38         if (ucc_num > UCC_MAX_NUM - 1)
39                 return -EINVAL;
41         spin_lock_irqsave(&cmxgcr_lock, flags);
42         clrsetbits_be32(&qe_immr->qmx.cmxgcr, QE_CMXGCR_MII_ENET_MNG,
43                 ucc_num << QE_CMXGCR_MII_ENET_MNG_SHIFT);
44         spin_unlock_irqrestore(&cmxgcr_lock, flags);
46         return 0;
47 }
48 EXPORT_SYMBOL(ucc_set_qe_mux_mii_mng);
50 /* Configure the UCC to either Slow or Fast.
51  *
52  * A given UCC can be figured to support either "slow" devices (e.g. UART)
53  * or "fast" devices (e.g. Ethernet).
54  *
55  * 'ucc_num' is the UCC number, from 0 - 7.
56  *
57  * This function also sets the UCC_GUEMR_SET_RESERVED3 bit because that bit
58  * must always be set to 1.
59  */
60 int ucc_set_type(unsigned int ucc_num, enum ucc_speed_type speed)
61 {
62         u8 __iomem *guemr;
64         /* The GUEMR register is at the same location for both slow and fast
65            devices, so we just use uccX.slow.guemr. */
66         switch (ucc_num) {
67         case 0: guemr = &qe_immr->ucc1.slow.guemr;
68                 break;
69         case 1: guemr = &qe_immr->ucc2.slow.guemr;
70                 break;
71         case 2: guemr = &qe_immr->ucc3.slow.guemr;
72                 break;
73         case 3: guemr = &qe_immr->ucc4.slow.guemr;
74                 break;
75         case 4: guemr = &qe_immr->ucc5.slow.guemr;
76                 break;
77         case 5: guemr = &qe_immr->ucc6.slow.guemr;
78                 break;
79         case 6: guemr = &qe_immr->ucc7.slow.guemr;
80                 break;
81         case 7: guemr = &qe_immr->ucc8.slow.guemr;
82                 break;
83         default:
84                 return -EINVAL;
85         }
87         clrsetbits_8(guemr, UCC_GUEMR_MODE_MASK,
88                 UCC_GUEMR_SET_RESERVED3 | speed);
90         return 0;
91 }
93 static void get_cmxucr_reg(unsigned int ucc_num, __be32 __iomem **cmxucr,
94         unsigned int *reg_num, unsigned int *shift)
95 {
96         unsigned int cmx = ((ucc_num & 1) << 1) + (ucc_num > 3);
98         *reg_num = cmx + 1;
99         *cmxucr = &qe_immr->qmx.cmxucr[cmx];
100         *shift = 16 - 8 * (ucc_num & 2);
103 int ucc_mux_set_grant_tsa_bkpt(unsigned int ucc_num, int set, u32 mask)
105         __be32 __iomem *cmxucr;
106         unsigned int reg_num;
107         unsigned int shift;
109         /* check if the UCC number is in range. */
110         if (ucc_num > UCC_MAX_NUM - 1)
111                 return -EINVAL;
113         get_cmxucr_reg(ucc_num, &cmxucr, &reg_num, &shift);
115         if (set)
116                 setbits32(cmxucr, mask << shift);
117         else
118                 clrbits32(cmxucr, mask << shift);
120         return 0;
123 int ucc_set_qe_mux_rxtx(unsigned int ucc_num, enum qe_clock clock,
124         enum comm_dir mode)
126         __be32 __iomem *cmxucr;
127         unsigned int reg_num;
128         unsigned int shift;
129         u32 clock_bits = 0;
131         /* check if the UCC number is in range. */
132         if (ucc_num > UCC_MAX_NUM - 1)
133                 return -EINVAL;
135         /* The communications direction must be RX or TX */
136         if (!((mode == COMM_DIR_RX) || (mode == COMM_DIR_TX)))
137                 return -EINVAL;
139         get_cmxucr_reg(ucc_num, &cmxucr, &reg_num, &shift);
141         switch (reg_num) {
142         case 1:
143                 switch (clock) {
144                 case QE_BRG1:   clock_bits = 1; break;
145                 case QE_BRG2:   clock_bits = 2; break;
146                 case QE_BRG7:   clock_bits = 3; break;
147                 case QE_BRG8:   clock_bits = 4; break;
148                 case QE_CLK9:   clock_bits = 5; break;
149                 case QE_CLK10:  clock_bits = 6; break;
150                 case QE_CLK11:  clock_bits = 7; break;
151                 case QE_CLK12:  clock_bits = 8; break;
152                 case QE_CLK15:  clock_bits = 9; break;
153                 case QE_CLK16:  clock_bits = 10; break;
154                 default: break;
155                 }
156                 break;
157         case 2:
158                 switch (clock) {
159                 case QE_BRG5:   clock_bits = 1; break;
160                 case QE_BRG6:   clock_bits = 2; break;
161                 case QE_BRG7:   clock_bits = 3; break;
162                 case QE_BRG8:   clock_bits = 4; break;
163                 case QE_CLK13:  clock_bits = 5; break;
164                 case QE_CLK14:  clock_bits = 6; break;
165                 case QE_CLK19:  clock_bits = 7; break;
166                 case QE_CLK20:  clock_bits = 8; break;
167                 case QE_CLK15:  clock_bits = 9; break;
168                 case QE_CLK16:  clock_bits = 10; break;
169                 default: break;
170                 }
171                 break;
172         case 3:
173                 switch (clock) {
174                 case QE_BRG9:   clock_bits = 1; break;
175                 case QE_BRG10:  clock_bits = 2; break;
176                 case QE_BRG15:  clock_bits = 3; break;
177                 case QE_BRG16:  clock_bits = 4; break;
178                 case QE_CLK3:   clock_bits = 5; break;
179                 case QE_CLK4:   clock_bits = 6; break;
180                 case QE_CLK17:  clock_bits = 7; break;
181                 case QE_CLK18:  clock_bits = 8; break;
182                 case QE_CLK7:   clock_bits = 9; break;
183                 case QE_CLK8:   clock_bits = 10; break;
184                 case QE_CLK16:  clock_bits = 11; break;
185                 default: break;
186                 }
187                 break;
188         case 4:
189                 switch (clock) {
190                 case QE_BRG13:  clock_bits = 1; break;
191                 case QE_BRG14:  clock_bits = 2; break;
192                 case QE_BRG15:  clock_bits = 3; break;
193                 case QE_BRG16:  clock_bits = 4; break;
194                 case QE_CLK5:   clock_bits = 5; break;
195                 case QE_CLK6:   clock_bits = 6; break;
196                 case QE_CLK21:  clock_bits = 7; break;
197                 case QE_CLK22:  clock_bits = 8; break;
198                 case QE_CLK7:   clock_bits = 9; break;
199                 case QE_CLK8:   clock_bits = 10; break;
200                 case QE_CLK16:  clock_bits = 11; break;
201                 default: break;
202                 }
203                 break;
204         default: break;
205         }
207         /* Check for invalid combination of clock and UCC number */
208         if (!clock_bits)
209                 return -ENOENT;
211         if (mode == COMM_DIR_RX)
212                 shift += 4;
214         clrsetbits_be32(cmxucr, QE_CMXUCR_TX_CLK_SRC_MASK << shift,
215                 clock_bits << shift);
217         return 0;
220 static int ucc_get_tdm_common_clk(u32 tdm_num, enum qe_clock clock)
222         int clock_bits = -EINVAL;
224         /*
225          * for TDM[0, 1, 2, 3], TX and RX use  common
226          * clock source BRG3,4 and CLK1,2
227          * for TDM[4, 5, 6, 7], TX and RX use  common
228          * clock source BRG12,13 and CLK23,24
229          */
230         switch (tdm_num) {
231         case 0:
232         case 1:
233         case 2:
234         case 3:
235                 switch (clock) {
236                 case QE_BRG3:
237                         clock_bits = 1;
238                         break;
239                 case QE_BRG4:
240                         clock_bits = 2;
241                         break;
242                 case QE_CLK1:
243                         clock_bits = 4;
244                         break;
245                 case QE_CLK2:
246                         clock_bits = 5;
247                         break;
248                 default:
249                         break;
250                 }
251                 break;
252         case 4:
253         case 5:
254         case 6:
255         case 7:
256                 switch (clock) {
257                 case QE_BRG12:
258                         clock_bits = 1;
259                         break;
260                 case QE_BRG13:
261                         clock_bits = 2;
262                         break;
263                 case QE_CLK23:
264                         clock_bits = 4;
265                         break;
266                 case QE_CLK24:
267                         clock_bits = 5;
268                         break;
269                 default:
270                         break;
271                 }
272                 break;
273         default:
274                 break;
275         }
277         return clock_bits;
280 static int ucc_get_tdm_rx_clk(u32 tdm_num, enum qe_clock clock)
282         int clock_bits = -EINVAL;
284         switch (tdm_num) {
285         case 0:
286                 switch (clock) {
287                 case QE_CLK3:
288                         clock_bits = 6;
289                         break;
290                 case QE_CLK8:
291                         clock_bits = 7;
292                         break;
293                 default:
294                         break;
295                 }
296                 break;
297         case 1:
298                 switch (clock) {
299                 case QE_CLK5:
300                         clock_bits = 6;
301                         break;
302                 case QE_CLK10:
303                         clock_bits = 7;
304                         break;
305                 default:
306                         break;
307                 }
308                 break;
309         case 2:
310                 switch (clock) {
311                 case QE_CLK7:
312                         clock_bits = 6;
313                         break;
314                 case QE_CLK12:
315                         clock_bits = 7;
316                         break;
317                 default:
318                         break;
319                 }
320                 break;
321         case 3:
322                 switch (clock) {
323                 case QE_CLK9:
324                         clock_bits = 6;
325                         break;
326                 case QE_CLK14:
327                         clock_bits = 7;
328                         break;
329                 default:
330                         break;
331                 }
332                 break;
333         case 4:
334                 switch (clock) {
335                 case QE_CLK11:
336                         clock_bits = 6;
337                         break;
338                 case QE_CLK16:
339                         clock_bits = 7;
340                         break;
341                 default:
342                         break;
343                 }
344                 break;
345         case 5:
346                 switch (clock) {
347                 case QE_CLK13:
348                         clock_bits = 6;
349                         break;
350                 case QE_CLK18:
351                         clock_bits = 7;
352                         break;
353                 default:
354                         break;
355                 }
356                 break;
357         case 6:
358                 switch (clock) {
359                 case QE_CLK15:
360                         clock_bits = 6;
361                         break;
362                 case QE_CLK20:
363                         clock_bits = 7;
364                         break;
365                 default:
366                         break;
367                 }
368                 break;
369         case 7:
370                 switch (clock) {
371                 case QE_CLK17:
372                         clock_bits = 6;
373                         break;
374                 case QE_CLK22:
375                         clock_bits = 7;
376                         break;
377                 default:
378                         break;
379                 }
380                 break;
381         }
383         return clock_bits;
386 static int ucc_get_tdm_tx_clk(u32 tdm_num, enum qe_clock clock)
388         int clock_bits = -EINVAL;
390         switch (tdm_num) {
391         case 0:
392                 switch (clock) {
393                 case QE_CLK4:
394                         clock_bits = 6;
395                         break;
396                 case QE_CLK9:
397                         clock_bits = 7;
398                         break;
399                 default:
400                         break;
401                 }
402                 break;
403         case 1:
404                 switch (clock) {
405                 case QE_CLK6:
406                         clock_bits = 6;
407                         break;
408                 case QE_CLK11:
409                         clock_bits = 7;
410                         break;
411                 default:
412                         break;
413                 }
414                 break;
415         case 2:
416                 switch (clock) {
417                 case QE_CLK8:
418                         clock_bits = 6;
419                         break;
420                 case QE_CLK13:
421                         clock_bits = 7;
422                         break;
423                 default:
424                         break;
425                 }
426                 break;
427         case 3:
428                 switch (clock) {
429                 case QE_CLK10:
430                         clock_bits = 6;
431                         break;
432                 case QE_CLK15:
433                         clock_bits = 7;
434                         break;
435                 default:
436                         break;
437                 }
438                 break;
439         case 4:
440                 switch (clock) {
441                 case QE_CLK12:
442                         clock_bits = 6;
443                         break;
444                 case QE_CLK17:
445                         clock_bits = 7;
446                         break;
447                 default:
448                         break;
449                 }
450                 break;
451         case 5:
452                 switch (clock) {
453                 case QE_CLK14:
454                         clock_bits = 6;
455                         break;
456                 case QE_CLK19:
457                         clock_bits = 7;
458                         break;
459                 default:
460                         break;
461                 }
462                 break;
463         case 6:
464                 switch (clock) {
465                 case QE_CLK16:
466                         clock_bits = 6;
467                         break;
468                 case QE_CLK21:
469                         clock_bits = 7;
470                         break;
471                 default:
472                         break;
473                 }
474                 break;
475         case 7:
476                 switch (clock) {
477                 case QE_CLK18:
478                         clock_bits = 6;
479                         break;
480                 case QE_CLK3:
481                         clock_bits = 7;
482                         break;
483                 default:
484                         break;
485                 }
486                 break;
487         }
489         return clock_bits;
492 /* tdm_num: TDM A-H port num is 0-7 */
493 static int ucc_get_tdm_rxtx_clk(enum comm_dir mode, u32 tdm_num,
494                                 enum qe_clock clock)
496         int clock_bits;
498         clock_bits = ucc_get_tdm_common_clk(tdm_num, clock);
499         if (clock_bits > 0)
500                 return clock_bits;
501         if (mode == COMM_DIR_RX)
502                 clock_bits = ucc_get_tdm_rx_clk(tdm_num, clock);
503         if (mode == COMM_DIR_TX)
504                 clock_bits = ucc_get_tdm_tx_clk(tdm_num, clock);
505         return clock_bits;
508 static u32 ucc_get_tdm_clk_shift(enum comm_dir mode, u32 tdm_num)
510         u32 shift;
512         shift = (mode == COMM_DIR_RX) ? RX_CLK_SHIFT_BASE : TX_CLK_SHIFT_BASE;
513         if (tdm_num < 4)
514                 shift -= tdm_num * 4;
515         else
516                 shift -= (tdm_num - 4) * 4;
518         return shift;
521 int ucc_set_tdm_rxtx_clk(u32 tdm_num, enum qe_clock clock,
522                          enum comm_dir mode)
524         int clock_bits;
525         u32 shift;
526         struct qe_mux __iomem *qe_mux_reg;
527          __be32 __iomem *cmxs1cr;
529         qe_mux_reg = &qe_immr->qmx;
531         if (tdm_num > 7 || tdm_num < 0)
532                 return -EINVAL;
534         /* The communications direction must be RX or TX */
535         if (mode != COMM_DIR_RX && mode != COMM_DIR_TX)
536                 return -EINVAL;
538         clock_bits = ucc_get_tdm_rxtx_clk(mode, tdm_num, clock);
539         if (clock_bits < 0)
540                 return -EINVAL;
542         shift = ucc_get_tdm_clk_shift(mode, tdm_num);
544         cmxs1cr = (tdm_num < 4) ? &qe_mux_reg->cmxsi1cr_l :
545                                   &qe_mux_reg->cmxsi1cr_h;
547         qe_clrsetbits32(cmxs1cr, QE_CMXUCR_TX_CLK_SRC_MASK << shift,
548                         clock_bits << shift);
550         return 0;
553 static int ucc_get_tdm_sync_source(u32 tdm_num, enum qe_clock clock,
554                                    enum comm_dir mode)
556         int source = -EINVAL;
558         if (mode == COMM_DIR_RX && clock == QE_RSYNC_PIN) {
559                 source = 0;
560                 return source;
561         }
562         if (mode == COMM_DIR_TX && clock == QE_TSYNC_PIN) {
563                 source = 0;
564                 return source;
565         }
567         switch (tdm_num) {
568         case 0:
569         case 1:
570                 switch (clock) {
571                 case QE_BRG9:
572                         source = 1;
573                         break;
574                 case QE_BRG10:
575                         source = 2;
576                         break;
577                 default:
578                         break;
579                 }
580                 break;
581         case 2:
582         case 3:
583                 switch (clock) {
584                 case QE_BRG9:
585                         source = 1;
586                         break;
587                 case QE_BRG11:
588                         source = 2;
589                         break;
590                 default:
591                         break;
592                 }
593                 break;
594         case 4:
595         case 5:
596                 switch (clock) {
597                 case QE_BRG13:
598                         source = 1;
599                         break;
600                 case QE_BRG14:
601                         source = 2;
602                         break;
603                 default:
604                         break;
605                 }
606                 break;
607         case 6:
608         case 7:
609                 switch (clock) {
610                 case QE_BRG13:
611                         source = 1;
612                         break;
613                 case QE_BRG15:
614                         source = 2;
615                         break;
616                 default:
617                         break;
618                 }
619                 break;
620         }
622         return source;
625 static u32 ucc_get_tdm_sync_shift(enum comm_dir mode, u32 tdm_num)
627         u32 shift;
629         shift = (mode == COMM_DIR_RX) ? RX_SYNC_SHIFT_BASE : TX_SYNC_SHIFT_BASE;
630         shift -= tdm_num * 2;
632         return shift;
635 int ucc_set_tdm_rxtx_sync(u32 tdm_num, enum qe_clock clock,
636                           enum comm_dir mode)
638         int source;
639         u32 shift;
640         struct qe_mux *qe_mux_reg;
642         qe_mux_reg = &qe_immr->qmx;
644         if (tdm_num >= UCC_TDM_NUM)
645                 return -EINVAL;
647         /* The communications direction must be RX or TX */
648         if (mode != COMM_DIR_RX && mode != COMM_DIR_TX)
649                 return -EINVAL;
651         source = ucc_get_tdm_sync_source(tdm_num, clock, mode);
652         if (source < 0)
653                 return -EINVAL;
655         shift = ucc_get_tdm_sync_shift(mode, tdm_num);
657         qe_clrsetbits32(&qe_mux_reg->cmxsi1syr,
658                         QE_CMXUCR_TX_CLK_SRC_MASK << shift,
659                         source << shift);
661         return 0;