Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 898b1d16 authored by Samuel Ortiz's avatar Samuel Ortiz Committed by David S. Miller
Browse files

[IRDA]: ali-ircc: using device model power management



This patch gets rid of the old power management code and now uses the
device model for the ali-ircc driver.

Signed-off-by: default avatarSamuel Ortiz <samuel@sortiz.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent bc1d6937
Loading
Loading
Loading
Loading
+51 −55
Original line number Original line Diff line number Diff line
@@ -34,14 +34,12 @@
#include <linux/rtnetlink.h>
#include <linux/rtnetlink.h>
#include <linux/serial_reg.h>
#include <linux/serial_reg.h>
#include <linux/dma-mapping.h>
#include <linux/dma-mapping.h>
#include <linux/platform_device.h>


#include <asm/io.h>
#include <asm/io.h>
#include <asm/dma.h>
#include <asm/dma.h>
#include <asm/byteorder.h>
#include <asm/byteorder.h>


#include <linux/pm.h>
#include <linux/pm_legacy.h>

#include <net/irda/wrapper.h>
#include <net/irda/wrapper.h>
#include <net/irda/irda.h>
#include <net/irda/irda.h>
#include <net/irda/irda_device.h>
#include <net/irda/irda_device.h>
@@ -51,7 +49,19 @@
#define CHIP_IO_EXTENT 8
#define CHIP_IO_EXTENT 8
#define BROKEN_DONGLE_ID
#define BROKEN_DONGLE_ID


static char *driver_name = "ali-ircc";
#define ALI_IRCC_DRIVER_NAME "ali-ircc"

/* Power Management */
static int ali_ircc_suspend(struct platform_device *dev, pm_message_t state);
static int ali_ircc_resume(struct platform_device *dev);

static struct platform_driver ali_ircc_driver = {
	.suspend	= ali_ircc_suspend,
	.resume		= ali_ircc_resume,
	.driver		= {
		.name	= ALI_IRCC_DRIVER_NAME,
	},
};


/* Module parameters */
/* Module parameters */
static int qos_mtt_bits = 0x07;  /* 1 ms or more */
static int qos_mtt_bits = 0x07;  /* 1 ms or more */
@@ -97,10 +107,7 @@ static int ali_ircc_is_receiving(struct ali_ircc_cb *self);
static int  ali_ircc_net_open(struct net_device *dev);
static int  ali_ircc_net_open(struct net_device *dev);
static int  ali_ircc_net_close(struct net_device *dev);
static int  ali_ircc_net_close(struct net_device *dev);
static int  ali_ircc_net_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
static int  ali_ircc_net_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
static int  ali_ircc_pmproc(struct pm_dev *dev, pm_request_t rqst, void *data);
static void ali_ircc_change_speed(struct ali_ircc_cb *self, __u32 baud);
static void ali_ircc_change_speed(struct ali_ircc_cb *self, __u32 baud);
static void ali_ircc_suspend(struct ali_ircc_cb *self);
static void ali_ircc_wakeup(struct ali_ircc_cb *self);
static struct net_device_stats *ali_ircc_net_get_stats(struct net_device *dev);
static struct net_device_stats *ali_ircc_net_get_stats(struct net_device *dev);


/* SIR function */
/* SIR function */
@@ -146,6 +153,14 @@ static int __init ali_ircc_init(void)
	
	
	IRDA_DEBUG(2, "%s(), ---------------- Start ----------------\n", __FUNCTION__);
	IRDA_DEBUG(2, "%s(), ---------------- Start ----------------\n", __FUNCTION__);


	ret = platform_driver_register(&ali_ircc_driver);
        if (ret) {
                IRDA_ERROR("%s, Can't register driver!\n",
			   ALI_IRCC_DRIVER_NAME);
                return ret;
        }

	
	/* Probe for all the ALi chipsets we know about */
	/* Probe for all the ALi chipsets we know about */
	for (chip= chips; chip->name; chip++, i++) 
	for (chip= chips; chip->name; chip++, i++) 
	{
	{
@@ -214,6 +229,10 @@ static int __init ali_ircc_init(void)
	}		
	}		
		
		
	IRDA_DEBUG(2, "%s(), ----------------- End -----------------\n", __FUNCTION__);					   		
	IRDA_DEBUG(2, "%s(), ----------------- End -----------------\n", __FUNCTION__);					   		

	if (ret)
		platform_driver_unregister(&ali_ircc_driver);

	return ret;
	return ret;
}
}


@@ -229,13 +248,13 @@ static void __exit ali_ircc_cleanup(void)


	IRDA_DEBUG(2, "%s(), ---------------- Start ----------------\n", __FUNCTION__);	
	IRDA_DEBUG(2, "%s(), ---------------- Start ----------------\n", __FUNCTION__);	


	pm_unregister_all(ali_ircc_pmproc);

	for (i=0; i < 4; i++) {
	for (i=0; i < 4; i++) {
		if (dev_self[i])
		if (dev_self[i])
			ali_ircc_close(dev_self[i]);
			ali_ircc_close(dev_self[i]);
	}
	}
	
	
	platform_driver_unregister(&ali_ircc_driver);

	IRDA_DEBUG(2, "%s(), ----------------- End -----------------\n", __FUNCTION__);
	IRDA_DEBUG(2, "%s(), ----------------- End -----------------\n", __FUNCTION__);
}
}


@@ -249,7 +268,6 @@ static int ali_ircc_open(int i, chipio_t *info)
{
{
	struct net_device *dev;
	struct net_device *dev;
	struct ali_ircc_cb *self;
	struct ali_ircc_cb *self;
	struct pm_dev *pmdev;
	int dongle_id;
	int dongle_id;
	int err;
	int err;
			
			
@@ -284,7 +302,8 @@ static int ali_ircc_open(int i, chipio_t *info)
        self->io.fifo_size = 16;		/* SIR: 16, FIR: 32 Benjamin 2000/11/1 */
        self->io.fifo_size = 16;		/* SIR: 16, FIR: 32 Benjamin 2000/11/1 */
	
	
	/* Reserve the ioports that we need */
	/* Reserve the ioports that we need */
	if (!request_region(self->io.fir_base, self->io.fir_ext, driver_name)) {
	if (!request_region(self->io.fir_base, self->io.fir_ext,
			    ALI_IRCC_DRIVER_NAME)) {
		IRDA_WARNING("%s(), can't get iobase of 0x%03x\n", __FUNCTION__,
		IRDA_WARNING("%s(), can't get iobase of 0x%03x\n", __FUNCTION__,
			self->io.fir_base);
			self->io.fir_base);
		err = -ENODEV;
		err = -ENODEV;
@@ -354,14 +373,11 @@ static int ali_ircc_open(int i, chipio_t *info)


	/* Check dongle id */
	/* Check dongle id */
	dongle_id = ali_ircc_read_dongle_id(i, info);
	dongle_id = ali_ircc_read_dongle_id(i, info);
	IRDA_MESSAGE("%s(), %s, Found dongle: %s\n", __FUNCTION__, driver_name, dongle_types[dongle_id]);
	IRDA_MESSAGE("%s(), %s, Found dongle: %s\n", __FUNCTION__,
		     ALI_IRCC_DRIVER_NAME, dongle_types[dongle_id]);
		
		
	self->io.dongle_id = dongle_id;
	self->io.dongle_id = dongle_id;


        pmdev = pm_register(PM_SYS_DEV, PM_SYS_IRDA, ali_ircc_pmproc);
        if (pmdev)
                pmdev->data = self;

	IRDA_DEBUG(2, "%s(), ----------------- End -----------------\n", __FUNCTION__);
	IRDA_DEBUG(2, "%s(), ----------------- End -----------------\n", __FUNCTION__);
	
	
	return 0;
	return 0;
@@ -548,12 +564,11 @@ static int ali_ircc_setup(chipio_t *info)
	/* Should be 0x00 in the M1535/M1535D */
	/* Should be 0x00 in the M1535/M1535D */
	if(version != 0x00)
	if(version != 0x00)
	{
	{
		IRDA_ERROR("%s, Wrong chip version %02x\n", driver_name, version);
		IRDA_ERROR("%s, Wrong chip version %02x\n",
			   ALI_IRCC_DRIVER_NAME, version);
		return -1;
		return -1;
	}
	}
	
	
	// IRDA_MESSAGE("%s, Found chip at base=0x%03x\n", driver_name, info->cfg_base);
	
	/* Set FIR FIFO Threshold Register */
	/* Set FIR FIFO Threshold Register */
	switch_bank(iobase, BANK1);
	switch_bank(iobase, BANK1);
	outb(RX_FIFO_Threshold, iobase+FIR_FIFO_TR);
	outb(RX_FIFO_Threshold, iobase+FIR_FIFO_TR);
@@ -583,7 +598,8 @@ static int ali_ircc_setup(chipio_t *info)
	/* Switch to SIR space */
	/* Switch to SIR space */
	FIR2SIR(iobase);
	FIR2SIR(iobase);
	
	
	IRDA_MESSAGE("%s, driver loaded (Benjamin Kong)\n", driver_name);
	IRDA_MESSAGE("%s, driver loaded (Benjamin Kong)\n",
		     ALI_IRCC_DRIVER_NAME);
	
	
	/* Enable receive interrupts */ 
	/* Enable receive interrupts */ 
	// outb(UART_IER_RDI, iobase+UART_IER); //benjamin 2000/11/23 01:25PM
	// outb(UART_IER_RDI, iobase+UART_IER); //benjamin 2000/11/23 01:25PM
@@ -647,7 +663,8 @@ static irqreturn_t ali_ircc_interrupt(int irq, void *dev_id,
	IRDA_DEBUG(2, "%s(), ---------------- Start ----------------\n", __FUNCTION__);
	IRDA_DEBUG(2, "%s(), ---------------- Start ----------------\n", __FUNCTION__);
		
		
 	if (!dev) {
 	if (!dev) {
		IRDA_WARNING("%s: irq %d for unknown device.\n", driver_name, irq);
		IRDA_WARNING("%s: irq %d for unknown device.\n",
			     ALI_IRCC_DRIVER_NAME, irq);
		return IRQ_NONE;
		return IRQ_NONE;
	}	
	}	
	
	
@@ -1328,7 +1345,8 @@ static int ali_ircc_net_open(struct net_device *dev)
	/* Request IRQ and install Interrupt Handler */
	/* Request IRQ and install Interrupt Handler */
	if (request_irq(self->io.irq, ali_ircc_interrupt, 0, dev->name, dev)) 
	if (request_irq(self->io.irq, ali_ircc_interrupt, 0, dev->name, dev)) 
	{
	{
		IRDA_WARNING("%s, unable to allocate irq=%d\n", driver_name,
		IRDA_WARNING("%s, unable to allocate irq=%d\n",
			     ALI_IRCC_DRIVER_NAME,
			     self->io.irq);
			     self->io.irq);
		return -EAGAIN;
		return -EAGAIN;
	}
	}
@@ -1338,7 +1356,8 @@ static int ali_ircc_net_open(struct net_device *dev)
	 * failure.
	 * failure.
	 */
	 */
	if (request_dma(self->io.dma, dev->name)) {
	if (request_dma(self->io.dma, dev->name)) {
		IRDA_WARNING("%s, unable to allocate dma=%d\n", driver_name,
		IRDA_WARNING("%s, unable to allocate dma=%d\n",
			     ALI_IRCC_DRIVER_NAME,
			     self->io.dma);
			     self->io.dma);
		free_irq(self->io.irq, self);
		free_irq(self->io.irq, self);
		return -EAGAIN;
		return -EAGAIN;
@@ -2108,61 +2127,38 @@ static struct net_device_stats *ali_ircc_net_get_stats(struct net_device *dev)
	return &self->stats;
	return &self->stats;
}
}


static void ali_ircc_suspend(struct ali_ircc_cb *self)
static int ali_ircc_suspend(struct platform_device *dev, pm_message_t state)
{
{
	IRDA_DEBUG(2, "%s(), ---------------- Start ----------------\n", __FUNCTION__ );
	struct ali_ircc_cb *self = platform_get_drvdata(dev);
	
	
	IRDA_MESSAGE("%s, Suspending\n", driver_name);
	IRDA_MESSAGE("%s, Suspending\n", ALI_IRCC_DRIVER_NAME);


	if (self->io.suspended)
	if (self->io.suspended)
		return;
		return 0;


	ali_ircc_net_close(self->netdev);
	ali_ircc_net_close(self->netdev);


	self->io.suspended = 1;
	self->io.suspended = 1;
	
	
	IRDA_DEBUG(2, "%s(), ----------------- End ------------------\n", __FUNCTION__ );	
	return 0;
}
}


static void ali_ircc_wakeup(struct ali_ircc_cb *self)
static int ali_ircc_resume(struct platform_device *dev)
{
{
	IRDA_DEBUG(2, "%s(), ---------------- Start ----------------\n", __FUNCTION__ );
	struct ali_ircc_cb *self = platform_get_drvdata(dev);
	
	
	if (!self->io.suspended)
	if (!self->io.suspended)
		return;
		return 0;
	
	
	ali_ircc_net_open(self->netdev);
	ali_ircc_net_open(self->netdev);
	
	
	IRDA_MESSAGE("%s, Waking up\n", driver_name);
	IRDA_MESSAGE("%s, Waking up\n", ALI_IRCC_DRIVER_NAME);


	self->io.suspended = 0;
	self->io.suspended = 0;


	IRDA_DEBUG(2, "%s(), ----------------- End ------------------\n", __FUNCTION__ );	
}

static int ali_ircc_pmproc(struct pm_dev *dev, pm_request_t rqst, void *data)
{
        struct ali_ircc_cb *self = (struct ali_ircc_cb*) dev->data;
        
        IRDA_DEBUG(2, "%s(), ---------------- Start ----------------\n", __FUNCTION__ );
	
        if (self) {
                switch (rqst) {
                case PM_SUSPEND:
                        ali_ircc_suspend(self);
                        break;
                case PM_RESUME:
                        ali_ircc_wakeup(self);
                        break;
                }
        }
        
        IRDA_DEBUG(2, "%s(), ----------------- End ------------------\n", __FUNCTION__ );	
        
	return 0;
	return 0;
}
}



/* ALi Chip Function */
/* ALi Chip Function */


static void SetCOMInterrupts(struct ali_ircc_cb *self , unsigned char enable)
static void SetCOMInterrupts(struct ali_ircc_cb *self , unsigned char enable)