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

Commit d7906de1 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
parents fbd91ac2 725a6abf
Loading
Loading
Loading
Loading
+11 −0
Original line number Original line Diff line number Diff line
This file details changes in 2.6 which affect PCMCIA card driver authors:
This file details changes in 2.6 which affect PCMCIA card driver authors:


* Unify detach and REMOVAL event code, as well as attach and INSERTION
  code (as of 2.6.16)
       void (*remove)          (struct pcmcia_device *dev);
       int (*probe)            (struct pcmcia_device *dev);

* Move suspend, resume and reset out of event handler (as of 2.6.16)
       int (*suspend)          (struct pcmcia_device *dev);
       int (*resume)           (struct pcmcia_device *dev);
  should be initialized in struct pcmcia_driver, and handle
  (SUSPEND == RESET_PHYSICAL) and (RESUME == CARD_RESET) events

* event handler initialization in struct pcmcia_driver (as of 2.6.13)
* event handler initialization in struct pcmcia_driver (as of 2.6.13)
   The event handler is notified of all events, and must be initialized
   The event handler is notified of all events, and must be initialized
   as the event() callback in the driver's struct pcmcia_driver.
   as the event() callback in the driver's struct pcmcia_driver.
+1 −0
Original line number Original line Diff line number Diff line
@@ -62,6 +62,7 @@ int dpm_runtime_suspend(struct device * dev, pm_message_t state)
	up(&dpm_sem);
	up(&dpm_sem);
	return error;
	return error;
}
}
EXPORT_SYMBOL(dpm_runtime_suspend);




#if 0
#if 0
+30 −79
Original line number Original line Diff line number Diff line
@@ -87,14 +87,8 @@ typedef struct bluecard_info_t {


static void bluecard_config(dev_link_t *link);
static void bluecard_config(dev_link_t *link);
static void bluecard_release(dev_link_t *link);
static void bluecard_release(dev_link_t *link);
static int bluecard_event(event_t event, int priority, event_callback_args_t *args);


static dev_info_t dev_info = "bluecard_cs";
static void bluecard_detach(struct pcmcia_device *p_dev);

static dev_link_t *bluecard_attach(void);
static void bluecard_detach(dev_link_t *);

static dev_link_t *dev_list = NULL;




/* Default baud rate: 57600, 115200, 230400 or 460800 */
/* Default baud rate: 57600, 115200, 230400 or 460800 */
@@ -862,17 +856,15 @@ static int bluecard_close(bluecard_info_t *info)
	return 0;
	return 0;
}
}


static dev_link_t *bluecard_attach(void)
static int bluecard_attach(struct pcmcia_device *p_dev)
{
{
	bluecard_info_t *info;
	bluecard_info_t *info;
	client_reg_t client_reg;
	dev_link_t *link;
	dev_link_t *link;
	int ret;


	/* Create new info device */
	/* Create new info device */
	info = kzalloc(sizeof(*info), GFP_KERNEL);
	info = kzalloc(sizeof(*info), GFP_KERNEL);
	if (!info)
	if (!info)
		return NULL;
		return -ENOMEM;


	link = &info->link;
	link = &info->link;
	link->priv = info;
	link->priv = info;
@@ -889,50 +881,24 @@ static dev_link_t *bluecard_attach(void)
	link->conf.Vcc = 50;
	link->conf.Vcc = 50;
	link->conf.IntType = INT_MEMORY_AND_IO;
	link->conf.IntType = INT_MEMORY_AND_IO;


	/* Register with Card Services */
	link->handle = p_dev;
	link->next = dev_list;
	p_dev->instance = link;
	dev_list = link;
	client_reg.dev_info = &dev_info;
	client_reg.Version = 0x0210;
	client_reg.event_callback_args.client_data = link;


	ret = pcmcia_register_client(&link->handle, &client_reg);
	link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;
	if (ret != CS_SUCCESS) {
	bluecard_config(link);
		cs_error(link->handle, RegisterClient, ret);
		bluecard_detach(link);
		return NULL;
	}


	return link;
	return 0;
}
}




static void bluecard_detach(dev_link_t *link)
static void bluecard_detach(struct pcmcia_device *p_dev)
{
{
	dev_link_t *link = dev_to_instance(p_dev);
	bluecard_info_t *info = link->priv;
	bluecard_info_t *info = link->priv;
	dev_link_t **linkp;
	int ret;

	/* Locate device structure */
	for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next)
		if (*linkp == link)
			break;

	if (*linkp == NULL)
		return;


	if (link->state & DEV_CONFIG)
	if (link->state & DEV_CONFIG)
		bluecard_release(link);
		bluecard_release(link);


	if (link->handle) {
		ret = pcmcia_deregister_client(link->handle);
		if (ret != CS_SUCCESS)
			cs_error(link->handle, DeregisterClient, ret);
	}

	/* Unlink device structure, free bits */
	*linkp = link->next;

	kfree(info);
	kfree(info);
}
}


@@ -1045,39 +1011,24 @@ static void bluecard_release(dev_link_t *link)
	link->state &= ~DEV_CONFIG;
	link->state &= ~DEV_CONFIG;
}
}



static int bluecard_suspend(struct pcmcia_device *dev)
static int bluecard_event(event_t event, int priority, event_callback_args_t *args)
{
{
	dev_link_t *link = args->client_data;
	dev_link_t *link = dev_to_instance(dev);
	bluecard_info_t *info = link->priv;


	switch (event) {
	case CS_EVENT_CARD_REMOVAL:
		link->state &= ~DEV_PRESENT;
		if (link->state & DEV_CONFIG) {
			bluecard_close(info);
			bluecard_release(link);
		}
		break;
	case CS_EVENT_CARD_INSERTION:
		link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;
		bluecard_config(link);
		break;
	case CS_EVENT_PM_SUSPEND:
	link->state |= DEV_SUSPEND;
	link->state |= DEV_SUSPEND;
		/* Fall through... */
	case CS_EVENT_RESET_PHYSICAL:
	if (link->state & DEV_CONFIG)
	if (link->state & DEV_CONFIG)
		pcmcia_release_configuration(link->handle);
		pcmcia_release_configuration(link->handle);
		break;

	case CS_EVENT_PM_RESUME:
	return 0;
}

static int bluecard_resume(struct pcmcia_device *dev)
{
	dev_link_t *link = dev_to_instance(dev);

	link->state &= ~DEV_SUSPEND;
	link->state &= ~DEV_SUSPEND;
		/* Fall through... */
	case CS_EVENT_CARD_RESET:
	if (DEV_OK(link))
	if (DEV_OK(link))
		pcmcia_request_configuration(link->handle, &link->conf);
		pcmcia_request_configuration(link->handle, &link->conf);
		break;
	}


	return 0;
	return 0;
}
}
@@ -1095,10 +1046,11 @@ static struct pcmcia_driver bluecard_driver = {
	.drv		= {
	.drv		= {
		.name	= "bluecard_cs",
		.name	= "bluecard_cs",
	},
	},
	.attach		= bluecard_attach,
	.probe		= bluecard_attach,
	.event		= bluecard_event,
	.remove		= bluecard_detach,
	.detach		= bluecard_detach,
	.id_table	= bluecard_ids,
	.id_table	= bluecard_ids,
	.suspend	= bluecard_suspend,
	.resume		= bluecard_resume,
};
};


static int __init init_bluecard_cs(void)
static int __init init_bluecard_cs(void)
@@ -1110,7 +1062,6 @@ static int __init init_bluecard_cs(void)
static void __exit exit_bluecard_cs(void)
static void __exit exit_bluecard_cs(void)
{
{
	pcmcia_unregister_driver(&bluecard_driver);
	pcmcia_unregister_driver(&bluecard_driver);
	BUG_ON(dev_list != NULL);
}
}


module_init(init_bluecard_cs);
module_init(init_bluecard_cs);
+31 −79
Original line number Original line Diff line number Diff line
@@ -90,14 +90,8 @@ typedef struct bt3c_info_t {


static void bt3c_config(dev_link_t *link);
static void bt3c_config(dev_link_t *link);
static void bt3c_release(dev_link_t *link);
static void bt3c_release(dev_link_t *link);
static int bt3c_event(event_t event, int priority, event_callback_args_t *args);


static dev_info_t dev_info = "bt3c_cs";
static void bt3c_detach(struct pcmcia_device *p_dev);

static dev_link_t *bt3c_attach(void);
static void bt3c_detach(dev_link_t *);

static dev_link_t *dev_list = NULL;




/* Transmit states  */
/* Transmit states  */
@@ -663,17 +657,15 @@ static int bt3c_close(bt3c_info_t *info)
	return 0;
	return 0;
}
}


static dev_link_t *bt3c_attach(void)
static int bt3c_attach(struct pcmcia_device *p_dev)
{
{
	bt3c_info_t *info;
	bt3c_info_t *info;
	client_reg_t client_reg;
	dev_link_t *link;
	dev_link_t *link;
	int ret;


	/* Create new info device */
	/* Create new info device */
	info = kzalloc(sizeof(*info), GFP_KERNEL);
	info = kzalloc(sizeof(*info), GFP_KERNEL);
	if (!info)
	if (!info)
		return NULL;
		return -ENOMEM;


	link = &info->link;
	link = &info->link;
	link->priv = info;
	link->priv = info;
@@ -690,50 +682,24 @@ static dev_link_t *bt3c_attach(void)
	link->conf.Vcc = 50;
	link->conf.Vcc = 50;
	link->conf.IntType = INT_MEMORY_AND_IO;
	link->conf.IntType = INT_MEMORY_AND_IO;


	/* Register with Card Services */
	link->handle = p_dev;
	link->next = dev_list;
	p_dev->instance = link;
	dev_list = link;
	client_reg.dev_info = &dev_info;
	client_reg.Version = 0x0210;
	client_reg.event_callback_args.client_data = link;


	ret = pcmcia_register_client(&link->handle, &client_reg);
	link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;
	if (ret != CS_SUCCESS) {
	bt3c_config(link);
		cs_error(link->handle, RegisterClient, ret);
		bt3c_detach(link);
		return NULL;
	}


	return link;
	return 0;
}
}




static void bt3c_detach(dev_link_t *link)
static void bt3c_detach(struct pcmcia_device *p_dev)
{
{
	dev_link_t *link = dev_to_instance(p_dev);
	bt3c_info_t *info = link->priv;
	bt3c_info_t *info = link->priv;
	dev_link_t **linkp;
	int ret;

	/* Locate device structure */
	for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next)
		if (*linkp == link)
			break;

	if (*linkp == NULL)
		return;


	if (link->state & DEV_CONFIG)
	if (link->state & DEV_CONFIG)
		bt3c_release(link);
		bt3c_release(link);


	if (link->handle) {
		ret = pcmcia_deregister_client(link->handle);
		if (ret != CS_SUCCESS)
			cs_error(link->handle, DeregisterClient, ret);
	}

	/* Unlink device structure, free bits */
	*linkp = link->next;

	kfree(info);
	kfree(info);
}
}


@@ -891,43 +857,29 @@ static void bt3c_release(dev_link_t *link)
	link->state &= ~DEV_CONFIG;
	link->state &= ~DEV_CONFIG;
}
}



static int bt3c_suspend(struct pcmcia_device *dev)
static int bt3c_event(event_t event, int priority, event_callback_args_t *args)
{
{
	dev_link_t *link = args->client_data;
	dev_link_t *link = dev_to_instance(dev);
	bt3c_info_t *info = link->priv;


	switch (event) {
	case CS_EVENT_CARD_REMOVAL:
		link->state &= ~DEV_PRESENT;
		if (link->state & DEV_CONFIG) {
			bt3c_close(info);
			bt3c_release(link);
		}
		break;
	case CS_EVENT_CARD_INSERTION:
		link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;
		bt3c_config(link);
		break;
	case CS_EVENT_PM_SUSPEND:
	link->state |= DEV_SUSPEND;
	link->state |= DEV_SUSPEND;
		/* Fall through... */
	case CS_EVENT_RESET_PHYSICAL:
	if (link->state & DEV_CONFIG)
	if (link->state & DEV_CONFIG)
		pcmcia_release_configuration(link->handle);
		pcmcia_release_configuration(link->handle);
		break;

	case CS_EVENT_PM_RESUME:
	return 0;
}

static int bt3c_resume(struct pcmcia_device *dev)
{
	dev_link_t *link = dev_to_instance(dev);

	link->state &= ~DEV_SUSPEND;
	link->state &= ~DEV_SUSPEND;
		/* Fall through... */
	case CS_EVENT_CARD_RESET:
	if (DEV_OK(link))
	if (DEV_OK(link))
		pcmcia_request_configuration(link->handle, &link->conf);
		pcmcia_request_configuration(link->handle, &link->conf);
		break;
	}


	return 0;
	return 0;
}
}



static struct pcmcia_device_id bt3c_ids[] = {
static struct pcmcia_device_id bt3c_ids[] = {
	PCMCIA_DEVICE_PROD_ID13("3COM", "Bluetooth PC Card", 0xefce0a31, 0xd4ce9b02),
	PCMCIA_DEVICE_PROD_ID13("3COM", "Bluetooth PC Card", 0xefce0a31, 0xd4ce9b02),
	PCMCIA_DEVICE_NULL
	PCMCIA_DEVICE_NULL
@@ -939,10 +891,11 @@ static struct pcmcia_driver bt3c_driver = {
	.drv		= {
	.drv		= {
		.name	= "bt3c_cs",
		.name	= "bt3c_cs",
	},
	},
	.attach		= bt3c_attach,
	.probe		= bt3c_attach,
	.event		= bt3c_event,
	.remove		= bt3c_detach,
	.detach		= bt3c_detach,
	.id_table	= bt3c_ids,
	.id_table	= bt3c_ids,
	.suspend	= bt3c_suspend,
	.resume		= bt3c_resume,
};
};


static int __init init_bt3c_cs(void)
static int __init init_bt3c_cs(void)
@@ -954,7 +907,6 @@ static int __init init_bt3c_cs(void)
static void __exit exit_bt3c_cs(void)
static void __exit exit_bt3c_cs(void)
{
{
	pcmcia_unregister_driver(&bt3c_driver);
	pcmcia_unregister_driver(&bt3c_driver);
	BUG_ON(dev_list != NULL);
}
}


module_init(init_bt3c_cs);
module_init(init_bt3c_cs);
+31 −79
Original line number Original line Diff line number Diff line
@@ -86,14 +86,8 @@ typedef struct btuart_info_t {


static void btuart_config(dev_link_t *link);
static void btuart_config(dev_link_t *link);
static void btuart_release(dev_link_t *link);
static void btuart_release(dev_link_t *link);
static int btuart_event(event_t event, int priority, event_callback_args_t *args);


static dev_info_t dev_info = "btuart_cs";
static void btuart_detach(struct pcmcia_device *p_dev);

static dev_link_t *btuart_attach(void);
static void btuart_detach(dev_link_t *);

static dev_link_t *dev_list = NULL;




/* Maximum baud rate */
/* Maximum baud rate */
@@ -582,17 +576,15 @@ static int btuart_close(btuart_info_t *info)
	return 0;
	return 0;
}
}


static dev_link_t *btuart_attach(void)
static int btuart_attach(struct pcmcia_device *p_dev)
{
{
	btuart_info_t *info;
	btuart_info_t *info;
	client_reg_t client_reg;
	dev_link_t *link;
	dev_link_t *link;
	int ret;


	/* Create new info device */
	/* Create new info device */
	info = kzalloc(sizeof(*info), GFP_KERNEL);
	info = kzalloc(sizeof(*info), GFP_KERNEL);
	if (!info)
	if (!info)
		return NULL;
		return -ENOMEM;


	link = &info->link;
	link = &info->link;
	link->priv = info;
	link->priv = info;
@@ -609,50 +601,24 @@ static dev_link_t *btuart_attach(void)
	link->conf.Vcc = 50;
	link->conf.Vcc = 50;
	link->conf.IntType = INT_MEMORY_AND_IO;
	link->conf.IntType = INT_MEMORY_AND_IO;


	/* Register with Card Services */
	link->handle = p_dev;
	link->next = dev_list;
	p_dev->instance = link;
	dev_list = link;
	client_reg.dev_info = &dev_info;
	client_reg.Version = 0x0210;
	client_reg.event_callback_args.client_data = link;


	ret = pcmcia_register_client(&link->handle, &client_reg);
	link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;
	if (ret != CS_SUCCESS) {
	btuart_config(link);
		cs_error(link->handle, RegisterClient, ret);
		btuart_detach(link);
		return NULL;
	}


	return link;
	return 0;
}
}




static void btuart_detach(dev_link_t *link)
static void btuart_detach(struct pcmcia_device *p_dev)
{
{
	dev_link_t *link = dev_to_instance(p_dev);
	btuart_info_t *info = link->priv;
	btuart_info_t *info = link->priv;
	dev_link_t **linkp;
	int ret;

	/* Locate device structure */
	for (linkp = &dev_list; *linkp; linkp = &(*linkp)->next)
		if (*linkp == link)
			break;

	if (*linkp == NULL)
		return;


	if (link->state & DEV_CONFIG)
	if (link->state & DEV_CONFIG)
		btuart_release(link);
		btuart_release(link);


	if (link->handle) {
		ret = pcmcia_deregister_client(link->handle);
		if (ret != CS_SUCCESS)
			cs_error(link->handle, DeregisterClient, ret);
	}

	/* Unlink device structure, free bits */
	*linkp = link->next;

	kfree(info);
	kfree(info);
}
}


@@ -811,43 +777,29 @@ static void btuart_release(dev_link_t *link)
	link->state &= ~DEV_CONFIG;
	link->state &= ~DEV_CONFIG;
}
}



static int btuart_suspend(struct pcmcia_device *dev)
static int btuart_event(event_t event, int priority, event_callback_args_t *args)
{
{
	dev_link_t *link = args->client_data;
	dev_link_t *link = dev_to_instance(dev);
	btuart_info_t *info = link->priv;


	switch (event) {
	case CS_EVENT_CARD_REMOVAL:
		link->state &= ~DEV_PRESENT;
		if (link->state & DEV_CONFIG) {
			btuart_close(info);
			btuart_release(link);
		}
		break;
	case CS_EVENT_CARD_INSERTION:
		link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;
		btuart_config(link);
		break;
	case CS_EVENT_PM_SUSPEND:
	link->state |= DEV_SUSPEND;
	link->state |= DEV_SUSPEND;
		/* Fall through... */
	case CS_EVENT_RESET_PHYSICAL:
	if (link->state & DEV_CONFIG)
	if (link->state & DEV_CONFIG)
		pcmcia_release_configuration(link->handle);
		pcmcia_release_configuration(link->handle);
		break;

	case CS_EVENT_PM_RESUME:
	return 0;
}

static int btuart_resume(struct pcmcia_device *dev)
{
	dev_link_t *link = dev_to_instance(dev);

	link->state &= ~DEV_SUSPEND;
	link->state &= ~DEV_SUSPEND;
		/* Fall through... */
	case CS_EVENT_CARD_RESET:
	if (DEV_OK(link))
	if (DEV_OK(link))
		pcmcia_request_configuration(link->handle, &link->conf);
		pcmcia_request_configuration(link->handle, &link->conf);
		break;
	}


	return 0;
	return 0;
}
}



static struct pcmcia_device_id btuart_ids[] = {
static struct pcmcia_device_id btuart_ids[] = {
	/* don't use this driver. Use serial_cs + hci_uart instead */
	/* don't use this driver. Use serial_cs + hci_uart instead */
	PCMCIA_DEVICE_NULL
	PCMCIA_DEVICE_NULL
@@ -859,10 +811,11 @@ static struct pcmcia_driver btuart_driver = {
	.drv		= {
	.drv		= {
		.name	= "btuart_cs",
		.name	= "btuart_cs",
	},
	},
	.attach		= btuart_attach,
	.probe		= btuart_attach,
	.event		= btuart_event,
	.remove		= btuart_detach,
	.detach		= btuart_detach,
	.id_table	= btuart_ids,
	.id_table	= btuart_ids,
	.suspend	= btuart_suspend,
	.resume		= btuart_resume,
};
};


static int __init init_btuart_cs(void)
static int __init init_btuart_cs(void)
@@ -874,7 +827,6 @@ static int __init init_btuart_cs(void)
static void __exit exit_btuart_cs(void)
static void __exit exit_btuart_cs(void)
{
{
	pcmcia_unregister_driver(&btuart_driver);
	pcmcia_unregister_driver(&btuart_driver);
	BUG_ON(dev_list != NULL);
}
}


module_init(init_btuart_cs);
module_init(init_btuart_cs);
Loading