linux/arch/arm/mach-omap2/soc.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0-or-later */
   2/*
   3 * OMAP cpu type detection
   4 *
   5 * Copyright (C) 2004, 2008 Nokia Corporation
   6 *
   7 * Copyright (C) 2009-11 Texas Instruments.
   8 *
   9 * Written by Tony Lindgren <tony.lindgren@nokia.com>
  10 *
  11 * Added OMAP4/5 specific defines - Santosh Shilimkar<santosh.shilimkar@ti.com>
  12 * Added DRA7xxx specific defines - Sricharan R<r.sricharan@ti.com>
  13 */
  14
  15#include "omap24xx.h"
  16#include "omap34xx.h"
  17#include "omap44xx.h"
  18#include "ti81xx.h"
  19#include "am33xx.h"
  20#include "omap54xx.h"
  21
  22#ifndef __ASSEMBLY__
  23
  24#include <linux/bitops.h>
  25#include <linux/of.h>
  26
  27/*
  28 * OMAP2+ is always defined as ARCH_MULTIPLATFORM in Kconfig
  29 */
  30#undef MULTI_OMAP2
  31#define MULTI_OMAP2
  32
  33/*
  34 * Omap device type i.e. EMU/HS/TST/GP/BAD
  35 */
  36#define OMAP2_DEVICE_TYPE_TEST          0
  37#define OMAP2_DEVICE_TYPE_EMU           1
  38#define OMAP2_DEVICE_TYPE_SEC           2
  39#define OMAP2_DEVICE_TYPE_GP            3
  40#define OMAP2_DEVICE_TYPE_BAD           4
  41
  42int omap_type(void);
  43
  44/*
  45 * omap_rev bits:
  46 * SoC id bits  (0730, 1510, 1710, 2422...)     [31:16]
  47 * SoC revision (See _REV_ defined in cpu.h)    [15:08]
  48 * SoC class bits (15xx, 16xx, 24xx, 34xx...)   [07:00]
  49 */
  50unsigned int omap_rev(void);
  51
  52static inline int soc_is_omap(void)
  53{
  54        return omap_rev() != 0;
  55}
  56
  57/*
  58 * Get the SoC revision for OMAP devices
  59 */
  60#define GET_OMAP_REVISION()     ((omap_rev() >> 8) & 0xff)
  61
  62/*
  63 * Macros to group OMAP into cpu classes.
  64 * These can be used in most places.
  65 * soc_is_omap24xx():   True for OMAP2420, OMAP2422, OMAP2423, OMAP2430
  66 * soc_is_omap242x():   True for OMAP2420, OMAP2422, OMAP2423
  67 * soc_is_omap243x():   True for OMAP2430
  68 * soc_is_omap343x():   True for OMAP3430
  69 * soc_is_omap443x():   True for OMAP4430
  70 * soc_is_omap446x():   True for OMAP4460
  71 * soc_is_omap447x():   True for OMAP4470
  72 * soc_is_omap543x():   True for OMAP5430, OMAP5432
  73 */
  74#define GET_OMAP_CLASS  (omap_rev() & 0xff)
  75
  76#define IS_OMAP_CLASS(class, id)                        \
  77static inline int is_omap ##class (void)                \
  78{                                                       \
  79        return (GET_OMAP_CLASS == (id)) ? 1 : 0;        \
  80}
  81
  82#define GET_AM_CLASS    ((omap_rev() >> 24) & 0xff)
  83
  84#define IS_AM_CLASS(class, id)                          \
  85static inline int is_am ##class (void)                  \
  86{                                                       \
  87        return (GET_AM_CLASS == (id)) ? 1 : 0;          \
  88}
  89
  90#define GET_TI_CLASS    ((omap_rev() >> 24) & 0xff)
  91
  92#define IS_TI_CLASS(class, id)                  \
  93static inline int is_ti ##class (void)          \
  94{                                                       \
  95        return (GET_TI_CLASS == (id)) ? 1 : 0;  \
  96}
  97
  98#define GET_DRA_CLASS   ((omap_rev() >> 24) & 0xff)
  99
 100#define IS_DRA_CLASS(class, id)                         \
 101static inline int is_dra ##class (void)                 \
 102{                                                       \
 103        return (GET_DRA_CLASS == (id)) ? 1 : 0;         \
 104}
 105
 106#define GET_OMAP_SUBCLASS       ((omap_rev() >> 20) & 0x0fff)
 107
 108#define IS_OMAP_SUBCLASS(subclass, id)                  \
 109static inline int is_omap ##subclass (void)             \
 110{                                                       \
 111        return (GET_OMAP_SUBCLASS == (id)) ? 1 : 0;     \
 112}
 113
 114#define IS_TI_SUBCLASS(subclass, id)                    \
 115static inline int is_ti ##subclass (void)               \
 116{                                                       \
 117        return (GET_OMAP_SUBCLASS == (id)) ? 1 : 0;     \
 118}
 119
 120#define IS_AM_SUBCLASS(subclass, id)                    \
 121static inline int is_am ##subclass (void)               \
 122{                                                       \
 123        return (GET_OMAP_SUBCLASS == (id)) ? 1 : 0;     \
 124}
 125
 126#define IS_DRA_SUBCLASS(subclass, id)                   \
 127static inline int is_dra ##subclass (void)              \
 128{                                                       \
 129        return (GET_OMAP_SUBCLASS == (id)) ? 1 : 0;     \
 130}
 131
 132#define GET_DRA_PACKAGE         (omap_rev() & 0xff)
 133
 134#define IS_DRA_SUBCLASS_PACKAGE(subclass, package, id)                  \
 135static inline int is_dra ##subclass ##_ ##package (void)                \
 136{                                                                       \
 137        return (is_dra ##subclass () && GET_DRA_PACKAGE == id) ? 1 : 0; \
 138}
 139
 140IS_OMAP_CLASS(24xx, 0x24)
 141IS_OMAP_CLASS(34xx, 0x34)
 142IS_OMAP_CLASS(44xx, 0x44)
 143IS_AM_CLASS(35xx, 0x35)
 144IS_OMAP_CLASS(54xx, 0x54)
 145IS_AM_CLASS(33xx, 0x33)
 146IS_AM_CLASS(43xx, 0x43)
 147
 148IS_TI_CLASS(81xx, 0x81)
 149IS_DRA_CLASS(7xx, 0x7)
 150
 151IS_OMAP_SUBCLASS(242x, 0x242)
 152IS_OMAP_SUBCLASS(243x, 0x243)
 153IS_OMAP_SUBCLASS(343x, 0x343)
 154IS_OMAP_SUBCLASS(363x, 0x363)
 155IS_OMAP_SUBCLASS(443x, 0x443)
 156IS_OMAP_SUBCLASS(446x, 0x446)
 157IS_OMAP_SUBCLASS(447x, 0x447)
 158IS_OMAP_SUBCLASS(543x, 0x543)
 159
 160IS_TI_SUBCLASS(816x, 0x816)
 161IS_TI_SUBCLASS(814x, 0x814)
 162IS_AM_SUBCLASS(335x, 0x335)
 163IS_AM_SUBCLASS(437x, 0x437)
 164IS_DRA_SUBCLASS(76x, 0x76)
 165IS_DRA_SUBCLASS_PACKAGE(76x, abz, 2)
 166IS_DRA_SUBCLASS_PACKAGE(76x, acd, 3)
 167IS_DRA_SUBCLASS(75x, 0x75)
 168IS_DRA_SUBCLASS(72x, 0x72)
 169
 170#define soc_is_ti81xx()                 0
 171#define soc_is_ti816x()                 0
 172#define soc_is_ti814x()                 0
 173#define soc_is_am35xx()                 0
 174#define soc_is_am33xx()                 0
 175#define soc_is_am335x()                 0
 176#define soc_is_am43xx()                 0
 177#define soc_is_am437x()                 0
 178#define soc_is_omap44xx()               0
 179#define soc_is_omap443x()               0
 180#define soc_is_omap446x()               0
 181#define soc_is_omap447x()               0
 182#define soc_is_omap54xx()               0
 183#define soc_is_omap543x()               0
 184#define soc_is_dra7xx()                 0
 185#define soc_is_dra76x()                 0
 186#define soc_is_dra74x()                 0
 187#define soc_is_dra72x()                 0
 188
 189#if defined(CONFIG_ARCH_OMAP2)
 190# define soc_is_omap24xx()              is_omap24xx()
 191#else
 192# define soc_is_omap24xx()              0
 193#endif
 194#if defined(CONFIG_SOC_OMAP2420)
 195# define soc_is_omap242x()              is_omap242x()
 196#else
 197# define soc_is_omap242x()              0
 198#endif
 199#if defined(CONFIG_SOC_OMAP2430)
 200# define soc_is_omap243x()              is_omap243x()
 201#else
 202# define soc_is_omap243x()              0
 203#endif
 204#if defined(CONFIG_ARCH_OMAP3)
 205# define soc_is_omap34xx()              is_omap34xx()
 206# define soc_is_omap343x()              is_omap343x()
 207#else
 208# define soc_is_omap34xx()              0
 209# define soc_is_omap343x()              0
 210#endif
 211
 212/*
 213 * Macros to detect individual cpu types.
 214 * These are only rarely needed.
 215 * soc_is_omap2420():   True for OMAP2420
 216 * soc_is_omap2422():   True for OMAP2422
 217 * soc_is_omap2423():   True for OMAP2423
 218 * soc_is_omap2430():   True for OMAP2430
 219 * soc_is_omap3430():   True for OMAP3430
 220 */
 221#define GET_OMAP_TYPE   ((omap_rev() >> 16) & 0xffff)
 222
 223#define IS_OMAP_TYPE(type, id)                          \
 224static inline int is_omap ##type (void)                 \
 225{                                                       \
 226        return (GET_OMAP_TYPE == (id)) ? 1 : 0;         \
 227}
 228
 229IS_OMAP_TYPE(2420, 0x2420)
 230IS_OMAP_TYPE(2422, 0x2422)
 231IS_OMAP_TYPE(2423, 0x2423)
 232IS_OMAP_TYPE(2430, 0x2430)
 233IS_OMAP_TYPE(3430, 0x3430)
 234
 235#define soc_is_omap2420()               0
 236#define soc_is_omap2422()               0
 237#define soc_is_omap2423()               0
 238#define soc_is_omap2430()               0
 239#define soc_is_omap3430()               0
 240#define soc_is_omap3630()               0
 241#define soc_is_omap5430()               0
 242
 243/* These are needed for the common code */
 244#define soc_is_omap7xx()                0
 245#define soc_is_omap15xx()               0
 246#define soc_is_omap16xx()               0
 247#define soc_is_omap1510()               0
 248#define soc_is_omap1610()               0
 249#define soc_is_omap1611()               0
 250#define soc_is_omap1621()               0
 251#define soc_is_omap1710()               0
 252#define cpu_class_is_omap1()            0
 253#define cpu_class_is_omap2()            1
 254
 255#if defined(CONFIG_ARCH_OMAP2)
 256# undef  soc_is_omap2420
 257# undef  soc_is_omap2422
 258# undef  soc_is_omap2423
 259# undef  soc_is_omap2430
 260# define soc_is_omap2420()              is_omap2420()
 261# define soc_is_omap2422()              is_omap2422()
 262# define soc_is_omap2423()              is_omap2423()
 263# define soc_is_omap2430()              is_omap2430()
 264#endif
 265
 266#if defined(CONFIG_ARCH_OMAP3)
 267# undef soc_is_omap3430
 268# undef soc_is_ti81xx
 269# undef soc_is_ti816x
 270# undef soc_is_ti814x
 271# undef soc_is_am35xx
 272# define soc_is_omap3430()              is_omap3430()
 273# undef soc_is_omap3630
 274# define soc_is_omap3630()              is_omap363x()
 275# define soc_is_ti81xx()                is_ti81xx()
 276# define soc_is_ti816x()                is_ti816x()
 277# define soc_is_ti814x()                is_ti814x()
 278# define soc_is_am35xx()                is_am35xx()
 279#endif
 280
 281# if defined(CONFIG_SOC_AM33XX)
 282# undef soc_is_am33xx
 283# undef soc_is_am335x
 284# define soc_is_am33xx()                is_am33xx()
 285# define soc_is_am335x()                is_am335x()
 286#endif
 287
 288#ifdef  CONFIG_SOC_AM43XX
 289# undef soc_is_am43xx
 290# undef soc_is_am437x
 291# define soc_is_am43xx()                is_am43xx()
 292# define soc_is_am437x()                is_am437x()
 293#endif
 294
 295# if defined(CONFIG_ARCH_OMAP4)
 296# undef soc_is_omap44xx
 297# undef soc_is_omap443x
 298# undef soc_is_omap446x
 299# undef soc_is_omap447x
 300# define soc_is_omap44xx()              is_omap44xx()
 301# define soc_is_omap443x()              is_omap443x()
 302# define soc_is_omap446x()              is_omap446x()
 303# define soc_is_omap447x()              is_omap447x()
 304# endif
 305
 306# if defined(CONFIG_SOC_OMAP5)
 307# undef soc_is_omap54xx
 308# undef soc_is_omap543x
 309# define soc_is_omap54xx()              is_omap54xx()
 310# define soc_is_omap543x()              is_omap543x()
 311#endif
 312
 313#if defined(CONFIG_SOC_DRA7XX)
 314#undef soc_is_dra7xx
 315#undef soc_is_dra76x
 316#undef soc_is_dra76x_abz
 317#undef soc_is_dra76x_acd
 318#undef soc_is_dra74x
 319#undef soc_is_dra72x
 320#define soc_is_dra7xx() is_dra7xx()
 321#define soc_is_dra76x() is_dra76x()
 322#define soc_is_dra76x_abz()     is_dra76x_abz()
 323#define soc_is_dra76x_acd()     is_dra76x_acd()
 324#define soc_is_dra74x() is_dra75x()
 325#define soc_is_dra72x() is_dra72x()
 326#endif
 327
 328/* Various silicon revisions for omap2 */
 329#define OMAP242X_CLASS          0x24200024
 330#define OMAP2420_REV_ES1_0      OMAP242X_CLASS
 331#define OMAP2420_REV_ES2_0      (OMAP242X_CLASS | (0x1 << 8))
 332
 333#define OMAP243X_CLASS          0x24300024
 334#define OMAP2430_REV_ES1_0      OMAP243X_CLASS
 335
 336#define OMAP343X_CLASS          0x34300034
 337#define OMAP3430_REV_ES1_0      OMAP343X_CLASS
 338#define OMAP3430_REV_ES2_0      (OMAP343X_CLASS | (0x1 << 8))
 339#define OMAP3430_REV_ES2_1      (OMAP343X_CLASS | (0x2 << 8))
 340#define OMAP3430_REV_ES3_0      (OMAP343X_CLASS | (0x3 << 8))
 341#define OMAP3430_REV_ES3_1      (OMAP343X_CLASS | (0x4 << 8))
 342#define OMAP3430_REV_ES3_1_2    (OMAP343X_CLASS | (0x5 << 8))
 343
 344#define OMAP363X_CLASS          0x36300034
 345#define OMAP3630_REV_ES1_0      OMAP363X_CLASS
 346#define OMAP3630_REV_ES1_1      (OMAP363X_CLASS | (0x1 << 8))
 347#define OMAP3630_REV_ES1_2      (OMAP363X_CLASS | (0x2 << 8))
 348
 349#define TI816X_CLASS            0x81600081
 350#define TI8168_REV_ES1_0        TI816X_CLASS
 351#define TI8168_REV_ES1_1        (TI816X_CLASS | (0x1 << 8))
 352#define TI8168_REV_ES2_0        (TI816X_CLASS | (0x2 << 8))
 353#define TI8168_REV_ES2_1        (TI816X_CLASS | (0x3 << 8))
 354
 355#define TI814X_CLASS            0x81400081
 356#define TI8148_REV_ES1_0        TI814X_CLASS
 357#define TI8148_REV_ES2_0        (TI814X_CLASS | (0x1 << 8))
 358#define TI8148_REV_ES2_1        (TI814X_CLASS | (0x2 << 8))
 359
 360#define AM35XX_CLASS            0x35170034
 361#define AM35XX_REV_ES1_0        AM35XX_CLASS
 362#define AM35XX_REV_ES1_1        (AM35XX_CLASS | (0x1 << 8))
 363
 364#define AM335X_CLASS            0x33500033
 365#define AM335X_REV_ES1_0        AM335X_CLASS
 366#define AM335X_REV_ES2_0        (AM335X_CLASS | (0x1 << 8))
 367#define AM335X_REV_ES2_1        (AM335X_CLASS | (0x2 << 8))
 368
 369#define AM437X_CLASS            0x43700000
 370#define AM437X_REV_ES1_0        (AM437X_CLASS | (0x10 << 8))
 371#define AM437X_REV_ES1_1        (AM437X_CLASS | (0x11 << 8))
 372#define AM437X_REV_ES1_2        (AM437X_CLASS | (0x12 << 8))
 373
 374#define OMAP443X_CLASS          0x44300044
 375#define OMAP4430_REV_ES1_0      (OMAP443X_CLASS | (0x10 << 8))
 376#define OMAP4430_REV_ES2_0      (OMAP443X_CLASS | (0x20 << 8))
 377#define OMAP4430_REV_ES2_1      (OMAP443X_CLASS | (0x21 << 8))
 378#define OMAP4430_REV_ES2_2      (OMAP443X_CLASS | (0x22 << 8))
 379#define OMAP4430_REV_ES2_3      (OMAP443X_CLASS | (0x23 << 8))
 380
 381#define OMAP446X_CLASS          0x44600044
 382#define OMAP4460_REV_ES1_0      (OMAP446X_CLASS | (0x10 << 8))
 383#define OMAP4460_REV_ES1_1      (OMAP446X_CLASS | (0x11 << 8))
 384
 385#define OMAP447X_CLASS          0x44700044
 386#define OMAP4470_REV_ES1_0      (OMAP447X_CLASS | (0x10 << 8))
 387
 388#define OMAP54XX_CLASS          0x54000054
 389#define OMAP5430_REV_ES2_0      (OMAP54XX_CLASS | (0x30 << 16) | (0x20 << 8))
 390#define OMAP5432_REV_ES2_0      (OMAP54XX_CLASS | (0x32 << 16) | (0x20 << 8))
 391
 392#define DRA7XX_CLASS            0x07000000
 393#define DRA762_REV_ES1_0        (DRA7XX_CLASS | (0x62 << 16) | (0x10 << 8))
 394#define DRA762_ABZ_REV_ES1_0    (DRA762_REV_ES1_0 | (2 << 0))
 395#define DRA762_ACD_REV_ES1_0    (DRA762_REV_ES1_0 | (3 << 0))
 396#define DRA752_REV_ES1_0        (DRA7XX_CLASS | (0x52 << 16) | (0x10 << 8))
 397#define DRA752_REV_ES1_1        (DRA7XX_CLASS | (0x52 << 16) | (0x11 << 8))
 398#define DRA752_REV_ES2_0        (DRA7XX_CLASS | (0x52 << 16) | (0x20 << 8))
 399#define DRA722_REV_ES1_0        (DRA7XX_CLASS | (0x22 << 16) | (0x10 << 8))
 400#define DRA722_REV_ES2_0        (DRA7XX_CLASS | (0x22 << 16) | (0x20 << 8))
 401#define DRA722_REV_ES2_1        (DRA7XX_CLASS | (0x22 << 16) | (0x21 << 8))
 402
 403void omap2xxx_check_revision(void);
 404void omap3xxx_check_revision(void);
 405void omap4xxx_check_revision(void);
 406void omap5xxx_check_revision(void);
 407void dra7xxx_check_revision(void);
 408void omap3xxx_check_features(void);
 409void ti81xx_check_features(void);
 410void am33xx_check_features(void);
 411void omap4xxx_check_features(void);
 412
 413/*
 414 * Runtime detection of OMAP3 features
 415 *
 416 * OMAP3_HAS_IO_CHAIN_CTRL: Some later members of the OMAP3 chip
 417 *    family have OS-level control over the I/O chain clock.  This is
 418 *    to avoid a window during which wakeups could potentially be lost
 419 *    during powerdomain transitions.  If this bit is set, it
 420 *    indicates that the chip does support OS-level control of this
 421 *    feature.
 422 */
 423extern u32 omap_features;
 424
 425#define OMAP3_HAS_L2CACHE               BIT(0)
 426#define OMAP3_HAS_IVA                   BIT(1)
 427#define OMAP3_HAS_SGX                   BIT(2)
 428#define OMAP3_HAS_NEON                  BIT(3)
 429#define OMAP3_HAS_ISP                   BIT(4)
 430#define OMAP3_HAS_192MHZ_CLK            BIT(5)
 431#define OMAP3_HAS_IO_WAKEUP             BIT(6)
 432#define OMAP3_HAS_SDRC                  BIT(7)
 433#define OMAP3_HAS_IO_CHAIN_CTRL         BIT(8)
 434#define OMAP4_HAS_PERF_SILICON          BIT(9)
 435
 436
 437#define OMAP3_HAS_FEATURE(feat,flag)                    \
 438static inline unsigned int omap3_has_ ##feat(void)      \
 439{                                                       \
 440        return omap_features & OMAP3_HAS_ ##flag;       \
 441}                                                       \
 442
 443OMAP3_HAS_FEATURE(l2cache, L2CACHE)
 444OMAP3_HAS_FEATURE(sgx, SGX)
 445OMAP3_HAS_FEATURE(iva, IVA)
 446OMAP3_HAS_FEATURE(neon, NEON)
 447OMAP3_HAS_FEATURE(isp, ISP)
 448OMAP3_HAS_FEATURE(192mhz_clk, 192MHZ_CLK)
 449OMAP3_HAS_FEATURE(io_wakeup, IO_WAKEUP)
 450OMAP3_HAS_FEATURE(sdrc, SDRC)
 451OMAP3_HAS_FEATURE(io_chain_ctrl, IO_CHAIN_CTRL)
 452
 453/*
 454 * Runtime detection of OMAP4 features
 455 */
 456#define OMAP4_HAS_FEATURE(feat, flag)                   \
 457static inline unsigned int omap4_has_ ##feat(void)      \
 458{                                                       \
 459        return omap_features & OMAP4_HAS_ ##flag;       \
 460}                                                       \
 461
 462OMAP4_HAS_FEATURE(perf_silicon, PERF_SILICON)
 463
 464/*
 465 * We need to make sure omap initcalls don't run when
 466 * multiplatform kernels are booted on other SoCs.
 467 */
 468#define omap_initcall(level, fn)                \
 469static int __init __used __##fn(void)           \
 470{                                               \
 471        if (!soc_is_omap())                     \
 472                return 0;                       \
 473        return fn();                            \
 474}                                               \
 475level(__##fn);
 476
 477#define omap_early_initcall(fn)         omap_initcall(early_initcall, fn)
 478#define omap_core_initcall(fn)          omap_initcall(core_initcall, fn)
 479#define omap_postcore_initcall(fn)      omap_initcall(postcore_initcall, fn)
 480#define omap_arch_initcall(fn)          omap_initcall(arch_initcall, fn)
 481#define omap_subsys_initcall(fn)        omap_initcall(subsys_initcall, fn)
 482#define omap_device_initcall(fn)        omap_initcall(device_initcall, fn)
 483#define omap_late_initcall(fn)          omap_initcall(late_initcall, fn)
 484#define omap_late_initcall_sync(fn)     omap_initcall(late_initcall_sync, fn)
 485
 486/* Legacy defines, these can be removed when users are removed */
 487#define cpu_is_omap2420()       soc_is_omap2420()
 488#define cpu_is_omap2422()       soc_is_omap2422()
 489#define cpu_is_omap242x()       soc_is_omap242x()
 490#define cpu_is_omap2430()       soc_is_omap2430()
 491#define cpu_is_omap243x()       soc_is_omap243x()
 492#define cpu_is_omap24xx()       soc_is_omap24xx()
 493#define cpu_is_omap3430()       soc_is_omap3430()
 494#define cpu_is_omap343x()       soc_is_omap343x()
 495#define cpu_is_omap34xx()       soc_is_omap34xx()
 496#define cpu_is_omap3630()       soc_is_omap3630()
 497#define cpu_is_omap443x()       soc_is_omap443x()
 498#define cpu_is_omap446x()       soc_is_omap446x()
 499#define cpu_is_omap44xx()       soc_is_omap44xx()
 500#define cpu_is_ti814x()         soc_is_ti814x()
 501#define cpu_is_ti816x()         soc_is_ti816x()
 502#define cpu_is_ti81xx()         soc_is_ti81xx()
 503
 504#endif  /* __ASSEMBLY__ */
 505