]> git.baikalelectronics.ru Git - kernel.git/commit
ARM: Add interface for registering and calling firmware-specific operations
authorTomasz Figa <t.figa@samsung.com>
Tue, 11 Dec 2012 04:58:43 +0000 (13:58 +0900)
committerKukjin Kim <kgene.kim@samsung.com>
Mon, 8 Apr 2013 16:52:06 +0000 (01:52 +0900)
commitfd1439908f917d8e1fef1a68eecc7a15262d3ac9
tree3e3b8293c5e86d19efdfa28069263ae87e5e1246
parent6c678b634d6762dc3829e1fcf71b0da1918b9bbb
ARM: Add interface for registering and calling firmware-specific operations

Some boards are running with secure firmware running in TrustZone secure
world, which changes the way some things have to be initialized.

This patch adds an interface for platforms to specify available firmware
operations and call them.

A wrapper macro, call_firmware_op(), checks if the operation is provided
and calls it if so, otherwise returns -ENOSYS to allow fallback to
legacy operation..

By default no operations are provided.

Example of use:

In code using firmware ops:

  __raw_writel(virt_to_phys(exynos4_secondary_startup),
               CPU1_BOOT_REG);

  /* Call Exynos specific smc call */
  if (call_firmware_op(cpu_boot, cpu) == -ENOSYS)
          cpu_boot_legacy(...); /* Try legacy way */

  gic_raise_softirq(cpumask_of(cpu), 1);

In board-/platform-specific code:

  static int platformX_do_idle(void)
  {
          /* tell platformX firmware to enter idle */
          return 0;
  }

  static int platformX_cpu_boot(int i)
  {
          /* tell platformX firmware to boot CPU i */
          return 0;
  }

  static const struct firmware_ops platformX_firmware_ops = {
          .do_idle      = exynos_do_idle,
          .cpu_boot     = exynos_cpu_boot,
          /* other operations not available on platformX */
  };

  static void __init board_init_early(void)
  {
          register_firmware_ops(&platformX_firmware_ops);
  }

Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
Signed-off-by: Tomasz Figa <t.figa@samsung.com>
Signed-off-by: Kukjin Kim <kgene.kim@samsung.com>
Documentation/arm/firmware.txt [new file with mode: 0644]
arch/arm/common/Makefile
arch/arm/common/firmware.c [new file with mode: 0644]
arch/arm/include/asm/firmware.h [new file with mode: 0644]