Эх сурвалжийг харах

mfd: pm8921: Use ssbi regmap

Use a regmap so that the pm8xxx read/write APIs can be removed
once all consumer drivers are converted.

Reviewed-by: Mark Brown <broonie@linaro.org>
Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
Signed-off-by: Lee Jones <lee.jones@linaro.org>
Stephen Boyd 11 жил өмнө
parent
commit
e7b81fca7d

+ 1 - 0
drivers/mfd/Kconfig

@@ -482,6 +482,7 @@ config MFD_PM8921_CORE
 	select IRQ_DOMAIN
 	select IRQ_DOMAIN
 	select MFD_CORE
 	select MFD_CORE
 	select MFD_PM8XXX
 	select MFD_PM8XXX
+	select REGMAP
 	help
 	help
 	  If you say yes to this option, support will be included for the
 	  If you say yes to this option, support will be included for the
 	  built-in PM8921 PMIC chip.
 	  built-in PM8921 PMIC chip.

+ 38 - 28
drivers/mfd/pm8921-core.c

@@ -23,6 +23,7 @@
 #include <linux/slab.h>
 #include <linux/slab.h>
 #include <linux/err.h>
 #include <linux/err.h>
 #include <linux/ssbi.h>
 #include <linux/ssbi.h>
+#include <linux/regmap.h>
 #include <linux/of_platform.h>
 #include <linux/of_platform.h>
 #include <linux/mfd/core.h>
 #include <linux/mfd/core.h>
 #include <linux/mfd/pm8xxx/core.h>
 #include <linux/mfd/pm8xxx/core.h>
@@ -57,6 +58,7 @@
 
 
 struct pm_irq_chip {
 struct pm_irq_chip {
 	struct device		*dev;
 	struct device		*dev;
+	struct regmap		*regmap;
 	spinlock_t		pm_irq_lock;
 	spinlock_t		pm_irq_lock;
 	struct irq_domain	*irqdomain;
 	struct irq_domain	*irqdomain;
 	unsigned int		num_irqs;
 	unsigned int		num_irqs;
@@ -70,29 +72,19 @@ struct pm8921 {
 	struct pm_irq_chip		*irq_chip;
 	struct pm_irq_chip		*irq_chip;
 };
 };
 
 
-static int pm8xxx_read_root_irq(const struct pm_irq_chip *chip, u8 *rp)
-{
-	return pm8xxx_readb(chip->dev, SSBI_REG_ADDR_IRQ_ROOT, rp);
-}
-
-static int pm8xxx_read_master_irq(const struct pm_irq_chip *chip, u8 m, u8 *bp)
-{
-	return pm8xxx_readb(chip->dev,
-			SSBI_REG_ADDR_IRQ_M_STATUS1 + m, bp);
-}
-
-static int pm8xxx_read_block_irq(struct pm_irq_chip *chip, u8 bp, u8 *ip)
+static int pm8xxx_read_block_irq(struct pm_irq_chip *chip, unsigned int bp,
+				 unsigned int *ip)
 {
 {
 	int	rc;
 	int	rc;
 
 
 	spin_lock(&chip->pm_irq_lock);
 	spin_lock(&chip->pm_irq_lock);
-	rc = pm8xxx_writeb(chip->dev, SSBI_REG_ADDR_IRQ_BLK_SEL, bp);
+	rc = regmap_write(chip->regmap, SSBI_REG_ADDR_IRQ_BLK_SEL, bp);
 	if (rc) {
 	if (rc) {
 		pr_err("Failed Selecting Block %d rc=%d\n", bp, rc);
 		pr_err("Failed Selecting Block %d rc=%d\n", bp, rc);
 		goto bail;
 		goto bail;
 	}
 	}
 
 
-	rc = pm8xxx_readb(chip->dev, SSBI_REG_ADDR_IRQ_IT_STATUS, ip);
+	rc = regmap_read(chip->regmap, SSBI_REG_ADDR_IRQ_IT_STATUS, ip);
 	if (rc)
 	if (rc)
 		pr_err("Failed Reading Status rc=%d\n", rc);
 		pr_err("Failed Reading Status rc=%d\n", rc);
 bail:
 bail:
@@ -100,19 +92,20 @@ bail:
 	return rc;
 	return rc;
 }
 }
 
 
-static int pm8xxx_config_irq(struct pm_irq_chip *chip, u8 bp, u8 cp)
+static int
+pm8xxx_config_irq(struct pm_irq_chip *chip, unsigned int bp, unsigned int cp)
 {
 {
 	int	rc;
 	int	rc;
 
 
 	spin_lock(&chip->pm_irq_lock);
 	spin_lock(&chip->pm_irq_lock);
-	rc = pm8xxx_writeb(chip->dev, SSBI_REG_ADDR_IRQ_BLK_SEL, bp);
+	rc = regmap_write(chip->regmap, SSBI_REG_ADDR_IRQ_BLK_SEL, bp);
 	if (rc) {
 	if (rc) {
 		pr_err("Failed Selecting Block %d rc=%d\n", bp, rc);
 		pr_err("Failed Selecting Block %d rc=%d\n", bp, rc);
 		goto bail;
 		goto bail;
 	}
 	}
 
 
 	cp |= PM_IRQF_WRITE;
 	cp |= PM_IRQF_WRITE;
-	rc = pm8xxx_writeb(chip->dev, SSBI_REG_ADDR_IRQ_CONFIG, cp);
+	rc = regmap_write(chip->regmap, SSBI_REG_ADDR_IRQ_CONFIG, cp);
 	if (rc)
 	if (rc)
 		pr_err("Failed Configuring IRQ rc=%d\n", rc);
 		pr_err("Failed Configuring IRQ rc=%d\n", rc);
 bail:
 bail:
@@ -123,7 +116,7 @@ bail:
 static int pm8xxx_irq_block_handler(struct pm_irq_chip *chip, int block)
 static int pm8xxx_irq_block_handler(struct pm_irq_chip *chip, int block)
 {
 {
 	int pmirq, irq, i, ret = 0;
 	int pmirq, irq, i, ret = 0;
-	u8 bits;
+	unsigned int bits;
 
 
 	ret = pm8xxx_read_block_irq(chip, block, &bits);
 	ret = pm8xxx_read_block_irq(chip, block, &bits);
 	if (ret) {
 	if (ret) {
@@ -148,10 +141,11 @@ static int pm8xxx_irq_block_handler(struct pm_irq_chip *chip, int block)
 
 
 static int pm8xxx_irq_master_handler(struct pm_irq_chip *chip, int master)
 static int pm8xxx_irq_master_handler(struct pm_irq_chip *chip, int master)
 {
 {
-	u8 blockbits;
+	unsigned int blockbits;
 	int block_number, i, ret = 0;
 	int block_number, i, ret = 0;
 
 
-	ret = pm8xxx_read_master_irq(chip, master, &blockbits);
+	ret = regmap_read(chip->regmap, SSBI_REG_ADDR_IRQ_M_STATUS1 + master,
+			  &blockbits);
 	if (ret) {
 	if (ret) {
 		pr_err("Failed to read master %d ret=%d\n", master, ret);
 		pr_err("Failed to read master %d ret=%d\n", master, ret);
 		return ret;
 		return ret;
@@ -173,12 +167,12 @@ static void pm8xxx_irq_handler(unsigned int irq, struct irq_desc *desc)
 {
 {
 	struct pm_irq_chip *chip = irq_desc_get_handler_data(desc);
 	struct pm_irq_chip *chip = irq_desc_get_handler_data(desc);
 	struct irq_chip *irq_chip = irq_desc_get_chip(desc);
 	struct irq_chip *irq_chip = irq_desc_get_chip(desc);
-	u8	root;
+	unsigned int root;
 	int	i, ret, masters = 0;
 	int	i, ret, masters = 0;
 
 
 	chained_irq_enter(irq_chip, desc);
 	chained_irq_enter(irq_chip, desc);
 
 
-	ret = pm8xxx_read_root_irq(chip, &root);
+	ret = regmap_read(chip->regmap, SSBI_REG_ADDR_IRQ_ROOT, &root);
 	if (ret) {
 	if (ret) {
 		pr_err("Can't read root status ret=%d\n", ret);
 		pr_err("Can't read root status ret=%d\n", ret);
 		return;
 		return;
@@ -283,7 +277,7 @@ static struct irq_chip pm8xxx_irq_chip = {
 static int pm8xxx_get_irq_stat(struct pm_irq_chip *chip, int irq)
 static int pm8xxx_get_irq_stat(struct pm_irq_chip *chip, int irq)
 {
 {
 	int pmirq, rc;
 	int pmirq, rc;
-	u8  block, bits, bit;
+	unsigned int  block, bits, bit;
 	unsigned long flags;
 	unsigned long flags;
 	struct irq_data *irq_data = irq_get_irq_data(irq);
 	struct irq_data *irq_data = irq_get_irq_data(irq);
 
 
@@ -294,14 +288,14 @@ static int pm8xxx_get_irq_stat(struct pm_irq_chip *chip, int irq)
 
 
 	spin_lock_irqsave(&chip->pm_irq_lock, flags);
 	spin_lock_irqsave(&chip->pm_irq_lock, flags);
 
 
-	rc = pm8xxx_writeb(chip->dev, SSBI_REG_ADDR_IRQ_BLK_SEL, block);
+	rc = regmap_write(chip->regmap, SSBI_REG_ADDR_IRQ_BLK_SEL, block);
 	if (rc) {
 	if (rc) {
 		pr_err("Failed Selecting block irq=%d pmirq=%d blk=%d rc=%d\n",
 		pr_err("Failed Selecting block irq=%d pmirq=%d blk=%d rc=%d\n",
 			irq, pmirq, block, rc);
 			irq, pmirq, block, rc);
 		goto bail_out;
 		goto bail_out;
 	}
 	}
 
 
-	rc = pm8xxx_readb(chip->dev, SSBI_REG_ADDR_IRQ_RT_STATUS, &bits);
+	rc = regmap_read(chip->regmap, SSBI_REG_ADDR_IRQ_RT_STATUS, &bits);
 	if (rc) {
 	if (rc) {
 		pr_err("Failed Configuring irq=%d pmirq=%d blk=%d rc=%d\n",
 		pr_err("Failed Configuring irq=%d pmirq=%d blk=%d rc=%d\n",
 			irq, pmirq, block, rc);
 			irq, pmirq, block, rc);
@@ -389,11 +383,21 @@ static struct pm8xxx_drvdata pm8921_drvdata = {
 	.pmic_read_irq_stat	= pm8921_read_irq_stat,
 	.pmic_read_irq_stat	= pm8921_read_irq_stat,
 };
 };
 
 
+static const struct regmap_config ssbi_regmap_config = {
+	.reg_bits = 16,
+	.val_bits = 8,
+	.max_register = 0x3ff,
+	.fast_io = true,
+	.reg_read = ssbi_reg_read,
+	.reg_write = ssbi_reg_write
+};
+
 static int pm8921_probe(struct platform_device *pdev)
 static int pm8921_probe(struct platform_device *pdev)
 {
 {
 	struct pm8921 *pmic;
 	struct pm8921 *pmic;
+	struct regmap *regmap;
 	int rc;
 	int rc;
-	u8 val;
+	unsigned int val;
 	unsigned int irq;
 	unsigned int irq;
 	u32 rev;
 	u32 rev;
 	struct pm_irq_chip *chip;
 	struct pm_irq_chip *chip;
@@ -409,8 +413,13 @@ static int pm8921_probe(struct platform_device *pdev)
 		return -ENOMEM;
 		return -ENOMEM;
 	}
 	}
 
 
+	regmap = devm_regmap_init(&pdev->dev, NULL, pdev->dev.parent,
+				  &ssbi_regmap_config);
+	if (IS_ERR(regmap))
+		return PTR_ERR(regmap);
+
 	/* Read PMIC chip revision */
 	/* Read PMIC chip revision */
-	rc = ssbi_read(pdev->dev.parent, REG_HWREV, &val, sizeof(val));
+	rc = regmap_read(regmap, REG_HWREV, &val);
 	if (rc) {
 	if (rc) {
 		pr_err("Failed to read hw rev reg %d:rc=%d\n", REG_HWREV, rc);
 		pr_err("Failed to read hw rev reg %d:rc=%d\n", REG_HWREV, rc);
 		return rc;
 		return rc;
@@ -419,7 +428,7 @@ static int pm8921_probe(struct platform_device *pdev)
 	rev = val;
 	rev = val;
 
 
 	/* Read PMIC chip revision 2 */
 	/* Read PMIC chip revision 2 */
-	rc = ssbi_read(pdev->dev.parent, REG_HWREV_2, &val, sizeof(val));
+	rc = regmap_read(regmap, REG_HWREV_2, &val);
 	if (rc) {
 	if (rc) {
 		pr_err("Failed to read hw rev 2 reg %d:rc=%d\n",
 		pr_err("Failed to read hw rev 2 reg %d:rc=%d\n",
 			REG_HWREV_2, rc);
 			REG_HWREV_2, rc);
@@ -440,6 +449,7 @@ static int pm8921_probe(struct platform_device *pdev)
 
 
 	pmic->irq_chip = chip;
 	pmic->irq_chip = chip;
 	chip->dev = &pdev->dev;
 	chip->dev = &pdev->dev;
+	chip->regmap = regmap;
 	chip->num_irqs = nirqs;
 	chip->num_irqs = nirqs;
 	chip->num_blocks = DIV_ROUND_UP(chip->num_irqs, 8);
 	chip->num_blocks = DIV_ROUND_UP(chip->num_irqs, 8);
 	chip->num_masters = DIV_ROUND_UP(chip->num_blocks, 8);
 	chip->num_masters = DIV_ROUND_UP(chip->num_blocks, 8);