From: David Brownell Date: Tue, 30 Sep 2008 18:42:58 +0000 (+0300) Subject: minor irq-related cleanups X-Git-Tag: v2.6.27-omap1~112 X-Git-Url: http://pilppa.com/gitweb/?a=commitdiff_plain;h=8c7c2b6a04701affbca10b0cd3c0c31fd175d468;p=linux-2.6-omap-h63xx.git minor irq-related cleanups Minor IRQ-related cleanups: comment out the no-longer-used GPIO irq symbol (more to come, eventually); create RTC IRQ resource; and use that RTC IRQ resource. And incidentally, make the RTC code free the correct IRQ; it was pretty goofed up... Signed-off-by: David Brownell Signed-off-by: Felipe Balbi Signed-off-by: Tony Lindgren --- diff --git a/drivers/gpio/twl4030-gpio.c b/drivers/gpio/twl4030-gpio.c index 2949da1f20c..b65d4761250 100644 --- a/drivers/gpio/twl4030-gpio.c +++ b/drivers/gpio/twl4030-gpio.c @@ -49,7 +49,6 @@ /* REVISIT when these symbols vanish elsewhere, remove them here too */ /* #undef TWL4030_GPIO_IRQ_BASE */ /* #undef TWL4030_GPIO_IRQ_END */ -#undef TWL4030_MODIRQ_GPIO static struct gpio_chip twl_gpiochip; static int twl4030_gpio_irq_base; diff --git a/drivers/i2c/chips/twl4030-core.c b/drivers/i2c/chips/twl4030-core.c index 80cf2318e7d..e0a6ef4c39e 100644 --- a/drivers/i2c/chips/twl4030-core.c +++ b/drivers/i2c/chips/twl4030-core.c @@ -776,37 +776,44 @@ static int add_children(struct twl4030_platform_data *pdata) } if (twl_has_rtc()) { + twl = &twl4030_modules[TWL4030_SLAVENUM_NUM3]; + pdev = platform_device_alloc("twl4030_rtc", -1); - if (pdev) { - twl = &twl4030_modules[TWL4030_SLAVENUM_NUM3]; + if (!pdev) { + pr_debug("%s: can't alloc rtc dev\n", DRIVER_NAME); + status = -ENOMEM; + } else { pdev->dev.parent = &twl->client->dev; device_init_wakeup(&pdev->dev, 1); + } - /* - * FIXME add the relevant IRQ resource, and make the - * rtc driver use it instead of hard-wiring ... - * - * REVISIT platform_data here currently only supports - * setting up the "msecure" line ... which actually - * violates the "princple of least privilege", since - * it's effectively always in "high trust" mode. - * - * For now, expect equivalent treatment at board init: - * setting msecure high. Eventually, Linux might - * become more aware of those HW security concerns. - */ + /* + * REVISIT platform_data here currently might use of + * "msecure" line ... but for now we just expect board + * setup to tell the chip "we are secure" at all times. + * Eventually, Linux might become more aware of such + * HW security concerns, and "least privilege". + */ + + /* RTC module IRQ */ + if (status == 0) { + struct resource r = { + /* REVISIT don't hard-wire this stuff */ + .start = TWL4030_PWRIRQ_RTC, + .flags = IORESOURCE_IRQ, + }; + + status = platform_device_add_resources(pdev, &r, 1); + } + if (status == 0) status = platform_device_add(pdev); - if (status < 0) { - platform_device_put(pdev); - dev_dbg(&twl->client->dev, - "can't create rtc dev, %d\n", - status); - goto err; - } - } else { - pr_debug("%s: can't alloc rtc dev\n", DRIVER_NAME); - status = -ENOMEM; + + if (status < 0) { + platform_device_put(pdev); + dev_dbg(&twl->client->dev, + "can't create rtc dev, %d\n", + status); goto err; } } diff --git a/drivers/rtc/rtc-twl4030.c b/drivers/rtc/rtc-twl4030.c index 98aea0788b7..b19151a7a23 100644 --- a/drivers/rtc/rtc-twl4030.c +++ b/drivers/rtc/rtc-twl4030.c @@ -353,8 +353,12 @@ static int __devinit twl4030_rtc_probe(struct platform_device *pdev) struct twl4030rtc_platform_data *pdata = pdev->dev.platform_data; struct rtc_device *rtc; int ret = 0; + int irq = platform_get_irq(pdev, 0); u8 rd_reg; + if (irq < 0) + return irq; + if (pdata != NULL && pdata->init != NULL) { ret = pdata->init(); if (ret < 0) @@ -389,7 +393,7 @@ static int __devinit twl4030_rtc_probe(struct platform_device *pdev) if (ret < 0) goto out1; - ret = request_irq(TWL4030_PWRIRQ_RTC, twl4030_rtc_interrupt, + ret = request_irq(irq, twl4030_rtc_interrupt, 0, rtc->dev.bus_id, rtc); if (ret < 0) { dev_err(&pdev->dev, "IRQ is not free.\n"); @@ -438,7 +442,7 @@ static int __devinit twl4030_rtc_probe(struct platform_device *pdev) out2: - free_irq(TWL4030_MODIRQ_PWR, rtc); + free_irq(irq, rtc); out1: rtc_device_unregister(rtc); out0: @@ -457,11 +461,12 @@ static int __devexit twl4030_rtc_remove(struct platform_device *pdev) /* leave rtc running, but disable irqs */ struct twl4030rtc_platform_data *pdata = pdev->dev.platform_data; struct rtc_device *rtc = platform_get_drvdata(pdev); + int irq = platform_get_irq(pdev, 0); mask_rtc_irq_bit(BIT_RTC_INTERRUPTS_REG_IT_ALARM_M); mask_rtc_irq_bit(BIT_RTC_INTERRUPTS_REG_IT_TIMER_M); - free_irq(TWL4030_MODIRQ_PWR, rtc); + free_irq(irq, rtc); if (pdata != NULL && pdata->exit != NULL) pdata->exit(); diff --git a/include/linux/i2c/twl4030.h b/include/linux/i2c/twl4030.h index 404300cc4b4..58284858333 100644 --- a/include/linux/i2c/twl4030.h +++ b/include/linux/i2c/twl4030.h @@ -108,7 +108,7 @@ struct twl4030_platform_data { #include /* TWL4030 interrupts */ -#define TWL4030_MODIRQ_GPIO (TWL4030_IRQ_BASE + 0) +/* #define TWL4030_MODIRQ_GPIO (TWL4030_IRQ_BASE + 0) */ #define TWL4030_MODIRQ_KEYPAD (TWL4030_IRQ_BASE + 1) #define TWL4030_MODIRQ_BCI (TWL4030_IRQ_BASE + 2) #define TWL4030_MODIRQ_MADC (TWL4030_IRQ_BASE + 3)