From 61e4f592cfdfb0ac5d07bbfa93df64d1d3452ff6 Mon Sep 17 00:00:00 2001 From: Dominik Brodowski Date: Tue, 6 Jul 2004 23:21:22 +0100 Subject: [PATCH] [PCMCIA] card insert / eject Patch from Dominik Brodowski Add two further attributes, "card_insert" and "card_eject". Reading these files will fail; but writing _anything_ non-empty to these files will execute an user insert/ejection request -- equivalent to "cardctl insert", "cardctl eject". To ensure proper error values to userspace, transform the return values from CS_ error codes to -E error codes. --- drivers/pcmcia/cs.c | 14 ++++++++------ drivers/pcmcia/ds.c | 4 ++-- drivers/pcmcia/socket_sysfs.c | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 42 insertions(+), 8 deletions(-) diff --git a/drivers/pcmcia/cs.c b/drivers/pcmcia/cs.c index ee0170e0f421c..dc502af16fc5f 100644 --- a/drivers/pcmcia/cs.c +++ b/drivers/pcmcia/cs.c @@ -2043,16 +2043,18 @@ int pcmcia_eject_card(struct pcmcia_socket *skt) down(&skt->skt_sem); do { if (!(skt->state & SOCKET_PRESENT)) { - ret = CS_NO_CARD; + ret = -ENODEV; break; } ret = send_event(skt, CS_EVENT_EJECTION_REQUEST, CS_EVENT_PRI_LOW); - if (ret != 0) + if (ret != 0) { + ret = -EINVAL; break; + } socket_remove(skt); - ret = CS_SUCCESS; + ret = 0; } while (0); up(&skt->skt_sem); @@ -2068,14 +2070,14 @@ int pcmcia_insert_card(struct pcmcia_socket *skt) down(&skt->skt_sem); do { if (skt->state & SOCKET_PRESENT) { - ret = CS_IN_USE; + ret = -EBUSY; break; } if (socket_insert(skt) == CS_NO_CARD) { - ret = CS_NO_CARD; + ret = -ENODEV; break; } - ret = CS_SUCCESS; + ret = 0; } while (0); up(&skt->skt_sem); diff --git a/drivers/pcmcia/ds.c b/drivers/pcmcia/ds.c index 9ecd8233c21e7..71592c71d53b0 100644 --- a/drivers/pcmcia/ds.c +++ b/drivers/pcmcia/ds.c @@ -973,10 +973,10 @@ static int ds_ioctl(struct inode * inode, struct file * file, ret = pcmcia_resume_card(s->parent); break; case DS_EJECT_CARD: - ret = pcmcia_eject_card(s->parent); + err = pcmcia_eject_card(s->parent); break; case DS_INSERT_CARD: - ret = pcmcia_insert_card(s->parent); + err = pcmcia_insert_card(s->parent); break; case DS_ACCESS_CONFIGURATION_REGISTER: if ((buf.conf_reg.Action == CS_WRITE) && !capable(CAP_SYS_ADMIN)) diff --git a/drivers/pcmcia/socket_sysfs.c b/drivers/pcmcia/socket_sysfs.c index 731eab483909c..6de9f5f6ffa3d 100644 --- a/drivers/pcmcia/socket_sysfs.c +++ b/drivers/pcmcia/socket_sysfs.c @@ -92,11 +92,43 @@ static ssize_t pccard_show_vcc(struct class_device *dev, char *buf) } static CLASS_DEVICE_ATTR(card_vcc, 0400, pccard_show_vcc, NULL); + +static ssize_t pccard_store_insert(struct class_device *dev, const char *buf, size_t count) +{ + ssize_t ret; + struct pcmcia_socket *s = to_socket(dev); + + if (!count) + return -EINVAL; + + ret = pcmcia_insert_card(s); + + return ret ? ret : count; +} +static CLASS_DEVICE_ATTR(card_insert, 0200, NULL, pccard_store_insert); + +static ssize_t pccard_store_eject(struct class_device *dev, const char *buf, size_t count) +{ + ssize_t ret; + struct pcmcia_socket *s = to_socket(dev); + + if (!count) + return -EINVAL; + + ret = pcmcia_eject_card(s); + + return ret ? ret : count; +} +static CLASS_DEVICE_ATTR(card_eject, 0200, NULL, pccard_store_eject); + + static struct class_device_attribute *pccard_socket_attributes[] = { &class_device_attr_card_type, &class_device_attr_card_voltage, &class_device_attr_card_vpp, &class_device_attr_card_vcc, + &class_device_attr_card_insert, + &class_device_attr_card_eject, NULL, }; -- 2.53.0