msm: pil: Pass pil_device to ops
This makes it easier to have one function used for multiple
devices (e.g. Q6v4 on 8960).
Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
diff --git a/arch/arm/mach-msm/peripheral-loader.c b/arch/arm/mach-msm/peripheral-loader.c
index 1969efc..c8f0798 100644
--- a/arch/arm/mach-msm/peripheral-loader.c
+++ b/arch/arm/mach-msm/peripheral-loader.c
@@ -129,7 +129,7 @@
paddr += size;
}
- ret = pil->ops->verify_blob(phdr->p_paddr, phdr->p_memsz);
+ ret = pil->ops->verify_blob(pil, phdr->p_paddr, phdr->p_memsz);
if (ret)
dev_err(&pil->pdev.dev, "Blob %u failed verification\n", num);
@@ -185,7 +185,7 @@
goto release_fw;
}
- ret = pil->ops->init_image(fw->data, fw->size);
+ ret = pil->ops->init_image(pil, fw->data, fw->size);
if (ret) {
dev_err(&pil->pdev.dev, "Invalid firmware metadata\n");
goto release_fw;
@@ -204,7 +204,7 @@
}
}
- ret = pil->ops->auth_and_reset();
+ ret = pil->ops->auth_and_reset(pil);
if (ret) {
dev_err(&pil->pdev.dev, "Failed to bring out of reset\n");
goto release_fw;
@@ -284,7 +284,7 @@
if (pil->count)
pil->count--;
if (pil->count == 0)
- pil->ops->shutdown();
+ pil->ops->shutdown(pil);
unlock:
mutex_unlock(&pil->lock);
@@ -304,7 +304,7 @@
mutex_lock(&pil->lock);
if (!WARN(!pil->count, "%s: Reference count mismatch\n", __func__))
- pil->ops->shutdown();
+ pil->ops->shutdown(pil);
mutex_unlock(&pil->lock);
}
EXPORT_SYMBOL(pil_force_shutdown);
@@ -410,7 +410,7 @@
mutex_lock(&pil_list_lock);
list_for_each_entry(pil, &pil_list, list)
- pil->ops->shutdown();
+ pil->ops->shutdown(pil);
mutex_unlock(&pil_list_lock);
return 0;
diff --git a/arch/arm/mach-msm/peripheral-loader.h b/arch/arm/mach-msm/peripheral-loader.h
index e0dc3a6..7357432 100644
--- a/arch/arm/mach-msm/peripheral-loader.h
+++ b/arch/arm/mach-msm/peripheral-loader.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2010, Code Aurora Forum. All rights reserved.
+/* Copyright (c) 2010-2011, Code Aurora Forum. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -16,13 +16,6 @@
#include <linux/mutex.h>
#include <linux/platform_device.h>
-struct pil_reset_ops {
- int (*init_image)(const u8 *metadata, size_t size);
- int (*verify_blob)(u32 phy_addr, size_t size);
- int (*auth_and_reset)(void);
- int (*shutdown)(void);
-};
-
struct pil_device {
const char *name;
const char *depends_on;
@@ -33,6 +26,14 @@
struct pil_reset_ops *ops;
};
+struct pil_reset_ops {
+ int (*init_image)(struct pil_device *pil, const u8 *metadata,
+ size_t size);
+ int (*verify_blob)(struct pil_device *pil, u32 phy_addr, size_t size);
+ int (*auth_and_reset)(struct pil_device *pil);
+ int (*shutdown)(struct pil_device *pil);
+};
+
extern int msm_pil_add_device(struct pil_device *pil);
#endif
diff --git a/arch/arm/mach-msm/peripheral-reset-8960.c b/arch/arm/mach-msm/peripheral-reset-8960.c
index d251cc2..ef73244 100644
--- a/arch/arm/mach-msm/peripheral-reset-8960.c
+++ b/arch/arm/mach-msm/peripheral-reset-8960.c
@@ -227,43 +227,49 @@
return resp.image_valid;
}
-static int init_image_lpass_q6_trusted(const u8 *metadata, size_t size)
+static int init_image_lpass_q6_trusted(struct pil_device *pil,
+ const u8 *metadata, size_t size)
{
return init_image_trusted(PAS_Q6, metadata, size);
}
-static int init_image_modem_fw_q6_trusted(const u8 *metadata, size_t size)
+static int init_image_modem_fw_q6_trusted(struct pil_device *pil,
+ const u8 *metadata, size_t size)
{
return init_image_trusted(PAS_MODEM_FW, metadata, size);
}
-static int init_image_modem_sw_q6_trusted(const u8 *metadata, size_t size)
+static int init_image_modem_sw_q6_trusted(struct pil_device *pil,
+ const u8 *metadata, size_t size)
{
return init_image_trusted(PAS_MODEM_SW, metadata, size);
}
-static int init_image_lpass_q6_untrusted(const u8 *metadata, size_t size)
+static int init_image_lpass_q6_untrusted(struct pil_device *pil,
+ const u8 *metadata, size_t size)
{
const struct elf32_hdr *ehdr = (struct elf32_hdr *)metadata;
q6_lpass.start_addr = ehdr->e_entry;
return 0;
}
-static int init_image_modem_fw_q6_untrusted(const u8 *metadata, size_t size)
+static int init_image_modem_fw_q6_untrusted(struct pil_device *pil,
+ const u8 *metadata, size_t size)
{
const struct elf32_hdr *ehdr = (struct elf32_hdr *)metadata;
q6_modem_fw.start_addr = ehdr->e_entry;
return 0;
}
-static int init_image_modem_sw_q6_untrusted(const u8 *metadata, size_t size)
+static int init_image_modem_sw_q6_untrusted(struct pil_device *pil,
+ const u8 *metadata, size_t size)
{
const struct elf32_hdr *ehdr = (struct elf32_hdr *)metadata;
q6_modem_sw.start_addr = ehdr->e_entry;
return 0;
}
-static int verify_blob(u32 phy_addr, size_t size)
+static int verify_blob(struct pil_device *pil, u32 phy_addr, size_t size)
{
return 0;
}
@@ -314,17 +320,17 @@
return auth_and_reset_trusted(id);
}
-static int reset_lpass_q6_trusted(void)
+static int reset_lpass_q6_trusted(struct pil_device *pil)
{
return reset_q6_trusted(PAS_Q6, &q6_lpass);
}
-static int reset_modem_fw_q6_trusted(void)
+static int reset_modem_fw_q6_trusted(struct pil_device *pil)
{
return reset_q6_trusted(PAS_MODEM_FW, &q6_modem_fw);
}
-static int reset_modem_sw_q6_trusted(void)
+static int reset_modem_sw_q6_trusted(struct pil_device *pil)
{
return reset_q6_trusted(PAS_MODEM_SW, &q6_modem_sw);
}
@@ -433,17 +439,17 @@
return 0;
}
-static int reset_lpass_q6_untrusted(void)
+static int reset_lpass_q6_untrusted(struct pil_device *pil)
{
return reset_q6_untrusted(&q6_lpass);
}
-static int reset_modem_fw_q6_untrusted(void)
+static int reset_modem_fw_q6_untrusted(struct pil_device *pil)
{
return reset_q6_untrusted(&q6_modem_fw);
}
-static int reset_modem_sw_q6_untrusted(void)
+static int reset_modem_sw_q6_untrusted(struct pil_device *pil)
{
return reset_q6_untrusted(&q6_modem_sw);
}
@@ -479,17 +485,17 @@
return ret;
}
-static int shutdown_lpass_q6_trusted(void)
+static int shutdown_lpass_q6_trusted(struct pil_device *pil)
{
return shutdown_q6_trusted(PAS_Q6, &q6_lpass);
}
-static int shutdown_modem_fw_q6_trusted(void)
+static int shutdown_modem_fw_q6_trusted(struct pil_device *pil)
{
return shutdown_q6_trusted(PAS_MODEM_FW, &q6_modem_fw);
}
-static int shutdown_modem_sw_q6_trusted(void)
+static int shutdown_modem_sw_q6_trusted(struct pil_device *pil)
{
return shutdown_q6_trusted(PAS_MODEM_SW, &q6_modem_sw);
}
@@ -522,29 +528,30 @@
return 0;
}
-static int shutdown_lpass_q6_untrusted(void)
+static int shutdown_lpass_q6_untrusted(struct pil_device *pil)
{
return shutdown_q6_untrusted(&q6_lpass);
}
-static int shutdown_modem_fw_q6_untrusted(void)
+static int shutdown_modem_fw_q6_untrusted(struct pil_device *pil)
{
return shutdown_q6_untrusted(&q6_modem_fw);
}
-static int shutdown_modem_sw_q6_untrusted(void)
+static int shutdown_modem_sw_q6_untrusted(struct pil_device *pil)
{
return shutdown_q6_untrusted(&q6_modem_sw);
}
-static int init_image_riva_untrusted(const u8 *metadata, size_t size)
+static int init_image_riva_untrusted(struct pil_device *pil, const u8 *metadata,
+ size_t size)
{
const struct elf32_hdr *ehdr = (struct elf32_hdr *)metadata;
riva_start = ehdr->e_entry;
return 0;
}
-static int reset_riva_untrusted(void)
+static int reset_riva_untrusted(struct pil_device *pil)
{
u32 reg;
bool xo;
@@ -635,7 +642,7 @@
return 0;
}
-static int shutdown_riva_untrusted(void)
+static int shutdown_riva_untrusted(struct pil_device *pil)
{
u32 reg;
/* Put riva into reset */
@@ -645,22 +652,24 @@
return 0;
}
-static int init_image_riva_trusted(const u8 *metadata, size_t size)
+static int init_image_riva_trusted(struct pil_device *pil, const u8 *metadata,
+ size_t size)
{
return init_image_trusted(PAS_RIVA, metadata, size);
}
-static int reset_riva_trusted(void)
+static int reset_riva_trusted(struct pil_device *pil)
{
return auth_and_reset_trusted(PAS_RIVA);
}
-static int shutdown_riva_trusted(void)
+static int shutdown_riva_trusted(struct pil_device *pil)
{
return shutdown_trusted(PAS_RIVA);
}
-static int init_image_dsps_untrusted(const u8 *metadata, size_t size)
+static int init_image_dsps_untrusted(struct pil_device *pil, const u8 *metadata,
+ size_t size)
{
/* Bring memory and bus interface out of reset */
writel_relaxed(0x2, PPSS_RESET);
@@ -668,7 +677,7 @@
return 0;
}
-static int reset_dsps_untrusted(void)
+static int reset_dsps_untrusted(struct pil_device *pil)
{
writel_relaxed(0x10, PPSS_PROC_CLK_CTL);
/* Bring DSPS out of reset */
@@ -676,24 +685,25 @@
return 0;
}
-static int shutdown_dsps_untrusted(void)
+static int shutdown_dsps_untrusted(struct pil_device *pil)
{
writel_relaxed(0x2, PPSS_RESET);
writel_relaxed(0x0, PPSS_PROC_CLK_CTL);
return 0;
}
-static int init_image_dsps_trusted(const u8 *metadata, size_t size)
+static int init_image_dsps_trusted(struct pil_device *pil, const u8 *metadata,
+ size_t size)
{
return init_image_trusted(PAS_DSPS, metadata, size);
}
-static int reset_dsps_trusted(void)
+static int reset_dsps_trusted(struct pil_device *pil)
{
return auth_and_reset_trusted(PAS_DSPS);
}
-static int shutdown_dsps_trusted(void)
+static int shutdown_dsps_trusted(struct pil_device *pil)
{
return shutdown_trusted(PAS_DSPS);
}
diff --git a/arch/arm/mach-msm/peripheral-reset.c b/arch/arm/mach-msm/peripheral-reset.c
index 58097b2..7089772 100644
--- a/arch/arm/mach-msm/peripheral-reset.c
+++ b/arch/arm/mach-msm/peripheral-reset.c
@@ -126,36 +126,42 @@
return resp.image_valid;
}
-static int init_image_modem_trusted(const u8 *metadata, size_t size)
+static int init_image_modem_trusted(struct pil_device *pil, const u8 *metadata,
+ size_t size)
{
return init_image_trusted(PAS_MODEM, metadata, size);
}
-static int init_image_modem_untrusted(const u8 *metadata, size_t size)
+static int init_image_modem_untrusted(struct pil_device *pil,
+ const u8 *metadata, size_t size)
{
struct elf32_hdr *ehdr = (struct elf32_hdr *)metadata;
modem_start = ehdr->e_entry;
return 0;
}
-static int init_image_q6_trusted(const u8 *metadata, size_t size)
+static int init_image_q6_trusted(struct pil_device *pil,
+ const u8 *metadata, size_t size)
{
return init_image_trusted(PAS_Q6, metadata, size);
}
-static int init_image_q6_untrusted(const u8 *metadata, size_t size)
+static int init_image_q6_untrusted(struct pil_device *pil, const u8 *metadata,
+ size_t size)
{
struct elf32_hdr *ehdr = (struct elf32_hdr *)metadata;
q6_start = ehdr->e_entry;
return 0;
}
-static int init_image_dsps_trusted(const u8 *metadata, size_t size)
+static int init_image_dsps_trusted(struct pil_device *pil, const u8 *metadata,
+ size_t size)
{
return init_image_trusted(PAS_DSPS, metadata, size);
}
-static int init_image_dsps_untrusted(const u8 *metadata, size_t size)
+static int init_image_dsps_untrusted(struct pil_device *pil, const u8 *metadata,
+ size_t size)
{
struct elf32_hdr *ehdr = (struct elf32_hdr *)metadata;
dsps_start = ehdr->e_entry;
@@ -165,7 +171,7 @@
return 0;
}
-static int verify_blob(u32 phy_addr, size_t size)
+static int verify_blob(struct pil_device *pil, u32 phy_addr, size_t size)
{
return 0;
}
@@ -209,7 +215,7 @@
remove_modem_proxy_votes(0);
}
-static int reset_modem_untrusted(void)
+static int reset_modem_untrusted(struct pil_device *pil)
{
u32 reg;
@@ -288,7 +294,7 @@
return 0;
}
-static int reset_modem_trusted(void)
+static int reset_modem_trusted(struct pil_device *pil)
{
int ret;
@@ -316,7 +322,7 @@
return resp.success;
}
-static int shutdown_modem_untrusted(void)
+static int shutdown_modem_untrusted(struct pil_device *pil)
{
u32 reg;
@@ -357,7 +363,7 @@
return 0;
}
-static int shutdown_modem_trusted(void)
+static int shutdown_modem_trusted(struct pil_device *pil)
{
int ret;
@@ -425,7 +431,7 @@
remove_q6_proxy_votes(0);
}
-static int reset_q6_untrusted(void)
+static int reset_q6_untrusted(struct pil_device *pil)
{
u32 reg;
@@ -471,14 +477,14 @@
return 0;
}
-static int reset_q6_trusted(void)
+static int reset_q6_trusted(struct pil_device *pil)
{
make_q6_proxy_votes();
return auth_and_reset_trusted(PAS_Q6);
}
-static int shutdown_q6_untrusted(void)
+static int shutdown_q6_untrusted(struct pil_device *pil)
{
u32 reg;
@@ -505,7 +511,7 @@
return 0;
}
-static int shutdown_q6_trusted(void)
+static int shutdown_q6_trusted(struct pil_device *pil)
{
int ret;
@@ -518,7 +524,7 @@
return 0;
}
-static int reset_dsps_untrusted(void)
+static int reset_dsps_untrusted(struct pil_device *pil)
{
__raw_writel(0x10, PPSS_PROC_CLK_CTL);
while (__raw_readl(CLK_HALT_DFAB_STATE) & BIT(18))
@@ -529,34 +535,35 @@
return 0;
}
-static int reset_dsps_trusted(void)
+static int reset_dsps_trusted(struct pil_device *pil)
{
return auth_and_reset_trusted(PAS_DSPS);
}
-static int shutdown_dsps_trusted(void)
+static int shutdown_dsps_trusted(struct pil_device *pil)
{
return shutdown_trusted(PAS_DSPS);
}
-static int shutdown_dsps_untrusted(void)
+static int shutdown_dsps_untrusted(struct pil_device *pil)
{
__raw_writel(0x2, PPSS_RESET);
__raw_writel(0x0, PPSS_PROC_CLK_CTL);
return 0;
}
-static int init_image_playready(const u8 *metadata, size_t size)
+static int init_image_playready(struct pil_device *pil, const u8 *metadata,
+ size_t size)
{
return init_image_trusted(PAS_PLAYREADY, metadata, size);
}
-static int reset_playready(void)
+static int reset_playready(struct pil_device *pil)
{
return auth_and_reset_trusted(PAS_PLAYREADY);
}
-static int shutdown_playready(void)
+static int shutdown_playready(struct pil_device *pil)
{
return shutdown_trusted(PAS_PLAYREADY);
}