diff options
Diffstat (limited to 'arch/arm/mach-sa1100/ipaq-sleeve-dual.c')
-rw-r--r-- | arch/arm/mach-sa1100/ipaq-sleeve-dual.c | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/arch/arm/mach-sa1100/ipaq-sleeve-dual.c b/arch/arm/mach-sa1100/ipaq-sleeve-dual.c new file mode 100644 index 000000000000..dd4c3f756885 --- /dev/null +++ b/arch/arm/mach-sa1100/ipaq-sleeve-dual.c @@ -0,0 +1,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); |