remove <linux/i2c/twl4030-rtc.h>
PATCH 2/7 remove <linux/i2c/twl4030-rtc.h>
From: David Brownell <[email protected]>
Remove <linux/i2c/twl4030-rtc.h> by moving all the relevant contents into the driver itself, and removing the rest. Stuff removed included many useless bitmasks, and remnants of the platform data hook.
Add markers inside the rtc driver to split sections apart: first data structure declarations, then the RTC driver, then platform bus glue for it all.
There's still an issue with the twl4030-pwrirq.h registers ... this driver has no business touching them! This patch at least switches away from having private versions of those register definitions, and removes some unnecessary accesses to them.
No functional changes, just shrinkage.
--- drivers/rtc/rtc-twl4030.c | 105 +++++++++++++++------ include/linux/i2c/twl4030-pwrirq.h | 8 + include/linux/i2c/twl4030-rtc.h | 172 ----------------------------------- 3 files changed, 79 insertions(+), 206 deletions(-)
drivers/rtc/rtc-twl4030.c +74 -31
@@ -28,11 +28,63 @@#include <linux/interrupt.h> #include <linux/i2c/twl4030.h> -#include <linux/i2c/twl4030-rtc.h> +#include <linux/i2c/twl4030-pwrirq.h> + + +/* +* RTC block register offsets (use TWL_MODULE_RTC) +*/ +#define REG_SECONDS_REG 0x00 +#define REG_MINUTES_REG 0x01 +#define REG_HOURS_REG 0x02 +#define REG_DAYS_REG 0x03 +#define REG_MONTHS_REG 0x04 +#define REG_YEARS_REG 0x05 +#define REG_WEEKS_REG 0x06 +#define REG_ALARM_SECONDS_REG 0x07 +#define REG_ALARM_MINUTES_REG 0x08 +#define REG_ALARM_HOURS_REG 0x09 +#define REG_ALARM_DAYS_REG 0x0A +#define REG_ALARM_MONTHS_REG 0x0B +#define REG_ALARM_YEARS_REG 0x0C + +#define REG_RTC_CTRL_REG 0x0D +#define REG_RTC_STATUS_REG 0x0E +#define REG_RTC_INTERRUPTS_REG 0x0F + +#define REG_RTC_COMP_LSB_REG 0x10 +#define REG_RTC_COMP_MSB_REG 0x11 +/* RTC_CTRL_REG bitfields */ +#define BIT_RTC_CTRL_REG_STOP_RTC_M 0x01 +#define BIT_RTC_CTRL_REG_ROUND_30S_M 0x02 +#define BIT_RTC_CTRL_REG_AUTO_COMP_M 0x04 +#define BIT_RTC_CTRL_REG_MODE_12_24_M 0x08 +#define BIT_RTC_CTRL_REG_TEST_MODE_M 0x10 +#define BIT_RTC_CTRL_REG_SET_32_COUNTER_M 0x20 +#define BIT_RTC_CTRL_REG_GET_TIME_M 0x40 + +/* RTC_STATUS_REG bitfields */ +#define BIT_RTC_STATUS_REG_RUN_M 0x02 +#define BIT_RTC_STATUS_REG_1S_EVENT_M 0x04 +#define BIT_RTC_STATUS_REG_1M_EVENT_M 0x08 +#define BIT_RTC_STATUS_REG_1H_EVENT_M 0x10 +#define BIT_RTC_STATUS_REG_1D_EVENT_M 0x20 +#define BIT_RTC_STATUS_REG_ALARM_M 0x40 +#define BIT_RTC_STATUS_REG_POWER_UP_M 0x80 + +/* RTC_INTERRUPTS_REG bitfields */ +#define BIT_RTC_INTERRUPTS_REG_EVERY_M 0x03 +#define BIT_RTC_INTERRUPTS_REG_IT_TIMER_M 0x04 +#define BIT_RTC_INTERRUPTS_REG_IT_ALARM_M 0x08 + + +/* REG_SECONDS_REG through REG_YEARS_REG is how many registers? */ #define ALL_TIME_REGS 6 +/*----------------------------------------------------------------------*/ +/* * Supports 1 byte read from TWL4030 RTC register. */
@@ -315,12 +367,19 @@ static irqreturn_t twl4030_rtc_interruptif (res) goto out; -/* Clear on Read enabled. RTC_IT bit of REG_PWR_ISR1 needs -* 2 reads to clear the interrupt. One read is done in +/* Clear on Read enabled. RTC_IT bit of TWL4030_INT_PWR_ISR1 +* needs 2 reads to clear the interrupt. One read is done in * do_twl4030_pwrirq(). Doing the second read, to clear * the bit. +* +* FIXME the reason PWR_ISR1 needs an extra read is that +* RTC_IF retriggered until we cleared REG_ALARM_M above. +* But re-reading like this is a bad hack; by doing so we +* risk wrongly clearing status for some other IRQ (losing +* the interrupt). Be smarter about handling RTC_UF ... */ - res =twl4030_i2c_read_u8 (TWL4030_MODULE_INT , &rd_reg,REG_PWR_ISR1 ); + res =twl4030_i2c_read_u8 (TWL4030_MODULE_INT , + &rd_reg,TWL4030_INT_PWR_ISR1 );if (res) goto out;
@@ -340,9 +399,10 @@ static struct rtc_class_ops twl4030_rtc_ .set_alarm = twl4030_rtc_set_alarm, }; +/*----------------------------------------------------------------------*/ +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 );
@@ -351,12 +411,6 @@ static int __devinit twl4030_rtc_probe(sif (irq <0 )return irq; -if (pdata !=NULL && pdata->init !=NULL ) { - ret = pdata->init (); -if (ret <0 ) - goto out; - } - rtc =rtc_device_register (pdev->name, &pdev->dev, &twl4030_rtc_ops,THIS_MODULE );if (IS_ERR (rtc)) {
@@ -405,23 +459,19 @@ static int __devinit twl4030_rtc_probe(s goto out2; } - ret =twl4030_i2c_read_u8 (TWL4030_MODULE_INT , &rd_reg,REG_PWR_IMR1 ); -if (ret <0 ) - goto out2; - - rd_reg &=PWR_RTC_IT_UNMASK ; -/* MASK PWR - we will need this */ - ret =twl4030_i2c_write_u8 (TWL4030_MODULE_INT , rd_reg,REG_PWR_IMR1 ); -if (ret <0 ) - goto out2; +/* FIXME stop touching MODULE_INT registers; there's already +* driver code responsible for them. +*/ - ret =twl4030_i2c_read_u8 (TWL4030_MODULE_INT , &rd_reg,REG_PWR_EDR1 ); +/* use rising edge detection for RTC alarm */ + ret =twl4030_i2c_read_u8 (TWL4030_MODULE_INT , + &rd_reg,TWL4030_INT_PWR_EDR1 );if (ret <0 ) goto out2; -/* Rising edge detection enabled, needed for RTC alarm */ - rd_reg |=0x80 ; - ret =twl4030_i2c_write_u8 (TWL4030_MODULE_INT , rd_reg,REG_PWR_EDR1 ); + rd_reg |=BIT (3 ); + ret =twl4030_i2c_write_u8 (TWL4030_MODULE_INT , + rd_reg,TWL4030_INT_PWR_EDR1 );if (ret <0 ) goto out2;
@@ -438,9 +488,6 @@ out2: out1:rtc_device_unregister (rtc); out0: -if (pdata !=NULL && pdata->exit !=NULL ) - pdata->exit (); -out:return ret; }
@@ -451,7 +498,6 @@ out: 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 );
@@ -460,9 +506,6 @@ static int __devexit twl4030_rtc_remove(free_irq (irq, rtc); -if (pdata !=NULL && pdata->exit !=NULL ) - pdata->exit (); -rtc_device_unregister (rtc);platform_set_drvdata (pdev,NULL );return 0 ;
include/linux/i2c/twl4030-pwrirq.h +5 -3
@@ -1,5 +1,5 @@/* -* twl4030-gpio.h - header for TWL4030 GPIO module +* twl4030-pwrirq.h - header for TWL4030 power interrupts * * Copyright (C) 2008 Texas Instruments, Inc. * Copyright (C) 2008 Nokia Corporation
@@ -24,14 +24,16 @@#define __TWL4030_PWRIRQ_H_/* -* INT Module Register definitions -* (not all registers are defined below) +* Power Interrupt block register offsets (use TWL4030_MODULE_INT) */ #define TWL4030_INT_PWR_ISR1 0x0#define TWL4030_INT_PWR_IMR1 0x1#define TWL4030_INT_PWR_ISR2 0x2#define TWL4030_INT_PWR_IMR2 0x3 +#define TWL4030_INT_PWR_SIR 0x4/* test register */ +#define TWL4030_INT_PWR_EDR1 0x5 +#define TWL4030_INT_PWR_EDR2 0x6#define TWL4030_INT_PWR_SIH_CTRL 0x7#endif /* End of __TWL4030_PWRIRQ_H */
include/linux/i2c/twl4030-rtc.h deleted +0 -172
172 lines not on this page · raw message