Qualcomm ARM Based Driver Updates for v4.21
* Fix llcc license, includes, and error checks * Remove use of memcpy in cmd-db and fix API breakage * Add QCS404 compatible to SMD-RPM * Minor fixes for QMI * Add irq clear handling in QCOM Geni SE during init -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAABAgAGBQJcAHmCAAoJEFKiBbHx2RXVJLwQAKXbtYh7Kl8xQPJpRtHmOTJE zagPkIb9xDqG2O7rWfYi6ye3/brSZv+9kv02tqwtHVlDfxtd64KHw3jor6yxozB4 6d8F1thFiM5+lXo6ISSFJaVYwpN0AYCExFLbSup/XSyo3a70HchtXlvT0NPPTecT EXinXUDOizVM8SypZksoWfJWd+qWskPNxfMRQZ1e5nJlnqcRD/9XQtmZha/WZe76 Kz78QfxLbT4KKhTEE+TAOWERT2STlxfHP0611E00LXlivqh7twtfe5u5yUntOVq0 +56RY1K0W++Cl4P2HJrpcp+16OI2wPG1KfP4kWySXaa0HfcW4qaZvGGiOWrr1mQs sxRntblg0x56i4lnSTFxTrirDBiBFuzXLvLGE/RxbgACGafVh0mEtl58wJxwShKB a3zaztuRPcimOWbcAJN2O3nOB64lYha61JY7lo+th+IxbYAaVtp76GsVq36DHDbx oVREMg/zNUHRKqIQuRM372sj2VnngJ8Bw/7ecLTwydvmmb7QB6UDXI1D/L2p6Tqq +7Z1UHB8XIWhu2GkLjakEHs+XPcUULofWeNSsOwftv2Bmo4xw9COlQiDQjf15/ZR IVZp1tYFHR9v2mFMM1ZI/GdQWSl4EDE3rwvwRMlCHcEZYN4jjyv9XzV2IeMw7Tpq qdevDn4scHx05nBm6ZQh =hySS -----END PGP SIGNATURE----- Merge tag 'qcom-drivers-for-4.21' of git://git.kernel.org/pub/scm/linux/kernel/git/agross/linux into next/drivers Qualcomm ARM Based Driver Updates for v4.21 * Fix llcc license, includes, and error checks * Remove use of memcpy in cmd-db and fix API breakage * Add QCS404 compatible to SMD-RPM * Minor fixes for QMI * Add irq clear handling in QCOM Geni SE during init * tag 'qcom-drivers-for-4.21' of git://git.kernel.org/pub/scm/linux/kernel/git/agross/linux: drm: msm: Check cmd_db_read_aux_data() for failure soc: qcom: smd-rpm: Add QCS404 compatible soc: qcom: llcc-slice: Remove duplicated include from llcc-slice.c soc: qcom: cmd-db: Stop memcpy()ing in cmd_db_read_aux_data() soc: qcom: cmd-db: Remove memcpy()ing from cmd_db_get_header() soc: qcom: Drop help text for QCOM_QMI_HELPERS soc: qcom: qmi_interface: Limit txn ids to U16_MAX soc: qcom: llcc-slice: Add error checks for API functions soc: qcom/llcc: add MODULE_LICENSE tag soc: qcom: Add irq clear handling during SE init Signed-off-by: Olof Johansson <olof@lixom.net>
This commit is contained in:
commit
202f9977b0
|
@ -23,6 +23,7 @@ resources.
|
||||||
"qcom,rpm-msm8916"
|
"qcom,rpm-msm8916"
|
||||||
"qcom,rpm-msm8974"
|
"qcom,rpm-msm8974"
|
||||||
"qcom,rpm-msm8998"
|
"qcom,rpm-msm8998"
|
||||||
|
"qcom,rpm-qcs404"
|
||||||
|
|
||||||
- qcom,smd-channels:
|
- qcom,smd-channels:
|
||||||
Usage: required
|
Usage: required
|
||||||
|
|
|
@ -902,26 +902,6 @@ static int a6xx_gmu_memory_probe(struct a6xx_gmu *gmu)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get the list of RPMh voltage levels from cmd-db */
|
|
||||||
static int a6xx_gmu_rpmh_arc_cmds(const char *id, void *vals, int size)
|
|
||||||
{
|
|
||||||
u32 len = cmd_db_read_aux_data_len(id);
|
|
||||||
|
|
||||||
if (!len)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (WARN_ON(len > size))
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
cmd_db_read_aux_data(id, vals, len);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The data comes back as an array of unsigned shorts so adjust the
|
|
||||||
* count accordingly
|
|
||||||
*/
|
|
||||||
return len >> 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Return the 'arc-level' for the given frequency */
|
/* Return the 'arc-level' for the given frequency */
|
||||||
static u32 a6xx_gmu_get_arc_level(struct device *dev, unsigned long freq)
|
static u32 a6xx_gmu_get_arc_level(struct device *dev, unsigned long freq)
|
||||||
{
|
{
|
||||||
|
@ -949,11 +929,30 @@ static u32 a6xx_gmu_get_arc_level(struct device *dev, unsigned long freq)
|
||||||
}
|
}
|
||||||
|
|
||||||
static int a6xx_gmu_rpmh_arc_votes_init(struct device *dev, u32 *votes,
|
static int a6xx_gmu_rpmh_arc_votes_init(struct device *dev, u32 *votes,
|
||||||
unsigned long *freqs, int freqs_count,
|
unsigned long *freqs, int freqs_count, const char *id)
|
||||||
u16 *pri, int pri_count,
|
|
||||||
u16 *sec, int sec_count)
|
|
||||||
{
|
{
|
||||||
int i, j;
|
int i, j;
|
||||||
|
const u16 *pri, *sec;
|
||||||
|
size_t pri_count, sec_count;
|
||||||
|
|
||||||
|
pri = cmd_db_read_aux_data(id, &pri_count);
|
||||||
|
if (IS_ERR(pri))
|
||||||
|
return PTR_ERR(pri);
|
||||||
|
/*
|
||||||
|
* The data comes back as an array of unsigned shorts so adjust the
|
||||||
|
* count accordingly
|
||||||
|
*/
|
||||||
|
pri_count >>= 1;
|
||||||
|
if (!pri_count)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
sec = cmd_db_read_aux_data("mx.lvl", &sec_count);
|
||||||
|
if (IS_ERR(sec))
|
||||||
|
return PTR_ERR(sec);
|
||||||
|
|
||||||
|
sec_count >>= 1;
|
||||||
|
if (!sec_count)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
/* Construct a vote for each frequency */
|
/* Construct a vote for each frequency */
|
||||||
for (i = 0; i < freqs_count; i++) {
|
for (i = 0; i < freqs_count; i++) {
|
||||||
|
@ -1012,25 +1011,15 @@ static int a6xx_gmu_rpmh_votes_init(struct a6xx_gmu *gmu)
|
||||||
struct a6xx_gpu *a6xx_gpu = container_of(gmu, struct a6xx_gpu, gmu);
|
struct a6xx_gpu *a6xx_gpu = container_of(gmu, struct a6xx_gpu, gmu);
|
||||||
struct adreno_gpu *adreno_gpu = &a6xx_gpu->base;
|
struct adreno_gpu *adreno_gpu = &a6xx_gpu->base;
|
||||||
struct msm_gpu *gpu = &adreno_gpu->base;
|
struct msm_gpu *gpu = &adreno_gpu->base;
|
||||||
|
|
||||||
u16 gx[16], cx[16], mx[16];
|
|
||||||
u32 gxcount, cxcount, mxcount;
|
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
/* Get the list of available voltage levels for each component */
|
|
||||||
gxcount = a6xx_gmu_rpmh_arc_cmds("gfx.lvl", gx, sizeof(gx));
|
|
||||||
cxcount = a6xx_gmu_rpmh_arc_cmds("cx.lvl", cx, sizeof(cx));
|
|
||||||
mxcount = a6xx_gmu_rpmh_arc_cmds("mx.lvl", mx, sizeof(mx));
|
|
||||||
|
|
||||||
/* Build the GX votes */
|
/* Build the GX votes */
|
||||||
ret = a6xx_gmu_rpmh_arc_votes_init(&gpu->pdev->dev, gmu->gx_arc_votes,
|
ret = a6xx_gmu_rpmh_arc_votes_init(&gpu->pdev->dev, gmu->gx_arc_votes,
|
||||||
gmu->gpu_freqs, gmu->nr_gpu_freqs,
|
gmu->gpu_freqs, gmu->nr_gpu_freqs, "gfx.lvl");
|
||||||
gx, gxcount, mx, mxcount);
|
|
||||||
|
|
||||||
/* Build the CX votes */
|
/* Build the CX votes */
|
||||||
ret |= a6xx_gmu_rpmh_arc_votes_init(gmu->dev, gmu->cx_arc_votes,
|
ret |= a6xx_gmu_rpmh_arc_votes_init(gmu->dev, gmu->cx_arc_votes,
|
||||||
gmu->gmu_freqs, gmu->nr_gmu_freqs,
|
gmu->gmu_freqs, gmu->nr_gmu_freqs, "cx.lvl");
|
||||||
cx, cxcount, mx, mxcount);
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
|
@ -75,11 +75,6 @@ config QCOM_QMI_HELPERS
|
||||||
tristate
|
tristate
|
||||||
depends on ARCH_QCOM || COMPILE_TEST
|
depends on ARCH_QCOM || COMPILE_TEST
|
||||||
depends on NET
|
depends on NET
|
||||||
help
|
|
||||||
Helper library for handling QMI encoded messages. QMI encoded
|
|
||||||
messages are used in communication between the majority of QRTR
|
|
||||||
clients and this helpers provide the common functionality needed for
|
|
||||||
doing this from a kernel driver.
|
|
||||||
|
|
||||||
config QCOM_RMTFS_MEM
|
config QCOM_RMTFS_MEM
|
||||||
tristate "Qualcomm Remote Filesystem memory driver"
|
tristate "Qualcomm Remote Filesystem memory driver"
|
||||||
|
|
|
@ -101,8 +101,7 @@ static bool cmd_db_magic_matches(const struct cmd_db_header *header)
|
||||||
|
|
||||||
static struct cmd_db_header *cmd_db_header;
|
static struct cmd_db_header *cmd_db_header;
|
||||||
|
|
||||||
|
static inline const void *rsc_to_entry_header(const struct rsc_hdr *hdr)
|
||||||
static inline void *rsc_to_entry_header(struct rsc_hdr *hdr)
|
|
||||||
{
|
{
|
||||||
u16 offset = le16_to_cpu(hdr->header_offset);
|
u16 offset = le16_to_cpu(hdr->header_offset);
|
||||||
|
|
||||||
|
@ -110,7 +109,7 @@ static inline void *rsc_to_entry_header(struct rsc_hdr *hdr)
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void *
|
static inline void *
|
||||||
rsc_offset(struct rsc_hdr *hdr, struct entry_header *ent)
|
rsc_offset(const struct rsc_hdr *hdr, const struct entry_header *ent)
|
||||||
{
|
{
|
||||||
u16 offset = le16_to_cpu(hdr->data_offset);
|
u16 offset = le16_to_cpu(hdr->data_offset);
|
||||||
u16 loffset = le16_to_cpu(ent->offset);
|
u16 loffset = le16_to_cpu(ent->offset);
|
||||||
|
@ -134,11 +133,11 @@ int cmd_db_ready(void)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(cmd_db_ready);
|
EXPORT_SYMBOL(cmd_db_ready);
|
||||||
|
|
||||||
static int cmd_db_get_header(const char *id, struct entry_header *eh,
|
static int cmd_db_get_header(const char *id, const struct entry_header **eh,
|
||||||
struct rsc_hdr *rh)
|
const struct rsc_hdr **rh)
|
||||||
{
|
{
|
||||||
struct rsc_hdr *rsc_hdr;
|
const struct rsc_hdr *rsc_hdr;
|
||||||
struct entry_header *ent;
|
const struct entry_header *ent;
|
||||||
int ret, i, j;
|
int ret, i, j;
|
||||||
u8 query[8];
|
u8 query[8];
|
||||||
|
|
||||||
|
@ -146,9 +145,6 @@ static int cmd_db_get_header(const char *id, struct entry_header *eh,
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
if (!eh || !rh)
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
/* Pad out query string to same length as in DB */
|
/* Pad out query string to same length as in DB */
|
||||||
strncpy(query, id, sizeof(query));
|
strncpy(query, id, sizeof(query));
|
||||||
|
|
||||||
|
@ -159,14 +155,13 @@ static int cmd_db_get_header(const char *id, struct entry_header *eh,
|
||||||
|
|
||||||
ent = rsc_to_entry_header(rsc_hdr);
|
ent = rsc_to_entry_header(rsc_hdr);
|
||||||
for (j = 0; j < le16_to_cpu(rsc_hdr->cnt); j++, ent++) {
|
for (j = 0; j < le16_to_cpu(rsc_hdr->cnt); j++, ent++) {
|
||||||
if (memcmp(ent->id, query, sizeof(ent->id)) == 0)
|
if (memcmp(ent->id, query, sizeof(ent->id)) == 0) {
|
||||||
break;
|
if (eh)
|
||||||
}
|
*eh = ent;
|
||||||
|
if (rh)
|
||||||
if (j < le16_to_cpu(rsc_hdr->cnt)) {
|
*rh = rsc_hdr;
|
||||||
memcpy(eh, ent, sizeof(*ent));
|
return 0;
|
||||||
memcpy(rh, rsc_hdr, sizeof(*rh));
|
}
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -186,68 +181,39 @@ static int cmd_db_get_header(const char *id, struct entry_header *eh,
|
||||||
u32 cmd_db_read_addr(const char *id)
|
u32 cmd_db_read_addr(const char *id)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
struct entry_header ent;
|
const struct entry_header *ent;
|
||||||
struct rsc_hdr rsc_hdr;
|
|
||||||
|
|
||||||
ret = cmd_db_get_header(id, &ent, &rsc_hdr);
|
ret = cmd_db_get_header(id, &ent, NULL);
|
||||||
|
|
||||||
return ret < 0 ? 0 : le32_to_cpu(ent.addr);
|
return ret < 0 ? 0 : le32_to_cpu(ent->addr);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(cmd_db_read_addr);
|
EXPORT_SYMBOL(cmd_db_read_addr);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* cmd_db_read_aux_data() - Query command db for aux data.
|
* cmd_db_read_aux_data() - Query command db for aux data.
|
||||||
*
|
*
|
||||||
* @id: Resource to retrieve AUX Data on.
|
* @id: Resource to retrieve AUX Data on
|
||||||
* @data: Data buffer to copy returned aux data to. Returns size on NULL
|
* @len: size of data buffer returned
|
||||||
* @len: Caller provides size of data buffer passed in.
|
|
||||||
*
|
*
|
||||||
* Return: size of data on success, errno otherwise
|
* Return: pointer to data on success, error pointer otherwise
|
||||||
*/
|
*/
|
||||||
int cmd_db_read_aux_data(const char *id, u8 *data, size_t len)
|
const void *cmd_db_read_aux_data(const char *id, size_t *len)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
struct entry_header ent;
|
const struct entry_header *ent;
|
||||||
struct rsc_hdr rsc_hdr;
|
const struct rsc_hdr *rsc_hdr;
|
||||||
u16 ent_len;
|
|
||||||
|
|
||||||
if (!data)
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
ret = cmd_db_get_header(id, &ent, &rsc_hdr);
|
ret = cmd_db_get_header(id, &ent, &rsc_hdr);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ERR_PTR(ret);
|
||||||
|
|
||||||
ent_len = le16_to_cpu(ent.len);
|
if (len)
|
||||||
if (len < ent_len)
|
*len = le16_to_cpu(ent->len);
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
len = min_t(u16, ent_len, len);
|
return rsc_offset(rsc_hdr, ent);
|
||||||
memcpy(data, rsc_offset(&rsc_hdr, &ent), len);
|
|
||||||
|
|
||||||
return len;
|
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(cmd_db_read_aux_data);
|
EXPORT_SYMBOL(cmd_db_read_aux_data);
|
||||||
|
|
||||||
/**
|
|
||||||
* cmd_db_read_aux_data_len - Get the length of the auxiliary data stored in DB.
|
|
||||||
*
|
|
||||||
* @id: Resource to retrieve AUX Data.
|
|
||||||
*
|
|
||||||
* Return: size on success, 0 on error
|
|
||||||
*/
|
|
||||||
size_t cmd_db_read_aux_data_len(const char *id)
|
|
||||||
{
|
|
||||||
int ret;
|
|
||||||
struct entry_header ent;
|
|
||||||
struct rsc_hdr rsc_hdr;
|
|
||||||
|
|
||||||
ret = cmd_db_get_header(id, &ent, &rsc_hdr);
|
|
||||||
|
|
||||||
return ret < 0 ? 0 : le16_to_cpu(ent.len);
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(cmd_db_read_aux_data_len);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* cmd_db_read_slave_id - Get the slave ID for a given resource address
|
* cmd_db_read_slave_id - Get the slave ID for a given resource address
|
||||||
*
|
*
|
||||||
|
@ -258,15 +224,14 @@ EXPORT_SYMBOL(cmd_db_read_aux_data_len);
|
||||||
enum cmd_db_hw_type cmd_db_read_slave_id(const char *id)
|
enum cmd_db_hw_type cmd_db_read_slave_id(const char *id)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
struct entry_header ent;
|
const struct entry_header *ent;
|
||||||
struct rsc_hdr rsc_hdr;
|
|
||||||
u32 addr;
|
u32 addr;
|
||||||
|
|
||||||
ret = cmd_db_get_header(id, &ent, &rsc_hdr);
|
ret = cmd_db_get_header(id, &ent, NULL);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return CMD_DB_HW_INVALID;
|
return CMD_DB_HW_INVALID;
|
||||||
|
|
||||||
addr = le32_to_cpu(ent.addr);
|
addr = le32_to_cpu(ent->addr);
|
||||||
return (addr >> SLAVE_ID_SHIFT) & SLAVE_ID_MASK;
|
return (addr >> SLAVE_ID_SHIFT) & SLAVE_ID_MASK;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(cmd_db_read_slave_id);
|
EXPORT_SYMBOL(cmd_db_read_slave_id);
|
||||||
|
|
|
@ -95,7 +95,8 @@ EXPORT_SYMBOL_GPL(llcc_slice_getd);
|
||||||
*/
|
*/
|
||||||
void llcc_slice_putd(struct llcc_slice_desc *desc)
|
void llcc_slice_putd(struct llcc_slice_desc *desc)
|
||||||
{
|
{
|
||||||
kfree(desc);
|
if (!IS_ERR_OR_NULL(desc))
|
||||||
|
kfree(desc);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(llcc_slice_putd);
|
EXPORT_SYMBOL_GPL(llcc_slice_putd);
|
||||||
|
|
||||||
|
@ -142,6 +143,9 @@ int llcc_slice_activate(struct llcc_slice_desc *desc)
|
||||||
int ret;
|
int ret;
|
||||||
u32 act_ctrl_val;
|
u32 act_ctrl_val;
|
||||||
|
|
||||||
|
if (IS_ERR_OR_NULL(desc))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
mutex_lock(&drv_data->lock);
|
mutex_lock(&drv_data->lock);
|
||||||
if (test_bit(desc->slice_id, drv_data->bitmap)) {
|
if (test_bit(desc->slice_id, drv_data->bitmap)) {
|
||||||
mutex_unlock(&drv_data->lock);
|
mutex_unlock(&drv_data->lock);
|
||||||
|
@ -176,6 +180,9 @@ int llcc_slice_deactivate(struct llcc_slice_desc *desc)
|
||||||
u32 act_ctrl_val;
|
u32 act_ctrl_val;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
if (IS_ERR_OR_NULL(desc))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
mutex_lock(&drv_data->lock);
|
mutex_lock(&drv_data->lock);
|
||||||
if (!test_bit(desc->slice_id, drv_data->bitmap)) {
|
if (!test_bit(desc->slice_id, drv_data->bitmap)) {
|
||||||
mutex_unlock(&drv_data->lock);
|
mutex_unlock(&drv_data->lock);
|
||||||
|
@ -203,6 +210,9 @@ EXPORT_SYMBOL_GPL(llcc_slice_deactivate);
|
||||||
*/
|
*/
|
||||||
int llcc_get_slice_id(struct llcc_slice_desc *desc)
|
int llcc_get_slice_id(struct llcc_slice_desc *desc)
|
||||||
{
|
{
|
||||||
|
if (IS_ERR_OR_NULL(desc))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
return desc->slice_id;
|
return desc->slice_id;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(llcc_get_slice_id);
|
EXPORT_SYMBOL_GPL(llcc_get_slice_id);
|
||||||
|
@ -213,6 +223,9 @@ EXPORT_SYMBOL_GPL(llcc_get_slice_id);
|
||||||
*/
|
*/
|
||||||
size_t llcc_get_slice_size(struct llcc_slice_desc *desc)
|
size_t llcc_get_slice_size(struct llcc_slice_desc *desc)
|
||||||
{
|
{
|
||||||
|
if (IS_ERR_OR_NULL(desc))
|
||||||
|
return 0;
|
||||||
|
|
||||||
return desc->slice_size;
|
return desc->slice_size;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(llcc_get_slice_size);
|
EXPORT_SYMBOL_GPL(llcc_get_slice_size);
|
||||||
|
@ -360,5 +373,5 @@ int qcom_llcc_probe(struct platform_device *pdev,
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(qcom_llcc_probe);
|
EXPORT_SYMBOL_GPL(qcom_llcc_probe);
|
||||||
|
|
||||||
MODULE_LICENSE("GPL v2");
|
MODULE_LICENSE("GPL v2");
|
||||||
|
MODULE_DESCRIPTION("Qualcomm Last Level Cache Controller");
|
||||||
|
|
|
@ -215,6 +215,16 @@ static void geni_se_io_init(void __iomem *base)
|
||||||
writel_relaxed(FORCE_DEFAULT, base + GENI_FORCE_DEFAULT_REG);
|
writel_relaxed(FORCE_DEFAULT, base + GENI_FORCE_DEFAULT_REG);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void geni_se_irq_clear(struct geni_se *se)
|
||||||
|
{
|
||||||
|
writel_relaxed(0, se->base + SE_GSI_EVENT_EN);
|
||||||
|
writel_relaxed(0xffffffff, se->base + SE_GENI_M_IRQ_CLEAR);
|
||||||
|
writel_relaxed(0xffffffff, se->base + SE_GENI_S_IRQ_CLEAR);
|
||||||
|
writel_relaxed(0xffffffff, se->base + SE_DMA_TX_IRQ_CLR);
|
||||||
|
writel_relaxed(0xffffffff, se->base + SE_DMA_RX_IRQ_CLR);
|
||||||
|
writel_relaxed(0xffffffff, se->base + SE_IRQ_EN);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* geni_se_init() - Initialize the GENI serial engine
|
* geni_se_init() - Initialize the GENI serial engine
|
||||||
* @se: Pointer to the concerned serial engine.
|
* @se: Pointer to the concerned serial engine.
|
||||||
|
@ -228,6 +238,7 @@ void geni_se_init(struct geni_se *se, u32 rx_wm, u32 rx_rfr)
|
||||||
{
|
{
|
||||||
u32 val;
|
u32 val;
|
||||||
|
|
||||||
|
geni_se_irq_clear(se);
|
||||||
geni_se_io_init(se->base);
|
geni_se_io_init(se->base);
|
||||||
geni_se_io_set_mode(se->base);
|
geni_se_io_set_mode(se->base);
|
||||||
|
|
||||||
|
@ -249,12 +260,7 @@ static void geni_se_select_fifo_mode(struct geni_se *se)
|
||||||
u32 proto = geni_se_read_proto(se);
|
u32 proto = geni_se_read_proto(se);
|
||||||
u32 val;
|
u32 val;
|
||||||
|
|
||||||
writel_relaxed(0, se->base + SE_GSI_EVENT_EN);
|
geni_se_irq_clear(se);
|
||||||
writel_relaxed(0xffffffff, se->base + SE_GENI_M_IRQ_CLEAR);
|
|
||||||
writel_relaxed(0xffffffff, se->base + SE_GENI_S_IRQ_CLEAR);
|
|
||||||
writel_relaxed(0xffffffff, se->base + SE_DMA_TX_IRQ_CLR);
|
|
||||||
writel_relaxed(0xffffffff, se->base + SE_DMA_RX_IRQ_CLR);
|
|
||||||
writel_relaxed(0xffffffff, se->base + SE_IRQ_EN);
|
|
||||||
|
|
||||||
val = readl_relaxed(se->base + SE_GENI_M_IRQ_EN);
|
val = readl_relaxed(se->base + SE_GENI_M_IRQ_EN);
|
||||||
if (proto != GENI_SE_UART) {
|
if (proto != GENI_SE_UART) {
|
||||||
|
@ -277,12 +283,7 @@ static void geni_se_select_dma_mode(struct geni_se *se)
|
||||||
{
|
{
|
||||||
u32 val;
|
u32 val;
|
||||||
|
|
||||||
writel_relaxed(0, se->base + SE_GSI_EVENT_EN);
|
geni_se_irq_clear(se);
|
||||||
writel_relaxed(0xffffffff, se->base + SE_GENI_M_IRQ_CLEAR);
|
|
||||||
writel_relaxed(0xffffffff, se->base + SE_GENI_S_IRQ_CLEAR);
|
|
||||||
writel_relaxed(0xffffffff, se->base + SE_DMA_TX_IRQ_CLR);
|
|
||||||
writel_relaxed(0xffffffff, se->base + SE_DMA_RX_IRQ_CLR);
|
|
||||||
writel_relaxed(0xffffffff, se->base + SE_IRQ_EN);
|
|
||||||
|
|
||||||
val = readl_relaxed(se->base + SE_GENI_DMA_MODE_EN);
|
val = readl_relaxed(se->base + SE_GENI_DMA_MODE_EN);
|
||||||
val |= GENI_DMA_MODE_EN;
|
val |= GENI_DMA_MODE_EN;
|
||||||
|
|
|
@ -318,7 +318,7 @@ int qmi_txn_init(struct qmi_handle *qmi, struct qmi_txn *txn,
|
||||||
txn->dest = c_struct;
|
txn->dest = c_struct;
|
||||||
|
|
||||||
mutex_lock(&qmi->txn_lock);
|
mutex_lock(&qmi->txn_lock);
|
||||||
ret = idr_alloc_cyclic(&qmi->txns, txn, 0, INT_MAX, GFP_KERNEL);
|
ret = idr_alloc_cyclic(&qmi->txns, txn, 0, U16_MAX, GFP_KERNEL);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
pr_err("failed to allocate transaction id\n");
|
pr_err("failed to allocate transaction id\n");
|
||||||
|
|
||||||
|
|
|
@ -227,6 +227,7 @@ static const struct of_device_id qcom_smd_rpm_of_match[] = {
|
||||||
{ .compatible = "qcom,rpm-msm8974" },
|
{ .compatible = "qcom,rpm-msm8974" },
|
||||||
{ .compatible = "qcom,rpm-msm8996" },
|
{ .compatible = "qcom,rpm-msm8996" },
|
||||||
{ .compatible = "qcom,rpm-msm8998" },
|
{ .compatible = "qcom,rpm-msm8998" },
|
||||||
|
{ .compatible = "qcom,rpm-qcs404" },
|
||||||
{}
|
{}
|
||||||
};
|
};
|
||||||
MODULE_DEVICE_TABLE(of, qcom_smd_rpm_of_match);
|
MODULE_DEVICE_TABLE(of, qcom_smd_rpm_of_match);
|
||||||
|
|
|
@ -166,7 +166,7 @@ struct qmi_ops {
|
||||||
struct qmi_txn {
|
struct qmi_txn {
|
||||||
struct qmi_handle *qmi;
|
struct qmi_handle *qmi;
|
||||||
|
|
||||||
int id;
|
u16 id;
|
||||||
|
|
||||||
struct mutex lock;
|
struct mutex lock;
|
||||||
struct completion completion;
|
struct completion completion;
|
||||||
|
|
|
@ -18,9 +18,7 @@ enum cmd_db_hw_type {
|
||||||
#if IS_ENABLED(CONFIG_QCOM_COMMAND_DB)
|
#if IS_ENABLED(CONFIG_QCOM_COMMAND_DB)
|
||||||
u32 cmd_db_read_addr(const char *resource_id);
|
u32 cmd_db_read_addr(const char *resource_id);
|
||||||
|
|
||||||
int cmd_db_read_aux_data(const char *resource_id, u8 *data, size_t len);
|
const void *cmd_db_read_aux_data(const char *resource_id, size_t *len);
|
||||||
|
|
||||||
size_t cmd_db_read_aux_data_len(const char *resource_id);
|
|
||||||
|
|
||||||
enum cmd_db_hw_type cmd_db_read_slave_id(const char *resource_id);
|
enum cmd_db_hw_type cmd_db_read_slave_id(const char *resource_id);
|
||||||
|
|
||||||
|
@ -29,12 +27,8 @@ int cmd_db_ready(void);
|
||||||
static inline u32 cmd_db_read_addr(const char *resource_id)
|
static inline u32 cmd_db_read_addr(const char *resource_id)
|
||||||
{ return 0; }
|
{ return 0; }
|
||||||
|
|
||||||
static inline int cmd_db_read_aux_data(const char *resource_id, u8 *data,
|
static inline const void *cmd_db_read_aux_data(const char *resource_id, size_t *len)
|
||||||
size_t len)
|
{ return ERR_PTR(-ENODEV); }
|
||||||
{ return -ENODEV; }
|
|
||||||
|
|
||||||
static inline size_t cmd_db_read_aux_data_len(const char *resource_id)
|
|
||||||
{ return -ENODEV; }
|
|
||||||
|
|
||||||
static inline enum cmd_db_hw_type cmd_db_read_slave_id(const char *resource_id)
|
static inline enum cmd_db_hw_type cmd_db_read_slave_id(const char *resource_id)
|
||||||
{ return -ENODEV; }
|
{ return -ENODEV; }
|
||||||
|
|
Loading…
Reference in New Issue