Skip to content

Commit

Permalink
[IRDA]: ali-ircc: using device model power management
Browse files Browse the repository at this point in the history
This patch gets rid of the old power management code and now uses the
device model for the ali-ircc driver.

Signed-off-by: Samuel Ortiz <samuel@sortiz.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Samuel Ortiz authored and David S. Miller committed Jun 18, 2006
1 parent bc1d693 commit 898b1d1
Showing 1 changed file with 51 additions and 55 deletions.
106 changes: 51 additions & 55 deletions drivers/net/irda/ali-ircc.c
Original file line number Diff line number Diff line change
Expand Up @@ -34,14 +34,12 @@
#include <linux/rtnetlink.h>
#include <linux/serial_reg.h>
#include <linux/dma-mapping.h>
#include <linux/platform_device.h>

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

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

#include <net/irda/wrapper.h>
#include <net/irda/irda.h>
#include <net/irda/irda_device.h>
Expand All @@ -51,7 +49,19 @@
#define CHIP_IO_EXTENT 8
#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 */
static int qos_mtt_bits = 0x07; /* 1 ms or more */
Expand Down Expand Up @@ -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_close(struct net_device *dev);
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_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);

/* SIR function */
Expand Down Expand Up @@ -145,6 +152,14 @@ static int __init ali_ircc_init(void)
int i = 0;

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 */
for (chip= chips; chip->name; chip++, i++)
Expand Down Expand Up @@ -214,6 +229,10 @@ static int __init ali_ircc_init(void)
}

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

if (ret)
platform_driver_unregister(&ali_ircc_driver);

return ret;
}

Expand All @@ -228,14 +247,14 @@ static void __exit ali_ircc_cleanup(void)
int i;

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

pm_unregister_all(ali_ircc_pmproc);

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

platform_driver_unregister(&ali_ircc_driver);

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

Expand All @@ -249,7 +268,6 @@ static int ali_ircc_open(int i, chipio_t *info)
{
struct net_device *dev;
struct ali_ircc_cb *self;
struct pm_dev *pmdev;
int dongle_id;
int err;

Expand Down Expand Up @@ -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 */

/* 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__,
self->io.fir_base);
err = -ENODEV;
Expand Down Expand Up @@ -354,13 +373,10 @@ static int ali_ircc_open(int i, chipio_t *info)

/* Check dongle id */
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;

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

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

Expand Down Expand Up @@ -548,12 +564,11 @@ static int ali_ircc_setup(chipio_t *info)
/* Should be 0x00 in the M1535/M1535D */
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;
}

// IRDA_MESSAGE("%s, Found chip at base=0x%03x\n", driver_name, info->cfg_base);

/* Set FIR FIFO Threshold Register */
switch_bank(iobase, BANK1);
outb(RX_FIFO_Threshold, iobase+FIR_FIFO_TR);
Expand Down Expand Up @@ -583,7 +598,8 @@ static int ali_ircc_setup(chipio_t *info)
/* Switch to SIR space */
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 */
// outb(UART_IER_RDI, iobase+UART_IER); //benjamin 2000/11/23 01:25PM
Expand Down Expand Up @@ -647,7 +663,8 @@ static irqreturn_t ali_ircc_interrupt(int irq, void *dev_id,
IRDA_DEBUG(2, "%s(), ---------------- Start ----------------\n", __FUNCTION__);

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;
}

Expand Down Expand Up @@ -1328,7 +1345,8 @@ static int ali_ircc_net_open(struct net_device *dev)
/* Request IRQ and install Interrupt Handler */
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);
return -EAGAIN;
}
Expand All @@ -1338,7 +1356,8 @@ static int ali_ircc_net_open(struct net_device *dev)
* failure.
*/
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);
free_irq(self->io.irq, self);
return -EAGAIN;
Expand Down Expand Up @@ -2108,61 +2127,38 @@ static struct net_device_stats *ali_ircc_net_get_stats(struct net_device *dev)
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)
return;
return 0;

ali_ircc_net_close(self->netdev);

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)
return;
return 0;

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;

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;
}


/* ALi Chip Function */

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

0 comments on commit 898b1d1

Please sign in to comment.