From: <cri...@us...> - 2006-08-13 17:46:07
|
Revision: 544 Author: cristianop Date: 2006-08-13 10:45:49 -0700 (Sun, 13 Aug 2006) ViewCVS: http://svn.sourceforge.net/hackndev/?rev=544&view=rev Log Message: ----------- linux4palm: some changes to prevent read errors ... Modified Paths: -------------- linux4palm/linux/trunk/arch/arm/mach-pxa/palmtx/palmld_ac97.c Modified: linux4palm/linux/trunk/arch/arm/mach-pxa/palmtx/palmld_ac97.c =================================================================== --- linux4palm/linux/trunk/arch/arm/mach-pxa/palmtx/palmld_ac97.c 2006-08-13 16:07:50 UTC (rev 543) +++ linux4palm/linux/trunk/arch/arm/mach-pxa/palmtx/palmld_ac97.c 2006-08-13 17:45:49 UTC (rev 544) @@ -47,6 +47,7 @@ #define WM9712_PIL 0x00100 #define WM97XX_POLL 0x8000 /* initiate a polling measurement */ #define AC97_LINK_FRAME 21 /* time in uS for AC97 link frame */ +#define WM97XX_DELAY(i) ((i << 4) & 0x00f0) /* sample delay times */ #define DEFAULT_PRESSURE_TRESHOLD 45160 /* default pressure treshold for pen up/down */ @@ -76,6 +77,7 @@ static unsigned long last_update = 0; static int battery_voltage; static int previous_voltage; +static u16 d2base; #if defined(CONFIG_APM) || defined(CONFIG_APM_MODULE) /* original APM hook */ @@ -133,19 +135,13 @@ ac97->bus->ops->write(ac97, 0x52, GWn); } -static int wm97xx_set_digitiser_power(struct device *dev, int value) +static void wm97xx_set_digitiser_power(struct device *dev, int value) { ac97_t *ac97 = dev->platform_data; - u16 d2; + u16 d2 = d2base; - d2 = ac97->bus->ops->read(ac97, AC97_WM97XX_DIGITISER2); - if (d2 == (unsigned short) -1){ - printk("wm9712: will not set digitizer to %d due to read error on 0x78\n", value); - return -1; - } d2 |= value; ac97->bus->ops->write(ac97, AC97_WM97XX_DIGITISER2, d2); - return 1; } /* @@ -159,24 +155,19 @@ static int palmld_ac97_take_reading(struct device *dev, int adcsel) { ac97_t *ac97 = dev->platform_data; - int timeout = 10; - u16 r76, r7a; + int timeout = 15; + u16 r76 = 0; + u16 r7a; - r76 = ac97->bus->ops->read(ac97, 0x76); - if (r76 == (unsigned short) -1){ - printk("wm9712: will not continue take reading due to read error on 0x76\n"); - return 0; - } - - r76 &= ~WM97XX_ADCSEL_MASK; /* clear ADCSEL */ r76 |= adcsel; /* set ADCSEL */ + r76 |= WM97XX_DELAY(3); /* set DELAY */ r76 &= ~(1<<11); /* COO = 0 (single measurement) */ r76 &= ~(1<<10); /* CTC = 0 (polling mode) */ - r76 |= (1<<15); /* start reading */ + r76 |= (1<<15); /* start reading */ ac97->bus->ops->write(ac97, 0x76, r76); // some code from the the wolfson' driver - udelay (3 * AC97_LINK_FRAME + 167); + udelay ((3 * AC97_LINK_FRAME) + 167); /* wait for POLL to go low */ @@ -215,23 +206,16 @@ return; down(&digitiser_sem); - //wm97xx_set_digitiser_power(palmld_ac97_dev, WM97XX_PRP_DET_DIG); - if (wm97xx_set_digitiser_power(palmld_ac97_dev, WM97XX_PRP_DET_DIG)){ - // todo: check if reading is valid - reading = palmld_ac97_take_reading(palmld_ac97_dev, WM97XX_ADCSEL_BMON); - wm97xx_set_digitiser_power(palmld_ac97_dev, WM97XX_PRP_DET); - up(&digitiser_sem); - previous_voltage = battery_voltage; - battery_voltage = reading & 0xfff; - //printk("wm9712: battery -> %d\n", battery_voltage); - last_update = jiffies; - } - else { - up(&digitiser_sem); - printk ("wm9712: couldn't power digitiser on ... skipping battery read\n"); - - } + wm97xx_set_digitiser_power(palmld_ac97_dev, WM97XX_PRP_DET_DIG); + // todo: check if reading is valid + reading = palmld_ac97_take_reading(palmld_ac97_dev, WM97XX_ADCSEL_BMON); + wm97xx_set_digitiser_power(palmld_ac97_dev, WM97XX_PRP_DET); + up(&digitiser_sem); + previous_voltage = battery_voltage; + battery_voltage = reading & 0xfff; + //printk("wm9712: battery -> %d\n", battery_voltage); + last_update = jiffies; up(&battery_update_mutex); } @@ -358,11 +342,8 @@ //wm97xx_set_digitiser_power(dev, WM97XX_PRP_DET_DIG); /* take readings */ - //printk("wm9712: reading x\n"); xread = palmld_ac97_take_reading(dev, WM97XX_ADCSEL_X); - //printk("wm9712: reading y\n"); yread = palmld_ac97_take_reading(dev, WM97XX_ADCSEL_Y); - //printk("wm9712: reading pressure\n"); pressure = palmld_ac97_take_reading(dev, WM97XX_ADCSEL_PRES); /* power down digitiser to conserve power */ @@ -404,55 +385,30 @@ u16 levels; u16 polarity; - - //printk ("wm97xx: disabling pen detect interrupt\n"); - // disable pen detect interrupt - //wm97xx_gpio_mode(ac97, WM97XX_GPIO_13, WM97XX_GPIO_IN, - // WM97XX_GPIO_POL_HIGH, WM97XX_GPIO_NOTSTICKY, WM97XX_GPIO_NOWAKE); - //printk ("wm97xx: pen detect interrupt disabled\n"); - - levels = ac97->bus->ops->read(ac97, 0x54); polarity = ac97->bus->ops->read(ac97, 0x4e); if(polarity & levels & WM97XX_GPIO_13) { - //printk("wm9712: starting read\n"); - down(&digitiser_sem); // power up digitiser: - // test if doing it for all read cycle has benefits to ac97 usage - - - if (wm97xx_set_digitiser_power(dev, WM97XX_PRP_DET_DIG)){ - palmld_ac97_pendown(dev); - /* power down digitiser to conserve power */ - wm97xx_set_digitiser_power(dev, WM97XX_PRP_DET); - } - else{ - printk("wm9712: cannot power digitizer on ... skipping pendown reading\n"); - } - ac97->bus->ops->write(ac97, 0x4e, polarity & ~WM97XX_GPIO_13); + // test if doing it for all read cycle helps + down(&digitiser_sem); + wm97xx_set_digitiser_power(dev, WM97XX_PRP_DET_DIG); + palmld_ac97_pendown(dev); + /* power down digitiser to conserve power */ + wm97xx_set_digitiser_power(dev, WM97XX_PRP_DET); + ac97->bus->ops->write(ac97, 0x4e, polarity & ~WM97XX_GPIO_13); up(&digitiser_sem); } else { ac97->bus->ops->write(ac97, 0x4e, polarity | WM97XX_GPIO_13); } - ac97->bus->ops->write(ac97, 0x54, levels & ~WM97XX_GPIO_13); - - - //printk ("wm97xx: re-enabling pen detect interrupt\n"); - /* re-enable pen detect interrupt */ - - //wm97xx_gpio_mode(ac97, WM97XX_GPIO_13, WM97XX_GPIO_IN, - // WM97XX_GPIO_POL_HIGH, WM97XX_GPIO_STICKY, WM97XX_GPIO_WAKE); - //printk ("wm97xx: re-enabled pen detect interrupt\n"); - udelay(50); + udelay(1); up(&queue_sem); enable_irq(IRQ_GPIO_PALMTX_WM9712_IRQ); - } static irqreturn_t palmld_ac97_irq_handler(int irq, void *dev_id, struct pt_regs *regs) @@ -461,20 +417,10 @@ * we can't use ac97 from within the interrupt handler, so schedule a task * to do the actual handling. */ - //printk("wm9712: IRQ request received\n"); - // probably this lock is useless as irq seems to be disabled so quickly that - // I haven't seen up until now requests not queued if (down_trylock(&queue_sem) == 0){ disable_irq(IRQ_GPIO_PALMTX_WM9712_IRQ); queue_work(palmld_ac97_workqueue, &palmld_ac97_irq_task); - //printk("wm9712: IRQ request queued\n"); } - //else{ - // printk("wm9712: IRQ request not queued\n"); - //} - - - return IRQ_HANDLED; } @@ -509,6 +455,7 @@ /* disable digitiser to save power, enable pen-down detect */ d2 = ac97->bus->ops->read(ac97, AC97_WM97XX_DIGITISER2); d2 |= WM97XX_PRP_DET; + d2base = d2; ac97->bus->ops->write(ac97, AC97_WM97XX_DIGITISER2, d2); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |