11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * socket_sysfs.c -- most of socket-related sysfs output
31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This program is free software; you can redistribute it and/or modify
51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * it under the terms of the GNU General Public License version 2 as
61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * published by the Free Software Foundation.
71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * (C) 2003 - 2004		Dominik Brodowski
91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/module.h>
121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/moduleparam.h>
131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/init.h>
141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/kernel.h>
151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/string.h>
161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/major.h>
171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/errno.h>
181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/mm.h>
191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/interrupt.h>
201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/timer.h>
211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/ioport.h>
221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/delay.h>
231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/pm.h>
241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/device.h>
257fe908dd11e0c947bb72baa5b001d7abe5a420d5Dominik Brodowski#include <linux/mutex.h>
261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/irq.h>
271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <pcmcia/ss.h>
291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <pcmcia/cistpl.h>
301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <pcmcia/cisreg.h>
311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <pcmcia/ds.h>
321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "cs_internal.h"
331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define to_socket(_dev) container_of(_dev, struct pcmcia_socket, dev)
351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
36873733188a019acdb7fa253011cbdc0a8afd97f3Greg Kroah-Hartmanstatic ssize_t pccard_show_type(struct device *dev, struct device_attribute *attr,
37873733188a019acdb7fa253011cbdc0a8afd97f3Greg Kroah-Hartman				char *buf)
381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct pcmcia_socket *s = to_socket(dev);
401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!(s->state & SOCKET_PRESENT))
421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return -ENODEV;
43002dbb2d0d42b4a2c1eef2012c2fe7af48163b3cDominik Brodowski	if (s->state & SOCKET_CARDBUS)
441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return sprintf(buf, "32-bit\n");
45002dbb2d0d42b4a2c1eef2012c2fe7af48163b3cDominik Brodowski	return sprintf(buf, "16-bit\n");
461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
47873733188a019acdb7fa253011cbdc0a8afd97f3Greg Kroah-Hartmanstatic DEVICE_ATTR(card_type, 0444, pccard_show_type, NULL);
481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
49873733188a019acdb7fa253011cbdc0a8afd97f3Greg Kroah-Hartmanstatic ssize_t pccard_show_voltage(struct device *dev, struct device_attribute *attr,
50873733188a019acdb7fa253011cbdc0a8afd97f3Greg Kroah-Hartman				   char *buf)
511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct pcmcia_socket *s = to_socket(dev);
531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!(s->state & SOCKET_PRESENT))
551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return -ENODEV;
56002dbb2d0d42b4a2c1eef2012c2fe7af48163b3cDominik Brodowski	if (s->socket.Vcc)
57002dbb2d0d42b4a2c1eef2012c2fe7af48163b3cDominik Brodowski		return sprintf(buf, "%d.%dV\n", s->socket.Vcc / 10,
58002dbb2d0d42b4a2c1eef2012c2fe7af48163b3cDominik Brodowski			       s->socket.Vcc % 10);
59002dbb2d0d42b4a2c1eef2012c2fe7af48163b3cDominik Brodowski	return sprintf(buf, "X.XV\n");
601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
61873733188a019acdb7fa253011cbdc0a8afd97f3Greg Kroah-Hartmanstatic DEVICE_ATTR(card_voltage, 0444, pccard_show_voltage, NULL);
621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
63873733188a019acdb7fa253011cbdc0a8afd97f3Greg Kroah-Hartmanstatic ssize_t pccard_show_vpp(struct device *dev, struct device_attribute *attr,
64873733188a019acdb7fa253011cbdc0a8afd97f3Greg Kroah-Hartman			       char *buf)
651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct pcmcia_socket *s = to_socket(dev);
671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!(s->state & SOCKET_PRESENT))
681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return -ENODEV;
691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return sprintf(buf, "%d.%dV\n", s->socket.Vpp / 10, s->socket.Vpp % 10);
701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
71873733188a019acdb7fa253011cbdc0a8afd97f3Greg Kroah-Hartmanstatic DEVICE_ATTR(card_vpp, 0444, pccard_show_vpp, NULL);
721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
73873733188a019acdb7fa253011cbdc0a8afd97f3Greg Kroah-Hartmanstatic ssize_t pccard_show_vcc(struct device *dev, struct device_attribute *attr,
74873733188a019acdb7fa253011cbdc0a8afd97f3Greg Kroah-Hartman			       char *buf)
751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct pcmcia_socket *s = to_socket(dev);
771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!(s->state & SOCKET_PRESENT))
781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return -ENODEV;
791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return sprintf(buf, "%d.%dV\n", s->socket.Vcc / 10, s->socket.Vcc % 10);
801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
81873733188a019acdb7fa253011cbdc0a8afd97f3Greg Kroah-Hartmanstatic DEVICE_ATTR(card_vcc, 0444, pccard_show_vcc, NULL);
821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
84873733188a019acdb7fa253011cbdc0a8afd97f3Greg Kroah-Hartmanstatic ssize_t pccard_store_insert(struct device *dev, struct device_attribute *attr,
85873733188a019acdb7fa253011cbdc0a8afd97f3Greg Kroah-Hartman				   const char *buf, size_t count)
861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct pcmcia_socket *s = to_socket(dev);
881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!count)
901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return -EINVAL;
911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
92f971dbd5da4e2fbf756d07b938a9c65a9c75178bDominik Brodowski	pcmcia_parse_uevents(s, PCMCIA_UEVENT_INSERT);
931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
94f971dbd5da4e2fbf756d07b938a9c65a9c75178bDominik Brodowski	return count;
951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
96873733188a019acdb7fa253011cbdc0a8afd97f3Greg Kroah-Hartmanstatic DEVICE_ATTR(card_insert, 0200, NULL, pccard_store_insert);
971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
98db1019ca0548b263989bc98900eaf15107e533adDominik Brodowski
99873733188a019acdb7fa253011cbdc0a8afd97f3Greg Kroah-Hartmanstatic ssize_t pccard_show_card_pm_state(struct device *dev,
100873733188a019acdb7fa253011cbdc0a8afd97f3Greg Kroah-Hartman					 struct device_attribute *attr,
101873733188a019acdb7fa253011cbdc0a8afd97f3Greg Kroah-Hartman					 char *buf)
102db1019ca0548b263989bc98900eaf15107e533adDominik Brodowski{
103db1019ca0548b263989bc98900eaf15107e533adDominik Brodowski	struct pcmcia_socket *s = to_socket(dev);
104db1019ca0548b263989bc98900eaf15107e533adDominik Brodowski	return sprintf(buf, "%s\n", s->state & SOCKET_SUSPEND ? "off" : "on");
105db1019ca0548b263989bc98900eaf15107e533adDominik Brodowski}
106db1019ca0548b263989bc98900eaf15107e533adDominik Brodowski
107873733188a019acdb7fa253011cbdc0a8afd97f3Greg Kroah-Hartmanstatic ssize_t pccard_store_card_pm_state(struct device *dev,
108873733188a019acdb7fa253011cbdc0a8afd97f3Greg Kroah-Hartman					  struct device_attribute *attr,
109873733188a019acdb7fa253011cbdc0a8afd97f3Greg Kroah-Hartman					  const char *buf, size_t count)
110db1019ca0548b263989bc98900eaf15107e533adDominik Brodowski{
111db1019ca0548b263989bc98900eaf15107e533adDominik Brodowski	struct pcmcia_socket *s = to_socket(dev);
112f971dbd5da4e2fbf756d07b938a9c65a9c75178bDominik Brodowski	ssize_t ret = count;
113db1019ca0548b263989bc98900eaf15107e533adDominik Brodowski
114db1019ca0548b263989bc98900eaf15107e533adDominik Brodowski	if (!count)
115db1019ca0548b263989bc98900eaf15107e533adDominik Brodowski		return -EINVAL;
116db1019ca0548b263989bc98900eaf15107e533adDominik Brodowski
117f971dbd5da4e2fbf756d07b938a9c65a9c75178bDominik Brodowski	if (!strncmp(buf, "off", 3))
118f971dbd5da4e2fbf756d07b938a9c65a9c75178bDominik Brodowski		pcmcia_parse_uevents(s, PCMCIA_UEVENT_SUSPEND);
119f971dbd5da4e2fbf756d07b938a9c65a9c75178bDominik Brodowski	else {
120f971dbd5da4e2fbf756d07b938a9c65a9c75178bDominik Brodowski		if (!strncmp(buf, "on", 2))
121f971dbd5da4e2fbf756d07b938a9c65a9c75178bDominik Brodowski			pcmcia_parse_uevents(s, PCMCIA_UEVENT_RESUME);
122f971dbd5da4e2fbf756d07b938a9c65a9c75178bDominik Brodowski		else
123f971dbd5da4e2fbf756d07b938a9c65a9c75178bDominik Brodowski			ret = -EINVAL;
124f971dbd5da4e2fbf756d07b938a9c65a9c75178bDominik Brodowski	}
125db1019ca0548b263989bc98900eaf15107e533adDominik Brodowski
126f971dbd5da4e2fbf756d07b938a9c65a9c75178bDominik Brodowski	return ret;
127db1019ca0548b263989bc98900eaf15107e533adDominik Brodowski}
128873733188a019acdb7fa253011cbdc0a8afd97f3Greg Kroah-Hartmanstatic DEVICE_ATTR(card_pm_state, 0644, pccard_show_card_pm_state, pccard_store_card_pm_state);
129db1019ca0548b263989bc98900eaf15107e533adDominik Brodowski
130873733188a019acdb7fa253011cbdc0a8afd97f3Greg Kroah-Hartmanstatic ssize_t pccard_store_eject(struct device *dev,
131873733188a019acdb7fa253011cbdc0a8afd97f3Greg Kroah-Hartman				  struct device_attribute *attr,
132873733188a019acdb7fa253011cbdc0a8afd97f3Greg Kroah-Hartman				  const char *buf, size_t count)
1331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
1341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct pcmcia_socket *s = to_socket(dev);
1351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!count)
1371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return -EINVAL;
1381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
139f971dbd5da4e2fbf756d07b938a9c65a9c75178bDominik Brodowski	pcmcia_parse_uevents(s, PCMCIA_UEVENT_EJECT);
1401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
141f971dbd5da4e2fbf756d07b938a9c65a9c75178bDominik Brodowski	return count;
1421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
143873733188a019acdb7fa253011cbdc0a8afd97f3Greg Kroah-Hartmanstatic DEVICE_ATTR(card_eject, 0200, NULL, pccard_store_eject);
1441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
146873733188a019acdb7fa253011cbdc0a8afd97f3Greg Kroah-Hartmanstatic ssize_t pccard_show_irq_mask(struct device *dev,
147873733188a019acdb7fa253011cbdc0a8afd97f3Greg Kroah-Hartman				    struct device_attribute *attr,
148873733188a019acdb7fa253011cbdc0a8afd97f3Greg Kroah-Hartman				    char *buf)
1491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
1501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct pcmcia_socket *s = to_socket(dev);
1511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return sprintf(buf, "0x%04x\n", s->irq_mask);
1521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
1531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
154873733188a019acdb7fa253011cbdc0a8afd97f3Greg Kroah-Hartmanstatic ssize_t pccard_store_irq_mask(struct device *dev,
155873733188a019acdb7fa253011cbdc0a8afd97f3Greg Kroah-Hartman				     struct device_attribute *attr,
156873733188a019acdb7fa253011cbdc0a8afd97f3Greg Kroah-Hartman				     const char *buf, size_t count)
1571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
1581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ssize_t ret;
1591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct pcmcia_socket *s = to_socket(dev);
1601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	u32 mask;
1611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!count)
1631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return -EINVAL;
1641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1659fea84f46a821aa1ff2d034ffda8ad33bff48015Dominik Brodowski	ret = sscanf(buf, "0x%x\n", &mask);
1661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (ret == 1) {
16864d8d46f5f501a19aec4db7ff93faf1b831d05edDominik Brodowski		mutex_lock(&s->ops_mutex);
1691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		s->irq_mask &= mask;
17064d8d46f5f501a19aec4db7ff93faf1b831d05edDominik Brodowski		mutex_unlock(&s->ops_mutex);
1711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ret = 0;
1721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
1731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return ret ? ret : count;
1751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
176873733188a019acdb7fa253011cbdc0a8afd97f3Greg Kroah-Hartmanstatic DEVICE_ATTR(card_irq_mask, 0600, pccard_show_irq_mask, pccard_store_irq_mask);
1771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
179873733188a019acdb7fa253011cbdc0a8afd97f3Greg Kroah-Hartmanstatic ssize_t pccard_show_resource(struct device *dev,
180873733188a019acdb7fa253011cbdc0a8afd97f3Greg Kroah-Hartman				    struct device_attribute *attr, char *buf)
1811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
1821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct pcmcia_socket *s = to_socket(dev);
1831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return sprintf(buf, "%s\n", s->resource_setup_done ? "yes" : "no");
1841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
1851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
186873733188a019acdb7fa253011cbdc0a8afd97f3Greg Kroah-Hartmanstatic ssize_t pccard_store_resource(struct device *dev,
187873733188a019acdb7fa253011cbdc0a8afd97f3Greg Kroah-Hartman				     struct device_attribute *attr,
188873733188a019acdb7fa253011cbdc0a8afd97f3Greg Kroah-Hartman				     const char *buf, size_t count)
1891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
1901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	struct pcmcia_socket *s = to_socket(dev);
1911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
1921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (!count)
1931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return -EINVAL;
1941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
19500ce99ff506a17882747a7d6874e3f5206a99043Dominik Brodowski	mutex_lock(&s->ops_mutex);
196e2f0b5344161dabfab102ac0a54f330f61477972Dominik Brodowski	if (!s->resource_setup_done)
1971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		s->resource_setup_done = 1;
19800ce99ff506a17882747a7d6874e3f5206a99043Dominik Brodowski	mutex_unlock(&s->ops_mutex);
1991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
200af461fc1875b6ec18e23b5f670af36c4ed35c84eDominik Brodowski	pcmcia_parse_uevents(s, PCMCIA_UEVENT_REQUERY);
2011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return count;
2031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
204873733188a019acdb7fa253011cbdc0a8afd97f3Greg Kroah-Hartmanstatic DEVICE_ATTR(available_resources_setup_done, 0600, pccard_show_resource, pccard_store_resource);
2051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2064356d73d028ad0726cfaf31ad30c5d28fcd98795David Brownellstatic struct attribute *pccard_socket_attributes[] = {
2074356d73d028ad0726cfaf31ad30c5d28fcd98795David Brownell	&dev_attr_card_type.attr,
2084356d73d028ad0726cfaf31ad30c5d28fcd98795David Brownell	&dev_attr_card_voltage.attr,
2094356d73d028ad0726cfaf31ad30c5d28fcd98795David Brownell	&dev_attr_card_vpp.attr,
2104356d73d028ad0726cfaf31ad30c5d28fcd98795David Brownell	&dev_attr_card_vcc.attr,
2114356d73d028ad0726cfaf31ad30c5d28fcd98795David Brownell	&dev_attr_card_insert.attr,
2124356d73d028ad0726cfaf31ad30c5d28fcd98795David Brownell	&dev_attr_card_pm_state.attr,
2134356d73d028ad0726cfaf31ad30c5d28fcd98795David Brownell	&dev_attr_card_eject.attr,
2144356d73d028ad0726cfaf31ad30c5d28fcd98795David Brownell	&dev_attr_card_irq_mask.attr,
2154356d73d028ad0726cfaf31ad30c5d28fcd98795David Brownell	&dev_attr_available_resources_setup_done.attr,
2161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	NULL,
2171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
2181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2194356d73d028ad0726cfaf31ad30c5d28fcd98795David Brownellstatic const struct attribute_group socket_attrs = {
2204356d73d028ad0726cfaf31ad30c5d28fcd98795David Brownell	.attrs = pccard_socket_attributes,
2214356d73d028ad0726cfaf31ad30c5d28fcd98795David Brownell};
2224356d73d028ad0726cfaf31ad30c5d28fcd98795David Brownell
2234356d73d028ad0726cfaf31ad30c5d28fcd98795David Brownellint pccard_sysfs_add_socket(struct device *dev)
2241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
2256e7b51a733fde86d3be748543215a69da04d5bb7Dominik Brodowski	return sysfs_create_group(&dev->kobj, &socket_attrs);
2261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
2271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2284356d73d028ad0726cfaf31ad30c5d28fcd98795David Brownellvoid pccard_sysfs_remove_socket(struct device *dev)
2291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
2304356d73d028ad0726cfaf31ad30c5d28fcd98795David Brownell	sysfs_remove_group(&dev->kobj, &socket_attrs);
2311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
232