mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 18:51:56 -04:00
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 <[email protected]>
This commit is contained in:
commit
202f9977b0
10 changed files with 88 additions and 129 deletions
|
|
@ -75,11 +75,6 @@ config QCOM_QMI_HELPERS
|
|||
tristate
|
||||
depends on ARCH_QCOM || COMPILE_TEST
|
||||
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
|
||||
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 inline void *rsc_to_entry_header(struct rsc_hdr *hdr)
|
||||
static inline const void *rsc_to_entry_header(const struct rsc_hdr *hdr)
|
||||
{
|
||||
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 *
|
||||
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 loffset = le16_to_cpu(ent->offset);
|
||||
|
|
@ -134,11 +133,11 @@ int cmd_db_ready(void)
|
|||
}
|
||||
EXPORT_SYMBOL(cmd_db_ready);
|
||||
|
||||
static int cmd_db_get_header(const char *id, struct entry_header *eh,
|
||||
struct rsc_hdr *rh)
|
||||
static int cmd_db_get_header(const char *id, const struct entry_header **eh,
|
||||
const struct rsc_hdr **rh)
|
||||
{
|
||||
struct rsc_hdr *rsc_hdr;
|
||||
struct entry_header *ent;
|
||||
const struct rsc_hdr *rsc_hdr;
|
||||
const struct entry_header *ent;
|
||||
int ret, i, j;
|
||||
u8 query[8];
|
||||
|
||||
|
|
@ -146,9 +145,6 @@ static int cmd_db_get_header(const char *id, struct entry_header *eh,
|
|||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (!eh || !rh)
|
||||
return -EINVAL;
|
||||
|
||||
/* Pad out query string to same length as in DB */
|
||||
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);
|
||||
for (j = 0; j < le16_to_cpu(rsc_hdr->cnt); j++, ent++) {
|
||||
if (memcmp(ent->id, query, sizeof(ent->id)) == 0)
|
||||
break;
|
||||
}
|
||||
|
||||
if (j < le16_to_cpu(rsc_hdr->cnt)) {
|
||||
memcpy(eh, ent, sizeof(*ent));
|
||||
memcpy(rh, rsc_hdr, sizeof(*rh));
|
||||
return 0;
|
||||
if (memcmp(ent->id, query, sizeof(ent->id)) == 0) {
|
||||
if (eh)
|
||||
*eh = ent;
|
||||
if (rh)
|
||||
*rh = rsc_hdr;
|
||||
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)
|
||||
{
|
||||
int ret;
|
||||
struct entry_header ent;
|
||||
struct rsc_hdr rsc_hdr;
|
||||
const struct entry_header *ent;
|
||||
|
||||
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);
|
||||
|
||||
/**
|
||||
* cmd_db_read_aux_data() - Query command db for aux data.
|
||||
*
|
||||
* @id: Resource to retrieve AUX Data on.
|
||||
* @data: Data buffer to copy returned aux data to. Returns size on NULL
|
||||
* @len: Caller provides size of data buffer passed in.
|
||||
* @id: Resource to retrieve AUX Data on
|
||||
* @len: size of data buffer returned
|
||||
*
|
||||
* 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;
|
||||
struct entry_header ent;
|
||||
struct rsc_hdr rsc_hdr;
|
||||
u16 ent_len;
|
||||
|
||||
if (!data)
|
||||
return -EINVAL;
|
||||
const struct entry_header *ent;
|
||||
const struct rsc_hdr *rsc_hdr;
|
||||
|
||||
ret = cmd_db_get_header(id, &ent, &rsc_hdr);
|
||||
if (ret)
|
||||
return ret;
|
||||
return ERR_PTR(ret);
|
||||
|
||||
ent_len = le16_to_cpu(ent.len);
|
||||
if (len < ent_len)
|
||||
return -EINVAL;
|
||||
if (len)
|
||||
*len = le16_to_cpu(ent->len);
|
||||
|
||||
len = min_t(u16, ent_len, len);
|
||||
memcpy(data, rsc_offset(&rsc_hdr, &ent), len);
|
||||
|
||||
return len;
|
||||
return rsc_offset(rsc_hdr, ent);
|
||||
}
|
||||
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
|
||||
*
|
||||
|
|
@ -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)
|
||||
{
|
||||
int ret;
|
||||
struct entry_header ent;
|
||||
struct rsc_hdr rsc_hdr;
|
||||
const struct entry_header *ent;
|
||||
u32 addr;
|
||||
|
||||
ret = cmd_db_get_header(id, &ent, &rsc_hdr);
|
||||
ret = cmd_db_get_header(id, &ent, NULL);
|
||||
if (ret < 0)
|
||||
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;
|
||||
}
|
||||
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)
|
||||
{
|
||||
kfree(desc);
|
||||
if (!IS_ERR_OR_NULL(desc))
|
||||
kfree(desc);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(llcc_slice_putd);
|
||||
|
||||
|
|
@ -142,6 +143,9 @@ int llcc_slice_activate(struct llcc_slice_desc *desc)
|
|||
int ret;
|
||||
u32 act_ctrl_val;
|
||||
|
||||
if (IS_ERR_OR_NULL(desc))
|
||||
return -EINVAL;
|
||||
|
||||
mutex_lock(&drv_data->lock);
|
||||
if (test_bit(desc->slice_id, drv_data->bitmap)) {
|
||||
mutex_unlock(&drv_data->lock);
|
||||
|
|
@ -176,6 +180,9 @@ int llcc_slice_deactivate(struct llcc_slice_desc *desc)
|
|||
u32 act_ctrl_val;
|
||||
int ret;
|
||||
|
||||
if (IS_ERR_OR_NULL(desc))
|
||||
return -EINVAL;
|
||||
|
||||
mutex_lock(&drv_data->lock);
|
||||
if (!test_bit(desc->slice_id, drv_data->bitmap)) {
|
||||
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)
|
||||
{
|
||||
if (IS_ERR_OR_NULL(desc))
|
||||
return -EINVAL;
|
||||
|
||||
return desc->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)
|
||||
{
|
||||
if (IS_ERR_OR_NULL(desc))
|
||||
return 0;
|
||||
|
||||
return desc->slice_size;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(llcc_get_slice_size);
|
||||
|
|
@ -360,5 +373,5 @@ int qcom_llcc_probe(struct platform_device *pdev,
|
|||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(qcom_llcc_probe);
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
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
|
||||
* @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;
|
||||
|
||||
geni_se_irq_clear(se);
|
||||
geni_se_io_init(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 val;
|
||||
|
||||
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_irq_clear(se);
|
||||
|
||||
val = readl_relaxed(se->base + SE_GENI_M_IRQ_EN);
|
||||
if (proto != GENI_SE_UART) {
|
||||
|
|
@ -277,12 +283,7 @@ static void geni_se_select_dma_mode(struct geni_se *se)
|
|||
{
|
||||
u32 val;
|
||||
|
||||
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_irq_clear(se);
|
||||
|
||||
val = readl_relaxed(se->base + SE_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;
|
||||
|
||||
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)
|
||||
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-msm8996" },
|
||||
{ .compatible = "qcom,rpm-msm8998" },
|
||||
{ .compatible = "qcom,rpm-qcs404" },
|
||||
{}
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, qcom_smd_rpm_of_match);
|
||||
|
|
|
|||
Loading…
Reference in a new issue