~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/arch/powerpc/sysdev/cpm2.c

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

Diff markup

Differences between /arch/powerpc/sysdev/cpm2.c (Architecture sparc64) and /arch/sparc/sysdev/cpm2.c (Architecture sparc)


  1 /*                                                  1 
  2  * General Purpose functions for the global ma    
  3  * 8260 Communication Processor Module.           
  4  * Copyright (c) 1999-2001 Dan Malek <dan@embe    
  5  * Copyright (c) 2000 MontaVista Software, Inc    
  6  *      2.3.99 Updates                            
  7  *                                                
  8  * 2006 (c) MontaVista Software, Inc.             
  9  * Vitaly Bordug <vbordug@ru.mvista.com>          
 10  *      Merged to arch/powerpc from arch/ppc/s    
 11  *                                                
 12  * This file is licensed under the terms of th    
 13  * version 2. This program is licensed "as is"    
 14  * kind, whether express or implied.              
 15  */                                               
 16                                                   
 17 /*                                                
 18  *                                                
 19  * In addition to the individual control of th    
 20  * channels, there are a few functions that gl    
 21  * communication processor.                       
 22  *                                                
 23  * Buffer descriptors must be allocated from t    
 24  * space.  The allocator for that is here.  Wh    
 25  * process is reset, we reclaim the memory ava    
 26  * currently no deallocator for this memory.      
 27  */                                               
 28 #include <linux/errno.h>                          
 29 #include <linux/sched.h>                          
 30 #include <linux/kernel.h>                         
 31 #include <linux/param.h>                          
 32 #include <linux/string.h>                         
 33 #include <linux/mm.h>                             
 34 #include <linux/interrupt.h>                      
 35 #include <linux/module.h>                         
 36 #include <linux/of.h>                             
 37                                                   
 38 #include <asm/io.h>                               
 39 #include <asm/irq.h>                              
 40 #include <asm/page.h>                             
 41 #include <asm/cpm2.h>                             
 42 #include <asm/rheap.h>                            
 43                                                   
 44 #include <sysdev/fsl_soc.h>                       
 45                                                   
 46 cpm_cpm2_t __iomem *cpmp; /* Pointer to comm p    
 47                                                   
 48 /* We allocate this here because it is used al    
 49  * the communication processor devices.           
 50  */                                               
 51 cpm2_map_t __iomem *cpm2_immr;                    
 52 EXPORT_SYMBOL(cpm2_immr);                         
 53                                                   
 54 #define CPM_MAP_SIZE    (0x40000)       /* 256    
 55                                            of     
 56                                            tha    
 57                                                   
 58 void __init cpm2_reset(void)                      
 59 {                                                 
 60 #ifdef CONFIG_PPC_85xx                            
 61         cpm2_immr = ioremap(get_immrbase() + 0    
 62 #else                                             
 63         cpm2_immr = ioremap(get_immrbase(), CP    
 64 #endif                                            
 65                                                   
 66         /* Tell everyone where the comm proces    
 67          */                                       
 68         cpmp = &cpm2_immr->im_cpm;                
 69                                                   
 70 #ifndef CONFIG_PPC_EARLY_DEBUG_CPM                
 71         /* Reset the CPM.                         
 72          */                                       
 73         cpm_command(CPM_CR_RST, 0);               
 74 #endif                                            
 75 }                                                 
 76                                                   
 77 static DEFINE_SPINLOCK(cmd_lock);                 
 78                                                   
 79 #define MAX_CR_CMD_LOOPS        10000             
 80                                                   
 81 int cpm_command(u32 command, u8 opcode)           
 82 {                                                 
 83         int i, ret;                               
 84         unsigned long flags;                      
 85                                                   
 86         spin_lock_irqsave(&cmd_lock, flags);      
 87                                                   
 88         ret = 0;                                  
 89         out_be32(&cpmp->cp_cpcr, command | opc    
 90         for (i = 0; i < MAX_CR_CMD_LOOPS; i++)    
 91                 if ((in_be32(&cpmp->cp_cpcr) &    
 92                         goto out;                 
 93                                                   
 94         printk(KERN_ERR "%s(): Not able to iss    
 95         ret = -EIO;                               
 96 out:                                              
 97         spin_unlock_irqrestore(&cmd_lock, flag    
 98         return ret;                               
 99 }                                                 
100 EXPORT_SYMBOL(cpm_command);                       
101                                                   
102 /* Set a baud rate generator.  This needs lots    
103  * eight BRGs, which can be connected to the C    
104  * as clocks.  The BRGs are in two different b    
105  * memory mapped space.                           
106  * The baud rate clock is the system clock div    
107  * It was set up long ago during the initial b    
108  * given to us.                                   
109  * Baud rate clocks are zero-based in the driv    
110  * to port numbers).  Documentation uses 1-bas    
111  */                                               
112 void __cpm2_setbrg(uint brg, uint rate, uint c    
113 {                                                 
114         u32 __iomem *bp;                          
115         u32 val;                                  
116                                                   
117         /* This is good enough to get SMCs run    
118         */                                        
119         if (brg < 4) {                            
120                 bp = &cpm2_immr->im_brgc1;        
121         } else {                                  
122                 bp = &cpm2_immr->im_brgc5;        
123                 brg -= 4;                         
124         }                                         
125         bp += brg;                                
126         /* Round the clock divider to the near    
127         val = (((clk * 2 / rate) - 1) & ~1) |     
128         if (div16)                                
129                 val |= CPM_BRG_DIV16;             
130                                                   
131         out_be32(bp, val);                        
132 }                                                 
133 EXPORT_SYMBOL(__cpm2_setbrg);                     
134                                                   
135 int __init cpm2_clk_setup(enum cpm_clk_target     
136 {                                                 
137         int ret = 0;                              
138         int shift;                                
139         int i, bits = 0;                          
140         u32 __iomem *reg;                         
141         u32 mask = 7;                             
142                                                   
143         u8 clk_map[][3] = {                       
144                 {CPM_CLK_FCC1, CPM_BRG5, 0},      
145                 {CPM_CLK_FCC1, CPM_BRG6, 1},      
146                 {CPM_CLK_FCC1, CPM_BRG7, 2},      
147                 {CPM_CLK_FCC1, CPM_BRG8, 3},      
148                 {CPM_CLK_FCC1, CPM_CLK9, 4},      
149                 {CPM_CLK_FCC1, CPM_CLK10, 5},     
150                 {CPM_CLK_FCC1, CPM_CLK11, 6},     
151                 {CPM_CLK_FCC1, CPM_CLK12, 7},     
152                 {CPM_CLK_FCC2, CPM_BRG5, 0},      
153                 {CPM_CLK_FCC2, CPM_BRG6, 1},      
154                 {CPM_CLK_FCC2, CPM_BRG7, 2},      
155                 {CPM_CLK_FCC2, CPM_BRG8, 3},      
156                 {CPM_CLK_FCC2, CPM_CLK13, 4},     
157                 {CPM_CLK_FCC2, CPM_CLK14, 5},     
158                 {CPM_CLK_FCC2, CPM_CLK15, 6},     
159                 {CPM_CLK_FCC2, CPM_CLK16, 7},     
160                 {CPM_CLK_FCC3, CPM_BRG5, 0},      
161                 {CPM_CLK_FCC3, CPM_BRG6, 1},      
162                 {CPM_CLK_FCC3, CPM_BRG7, 2},      
163                 {CPM_CLK_FCC3, CPM_BRG8, 3},      
164                 {CPM_CLK_FCC3, CPM_CLK13, 4},     
165                 {CPM_CLK_FCC3, CPM_CLK14, 5},     
166                 {CPM_CLK_FCC3, CPM_CLK15, 6},     
167                 {CPM_CLK_FCC3, CPM_CLK16, 7},     
168                 {CPM_CLK_SCC1, CPM_BRG1, 0},      
169                 {CPM_CLK_SCC1, CPM_BRG2, 1},      
170                 {CPM_CLK_SCC1, CPM_BRG3, 2},      
171                 {CPM_CLK_SCC1, CPM_BRG4, 3},      
172                 {CPM_CLK_SCC1, CPM_CLK11, 4},     
173                 {CPM_CLK_SCC1, CPM_CLK12, 5},     
174                 {CPM_CLK_SCC1, CPM_CLK3, 6},      
175                 {CPM_CLK_SCC1, CPM_CLK4, 7},      
176                 {CPM_CLK_SCC2, CPM_BRG1, 0},      
177                 {CPM_CLK_SCC2, CPM_BRG2, 1},      
178                 {CPM_CLK_SCC2, CPM_BRG3, 2},      
179                 {CPM_CLK_SCC2, CPM_BRG4, 3},      
180                 {CPM_CLK_SCC2, CPM_CLK11, 4},     
181                 {CPM_CLK_SCC2, CPM_CLK12, 5},     
182                 {CPM_CLK_SCC2, CPM_CLK3, 6},      
183                 {CPM_CLK_SCC2, CPM_CLK4, 7},      
184                 {CPM_CLK_SCC3, CPM_BRG1, 0},      
185                 {CPM_CLK_SCC3, CPM_BRG2, 1},      
186                 {CPM_CLK_SCC3, CPM_BRG3, 2},      
187                 {CPM_CLK_SCC3, CPM_BRG4, 3},      
188                 {CPM_CLK_SCC3, CPM_CLK5, 4},      
189                 {CPM_CLK_SCC3, CPM_CLK6, 5},      
190                 {CPM_CLK_SCC3, CPM_CLK7, 6},      
191                 {CPM_CLK_SCC3, CPM_CLK8, 7},      
192                 {CPM_CLK_SCC4, CPM_BRG1, 0},      
193                 {CPM_CLK_SCC4, CPM_BRG2, 1},      
194                 {CPM_CLK_SCC4, CPM_BRG3, 2},      
195                 {CPM_CLK_SCC4, CPM_BRG4, 3},      
196                 {CPM_CLK_SCC4, CPM_CLK5, 4},      
197                 {CPM_CLK_SCC4, CPM_CLK6, 5},      
198                 {CPM_CLK_SCC4, CPM_CLK7, 6},      
199                 {CPM_CLK_SCC4, CPM_CLK8, 7},      
200         };                                        
201                                                   
202         switch (target) {                         
203         case CPM_CLK_SCC1:                        
204                 reg = &cpm2_immr->im_cpmux.cmx    
205                 shift = 24;                       
206                 break;                            
207         case CPM_CLK_SCC2:                        
208                 reg = &cpm2_immr->im_cpmux.cmx    
209                 shift = 16;                       
210                 break;                            
211         case CPM_CLK_SCC3:                        
212                 reg = &cpm2_immr->im_cpmux.cmx    
213                 shift = 8;                        
214                 break;                            
215         case CPM_CLK_SCC4:                        
216                 reg = &cpm2_immr->im_cpmux.cmx    
217                 shift = 0;                        
218                 break;                            
219         case CPM_CLK_FCC1:                        
220                 reg = &cpm2_immr->im_cpmux.cmx    
221                 shift = 24;                       
222                 break;                            
223         case CPM_CLK_FCC2:                        
224                 reg = &cpm2_immr->im_cpmux.cmx    
225                 shift = 16;                       
226                 break;                            
227         case CPM_CLK_FCC3:                        
228                 reg = &cpm2_immr->im_cpmux.cmx    
229                 shift = 8;                        
230                 break;                            
231         default:                                  
232                 printk(KERN_ERR "cpm2_clock_se    
233                 return -EINVAL;                   
234         }                                         
235                                                   
236         for (i = 0; i < ARRAY_SIZE(clk_map); i    
237                 if (clk_map[i][0] == target &&    
238                         bits = clk_map[i][2];     
239                         break;                    
240                 }                                 
241         }                                         
242         if (i == ARRAY_SIZE(clk_map))             
243             ret = -EINVAL;                        
244                                                   
245         bits <<= shift;                           
246         mask <<= shift;                           
247                                                   
248         if (mode == CPM_CLK_RTX) {                
249                 bits |= bits << 3;                
250                 mask |= mask << 3;                
251         } else if (mode == CPM_CLK_RX) {          
252                 bits <<= 3;                       
253                 mask <<= 3;                       
254         }                                         
255                                                   
256         out_be32(reg, (in_be32(reg) & ~mask) |    
257                                                   
258         return ret;                               
259 }                                                 
260                                                   
261 int __init cpm2_smc_clk_setup(enum cpm_clk_tar    
262 {                                                 
263         int ret = 0;                              
264         int shift;                                
265         int i, bits = 0;                          
266         u8 __iomem *reg;                          
267         u8 mask = 3;                              
268                                                   
269         u8 clk_map[][3] = {                       
270                 {CPM_CLK_SMC1, CPM_BRG1, 0},      
271                 {CPM_CLK_SMC1, CPM_BRG7, 1},      
272                 {CPM_CLK_SMC1, CPM_CLK7, 2},      
273                 {CPM_CLK_SMC1, CPM_CLK9, 3},      
274                 {CPM_CLK_SMC2, CPM_BRG2, 0},      
275                 {CPM_CLK_SMC2, CPM_BRG8, 1},      
276                 {CPM_CLK_SMC2, CPM_CLK4, 2},      
277                 {CPM_CLK_SMC2, CPM_CLK15, 3},     
278         };                                        
279                                                   
280         switch (target) {                         
281         case CPM_CLK_SMC1:                        
282                 reg = &cpm2_immr->im_cpmux.cmx    
283                 mask = 3;                         
284                 shift = 4;                        
285                 break;                            
286         case CPM_CLK_SMC2:                        
287                 reg = &cpm2_immr->im_cpmux.cmx    
288                 mask = 3;                         
289                 shift = 0;                        
290                 break;                            
291         default:                                  
292                 printk(KERN_ERR "cpm2_smc_cloc    
293                 return -EINVAL;                   
294         }                                         
295                                                   
296         for (i = 0; i < ARRAY_SIZE(clk_map); i    
297                 if (clk_map[i][0] == target &&    
298                         bits = clk_map[i][2];     
299                         break;                    
300                 }                                 
301         }                                         
302         if (i == ARRAY_SIZE(clk_map))             
303             ret = -EINVAL;                        
304                                                   
305         bits <<= shift;                           
306         mask <<= shift;                           
307                                                   
308         out_8(reg, (in_8(reg) & ~mask) | bits)    
309                                                   
310         return ret;                               
311 }                                                 
312                                                   
313 struct cpm2_ioports {                             
314         u32 dir, par, sor, odr, dat;              
315         u32 res[3];                               
316 };                                                
317                                                   
318 void __init cpm2_set_pin(int port, int pin, in    
319 {                                                 
320         struct cpm2_ioports __iomem *iop =        
321                 (struct cpm2_ioports __iomem *    
322                                                   
323         pin = 1 << (31 - pin);                    
324                                                   
325         if (flags & CPM_PIN_OUTPUT)               
326                 setbits32(&iop[port].dir, pin)    
327         else                                      
328                 clrbits32(&iop[port].dir, pin)    
329                                                   
330         if (!(flags & CPM_PIN_GPIO))              
331                 setbits32(&iop[port].par, pin)    
332         else                                      
333                 clrbits32(&iop[port].par, pin)    
334                                                   
335         if (flags & CPM_PIN_SECONDARY)            
336                 setbits32(&iop[port].sor, pin)    
337         else                                      
338                 clrbits32(&iop[port].sor, pin)    
339                                                   
340         if (flags & CPM_PIN_OPENDRAIN)            
341                 setbits32(&iop[port].odr, pin)    
342         else                                      
343                 clrbits32(&iop[port].odr, pin)    
344 }                                                 
345                                                   

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php