aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/i2c/busses
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/i2c/busses')
-rw-r--r--drivers/i2c/busses/i2c-sh7760.c4
-rw-r--r--drivers/i2c/busses/i2c-sh_mobile.c23
2 files changed, 15 insertions, 12 deletions
diff --git a/drivers/i2c/busses/i2c-sh7760.c b/drivers/i2c/busses/i2c-sh7760.c
index 4f93da31d3a..3cad8fecc3d 100644
--- a/drivers/i2c/busses/i2c-sh7760.c
+++ b/drivers/i2c/busses/i2c-sh7760.c
@@ -101,12 +101,12 @@ struct cami2c {
101 101
102static inline void OUT32(struct cami2c *cam, int reg, unsigned long val) 102static inline void OUT32(struct cami2c *cam, int reg, unsigned long val)
103{ 103{
104 ctrl_outl(val, (unsigned long)cam->iobase + reg); 104 __raw_writel(val, (unsigned long)cam->iobase + reg);
105} 105}
106 106
107static inline unsigned long IN32(struct cami2c *cam, int reg) 107static inline unsigned long IN32(struct cami2c *cam, int reg)
108{ 108{
109 return ctrl_inl((unsigned long)cam->iobase + reg); 109 return __raw_readl((unsigned long)cam->iobase + reg);
110} 110}
111 111
112static irqreturn_t sh7760_i2c_irq(int irq, void *ptr) 112static irqreturn_t sh7760_i2c_irq(int irq, void *ptr)
diff --git a/drivers/i2c/busses/i2c-sh_mobile.c b/drivers/i2c/busses/i2c-sh_mobile.c
index 598c49acaeb..2707f5e1715 100644
--- a/drivers/i2c/busses/i2c-sh_mobile.c
+++ b/drivers/i2c/busses/i2c-sh_mobile.c
@@ -538,15 +538,17 @@ static int sh_mobile_i2c_hook_irqs(struct platform_device *dev, int hook)
538{ 538{
539 struct resource *res; 539 struct resource *res;
540 int ret = -ENXIO; 540 int ret = -ENXIO;
541 int q, m; 541 int n, k = 0;
542 int k = 0;
543 int n = 0;
544 542
545 while ((res = platform_get_resource(dev, IORESOURCE_IRQ, k))) { 543 while ((res = platform_get_resource(dev, IORESOURCE_IRQ, k))) {
546 for (n = res->start; hook && n <= res->end; n++) { 544 for (n = res->start; hook && n <= res->end; n++) {
547 if (request_irq(n, sh_mobile_i2c_isr, IRQF_DISABLED, 545 if (request_irq(n, sh_mobile_i2c_isr, IRQF_DISABLED,
548 dev_name(&dev->dev), dev)) 546 dev_name(&dev->dev), dev)) {
547 for (n--; n >= res->start; n--)
548 free_irq(n, dev);
549
549 goto rollback; 550 goto rollback;
551 }
550 } 552 }
551 k++; 553 k++;
552 } 554 }
@@ -554,16 +556,17 @@ static int sh_mobile_i2c_hook_irqs(struct platform_device *dev, int hook)
554 if (hook) 556 if (hook)
555 return k > 0 ? 0 : -ENOENT; 557 return k > 0 ? 0 : -ENOENT;
556 558
557 k--;
558 ret = 0; 559 ret = 0;
559 560
560 rollback: 561 rollback:
561 for (q = k; k >= 0; k--) { 562 k--;
562 for (m = n; m >= res->start; m--) 563
563 free_irq(m, dev); 564 while (k >= 0) {
565 res = platform_get_resource(dev, IORESOURCE_IRQ, k);
566 for (n = res->start; n <= res->end; n++)
567 free_irq(n, dev);
564 568
565 res = platform_get_resource(dev, IORESOURCE_IRQ, k - 1); 569 k--;
566 m = res->end;
567 } 570 }
568 571
569 return ret; 572 return ret;