aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/rtc
diff options
context:
space:
mode:
authorLaxman Dewangan <ldewangan@nvidia.com>2016-02-09 12:26:34 -0500
committerAlexandre Belloni <alexandre.belloni@free-electrons.com>2016-03-14 12:08:13 -0400
commitf3937549a975fadec9b517b059616f08f9cb7653 (patch)
treeaa40f0026677573009c698a9dca92472174ced3c /drivers/rtc
parent08e37ef17db5b0d387564cf06520f6ff5f54c76b (diff)
rtc: max77686: move initialisation of rtc regmap, irq chip locally
To make RTC block of MAX77686/MAX77802 as independent driver, move the registration of i2c device, regmap for register access and irq_chip for interrupt support inside the RTC driver. Removed the same initialisation from MFD driver. Having this change will allow to reuse this driver for different PMIC/devices from Maxim Semiconductor if they kept same RTC IP on different PMIC. Some of examples as PMIC MAX77620, MAX20024 where same RTC IP used and hence driver for these chips will use this driver only for RTC support. Suggested-by: Krzysztof Kozlowski <k.kozlowski@samsung.com> Signed-off-by: Laxman Dewangan <ldewangan@nvidia.com> Tested-by: Javier Martinez Canillas <javier@osg.samsung.com> Reviewed-by: Javier Martinez Canillas <javier@osg.samsung.com> Acked-by: Lee Jones <lee.jones@linaro.org> Tested-by: Krzysztof Kozlowski <k.kozlowski@samsung.com> Reviewed-by: Krzysztof Kozlowski <k.kozlowski@samsung.com> Signed-off-by: Alexandre Belloni <alexandre.belloni@free-electrons.com>
Diffstat (limited to 'drivers/rtc')
-rw-r--r--drivers/rtc/rtc-max77686.c148
1 files changed, 127 insertions, 21 deletions
diff --git a/drivers/rtc/rtc-max77686.c b/drivers/rtc/rtc-max77686.c
index 8fe1092c4795..5e924f3cde90 100644
--- a/drivers/rtc/rtc-max77686.c
+++ b/drivers/rtc/rtc-max77686.c
@@ -12,6 +12,7 @@
12 * 12 *
13 */ 13 */
14 14
15#include <linux/i2c.h>
15#include <linux/slab.h> 16#include <linux/slab.h>
16#include <linux/rtc.h> 17#include <linux/rtc.h>
17#include <linux/delay.h> 18#include <linux/delay.h>
@@ -22,6 +23,9 @@
22#include <linux/irqdomain.h> 23#include <linux/irqdomain.h>
23#include <linux/regmap.h> 24#include <linux/regmap.h>
24 25
26#define MAX77686_I2C_ADDR_RTC (0x0C >> 1)
27#define MAX77686_INVALID_I2C_ADDR (-1)
28
25/* RTC Control Register */ 29/* RTC Control Register */
26#define BCD_EN_SHIFT 0 30#define BCD_EN_SHIFT 0
27#define BCD_EN_MASK BIT(BCD_EN_SHIFT) 31#define BCD_EN_MASK BIT(BCD_EN_SHIFT)
@@ -68,8 +72,10 @@ struct max77686_rtc_driver_data {
68 const unsigned int *map; 72 const unsigned int *map;
69 /* Has a separate alarm enable register? */ 73 /* Has a separate alarm enable register? */
70 bool alarm_enable_reg; 74 bool alarm_enable_reg;
71 /* Has a separate I2C regmap for the RTC? */ 75 /* I2C address for RTC block */
72 bool separate_i2c_addr; 76 int rtc_i2c_addr;
77 /* RTC IRQ CHIP for regmap */
78 const struct regmap_irq_chip *rtc_irq_chip;
73}; 79};
74 80
75struct max77686_rtc_info { 81struct max77686_rtc_info {
@@ -82,7 +88,9 @@ struct max77686_rtc_info {
82 struct regmap *rtc_regmap; 88 struct regmap *rtc_regmap;
83 89
84 const struct max77686_rtc_driver_data *drv_data; 90 const struct max77686_rtc_driver_data *drv_data;
91 struct regmap_irq_chip_data *rtc_irq_data;
85 92
93 int rtc_irq;
86 int virq; 94 int virq;
87 int rtc_24hr_mode; 95 int rtc_24hr_mode;
88}; 96};
@@ -153,12 +161,32 @@ static const unsigned int max77686_map[REG_RTC_END] = {
153 [REG_RTC_AE1] = REG_RTC_NONE, 161 [REG_RTC_AE1] = REG_RTC_NONE,
154}; 162};
155 163
164static const struct regmap_irq max77686_rtc_irqs[] = {
165 /* RTC interrupts */
166 { .reg_offset = 0, .mask = MAX77686_RTCINT_RTC60S_MSK, },
167 { .reg_offset = 0, .mask = MAX77686_RTCINT_RTCA1_MSK, },
168 { .reg_offset = 0, .mask = MAX77686_RTCINT_RTCA2_MSK, },
169 { .reg_offset = 0, .mask = MAX77686_RTCINT_SMPL_MSK, },
170 { .reg_offset = 0, .mask = MAX77686_RTCINT_RTC1S_MSK, },
171 { .reg_offset = 0, .mask = MAX77686_RTCINT_WTSR_MSK, },
172};
173
174static const struct regmap_irq_chip max77686_rtc_irq_chip = {
175 .name = "max77686-rtc",
176 .status_base = MAX77686_RTC_INT,
177 .mask_base = MAX77686_RTC_INTM,
178 .num_regs = 1,
179 .irqs = max77686_rtc_irqs,
180 .num_irqs = ARRAY_SIZE(max77686_rtc_irqs),
181};
182
156static const struct max77686_rtc_driver_data max77686_drv_data = { 183static const struct max77686_rtc_driver_data max77686_drv_data = {
157 .delay = 16000, 184 .delay = 16000,
158 .mask = 0x7f, 185 .mask = 0x7f,
159 .map = max77686_map, 186 .map = max77686_map,
160 .alarm_enable_reg = false, 187 .alarm_enable_reg = false,
161 .separate_i2c_addr = true, 188 .rtc_i2c_addr = MAX77686_I2C_ADDR_RTC,
189 .rtc_irq_chip = &max77686_rtc_irq_chip,
162}; 190};
163 191
164static const unsigned int max77802_map[REG_RTC_END] = { 192static const unsigned int max77802_map[REG_RTC_END] = {
@@ -190,12 +218,22 @@ static const unsigned int max77802_map[REG_RTC_END] = {
190 [REG_RTC_AE1] = MAX77802_RTC_AE1, 218 [REG_RTC_AE1] = MAX77802_RTC_AE1,
191}; 219};
192 220
221static const struct regmap_irq_chip max77802_rtc_irq_chip = {
222 .name = "max77802-rtc",
223 .status_base = MAX77802_RTC_INT,
224 .mask_base = MAX77802_RTC_INTM,
225 .num_regs = 1,
226 .irqs = max77686_rtc_irqs, /* same masks as 77686 */
227 .num_irqs = ARRAY_SIZE(max77686_rtc_irqs),
228};
229
193static const struct max77686_rtc_driver_data max77802_drv_data = { 230static const struct max77686_rtc_driver_data max77802_drv_data = {
194 .delay = 200, 231 .delay = 200,
195 .mask = 0xff, 232 .mask = 0xff,
196 .map = max77802_map, 233 .map = max77802_map,
197 .alarm_enable_reg = true, 234 .alarm_enable_reg = true,
198 .separate_i2c_addr = false, 235 .rtc_i2c_addr = MAX77686_INVALID_I2C_ADDR,
236 .rtc_irq_chip = &max77802_rtc_irq_chip,
199}; 237};
200 238
201static void max77686_rtc_data_to_tm(u8 *data, struct rtc_time *tm, 239static void max77686_rtc_data_to_tm(u8 *data, struct rtc_time *tm,
@@ -599,9 +637,65 @@ static int max77686_rtc_init_reg(struct max77686_rtc_info *info)
599 return ret; 637 return ret;
600} 638}
601 639
640static const struct regmap_config max77686_rtc_regmap_config = {
641 .reg_bits = 8,
642 .val_bits = 8,
643};
644
645static int max77686_init_rtc_regmap(struct max77686_rtc_info *info)
646{
647 struct device *parent = info->dev->parent;
648 struct i2c_client *parent_i2c = to_i2c_client(parent);
649 int ret;
650
651 info->rtc_irq = parent_i2c->irq;
652
653 info->regmap = dev_get_regmap(parent, NULL);
654 if (!info->regmap) {
655 dev_err(info->dev, "Failed to get rtc regmap\n");
656 return -ENODEV;
657 }
658
659 if (info->drv_data->rtc_i2c_addr == MAX77686_INVALID_I2C_ADDR) {
660 info->rtc_regmap = info->regmap;
661 goto add_rtc_irq;
662 }
663
664 info->rtc = i2c_new_dummy(parent_i2c->adapter,
665 info->drv_data->rtc_i2c_addr);
666 if (!info->rtc) {
667 dev_err(info->dev, "Failed to allocate I2C device for RTC\n");
668 return -ENODEV;
669 }
670
671 info->rtc_regmap = devm_regmap_init_i2c(info->rtc,
672 &max77686_rtc_regmap_config);
673 if (IS_ERR(info->rtc_regmap)) {
674 ret = PTR_ERR(info->rtc_regmap);
675 dev_err(info->dev, "Failed to allocate RTC regmap: %d\n", ret);
676 goto err_unregister_i2c;
677 }
678
679add_rtc_irq:
680 ret = regmap_add_irq_chip(info->rtc_regmap, info->rtc_irq,
681 IRQF_TRIGGER_FALLING | IRQF_ONESHOT |
682 IRQF_SHARED, 0, info->drv_data->rtc_irq_chip,
683 &info->rtc_irq_data);
684 if (ret < 0) {
685 dev_err(info->dev, "Failed to add RTC irq chip: %d\n", ret);
686 goto err_unregister_i2c;
687 }
688
689 return 0;
690
691err_unregister_i2c:
692 if (info->rtc)
693 i2c_unregister_device(info->rtc);
694 return ret;
695}
696
602static int max77686_rtc_probe(struct platform_device *pdev) 697static int max77686_rtc_probe(struct platform_device *pdev)
603{ 698{
604 struct max77686_dev *max77686 = dev_get_drvdata(pdev->dev.parent);
605 struct max77686_rtc_info *info; 699 struct max77686_rtc_info *info;
606 const struct platform_device_id *id = platform_get_device_id(pdev); 700 const struct platform_device_id *id = platform_get_device_id(pdev);
607 int ret; 701 int ret;
@@ -613,18 +707,16 @@ static int max77686_rtc_probe(struct platform_device *pdev)
613 707
614 mutex_init(&info->lock); 708 mutex_init(&info->lock);
615 info->dev = &pdev->dev; 709 info->dev = &pdev->dev;
616 info->rtc = max77686->rtc;
617 info->drv_data = (const struct max77686_rtc_driver_data *) 710 info->drv_data = (const struct max77686_rtc_driver_data *)
618 id->driver_data; 711 id->driver_data;
619 712
620 info->regmap = max77686->regmap; 713 ret = max77686_init_rtc_regmap(info);
621 info->rtc_regmap = (info->drv_data->separate_i2c_addr) ? 714 if (ret < 0)
622 max77686->rtc_regmap : info->regmap; 715 return ret;
623 716
624 platform_set_drvdata(pdev, info); 717 platform_set_drvdata(pdev, info);
625 718
626 ret = max77686_rtc_init_reg(info); 719 ret = max77686_rtc_init_reg(info);
627
628 if (ret < 0) { 720 if (ret < 0) {
629 dev_err(&pdev->dev, "Failed to initialize RTC reg:%d\n", ret); 721 dev_err(&pdev->dev, "Failed to initialize RTC reg:%d\n", ret);
630 goto err_rtc; 722 goto err_rtc;
@@ -643,30 +735,43 @@ static int max77686_rtc_probe(struct platform_device *pdev)
643 goto err_rtc; 735 goto err_rtc;
644 } 736 }
645 737
646 if (!max77686->rtc_irq_data) { 738 info->virq = regmap_irq_get_virq(info->rtc_irq_data,
647 ret = -EINVAL;
648 dev_err(&pdev->dev, "No RTC regmap IRQ chip\n");
649 goto err_rtc;
650 }
651
652 info->virq = regmap_irq_get_virq(max77686->rtc_irq_data,
653 MAX77686_RTCIRQ_RTCA1); 739 MAX77686_RTCIRQ_RTCA1);
654 if (info->virq <= 0) { 740 if (info->virq <= 0) {
655 ret = -ENXIO; 741 ret = -ENXIO;
656 goto err_rtc; 742 goto err_rtc;
657 } 743 }
658 744
659 ret = devm_request_threaded_irq(&pdev->dev, info->virq, NULL, 745 ret = request_threaded_irq(info->virq, NULL, max77686_rtc_alarm_irq, 0,
660 max77686_rtc_alarm_irq, 0, 746 "rtc-alarm1", info);
661 "rtc-alarm1", info); 747 if (ret < 0) {
662 if (ret < 0)
663 dev_err(&pdev->dev, "Failed to request alarm IRQ: %d: %d\n", 748 dev_err(&pdev->dev, "Failed to request alarm IRQ: %d: %d\n",
664 info->virq, ret); 749 info->virq, ret);
750 goto err_rtc;
751 }
752
753 return 0;
665 754
666err_rtc: 755err_rtc:
756 regmap_del_irq_chip(info->rtc_irq, info->rtc_irq_data);
757 if (info->rtc)
758 i2c_unregister_device(info->rtc);
759
667 return ret; 760 return ret;
668} 761}
669 762
763static int max77686_rtc_remove(struct platform_device *pdev)
764{
765 struct max77686_rtc_info *info = platform_get_drvdata(pdev);
766
767 free_irq(info->virq, info);
768 regmap_del_irq_chip(info->rtc_irq, info->rtc_irq_data);
769 if (info->rtc)
770 i2c_unregister_device(info->rtc);
771
772 return 0;
773}
774
670#ifdef CONFIG_PM_SLEEP 775#ifdef CONFIG_PM_SLEEP
671static int max77686_rtc_suspend(struct device *dev) 776static int max77686_rtc_suspend(struct device *dev)
672{ 777{
@@ -707,6 +812,7 @@ static struct platform_driver max77686_rtc_driver = {
707 .pm = &max77686_rtc_pm_ops, 812 .pm = &max77686_rtc_pm_ops,
708 }, 813 },
709 .probe = max77686_rtc_probe, 814 .probe = max77686_rtc_probe,
815 .remove = max77686_rtc_remove,
710 .id_table = rtc_id, 816 .id_table = rtc_id,
711}; 817};
712 818