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 <dbrownell@users.sourceforge.net>
Signed-off-by: Felipe Balbi <felipe.balbi@nokia.com>
Signed-off-by: Tony Lindgren <tony@atomide.com>
/* REVISIT when these symbols vanish elsewhere, remove them here too */
/* #undef TWL4030_GPIO_IRQ_BASE */
/* #undef TWL4030_GPIO_IRQ_END */
/* 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;
static struct gpio_chip twl_gpiochip;
static int twl4030_gpio_irq_base;
+ twl = &twl4030_modules[TWL4030_SLAVENUM_NUM3];
+
pdev = platform_device_alloc("twl4030_rtc", -1);
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);
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);
+ }
status = platform_device_add(pdev);
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);
struct twl4030rtc_platform_data *pdata = pdev->dev.platform_data;
struct rtc_device *rtc;
int ret = 0;
struct twl4030rtc_platform_data *pdata = pdev->dev.platform_data;
struct rtc_device *rtc;
int ret = 0;
+ int irq = platform_get_irq(pdev, 0);
+ if (irq < 0)
+ return irq;
+
if (pdata != NULL && pdata->init != NULL) {
ret = pdata->init();
if (ret < 0)
if (pdata != NULL && pdata->init != NULL) {
ret = pdata->init();
if (ret < 0)
- 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");
0, rtc->dev.bus_id, rtc);
if (ret < 0) {
dev_err(&pdev->dev, "IRQ is not free.\n");
- free_irq(TWL4030_MODIRQ_PWR, rtc);
out1:
rtc_device_unregister(rtc);
out0:
out1:
rtc_device_unregister(rtc);
out0:
/* leave rtc running, but disable irqs */
struct twl4030rtc_platform_data *pdata = pdev->dev.platform_data;
struct rtc_device *rtc = platform_get_drvdata(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);
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);
if (pdata != NULL && pdata->exit != NULL)
pdata->exit();
if (pdata != NULL && pdata->exit != NULL)
pdata->exit();
#include <mach/irqs.h>
/* TWL4030 interrupts */
#include <mach/irqs.h>
/* 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)
#define TWL4030_MODIRQ_KEYPAD (TWL4030_IRQ_BASE + 1)
#define TWL4030_MODIRQ_BCI (TWL4030_IRQ_BASE + 2)
#define TWL4030_MODIRQ_MADC (TWL4030_IRQ_BASE + 3)