diff mbox series

[03/17] mfd: sec: Add support for the RTC on S2MPA01

Message ID 20190128230700.7325-4-stuart.menefy@mathembedded.com (mailing list archive)
State Not Applicable
Headers show
Series Resuscitate Exynos 5260 support | expand

Commit Message

Stuart Menefy Jan. 28, 2019, 11:06 p.m. UTC
The RTC on the S2MPA01 is largely the same as that on other Samsung
PMIC devices, so adding support for it just involves configuring it
and describing the interrupt registers.

Signed-off-by: Stuart Menefy <stuart.menefy@mathembedded.com>
---
 drivers/mfd/sec-core.c |  2 ++
 drivers/mfd/sec-irq.c  | 97 ++++++++++++++++++++++++++++++++++++++++++++++++++
 drivers/rtc/rtc-s5m.c  | 15 ++++++++
 3 files changed, 114 insertions(+)

Comments

Krzysztof Kozlowski Jan. 29, 2019, 8:45 a.m. UTC | #1
On Tue, 29 Jan 2019 at 00:07, Stuart Menefy
<stuart.menefy@mathembedded.com> wrote:
>
> The RTC on the S2MPA01 is largely the same as that on other Samsung
> PMIC devices, so adding support for it just involves configuring it
> and describing the interrupt registers.
>
> Signed-off-by: Stuart Menefy <stuart.menefy@mathembedded.com>
> ---
>  drivers/mfd/sec-core.c |  2 ++
>  drivers/mfd/sec-irq.c  | 97 ++++++++++++++++++++++++++++++++++++++++++++++++++
>  drivers/rtc/rtc-s5m.c  | 15 ++++++++
>  3 files changed, 114 insertions(+)
>
> diff --git a/drivers/mfd/sec-core.c b/drivers/mfd/sec-core.c
> index e0835c9df7a1..911381414334 100644
> --- a/drivers/mfd/sec-core.c
> +++ b/drivers/mfd/sec-core.c
> @@ -103,6 +103,8 @@ static const struct mfd_cell s2mps15_devs[] = {
>  static const struct mfd_cell s2mpa01_devs[] = {
>         {
>                 .name = "s2mpa01-pmic",
> +       }, {
> +               .name = "s2mpa01-rtc",
>         },
>  };
>
> diff --git a/drivers/mfd/sec-irq.c b/drivers/mfd/sec-irq.c
> index ad0099077e7e..7cc863b07384 100644
> --- a/drivers/mfd/sec-irq.c
> +++ b/drivers/mfd/sec-irq.c
> @@ -11,12 +11,96 @@
>
>  #include <linux/mfd/samsung/core.h>
>  #include <linux/mfd/samsung/irq.h>
> +#include <linux/mfd/samsung/s2mpa01.h>
>  #include <linux/mfd/samsung/s2mps11.h>
>  #include <linux/mfd/samsung/s2mps14.h>
>  #include <linux/mfd/samsung/s2mpu02.h>
>  #include <linux/mfd/samsung/s5m8763.h>
>  #include <linux/mfd/samsung/s5m8767.h>
>
> +static struct regmap_irq s2mpa01_irqs[] = {

static const

> +       [S2MPA01_IRQ_PWRONF] = {
> +               .reg_offset = 0,
> +               .mask = S2MPA01_IRQ_PWRONF_MASK,
> +       },
> +       [S2MPA01_IRQ_PWRONR] = {
> +               .reg_offset = 0,
> +               .mask = S2MPA01_IRQ_PWRONR_MASK,
> +       },
> +       [S2MPA01_IRQ_JIGONBF] = {
> +               .reg_offset = 0,
> +               .mask = S2MPA01_IRQ_JIGONBF_MASK,
> +       },
> +       [S2MPA01_IRQ_JIGONBR] = {
> +               .reg_offset = 0,
> +               .mask = S2MPA01_IRQ_JIGONBR_MASK,
> +       },
> +       [S2MPA01_IRQ_ACOKBF] = {
> +               .reg_offset = 0,
> +               .mask = S2MPA01_IRQ_ACOKBF_MASK,
> +       },
> +       [S2MPA01_IRQ_ACOKBR] = {
> +               .reg_offset = 0,
> +               .mask = S2MPA01_IRQ_ACOKBR_MASK,
> +       },
> +       [S2MPA01_IRQ_PWRON1S] = {
> +               .reg_offset = 0,
> +               .mask = S2MPA01_IRQ_PWRON1S_MASK,
> +       },
> +       [S2MPA01_IRQ_MRB] = {
> +               .reg_offset = 0,
> +               .mask = S2MPA01_IRQ_MRB_MASK,
> +       },
> +       [S2MPA01_IRQ_RTC60S] = {
> +               .reg_offset = 1,
> +               .mask = S2MPA01_IRQ_RTC60S_MASK,
> +       },
> +       [S2MPA01_IRQ_RTCA1] = {
> +               .reg_offset = 1,
> +               .mask = S2MPA01_IRQ_RTCA1_MASK,
> +       },
> +       [S2MPA01_IRQ_RTCA0] = {
> +               .reg_offset = 1,
> +               .mask = S2MPA01_IRQ_RTCA0_MASK,
> +       },
> +       [S2MPA01_IRQ_SMPL] = {
> +               .reg_offset = 1,
> +               .mask = S2MPA01_IRQ_SMPL_MASK,
> +       },
> +       [S2MPA01_IRQ_RTC1S] = {
> +               .reg_offset = 1,
> +               .mask = S2MPA01_IRQ_RTC1S_MASK,
> +       },
> +       [S2MPA01_IRQ_WTSR] = {
> +               .reg_offset = 1,
> +               .mask = S2MPA01_IRQ_WTSR_MASK,
> +       },
> +       [S2MPA01_IRQ_INT120C] = {
> +               .reg_offset = 2,
> +               .mask = S2MPA01_IRQ_INT120C_MASK,
> +       },
> +       [S2MPA01_IRQ_INT140C] = {
> +               .reg_offset = 2,
> +               .mask = S2MPA01_IRQ_INT140C_MASK,
> +       },
> +       [S2MPA01_IRQ_LDO3_TSD] = {
> +               .reg_offset = 2,
> +               .mask = S2MPA01_IRQ_LDO3_TSD_MASK,
> +       },
> +       [S2MPA01_IRQ_B16_TSD] = {
> +               .reg_offset = 2,
> +               .mask = S2MPA01_IRQ_B16_TSD_MASK,
> +       },
> +       [S2MPA01_IRQ_B24_TSD] = {
> +               .reg_offset = 2,
> +               .mask = S2MPA01_IRQ_B24_TSD_MASK,
> +       },
> +       [S2MPA01_IRQ_B35_TSD] = {
> +               .reg_offset = 2,
> +               .mask = S2MPA01_IRQ_B35_TSD_MASK,
> +       },
> +};
> +
>  static const struct regmap_irq s2mps11_irqs[] = {
>         [S2MPS11_IRQ_PWRONF] = {
>                 .reg_offset = 0,
> @@ -372,6 +456,16 @@ static const struct regmap_irq s5m8763_irqs[] = {
>         },
>  };
>
> +static struct regmap_irq_chip s2mpa01_irq_chip = {

static const

> +       .name = "s2mpa01",
> +       .irqs = s2mpa01_irqs,
> +       .num_irqs = ARRAY_SIZE(s2mpa01_irqs),
> +       .num_regs = 3,
> +       .status_base = S2MPA01_REG_INT1,
> +       .mask_base = S2MPA01_REG_INT1M,
> +       .ack_base = S2MPA01_REG_INT1,
> +};
> +
>  static const struct regmap_irq_chip s2mps11_irq_chip = {
>         .name = "s2mps11",
>         .irqs = s2mps11_irqs,
> @@ -455,6 +549,9 @@ int sec_irq_init(struct sec_pmic_dev *sec_pmic)
>         case S5M8767X:
>                 sec_irq_chip = &s5m8767_irq_chip;
>                 break;
> +       case S2MPA01:
> +               sec_irq_chip = &s2mpa01_irq_chip;
> +               break;
>         case S2MPS11X:
>                 sec_irq_chip = &s2mps11_irq_chip;
>                 break;
> diff --git a/drivers/rtc/rtc-s5m.c b/drivers/rtc/rtc-s5m.c
> index c7f1bf823ea0..0f7623a57e74 100644
> --- a/drivers/rtc/rtc-s5m.c
> +++ b/drivers/rtc/rtc-s5m.c
> @@ -246,6 +246,7 @@ static int s5m_check_peding_alarm_interrupt(struct s5m_rtc_info *info,
>                 ret = regmap_read(info->regmap, S5M_RTC_STATUS, &val);
>                 val &= S5M_ALARM0_STATUS;
>                 break;
> +       case S2MPA01:
>         case S2MPS15X:
>         case S2MPS14X:
>         case S2MPS13X:
> @@ -309,6 +310,7 @@ static int s5m8767_rtc_set_alarm_reg(struct s5m_rtc_info *info)
>         case S5M8767X:
>                 data &= ~S5M_RTC_TIME_EN_MASK;
>                 break;
> +       case S2MPA01:
>         case S2MPS15X:
>         case S2MPS14X:
>         case S2MPS13X:
> @@ -396,6 +398,7 @@ static int s5m_rtc_read_time(struct device *dev, struct rtc_time *tm)
>                 break;
>
>         case S5M8767X:
> +       case S2MPA01:
>         case S2MPS15X:
>         case S2MPS14X:
>         case S2MPS13X:
> @@ -422,6 +425,7 @@ static int s5m_rtc_set_time(struct device *dev, struct rtc_time *tm)
>                 s5m8763_tm_to_data(tm, data);
>                 break;
>         case S5M8767X:
> +       case S2MPA01:
>         case S2MPS15X:
>         case S2MPS14X:
>         case S2MPS13X:
> @@ -469,6 +473,7 @@ static int s5m_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm)
>                 break;
>
>         case S5M8767X:
> +       case S2MPA01:
>         case S2MPS15X:
>         case S2MPS14X:
>         case S2MPS13X:
> @@ -513,6 +518,7 @@ static int s5m_rtc_stop_alarm(struct s5m_rtc_info *info)
>                 break;
>
>         case S5M8767X:
> +       case S2MPA01:
>         case S2MPS15X:
>         case S2MPS14X:
>         case S2MPS13X:
> @@ -557,6 +563,7 @@ static int s5m_rtc_start_alarm(struct s5m_rtc_info *info)
>                 break;
>
>         case S5M8767X:
> +       case S2MPA01:
>         case S2MPS15X:
>         case S2MPS14X:
>         case S2MPS13X:
> @@ -598,6 +605,7 @@ static int s5m_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)
>                 break;
>
>         case S5M8767X:
> +       case S2MPA01:
>         case S2MPS15X:
>         case S2MPS14X:
>         case S2MPS13X:
> @@ -679,6 +687,7 @@ static int s5m8767_rtc_init_reg(struct s5m_rtc_info *info)
>                 ret = regmap_raw_write(info->regmap, S5M_ALARM0_CONF, data, 2);
>                 break;
>
> +       case S2MPA01:
>         case S2MPS15X:
>         case S2MPS14X:
>         case S2MPS13X:
> @@ -728,6 +737,11 @@ static int s5m_rtc_probe(struct platform_device *pdev)
>                 return -ENOMEM;
>
>         switch (platform_get_device_id(pdev)->driver_data) {
> +       case S2MPA01:
> +               regmap_cfg = &s2mps14_rtc_regmap_config;
> +               info->regs = &s2mps14_rtc_regs;
> +               alarm_irq = S2MPA01_IRQ_RTCA0;
> +               break;
>         case S2MPS15X:
>                 regmap_cfg = &s2mps14_rtc_regmap_config;
>                 info->regs = &s2mps15_rtc_regs;
> @@ -861,6 +875,7 @@ static SIMPLE_DEV_PM_OPS(s5m_rtc_pm_ops, s5m_rtc_suspend, s5m_rtc_resume);
>
>  static const struct platform_device_id s5m_rtc_id[] = {
>         { "s5m-rtc",            S5M8767X },
> +       { "s2mpa01-rtc",        S2MPA01  },

I think there is no need to add S2MPA01 to RTC driver at all because
it shares everything with S2MPS14. It is then the same case as with
S2MPS11 - use just S2MPS14.

Best regards,
Krzysztof

>         { "s2mps13-rtc",        S2MPS13X },
>         { "s2mps14-rtc",        S2MPS14X },
>         { "s2mps15-rtc",        S2MPS15X },
> --
> 2.13.6
>
diff mbox series

Patch

diff --git a/drivers/mfd/sec-core.c b/drivers/mfd/sec-core.c
index e0835c9df7a1..911381414334 100644
--- a/drivers/mfd/sec-core.c
+++ b/drivers/mfd/sec-core.c
@@ -103,6 +103,8 @@  static const struct mfd_cell s2mps15_devs[] = {
 static const struct mfd_cell s2mpa01_devs[] = {
 	{
 		.name = "s2mpa01-pmic",
+	}, {
+		.name = "s2mpa01-rtc",
 	},
 };
 
diff --git a/drivers/mfd/sec-irq.c b/drivers/mfd/sec-irq.c
index ad0099077e7e..7cc863b07384 100644
--- a/drivers/mfd/sec-irq.c
+++ b/drivers/mfd/sec-irq.c
@@ -11,12 +11,96 @@ 
 
 #include <linux/mfd/samsung/core.h>
 #include <linux/mfd/samsung/irq.h>
+#include <linux/mfd/samsung/s2mpa01.h>
 #include <linux/mfd/samsung/s2mps11.h>
 #include <linux/mfd/samsung/s2mps14.h>
 #include <linux/mfd/samsung/s2mpu02.h>
 #include <linux/mfd/samsung/s5m8763.h>
 #include <linux/mfd/samsung/s5m8767.h>
 
+static struct regmap_irq s2mpa01_irqs[] = {
+	[S2MPA01_IRQ_PWRONF] = {
+		.reg_offset = 0,
+		.mask = S2MPA01_IRQ_PWRONF_MASK,
+	},
+	[S2MPA01_IRQ_PWRONR] = {
+		.reg_offset = 0,
+		.mask = S2MPA01_IRQ_PWRONR_MASK,
+	},
+	[S2MPA01_IRQ_JIGONBF] = {
+		.reg_offset = 0,
+		.mask = S2MPA01_IRQ_JIGONBF_MASK,
+	},
+	[S2MPA01_IRQ_JIGONBR] = {
+		.reg_offset = 0,
+		.mask = S2MPA01_IRQ_JIGONBR_MASK,
+	},
+	[S2MPA01_IRQ_ACOKBF] = {
+		.reg_offset = 0,
+		.mask = S2MPA01_IRQ_ACOKBF_MASK,
+	},
+	[S2MPA01_IRQ_ACOKBR] = {
+		.reg_offset = 0,
+		.mask = S2MPA01_IRQ_ACOKBR_MASK,
+	},
+	[S2MPA01_IRQ_PWRON1S] = {
+		.reg_offset = 0,
+		.mask = S2MPA01_IRQ_PWRON1S_MASK,
+	},
+	[S2MPA01_IRQ_MRB] = {
+		.reg_offset = 0,
+		.mask = S2MPA01_IRQ_MRB_MASK,
+	},
+	[S2MPA01_IRQ_RTC60S] = {
+		.reg_offset = 1,
+		.mask = S2MPA01_IRQ_RTC60S_MASK,
+	},
+	[S2MPA01_IRQ_RTCA1] = {
+		.reg_offset = 1,
+		.mask = S2MPA01_IRQ_RTCA1_MASK,
+	},
+	[S2MPA01_IRQ_RTCA0] = {
+		.reg_offset = 1,
+		.mask = S2MPA01_IRQ_RTCA0_MASK,
+	},
+	[S2MPA01_IRQ_SMPL] = {
+		.reg_offset = 1,
+		.mask = S2MPA01_IRQ_SMPL_MASK,
+	},
+	[S2MPA01_IRQ_RTC1S] = {
+		.reg_offset = 1,
+		.mask = S2MPA01_IRQ_RTC1S_MASK,
+	},
+	[S2MPA01_IRQ_WTSR] = {
+		.reg_offset = 1,
+		.mask = S2MPA01_IRQ_WTSR_MASK,
+	},
+	[S2MPA01_IRQ_INT120C] = {
+		.reg_offset = 2,
+		.mask = S2MPA01_IRQ_INT120C_MASK,
+	},
+	[S2MPA01_IRQ_INT140C] = {
+		.reg_offset = 2,
+		.mask = S2MPA01_IRQ_INT140C_MASK,
+	},
+	[S2MPA01_IRQ_LDO3_TSD] = {
+		.reg_offset = 2,
+		.mask = S2MPA01_IRQ_LDO3_TSD_MASK,
+	},
+	[S2MPA01_IRQ_B16_TSD] = {
+		.reg_offset = 2,
+		.mask = S2MPA01_IRQ_B16_TSD_MASK,
+	},
+	[S2MPA01_IRQ_B24_TSD] = {
+		.reg_offset = 2,
+		.mask = S2MPA01_IRQ_B24_TSD_MASK,
+	},
+	[S2MPA01_IRQ_B35_TSD] = {
+		.reg_offset = 2,
+		.mask = S2MPA01_IRQ_B35_TSD_MASK,
+	},
+};
+
 static const struct regmap_irq s2mps11_irqs[] = {
 	[S2MPS11_IRQ_PWRONF] = {
 		.reg_offset = 0,
@@ -372,6 +456,16 @@  static const struct regmap_irq s5m8763_irqs[] = {
 	},
 };
 
+static struct regmap_irq_chip s2mpa01_irq_chip = {
+	.name = "s2mpa01",
+	.irqs = s2mpa01_irqs,
+	.num_irqs = ARRAY_SIZE(s2mpa01_irqs),
+	.num_regs = 3,
+	.status_base = S2MPA01_REG_INT1,
+	.mask_base = S2MPA01_REG_INT1M,
+	.ack_base = S2MPA01_REG_INT1,
+};
+
 static const struct regmap_irq_chip s2mps11_irq_chip = {
 	.name = "s2mps11",
 	.irqs = s2mps11_irqs,
@@ -455,6 +549,9 @@  int sec_irq_init(struct sec_pmic_dev *sec_pmic)
 	case S5M8767X:
 		sec_irq_chip = &s5m8767_irq_chip;
 		break;
+	case S2MPA01:
+		sec_irq_chip = &s2mpa01_irq_chip;
+		break;
 	case S2MPS11X:
 		sec_irq_chip = &s2mps11_irq_chip;
 		break;
diff --git a/drivers/rtc/rtc-s5m.c b/drivers/rtc/rtc-s5m.c
index c7f1bf823ea0..0f7623a57e74 100644
--- a/drivers/rtc/rtc-s5m.c
+++ b/drivers/rtc/rtc-s5m.c
@@ -246,6 +246,7 @@  static int s5m_check_peding_alarm_interrupt(struct s5m_rtc_info *info,
 		ret = regmap_read(info->regmap, S5M_RTC_STATUS, &val);
 		val &= S5M_ALARM0_STATUS;
 		break;
+	case S2MPA01:
 	case S2MPS15X:
 	case S2MPS14X:
 	case S2MPS13X:
@@ -309,6 +310,7 @@  static int s5m8767_rtc_set_alarm_reg(struct s5m_rtc_info *info)
 	case S5M8767X:
 		data &= ~S5M_RTC_TIME_EN_MASK;
 		break;
+	case S2MPA01:
 	case S2MPS15X:
 	case S2MPS14X:
 	case S2MPS13X:
@@ -396,6 +398,7 @@  static int s5m_rtc_read_time(struct device *dev, struct rtc_time *tm)
 		break;
 
 	case S5M8767X:
+	case S2MPA01:
 	case S2MPS15X:
 	case S2MPS14X:
 	case S2MPS13X:
@@ -422,6 +425,7 @@  static int s5m_rtc_set_time(struct device *dev, struct rtc_time *tm)
 		s5m8763_tm_to_data(tm, data);
 		break;
 	case S5M8767X:
+	case S2MPA01:
 	case S2MPS15X:
 	case S2MPS14X:
 	case S2MPS13X:
@@ -469,6 +473,7 @@  static int s5m_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm)
 		break;
 
 	case S5M8767X:
+	case S2MPA01:
 	case S2MPS15X:
 	case S2MPS14X:
 	case S2MPS13X:
@@ -513,6 +518,7 @@  static int s5m_rtc_stop_alarm(struct s5m_rtc_info *info)
 		break;
 
 	case S5M8767X:
+	case S2MPA01:
 	case S2MPS15X:
 	case S2MPS14X:
 	case S2MPS13X:
@@ -557,6 +563,7 @@  static int s5m_rtc_start_alarm(struct s5m_rtc_info *info)
 		break;
 
 	case S5M8767X:
+	case S2MPA01:
 	case S2MPS15X:
 	case S2MPS14X:
 	case S2MPS13X:
@@ -598,6 +605,7 @@  static int s5m_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)
 		break;
 
 	case S5M8767X:
+	case S2MPA01:
 	case S2MPS15X:
 	case S2MPS14X:
 	case S2MPS13X:
@@ -679,6 +687,7 @@  static int s5m8767_rtc_init_reg(struct s5m_rtc_info *info)
 		ret = regmap_raw_write(info->regmap, S5M_ALARM0_CONF, data, 2);
 		break;
 
+	case S2MPA01:
 	case S2MPS15X:
 	case S2MPS14X:
 	case S2MPS13X:
@@ -728,6 +737,11 @@  static int s5m_rtc_probe(struct platform_device *pdev)
 		return -ENOMEM;
 
 	switch (platform_get_device_id(pdev)->driver_data) {
+	case S2MPA01:
+		regmap_cfg = &s2mps14_rtc_regmap_config;
+		info->regs = &s2mps14_rtc_regs;
+		alarm_irq = S2MPA01_IRQ_RTCA0;
+		break;
 	case S2MPS15X:
 		regmap_cfg = &s2mps14_rtc_regmap_config;
 		info->regs = &s2mps15_rtc_regs;
@@ -861,6 +875,7 @@  static SIMPLE_DEV_PM_OPS(s5m_rtc_pm_ops, s5m_rtc_suspend, s5m_rtc_resume);
 
 static const struct platform_device_id s5m_rtc_id[] = {
 	{ "s5m-rtc",		S5M8767X },
+	{ "s2mpa01-rtc",	S2MPA01  },
 	{ "s2mps13-rtc",	S2MPS13X },
 	{ "s2mps14-rtc",	S2MPS14X },
 	{ "s2mps15-rtc",	S2MPS15X },