aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/rtc/rtc-pcf50633.c
diff options
context:
space:
mode:
authorGlenn Elliott <gelliott@cs.unc.edu>2012-03-04 19:47:13 -0500
committerGlenn Elliott <gelliott@cs.unc.edu>2012-03-04 19:47:13 -0500
commitc71c03bda1e86c9d5198c5d83f712e695c4f2a1e (patch)
treeecb166cb3e2b7e2adb3b5e292245fefd23381ac8 /drivers/rtc/rtc-pcf50633.c
parentea53c912f8a86a8567697115b6a0d8152beee5c8 (diff)
parent6a00f206debf8a5c8899055726ad127dbeeed098 (diff)
Merge branch 'mpi-master' into wip-k-fmlpwip-k-fmlp
Conflicts: litmus/sched_cedf.c
Diffstat (limited to 'drivers/rtc/rtc-pcf50633.c')
-rw-r--r--drivers/rtc/rtc-pcf50633.c45
1 files changed, 4 insertions, 41 deletions
diff --git a/drivers/rtc/rtc-pcf50633.c b/drivers/rtc/rtc-pcf50633.c
index 16edf94ab42f..0c423892923c 100644
--- a/drivers/rtc/rtc-pcf50633.c
+++ b/drivers/rtc/rtc-pcf50633.c
@@ -58,7 +58,6 @@ struct pcf50633_time {
58 58
59struct pcf50633_rtc { 59struct pcf50633_rtc {
60 int alarm_enabled; 60 int alarm_enabled;
61 int second_enabled;
62 int alarm_pending; 61 int alarm_pending;
63 62
64 struct pcf50633 *pcf; 63 struct pcf50633 *pcf;
@@ -106,25 +105,6 @@ pcf50633_rtc_alarm_irq_enable(struct device *dev, unsigned int enabled)
106 return 0; 105 return 0;
107} 106}
108 107
109static int
110pcf50633_rtc_update_irq_enable(struct device *dev, unsigned int enabled)
111{
112 struct pcf50633_rtc *rtc = dev_get_drvdata(dev);
113 int err;
114
115 if (enabled)
116 err = pcf50633_irq_unmask(rtc->pcf, PCF50633_IRQ_SECOND);
117 else
118 err = pcf50633_irq_mask(rtc->pcf, PCF50633_IRQ_SECOND);
119
120 if (err < 0)
121 return err;
122
123 rtc->second_enabled = enabled;
124
125 return 0;
126}
127
128static int pcf50633_rtc_read_time(struct device *dev, struct rtc_time *tm) 108static int pcf50633_rtc_read_time(struct device *dev, struct rtc_time *tm)
129{ 109{
130 struct pcf50633_rtc *rtc; 110 struct pcf50633_rtc *rtc;
@@ -162,7 +142,7 @@ static int pcf50633_rtc_set_time(struct device *dev, struct rtc_time *tm)
162{ 142{
163 struct pcf50633_rtc *rtc; 143 struct pcf50633_rtc *rtc;
164 struct pcf50633_time pcf_tm; 144 struct pcf50633_time pcf_tm;
165 int second_masked, alarm_masked, ret = 0; 145 int alarm_masked, ret = 0;
166 146
167 rtc = dev_get_drvdata(dev); 147 rtc = dev_get_drvdata(dev);
168 148
@@ -181,11 +161,8 @@ static int pcf50633_rtc_set_time(struct device *dev, struct rtc_time *tm)
181 pcf_tm.time[PCF50633_TI_SEC]); 161 pcf_tm.time[PCF50633_TI_SEC]);
182 162
183 163
184 second_masked = pcf50633_irq_mask_get(rtc->pcf, PCF50633_IRQ_SECOND);
185 alarm_masked = pcf50633_irq_mask_get(rtc->pcf, PCF50633_IRQ_ALARM); 164 alarm_masked = pcf50633_irq_mask_get(rtc->pcf, PCF50633_IRQ_ALARM);
186 165
187 if (!second_masked)
188 pcf50633_irq_mask(rtc->pcf, PCF50633_IRQ_SECOND);
189 if (!alarm_masked) 166 if (!alarm_masked)
190 pcf50633_irq_mask(rtc->pcf, PCF50633_IRQ_ALARM); 167 pcf50633_irq_mask(rtc->pcf, PCF50633_IRQ_ALARM);
191 168
@@ -194,8 +171,6 @@ static int pcf50633_rtc_set_time(struct device *dev, struct rtc_time *tm)
194 PCF50633_TI_EXTENT, 171 PCF50633_TI_EXTENT,
195 &pcf_tm.time[0]); 172 &pcf_tm.time[0]);
196 173
197 if (!second_masked)
198 pcf50633_irq_unmask(rtc->pcf, PCF50633_IRQ_SECOND);
199 if (!alarm_masked) 174 if (!alarm_masked)
200 pcf50633_irq_unmask(rtc->pcf, PCF50633_IRQ_ALARM); 175 pcf50633_irq_unmask(rtc->pcf, PCF50633_IRQ_ALARM);
201 176
@@ -262,23 +237,15 @@ static struct rtc_class_ops pcf50633_rtc_ops = {
262 .set_time = pcf50633_rtc_set_time, 237 .set_time = pcf50633_rtc_set_time,
263 .read_alarm = pcf50633_rtc_read_alarm, 238 .read_alarm = pcf50633_rtc_read_alarm,
264 .set_alarm = pcf50633_rtc_set_alarm, 239 .set_alarm = pcf50633_rtc_set_alarm,
265 .alarm_irq_enable = pcf50633_rtc_alarm_irq_enable, 240 .alarm_irq_enable = pcf50633_rtc_alarm_irq_enable,
266 .update_irq_enable = pcf50633_rtc_update_irq_enable,
267}; 241};
268 242
269static void pcf50633_rtc_irq(int irq, void *data) 243static void pcf50633_rtc_irq(int irq, void *data)
270{ 244{
271 struct pcf50633_rtc *rtc = data; 245 struct pcf50633_rtc *rtc = data;
272 246
273 switch (irq) { 247 rtc_update_irq(rtc->rtc_dev, 1, RTC_AF | RTC_IRQF);
274 case PCF50633_IRQ_ALARM: 248 rtc->alarm_pending = 1;
275 rtc_update_irq(rtc->rtc_dev, 1, RTC_AF | RTC_IRQF);
276 rtc->alarm_pending = 1;
277 break;
278 case PCF50633_IRQ_SECOND:
279 rtc_update_irq(rtc->rtc_dev, 1, RTC_UF | RTC_IRQF);
280 break;
281 }
282} 249}
283 250
284static int __devinit pcf50633_rtc_probe(struct platform_device *pdev) 251static int __devinit pcf50633_rtc_probe(struct platform_device *pdev)
@@ -302,9 +269,6 @@ static int __devinit pcf50633_rtc_probe(struct platform_device *pdev)
302 269
303 pcf50633_register_irq(rtc->pcf, PCF50633_IRQ_ALARM, 270 pcf50633_register_irq(rtc->pcf, PCF50633_IRQ_ALARM,
304 pcf50633_rtc_irq, rtc); 271 pcf50633_rtc_irq, rtc);
305 pcf50633_register_irq(rtc->pcf, PCF50633_IRQ_SECOND,
306 pcf50633_rtc_irq, rtc);
307
308 return 0; 272 return 0;
309} 273}
310 274
@@ -315,7 +279,6 @@ static int __devexit pcf50633_rtc_remove(struct platform_device *pdev)
315 rtc = platform_get_drvdata(pdev); 279 rtc = platform_get_drvdata(pdev);
316 280
317 pcf50633_free_irq(rtc->pcf, PCF50633_IRQ_ALARM); 281 pcf50633_free_irq(rtc->pcf, PCF50633_IRQ_ALARM);
318 pcf50633_free_irq(rtc->pcf, PCF50633_IRQ_SECOND);
319 282
320 rtc_device_unregister(rtc->rtc_dev); 283 rtc_device_unregister(rtc->rtc_dev);
321 kfree(rtc); 284 kfree(rtc);