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

TOMOYO Linux Cross Reference
Linux/arch/arm/mach-omap2/powerdomains3xxx_data.c

Version: ~ [ linux-6.11.5 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.58 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.114 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.169 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.228 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.284 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.322 ] ~ [ 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 ] ~

  1 // SPDX-License-Identifier: GPL-2.0-only
  2 /*
  3  * OMAP3 powerdomain definitions
  4  *
  5  * Copyright (C) 2007-2008, 2011 Texas Instruments, Inc.
  6  * Copyright (C) 2007-2011 Nokia Corporation
  7  *
  8  * Paul Walmsley, Jouni Högander
  9  */
 10 
 11 #include <linux/kernel.h>
 12 #include <linux/init.h>
 13 #include <linux/bug.h>
 14 
 15 #include "soc.h"
 16 #include "powerdomain.h"
 17 #include "powerdomains2xxx_3xxx_data.h"
 18 #include "prcm-common.h"
 19 #include "prm2xxx_3xxx.h"
 20 #include "prm-regbits-34xx.h"
 21 #include "cm2xxx_3xxx.h"
 22 #include "cm-regbits-34xx.h"
 23 
 24 /*
 25  * 34XX-specific powerdomains, dependencies
 26  */
 27 
 28 /*
 29  * Powerdomains
 30  */
 31 
 32 static struct powerdomain iva2_pwrdm = {
 33         .name             = "iva2_pwrdm",
 34         .prcm_offs        = OMAP3430_IVA2_MOD,
 35         .pwrsts           = PWRSTS_OFF_RET_ON,
 36         .pwrsts_logic_ret = PWRSTS_OFF_RET,
 37         .banks            = 4,
 38         .pwrsts_mem_ret   = {
 39                 [0] = PWRSTS_OFF_RET,
 40                 [1] = PWRSTS_OFF_RET,
 41                 [2] = PWRSTS_OFF_RET,
 42                 [3] = PWRSTS_OFF_RET,
 43         },
 44         .pwrsts_mem_on    = {
 45                 [0] = PWRSTS_ON,
 46                 [1] = PWRSTS_ON,
 47                 [2] = PWRSTS_OFF_ON,
 48                 [3] = PWRSTS_ON,
 49         },
 50         .voltdm           = { .name = "mpu_iva" },
 51 };
 52 
 53 static struct powerdomain mpu_3xxx_pwrdm = {
 54         .name             = "mpu_pwrdm",
 55         .prcm_offs        = MPU_MOD,
 56         .pwrsts           = PWRSTS_OFF_RET_ON,
 57         .pwrsts_logic_ret = PWRSTS_OFF_RET,
 58         .flags            = PWRDM_HAS_MPU_QUIRK,
 59         .banks            = 1,
 60         .pwrsts_mem_ret   = {
 61                 [0] = PWRSTS_OFF_RET,
 62         },
 63         .pwrsts_mem_on    = {
 64                 [0] = PWRSTS_OFF_ON,
 65         },
 66         .voltdm           = { .name = "mpu_iva" },
 67 };
 68 
 69 static struct powerdomain mpu_am35x_pwrdm = {
 70         .name             = "mpu_pwrdm",
 71         .prcm_offs        = MPU_MOD,
 72         .pwrsts           = PWRSTS_ON,
 73         .pwrsts_logic_ret = PWRSTS_ON,
 74         .flags            = PWRDM_HAS_MPU_QUIRK,
 75         .banks            = 1,
 76         .pwrsts_mem_ret   = {
 77                 [0] = PWRSTS_ON,
 78         },
 79         .pwrsts_mem_on    = {
 80                 [0] = PWRSTS_ON,
 81         },
 82         .voltdm           = { .name = "mpu_iva" },
 83 };
 84 
 85 /*
 86  * The USBTLL Save-and-Restore mechanism is broken on
 87  * 3430s up to ES3.0 and 3630ES1.0. Hence this feature
 88  * needs to be disabled on these chips.
 89  * Refer: 3430 errata ID i459 and 3630 errata ID i579
 90  *
 91  * Note: setting the SAR flag could help for errata ID i478
 92  *  which applies to 3430 <= ES3.1, but since the SAR feature
 93  *  is broken, do not use it.
 94  */
 95 static struct powerdomain core_3xxx_pre_es3_1_pwrdm = {
 96         .name             = "core_pwrdm",
 97         .prcm_offs        = CORE_MOD,
 98         .pwrsts           = PWRSTS_OFF_RET_ON,
 99         .pwrsts_logic_ret = PWRSTS_OFF_RET,
100         .banks            = 2,
101         .pwrsts_mem_ret   = {
102                 [0] = PWRSTS_OFF_RET,    /* MEM1RETSTATE */
103                 [1] = PWRSTS_OFF_RET,    /* MEM2RETSTATE */
104         },
105         .pwrsts_mem_on    = {
106                 [0] = PWRSTS_OFF_RET_ON, /* MEM1ONSTATE */
107                 [1] = PWRSTS_OFF_RET_ON, /* MEM2ONSTATE */
108         },
109         .voltdm           = { .name = "core" },
110 };
111 
112 static struct powerdomain core_3xxx_es3_1_pwrdm = {
113         .name             = "core_pwrdm",
114         .prcm_offs        = CORE_MOD,
115         .pwrsts           = PWRSTS_OFF_RET_ON,
116         .pwrsts_logic_ret = PWRSTS_OFF_RET,
117         /*
118          * Setting the SAR flag for errata ID i478 which applies
119          *  to 3430 <= ES3.1
120          */
121         .flags            = PWRDM_HAS_HDWR_SAR, /* for USBTLL only */
122         .banks            = 2,
123         .pwrsts_mem_ret   = {
124                 [0] = PWRSTS_OFF_RET,    /* MEM1RETSTATE */
125                 [1] = PWRSTS_OFF_RET,    /* MEM2RETSTATE */
126         },
127         .pwrsts_mem_on    = {
128                 [0] = PWRSTS_OFF_RET_ON, /* MEM1ONSTATE */
129                 [1] = PWRSTS_OFF_RET_ON, /* MEM2ONSTATE */
130         },
131         .voltdm           = { .name = "core" },
132 };
133 
134 static struct powerdomain core_am35x_pwrdm = {
135         .name             = "core_pwrdm",
136         .prcm_offs        = CORE_MOD,
137         .pwrsts           = PWRSTS_ON,
138         .pwrsts_logic_ret = PWRSTS_ON,
139         .banks            = 2,
140         .pwrsts_mem_ret   = {
141                 [0] = PWRSTS_ON,         /* MEM1RETSTATE */
142                 [1] = PWRSTS_ON,         /* MEM2RETSTATE */
143         },
144         .pwrsts_mem_on    = {
145                 [0] = PWRSTS_ON, /* MEM1ONSTATE */
146                 [1] = PWRSTS_ON, /* MEM2ONSTATE */
147         },
148         .voltdm           = { .name = "core" },
149 };
150 
151 static struct powerdomain dss_pwrdm = {
152         .name             = "dss_pwrdm",
153         .prcm_offs        = OMAP3430_DSS_MOD,
154         .pwrsts           = PWRSTS_OFF_RET_ON,
155         .pwrsts_logic_ret = PWRSTS_RET,
156         .banks            = 1,
157         .pwrsts_mem_ret   = {
158                 [0] = PWRSTS_RET, /* MEMRETSTATE */
159         },
160         .pwrsts_mem_on    = {
161                 [0] = PWRSTS_ON,  /* MEMONSTATE */
162         },
163         .voltdm           = { .name = "core" },
164 };
165 
166 static struct powerdomain dss_am35x_pwrdm = {
167         .name             = "dss_pwrdm",
168         .prcm_offs        = OMAP3430_DSS_MOD,
169         .pwrsts           = PWRSTS_ON,
170         .pwrsts_logic_ret = PWRSTS_ON,
171         .banks            = 1,
172         .pwrsts_mem_ret   = {
173                 [0] = PWRSTS_ON, /* MEMRETSTATE */
174         },
175         .pwrsts_mem_on    = {
176                 [0] = PWRSTS_ON,  /* MEMONSTATE */
177         },
178         .voltdm           = { .name = "core" },
179 };
180 
181 /*
182  * Although the 34XX TRM Rev K Table 4-371 notes that retention is a
183  * possible SGX powerstate, the SGX device itself does not support
184  * retention.
185  */
186 static struct powerdomain sgx_pwrdm = {
187         .name             = "sgx_pwrdm",
188         .prcm_offs        = OMAP3430ES2_SGX_MOD,
189         /* XXX This is accurate for 3430 SGX, but what about GFX? */
190         .pwrsts           = PWRSTS_OFF_ON,
191         .pwrsts_logic_ret = PWRSTS_RET,
192         .banks            = 1,
193         .pwrsts_mem_ret   = {
194                 [0] = PWRSTS_RET, /* MEMRETSTATE */
195         },
196         .pwrsts_mem_on    = {
197                 [0] = PWRSTS_ON,  /* MEMONSTATE */
198         },
199         .voltdm           = { .name = "core" },
200 };
201 
202 static struct powerdomain sgx_am35x_pwrdm = {
203         .name             = "sgx_pwrdm",
204         .prcm_offs        = OMAP3430ES2_SGX_MOD,
205         .pwrsts           = PWRSTS_ON,
206         .pwrsts_logic_ret = PWRSTS_ON,
207         .banks            = 1,
208         .pwrsts_mem_ret   = {
209                 [0] = PWRSTS_ON, /* MEMRETSTATE */
210         },
211         .pwrsts_mem_on    = {
212                 [0] = PWRSTS_ON,  /* MEMONSTATE */
213         },
214         .voltdm           = { .name = "core" },
215 };
216 
217 static struct powerdomain cam_pwrdm = {
218         .name             = "cam_pwrdm",
219         .prcm_offs        = OMAP3430_CAM_MOD,
220         .pwrsts           = PWRSTS_OFF_RET_ON,
221         .pwrsts_logic_ret = PWRSTS_RET,
222         .banks            = 1,
223         .pwrsts_mem_ret   = {
224                 [0] = PWRSTS_RET, /* MEMRETSTATE */
225         },
226         .pwrsts_mem_on    = {
227                 [0] = PWRSTS_ON,  /* MEMONSTATE */
228         },
229         .voltdm           = { .name = "core" },
230 };
231 
232 static struct powerdomain per_pwrdm = {
233         .name             = "per_pwrdm",
234         .prcm_offs        = OMAP3430_PER_MOD,
235         .pwrsts           = PWRSTS_OFF_RET_ON,
236         .pwrsts_logic_ret = PWRSTS_OFF_RET,
237         .banks            = 1,
238         .pwrsts_mem_ret   = {
239                 [0] = PWRSTS_RET, /* MEMRETSTATE */
240         },
241         .pwrsts_mem_on    = {
242                 [0] = PWRSTS_ON,  /* MEMONSTATE */
243         },
244         .voltdm           = { .name = "core" },
245 };
246 
247 static struct powerdomain per_am35x_pwrdm = {
248         .name             = "per_pwrdm",
249         .prcm_offs        = OMAP3430_PER_MOD,
250         .pwrsts           = PWRSTS_ON,
251         .pwrsts_logic_ret = PWRSTS_ON,
252         .banks            = 1,
253         .pwrsts_mem_ret   = {
254                 [0] = PWRSTS_ON, /* MEMRETSTATE */
255         },
256         .pwrsts_mem_on    = {
257                 [0] = PWRSTS_ON,  /* MEMONSTATE */
258         },
259         .voltdm           = { .name = "core" },
260 };
261 
262 static struct powerdomain emu_pwrdm = {
263         .name           = "emu_pwrdm",
264         .prcm_offs      = OMAP3430_EMU_MOD,
265         .voltdm           = { .name = "core" },
266 };
267 
268 static struct powerdomain neon_pwrdm = {
269         .name             = "neon_pwrdm",
270         .prcm_offs        = OMAP3430_NEON_MOD,
271         .pwrsts           = PWRSTS_OFF_RET_ON,
272         .pwrsts_logic_ret = PWRSTS_RET,
273         .voltdm           = { .name = "mpu_iva" },
274 };
275 
276 static struct powerdomain neon_am35x_pwrdm = {
277         .name             = "neon_pwrdm",
278         .prcm_offs        = OMAP3430_NEON_MOD,
279         .pwrsts           = PWRSTS_ON,
280         .pwrsts_logic_ret = PWRSTS_ON,
281         .voltdm           = { .name = "mpu_iva" },
282 };
283 
284 static struct powerdomain usbhost_pwrdm = {
285         .name             = "usbhost_pwrdm",
286         .prcm_offs        = OMAP3430ES2_USBHOST_MOD,
287         .pwrsts           = PWRSTS_OFF_RET_ON,
288         .pwrsts_logic_ret = PWRSTS_RET,
289         /*
290          * REVISIT: Enabling usb host save and restore mechanism seems to
291          * leave the usb host domain permanently in ACTIVE mode after
292          * changing the usb host power domain state from OFF to active once.
293          * Disabling for now.
294          */
295         /*.flags          = PWRDM_HAS_HDWR_SAR,*/ /* for USBHOST ctrlr only */
296         .banks            = 1,
297         .pwrsts_mem_ret   = {
298                 [0] = PWRSTS_RET, /* MEMRETSTATE */
299         },
300         .pwrsts_mem_on    = {
301                 [0] = PWRSTS_ON,  /* MEMONSTATE */
302         },
303         .voltdm           = { .name = "core" },
304 };
305 
306 static struct powerdomain dpll1_pwrdm = {
307         .name           = "dpll1_pwrdm",
308         .prcm_offs      = MPU_MOD,
309         .voltdm           = { .name = "mpu_iva" },
310 };
311 
312 static struct powerdomain dpll2_pwrdm = {
313         .name           = "dpll2_pwrdm",
314         .prcm_offs      = OMAP3430_IVA2_MOD,
315         .voltdm           = { .name = "mpu_iva" },
316 };
317 
318 static struct powerdomain dpll3_pwrdm = {
319         .name           = "dpll3_pwrdm",
320         .prcm_offs      = PLL_MOD,
321         .voltdm           = { .name = "core" },
322 };
323 
324 static struct powerdomain dpll4_pwrdm = {
325         .name           = "dpll4_pwrdm",
326         .prcm_offs      = PLL_MOD,
327         .voltdm           = { .name = "core" },
328 };
329 
330 static struct powerdomain dpll5_pwrdm = {
331         .name           = "dpll5_pwrdm",
332         .prcm_offs      = PLL_MOD,
333         .voltdm           = { .name = "core" },
334 };
335 
336 static struct powerdomain alwon_81xx_pwrdm = {
337         .name             = "alwon_pwrdm",
338         .prcm_offs        = TI81XX_PRM_ALWON_MOD,
339         .pwrsts           = PWRSTS_OFF_ON,
340         .voltdm           = { .name = "core" },
341 };
342 
343 static struct powerdomain device_81xx_pwrdm = {
344         .name             = "device_pwrdm",
345         .prcm_offs        = TI81XX_PRM_DEVICE_MOD,
346         .voltdm           = { .name = "core" },
347 };
348 
349 static struct powerdomain gem_814x_pwrdm = {
350         .name           = "gem_pwrdm",
351         .prcm_offs      = TI814X_PRM_DSP_MOD,
352         .pwrsts         = PWRSTS_OFF_ON,
353         .voltdm         = { .name = "dsp" },
354 };
355 
356 static struct powerdomain ivahd_814x_pwrdm = {
357         .name           = "ivahd_pwrdm",
358         .prcm_offs      = TI814X_PRM_HDVICP_MOD,
359         .pwrsts         = PWRSTS_OFF_ON,
360         .voltdm         = { .name = "iva" },
361 };
362 
363 static struct powerdomain hdvpss_814x_pwrdm = {
364         .name           = "hdvpss_pwrdm",
365         .prcm_offs      = TI814X_PRM_HDVPSS_MOD,
366         .pwrsts         = PWRSTS_OFF_ON,
367         .voltdm         = { .name = "dsp" },
368 };
369 
370 static struct powerdomain sgx_814x_pwrdm = {
371         .name           = "sgx_pwrdm",
372         .prcm_offs      = TI814X_PRM_GFX_MOD,
373         .pwrsts         = PWRSTS_OFF_ON,
374         .voltdm         = { .name = "core" },
375 };
376 
377 static struct powerdomain isp_814x_pwrdm = {
378         .name           = "isp_pwrdm",
379         .prcm_offs      = TI814X_PRM_ISP_MOD,
380         .pwrsts         = PWRSTS_OFF_ON,
381         .voltdm         = { .name = "core" },
382 };
383 
384 static struct powerdomain active_81xx_pwrdm = {
385         .name             = "active_pwrdm",
386         .prcm_offs        = TI816X_PRM_ACTIVE_MOD,
387         .pwrsts           = PWRSTS_OFF_ON,
388         .voltdm           = { .name = "core" },
389 };
390 
391 static struct powerdomain default_81xx_pwrdm = {
392         .name             = "default_pwrdm",
393         .prcm_offs        = TI81XX_PRM_DEFAULT_MOD,
394         .pwrsts           = PWRSTS_OFF_ON,
395         .voltdm           = { .name = "core" },
396 };
397 
398 static struct powerdomain ivahd0_816x_pwrdm = {
399         .name             = "ivahd0_pwrdm",
400         .prcm_offs        = TI816X_PRM_IVAHD0_MOD,
401         .pwrsts           = PWRSTS_OFF_ON,
402         .voltdm           = { .name = "mpu_iva" },
403 };
404 
405 static struct powerdomain ivahd1_816x_pwrdm = {
406         .name             = "ivahd1_pwrdm",
407         .prcm_offs        = TI816X_PRM_IVAHD1_MOD,
408         .pwrsts           = PWRSTS_OFF_ON,
409         .voltdm           = { .name = "mpu_iva" },
410 };
411 
412 static struct powerdomain ivahd2_816x_pwrdm = {
413         .name             = "ivahd2_pwrdm",
414         .prcm_offs        = TI816X_PRM_IVAHD2_MOD,
415         .pwrsts           = PWRSTS_OFF_ON,
416         .voltdm           = { .name = "mpu_iva" },
417 };
418 
419 static struct powerdomain sgx_816x_pwrdm = {
420         .name             = "sgx_pwrdm",
421         .prcm_offs        = TI816X_PRM_SGX_MOD,
422         .pwrsts           = PWRSTS_OFF_ON,
423         .voltdm           = { .name = "core" },
424 };
425 
426 /* As powerdomains are added or removed above, this list must also be changed */
427 static struct powerdomain *powerdomains_omap3430_common[] __initdata = {
428         &wkup_omap2_pwrdm,
429         &iva2_pwrdm,
430         &mpu_3xxx_pwrdm,
431         &neon_pwrdm,
432         &cam_pwrdm,
433         &dss_pwrdm,
434         &per_pwrdm,
435         &emu_pwrdm,
436         &dpll1_pwrdm,
437         &dpll2_pwrdm,
438         &dpll3_pwrdm,
439         &dpll4_pwrdm,
440         NULL
441 };
442 
443 static struct powerdomain *powerdomains_omap3430es1[] __initdata = {
444         &gfx_omap2_pwrdm,
445         &core_3xxx_pre_es3_1_pwrdm,
446         NULL
447 };
448 
449 /* also includes 3630ES1.0 */
450 static struct powerdomain *powerdomains_omap3430es2_es3_0[] __initdata = {
451         &core_3xxx_pre_es3_1_pwrdm,
452         &sgx_pwrdm,
453         &usbhost_pwrdm,
454         &dpll5_pwrdm,
455         NULL
456 };
457 
458 /* also includes 3630ES1.1+ */
459 static struct powerdomain *powerdomains_omap3430es3_1plus[] __initdata = {
460         &core_3xxx_es3_1_pwrdm,
461         &sgx_pwrdm,
462         &usbhost_pwrdm,
463         &dpll5_pwrdm,
464         NULL
465 };
466 
467 static struct powerdomain *powerdomains_am35x[] __initdata = {
468         &wkup_omap2_pwrdm,
469         &mpu_am35x_pwrdm,
470         &neon_am35x_pwrdm,
471         &core_am35x_pwrdm,
472         &sgx_am35x_pwrdm,
473         &dss_am35x_pwrdm,
474         &per_am35x_pwrdm,
475         &emu_pwrdm,
476         &dpll1_pwrdm,
477         &dpll3_pwrdm,
478         &dpll4_pwrdm,
479         &dpll5_pwrdm,
480         NULL
481 };
482 
483 static struct powerdomain *powerdomains_ti814x[] __initdata = {
484         &alwon_81xx_pwrdm,
485         &device_81xx_pwrdm,
486         &active_81xx_pwrdm,
487         &default_81xx_pwrdm,
488         &gem_814x_pwrdm,
489         &ivahd_814x_pwrdm,
490         &hdvpss_814x_pwrdm,
491         &sgx_814x_pwrdm,
492         &isp_814x_pwrdm,
493         NULL
494 };
495 
496 static struct powerdomain *powerdomains_ti816x[] __initdata = {
497         &alwon_81xx_pwrdm,
498         &device_81xx_pwrdm,
499         &active_81xx_pwrdm,
500         &default_81xx_pwrdm,
501         &ivahd0_816x_pwrdm,
502         &ivahd1_816x_pwrdm,
503         &ivahd2_816x_pwrdm,
504         &sgx_816x_pwrdm,
505         NULL
506 };
507 
508 /* TI81XX specific ops */
509 #define TI81XX_PM_PWSTCTRL                              0x0000
510 #define TI81XX_RM_RSTCTRL                               0x0010
511 #define TI81XX_PM_PWSTST                                0x0004
512 
513 static int ti81xx_pwrdm_set_next_pwrst(struct powerdomain *pwrdm, u8 pwrst)
514 {
515         omap2_prm_rmw_mod_reg_bits(OMAP_POWERSTATE_MASK,
516                                    (pwrst << OMAP_POWERSTATE_SHIFT),
517                                    pwrdm->prcm_offs, TI81XX_PM_PWSTCTRL);
518         return 0;
519 }
520 
521 static int ti81xx_pwrdm_read_next_pwrst(struct powerdomain *pwrdm)
522 {
523         return omap2_prm_read_mod_bits_shift(pwrdm->prcm_offs,
524                                              TI81XX_PM_PWSTCTRL,
525                                              OMAP_POWERSTATE_MASK);
526 }
527 
528 static int ti81xx_pwrdm_read_pwrst(struct powerdomain *pwrdm)
529 {
530         return omap2_prm_read_mod_bits_shift(pwrdm->prcm_offs,
531                 (pwrdm->prcm_offs == TI814X_PRM_GFX_MOD) ? TI81XX_RM_RSTCTRL :
532                                              TI81XX_PM_PWSTST,
533                                              OMAP_POWERSTATEST_MASK);
534 }
535 
536 static int ti81xx_pwrdm_read_logic_pwrst(struct powerdomain *pwrdm)
537 {
538         return omap2_prm_read_mod_bits_shift(pwrdm->prcm_offs,
539                 (pwrdm->prcm_offs == TI814X_PRM_GFX_MOD) ? TI81XX_RM_RSTCTRL :
540                                              TI81XX_PM_PWSTST,
541                                              OMAP3430_LOGICSTATEST_MASK);
542 }
543 
544 static int ti81xx_pwrdm_wait_transition(struct powerdomain *pwrdm)
545 {
546         u32 c = 0;
547 
548         while ((omap2_prm_read_mod_reg(pwrdm->prcm_offs,
549                 (pwrdm->prcm_offs == TI814X_PRM_GFX_MOD) ? TI81XX_RM_RSTCTRL :
550                                        TI81XX_PM_PWSTST) &
551                 OMAP_INTRANSITION_MASK) &&
552                 (c++ < PWRDM_TRANSITION_BAILOUT))
553                         udelay(1);
554 
555         if (c > PWRDM_TRANSITION_BAILOUT) {
556                 pr_err("powerdomain: %s timeout waiting for transition\n",
557                        pwrdm->name);
558                 return -EAGAIN;
559         }
560 
561         pr_debug("powerdomain: completed transition in %d loops\n", c);
562 
563         return 0;
564 }
565 
566 /* For dm814x we need to fix up fix GFX pwstst and rstctrl reg offsets */
567 static struct pwrdm_ops ti81xx_pwrdm_operations = {
568         .pwrdm_set_next_pwrst   = ti81xx_pwrdm_set_next_pwrst,
569         .pwrdm_read_next_pwrst  = ti81xx_pwrdm_read_next_pwrst,
570         .pwrdm_read_pwrst       = ti81xx_pwrdm_read_pwrst,
571         .pwrdm_read_logic_pwrst = ti81xx_pwrdm_read_logic_pwrst,
572         .pwrdm_wait_transition  = ti81xx_pwrdm_wait_transition,
573 };
574 
575 void __init omap3xxx_powerdomains_init(void)
576 {
577         unsigned int rev;
578 
579         if (!cpu_is_omap34xx() && !cpu_is_ti81xx())
580                 return;
581 
582         /* Only 81xx needs custom pwrdm_operations */
583         if (!cpu_is_ti81xx())
584                 pwrdm_register_platform_funcs(&omap3_pwrdm_operations);
585 
586         rev = omap_rev();
587 
588         if (rev == AM35XX_REV_ES1_0 || rev == AM35XX_REV_ES1_1) {
589                 pwrdm_register_pwrdms(powerdomains_am35x);
590         } else if (rev == TI8148_REV_ES1_0 || rev == TI8148_REV_ES2_0 ||
591                    rev == TI8148_REV_ES2_1) {
592                 pwrdm_register_platform_funcs(&ti81xx_pwrdm_operations);
593                 pwrdm_register_pwrdms(powerdomains_ti814x);
594         } else if (rev == TI8168_REV_ES1_0 || rev == TI8168_REV_ES1_1
595                         || rev == TI8168_REV_ES2_0 || rev == TI8168_REV_ES2_1) {
596                 pwrdm_register_platform_funcs(&ti81xx_pwrdm_operations);
597                 pwrdm_register_pwrdms(powerdomains_ti816x);
598         } else {
599                 pwrdm_register_pwrdms(powerdomains_omap3430_common);
600 
601                 switch (rev) {
602                 case OMAP3430_REV_ES1_0:
603                         pwrdm_register_pwrdms(powerdomains_omap3430es1);
604                         break;
605                 case OMAP3430_REV_ES2_0:
606                 case OMAP3430_REV_ES2_1:
607                 case OMAP3430_REV_ES3_0:
608                 case OMAP3630_REV_ES1_0:
609                         pwrdm_register_pwrdms(powerdomains_omap3430es2_es3_0);
610                         break;
611                 case OMAP3430_REV_ES3_1:
612                 case OMAP3430_REV_ES3_1_2:
613                 case OMAP3630_REV_ES1_1:
614                 case OMAP3630_REV_ES1_2:
615                         pwrdm_register_pwrdms(powerdomains_omap3430es3_1plus);
616                         break;
617                 default:
618                         WARN(1, "OMAP3 powerdomain init: unknown chip type\n");
619                 }
620         }
621 
622         pwrdm_complete_init();
623 }
624 

~ [ 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