: spmi: pmic-arb: Support for HW v5 and other fixes
Subsystems (2)
v2 cover : spmi: pmic-arb: Support for HW v5 and other fixes
v2:
* [PATCH V2 04/12] spmi: pmic-arb: optimize qpnpint_irq_set_type function Added Stephen's Reviewed-by tag.
* [PATCH V2 05/12] spmi: pmic-arb: fix memory allocation for mapping_table Added Fixes tag and Stephen's Reviewed-by tag.
* [PATCH V2 02/12] spmi: pmic-arb: rename pa_xx to pmic_arb_xx and other cleanup Added Stephen's Reviewed-by tag.
* [PATCH V2 06/12] spmi: pmic-arb: replace the writel_relaxed with __raw_writel Added Fixes tag.
* [PATCH V2 03/12] spmi: pmic-arb: clean up pmic_arb_find_apid function Fixed alignement issue and added Stephen's reviewed-by tag.
Now all the patches in this series are reviewed and acked by Stephen boyd and are ready for merge.
v1:
* This patch series add the support for pmic arbiter hardware v5 along with the few bug fixes and code cleanup.
* This new series is the combined series of
[PATCH V3 0/5]: spmi: pmic-arb: Fixup patches and
[PATCH V4 0/4]: spmi: pmic-arb: support for V5 HW and bug fixes, which are being reviewed by Stephen Boyd.
* This series depends on the below patch uploaded by Stephen Boyd
https://patchwork.kernel.org/patch/9810723/.
David Collins (1):
spmi: pmic-arb: add support for HW version 5
Fenglin Wu (1):
spmi: pmic-arb: Remove checking opc value not less than 0
Kiran Gunda (10):
spmi: pmic-arb: remove the read/write access checks
spmi: pmic-arb: rename pa_xx to pmic_arb_xx and other cleanup
spmi: pmic-arb: clean up pmic_arb_find_apid function
spmi: pmic-arb: optimize qpnpint_irq_set_type function
spmi: pmic-arb: fix memory allocation for mapping_table
spmi: pmic-arb: replace the writel_relaxed with __raw_writel
spmi: pmic-arb: return the value instead of passing by pointer
spmi: pmic-arb: use irq_chip callback to set spmi irq wakeup
capability
spmi: pmic-arb: return __iomem pointer instead of offset
spmi: pmic-arb: fix a possible null pointer dereference
drivers/spmi/spmi-pmic-arb.c | 825 +++++++++++++++++++++++++------------------ 1 file changed, 481 insertions(+), 344 deletions(-)
Signature · 2 lines
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project
PATCH v2 1/12 spmi: pmic-arb: remove the read/write access checks
The access mode checks for peripheral ownership for read/write permissions should not be required. Every peripheral enabled for this master is expected to have a read/write permissions. If there is any such invalid access due to wrong configuration in boot loader or device tree files, then it should be fixed in those locations. Hence, remove the access mode checks from the driver.
--- drivers/spmi/spmi-pmic-arb.c | 75 +++----------------------------------------- 1 file changed, 5 insertions(+), 70 deletions(-)
drivers/spmi/spmi-pmic-arb.c +5 -70
@@ -128,7 +128,6 @@ struct apid_data {* @ee: the current Execution Environment * @min_apid: minimum APID (used for bounding IRQ search) * @max_apid: maximum APID -* @max_periph: maximum number of PMIC peripherals supported by HW. * @mapping_table: in-memory copy of PPID -> APID mapping table. * @domain: irq domain object for PMIC IRQ domain * @spmic: SPMI controller object
@@ -148,7 +147,6 @@ struct spmi_pmic_arb {u8 ee;u16 min_apid;u16 max_apid; -u16 max_periph;u32 *mapping_table;DECLARE_BITMAP (mapping_table_valid,PMIC_ARB_MAX_PERIPHS );struct irq_domain *domain;
@@ -164,7 +162,6 @@ struct spmi_pmic_arb {* * @ver_str: version string. * @ppid_to_apid: finds the apid for a given ppid. -* @mode: access rights to specified pmic peripheral. * @non_data_cmd: on v1 issues an spmi non-data command. * on v2 no HW support, returns -EOPNOTSUPP. * @offset: on v1 offset of per-ee channel.
@@ -183,8 +180,6 @@ struct pmic_arb_ver_ops {const char *ver_str;int (*ppid_to_apid)(struct spmi_pmic_arb *pa,u8 sid,u16 addr,u16 *apid); -int (*mode)(struct spmi_pmic_arb *dev,u8 sid,u16 addr, -mode_t *mode);/* spmi commands (read_cmd, write_cmd, cmd) functionality */ int (*offset)(struct spmi_pmic_arb *dev,u8 sid,u16 addr,u32 *offset);
@@ -340,23 +335,11 @@ static int pmic_arb_read_cmd(struct spmi_controller *ctrl, u8 opc, u8 sid,u32 cmd;int rc;u32 offset; -mode_t mode; rc = pa->ver_ops->offset (pa, sid, addr, &offset);if (rc)return rc; - rc = pa->ver_ops->mode (pa, sid, addr, &mode); -if (rc) -return rc; - -if (!(mode &S_IRUSR )) { -dev_err (&pa->spmic->dev, -"error: impermissible read from peripheral sid:%d addr:0x%x\n" , - sid, addr); -return -EPERM ; - } -if (bc >=PMIC_ARB_MAX_TRANS_BYTES ) { dev_err(&ctrl->dev, "pmic-arb supports 1..%d bytes per trans, but:%zu requested",
@@ -402,23 +385,11 @@ static int pmic_arb_write_cmd(struct spmi_controller *ctrl, u8 opc, u8 sid,u32 cmd;int rc;u32 offset; -mode_t mode; rc = pa->ver_ops->offset (pa, sid, addr, &offset);if (rc)return rc; - rc = pa->ver_ops->mode (pa, sid, addr, &mode); -if (rc) -return rc; - -if (!(mode &S_IWUSR )) { -dev_err (&pa->spmic->dev, -"error: impermissible write to peripheral sid:%d addr:0x%x\n" , - sid, addr); -return -EPERM ; - } -if (bc >=PMIC_ARB_MAX_TRANS_BYTES ) { dev_err(&ctrl->dev, "pmic-arb supports 1..%d bytes per trans, but:%zu requested",
@@ -785,13 +756,6 @@ static int qpnpint_irq_domain_map(struct irq_domain *d,return -ENODEV ; } -static int -pmic_arb_mode_v1_v3 (struct spmi_pmic_arb *pa,u8 sid,u16 addr,mode_t *mode) -{ - *mode =S_IRUSR |S_IWUSR ; -return 0 ; -} -/* v1 offset per ee */ static int pmic_arb_offset_v1 (struct spmi_pmic_arb *pa,u8 sid,u16 addr,u32 *offset)
@@ -810,15 +774,15 @@ static u16 pmic_arb_find_apid(struct spmi_pmic_arb *pa, u16 ppid)* PMIC_ARB_REG_CHNL is a table in HW mapping channel to ppid. * ppid_to_apid is an in-memory invert of that table. */ -for (apid = pa->last_apid; apid < pa->max_periph; apid++) { - regval =readl_relaxed (pa->cnfg + -SPMI_OWNERSHIP_TABLE_REG (apid)); - pa->apid_data[apid].owner =SPMI_OWNERSHIP_PERIPH2OWNER (regval); - +for (apid = pa->last_apid; ; apid++) { offset =PMIC_ARB_REG_CHNL (apid);if (offset >= pa->core_size)break ; + regval =readl_relaxed (pa->cnfg + +SPMI_OWNERSHIP_TABLE_REG (apid)); + pa->apid_data[apid].owner =SPMI_OWNERSHIP_PERIPH2OWNER (regval); + regval =readl_relaxed (pa->core + offset);if (!regval)continue ;
@@ -853,24 +817,6 @@ static u16 pmic_arb_find_apid(struct spmi_pmic_arb *pa, u16 ppid)return 0 ; } -static int -pmic_arb_mode_v2 (struct spmi_pmic_arb *pa,u8 sid,u16 addr,mode_t *mode) -{ -u16 apid; -int rc; - - rc =pmic_arb_ppid_to_apid_v2 (pa, sid, addr, &apid); -if (rc <0 ) -return rc; - - *mode =0 ; - *mode |=S_IRUSR ; - -if (pa->ee == pa->apid_data[apid].owner) - *mode |=S_IWUSR ; -return 0 ; -} -/* v2 offset per ppid and per ee */ static int pmic_arb_offset_v2 (struct spmi_pmic_arb *pa,u8 sid,u16 addr,u32 *offset)
@@ -944,7 +890,6 @@ static u32 pmic_arb_irq_clear_v2(u16 n)static const struct pmic_arb_ver_ops pmic_arb_v1 = { .ver_str ="v1" , .ppid_to_apid = pmic_arb_ppid_to_apid_v1, - .mode = pmic_arb_mode_v1_v3, .non_data_cmd = pmic_arb_non_data_cmd_v1, .offset = pmic_arb_offset_v1, .fmt_cmd = pmic_arb_fmt_cmd_v1,
@@ -957,7 +902,6 @@ static u32 pmic_arb_irq_clear_v2(u16 n)static const struct pmic_arb_ver_ops pmic_arb_v2 = { .ver_str ="v2" , .ppid_to_apid = pmic_arb_ppid_to_apid_v2, - .mode = pmic_arb_mode_v2, .non_data_cmd = pmic_arb_non_data_cmd_v2, .offset = pmic_arb_offset_v2, .fmt_cmd = pmic_arb_fmt_cmd_v2,
@@ -970,7 +914,6 @@ static u32 pmic_arb_irq_clear_v2(u16 n)static const struct pmic_arb_ver_ops pmic_arb_v3 = { .ver_str ="v3" , .ppid_to_apid = pmic_arb_ppid_to_apid_v2, - .mode = pmic_arb_mode_v1_v3, .non_data_cmd = pmic_arb_non_data_cmd_v2, .offset = pmic_arb_offset_v2, .fmt_cmd = pmic_arb_fmt_cmd_v2,
@@ -1003,11 +946,6 @@ static int spmi_pmic_arb_probe(struct platform_device *pdev) res =platform_get_resource_byname (pdev,IORESOURCE_MEM ,"core" ); pa->core_size =resource_size (res); -if (pa->core_size <=0x800 ) { -dev_err (&pdev->dev,"core_size is smaller than 0x800. Failing Probe\n" ); - err = -EINVAL ; - goto err_put_ctrl; - } core =devm_ioremap_resource (&ctrl->dev, res);if (IS_ERR (core)) {
@@ -1036,9 +974,6 @@ static int spmi_pmic_arb_probe(struct platform_device *pdev)else pa->ver_ops = &pmic_arb_v3; -/* the apid to ppid table starts at PMIC_ARB_REG_CHNL(0) */ - pa->max_periph = (pa->core_size -PMIC_ARB_REG_CHNL (0 )) /4 ; - res =platform_get_resource_byname (pdev,IORESOURCE_MEM ,"obsrvr" ); pa->rd_base =devm_ioremap_resource (&ctrl->dev, res);
Signature · 2 lines
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project
PATCH v2 2/12 spmi: pmic-arb: rename pa_xx to pmic_arb_xx and other cleanup
In reply to Kiran GundaThis patch cleans up the following.
- Rename the "pa" to "pmic_arb".
- Rename the spmi_pmic_arb *dev to spmi_pmic_arb *pmic_arb.
- Rename the pa_{read,write}_data() functions to pmic_arb_{read,write}_data().
- Rename channel to APID.
- Rename the HWIRQ_*() macros to hwirq_to_*().
--- drivers/spmi/spmi-pmic-arb.c | 418 +++++++++++++++++++++---------------------- 1 file changed, 209 insertions(+), 209 deletions(-)
drivers/spmi/spmi-pmic-arb.c +209 -209
@@ -39,7 +39,7 @@#define PMIC_ARB_WDATA1 0x14#define PMIC_ARB_RDATA0 0x18#define PMIC_ARB_RDATA1 0x1C -#define PMIC_ARB_REG_CHNL (N ) (0x800 + 0x4 * (N)) +#define PMIC_ARB_REG_APID (N ) (0x800 + 0x4 * (N))/* Mapping Table */ #define SPMI_MAPPING_TABLE_REG (N ) (0x0B00 + (4 * (N)))
@@ -51,7 +51,7 @@#define SPMI_MAPPING_TABLE_TREE_DEPTH 16/* Maximum of 16-bits */ #define PMIC_ARB_MAX_PPID BIT(12)/* PPID is 12bit */ -#define PMIC_ARB_CHAN_VALID BIT(15) +#define PMIC_ARB_APID_VALID BIT(15)/* Ownership Table */ #define SPMI_OWNERSHIP_TABLE_REG (N ) (0x0700 + (4 * (N)))
@@ -97,16 +97,16 @@ enum pmic_arb_cmd_op_code {/* interrupt enable bit */ #define SPMI_PIC_ACC_ENABLE_BIT BIT(0) -#define HWIRQ (slave_id, periph_id, irq_id, apid) \ +#define spec_to_hwirq (slave_id, periph_id, irq_id, apid) \ ((((slave_id) & 0xF) << 28) | \ (((periph_id) & 0xFF) << 20) | \ (((irq_id) & 0x7) << 16) | \ (((apid) & 0x1FF) << 0)) -#define HWIRQ_SID (hwirq) (((hwirq) >> 28) & 0xF) -#define HWIRQ_PER (hwirq) (((hwirq) >> 20) & 0xFF) -#define HWIRQ_IRQ (hwirq) (((hwirq) >> 16) & 0x7) -#define HWIRQ_APID (hwirq) (((hwirq) >> 0) & 0x1FF) +#define hwirq_to_sid (hwirq) (((hwirq) >> 28) & 0xF) +#define hwirq_to_per (hwirq) (((hwirq) >> 20) & 0xFF) +#define hwirq_to_irq (hwirq) (((hwirq) >> 16) & 0x7) +#define hwirq_to_apid (hwirq) (((hwirq) >> 0) & 0x1FF)struct pmic_arb_ver_ops ;
@@ -132,7 +132,7 @@ struct apid_data {* @domain: irq domain object for PMIC IRQ domain * @spmic: SPMI controller object * @ver_ops: version dependent operations. -* @ppid_to_apid in-memory copy of PPID -> channel (APID) mapping table. +* @ppid_to_apid in-memory copy of PPID -> APID mapping table. */ struct spmi_pmic_arb {void __iomem *rd_base;
@@ -178,10 +178,10 @@ struct spmi_pmic_arb {*/ struct pmic_arb_ver_ops {const char *ver_str; -int (*ppid_to_apid)(struct spmi_pmic_arb *pa,u8 sid,u16 addr, +int (*ppid_to_apid)(struct spmi_pmic_arb *pmic_arb,u8 sid,u16 addr,u16 *apid);/* spmi commands (read_cmd, write_cmd, cmd) functionality */ -int (*offset)(struct spmi_pmic_arb *dev,u8 sid,u16 addr, +int (*offset)(struct spmi_pmic_arb *pmic_arb,u8 sid,u16 addr,u32 *offset);u32 (*fmt_cmd)(u8 opc,u8 sid,u16 addr,u8 bc);int (*non_data_cmd)(struct spmi_controller *ctrl,u8 opc,u8 sid);
@@ -192,56 +192,57 @@ struct pmic_arb_ver_ops {u32 (*irq_clear)(u16 n); }; -static inline void pmic_arb_base_write (struct spmi_pmic_arb *pa, +static inline void pmic_arb_base_write (struct spmi_pmic_arb *pmic_arb,u32 offset,u32 val) { -writel_relaxed (val, pa->wr_base + offset); +writel_relaxed (val, pmic_arb->wr_base + offset); } -static inline void pmic_arb_set_rd_cmd (struct spmi_pmic_arb *pa, +static inline void pmic_arb_set_rd_cmd (struct spmi_pmic_arb *pmic_arb,u32 offset,u32 val) { -writel_relaxed (val, pa->rd_base + offset); +writel_relaxed (val, pmic_arb->rd_base + offset); }/** -* pa_read_data: reads pmic-arb's register and copy 1..4 bytes to buf +* pmic_arb_read_data: reads pmic-arb's register and copy 1..4 bytes to buf * @bc: byte count -1. range: 0..3 * @reg: register's address * @buf: output parameter, length must be bc + 1 */ -static void pa_read_data (struct spmi_pmic_arb *pa,u8 *buf,u32 reg,u8 bc) +static void +pmic_arb_read_data (struct spmi_pmic_arb *pmic_arb,u8 *buf,u32 reg,u8 bc) { -u32 data =__raw_readl (pa->rd_base + reg); +u32 data =__raw_readl (pmic_arb->rd_base + reg);memcpy (buf, &data, (bc &3 ) +1 ); }/** -* pa_write_data: write 1..4 bytes from buf to pmic-arb's register +* pmic_arb_write_data: write 1..4 bytes from buf to pmic-arb's register * @bc: byte-count -1. range: 0..3. * @reg: register's address. * @buf: buffer to write. length must be bc + 1. */ -static void -pa_write_data (struct spmi_pmic_arb *pa,const u8 *buf,u32 reg,u8 bc) +static void pmic_arb_write_data (struct spmi_pmic_arb *pmic_arb,const u8 *buf, +u32 reg,u8 bc) {u32 data =0 ;memcpy (&data, buf, (bc &3 ) +1 ); -pmic_arb_base_write (pa, reg, data); +pmic_arb_base_write (pmic_arb, reg, data); }static int pmic_arb_wait_for_done (struct spmi_controller *ctrl,void __iomem *base,u8 sid,u16 addr) { -struct spmi_pmic_arb *pa =spmi_controller_get_drvdata (ctrl); +struct spmi_pmic_arb *pmic_arb =spmi_controller_get_drvdata (ctrl);u32 status =0 ;u32 timeout =PMIC_ARB_TIMEOUT_US ;u32 offset;int rc; - rc = pa->ver_ops->offset (pa, sid, addr, &offset); + rc = pmic_arb->ver_ops->offset (pmic_arb, sid, addr, &offset);if (rc)return rc;
@@ -252,22 +253,19 @@ static int pmic_arb_wait_for_done(struct spmi_controller *ctrl,if (status &PMIC_ARB_STATUS_DONE ) {if (status &PMIC_ARB_STATUS_DENIED ) { -dev_err (&ctrl->dev, -"%s: transaction denied (0x%x)\n" , +dev_err (&ctrl->dev,"%s: transaction denied (0x%x)\n" , __func__, status);return -EPERM ; }if (status &PMIC_ARB_STATUS_FAILURE ) { -dev_err (&ctrl->dev, -"%s: transaction failed (0x%x)\n" , +dev_err (&ctrl->dev,"%s: transaction failed (0x%x)\n" , __func__, status);return -EIO ; }if (status &PMIC_ARB_STATUS_DROPPED ) { -dev_err (&ctrl->dev, -"%s: transaction dropped (0x%x)\n" , +dev_err (&ctrl->dev,"%s: transaction dropped (0x%x)\n" , __func__, status);return -EIO ; }
@@ -277,8 +275,7 @@ static int pmic_arb_wait_for_done(struct spmi_controller *ctrl,udelay (1 ); } -dev_err (&ctrl->dev, -"%s: timeout, status 0x%x\n" , +dev_err (&ctrl->dev,"%s: timeout, status 0x%x\n" , __func__, status);return -ETIMEDOUT ; }
@@ -286,22 +283,22 @@ static int pmic_arb_wait_for_done(struct spmi_controller *ctrl,static int pmic_arb_non_data_cmd_v1 (struct spmi_controller *ctrl,u8 opc,u8 sid) { -struct spmi_pmic_arb *pa =spmi_controller_get_drvdata (ctrl); +struct spmi_pmic_arb *pmic_arb =spmi_controller_get_drvdata (ctrl);unsigned long flags;u32 cmd;int rc;u32 offset; - rc = pa->ver_ops->offset (pa, sid,0 , &offset); + rc = pmic_arb->ver_ops->offset (pmic_arb, sid,0 , &offset);if (rc)return rc; cmd = ((opc |0x40 ) <<27 ) | ((sid &0xf ) <<20 ); -raw_spin_lock_irqsave (&pa->lock, flags); -pmic_arb_base_write (pa, offset +PMIC_ARB_CMD , cmd); - rc =pmic_arb_wait_for_done (ctrl, pa->wr_base, sid,0 ); -raw_spin_unlock_irqrestore (&pa->lock, flags); +raw_spin_lock_irqsave (&pmic_arb->lock, flags); +pmic_arb_base_write (pmic_arb, offset +PMIC_ARB_CMD , cmd); + rc =pmic_arb_wait_for_done (ctrl, pmic_arb->wr_base, sid,0 ); +raw_spin_unlock_irqrestore (&pmic_arb->lock, flags);return rc; }
@@ -315,7 +312,7 @@ static int pmic_arb_wait_for_done(struct spmi_controller *ctrl,/* Non-data command */ static int pmic_arb_cmd (struct spmi_controller *ctrl,u8 opc,u8 sid) { -struct spmi_pmic_arb *pa =spmi_controller_get_drvdata (ctrl); +struct spmi_pmic_arb *pmic_arb =spmi_controller_get_drvdata (ctrl);dev_dbg (&ctrl->dev,"cmd op:0x%x sid:%d\n" , opc, sid);
@@ -323,26 +320,25 @@ static int pmic_arb_cmd(struct spmi_controller *ctrl, u8 opc, u8 sid)if (opc <SPMI_CMD_RESET || opc >SPMI_CMD_WAKEUP )return -EINVAL ; -return pa->ver_ops->non_data_cmd (ctrl, opc, sid); +return pmic_arb->ver_ops->non_data_cmd (ctrl, opc, sid); }static int pmic_arb_read_cmd (struct spmi_controller *ctrl,u8 opc,u8 sid,u16 addr,u8 *buf,size_t len) { -struct spmi_pmic_arb *pa =spmi_controller_get_drvdata (ctrl); +struct spmi_pmic_arb *pmic_arb =spmi_controller_get_drvdata (ctrl);unsigned long flags;u8 bc = len -1 ;u32 cmd;int rc;u32 offset; - rc = pa->ver_ops->offset (pa, sid, addr, &offset); + rc = pmic_arb->ver_ops->offset (pmic_arb, sid, addr, &offset);if (rc)return rc;if (bc >=PMIC_ARB_MAX_TRANS_BYTES ) { -dev_err (&ctrl->dev, -"pmic-arb supports 1..%d bytes per trans, but:%zu requested" , +dev_err (&ctrl->dev,"pmic-arb supports 1..%d bytes per trans, but:%zu requested" ,PMIC_ARB_MAX_TRANS_BYTES , len);return -EINVAL ; }
@@ -357,42 +353,42 @@ static int pmic_arb_read_cmd(struct spmi_controller *ctrl, u8 opc, u8 sid,else return -EINVAL ; - cmd = pa->ver_ops->fmt_cmd (opc, sid, addr, bc); + cmd = pmic_arb->ver_ops->fmt_cmd (opc, sid, addr, bc); -raw_spin_lock_irqsave (&pa->lock, flags); -pmic_arb_set_rd_cmd (pa, offset +PMIC_ARB_CMD , cmd); - rc =pmic_arb_wait_for_done (ctrl, pa->rd_base, sid, addr); +raw_spin_lock_irqsave (&pmic_arb->lock, flags); +pmic_arb_set_rd_cmd (pmic_arb, offset +PMIC_ARB_CMD , cmd); + rc =pmic_arb_wait_for_done (ctrl, pmic_arb->rd_base, sid, addr);if (rc) goto done; -pa_read_data (pa, buf, offset +PMIC_ARB_RDATA0 , +pmic_arb_read_data (pmic_arb, buf, offset +PMIC_ARB_RDATA0 ,min_t (u8, bc,3 ));if (bc >3 ) -pa_read_data (pa, buf +4 , offset +PMIC_ARB_RDATA1 , bc -4 ); +pmic_arb_read_data (pmic_arb, buf +4 , offset +PMIC_ARB_RDATA1 , + bc -4 ); done: -raw_spin_unlock_irqrestore (&pa->lock, flags); +raw_spin_unlock_irqrestore (&pmic_arb->lock, flags);return rc; }static int pmic_arb_write_cmd (struct spmi_controller *ctrl,u8 opc,u8 sid,u16 addr,const u8 *buf,size_t len) { -struct spmi_pmic_arb *pa =spmi_controller_get_drvdata (ctrl); +struct spmi_pmic_arb *pmic_arb =spmi_controller_get_drvdata (ctrl);unsigned long flags;u8 bc = len -1 ;u32 cmd;int rc;u32 offset; - rc = pa->ver_ops->offset (pa, sid, addr, &offset); + rc = pmic_arb->ver_ops->offset (pmic_arb, sid, addr, &offset);if (rc)return rc;if (bc >=PMIC_ARB_MAX_TRANS_BYTES ) { -dev_err (&ctrl->dev, -"pmic-arb supports 1..%d bytes per trans, but:%zu requested" , +dev_err (&ctrl->dev,"pmic-arb supports 1..%d bytes per trans, but:%zu requested" ,PMIC_ARB_MAX_TRANS_BYTES , len);return -EINVAL ; }
@@ -409,18 +405,20 @@ static int pmic_arb_write_cmd(struct spmi_controller *ctrl, u8 opc, u8 sid,else return -EINVAL ; - cmd = pa->ver_ops->fmt_cmd (opc, sid, addr, bc); + cmd = pmic_arb->ver_ops->fmt_cmd (opc, sid, addr, bc);/* Write data to FIFOs */ -raw_spin_lock_irqsave (&pa->lock, flags); -pa_write_data (pa, buf, offset +PMIC_ARB_WDATA0 ,min_t (u8, bc,3 )); +raw_spin_lock_irqsave (&pmic_arb->lock, flags); +pmic_arb_write_data (pmic_arb, buf, offset +PMIC_ARB_WDATA0 , +min_t (u8, bc,3 ));if (bc >3 ) -pa_write_data (pa, buf +4 , offset +PMIC_ARB_WDATA1 , bc -4 ); +pmic_arb_write_data (pmic_arb, buf +4 , offset +PMIC_ARB_WDATA1 , + bc -4 );/* Start the transaction */ -pmic_arb_base_write (pa, offset +PMIC_ARB_CMD , cmd); - rc =pmic_arb_wait_for_done (ctrl, pa->wr_base, sid, addr); -raw_spin_unlock_irqrestore (&pa->lock, flags); +pmic_arb_base_write (pmic_arb, offset +PMIC_ARB_CMD , cmd); + rc =pmic_arb_wait_for_done (ctrl, pmic_arb->wr_base, sid, addr); +raw_spin_unlock_irqrestore (&pmic_arb->lock, flags);return rc; }
@@ -446,67 +444,66 @@ struct spmi_pmic_arb_qpnpint_type {static void qpnpint_spmi_write (struct irq_data *d,u8 reg,void *buf,size_t len) { -struct spmi_pmic_arb *pa =irq_data_get_irq_chip_data (d); -u8 sid =HWIRQ_SID (d->hwirq); -u8 per =HWIRQ_PER (d->hwirq); +struct spmi_pmic_arb *pmic_arb =irq_data_get_irq_chip_data (d); +u8 sid =hwirq_to_sid (d->hwirq); +u8 per =hwirq_to_per (d->hwirq); -if (pmic_arb_write_cmd (pa->spmic,SPMI_CMD_EXT_WRITEL , sid, +if (pmic_arb_write_cmd (pmic_arb->spmic,SPMI_CMD_EXT_WRITEL , sid, (per <<8 ) + reg, buf, len)) -dev_err_ratelimited (&pa->spmic->dev, -"failed irqchip transaction on %x\n" , +dev_err_ratelimited (&pmic_arb->spmic->dev,"failed irqchip transaction on %x\n" , d->irq); }static void qpnpint_spmi_read (struct irq_data *d,u8 reg,void *buf,size_t len) { -struct spmi_pmic_arb *pa =irq_data_get_irq_chip_data (d); -u8 sid =HWIRQ_SID (d->hwirq); -u8 per =HWIRQ_PER (d->hwirq); +struct spmi_pmic_arb *pmic_arb =irq_data_get_irq_chip_data (d); +u8 sid =hwirq_to_sid (d->hwirq); +u8 per =hwirq_to_per (d->hwirq); -if (pmic_arb_read_cmd (pa->spmic,SPMI_CMD_EXT_READL , sid, +if (pmic_arb_read_cmd (pmic_arb->spmic,SPMI_CMD_EXT_READL , sid, (per <<8 ) + reg, buf, len)) -dev_err_ratelimited (&pa->spmic->dev, -"failed irqchip transaction on %x\n" , +dev_err_ratelimited (&pmic_arb->spmic->dev,"failed irqchip transaction on %x\n" , d->irq); } -static void cleanup_irq (struct spmi_pmic_arb *pa,u16 apid,int id) +static void cleanup_irq (struct spmi_pmic_arb *pmic_arb,u16 apid,int id) { -u16 ppid = pa->apid_data[apid].ppid; +u16 ppid = pmic_arb->apid_data[apid].ppid;u8 sid = ppid >>8 ;u8 per = ppid &0xFF ;u8 irq_mask =BIT (id); -writel_relaxed (irq_mask, pa->intr + pa->ver_ops->irq_clear (apid)); +writel_relaxed (irq_mask, pmic_arb->intr + + pmic_arb->ver_ops->irq_clear (apid)); -if (pmic_arb_write_cmd (pa->spmic,SPMI_CMD_EXT_WRITEL , sid, +if (pmic_arb_write_cmd (pmic_arb->spmic,SPMI_CMD_EXT_WRITEL , sid, (per <<8 ) +QPNPINT_REG_LATCHED_CLR , &irq_mask,1 )) -dev_err_ratelimited (&pa->spmic->dev, -"failed to ack irq_mask = 0x%x for ppid = %x\n" , +dev_err_ratelimited (&pmic_arb->spmic->dev,"failed to ack irq_mask = 0x%x for ppid = %x\n" , irq_mask, ppid); -if (pmic_arb_write_cmd (pa->spmic,SPMI_CMD_EXT_WRITEL , sid, +if (pmic_arb_write_cmd (pmic_arb->spmic,SPMI_CMD_EXT_WRITEL , sid, (per <<8 ) +QPNPINT_REG_EN_CLR , &irq_mask,1 )) -dev_err_ratelimited (&pa->spmic->dev, -"failed to ack irq_mask = 0x%x for ppid = %x\n" , +dev_err_ratelimited (&pmic_arb->spmic->dev,"failed to ack irq_mask = 0x%x for ppid = %x\n" , irq_mask, ppid); } -static void periph_interrupt (struct spmi_pmic_arb *pa,u16 apid) +static void periph_interrupt (struct spmi_pmic_arb *pmic_arb,u16 apid) {unsigned int irq;u32 status;int id; -u8 sid = (pa->apid_data[apid].ppid >>8 ) &0xF ; -u8 per = pa->apid_data[apid].ppid &0xFF ; +u8 sid = (pmic_arb->apid_data[apid].ppid >>8 ) &0xF ; +u8 per = pmic_arb->apid_data[apid].ppid &0xFF ; - status =readl_relaxed (pa->intr + pa->ver_ops->irq_status (apid)); + status =readl_relaxed (pmic_arb->intr + + pmic_arb->ver_ops->irq_status (apid));while (status) { id =ffs (status) -1 ; status &= ~BIT (id); - irq =irq_find_mapping (pa->domain,HWIRQ (sid, per, id, apid)); + irq =irq_find_mapping (pmic_arb->domain, +spec_to_hwirq (sid, per, id, apid));if (irq ==0 ) { -cleanup_irq (pa, apid, id); +cleanup_irq (pmic_arb, apid, id);continue ; }generic_handle_irq (irq);
@@ -515,11 +512,11 @@ static void periph_interrupt(struct spmi_pmic_arb *pa, u16 apid)static void pmic_arb_chained_irq (struct irq_desc *desc) { -struct spmi_pmic_arb *pa =irq_desc_get_handler_data (desc); +struct spmi_pmic_arb *pmic_arb =irq_desc_get_handler_data (desc);struct irq_chip *chip =irq_desc_get_chip (desc); -void __iomem *intr = pa->intr; -int first = pa->min_apid >>5 ; -int last = pa->max_apid >>5 ; +void __iomem *intr = pmic_arb->intr; +int first = pmic_arb->min_apid >>5 ; +int last = pmic_arb->max_apid >>5 ;u32 status, enable;int i, id, apid;
@@ -527,15 +524,15 @@ static void pmic_arb_chained_irq(struct irq_desc *desc)for (i = first; i <= last; ++i) { status =readl_relaxed (intr + - pa->ver_ops->owner_acc_status (pa->ee, i)); + pmic_arb->ver_ops->owner_acc_status (pmic_arb->ee, i));while (status) { id =ffs (status) -1 ; status &= ~BIT (id); apid = id + i *32 ; enable =readl_relaxed (intr + - pa->ver_ops->acc_enable (apid)); + pmic_arb->ver_ops->acc_enable (apid));if (enable &SPMI_PIC_ACC_ENABLE_BIT ) -periph_interrupt (pa, apid); +periph_interrupt (pmic_arb, apid); } }
@@ -544,12 +541,13 @@ static void pmic_arb_chained_irq(struct irq_desc *desc)static void qpnpint_irq_ack (struct irq_data *d) { -struct spmi_pmic_arb *pa =irq_data_get_irq_chip_data (d); -u8 irq =HWIRQ_IRQ (d->hwirq); -u16 apid =HWIRQ_APID (d->hwirq); +struct spmi_pmic_arb *pmic_arb =irq_data_get_irq_chip_data (d); +u8 irq =hwirq_to_irq (d->hwirq); +u16 apid =hwirq_to_apid (d->hwirq);u8 data; -writel_relaxed (BIT (irq), pa->intr + pa->ver_ops->irq_clear (apid)); +writel_relaxed (BIT (irq), pmic_arb->intr + + pmic_arb->ver_ops->irq_clear (apid)); data =BIT (irq);qpnpint_spmi_write (d,QPNPINT_REG_LATCHED_CLR , &data,1 );
@@ -557,7 +555,7 @@ static void qpnpint_irq_ack(struct irq_data *d)static void qpnpint_irq_mask (struct irq_data *d) { -u8 irq =HWIRQ_IRQ (d->hwirq); +u8 irq =hwirq_to_irq (d->hwirq);u8 data =BIT (irq);qpnpint_spmi_write (d,QPNPINT_REG_EN_CLR , &data,1 );
@@ -565,13 +563,13 @@ static void qpnpint_irq_mask(struct irq_data *d)static void qpnpint_irq_unmask (struct irq_data *d) { -struct spmi_pmic_arb *pa =irq_data_get_irq_chip_data (d); -u8 irq =HWIRQ_IRQ (d->hwirq); -u16 apid =HWIRQ_APID (d->hwirq); +struct spmi_pmic_arb *pmic_arb =irq_data_get_irq_chip_data (d); +u8 irq =hwirq_to_irq (d->hwirq); +u16 apid =hwirq_to_apid (d->hwirq);u8 buf[2 ];writel_relaxed (SPMI_PIC_ACC_ENABLE_BIT , - pa->intr + pa->ver_ops->acc_enable (apid)); + pmic_arb->intr + pmic_arb->ver_ops->acc_enable (apid));qpnpint_spmi_read (d,QPNPINT_REG_EN_SET , &buf[0 ],1 );if (!(buf[0 ] &BIT (irq))) {
@@ -589,7 +587,7 @@ static void qpnpint_irq_unmask(struct irq_data *d)static int qpnpint_irq_set_type (struct irq_data *d,unsigned int flow_type) {struct spmi_pmic_arb_qpnpint_type type; -u8 irq =HWIRQ_IRQ (d->hwirq); +u8 irq =hwirq_to_irq (d->hwirq);u8 bit_mask_irq =BIT (irq);qpnpint_spmi_read (d,QPNPINT_REG_SET_TYPE , &type,sizeof (type));
@@ -626,7 +624,7 @@ static int qpnpint_get_irqchip_state(struct irq_data *d,enum irqchip_irq_state which, bool *state) { - u8 irq = HWIRQ_IRQ(d->hwirq); + u8 irq = hwirq_to_irq(d->hwirq);u8 status =0 ;if (which !=IRQCHIP_STATE_LINE_LEVEL )
@@ -656,12 +654,11 @@ static int qpnpint_irq_domain_dt_translate(struct irq_domain *d,unsigned long *out_hwirq, unsigned int *out_type) { - struct spmi_pmic_arb *pa = d->host_data; + struct spmi_pmic_arb *pmic_arb = d->host_data;int rc;u16 apid; -dev_dbg (&pa->spmic->dev, -"intspec[0] 0x%1x intspec[1] 0x%02x intspec[2] 0x%02x\n" , +dev_dbg (&pmic_arb->spmic->dev,"intspec[0] 0x%1x intspec[1] 0x%02x intspec[2] 0x%02x\n" , intspec[0 ], intspec[1 ], intspec[2 ]);if (irq_domain_get_of_node (d) != controller)
@@ -671,25 +668,24 @@ static int qpnpint_irq_domain_dt_translate(struct irq_domain *d,if (intspec[0 ] >0xF || intspec[1 ] >0xFF || intspec[2 ] >0x7 )return -EINVAL ; - rc = pa->ver_ops->ppid_to_apid (pa, intspec[0 ], - (intspec[1 ] <<8 ), &apid); + rc = pmic_arb->ver_ops->ppid_to_apid (pmic_arb, intspec[0 ], + (intspec[1 ] <<8 ), &apid);if (rc <0 ) { -dev_err (&pa->spmic->dev, -"failed to xlate sid = 0x%x, periph = 0x%x, irq = %x rc = %d\n" , +dev_err (&pmic_arb->spmic->dev,"failed to xlate sid = 0x%x, periph = 0x%x, irq = %x rc = %d\n" , intspec[0 ], intspec[1 ], intspec[2 ], rc);return rc; }/* Keep track of {max,min}_apid for bounding search during interrupt */ -if (apid > pa->max_apid) - pa->max_apid = apid; -if (apid < pa->min_apid) - pa->min_apid = apid; +if (apid > pmic_arb->max_apid) + pmic_arb->max_apid = apid; +if (apid < pmic_arb->min_apid) + pmic_arb->min_apid = apid; - *out_hwirq =HWIRQ (intspec[0 ], intspec[1 ], intspec[2 ], apid); + *out_hwirq =spec_to_hwirq (intspec[0 ], intspec[1 ], intspec[2 ], apid); *out_type = intspec[3 ] &IRQ_TYPE_SENSE_MASK ; -dev_dbg (&pa->spmic->dev,"out_hwirq = %lu\n" , *out_hwirq); +dev_dbg (&pmic_arb->spmic->dev,"out_hwirq = %lu\n" , *out_hwirq);return 0 ; }
@@ -698,9 +694,9 @@ static int qpnpint_irq_domain_map(struct irq_domain *d, unsigned int virq, irq_hw_number_t hwirq) { -struct spmi_pmic_arb *pa = d->host_data; +struct spmi_pmic_arb *pmic_arb = d->host_data; -dev_dbg (&pa->spmic->dev,"virq = %u, hwirq = %lu\n" , virq, hwirq); +dev_dbg (&pmic_arb->spmic->dev,"virq = %u, hwirq = %lu\n" , virq, hwirq);irq_set_chip_and_handler (virq, &pmic_arb_irqchip, handle_level_irq);irq_set_chip_data (virq, d->host_data);
@@ -708,24 +704,24 @@ static int qpnpint_irq_domain_map(struct irq_domain *d,return 0 ; } -static int -pmic_arb_ppid_to_apid_v1 (struct spmi_pmic_arb *pa,u8 sid,u16 addr,u16 *apid) +static int pmic_arb_ppid_to_apid_v1 (struct spmi_pmic_arb *pmic_arb,u8 sid, +u16 addr,u16 *apid) {u16 ppid = sid <<8 | ((addr >>8 ) &0xFF ); -u32 *mapping_table = pa->mapping_table; +u32 *mapping_table = pmic_arb->mapping_table;int index =0 , i;u16 apid_valid;u32 data; - apid_valid = pa->ppid_to_apid[ppid]; -if (apid_valid &PMIC_ARB_CHAN_VALID ) { - *apid = (apid_valid & ~PMIC_ARB_CHAN_VALID ); + apid_valid = pmic_arb->ppid_to_apid[ppid]; +if (apid_valid &PMIC_ARB_APID_VALID ) { + *apid = apid_valid & ~PMIC_ARB_APID_VALID ;return 0 ; }for (i =0 ; i <SPMI_MAPPING_TABLE_TREE_DEPTH ; ++i) { -if (!test_and_set_bit (index, pa->mapping_table_valid)) - mapping_table[index] =readl_relaxed (pa->cnfg + +if (!test_and_set_bit (index, pmic_arb->mapping_table_valid)) + mapping_table[index] =readl_relaxed (pmic_arb->cnfg +SPMI_MAPPING_TABLE_REG (index)); data = mapping_table[index];
@@ -735,9 +731,9 @@ static int qpnpint_irq_domain_map(struct irq_domain *d, index =SPMI_MAPPING_BIT_IS_1_RESULT (data); }else { *apid =SPMI_MAPPING_BIT_IS_1_RESULT (data); - pa->ppid_to_apid[ppid] - = *apid |PMIC_ARB_CHAN_VALID ; - pa->apid_data[*apid].ppid = ppid; + pmic_arb->ppid_to_apid[ppid] + = *apid |PMIC_ARB_APID_VALID ; + pmic_arb->apid_data[*apid].ppid = ppid;return 0 ; } }else {
@@ -745,9 +741,9 @@ static int qpnpint_irq_domain_map(struct irq_domain *d, index =SPMI_MAPPING_BIT_IS_0_RESULT (data); }else { *apid =SPMI_MAPPING_BIT_IS_0_RESULT (data); - pa->ppid_to_apid[ppid] - = *apid |PMIC_ARB_CHAN_VALID ; - pa->apid_data[*apid].ppid = ppid; + pmic_arb->ppid_to_apid[ppid] + = *apid |PMIC_ARB_APID_VALID ; + pmic_arb->apid_data[*apid].ppid = ppid;return 0 ; } }
@@ -757,14 +753,14 @@ static int qpnpint_irq_domain_map(struct irq_domain *d, }/* v1 offset per ee */ -static int -pmic_arb_offset_v1 (struct spmi_pmic_arb *pa,u8 sid,u16 addr,u32 *offset) +static int pmic_arb_offset_v1 (struct spmi_pmic_arb *pmic_arb,u8 sid,u16 addr, +u32 *offset) { - *offset =0x800 +0x80 * pa->channel; + *offset =0x800 +0x80 * pmic_arb->channel;return 0 ; } -static u16 pmic_arb_find_apid (struct spmi_pmic_arb *pa,u16 ppid) +static u16 pmic_arb_find_apid (struct spmi_pmic_arb *pmic_arb,u16 ppid) {u32 regval, offset;u16 apid;
@@ -774,61 +770,61 @@ static u16 pmic_arb_find_apid(struct spmi_pmic_arb *pa, u16 ppid)* PMIC_ARB_REG_CHNL is a table in HW mapping channel to ppid. * ppid_to_apid is an in-memory invert of that table. */ -for (apid = pa->last_apid; ; apid++) { - offset =PMIC_ARB_REG_CHNL (apid); -if (offset >= pa->core_size) +for (apid = pmic_arb->last_apid; ; apid++) { + offset =PMIC_ARB_REG_APID (apid); +if (offset >= pmic_arb->core_size)break ; - regval =readl_relaxed (pa->cnfg + + regval =readl_relaxed (pmic_arb->cnfg +SPMI_OWNERSHIP_TABLE_REG (apid)); - pa->apid_data[apid].owner =SPMI_OWNERSHIP_PERIPH2OWNER (regval); + pmic_arb->apid_data[apid].owner = +SPMI_OWNERSHIP_PERIPH2OWNER (regval); - regval =readl_relaxed (pa->core + offset); + regval =readl_relaxed (pmic_arb->core + offset);if (!regval)continue ; id = (regval >>8 ) &PMIC_ARB_PPID_MASK ; - pa->ppid_to_apid[id] = apid |PMIC_ARB_CHAN_VALID ; - pa->apid_data[apid].ppid = id; + pmic_arb->ppid_to_apid[id] = apid |PMIC_ARB_APID_VALID ; + pmic_arb->apid_data[apid].ppid = id;if (id == ppid) { - apid |=PMIC_ARB_CHAN_VALID ; + apid |=PMIC_ARB_APID_VALID ;break ; } } - pa->last_apid = apid & ~PMIC_ARB_CHAN_VALID ; + pmic_arb->last_apid = apid & ~PMIC_ARB_APID_VALID ;return apid; } - -static int -pmic_arb_ppid_to_apid_v2 (struct spmi_pmic_arb *pa,u8 sid,u16 addr,u16 *apid) +static int pmic_arb_ppid_to_apid_v2 (struct spmi_pmic_arb *pmic_arb,u8 sid, +u16 addr,u16 *apid) {u16 ppid = (sid <<8 ) | (addr >>8 );u16 apid_valid; - apid_valid = pa->ppid_to_apid[ppid]; -if (!(apid_valid &PMIC_ARB_CHAN_VALID )) - apid_valid =pmic_arb_find_apid (pa, ppid); -if (!(apid_valid &PMIC_ARB_CHAN_VALID )) + apid_valid = pmic_arb->ppid_to_apid[ppid]; +if (!(apid_valid &PMIC_ARB_APID_VALID )) + apid_valid =pmic_arb_find_apid (pmic_arb, ppid); +if (!(apid_valid &PMIC_ARB_APID_VALID ))return -ENODEV ; - *apid = (apid_valid & ~PMIC_ARB_CHAN_VALID ); + *apid = apid_valid & ~PMIC_ARB_APID_VALID ;return 0 ; }/* v2 offset per ppid and per ee */ -static int -pmic_arb_offset_v2 (struct spmi_pmic_arb *pa,u8 sid,u16 addr,u32 *offset) +static int pmic_arb_offset_v2 (struct spmi_pmic_arb *pmic_arb,u8 sid,u16 addr, +u32 *offset) {u16 apid;int rc; - rc =pmic_arb_ppid_to_apid_v2 (pa, sid, addr, &apid); + rc =pmic_arb_ppid_to_apid_v2 (pmic_arb, sid, addr, &apid);if (rc <0 )return rc; - *offset =0x1000 * pa->ee +0x8000 * apid; + *offset =0x1000 * pmic_arb->ee +0x8000 * apid;return 0 ; }
@@ -930,22 +926,22 @@ static u32 pmic_arb_irq_clear_v2(u16 n)static int spmi_pmic_arb_probe (struct platform_device *pdev) { -struct spmi_pmic_arb *pa; +struct spmi_pmic_arb *pmic_arb;struct spmi_controller *ctrl;struct resource *res;void __iomem *core;u32 channel, ee, hw_ver;int err; - ctrl =spmi_controller_alloc (&pdev->dev,sizeof (*pa)); + ctrl =spmi_controller_alloc (&pdev->dev,sizeof (*pmic_arb));if (!ctrl)return -ENOMEM ; - pa =spmi_controller_get_drvdata (ctrl); - pa->spmic = ctrl; + pmic_arb =spmi_controller_get_drvdata (ctrl); + pmic_arb->spmic = ctrl; res =platform_get_resource_byname (pdev,IORESOURCE_MEM ,"core" ); - pa->core_size =resource_size (res); + pmic_arb->core_size =resource_size (res); core =devm_ioremap_resource (&ctrl->dev, res);if (IS_ERR (core)) {
@@ -953,9 +949,10 @@ static int spmi_pmic_arb_probe(struct platform_device *pdev) goto err_put_ctrl; } - pa->ppid_to_apid =devm_kcalloc (&ctrl->dev,PMIC_ARB_MAX_PPID , -sizeof (*pa->ppid_to_apid),GFP_KERNEL ); -if (!pa->ppid_to_apid) { + pmic_arb->ppid_to_apid =devm_kcalloc (&ctrl->dev,PMIC_ARB_MAX_PPID , +sizeof (*pmic_arb->ppid_to_apid), +GFP_KERNEL ); +if (!pmic_arb->ppid_to_apid) { err = -ENOMEM ; goto err_put_ctrl; }
@@ -963,54 +960,54 @@ static int spmi_pmic_arb_probe(struct platform_device *pdev) hw_ver =readl_relaxed (core +PMIC_ARB_VERSION );if (hw_ver <PMIC_ARB_VERSION_V2_MIN ) { - pa->ver_ops = &pmic_arb_v1; - pa->wr_base = core; - pa->rd_base = core; + pmic_arb->ver_ops = &pmic_arb_v1; + pmic_arb->wr_base = core; + pmic_arb->rd_base = core; }else { - pa->core = core; + pmic_arb->core = core;if (hw_ver <PMIC_ARB_VERSION_V3_MIN ) - pa->ver_ops = &pmic_arb_v2; + pmic_arb->ver_ops = &pmic_arb_v2;else - pa->ver_ops = &pmic_arb_v3; + pmic_arb->ver_ops = &pmic_arb_v3; res =platform_get_resource_byname (pdev,IORESOURCE_MEM ,"obsrvr" ); - pa->rd_base =devm_ioremap_resource (&ctrl->dev, res); -if (IS_ERR (pa->rd_base)) { - err =PTR_ERR (pa->rd_base); + pmic_arb->rd_base =devm_ioremap_resource (&ctrl->dev, res); +if (IS_ERR (pmic_arb->rd_base)) { + err =PTR_ERR (pmic_arb->rd_base); goto err_put_ctrl; } res =platform_get_resource_byname (pdev,IORESOURCE_MEM ,"chnls" ); - pa->wr_base =devm_ioremap_resource (&ctrl->dev, res); -if (IS_ERR (pa->wr_base)) { - err =PTR_ERR (pa->wr_base); + pmic_arb->wr_base =devm_ioremap_resource (&ctrl->dev, res); +if (IS_ERR (pmic_arb->wr_base)) { + err =PTR_ERR (pmic_arb->wr_base); goto err_put_ctrl; } }dev_info (&ctrl->dev,"PMIC arbiter version %s (0x%x)\n" , - pa->ver_ops->ver_str, hw_ver); + pmic_arb->ver_ops->ver_str, hw_ver); res =platform_get_resource_byname (pdev,IORESOURCE_MEM ,"intr" ); - pa->intr =devm_ioremap_resource (&ctrl->dev, res); -if (IS_ERR (pa->intr)) { - err =PTR_ERR (pa->intr); + pmic_arb->intr =devm_ioremap_resource (&ctrl->dev, res); +if (IS_ERR (pmic_arb->intr)) { + err =PTR_ERR (pmic_arb->intr); goto err_put_ctrl; } res =platform_get_resource_byname (pdev,IORESOURCE_MEM ,"cnfg" ); - pa->cnfg =devm_ioremap_resource (&ctrl->dev, res); -if (IS_ERR (pa->cnfg)) { - err =PTR_ERR (pa->cnfg); + pmic_arb->cnfg =devm_ioremap_resource (&ctrl->dev, res); +if (IS_ERR (pmic_arb->cnfg)) { + err =PTR_ERR (pmic_arb->cnfg); goto err_put_ctrl; } - pa->irq =platform_get_irq_byname (pdev,"periph_irq" ); -if (pa->irq <0 ) { - err = pa->irq; + pmic_arb->irq =platform_get_irq_byname (pdev,"periph_irq" ); +if (pmic_arb->irq <0 ) { + err = pmic_arb->irq; goto err_put_ctrl; }
@@ -1027,7 +1024,7 @@ static int spmi_pmic_arb_probe(struct platform_device *pdev) goto err_put_ctrl; } - pa->channel = channel; + pmic_arb->channel = channel; err =of_property_read_u32 (pdev->dev.of_node,"qcom,ee" , &ee);if (err) {
@@ -1041,38 +1038,41 @@ static int spmi_pmic_arb_probe(struct platform_device *pdev) goto err_put_ctrl; } - pa->ee = ee; + pmic_arb->ee = ee; - pa->mapping_table =devm_kcalloc (&ctrl->dev,PMIC_ARB_MAX_PERIPHS -1 , -sizeof (*pa->mapping_table),GFP_KERNEL ); -if (!pa->mapping_table) { + pmic_arb->mapping_table =devm_kcalloc (&ctrl->dev, +PMIC_ARB_MAX_PERIPHS -1 , +sizeof (*pmic_arb->mapping_table), +GFP_KERNEL ); +if (!pmic_arb->mapping_table) { err = -ENOMEM ; goto err_put_ctrl; }/* Initialize max_apid/min_apid to the opposite bounds, during * the irq domain translation, we are sure to update these */ - pa->max_apid =0 ; - pa->min_apid =PMIC_ARB_MAX_PERIPHS -1 ; + pmic_arb->max_apid =0 ; + pmic_arb->min_apid =PMIC_ARB_MAX_PERIPHS -1 ;platform_set_drvdata (pdev, ctrl); -raw_spin_lock_init (&pa->lock); +raw_spin_lock_init (&pmic_arb->lock); ctrl->cmd = pmic_arb_cmd; ctrl->read_cmd = pmic_arb_read_cmd; ctrl->write_cmd = pmic_arb_write_cmd;dev_dbg (&pdev->dev,"adding irq domain\n" ); - pa->domain =irq_domain_add_tree (pdev->dev.of_node, - &pmic_arb_irq_domain_ops, pa); -if (!pa->domain) { + pmic_arb->domain =irq_domain_add_tree (pdev->dev.of_node, + &pmic_arb_irq_domain_ops, pmic_arb); +if (!pmic_arb->domain) {dev_err (&pdev->dev,"unable to create irq_domain\n" ); err = -ENOMEM ; goto err_put_ctrl; } -irq_set_chained_handler_and_data (pa->irq, pmic_arb_chained_irq, pa); -enable_irq_wake (pa->irq); +irq_set_chained_handler_and_data (pmic_arb->irq, pmic_arb_chained_irq, + pmic_arb); +enable_irq_wake (pmic_arb->irq); err =spmi_controller_add (ctrl);if (err)
@@ -1081,8 +1081,8 @@ static int spmi_pmic_arb_probe(struct platform_device *pdev)return 0 ; err_domain_remove: -irq_set_chained_handler_and_data (pa->irq,NULL ,NULL ); -irq_domain_remove (pa->domain); +irq_set_chained_handler_and_data (pmic_arb->irq,NULL ,NULL ); +irq_domain_remove (pmic_arb->domain); err_put_ctrl:spmi_controller_put (ctrl);return err;
@@ -1091,10 +1091,10 @@ static int spmi_pmic_arb_probe(struct platform_device *pdev)static int spmi_pmic_arb_remove (struct platform_device *pdev) {struct spmi_controller *ctrl =platform_get_drvdata (pdev); -struct spmi_pmic_arb *pa =spmi_controller_get_drvdata (ctrl); +struct spmi_pmic_arb *pmic_arb =spmi_controller_get_drvdata (ctrl);spmi_controller_remove (ctrl); -irq_set_chained_handler_and_data (pa->irq,NULL ,NULL ); -irq_domain_remove (pa->domain); +irq_set_chained_handler_and_data (pmic_arb->irq,NULL ,NULL ); +irq_domain_remove (pmic_arb->domain);spmi_controller_put (ctrl);return 0 ; }
Signature · 2 lines
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project
PATCH v2 3/12 spmi: pmic-arb: clean up pmic_arb_find_apid function
In reply to Kiran GundaClean up the pmic_arb_find_apid() by using the local variables to improve the code readability.
--- drivers/spmi/spmi-pmic-arb.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-)
drivers/spmi/spmi-pmic-arb.c +6 -7
@@ -762,23 +762,22 @@ static int pmic_arb_offset_v1(struct spmi_pmic_arb *pmic_arb, u8 sid, u16 addr,static u16 pmic_arb_find_apid (struct spmi_pmic_arb *pmic_arb,u16 ppid) { +struct apid_data *apidd = &pmic_arb->apid_data[pmic_arb->last_apid];u32 regval, offset; -u16 apid; -u16 id; +u16 id, apid;/* -* PMIC_ARB_REG_CHNL is a table in HW mapping channel to ppid. +* PMIC_ARB_REG_APID is a table in HW mapping apid to ppid. * ppid_to_apid is an in-memory invert of that table. */ -for (apid = pmic_arb->last_apid; ; apid++) { +for (apid = pmic_arb->last_apid; ; apid++, apidd++) { offset =PMIC_ARB_REG_APID (apid);if (offset >= pmic_arb->core_size)break ; regval =readl_relaxed (pmic_arb->cnfg +SPMI_OWNERSHIP_TABLE_REG (apid)); - pmic_arb->apid_data[apid].owner = -SPMI_OWNERSHIP_PERIPH2OWNER (regval); + apidd->owner =SPMI_OWNERSHIP_PERIPH2OWNER (regval); regval =readl_relaxed (pmic_arb->core + offset);if (!regval)
@@ -786,7 +785,7 @@ static u16 pmic_arb_find_apid(struct spmi_pmic_arb *pmic_arb, u16 ppid) id = (regval >>8 ) &PMIC_ARB_PPID_MASK ; pmic_arb->ppid_to_apid[id] = apid |PMIC_ARB_APID_VALID ; - pmic_arb->apid_data[apid].ppid = id; + apidd->ppid = id;if (id == ppid) { apid |=PMIC_ARB_APID_VALID ;break ;
Signature · 2 lines
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project
PATCH v2 4/12 spmi: pmic-arb: optimize qpnpint_irq_set_type function
In reply to Kiran GundaOptimize the qpnpint_irq_set_type() by using a local variable to hold the handler type. Also clean up other variable usage.
--- drivers/spmi/spmi-pmic-arb.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-)
drivers/spmi/spmi-pmic-arb.c +12 -12
@@ -587,35 +587,35 @@ static void qpnpint_irq_unmask(struct irq_data *d)static int qpnpint_irq_set_type (struct irq_data *d,unsigned int flow_type) {struct spmi_pmic_arb_qpnpint_type type; +irq_flow_handler_t flow_handler;u8 irq =hwirq_to_irq (d->hwirq); -u8 bit_mask_irq =BIT (irq);qpnpint_spmi_read (d,QPNPINT_REG_SET_TYPE , &type,sizeof (type));if (flow_type & (IRQF_TRIGGER_RISING |IRQF_TRIGGER_FALLING )) { - type.type |= bit_mask_irq; + type.type |=BIT (irq);if (flow_type &IRQF_TRIGGER_RISING ) - type.polarity_high |= bit_mask_irq; + type.polarity_high |=BIT (irq);if (flow_type &IRQF_TRIGGER_FALLING ) - type.polarity_low |= bit_mask_irq; + type.polarity_low |=BIT (irq); + + flow_handler = handle_edge_irq; }else {if ((flow_type & (IRQF_TRIGGER_HIGH )) && (flow_type & (IRQF_TRIGGER_LOW )))return -EINVAL ; - type.type &= ~bit_mask_irq;/* level trig */ + type.type &= ~BIT (irq);/* level trig */ if (flow_type &IRQF_TRIGGER_HIGH ) - type.polarity_high |= bit_mask_irq; + type.polarity_high |=BIT (irq);else - type.polarity_low |= bit_mask_irq; + type.polarity_low |=BIT (irq); + + flow_handler = handle_level_irq; }qpnpint_spmi_write (d,QPNPINT_REG_SET_TYPE , &type,sizeof (type)); - -if (flow_type &IRQ_TYPE_EDGE_BOTH ) -irq_set_handler_locked (d, handle_edge_irq); -else -irq_set_handler_locked (d, handle_level_irq); +irq_set_handler_locked (d, flow_handler);return 0 ; }
Signature · 2 lines
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project
PATCH v2 5/12 spmi: pmic-arb: fix memory allocation for mapping_table
In reply to Kiran GundaAllocate the correct memory size (max_pmic_peripherals) for the mapping_table that holds the apid to ppid mapping. Also use a local variable for mapping_table for better alignment of the code.
--- drivers/spmi/spmi-pmic-arb.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-)
drivers/spmi/spmi-pmic-arb.c +5 -6
@@ -929,6 +929,7 @@ static int spmi_pmic_arb_probe(struct platform_device *pdev)struct spmi_controller *ctrl;struct resource *res;void __iomem *core; +u32 *mapping_table;u32 channel, ee, hw_ver;int err;
@@ -1038,16 +1039,14 @@ static int spmi_pmic_arb_probe(struct platform_device *pdev) } pmic_arb->ee = ee; - - pmic_arb->mapping_table =devm_kcalloc (&ctrl->dev, -PMIC_ARB_MAX_PERIPHS -1 , -sizeof (*pmic_arb->mapping_table), -GFP_KERNEL ); -if (!pmic_arb->mapping_table) { + mapping_table =devm_kcalloc (&ctrl->dev,PMIC_ARB_MAX_PERIPHS , +sizeof (*mapping_table),GFP_KERNEL ); +if (!mapping_table) { err = -ENOMEM ; goto err_put_ctrl; } + pmic_arb->mapping_table = mapping_table;/* Initialize max_apid/min_apid to the opposite bounds, during * the irq domain translation, we are sure to update these */ pmic_arb->max_apid =0 ;
Signature · 2 lines
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project
PATCH v2 6/12 spmi: pmic-arb: replace the writel_relaxed with __raw_writel
In reply to Kiran GundaReplace the writel_relaxed with __raw_writel to avoid byte swapping in pmic_arb_write_data() function. That way the code is independent of the CPU endianness.
spmi_pmic_arb")
--- drivers/spmi/spmi-pmic-arb.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/spmi/spmi-pmic-arb.c +1 -1
@@ -230,7 +230,7 @@ static void pmic_arb_write_data(struct spmi_pmic_arb *pmic_arb, const u8 *buf,u32 data =0 ;memcpy (&data, buf, (bc &3 ) +1 ); -pmic_arb_base_write (pmic_arb, reg, data); +__raw_writel (data, pmic_arb->wr_base + reg); } static int pmic_arb_wait_for_done(struct spmi_controller *ctrl,
Signature · 2 lines
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project
PATCH v2 7/12 spmi: pmic-arb: return the value instead of passing by pointer
In reply to Kiran GundaReturning the output value from a function, when it is possible, is the better and cleaner way than passing it by the pointer. Hence, modify the ppid_to_apid mapping function to return apid instead of passing it by a pointer. While at it, pass the ppid as function parameter to ppid_to_apid mapping function instead of passing the sid and addr.
--- drivers/spmi/spmi-pmic-arb.c | 82 +++++++++++++++++++++----------------------- 1 file changed, 40 insertions(+), 42 deletions(-)
drivers/spmi/spmi-pmic-arb.c +40 -42
@@ -178,11 +178,9 @@ struct spmi_pmic_arb {*/ struct pmic_arb_ver_ops {const char *ver_str; -int (*ppid_to_apid)(struct spmi_pmic_arb *pmic_arb,u8 sid,u16 addr, -u16 *apid); +int (*ppid_to_apid)(struct spmi_pmic_arb *pmic_arb,u16 ppid);/* spmi commands (read_cmd, write_cmd, cmd) functionality */ -int (*offset)(struct spmi_pmic_arb *pmic_arb,u8 sid,u16 addr, -u32 *offset); +int (*offset)(struct spmi_pmic_arb *pmic_arb,u8 sid,u16 addr);u32 (*fmt_cmd)(u8 opc,u8 sid,u16 addr,u8 bc);int (*non_data_cmd)(struct spmi_controller *ctrl,u8 opc,u8 sid);/* Interrupts controller functionality (offset of PIC registers) */
@@ -242,10 +240,11 @@ static int pmic_arb_wait_for_done(struct spmi_controller *ctrl,u32 offset;int rc; - rc = pmic_arb->ver_ops->offset (pmic_arb, sid, addr, &offset); -if (rc) + rc = pmic_arb->ver_ops->offset (pmic_arb, sid, addr); +if (rc <0 )return rc; + offset = rc; offset +=PMIC_ARB_STATUS ;while (timeout--) {
@@ -289,10 +288,11 @@ static int pmic_arb_wait_for_done(struct spmi_controller *ctrl,int rc;u32 offset; - rc = pmic_arb->ver_ops->offset (pmic_arb, sid,0 , &offset); -if (rc) + rc = pmic_arb->ver_ops->offset (pmic_arb, sid,0 ); +if (rc <0 )return rc; + offset = rc; cmd = ((opc |0x40 ) <<27 ) | ((sid &0xf ) <<20 );raw_spin_lock_irqsave (&pmic_arb->lock, flags);
@@ -333,10 +333,11 @@ static int pmic_arb_read_cmd(struct spmi_controller *ctrl, u8 opc, u8 sid,int rc;u32 offset; - rc = pmic_arb->ver_ops->offset (pmic_arb, sid, addr, &offset); -if (rc) + rc = pmic_arb->ver_ops->offset (pmic_arb, sid, addr); +if (rc <0 )return rc; + offset = rc;if (bc >=PMIC_ARB_MAX_TRANS_BYTES ) {dev_err (&ctrl->dev,"pmic-arb supports 1..%d bytes per trans, but:%zu requested" ,PMIC_ARB_MAX_TRANS_BYTES , len);
@@ -383,10 +384,11 @@ static int pmic_arb_write_cmd(struct spmi_controller *ctrl, u8 opc, u8 sid,int rc;u32 offset; - rc = pmic_arb->ver_ops->offset (pmic_arb, sid, addr, &offset); -if (rc) + rc = pmic_arb->ver_ops->offset (pmic_arb, sid, addr); +if (rc <0 )return rc; + offset = rc;if (bc >=PMIC_ARB_MAX_TRANS_BYTES ) {dev_err (&ctrl->dev,"pmic-arb supports 1..%d bytes per trans, but:%zu requested" ,PMIC_ARB_MAX_TRANS_BYTES , len);
@@ -655,8 +657,8 @@ static int qpnpint_irq_domain_dt_translate(struct irq_domain *d, unsigned int *out_type) {struct spmi_pmic_arb *pmic_arb = d->host_data; +u16 apid, ppid;int rc; -u16 apid;dev_dbg (&pmic_arb->spmic->dev,"intspec[0] 0x%1x intspec[1] 0x%02x intspec[2] 0x%02x\n" , intspec[0 ], intspec[1 ], intspec[2 ]);
@@ -668,14 +670,15 @@ static int qpnpint_irq_domain_dt_translate(struct irq_domain *d,if (intspec[0 ] >0xF || intspec[1 ] >0xFF || intspec[2 ] >0x7 )return -EINVAL ; - rc = pmic_arb->ver_ops->ppid_to_apid (pmic_arb, intspec[0 ], - (intspec[1 ] <<8 ), &apid); + ppid = intspec[0 ] <<8 | intspec[1 ]; + rc = pmic_arb->ver_ops->ppid_to_apid (pmic_arb, ppid);if (rc <0 ) {dev_err (&pmic_arb->spmic->dev,"failed to xlate sid = 0x%x, periph = 0x%x, irq = %x rc = %d\n" , intspec[0 ], intspec[1 ], intspec[2 ], rc);return rc; } + apid = rc;/* Keep track of {max,min}_apid for bounding search during interrupt */ if (apid > pmic_arb->max_apid) pmic_arb->max_apid = apid;
@@ -704,19 +707,18 @@ static int qpnpint_irq_domain_map(struct irq_domain *d,return 0 ; } -static int pmic_arb_ppid_to_apid_v1 (struct spmi_pmic_arb *pmic_arb,u8 sid, -u16 addr,u16 *apid) +static int pmic_arb_ppid_to_apid_v1 (struct spmi_pmic_arb *pmic_arb,u16 ppid) { -u16 ppid = sid <<8 | ((addr >>8 ) &0xFF );u32 *mapping_table = pmic_arb->mapping_table;int index =0 , i;u16 apid_valid; +u16 apid;u32 data; apid_valid = pmic_arb->ppid_to_apid[ppid];if (apid_valid &PMIC_ARB_APID_VALID ) { - *apid = apid_valid & ~PMIC_ARB_APID_VALID ; -return 0 ; + apid = apid_valid & ~PMIC_ARB_APID_VALID ; +return apid; }for (i =0 ; i <SPMI_MAPPING_TABLE_TREE_DEPTH ; ++i) {
@@ -730,21 +732,21 @@ static int pmic_arb_ppid_to_apid_v1(struct spmi_pmic_arb *pmic_arb, u8 sid,if (SPMI_MAPPING_BIT_IS_1_FLAG (data)) { index =SPMI_MAPPING_BIT_IS_1_RESULT (data); }else { - *apid =SPMI_MAPPING_BIT_IS_1_RESULT (data); + apid =SPMI_MAPPING_BIT_IS_1_RESULT (data); pmic_arb->ppid_to_apid[ppid] - = *apid |PMIC_ARB_APID_VALID ; - pmic_arb->apid_data[*apid].ppid = ppid; -return 0 ; + = apid |PMIC_ARB_APID_VALID ; + pmic_arb->apid_data[apid].ppid = ppid; +return apid; } }else {if (SPMI_MAPPING_BIT_IS_0_FLAG (data)) { index =SPMI_MAPPING_BIT_IS_0_RESULT (data); }else { - *apid =SPMI_MAPPING_BIT_IS_0_RESULT (data); + apid =SPMI_MAPPING_BIT_IS_0_RESULT (data); pmic_arb->ppid_to_apid[ppid] - = *apid |PMIC_ARB_APID_VALID ; - pmic_arb->apid_data[*apid].ppid = ppid; -return 0 ; + = apid |PMIC_ARB_APID_VALID ; + pmic_arb->apid_data[apid].ppid = ppid; +return apid; } } }
@@ -753,11 +755,9 @@ static int pmic_arb_ppid_to_apid_v1(struct spmi_pmic_arb *pmic_arb, u8 sid, }/* v1 offset per ee */ -static int pmic_arb_offset_v1 (struct spmi_pmic_arb *pmic_arb,u8 sid,u16 addr, -u32 *offset) +static int pmic_arb_offset_v1 (struct spmi_pmic_arb *pmic_arb,u8 sid,u16 addr) { - *offset =0x800 +0x80 * pmic_arb->channel; -return 0 ; +return 0x800 +0x80 * pmic_arb->channel; }static u16 pmic_arb_find_apid (struct spmi_pmic_arb *pmic_arb,u16 ppid)
@@ -796,10 +796,8 @@ static u16 pmic_arb_find_apid(struct spmi_pmic_arb *pmic_arb, u16 ppid)return apid; } -static int pmic_arb_ppid_to_apid_v2 (struct spmi_pmic_arb *pmic_arb,u8 sid, -u16 addr,u16 *apid) +static int pmic_arb_ppid_to_apid_v2 (struct spmi_pmic_arb *pmic_arb,u16 ppid) { -u16 ppid = (sid <<8 ) | (addr >>8 );u16 apid_valid; apid_valid = pmic_arb->ppid_to_apid[ppid];
@@ -808,23 +806,23 @@ static int pmic_arb_ppid_to_apid_v2(struct spmi_pmic_arb *pmic_arb, u8 sid,if (!(apid_valid &PMIC_ARB_APID_VALID ))return -ENODEV ; - *apid = apid_valid & ~PMIC_ARB_APID_VALID ; -return 0 ; +return apid_valid & ~PMIC_ARB_APID_VALID ; }/* v2 offset per ppid and per ee */ -static int pmic_arb_offset_v2 (struct spmi_pmic_arb *pmic_arb,u8 sid,u16 addr, -u32 *offset) +static int pmic_arb_offset_v2 (struct spmi_pmic_arb *pmic_arb,u8 sid,u16 addr) {u16 apid; +u16 ppid;int rc; - rc =pmic_arb_ppid_to_apid_v2 (pmic_arb, sid, addr, &apid); + ppid = sid <<8 | ((addr >>8 ) &0xFF ); + rc =pmic_arb_ppid_to_apid_v2 (pmic_arb, ppid);if (rc <0 )return rc; - *offset =0x1000 * pmic_arb->ee +0x8000 * apid; -return 0 ; + apid = rc; +return 0x1000 * pmic_arb->ee +0x8000 * apid; }static u32 pmic_arb_fmt_cmd_v1 (u8 opc,u8 sid,u16 addr,u8 bc)
Signature · 2 lines
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project
PATCH v2 8/12 spmi: pmic-arb: use irq_chip callback to set spmi irq wakeup capability
In reply to Kiran GundaCurrently the driver sets the pmic arbiter core interrupt as wakeup capable irrespective of the child irqs which causes the system to wakeup unnecessarily. To fix this, set the core interrupt as wakeup capable only if any of the child irqs request for it. Do this by marking it as wakeup capable in the irq_set_wake callback.
--- drivers/spmi/spmi-pmic-arb.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-)
drivers/spmi/spmi-pmic-arb.c +9 -4
@@ -622,6 +622,13 @@ static int qpnpint_irq_set_type(struct irq_data *d, unsigned int flow_type)return 0 ; } +static int qpnpint_irq_set_wake (struct irq_data *d,unsigned int on) +{ +struct spmi_pmic_arb *pmic_arb =irq_data_get_irq_chip_data (d); + +return irq_set_irq_wake (pmic_arb->irq, on); +} +static int qpnpint_get_irqchip_state (struct irq_data *d,enum irqchip_irq_state which,bool *state)
@@ -644,9 +651,9 @@ static int qpnpint_get_irqchip_state(struct irq_data *d, .irq_mask = qpnpint_irq_mask, .irq_unmask = qpnpint_irq_unmask, .irq_set_type = qpnpint_irq_set_type, + .irq_set_wake = qpnpint_irq_set_wake, .irq_get_irqchip_state = qpnpint_get_irqchip_state, - .flags = IRQCHIP_MASK_ON_SUSPEND - | IRQCHIP_SKIP_SET_WAKE, + .flags = IRQCHIP_MASK_ON_SUSPEND, }; static int qpnpint_irq_domain_dt_translate(struct irq_domain *d,
@@ -1068,8 +1075,6 @@ static int spmi_pmic_arb_probe(struct platform_device *pdev)irq_set_chained_handler_and_data (pmic_arb->irq, pmic_arb_chained_irq, pmic_arb); -enable_irq_wake (pmic_arb->irq); - err =spmi_controller_add (ctrl);if (err) goto err_domain_remove;
Signature · 2 lines
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project
PATCH v2 9/12 spmi: pmic-arb: return __iomem pointer instead of offset
In reply to Kiran GundaModify the pmic_arb version ops to return an __iomem pointer to the address instead of an offset. That way we do not need to care about the base address changes in the new HW version.
--- drivers/spmi/spmi-pmic-arb.c | 93 ++++++++++++++++++++++++-------------------- 1 file changed, 51 insertions(+), 42 deletions(-)
drivers/spmi/spmi-pmic-arb.c +51 -42
@@ -167,14 +167,14 @@ struct spmi_pmic_arb {* @offset: on v1 offset of per-ee channel. * on v2 offset of per-ee and per-ppid channel. * @fmt_cmd: formats a GENI/SPMI command. -* @owner_acc_status: on v1 offset of PMIC_ARB_SPMI_PIC_OWNERm_ACC_STATUSn -* on v2 offset of SPMI_PIC_OWNERm_ACC_STATUSn. -* @acc_enable: on v1 offset of PMIC_ARB_SPMI_PIC_ACC_ENABLEn -* on v2 offset of SPMI_PIC_ACC_ENABLEn. -* @irq_status: on v1 offset of PMIC_ARB_SPMI_PIC_IRQ_STATUSn -* on v2 offset of SPMI_PIC_IRQ_STATUSn. -* @irq_clear: on v1 offset of PMIC_ARB_SPMI_PIC_IRQ_CLEARn -* on v2 offset of SPMI_PIC_IRQ_CLEARn. +* @owner_acc_status: on v1 address of PMIC_ARB_SPMI_PIC_OWNERm_ACC_STATUSn +* on v2 address of SPMI_PIC_OWNERm_ACC_STATUSn. +* @acc_enable: on v1 address of PMIC_ARB_SPMI_PIC_ACC_ENABLEn +* on v2 address of SPMI_PIC_ACC_ENABLEn. +* @irq_status: on v1 address of PMIC_ARB_SPMI_PIC_IRQ_STATUSn +* on v2 address of SPMI_PIC_IRQ_STATUSn. +* @irq_clear: on v1 address of PMIC_ARB_SPMI_PIC_IRQ_CLEARn +* on v2 address of SPMI_PIC_IRQ_CLEARn. */ struct pmic_arb_ver_ops {const char *ver_str;
@@ -184,10 +184,11 @@ struct pmic_arb_ver_ops {u32 (*fmt_cmd)(u8 opc,u8 sid,u16 addr,u8 bc);int (*non_data_cmd)(struct spmi_controller *ctrl,u8 opc,u8 sid);/* Interrupts controller functionality (offset of PIC registers) */ -u32 (*owner_acc_status)(u8 m,u16 n); -u32 (*acc_enable)(u16 n); -u32 (*irq_status)(u16 n); -u32 (*irq_clear)(u16 n); +void __iomem *(*owner_acc_status)(struct spmi_pmic_arb *pmic_arb,u8 m, +u16 n); +void __iomem *(*acc_enable)(struct spmi_pmic_arb *pmic_arb,u16 n); +void __iomem *(*irq_status)(struct spmi_pmic_arb *pmic_arb,u16 n); +void __iomem *(*irq_clear)(struct spmi_pmic_arb *pmic_arb,u16 n); }; static inline void pmic_arb_base_write(struct spmi_pmic_arb *pmic_arb,
@@ -475,8 +476,7 @@ static void cleanup_irq(struct spmi_pmic_arb *pmic_arb, u16 apid, int id)u8 per = ppid &0xFF ;u8 irq_mask =BIT (id); -writel_relaxed (irq_mask, pmic_arb->intr + - pmic_arb->ver_ops->irq_clear (apid)); +writel_relaxed (irq_mask, pmic_arb->ver_ops->irq_clear (pmic_arb, apid));if (pmic_arb_write_cmd (pmic_arb->spmic,SPMI_CMD_EXT_WRITEL , sid, (per <<8 ) +QPNPINT_REG_LATCHED_CLR , &irq_mask,1 ))
@@ -497,8 +497,7 @@ static void periph_interrupt(struct spmi_pmic_arb *pmic_arb, u16 apid)u8 sid = (pmic_arb->apid_data[apid].ppid >>8 ) &0xF ;u8 per = pmic_arb->apid_data[apid].ppid &0xFF ; - status =readl_relaxed (pmic_arb->intr + - pmic_arb->ver_ops->irq_status (apid)); + status =readl_relaxed (pmic_arb->ver_ops->irq_status (pmic_arb, apid));while (status) { id =ffs (status) -1 ; status &= ~BIT (id);
@@ -515,24 +514,25 @@ static void periph_interrupt(struct spmi_pmic_arb *pmic_arb, u16 apid)static void pmic_arb_chained_irq (struct irq_desc *desc) {struct spmi_pmic_arb *pmic_arb =irq_desc_get_handler_data (desc); +const struct pmic_arb_ver_ops *ver_ops = pmic_arb->ver_ops;struct irq_chip *chip =irq_desc_get_chip (desc); -void __iomem *intr = pmic_arb->intr;int first = pmic_arb->min_apid >>5 ;int last = pmic_arb->max_apid >>5 ; +u8 ee = pmic_arb->ee;u32 status, enable;int i, id, apid;chained_irq_enter (chip, desc);for (i = first; i <= last; ++i) { - status =readl_relaxed (intr + - pmic_arb->ver_ops->owner_acc_status (pmic_arb->ee, i)); + status =readl_relaxed ( + ver_ops->owner_acc_status (pmic_arb, ee, i));while (status) { id =ffs (status) -1 ; status &= ~BIT (id); apid = id + i *32 ; - enable =readl_relaxed (intr + - pmic_arb->ver_ops->acc_enable (apid)); + enable =readl_relaxed ( + ver_ops->acc_enable (pmic_arb, apid));if (enable &SPMI_PIC_ACC_ENABLE_BIT )periph_interrupt (pmic_arb, apid); }
@@ -548,8 +548,7 @@ static void qpnpint_irq_ack(struct irq_data *d)u16 apid =hwirq_to_apid (d->hwirq);u8 data; -writel_relaxed (BIT (irq), pmic_arb->intr + - pmic_arb->ver_ops->irq_clear (apid)); +writel_relaxed (BIT (irq), pmic_arb->ver_ops->irq_clear (pmic_arb, apid)); data =BIT (irq);qpnpint_spmi_write (d,QPNPINT_REG_LATCHED_CLR , &data,1 );
@@ -566,12 +565,13 @@ static void qpnpint_irq_mask(struct irq_data *d)static void qpnpint_irq_unmask (struct irq_data *d) {struct spmi_pmic_arb *pmic_arb =irq_data_get_irq_chip_data (d); +const struct pmic_arb_ver_ops *ver_ops = pmic_arb->ver_ops;u8 irq =hwirq_to_irq (d->hwirq);u16 apid =hwirq_to_apid (d->hwirq);u8 buf[2 ];writel_relaxed (SPMI_PIC_ACC_ENABLE_BIT , - pmic_arb->intr + pmic_arb->ver_ops->acc_enable (apid)); + ver_ops->acc_enable (pmic_arb, apid));qpnpint_spmi_read (d,QPNPINT_REG_EN_SET , &buf[0 ],1 );if (!(buf[0 ] &BIT (irq))) {
@@ -842,49 +842,58 @@ static u32 pmic_arb_fmt_cmd_v2(u8 opc, u8 sid, u16 addr, u8 bc)return (opc <<27 ) | ((addr &0xff ) <<4 ) | (bc &0x7 ); } -static u32 pmic_arb_owner_acc_status_v1 (u8 m,u16 n) +static void __iomem * +pmic_arb_owner_acc_status_v1 (struct spmi_pmic_arb *pmic_arb,u8 m,u16 n) { -return 0x20 * m +0x4 * n; +return pmic_arb->intr +0x20 * m +0x4 * n; } -static u32 pmic_arb_owner_acc_status_v2 (u8 m,u16 n) +static void __iomem * +pmic_arb_owner_acc_status_v2 (struct spmi_pmic_arb *pmic_arb,u8 m,u16 n) { -return 0x100000 +0x1000 * m +0x4 * n; +return pmic_arb->intr +0x100000 +0x1000 * m +0x4 * n; } -static u32 pmic_arb_owner_acc_status_v3 (u8 m,u16 n) +static void __iomem * +pmic_arb_owner_acc_status_v3 (struct spmi_pmic_arb *pmic_arb,u8 m,u16 n) { -return 0x200000 +0x1000 * m +0x4 * n; +return pmic_arb->intr +0x200000 +0x1000 * m +0x4 * n; } -static u32 pmic_arb_acc_enable_v1 (u16 n) +static void __iomem * +pmic_arb_acc_enable_v1 (struct spmi_pmic_arb *pmic_arb,u16 n) { -return 0x200 +0x4 * n; +return pmic_arb->intr +0x200 +0x4 * n; } -static u32 pmic_arb_acc_enable_v2 (u16 n) +static void __iomem * +pmic_arb_acc_enable_v2 (struct spmi_pmic_arb *pmic_arb,u16 n) { -return 0x1000 * n; +return pmic_arb->intr +0x1000 * n; } -static u32 pmic_arb_irq_status_v1 (u16 n) +static void __iomem * +pmic_arb_irq_status_v1 (struct spmi_pmic_arb *pmic_arb,u16 n) { -return 0x600 +0x4 * n; +return pmic_arb->intr +0x600 +0x4 * n; } -static u32 pmic_arb_irq_status_v2 (u16 n) +static void __iomem * +pmic_arb_irq_status_v2 (struct spmi_pmic_arb *pmic_arb,u16 n) { -return 0x4 +0x1000 * n; +return pmic_arb->intr +0x4 +0x1000 * n; } -static u32 pmic_arb_irq_clear_v1 (u16 n) +static void __iomem * +pmic_arb_irq_clear_v1 (struct spmi_pmic_arb *pmic_arb,u16 n) { -return 0xA00 +0x4 * n; +return pmic_arb->intr +0xA00 +0x4 * n; } -static u32 pmic_arb_irq_clear_v2 (u16 n) +static void __iomem * +pmic_arb_irq_clear_v2 (struct spmi_pmic_arb *pmic_arb,u16 n) { -return 0x8 +0x1000 * n; +return pmic_arb->intr +0x8 +0x1000 * n; }static const struct pmic_arb_ver_ops pmic_arb_v1 = {
Signature · 2 lines
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project
PATCH v2 10/12 spmi: pmic-arb: fix a possible null pointer dereference
In reply to Kiran GundaIf "core" memory resource is not specified, then the driver could end up dereferencing a null pointer. Fix this issue.
--- drivers/spmi/spmi-pmic-arb.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/spmi/spmi-pmic-arb.c +2 -2
@@ -955,14 +955,14 @@ static int spmi_pmic_arb_probe(struct platform_device *pdev) pmic_arb->spmic = ctrl; res =platform_get_resource_byname (pdev,IORESOURCE_MEM ,"core" ); - pmic_arb->core_size =resource_size (res); - core =devm_ioremap_resource (&ctrl->dev, res);if (IS_ERR (core)) { err =PTR_ERR (core); goto err_put_ctrl; } + pmic_arb->core_size =resource_size (res); + pmic_arb->ppid_to_apid =devm_kcalloc (&ctrl->dev,PMIC_ARB_MAX_PPID ,sizeof (*pmic_arb->ppid_to_apid),GFP_KERNEL );
Signature · 2 lines
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project
PATCH v2 11/12 spmi: pmic-arb: add support for HW version 5
In reply to Kiran GundaFrom: David Collins <[email protected]>
Add support for version 5 of the SPMI PMIC arbiter. It utilizes different offsets for registers than those found on version 3. Also, the procedure to determine if writing and IRQ access is allowed for a given PPID changes for version 5.
--- drivers/spmi/spmi-pmic-arb.c | 236 +++++++++++++++++++++++++++++++++++++++---- 1 file changed, 214 insertions(+), 22 deletions(-)
drivers/spmi/spmi-pmic-arb.c +214 -22
@@ -29,6 +29,7 @@#define PMIC_ARB_VERSION 0x0000#define PMIC_ARB_VERSION_V2_MIN 0x20010000#define PMIC_ARB_VERSION_V3_MIN 0x30000000 +#define PMIC_ARB_VERSION_V5_MIN 0x50000000#define PMIC_ARB_INT_EN 0x0004/* PMIC Arbiter channel registers offsets */
@@ -39,7 +40,6 @@#define PMIC_ARB_WDATA1 0x14#define PMIC_ARB_RDATA0 0x18#define PMIC_ARB_RDATA1 0x1C -#define PMIC_ARB_REG_APID (N ) (0x800 + 0x4 * (N))/* Mapping Table */ #define SPMI_MAPPING_TABLE_REG (N ) (0x0B00 + (4 * (N)))
@@ -52,6 +52,8 @@#define SPMI_MAPPING_TABLE_TREE_DEPTH 16/* Maximum of 16-bits */ #define PMIC_ARB_MAX_PPID BIT(12)/* PPID is 12bit */ #define PMIC_ARB_APID_VALID BIT(15) +#define PMIC_ARB_CHAN_IS_IRQ_OWNER (reg) ((reg) & BIT(24)) +#define INVALID_EE 0xFF/* Ownership Table */ #define SPMI_OWNERSHIP_TABLE_REG (N ) (0x0700 + (4 * (N)))
@@ -86,6 +88,15 @@ enum pmic_arb_cmd_op_code { PMIC_ARB_OP_ZERO_WRITE = 16, }; +/* +* PMIC arbiter version 5 uses different register offsets for read/write vs +* observer channels. +*/ +enum pmic_arb_channel { +PMIC_ARB_CHANNEL_RW , +PMIC_ARB_CHANNEL_OBS , +}; +/* Maximum number of support PMIC peripherals */ #define PMIC_ARB_MAX_PERIPHS 512#define PMIC_ARB_TIMEOUT_US 100
@@ -112,7 +123,8 @@ enum pmic_arb_cmd_op_code {struct apid_data {u16 ppid; -u8 owner; +u8 write_ee; +u8 irq_ee; };/**
@@ -175,12 +187,14 @@ struct spmi_pmic_arb {* on v2 address of SPMI_PIC_IRQ_STATUSn. * @irq_clear: on v1 address of PMIC_ARB_SPMI_PIC_IRQ_CLEARn * on v2 address of SPMI_PIC_IRQ_CLEARn. +* @apid_map_offset: offset of PMIC_ARB_REG_CHNLn */ struct pmic_arb_ver_ops {const char *ver_str;int (*ppid_to_apid)(struct spmi_pmic_arb *pmic_arb,u16 ppid);/* spmi commands (read_cmd, write_cmd, cmd) functionality */ -int (*offset)(struct spmi_pmic_arb *pmic_arb,u8 sid,u16 addr); +int (*offset)(struct spmi_pmic_arb *pmic_arb,u8 sid,u16 addr, +enum pmic_arb_channel ch_type);u32 (*fmt_cmd)(u8 opc,u8 sid,u16 addr,u8 bc);int (*non_data_cmd)(struct spmi_controller *ctrl,u8 opc,u8 sid);/* Interrupts controller functionality (offset of PIC registers) */
@@ -189,6 +203,7 @@ struct pmic_arb_ver_ops {void __iomem *(*acc_enable)(struct spmi_pmic_arb *pmic_arb,u16 n);void __iomem *(*irq_status)(struct spmi_pmic_arb *pmic_arb,u16 n);void __iomem *(*irq_clear)(struct spmi_pmic_arb *pmic_arb,u16 n); +u32 (*apid_map_offset)(u16 n); }; static inline void pmic_arb_base_write(struct spmi_pmic_arb *pmic_arb,
@@ -233,7 +248,8 @@ static void pmic_arb_write_data(struct spmi_pmic_arb *pmic_arb, const u8 *buf, }static int pmic_arb_wait_for_done (struct spmi_controller *ctrl, -void __iomem *base,u8 sid,u16 addr) +void __iomem *base,u8 sid,u16 addr, +enum pmic_arb_channel ch_type) {struct spmi_pmic_arb *pmic_arb =spmi_controller_get_drvdata (ctrl);u32 status =0 ;
@@ -241,7 +257,7 @@ static int pmic_arb_wait_for_done(struct spmi_controller *ctrl,u32 offset;int rc; - rc = pmic_arb->ver_ops->offset (pmic_arb, sid, addr); + rc = pmic_arb->ver_ops->offset (pmic_arb, sid, addr, ch_type);if (rc <0 )return rc;
@@ -289,7 +305,7 @@ static int pmic_arb_wait_for_done(struct spmi_controller *ctrl,int rc;u32 offset; - rc = pmic_arb->ver_ops->offset (pmic_arb, sid,0 ); + rc = pmic_arb->ver_ops->offset (pmic_arb, sid,0 ,PMIC_ARB_CHANNEL_RW );if (rc <0 )return rc;
@@ -298,7 +314,8 @@ static int pmic_arb_wait_for_done(struct spmi_controller *ctrl,raw_spin_lock_irqsave (&pmic_arb->lock, flags);pmic_arb_base_write (pmic_arb, offset +PMIC_ARB_CMD , cmd); - rc =pmic_arb_wait_for_done (ctrl, pmic_arb->wr_base, sid,0 ); + rc =pmic_arb_wait_for_done (ctrl, pmic_arb->wr_base, sid,0 , +PMIC_ARB_CHANNEL_RW );raw_spin_unlock_irqrestore (&pmic_arb->lock, flags);return rc;
@@ -334,7 +351,8 @@ static int pmic_arb_read_cmd(struct spmi_controller *ctrl, u8 opc, u8 sid,int rc;u32 offset; - rc = pmic_arb->ver_ops->offset (pmic_arb, sid, addr); + rc = pmic_arb->ver_ops->offset (pmic_arb, sid, addr, +PMIC_ARB_CHANNEL_OBS );if (rc <0 )return rc;
@@ -359,7 +377,8 @@ static int pmic_arb_read_cmd(struct spmi_controller *ctrl, u8 opc, u8 sid,raw_spin_lock_irqsave (&pmic_arb->lock, flags);pmic_arb_set_rd_cmd (pmic_arb, offset +PMIC_ARB_CMD , cmd); - rc =pmic_arb_wait_for_done (ctrl, pmic_arb->rd_base, sid, addr); + rc =pmic_arb_wait_for_done (ctrl, pmic_arb->rd_base, sid, addr, +PMIC_ARB_CHANNEL_OBS );if (rc) goto done;
@@ -376,7 +395,7 @@ static int pmic_arb_read_cmd(struct spmi_controller *ctrl, u8 opc, u8 sid, }static int pmic_arb_write_cmd (struct spmi_controller *ctrl,u8 opc,u8 sid, -u16 addr,const u8 *buf,size_t len) +u16 addr,const u8 *buf,size_t len) {struct spmi_pmic_arb *pmic_arb =spmi_controller_get_drvdata (ctrl);unsigned long flags;
@@ -385,7 +404,8 @@ static int pmic_arb_write_cmd(struct spmi_controller *ctrl, u8 opc, u8 sid,int rc;u32 offset; - rc = pmic_arb->ver_ops->offset (pmic_arb, sid, addr); + rc = pmic_arb->ver_ops->offset (pmic_arb, sid, addr, +PMIC_ARB_CHANNEL_RW );if (rc <0 )return rc;
@@ -420,7 +440,8 @@ static int pmic_arb_write_cmd(struct spmi_controller *ctrl, u8 opc, u8 sid,/* Start the transaction */ pmic_arb_base_write (pmic_arb, offset +PMIC_ARB_CMD , cmd); - rc =pmic_arb_wait_for_done (ctrl, pmic_arb->wr_base, sid, addr); + rc =pmic_arb_wait_for_done (ctrl, pmic_arb->wr_base, sid, addr, +PMIC_ARB_CHANNEL_RW );raw_spin_unlock_irqrestore (&pmic_arb->lock, flags);return rc;
@@ -680,12 +701,19 @@ static int qpnpint_irq_domain_dt_translate(struct irq_domain *d, ppid = intspec[0 ] <<8 | intspec[1 ]; rc = pmic_arb->ver_ops->ppid_to_apid (pmic_arb, ppid);if (rc <0 ) { -dev_err (&pmic_arb->spmic->dev,"failed to xlate sid = 0x%x, periph = 0x%x, irq = %x rc = %d\n" , +dev_err (&pmic_arb->spmic->dev,"failed to xlate sid = %#x, periph = %#x, irq = %u rc = %d\n" , intspec[0 ], intspec[1 ], intspec[2 ], rc);return rc; } apid = rc; +if (pmic_arb->apid_data[apid].irq_ee != pmic_arb->ee) { +dev_err (&pmic_arb->spmic->dev,"failed to xlate sid = %#x, periph = %#x, irq = %u: ee=%u but owner=%u\n" , + intspec[0 ], intspec[1 ], intspec[2 ], pmic_arb->ee, + pmic_arb->apid_data[apid].irq_ee); +return -ENODEV ; + } +/* Keep track of {max,min}_apid for bounding search during interrupt */ if (apid > pmic_arb->max_apid) pmic_arb->max_apid = apid;
@@ -762,7 +790,8 @@ static int pmic_arb_ppid_to_apid_v1(struct spmi_pmic_arb *pmic_arb, u16 ppid) }/* v1 offset per ee */ -static int pmic_arb_offset_v1 (struct spmi_pmic_arb *pmic_arb,u8 sid,u16 addr) +static int pmic_arb_offset_v1 (struct spmi_pmic_arb *pmic_arb,u8 sid,u16 addr, +enum pmic_arb_channel ch_type) {return 0x800 +0x80 * pmic_arb->channel; }
@@ -773,18 +802,15 @@ static u16 pmic_arb_find_apid(struct spmi_pmic_arb *pmic_arb, u16 ppid)u32 regval, offset;u16 id, apid; -/* -* PMIC_ARB_REG_APID is a table in HW mapping apid to ppid. -* ppid_to_apid is an in-memory invert of that table. -*/ for (apid = pmic_arb->last_apid; ; apid++, apidd++) { - offset =PMIC_ARB_REG_APID (apid); + offset = pmic_arb->ver_ops->apid_map_offset (apid);if (offset >= pmic_arb->core_size)break ; regval =readl_relaxed (pmic_arb->cnfg +SPMI_OWNERSHIP_TABLE_REG (apid)); - apidd->owner =SPMI_OWNERSHIP_PERIPH2OWNER (regval); + apidd->irq_ee =SPMI_OWNERSHIP_PERIPH2OWNER (regval); + apidd->write_ee = apidd->irq_ee; regval =readl_relaxed (pmic_arb->core + offset);if (!regval)
@@ -816,8 +842,84 @@ static int pmic_arb_ppid_to_apid_v2(struct spmi_pmic_arb *pmic_arb, u16 ppid)return apid_valid & ~PMIC_ARB_APID_VALID ; } +static int pmic_arb_read_apid_map_v5 (struct spmi_pmic_arb *pmic_arb) +{ +struct apid_data *apidd = pmic_arb->apid_data; +struct apid_data *prev_apidd; +u16 i, apid, ppid; +bool valid, is_irq_ee; +u32 regval, offset; + +/* +* In order to allow multiple EEs to write to a single PPID in arbiter +* version 5, there is more than one APID mapped to each PPID. +* The owner field for each of these mappings specifies the EE which is +* allowed to write to the APID. The owner of the last (highest) APID +* for a given PPID will receive interrupts from the PPID. +*/ +for (i =0 ; ; i++, apidd++) { + offset = pmic_arb->ver_ops->apid_map_offset (i); +if (offset >= pmic_arb->core_size) +break ; + + regval =readl_relaxed (pmic_arb->core + offset); +if (!regval) +continue ; + ppid = (regval >>8 ) &PMIC_ARB_PPID_MASK ; + is_irq_ee =PMIC_ARB_CHAN_IS_IRQ_OWNER (regval); + + regval =readl_relaxed (pmic_arb->cnfg + +SPMI_OWNERSHIP_TABLE_REG (i)); + apidd->write_ee =SPMI_OWNERSHIP_PERIPH2OWNER (regval); + + apidd->irq_ee = is_irq_ee ? apidd->write_ee :INVALID_EE ; + + valid = pmic_arb->ppid_to_apid[ppid] &PMIC_ARB_APID_VALID ; + apid = pmic_arb->ppid_to_apid[ppid] & ~PMIC_ARB_APID_VALID ; + prev_apidd = &pmic_arb->apid_data[apid]; + +if (valid && is_irq_ee && + prev_apidd->write_ee == pmic_arb->ee) { +/* +* Duplicate PPID mapping after the one for this EE; +* override the irq owner +*/ + prev_apidd->irq_ee = apidd->irq_ee; + }else if (!valid || is_irq_ee) { +/* First PPID mapping or duplicate for another EE */ + pmic_arb->ppid_to_apid[ppid] = i |PMIC_ARB_APID_VALID ; + } + + apidd->ppid = ppid; + pmic_arb->last_apid = i; + } + +/* Dump the mapping table for debug purposes. */ +dev_dbg (&pmic_arb->spmic->dev,"PPID APID Write-EE IRQ-EE\n" ); +for (ppid =0 ; ppid <PMIC_ARB_MAX_PPID ; ppid++) { + apid = pmic_arb->ppid_to_apid[ppid]; +if (apid &PMIC_ARB_APID_VALID ) { + apid &= ~PMIC_ARB_APID_VALID ; + apidd = &pmic_arb->apid_data[apid]; +dev_dbg (&pmic_arb->spmic->dev,"%#03X %3u %2u %2u\n" , + ppid, apid, apidd->write_ee, apidd->irq_ee); + } + } + +return 0 ; +} + +static int pmic_arb_ppid_to_apid_v5 (struct spmi_pmic_arb *pmic_arb,u16 ppid) +{ +if (!(pmic_arb->ppid_to_apid[ppid] &PMIC_ARB_APID_VALID )) +return -ENODEV ; + +return pmic_arb->ppid_to_apid[ppid] & ~PMIC_ARB_APID_VALID ; +} +/* v2 offset per ppid and per ee */ -static int pmic_arb_offset_v2 (struct spmi_pmic_arb *pmic_arb,u8 sid,u16 addr) +static int pmic_arb_offset_v2 (struct spmi_pmic_arb *pmic_arb,u8 sid,u16 addr, +enum pmic_arb_channel ch_type) {u16 apid;u16 ppid;
@@ -832,6 +934,35 @@ static int pmic_arb_offset_v2(struct spmi_pmic_arb *pmic_arb, u8 sid, u16 addr)return 0x1000 * pmic_arb->ee +0x8000 * apid; } +/* +* v5 offset per ee and per apid for observer channels and per apid for +* read/write channels. +*/ +static int pmic_arb_offset_v5 (struct spmi_pmic_arb *pmic_arb,u8 sid,u16 addr, +enum pmic_arb_channel ch_type) +{ +u16 apid; +int rc; +u32 offset =0 ; +u16 ppid = (sid <<8 ) | (addr >>8 ); + + rc =pmic_arb_ppid_to_apid_v5 (pmic_arb, ppid); +if (rc <0 ) +return rc; + + apid = rc; +switch (ch_type) { +case PMIC_ARB_CHANNEL_OBS : + offset =0x10000 * pmic_arb->ee +0x80 * apid; +break ; +case PMIC_ARB_CHANNEL_RW : + offset =0x10000 * apid; +break ; + } + +return offset; +} +static u32 pmic_arb_fmt_cmd_v1 (u8 opc,u8 sid,u16 addr,u8 bc) {return (opc <<27 ) | ((sid &0xf ) <<20 ) | (addr <<4 ) | (bc &0x7 );
@@ -861,6 +992,12 @@ static u32 pmic_arb_fmt_cmd_v2(u8 opc, u8 sid, u16 addr, u8 bc) }static void __iomem * +pmic_arb_owner_acc_status_v5 (struct spmi_pmic_arb *pmic_arb,u8 m,u16 n) +{ +return pmic_arb->intr +0x10000 * m +0x4 * n; +} + +static void __iomem *pmic_arb_acc_enable_v1 (struct spmi_pmic_arb *pmic_arb,u16 n) {return pmic_arb->intr +0x200 +0x4 * n;
@@ -873,6 +1010,12 @@ static u32 pmic_arb_fmt_cmd_v2(u8 opc, u8 sid, u16 addr, u8 bc) }static void __iomem * +pmic_arb_acc_enable_v5 (struct spmi_pmic_arb *pmic_arb,u16 n) +{ +return pmic_arb->wr_base +0x100 +0x10000 * n; +} + +static void __iomem *pmic_arb_irq_status_v1 (struct spmi_pmic_arb *pmic_arb,u16 n) {return pmic_arb->intr +0x600 +0x4 * n;
@@ -885,6 +1028,12 @@ static u32 pmic_arb_fmt_cmd_v2(u8 opc, u8 sid, u16 addr, u8 bc) }static void __iomem * +pmic_arb_irq_status_v5 (struct spmi_pmic_arb *pmic_arb,u16 n) +{ +return pmic_arb->wr_base +0x104 +0x10000 * n; +} + +static void __iomem *pmic_arb_irq_clear_v1 (struct spmi_pmic_arb *pmic_arb,u16 n) {return pmic_arb->intr +0xA00 +0x4 * n;
@@ -896,6 +1045,22 @@ static u32 pmic_arb_fmt_cmd_v2(u8 opc, u8 sid, u16 addr, u8 bc)return pmic_arb->intr +0x8 +0x1000 * n; } +static void __iomem * +pmic_arb_irq_clear_v5 (struct spmi_pmic_arb *pmic_arb,u16 n) +{ +return pmic_arb->wr_base +0x108 +0x10000 * n; +} + +static u32 pmic_arb_apid_map_offset_v2 (u16 n) +{ +return 0x800 +0x4 * n; +} + +static u32 pmic_arb_apid_map_offset_v5 (u16 n) +{ +return 0x900 +0x4 * n; +} +static const struct pmic_arb_ver_ops pmic_arb_v1 = { .ver_str ="v1" , .ppid_to_apid = pmic_arb_ppid_to_apid_v1,
@@ -906,6 +1071,7 @@ static u32 pmic_arb_fmt_cmd_v2(u8 opc, u8 sid, u16 addr, u8 bc) .acc_enable = pmic_arb_acc_enable_v1, .irq_status = pmic_arb_irq_status_v1, .irq_clear = pmic_arb_irq_clear_v1, + .apid_map_offset = pmic_arb_apid_map_offset_v2, };static const struct pmic_arb_ver_ops pmic_arb_v2 = {
@@ -918,6 +1084,7 @@ static u32 pmic_arb_fmt_cmd_v2(u8 opc, u8 sid, u16 addr, u8 bc) .acc_enable = pmic_arb_acc_enable_v2, .irq_status = pmic_arb_irq_status_v2, .irq_clear = pmic_arb_irq_clear_v2, + .apid_map_offset = pmic_arb_apid_map_offset_v2, };static const struct pmic_arb_ver_ops pmic_arb_v3 = {
@@ -930,6 +1097,20 @@ static u32 pmic_arb_fmt_cmd_v2(u8 opc, u8 sid, u16 addr, u8 bc) .acc_enable = pmic_arb_acc_enable_v2, .irq_status = pmic_arb_irq_status_v2, .irq_clear = pmic_arb_irq_clear_v2, + .apid_map_offset = pmic_arb_apid_map_offset_v2, +}; + +static const struct pmic_arb_ver_ops pmic_arb_v5 = { + .ver_str ="v5" , + .ppid_to_apid = pmic_arb_ppid_to_apid_v5, + .non_data_cmd = pmic_arb_non_data_cmd_v2, + .offset = pmic_arb_offset_v5, + .fmt_cmd = pmic_arb_fmt_cmd_v2, + .owner_acc_status = pmic_arb_owner_acc_status_v5, + .acc_enable = pmic_arb_acc_enable_v5, + .irq_status = pmic_arb_irq_status_v5, + .irq_clear = pmic_arb_irq_clear_v5, + .apid_map_offset = pmic_arb_apid_map_offset_v5, };static const struct irq_domain_ops pmic_arb_irq_domain_ops = {
@@ -982,8 +1163,10 @@ static int spmi_pmic_arb_probe(struct platform_device *pdev)if (hw_ver <PMIC_ARB_VERSION_V3_MIN ) pmic_arb->ver_ops = &pmic_arb_v2; -else +else if (hw_ver <PMIC_ARB_VERSION_V5_MIN ) pmic_arb->ver_ops = &pmic_arb_v3; +else + pmic_arb->ver_ops = &pmic_arb_v5; res =platform_get_resource_byname (pdev,IORESOURCE_MEM ,"obsrvr" );
@@ -1073,6 +1256,15 @@ static int spmi_pmic_arb_probe(struct platform_device *pdev) ctrl->read_cmd = pmic_arb_read_cmd; ctrl->write_cmd = pmic_arb_write_cmd; +if (hw_ver >=PMIC_ARB_VERSION_V5_MIN ) { + err =pmic_arb_read_apid_map_v5 (pmic_arb); +if (err) { +dev_err (&pdev->dev,"could not read APID->PPID mapping table, rc= %d\n" , + err); + goto err_put_ctrl; + } + } +dev_dbg (&pdev->dev,"adding irq domain\n" ); pmic_arb->domain =irq_domain_add_tree (pdev->dev.of_node, &pmic_arb_irq_domain_ops, pmic_arb);
Signature · 2 lines
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project
Re: [PATCH V2 11/12] spmi: pmic-arb: add support for HW version 5
Hi Kiran,
Quoted 18 lines · Kiran Gunda
From: David Collins <[email protected]>
Add support for version 5 of the SPMI PMIC arbiter. It utilizes different offsets for registers than those found on version 3. Also, the procedure to determine if writing and IRQ access is allowed for a given PPID changes for version 5.
Signed-off-by David Collins <[email protected]>Signed-off-by Kiran Gunda <[email protected]>Reviewed-by Stephen Boyd <[email protected]>--- drivers/spmi/spmi-pmic-arb.c | 236 +++++++++++++++++++++++++++++++++++++++---- 1 file changed, 214 insertions(+), 22 deletions(-)drivers/spmi/spmi-pmic-arb.c +0
-0
<snip>
Quoted 8 lines
drivers/spmi/spmi-pmic-arb.c +1
-1@@ -680,12 +701,19 @@ static int qpnpint_irq_domain_dt_translate(struct irq_domain *d, ppid = intspec[0 ] <<8 | intspec[1 ]; rc = pmic_arb->ver_ops->ppid_to_apid (pmic_arb, ppid);if (rc <0 ) { -dev_err (&pmic_arb->spmic->dev,"failed to xlate sid = 0x%x, periph = 0x%x, irq = %x rc = %d\n" , +dev_err (&pmic_arb->spmic->dev,"failed to xlate sid = %#x, periph = %#x, irq = %u rc = %d\n" , intspec[0 ], intspec[1 ], intspec[2 ], rc);return rc;
drivers/spmi/spmi-pmic-arb.c static int qpnpint_irq_domain_dt_translate(struct irq_domain *d, · line 716
Quoted 10 lines
drivers/spmi/spmi-pmic-arb.c +7
-0} apid = rc; +if (pmic_arb->apid_data[apid].irq_ee != pmic_arb->ee) { +dev_err (&pmic_arb->spmic->dev,"failed to xlate sid = %#x, periph = %#x, irq = %u: ee=%u but owner=%u\n" , + intspec[0 ], intspec[1 ], intspec[2 ], pmic_arb->ee, + pmic_arb->apid_data[apid].irq_ee); +return -ENODEV ; + } +
It seems to me that this check breaks pm8916_gpios on db410c. It causes the failure of pinctrl-spmi-gpio driver probing, because npins returned from platform_irq_count() call is 0.
Shawn
Quoted 3 lines
drivers/spmi/spmi-pmic-arb.c +0
-0/* Keep track of {max,min}_apid for bounding search during interrupt */ if (apid > pmic_arb->max_apid) pmic_arb->max_apid = apid;
Re: [PATCH V2 11/12] spmi: pmic-arb: add support for HW version 5
Quoted 52 lines · Shawn Guo
Hi Kiran,
Quoted 19 lines · Kiran Gunda
From: David Collins <[email protected]>
Add support for version 5 of the SPMI PMIC arbiter. It utilizes different offsets for registers than those found on version 3. Also, the procedure to determine if writing and IRQ access is allowed for a given PPID changes for version 5.
Signed-off-by David Collins <[email protected]>Signed-off-by Kiran Gunda <[email protected]>Reviewed-by Stephen Boyd <[email protected]>--- drivers/spmi/spmi-pmic-arb.c | 236 +++++++++++++++++++++++++++++++++++++++---- 1 file changed, 214 insertions(+), 22 deletions(-)drivers/spmi/spmi-pmic-arb.c +0
-0<snip>
Quoted 17 lines
drivers/spmi/spmi-pmic-arb.c +3
-1@@ -680,12 +701,19 @@ static int qpnpint_irq_domain_dt_translate(struct irq_domain *d, ppid = intspec[0 ] <<8 | intspec[1 ]; rc = pmic_arb->ver_ops->ppid_to_apid (pmic_arb, ppid);if (rc <0 ) { - dev_err(&pmic_arb->spmic->dev, "failed to xlate sid = 0x%x, periph = 0x%x, irq = %x rc = %d\n", + dev_err(&pmic_arb->spmic->dev, "failed to xlate sid = %#x, periph = %#x, irq = %u rc = %d\n", intspec[0], intspec[1], intspec[2], rc);return rc; } apid = rc; +if (pmic_arb->apid_data[apid].irq_ee != pmic_arb->ee) { + dev_err(&pmic_arb->spmic->dev, "failed to xlate sid = %#x, periph =%#x, irq = %u: ee=%u but owner=%u\n",
drivers/spmi/spmi-pmic-arb.c static int qpnpint_irq_domain_dt_translate(struct irq_domain *d, · line 716
Quoted 5 lines
drivers/spmi/spmi-pmic-arb.c +5
-0+ intspec[0 ], intspec[1 ], intspec[2 ], pmic_arb->ee, + pmic_arb->apid_data[apid].irq_ee); +return -ENODEV ; + } +It seems to me that this check breaks
pm8916_gpioson db410c. It causes the failure of pinctrl-spmi-gpio driver probing, because npins returned fromplatform_irq_count()call is 0.
Quoted 2 lines
Shawn
Hi Shawn,
The intention of this check is to avoid the access to the peripherals those are not owned by the current EE (APSS) and it is expected to return a failure if the peripheral that is not owned by the current EE is trying to be accessed.
Looks like you trying to access the GPIOs 0xc000 and 0xc100,
which are owned by modem subsystem but not the APSS. That is why you seeing the failure for that. Please change the ownership of those GPIOs to APSS (id '0') if you are working on a non-modem device (APQ).
Thanks,
Kiran
Quoted 8 lines
drivers/spmi/spmi-pmic-arb.c static int qpnpint_irq_domain_dt_translate(struct irq_domain *d, · line 719
Quoted 4 lines
/* Keep track of {max,min}_apid for bounding search during interrupt
*/drivers/spmi/spmi-pmic-arb.c +0
-0if (apid > pmic_arb->max_apid) pmic_arb->max_apid = apid;--
To unsubscribe from this list: send the line "unsubscribe linux-arm-msm" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH V2 11/12] spmi: pmic-arb: add support for HW version 5
Quoted 5 lines · On Thu, Aug 17, 2017 at 03:38:30PM +0530, [email protected] wrote:
The intention of this check is to avoid the access to the peripherals those are
not owned by the current EE (APSS) and it is expected to return a failure if the
peripheral that is not owned by the current EE is trying to be accessed.
Thanks for the background of this check.
Quoted 5 lines
Looks like you trying to access the GPIOs
0xc000and0xc100, which are owned by modem subsystem but not the APSS. That is why you seeing the failure for that.
Please change the ownership of those GPIOs to APSS (id '0') if you are working on a non-modem device (APQ).
Yes, it's device apq8016-sbc, and the error message is like below.
[ 1.317186] spmi spmi-0: PMIC arbiter version v2 (0x20010000) [ 1.324784] spmi spmi-0: failed to xlate sid = 0x0, periph = 0xc0, irq = 0: ee=0 but owner=2 [ 1.329430] spmi spmi-0: failed to xlate sid = 0x0, periph = 0xc0, irq = 0: ee=0 but owner=2 [ 1.337626] qcom-spmi-gpio: probe of 200f000.spmi:pm8916@0:gpios@c000 failed with error -22
I see that 'qcom,ee' property of spmi_bus is already <0>. Is that what you mean by ownership of those GPIOs?
The pm8916_gpio is working fine on apq8016-sbc device with the current mainline kernel. It's not good to break the existing device without a very good. IMO, we should get this fixed before the patch is merged.
Shawn
Re: [PATCH V2 11/12] spmi: pmic-arb: add support for HW version 5
Quoted 28 lines · Shawn Guo
Quoted 5 lines · On Thu, Aug 17, 2017 at 03:38:30PM +0530, [email protected] wrote:
The intention of this check is to avoid the access to the peripherals those are
not owned by the current EE (APSS) and it is expected to return a failure if the
peripheral that is not owned by the current EE is trying to be accessed.Thanks for the background of this check.
Quoted 5 lines
Looks like you trying to access the GPIOs
0xc000and0xc100, which are owned by modem subsystem but not the APSS. That is why you seeing the failure for that.
Please change the ownership of those GPIOs to APSS (id '0') if you are working on a non-modem device (APQ).Yes, it's device apq8016-sbc, and the error message is like below.
[ 1.317186] spmi spmi-0: PMIC arbiter version v2 (0x20010000) [ 1.324784] spmi spmi-0: failed to xlate sid = 0x0, periph = 0xc0, irq = 0: ee=0 but owner=2 [ 1.329430] spmi spmi-0: failed to xlate sid = 0x0, periph = 0xc0, irq = 0: ee=0 but owner=2 [ 1.337626] qcom-spmi-gpio: probe of200f000.spmi:pm8916@0:gpios@c000 failed with error -22
I see that 'qcom,ee' property of
spmi_busis already <0>. Is that what you mean by ownership of those GPIOs?
Quoted 6 lines
The
pm8916_gpiois working fine on apq8016-sbc device with the current mainline kernel. It's not good to break the existing device without a very good. IMO, we should get this fixed before the patch is merged.Shawn
--
From the logs the ownership for these GPIOs is not assigned to the application processor but to another master. Considering this is a (apq8016-sbc) APSS only platform ideally the fix for this would be to update the ownership table in the boot loader. The other option would be to make the existing ownership check in SW optional for a platform via DT. I will push a patch shortly for this. Could you please give that a try.
Thanks,
Kiran
Quoted 3 lines
To unsubscribe from this list: send the line "unsubscribe linux-arm-msm" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH V2 11/12] spmi: pmic-arb: add support for HW version 5
Quoted 26 lines · On 2017-08-18 16:43, [email protected] wrote:
Quoted 25 lines · Shawn Guo
Quoted 5 lines · On Thu, Aug 17, 2017 at 03:38:30PM +0530, [email protected] wrote:
The intention of this check is to avoid the access to the peripherals those are
not owned by the current EE (APSS) and it is expected to return a failure if the
peripheral that is not owned by the current EE is trying to be accessed.Thanks for the background of this check.
Quoted 5 lines
Looks like you trying to access the GPIOs
0xc000and0xc100, which are owned by modem subsystem but not the APSS. That is why you seeing the failure for that.
Please change the ownership of those GPIOs to APSS (id '0') if you are working on a non-modem device (APQ).Yes, it's device apq8016-sbc, and the error message is like below.
[ 1.317186] spmi spmi-0: PMIC arbiter version v2 (0x20010000) [ 1.324784] spmi spmi-0: failed to xlate sid = 0x0, periph = 0xc0, irq = 0: ee=0 but owner=2 [ 1.329430] spmi spmi-0: failed to xlate sid = 0x0, periph = 0xc0, irq = 0: ee=0 but owner=2 [ 1.337626] qcom-spmi-gpio: probe of200f000.spmi:pm8916@0:gpios@c000 failed with error -22
Quoted 3 lines
Quoted 3 lines
I see that 'qcom,ee' property of
spmi_busis already <0>. Is that what you mean by ownership of those GPIOs?
I do not mean that. The SPMI arbiter ownership register is programmed by the boot-loader, where the actual ownership is set. The same is shown in the above logs as owner = 2.
Quoted 24 lines
Quoted 6 lines
The
pm8916_gpiois working fine on apq8016-sbc device with the current mainline kernel. It's not good to break the existing device without a very good. IMO, we should get this fixed before the patch is merged.Shawn
--From the logs the ownership for these GPIOs is not assigned to the application processor but to another master. Considering this is a (apq8016-sbc) APSS only platform ideally the fix for this would be to update the ownership table in the boot loader. The other option would be to make the existing ownership check in SW optional for a platform via DT. I will push a patch shortly for this. Could you please give that a try.
Thanks,
KiranQuoted 3 lines
To unsubscribe from this list: send the line "unsubscribe linux-arm-msm" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html--
To unsubscribe from this list: send the line "unsubscribe linux-arm-msm" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH V2 11/12] spmi: pmic-arb: add support for HW version 5
In reply to [email protected]Quoted 7 lines · On Fri, Aug 18, 2017 at 04:43:23PM +0530, [email protected] wrote:
From the logs the ownership for these GPIOs is not assigned to the application processor but to another master. Considering this is a (apq8016-sbc) APSS only platform ideally the fix for this would be to update the ownership table in the boot loader. The other option would be to make the existing ownership check in SW optional for a platform via DT. I will push a patch shortly for this. Could you please give that a try.
I just tested it on db410c board, and it fixes the problem for me. Thanks for the patch.
Shawn
PATCH v2 12/12 spmi: pmic-arb: Remove checking opc value not less than 0
In reply to Kiran GundaFrom: Fenglin Wu <[email protected]>
The opc parameter in pmic_arb_write_cmd() function is defined with type u8 and it's always greater than or equal to 0. Checking that it's not less than 0 is redundant and it can cause a forbidden warning during compilation. Remove the check.
--- drivers/spmi/spmi-pmic-arb.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/spmi/spmi-pmic-arb.c +2 -2
@@ -1,5 +1,5 @@/* -* Copyright (c) 2012-2015, The Linux Foundation. All rights reserved. +* Copyright (c) 2012-2015, 2017, The Linux Foundation. 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
@@ -419,7 +419,7 @@ static int pmic_arb_write_cmd(struct spmi_controller *ctrl, u8 opc, u8 sid,/* Check the opcode */ if (opc >=0x40 && opc <=0x5F ) opc =PMIC_ARB_OP_WRITE ; -else if (opc >=0x00 && opc <=0x0F ) +else if (opc <=0x0F ) opc =PMIC_ARB_OP_EXT_WRITE ;else if (opc >=0x30 && opc <=0x37 ) opc =PMIC_ARB_OP_EXT_WRITEL ;
Signature · 2 lines
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project
Quoted 54 lines · Kiran Gunda
v2:
* [PATCH V2 04/12] spmi: pmic-arb: optimize
qpnpint_irq_set_typefunction Added Stephen's Reviewed-by tag.* [PATCH V2 05/12] spmi: pmic-arb: fix memory allocation for
mapping_tableAdded Fixes tag and Stephen's Reviewed-by tag.* [PATCH V2 02/12] spmi: pmic-arb: rename
pa_xxtopmic_arb_xxand other cleanup Added Stephen's Reviewed-by tag.* [PATCH V2 06/12] spmi: pmic-arb: replace the
writel_relaxedwith__raw_writelAdded Fixes tag.* [PATCH V2 03/12] spmi: pmic-arb: clean up
pmic_arb_find_apidfunction Fixed alignement issue and added Stephen's reviewed-by tag.Now all the patches in this series are reviewed and acked by Stephen boyd and are ready
for merge.v1:
* This patch series add the support for pmic arbiter hardware v5 along with the few bug fixes and code cleanup.
* This new series is the combined series of
[PATCH V3 0/5]: spmi: pmic-arb: Fixup patches and [PATCH V4 0/4]: spmi: pmic-arb: support for V5 HW and bug fixes,
which are
being reviewed by Stephen Boyd.* This series depends on the below patch uploaded by Stephen Boyd
https://patchwork.kernel.org/patch/9810723/.David Collins (1):
spmi: pmic-arb: add support for HW version 5Fenglin Wu (1):
spmi: pmic-arb: Remove checking opc value not less than 0Kiran Gunda (10):
spmi: pmic-arb: remove the read/write access checks
spmi: pmic-arb: renamepa_xxtopmic_arb_xxand other cleanup
spmi: pmic-arb: clean uppmic_arb_find_apidfunction
spmi: pmic-arb: optimizeqpnpint_irq_set_typefunction
spmi: pmic-arb: fix memory allocation formapping_table
spmi: pmic-arb: replace thewritel_relaxedwith__raw_writel
spmi: pmic-arb: return the value instead of passing by pointer
spmi: pmic-arb: useirq_chipcallback to set spmi irq wakeup
capability
spmi: pmic-arb: return__iomempointer instead of offset
spmi: pmic-arb: fix a possible null pointer dereference
Quoted 3 lines
drivers/spmi/spmi-pmic-arb.c | 825 +++++++++++++++++++++++++------------------ 1 file changed, 481 insertions(+), 344 deletions(-)
Hi Greg,
Could you please pull this patch series in to your tree? All these patches are reviewed and acked by Stephen boyd.
Quoted 60 lines · On Tue, Aug 01, 2017 at 10:25:55AM +0530, [email protected] wrote:
Quoted 59 lines · Kiran Gunda
v2:
* [PATCH V2 04/12] spmi: pmic-arb: optimize
qpnpint_irq_set_typefunction
Added Stephen's Reviewed-by tag.* [PATCH V2 05/12] spmi: pmic-arb: fix memory allocation for
mapping_table
Added Fixes tag and Stephen's Reviewed-by tag.* [PATCH V2 02/12] spmi: pmic-arb: rename
pa_xxtopmic_arb_xxand other cleanup
Added Stephen's Reviewed-by tag.* [PATCH V2 06/12] spmi: pmic-arb: replace the
writel_relaxedwith__raw_writel
Added Fixes tag.* [PATCH V2 03/12] spmi: pmic-arb: clean up
pmic_arb_find_apidfunction Fixed alignement issue and added Stephen's reviewed-by tag.Now all the patches in this series are reviewed and acked by Stephen boyd and are ready
for merge.v1:
* This patch series add the support for pmic arbiter hardware v5 along with
the few bug fixes and code cleanup.* This new series is the combined series of
[PATCH V3 0/5]: spmi: pmic-arb: Fixup patches and
[PATCH V4 0/4]: spmi: pmic-arb: support for V5 HW and bug fixes, which
are
being reviewed by Stephen Boyd.* This series depends on the below patch uploaded by Stephen Boyd
https://patchwork.kernel.org/patch/9810723/.David Collins (1):
spmi: pmic-arb: add support for HW version 5Fenglin Wu (1):
spmi: pmic-arb: Remove checking opc value not less than 0Kiran Gunda (10):
spmi: pmic-arb: remove the read/write access checks
spmi: pmic-arb: renamepa_xxtopmic_arb_xxand other cleanup
spmi: pmic-arb: clean uppmic_arb_find_apidfunction
spmi: pmic-arb: optimizeqpnpint_irq_set_typefunction
spmi: pmic-arb: fix memory allocation formapping_table
spmi: pmic-arb: replace thewritel_relaxedwith__raw_writel
spmi: pmic-arb: return the value instead of passing by pointer
spmi: pmic-arb: useirq_chipcallback to set spmi irq wakeup
capability
spmi: pmic-arb: return__iomempointer instead of offset
spmi: pmic-arb: fix a possible null pointer dereference
Quoted 6 lines
Quoted 3 lines
drivers/spmi/spmi-pmic-arb.c | 825 +++++++++++++++++++++++++------------------ 1 file changed, 481 insertions(+), 344 deletions(-)Hi Greg,
Could you please pull this patch series in to your tree? All these patches are reviewed and acked by Stephen boyd.
Will do, give me some time to catch up on misc drivers like this...
thanks,
greg k-h