summaryrefslogtreecommitdiff
path: root/arch/arm/mach-sa1100/ipaq-sleeve-dual.c
blob: dd4c3f756885e0cd384122086f65f03d782f7b6f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include <linux/ipaq-sleeve.h>
#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/slab.h>

struct ipaq_sleeve_dual_data {
	struct platform_device *skt;
};

static int ipaq_sleeve_dual_probe(struct device *dev)
{
	struct ipaq_option_device *idev = to_ipaq_option_device(dev);
	struct ipaq_sleeve_dual_data *cf;
	struct platform_device_info pinfo = {
		.parent = dev,
		.name = "sa11x0-pcmcia",
		.id = -1,
	};

	cf = devm_kzalloc(dev, sizeof(*cf), GFP_KERNEL);
	if (!cf)
		return -ENOMEM;

	pinfo.data = &idev->id;
	pinfo.size_data = sizeof(idev->id);

	cf->skt = platform_device_register_full(&pinfo);
	if (IS_ERR(cf->skt)) {
		dev_err(dev, "unable to register pcmcia device: %ld\n",
			PTR_ERR(cf->skt));
		return PTR_ERR(cf->skt);
	}

	dev_set_drvdata(dev, cf);

	return 0;
}

static int ipaq_sleeve_dual_remove(struct device *dev)
{
	struct ipaq_sleeve_dual_data *cf = dev_get_drvdata(dev);

	platform_device_unregister(cf->skt);

	return 0;
}

static const struct ipaq_option_id ipaq_sleeve_dual_ids[] = {
	{	/* Compaq dual PCMCIA sleeve */
		.vendor = 0x1125,
		.device = 0x0001,
	}, { },
};

static struct ipaq_option_driver ipaq_sleeve_dual = {
	.id_table = ipaq_sleeve_dual_ids,
	.driver = {
		.name = "ipaq-sleeve-dual",
		.probe = ipaq_sleeve_dual_probe,
		.remove = ipaq_sleeve_dual_remove,
	},
};

module_driver(ipaq_sleeve_dual, ipaq_option_driver_register,
	ipaq_option_driver_unregister);

MODULE_LICENSE("GPL");
MODULE_DEVICE_TABLE(ipaq, ipaq_sleeve_dual_ids);