提交 542a086a 编写于 作者: L Linus Torvalds

Merge tag 'driver-core-3.12-rc1' of...

Merge tag 'driver-core-3.12-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core

Pull driver core patches from Greg KH:
 "Here's the big driver core pull request for 3.12-rc1.

  Lots of tiny changes here fixing up the way sysfs attributes are
  created, to try to make drivers simpler, and fix a whole class race
  conditions with creations of device attributes after the device was
  announced to userspace.

  All the various pieces are acked by the different subsystem
  maintainers"

* tag 'driver-core-3.12-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core: (119 commits)
  firmware loader: fix pending_fw_head list corruption
  drivers/base/memory.c: introduce help macro to_memory_block
  dynamic debug: line queries failing due to uninitialized local variable
  sysfs: sysfs_create_groups returns a value.
  debugfs: provide debugfs_create_x64() when disabled
  rbd: convert bus code to use bus_groups
  firmware: dcdbas: use binary attribute groups
  sysfs: add sysfs_create/remove_groups for when SYSFS is not enabled
  driver core: add #include <linux/sysfs.h> to core files.
  HID: convert bus code to use dev_groups
  Input: serio: convert bus code to use drv_groups
  Input: gameport: convert bus code to use drv_groups
  driver core: firmware: use __ATTR_RW()
  driver core: core: use DEVICE_ATTR_RO
  driver core: bus: use DRIVER_ATTR_WO()
  driver core: create write-only attribute macros for devices and drivers
  sysfs: create __ATTR_WO()
  driver-core: platform: convert bus code to use dev_groups
  workqueue: convert bus code to use dev_groups
  MEI: convert bus code to use dev_groups
  ...
...@@ -182,8 +182,8 @@ Documentation/DocBook/ 디렉토리 내에서 만들어지며 PDF, Postscript, H ...@@ -182,8 +182,8 @@ Documentation/DocBook/ 디렉토리 내에서 만들어지며 PDF, Postscript, H
프로젝트를 봐야 한다. 프로젝트를 봐야 한다.
http://kernelnewbies.org http://kernelnewbies.org
그곳은 거의 모든 종류의 기본적인 커널 개발 질문들(질문하기 전에 먼저 그곳은 거의 모든 종류의 기본적인 커널 개발 질문들(질문하기 전에 먼저
아카이브를 찾아봐라. 과거에 이미 답변되었을 수도 있다)을 할있는 도움이 아카이브를 찾아봐라. 과거에 이미 답변되었을 수도 있다)을 할있는 도움이
될만한 메일링 리스트가 있다. 또한 실시간으로 질문 할수 있는 IRC 채널도 될만한 메일링 리스트가 있다. 또한 실시간으로 질문 할 수 있는 IRC 채널도
가지고 있으며 리눅스 커널 개발을 배우는 데 유용한 문서들을 보유하고 있다. 가지고 있으며 리눅스 커널 개발을 배우는 데 유용한 문서들을 보유하고 있다.
웹사이트는 코드구성, 서브시스템들, 그리고 현재 프로젝트들 웹사이트는 코드구성, 서브시스템들, 그리고 현재 프로젝트들
...@@ -245,7 +245,7 @@ Documentation/DocBook/ 디렉토리 내에서 만들어지며 PDF, Postscript, H ...@@ -245,7 +245,7 @@ Documentation/DocBook/ 디렉토리 내에서 만들어지며 PDF, Postscript, H
것을 기억해라. 왜냐하면 변경이 자체내에서만 발생하고 추가된 코드가 것을 기억해라. 왜냐하면 변경이 자체내에서만 발생하고 추가된 코드가
드라이버 외부의 다른 부분에는 영향을 주지 않으므로 그런 변경은 드라이버 외부의 다른 부분에는 영향을 주지 않으므로 그런 변경은
회귀(역자주: 이전에는 존재하지 않았지만 새로운 기능추가나 변경으로 인해 회귀(역자주: 이전에는 존재하지 않았지만 새로운 기능추가나 변경으로 인해
생겨난 버그)를 일으킬 만한 위험을 가지고 있지 않기 때문이다. -rc1이 생겨난 버그)를 일으킬 만한 위험을 가지고 있지 않기 때문이다. -rc1이
배포된 이후에 git를 사용하여 패치들을 Linus에게 보낼수 있지만 패치들은 배포된 이후에 git를 사용하여 패치들을 Linus에게 보낼수 있지만 패치들은
공식적인 메일링 리스트로 보내서 검토를 받을 필요가 있다. 공식적인 메일링 리스트로 보내서 검토를 받을 필요가 있다.
- 새로운 -rc는 Linus가 현재 git tree가 테스트 하기에 충분히 안정된 상태에 - 새로운 -rc는 Linus가 현재 git tree가 테스트 하기에 충분히 안정된 상태에
...@@ -455,7 +455,7 @@ bugme-janitor 메일링 리스트(bugzilla에 모든 변화들이 여기서 메 ...@@ -455,7 +455,7 @@ bugme-janitor 메일링 리스트(bugzilla에 모든 변화들이 여기서 메
- 의견 - 의견
- 변경을 위한 요구 - 변경을 위한 요구
- 당위성을 위한 요구 - 당위성을 위한 요구
- 고요 - 침묵
기억하라. 이것들은 여러분의 패치가 커널로 들어가기 위한 과정이다. 여러분의 기억하라. 이것들은 여러분의 패치가 커널로 들어가기 위한 과정이다. 여러분의
패치들은 비판과 다른 의견을 받을 수 있고 그것들을 기술적인 레벨로 평가하고 패치들은 비판과 다른 의견을 받을 수 있고 그것들을 기술적인 레벨로 평가하고
...@@ -472,7 +472,7 @@ bugme-janitor 메일링 리스트(bugzilla에 모든 변화들이 여기서 메 ...@@ -472,7 +472,7 @@ bugme-janitor 메일링 리스트(bugzilla에 모든 변화들이 여기서 메
가능한한 가장 좋은 기술적인 해답을 찾고 있는 커뮤니티에서는 항상 가능한한 가장 좋은 기술적인 해답을 찾고 있는 커뮤니티에서는 항상
어떤 패치가 얼마나 좋은지에 관하여 다른 의견들이 있을 수 있다. 여러분은 어떤 패치가 얼마나 좋은지에 관하여 다른 의견들이 있을 수 있다. 여러분은
협조적이어야 하고 기꺼이 여러분의 생각을 커널 내에 맞추어야 한다. 아니면 협조적이어야 하고 기꺼이 여러분의 생각을 커널 내에 맞추어야 한다. 아니면
적어도 여러분의 것이 가치있다는 것을 명하여야 한다. 잘못된 것도 여러분이 적어도 여러분의 것이 가치있다는 것을 명하여야 한다. 잘못된 것도 여러분이
올바른 방향의 해결책으로 이끌어갈 의지가 있다면 받아들여질 것이라는 점을 올바른 방향의 해결책으로 이끌어갈 의지가 있다면 받아들여질 것이라는 점을
기억하라. 기억하라.
...@@ -488,21 +488,21 @@ bugme-janitor 메일링 리스트(bugzilla에 모든 변화들이 여기서 메 ...@@ -488,21 +488,21 @@ bugme-janitor 메일링 리스트(bugzilla에 모든 변화들이 여기서 메
커널 커뮤니티는 가장 전통적인 회사의 개발 환경과는 다르다. 여기에 여러분들의 커널 커뮤니티는 가장 전통적인 회사의 개발 환경과는 다르다. 여기에 여러분들의
문제를 피하기 위한 목록이 있다. 문제를 피하기 위한 목록이 있다.
여러분들이 제안한 변경들에 관하여 말할 때 좋은 것들 : 여러분들이 제안한 변경들에 관하여 말할 때 좋은 것들 :
- "이것은 여러 문제들을 해합니다." - "이것은 여러 문제들을 해합니다."
- "이것은 2000 라인의 코드를 제거합니다." - "이것은 2000 라인의 코드를 줄입니다."
- "이것은 내가 말하려는 것에 관해 설명하는 패치입니다." - "이것은 내가 말하려는 것에 관해 설명하는 패치입니다."
- "나는 5개의 다른 아키텍쳐에서 그것을 테스트했슴으로..." - "나는 5개의 다른 아키텍쳐에서 그것을 테스트 했으므로..."
- "여기에 일련의 작은 패치들이 있슴음로..." - "여기에 일련의 작은 패치들이 있으므로..."
- "이것은 일반적인 머신에서 성능을 향상시킴으로..." - "이것은 일반적인 머신에서 성능을 향상으로..."
여러분들이 말할 때 피해야 할 좋지 않은 것들 : 여러분들이 말할 때 피해야 할 좋지 않은 것들 :
- "우리를 그것을 AIT/ptx/Solaris에서 이러한 방법으로 했다. 그러므로 그것은 좋은 것임에 틀립없다..." - "우리는 그것을 AIX/ptx/Solaris에서 이러한 방법으로 했다. 그러므로 그것은 좋은 것임에 틀림없다..."
- "나는 20년동안 이것을 해왔다. 그러므로..." - "나는 20년동안 이것을 해왔다. 그러므로..."
- "이것은 돈을 벌기위해 나의 회사가 필요로 하는 것이다." - "이것은 돈을 벌기위해 나의 회사가 필요로 하는 것이다."
- "이것은 우리의 엔터프라이즈 상품 라인을 위한 것이다." - "이것은 우리의 엔터프라이즈 상품 라인을 위한 것이다."
- "여기에 나의 생각을 말하고 있는 1000 페이지 설계 문서가 있다." - "여기에 나의 생각을 말하고 있는 1000 페이지 설계 문서가 있다."
- "나는 6달동안 이것을 했으니..." - "나는 6달동안 이것을 했으니..."
- "여기에 5000라인 짜리 패치가 있으니..." - "여기에 5000 라인 짜리 패치가 있으니..."
- "나는 현재 뒤죽박죽인 것을 재작성했다. 그리고 여기에..." - "나는 현재 뒤죽박죽인 것을 재작성했다. 그리고 여기에..."
- "나는 마감시한을 가지고 있으므로 이 패치는 지금 적용될 필요가 있다." - "나는 마감시한을 가지고 있으므로 이 패치는 지금 적용될 필요가 있다."
...@@ -574,6 +574,7 @@ Pat이라는 이름을 가진 여자가 있을 수도 있는 것이다. 리눅 ...@@ -574,6 +574,7 @@ Pat이라는 이름을 가진 여자가 있을 수도 있는 것이다. 리눅
또한 완성되지 않았고 "나중에 수정될 것이다." 와 같은 것들을 포함하는 또한 완성되지 않았고 "나중에 수정될 것이다." 와 같은 것들을 포함하는
패치들은 받아들여지지 않을 것이라는 점을 유념하라. 패치들은 받아들여지지 않을 것이라는 점을 유념하라.
변경을 정당화해라 변경을 정당화해라
----------------- -----------------
......
...@@ -106,12 +106,12 @@ Greg Kroah-Hartman <greg@kroah.com> ...@@ -106,12 +106,12 @@ Greg Kroah-Hartman <greg@kroah.com>
--------------------------------- ---------------------------------
리눅스 커널 드라이버를 계속해서 메인 커널 트리에 반영하지 않고 리눅스 커널 드라이버를 계속해서 메인 커널 트리에 반영하지 않고
유지보수하려고 하는 사들과 이 문제를 논의하게 되면 훨씬 더 유지보수하려고 하는 사들과 이 문제를 논의하게 되면 훨씬 더
"논란의 여지가 많은" 주제가 될 것이다. "논란의 여지가 많은" 주제가 될 것이다.
리눅스 커널 개발은 끊임없이 빠른 속도로 이루어지고 있으며 결코 리눅스 커널 개발은 끊임없이 빠른 속도로 이루어지고 있으며 결코
느슨해진 적이 없다. 커널 개발자들이 현재 인터페이스들에서 버그를 느슨해진 적이 없다. 커널 개발자들이 현재 인터페이스들에서 버그를
발견하거나 무엇인가 할수 있는 더 좋은 방법을 찾게 되었다고 하자. 발견하거나 무엇인가 할 수 있는 더 좋은 방법을 찾게 되었다고 하자.
그들이 발견한 것을 실행한다면 아마도 더 잘 동작하도록 현재 인터페이스들을 그들이 발견한 것을 실행한다면 아마도 더 잘 동작하도록 현재 인터페이스들을
수정하게 될 것이다. 그들이 그런 일을 하게되면 함수 이름들은 변하게 되고, 수정하게 될 것이다. 그들이 그런 일을 하게되면 함수 이름들은 변하게 되고,
구조체들은 늘어나거나 줄어들게 되고, 함수 파라미터들은 재작업될 것이다. 구조체들은 늘어나거나 줄어들게 되고, 함수 파라미터들은 재작업될 것이다.
...@@ -174,7 +174,7 @@ GPL을 따르는 배포 드라이버에 관해 얘기하고 있다는 것을 상 ...@@ -174,7 +174,7 @@ GPL을 따르는 배포 드라이버에 관해 얘기하고 있다는 것을 상
동작하는 것을 보장한다. 동작하는 것을 보장한다.
메인 커널 트리에 여러분의 드라이버를 반영하면 얻게 되는 장점들은 다음과 같다. 메인 커널 트리에 여러분의 드라이버를 반영하면 얻게 되는 장점들은 다음과 같다.
- 관리 드는 비용(원래 개발자의)은 줄어줄면서 드라이버의 질은 향상될 것이다. - 관리 드는 비용(원래 개발자의)은 줄어줄면서 드라이버의 질은 향상될 것이다.
- 다른 개발자들이 여러분의 드라이버에 기능들을 추가 할 것이다. - 다른 개발자들이 여러분의 드라이버에 기능들을 추가 할 것이다.
- 다른 사람들은 여러분의 드라이버에 버그를 발견하고 수정할 것이다. - 다른 사람들은 여러분의 드라이버에 버그를 발견하고 수정할 것이다.
- 다른 사람들은 여러분의 드라이버의 개선점을 찾을 줄 것이다. - 다른 사람들은 여러분의 드라이버의 개선점을 찾을 줄 것이다.
......
...@@ -2064,8 +2064,7 @@ config KEXEC ...@@ -2064,8 +2064,7 @@ config KEXEC
It is an ongoing process to be certain the hardware in a machine It is an ongoing process to be certain the hardware in a machine
is properly shutdown, so do not be surprised if this code does not is properly shutdown, so do not be surprised if this code does not
initially work for you. It may help to enable device hotplugging initially work for you.
support.
config ATAGS_PROC config ATAGS_PROC
bool "Export atags in procfs" bool "Export atags in procfs"
......
...@@ -565,9 +565,9 @@ config KEXEC ...@@ -565,9 +565,9 @@ config KEXEC
It is an ongoing process to be certain the hardware in a machine It is an ongoing process to be certain the hardware in a machine
is properly shutdown, so do not be surprised if this code does not is properly shutdown, so do not be surprised if this code does not
initially work for you. It may help to enable device hotplugging initially work for you. As of this writing the exact hardware
support. As of this writing the exact hardware interface is interface is strongly in flux, so no good recommendation can be
strongly in flux, so no good recommendation can be made. made.
config CRASH_DUMP config CRASH_DUMP
bool "kernel crash dumps" bool "kernel crash dumps"
......
...@@ -2305,9 +2305,9 @@ config KEXEC ...@@ -2305,9 +2305,9 @@ config KEXEC
It is an ongoing process to be certain the hardware in a machine It is an ongoing process to be certain the hardware in a machine
is properly shutdown, so do not be surprised if this code does not is properly shutdown, so do not be surprised if this code does not
initially work for you. It may help to enable device hotplugging initially work for you. As of this writing the exact hardware
support. As of this writing the exact hardware interface is interface is strongly in flux, so no good recommendation can be
strongly in flux, so no good recommendation can be made. made.
config CRASH_DUMP config CRASH_DUMP
bool "Kernel crash dumps" bool "Kernel crash dumps"
......
...@@ -1335,8 +1335,9 @@ static ssize_t store_kill(struct device *dev, struct device_attribute *attr, ...@@ -1335,8 +1335,9 @@ static ssize_t store_kill(struct device *dev, struct device_attribute *attr,
return len; return len;
} }
static DEVICE_ATTR(kill, S_IWUSR, NULL, store_kill);
static ssize_t show_ntcs(struct device *cd, struct device_attribute *attr, static ssize_t ntcs_show(struct device *cd, struct device_attribute *attr,
char *buf) char *buf)
{ {
struct vpe *vpe = get_vpe(tclimit); struct vpe *vpe = get_vpe(tclimit);
...@@ -1344,7 +1345,7 @@ static ssize_t show_ntcs(struct device *cd, struct device_attribute *attr, ...@@ -1344,7 +1345,7 @@ static ssize_t show_ntcs(struct device *cd, struct device_attribute *attr,
return sprintf(buf, "%d\n", vpe->ntcs); return sprintf(buf, "%d\n", vpe->ntcs);
} }
static ssize_t store_ntcs(struct device *dev, struct device_attribute *attr, static ssize_t ntcs_store(struct device *dev, struct device_attribute *attr,
const char *buf, size_t len) const char *buf, size_t len)
{ {
struct vpe *vpe = get_vpe(tclimit); struct vpe *vpe = get_vpe(tclimit);
...@@ -1365,12 +1366,14 @@ static ssize_t store_ntcs(struct device *dev, struct device_attribute *attr, ...@@ -1365,12 +1366,14 @@ static ssize_t store_ntcs(struct device *dev, struct device_attribute *attr,
out_einval: out_einval:
return -EINVAL; return -EINVAL;
} }
static DEVICE_ATTR_RW(ntcs);
static struct device_attribute vpe_class_attributes[] = { static struct attribute vpe_attrs[] = {
__ATTR(kill, S_IWUSR, NULL, store_kill), &dev_attr_kill.attr,
__ATTR(ntcs, S_IRUGO | S_IWUSR, show_ntcs, store_ntcs), &dev_attr_ntcs.attr,
{} NULL,
}; };
ATTRIBUTE_GROUPS(vpe);
static void vpe_device_release(struct device *cd) static void vpe_device_release(struct device *cd)
{ {
...@@ -1381,7 +1384,7 @@ struct class vpe_class = { ...@@ -1381,7 +1384,7 @@ struct class vpe_class = {
.name = "vpe", .name = "vpe",
.owner = THIS_MODULE, .owner = THIS_MODULE,
.dev_release = vpe_device_release, .dev_release = vpe_device_release,
.dev_attrs = vpe_class_attributes, .dev_groups = vpe_groups,
}; };
struct device vpe_device; struct device vpe_device;
......
...@@ -369,9 +369,9 @@ config KEXEC ...@@ -369,9 +369,9 @@ config KEXEC
It is an ongoing process to be certain the hardware in a machine It is an ongoing process to be certain the hardware in a machine
is properly shutdown, so do not be surprised if this code does not is properly shutdown, so do not be surprised if this code does not
initially work for you. It may help to enable device hotplugging initially work for you. As of this writing the exact hardware
support. As of this writing the exact hardware interface is interface is strongly in flux, so no good recommendation can be
strongly in flux, so no good recommendation can be made. made.
config CRASH_DUMP config CRASH_DUMP
bool "Build a kdump crash kernel" bool "Build a kdump crash kernel"
......
...@@ -643,9 +643,9 @@ config KEXEC ...@@ -643,9 +643,9 @@ config KEXEC
It is an ongoing process to be certain the hardware in a machine It is an ongoing process to be certain the hardware in a machine
is properly shutdown, so do not be surprised if this code does not is properly shutdown, so do not be surprised if this code does not
initially work for you. It may help to enable device hotplugging initially work for you. As of this writing the exact hardware
support. As of this writing the exact hardware interface is interface is strongly in flux, so no good recommendation can be
strongly in flux, so no good recommendation can be made. made.
config CRASH_DUMP config CRASH_DUMP
bool "kernel crash dumps (EXPERIMENTAL)" bool "kernel crash dumps (EXPERIMENTAL)"
......
...@@ -89,9 +89,6 @@ static inline const struct cpumask *cpumask_of_node(int node) ...@@ -89,9 +89,6 @@ static inline const struct cpumask *cpumask_of_node(int node)
#define topology_core_id(cpu) (cpu) #define topology_core_id(cpu) (cpu)
#define topology_core_cpumask(cpu) ((void)(cpu), cpu_online_mask) #define topology_core_cpumask(cpu) ((void)(cpu), cpu_online_mask)
#define topology_thread_cpumask(cpu) cpumask_of(cpu) #define topology_thread_cpumask(cpu) cpumask_of(cpu)
/* indicates that pointers to the topology struct cpumask maps are valid */
#define arch_provides_topology_pointers yes
#endif #endif
#endif /* _ASM_TILE_TOPOLOGY_H */ #endif /* _ASM_TILE_TOPOLOGY_H */
...@@ -1628,9 +1628,9 @@ config KEXEC ...@@ -1628,9 +1628,9 @@ config KEXEC
It is an ongoing process to be certain the hardware in a machine It is an ongoing process to be certain the hardware in a machine
is properly shutdown, so do not be surprised if this code does not is properly shutdown, so do not be surprised if this code does not
initially work for you. It may help to enable device hotplugging initially work for you. As of this writing the exact hardware
support. As of this writing the exact hardware interface is interface is strongly in flux, so no good recommendation can be
strongly in flux, so no good recommendation can be made. made.
config CRASH_DUMP config CRASH_DUMP
bool "kernel crash dumps" bool "kernel crash dumps"
......
...@@ -124,9 +124,6 @@ extern const struct cpumask *cpu_coregroup_mask(int cpu); ...@@ -124,9 +124,6 @@ extern const struct cpumask *cpu_coregroup_mask(int cpu);
#define topology_core_id(cpu) (cpu_data(cpu).cpu_core_id) #define topology_core_id(cpu) (cpu_data(cpu).cpu_core_id)
#define topology_core_cpumask(cpu) (per_cpu(cpu_core_map, cpu)) #define topology_core_cpumask(cpu) (per_cpu(cpu_core_map, cpu))
#define topology_thread_cpumask(cpu) (per_cpu(cpu_sibling_map, cpu)) #define topology_thread_cpumask(cpu) (per_cpu(cpu_sibling_map, cpu))
/* indicates that pointers to the topology cpumask_t maps are valid */
#define arch_provides_topology_pointers yes
#endif #endif
static inline void arch_fix_phys_package_id(int num, u32 slot) static inline void arch_fix_phys_package_id(int num, u32 slot)
......
...@@ -51,20 +51,14 @@ static ssize_t show_yoffset(struct device *dev, ...@@ -51,20 +51,14 @@ static ssize_t show_yoffset(struct device *dev,
} }
static DEVICE_ATTR(yoffset, S_IRUGO, show_yoffset, NULL); static DEVICE_ATTR(yoffset, S_IRUGO, show_yoffset, NULL);
static ssize_t show_image(struct file *file, struct kobject *kobj, static ssize_t image_read(struct file *file, struct kobject *kobj,
struct bin_attribute *attr, char *buf, loff_t off, size_t count) struct bin_attribute *attr, char *buf, loff_t off, size_t count)
{ {
memcpy(buf, attr->private + off, count); memcpy(buf, attr->private + off, count);
return count; return count;
} }
static struct bin_attribute image_attr = { static BIN_ATTR_RO(image, 0); /* size gets filled in later */
.attr = {
.name = "image",
.mode = S_IRUGO,
},
.read = show_image,
};
static struct attribute *bgrt_attributes[] = { static struct attribute *bgrt_attributes[] = {
&dev_attr_version.attr, &dev_attr_version.attr,
...@@ -75,8 +69,14 @@ static struct attribute *bgrt_attributes[] = { ...@@ -75,8 +69,14 @@ static struct attribute *bgrt_attributes[] = {
NULL, NULL,
}; };
static struct bin_attribute *bgrt_bin_attributes[] = {
&bin_attr_image,
NULL,
};
static struct attribute_group bgrt_attribute_group = { static struct attribute_group bgrt_attribute_group = {
.attrs = bgrt_attributes, .attrs = bgrt_attributes,
.bin_attrs = bgrt_bin_attributes,
}; };
static int __init bgrt_init(void) static int __init bgrt_init(void)
...@@ -86,9 +86,8 @@ static int __init bgrt_init(void) ...@@ -86,9 +86,8 @@ static int __init bgrt_init(void)
if (!bgrt_image) if (!bgrt_image)
return -ENODEV; return -ENODEV;
sysfs_bin_attr_init(&image_attr); bin_attr_image.private = bgrt_image;
image_attr.private = bgrt_image; bin_attr_image.size = bgrt_image_size;
image_attr.size = bgrt_image_size;
bgrt_kobj = kobject_create_and_add("bgrt", acpi_kobj); bgrt_kobj = kobject_create_and_add("bgrt", acpi_kobj);
if (!bgrt_kobj) if (!bgrt_kobj)
...@@ -98,14 +97,8 @@ static int __init bgrt_init(void) ...@@ -98,14 +97,8 @@ static int __init bgrt_init(void)
if (ret) if (ret)
goto out_kobject; goto out_kobject;
ret = sysfs_create_bin_file(bgrt_kobj, &image_attr);
if (ret)
goto out_group;
return 0; return 0;
out_group:
sysfs_remove_group(bgrt_kobj, &bgrt_attribute_group);
out_kobject: out_kobject:
kobject_put(bgrt_kobj); kobject_put(bgrt_kobj);
return ret; return ret;
......
...@@ -119,6 +119,16 @@ static inline int driver_match_device(struct device_driver *drv, ...@@ -119,6 +119,16 @@ static inline int driver_match_device(struct device_driver *drv,
return drv->bus->match ? drv->bus->match(dev, drv) : 1; return drv->bus->match ? drv->bus->match(dev, drv) : 1;
} }
extern int driver_add_groups(struct device_driver *drv,
const struct attribute_group **groups);
extern void driver_remove_groups(struct device_driver *drv,
const struct attribute_group **groups);
extern int device_add_groups(struct device *dev,
const struct attribute_group **groups);
extern void device_remove_groups(struct device *dev,
const struct attribute_group **groups);
extern char *make_class_name(const char *name, struct kobject *kobj); extern char *make_class_name(const char *name, struct kobject *kobj);
extern int devres_release_all(struct device *dev); extern int devres_release_all(struct device *dev);
......
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
#include <linux/init.h> #include <linux/init.h>
#include <linux/string.h> #include <linux/string.h>
#include <linux/mutex.h> #include <linux/mutex.h>
#include <linux/sysfs.h>
#include "base.h" #include "base.h"
#include "power/power.h" #include "power/power.h"
...@@ -165,8 +166,8 @@ static const struct kset_uevent_ops bus_uevent_ops = { ...@@ -165,8 +166,8 @@ static const struct kset_uevent_ops bus_uevent_ops = {
static struct kset *bus_kset; static struct kset *bus_kset;
/* Manually detach a device from its associated driver. */ /* Manually detach a device from its associated driver. */
static ssize_t driver_unbind(struct device_driver *drv, static ssize_t unbind_store(struct device_driver *drv, const char *buf,
const char *buf, size_t count) size_t count)
{ {
struct bus_type *bus = bus_get(drv->bus); struct bus_type *bus = bus_get(drv->bus);
struct device *dev; struct device *dev;
...@@ -185,15 +186,15 @@ static ssize_t driver_unbind(struct device_driver *drv, ...@@ -185,15 +186,15 @@ static ssize_t driver_unbind(struct device_driver *drv,
bus_put(bus); bus_put(bus);
return err; return err;
} }
static DRIVER_ATTR(unbind, S_IWUSR, NULL, driver_unbind); static DRIVER_ATTR_WO(unbind);
/* /*
* Manually attach a device to a driver. * Manually attach a device to a driver.
* Note: the driver must want to bind to the device, * Note: the driver must want to bind to the device,
* it is not possible to override the driver's id table. * it is not possible to override the driver's id table.
*/ */
static ssize_t driver_bind(struct device_driver *drv, static ssize_t bind_store(struct device_driver *drv, const char *buf,
const char *buf, size_t count) size_t count)
{ {
struct bus_type *bus = bus_get(drv->bus); struct bus_type *bus = bus_get(drv->bus);
struct device *dev; struct device *dev;
...@@ -221,7 +222,7 @@ static ssize_t driver_bind(struct device_driver *drv, ...@@ -221,7 +222,7 @@ static ssize_t driver_bind(struct device_driver *drv,
bus_put(bus); bus_put(bus);
return err; return err;
} }
static DRIVER_ATTR(bind, S_IWUSR, NULL, driver_bind); static DRIVER_ATTR_WO(bind);
static ssize_t show_drivers_autoprobe(struct bus_type *bus, char *buf) static ssize_t show_drivers_autoprobe(struct bus_type *bus, char *buf)
{ {
...@@ -460,7 +461,7 @@ static int device_add_attrs(struct bus_type *bus, struct device *dev) ...@@ -460,7 +461,7 @@ static int device_add_attrs(struct bus_type *bus, struct device *dev)
if (!bus->dev_attrs) if (!bus->dev_attrs)
return 0; return 0;
for (i = 0; attr_name(bus->dev_attrs[i]); i++) { for (i = 0; bus->dev_attrs[i].attr.name; i++) {
error = device_create_file(dev, &bus->dev_attrs[i]); error = device_create_file(dev, &bus->dev_attrs[i]);
if (error) { if (error) {
while (--i >= 0) while (--i >= 0)
...@@ -476,7 +477,7 @@ static void device_remove_attrs(struct bus_type *bus, struct device *dev) ...@@ -476,7 +477,7 @@ static void device_remove_attrs(struct bus_type *bus, struct device *dev)
int i; int i;
if (bus->dev_attrs) { if (bus->dev_attrs) {
for (i = 0; attr_name(bus->dev_attrs[i]); i++) for (i = 0; bus->dev_attrs[i].attr.name; i++)
device_remove_file(dev, &bus->dev_attrs[i]); device_remove_file(dev, &bus->dev_attrs[i]);
} }
} }
...@@ -499,6 +500,9 @@ int bus_add_device(struct device *dev) ...@@ -499,6 +500,9 @@ int bus_add_device(struct device *dev)
error = device_add_attrs(bus, dev); error = device_add_attrs(bus, dev);
if (error) if (error)
goto out_put; goto out_put;
error = device_add_groups(dev, bus->dev_groups);
if (error)
goto out_groups;
error = sysfs_create_link(&bus->p->devices_kset->kobj, error = sysfs_create_link(&bus->p->devices_kset->kobj,
&dev->kobj, dev_name(dev)); &dev->kobj, dev_name(dev));
if (error) if (error)
...@@ -513,6 +517,8 @@ int bus_add_device(struct device *dev) ...@@ -513,6 +517,8 @@ int bus_add_device(struct device *dev)
out_subsys: out_subsys:
sysfs_remove_link(&bus->p->devices_kset->kobj, dev_name(dev)); sysfs_remove_link(&bus->p->devices_kset->kobj, dev_name(dev));
out_groups:
device_remove_groups(dev, bus->dev_groups);
out_id: out_id:
device_remove_attrs(bus, dev); device_remove_attrs(bus, dev);
out_put: out_put:
...@@ -575,6 +581,7 @@ void bus_remove_device(struct device *dev) ...@@ -575,6 +581,7 @@ void bus_remove_device(struct device *dev)
sysfs_remove_link(&dev->bus->p->devices_kset->kobj, sysfs_remove_link(&dev->bus->p->devices_kset->kobj,
dev_name(dev)); dev_name(dev));
device_remove_attrs(dev->bus, dev); device_remove_attrs(dev->bus, dev);
device_remove_groups(dev, dev->bus->dev_groups);
if (klist_node_attached(&dev->p->knode_bus)) if (klist_node_attached(&dev->p->knode_bus))
klist_del(&dev->p->knode_bus); klist_del(&dev->p->knode_bus);
...@@ -590,7 +597,7 @@ static int driver_add_attrs(struct bus_type *bus, struct device_driver *drv) ...@@ -590,7 +597,7 @@ static int driver_add_attrs(struct bus_type *bus, struct device_driver *drv)
int i; int i;
if (bus->drv_attrs) { if (bus->drv_attrs) {
for (i = 0; attr_name(bus->drv_attrs[i]); i++) { for (i = 0; bus->drv_attrs[i].attr.name; i++) {
error = driver_create_file(drv, &bus->drv_attrs[i]); error = driver_create_file(drv, &bus->drv_attrs[i]);
if (error) if (error)
goto err; goto err;
...@@ -610,7 +617,7 @@ static void driver_remove_attrs(struct bus_type *bus, ...@@ -610,7 +617,7 @@ static void driver_remove_attrs(struct bus_type *bus,
int i; int i;
if (bus->drv_attrs) { if (bus->drv_attrs) {
for (i = 0; attr_name(bus->drv_attrs[i]); i++) for (i = 0; bus->drv_attrs[i].attr.name; i++)
driver_remove_file(drv, &bus->drv_attrs[i]); driver_remove_file(drv, &bus->drv_attrs[i]);
} }
} }
...@@ -659,8 +666,8 @@ static void remove_probe_files(struct bus_type *bus) ...@@ -659,8 +666,8 @@ static void remove_probe_files(struct bus_type *bus)
bus_remove_file(bus, &bus_attr_drivers_probe); bus_remove_file(bus, &bus_attr_drivers_probe);
} }
static ssize_t driver_uevent_store(struct device_driver *drv, static ssize_t uevent_store(struct device_driver *drv, const char *buf,
const char *buf, size_t count) size_t count)
{ {
enum kobject_action action; enum kobject_action action;
...@@ -668,7 +675,7 @@ static ssize_t driver_uevent_store(struct device_driver *drv, ...@@ -668,7 +675,7 @@ static ssize_t driver_uevent_store(struct device_driver *drv,
kobject_uevent(&drv->p->kobj, action); kobject_uevent(&drv->p->kobj, action);
return count; return count;
} }
static DRIVER_ATTR(uevent, S_IWUSR, NULL, driver_uevent_store); static DRIVER_ATTR_WO(uevent);
/** /**
* bus_add_driver - Add a driver to the bus. * bus_add_driver - Add a driver to the bus.
...@@ -719,6 +726,10 @@ int bus_add_driver(struct device_driver *drv) ...@@ -719,6 +726,10 @@ int bus_add_driver(struct device_driver *drv)
printk(KERN_ERR "%s: driver_add_attrs(%s) failed\n", printk(KERN_ERR "%s: driver_add_attrs(%s) failed\n",
__func__, drv->name); __func__, drv->name);
} }
error = driver_add_groups(drv, bus->drv_groups);
if (error)
printk(KERN_ERR "%s: driver_create_groups(%s) failed\n",
__func__, drv->name);
if (!drv->suppress_bind_attrs) { if (!drv->suppress_bind_attrs) {
error = add_bind_files(drv); error = add_bind_files(drv);
...@@ -756,6 +767,7 @@ void bus_remove_driver(struct device_driver *drv) ...@@ -756,6 +767,7 @@ void bus_remove_driver(struct device_driver *drv)
if (!drv->suppress_bind_attrs) if (!drv->suppress_bind_attrs)
remove_bind_files(drv); remove_bind_files(drv);
driver_remove_attrs(drv->bus, drv); driver_remove_attrs(drv->bus, drv);
driver_remove_groups(drv, drv->bus->drv_groups);
driver_remove_file(drv, &driver_attr_uevent); driver_remove_file(drv, &driver_attr_uevent);
klist_remove(&drv->p->knode_bus); klist_remove(&drv->p->knode_bus);
pr_debug("bus: '%s': remove driver %s\n", drv->bus->name, drv->name); pr_debug("bus: '%s': remove driver %s\n", drv->bus->name, drv->name);
...@@ -846,7 +858,7 @@ static int bus_add_attrs(struct bus_type *bus) ...@@ -846,7 +858,7 @@ static int bus_add_attrs(struct bus_type *bus)
int i; int i;
if (bus->bus_attrs) { if (bus->bus_attrs) {
for (i = 0; attr_name(bus->bus_attrs[i]); i++) { for (i = 0; bus->bus_attrs[i].attr.name; i++) {
error = bus_create_file(bus, &bus->bus_attrs[i]); error = bus_create_file(bus, &bus->bus_attrs[i]);
if (error) if (error)
goto err; goto err;
...@@ -865,11 +877,23 @@ static void bus_remove_attrs(struct bus_type *bus) ...@@ -865,11 +877,23 @@ static void bus_remove_attrs(struct bus_type *bus)
int i; int i;
if (bus->bus_attrs) { if (bus->bus_attrs) {
for (i = 0; attr_name(bus->bus_attrs[i]); i++) for (i = 0; bus->bus_attrs[i].attr.name; i++)
bus_remove_file(bus, &bus->bus_attrs[i]); bus_remove_file(bus, &bus->bus_attrs[i]);
} }
} }
static int bus_add_groups(struct bus_type *bus,
const struct attribute_group **groups)
{
return sysfs_create_groups(&bus->p->subsys.kobj, groups);
}
static void bus_remove_groups(struct bus_type *bus,
const struct attribute_group **groups)
{
sysfs_remove_groups(&bus->p->subsys.kobj, groups);
}
static void klist_devices_get(struct klist_node *n) static void klist_devices_get(struct klist_node *n)
{ {
struct device_private *dev_prv = to_device_private_bus(n); struct device_private *dev_prv = to_device_private_bus(n);
...@@ -962,10 +986,15 @@ int bus_register(struct bus_type *bus) ...@@ -962,10 +986,15 @@ int bus_register(struct bus_type *bus)
retval = bus_add_attrs(bus); retval = bus_add_attrs(bus);
if (retval) if (retval)
goto bus_attrs_fail; goto bus_attrs_fail;
retval = bus_add_groups(bus, bus->bus_groups);
if (retval)
goto bus_groups_fail;
pr_debug("bus: '%s': registered\n", bus->name); pr_debug("bus: '%s': registered\n", bus->name);
return 0; return 0;
bus_groups_fail:
bus_remove_attrs(bus);
bus_attrs_fail: bus_attrs_fail:
remove_probe_files(bus); remove_probe_files(bus);
bus_probe_files_fail: bus_probe_files_fail:
...@@ -996,6 +1025,7 @@ void bus_unregister(struct bus_type *bus) ...@@ -996,6 +1025,7 @@ void bus_unregister(struct bus_type *bus)
if (bus->dev_root) if (bus->dev_root)
device_unregister(bus->dev_root); device_unregister(bus->dev_root);
bus_remove_attrs(bus); bus_remove_attrs(bus);
bus_remove_groups(bus, bus->bus_groups);
remove_probe_files(bus); remove_probe_files(bus);
kset_unregister(bus->p->drivers_kset); kset_unregister(bus->p->drivers_kset);
kset_unregister(bus->p->devices_kset); kset_unregister(bus->p->devices_kset);
......
...@@ -135,7 +135,7 @@ static int add_class_attrs(struct class *cls) ...@@ -135,7 +135,7 @@ static int add_class_attrs(struct class *cls)
int error = 0; int error = 0;
if (cls->class_attrs) { if (cls->class_attrs) {
for (i = 0; attr_name(cls->class_attrs[i]); i++) { for (i = 0; cls->class_attrs[i].attr.name; i++) {
error = class_create_file(cls, &cls->class_attrs[i]); error = class_create_file(cls, &cls->class_attrs[i]);
if (error) if (error)
goto error; goto error;
...@@ -154,7 +154,7 @@ static void remove_class_attrs(struct class *cls) ...@@ -154,7 +154,7 @@ static void remove_class_attrs(struct class *cls)
int i; int i;
if (cls->class_attrs) { if (cls->class_attrs) {
for (i = 0; attr_name(cls->class_attrs[i]); i++) for (i = 0; cls->class_attrs[i].attr.name; i++)
class_remove_file(cls, &cls->class_attrs[i]); class_remove_file(cls, &cls->class_attrs[i]);
} }
} }
......
...@@ -26,6 +26,7 @@ ...@@ -26,6 +26,7 @@
#include <linux/async.h> #include <linux/async.h>
#include <linux/pm_runtime.h> #include <linux/pm_runtime.h>
#include <linux/netdevice.h> #include <linux/netdevice.h>
#include <linux/sysfs.h>
#include "base.h" #include "base.h"
#include "power/power.h" #include "power/power.h"
...@@ -36,9 +37,9 @@ long sysfs_deprecated = 1; ...@@ -36,9 +37,9 @@ long sysfs_deprecated = 1;
#else #else
long sysfs_deprecated = 0; long sysfs_deprecated = 0;
#endif #endif
static __init int sysfs_deprecated_setup(char *arg) static int __init sysfs_deprecated_setup(char *arg)
{ {
return strict_strtol(arg, 10, &sysfs_deprecated); return kstrtol(arg, 10, &sysfs_deprecated);
} }
early_param("sysfs.deprecated", sysfs_deprecated_setup); early_param("sysfs.deprecated", sysfs_deprecated_setup);
#endif #endif
...@@ -345,7 +346,7 @@ static const struct kset_uevent_ops device_uevent_ops = { ...@@ -345,7 +346,7 @@ static const struct kset_uevent_ops device_uevent_ops = {
.uevent = dev_uevent, .uevent = dev_uevent,
}; };
static ssize_t show_uevent(struct device *dev, struct device_attribute *attr, static ssize_t uevent_show(struct device *dev, struct device_attribute *attr,
char *buf) char *buf)
{ {
struct kobject *top_kobj; struct kobject *top_kobj;
...@@ -388,7 +389,7 @@ static ssize_t show_uevent(struct device *dev, struct device_attribute *attr, ...@@ -388,7 +389,7 @@ static ssize_t show_uevent(struct device *dev, struct device_attribute *attr,
return count; return count;
} }
static ssize_t store_uevent(struct device *dev, struct device_attribute *attr, static ssize_t uevent_store(struct device *dev, struct device_attribute *attr,
const char *buf, size_t count) const char *buf, size_t count)
{ {
enum kobject_action action; enum kobject_action action;
...@@ -399,11 +400,9 @@ static ssize_t store_uevent(struct device *dev, struct device_attribute *attr, ...@@ -399,11 +400,9 @@ static ssize_t store_uevent(struct device *dev, struct device_attribute *attr,
dev_err(dev, "uevent: unknown action-string\n"); dev_err(dev, "uevent: unknown action-string\n");
return count; return count;
} }
static DEVICE_ATTR_RW(uevent);
static struct device_attribute uevent_attr = static ssize_t online_show(struct device *dev, struct device_attribute *attr,
__ATTR(uevent, S_IRUGO | S_IWUSR, show_uevent, store_uevent);
static ssize_t show_online(struct device *dev, struct device_attribute *attr,
char *buf) char *buf)
{ {
bool val; bool val;
...@@ -414,7 +413,7 @@ static ssize_t show_online(struct device *dev, struct device_attribute *attr, ...@@ -414,7 +413,7 @@ static ssize_t show_online(struct device *dev, struct device_attribute *attr,
return sprintf(buf, "%u\n", val); return sprintf(buf, "%u\n", val);
} }
static ssize_t store_online(struct device *dev, struct device_attribute *attr, static ssize_t online_store(struct device *dev, struct device_attribute *attr,
const char *buf, size_t count) const char *buf, size_t count)
{ {
bool val; bool val;
...@@ -429,9 +428,7 @@ static ssize_t store_online(struct device *dev, struct device_attribute *attr, ...@@ -429,9 +428,7 @@ static ssize_t store_online(struct device *dev, struct device_attribute *attr,
unlock_device_hotplug(); unlock_device_hotplug();
return ret < 0 ? ret : count; return ret < 0 ? ret : count;
} }
static DEVICE_ATTR_RW(online);
static struct device_attribute online_attr =
__ATTR(online, S_IRUGO | S_IWUSR, show_online, store_online);
static int device_add_attributes(struct device *dev, static int device_add_attributes(struct device *dev,
struct device_attribute *attrs) struct device_attribute *attrs)
...@@ -440,7 +437,7 @@ static int device_add_attributes(struct device *dev, ...@@ -440,7 +437,7 @@ static int device_add_attributes(struct device *dev,
int i; int i;
if (attrs) { if (attrs) {
for (i = 0; attr_name(attrs[i]); i++) { for (i = 0; attrs[i].attr.name; i++) {
error = device_create_file(dev, &attrs[i]); error = device_create_file(dev, &attrs[i]);
if (error) if (error)
break; break;
...@@ -458,7 +455,7 @@ static void device_remove_attributes(struct device *dev, ...@@ -458,7 +455,7 @@ static void device_remove_attributes(struct device *dev,
int i; int i;
if (attrs) if (attrs)
for (i = 0; attr_name(attrs[i]); i++) for (i = 0; attrs[i].attr.name; i++)
device_remove_file(dev, &attrs[i]); device_remove_file(dev, &attrs[i]);
} }
...@@ -469,7 +466,7 @@ static int device_add_bin_attributes(struct device *dev, ...@@ -469,7 +466,7 @@ static int device_add_bin_attributes(struct device *dev,
int i; int i;
if (attrs) { if (attrs) {
for (i = 0; attr_name(attrs[i]); i++) { for (i = 0; attrs[i].attr.name; i++) {
error = device_create_bin_file(dev, &attrs[i]); error = device_create_bin_file(dev, &attrs[i]);
if (error) if (error)
break; break;
...@@ -487,38 +484,19 @@ static void device_remove_bin_attributes(struct device *dev, ...@@ -487,38 +484,19 @@ static void device_remove_bin_attributes(struct device *dev,
int i; int i;
if (attrs) if (attrs)
for (i = 0; attr_name(attrs[i]); i++) for (i = 0; attrs[i].attr.name; i++)
device_remove_bin_file(dev, &attrs[i]); device_remove_bin_file(dev, &attrs[i]);
} }
static int device_add_groups(struct device *dev, int device_add_groups(struct device *dev, const struct attribute_group **groups)
const struct attribute_group **groups)
{ {
int error = 0; return sysfs_create_groups(&dev->kobj, groups);
int i;
if (groups) {
for (i = 0; groups[i]; i++) {
error = sysfs_create_group(&dev->kobj, groups[i]);
if (error) {
while (--i >= 0)
sysfs_remove_group(&dev->kobj,
groups[i]);
break;
}
}
}
return error;
} }
static void device_remove_groups(struct device *dev, void device_remove_groups(struct device *dev,
const struct attribute_group **groups) const struct attribute_group **groups)
{ {
int i; sysfs_remove_groups(&dev->kobj, groups);
if (groups)
for (i = 0; groups[i]; i++)
sysfs_remove_group(&dev->kobj, groups[i]);
} }
static int device_add_attrs(struct device *dev) static int device_add_attrs(struct device *dev)
...@@ -550,7 +528,7 @@ static int device_add_attrs(struct device *dev) ...@@ -550,7 +528,7 @@ static int device_add_attrs(struct device *dev)
goto err_remove_type_groups; goto err_remove_type_groups;
if (device_supports_offline(dev) && !dev->offline_disabled) { if (device_supports_offline(dev) && !dev->offline_disabled) {
error = device_create_file(dev, &online_attr); error = device_create_file(dev, &dev_attr_online);
if (error) if (error)
goto err_remove_type_groups; goto err_remove_type_groups;
} }
...@@ -578,7 +556,7 @@ static void device_remove_attrs(struct device *dev) ...@@ -578,7 +556,7 @@ static void device_remove_attrs(struct device *dev)
struct class *class = dev->class; struct class *class = dev->class;
const struct device_type *type = dev->type; const struct device_type *type = dev->type;
device_remove_file(dev, &online_attr); device_remove_file(dev, &dev_attr_online);
device_remove_groups(dev, dev->groups); device_remove_groups(dev, dev->groups);
if (type) if (type)
...@@ -591,15 +569,12 @@ static void device_remove_attrs(struct device *dev) ...@@ -591,15 +569,12 @@ static void device_remove_attrs(struct device *dev)
} }
} }
static ssize_t dev_show(struct device *dev, struct device_attribute *attr,
static ssize_t show_dev(struct device *dev, struct device_attribute *attr,
char *buf) char *buf)
{ {
return print_dev_t(buf, dev->devt); return print_dev_t(buf, dev->devt);
} }
static DEVICE_ATTR_RO(dev);
static struct device_attribute devt_attr =
__ATTR(dev, S_IRUGO, show_dev, NULL);
/* /sys/devices/ */ /* /sys/devices/ */
struct kset *devices_kset; struct kset *devices_kset;
...@@ -626,6 +601,7 @@ int device_create_file(struct device *dev, ...@@ -626,6 +601,7 @@ int device_create_file(struct device *dev,
return error; return error;
} }
EXPORT_SYMBOL_GPL(device_create_file);
/** /**
* device_remove_file - remove sysfs attribute file. * device_remove_file - remove sysfs attribute file.
...@@ -638,6 +614,7 @@ void device_remove_file(struct device *dev, ...@@ -638,6 +614,7 @@ void device_remove_file(struct device *dev,
if (dev) if (dev)
sysfs_remove_file(&dev->kobj, &attr->attr); sysfs_remove_file(&dev->kobj, &attr->attr);
} }
EXPORT_SYMBOL_GPL(device_remove_file);
/** /**
* device_create_bin_file - create sysfs binary attribute file for device. * device_create_bin_file - create sysfs binary attribute file for device.
...@@ -748,6 +725,7 @@ void device_initialize(struct device *dev) ...@@ -748,6 +725,7 @@ void device_initialize(struct device *dev)
device_pm_init(dev); device_pm_init(dev);
set_dev_node(dev, -1); set_dev_node(dev, -1);
} }
EXPORT_SYMBOL_GPL(device_initialize);
struct kobject *virtual_device_parent(struct device *dev) struct kobject *virtual_device_parent(struct device *dev)
{ {
...@@ -1100,12 +1078,12 @@ int device_add(struct device *dev) ...@@ -1100,12 +1078,12 @@ int device_add(struct device *dev)
if (platform_notify) if (platform_notify)
platform_notify(dev); platform_notify(dev);
error = device_create_file(dev, &uevent_attr); error = device_create_file(dev, &dev_attr_uevent);
if (error) if (error)
goto attrError; goto attrError;
if (MAJOR(dev->devt)) { if (MAJOR(dev->devt)) {
error = device_create_file(dev, &devt_attr); error = device_create_file(dev, &dev_attr_dev);
if (error) if (error)
goto ueventattrError; goto ueventattrError;
...@@ -1172,9 +1150,9 @@ int device_add(struct device *dev) ...@@ -1172,9 +1150,9 @@ int device_add(struct device *dev)
device_remove_sys_dev_entry(dev); device_remove_sys_dev_entry(dev);
devtattrError: devtattrError:
if (MAJOR(dev->devt)) if (MAJOR(dev->devt))
device_remove_file(dev, &devt_attr); device_remove_file(dev, &dev_attr_dev);
ueventattrError: ueventattrError:
device_remove_file(dev, &uevent_attr); device_remove_file(dev, &dev_attr_uevent);
attrError: attrError:
kobject_uevent(&dev->kobj, KOBJ_REMOVE); kobject_uevent(&dev->kobj, KOBJ_REMOVE);
kobject_del(&dev->kobj); kobject_del(&dev->kobj);
...@@ -1187,6 +1165,7 @@ int device_add(struct device *dev) ...@@ -1187,6 +1165,7 @@ int device_add(struct device *dev)
dev->p = NULL; dev->p = NULL;
goto done; goto done;
} }
EXPORT_SYMBOL_GPL(device_add);
/** /**
* device_register - register a device with the system. * device_register - register a device with the system.
...@@ -1211,6 +1190,7 @@ int device_register(struct device *dev) ...@@ -1211,6 +1190,7 @@ int device_register(struct device *dev)
device_initialize(dev); device_initialize(dev);
return device_add(dev); return device_add(dev);
} }
EXPORT_SYMBOL_GPL(device_register);
/** /**
* get_device - increment reference count for device. * get_device - increment reference count for device.
...@@ -1224,6 +1204,7 @@ struct device *get_device(struct device *dev) ...@@ -1224,6 +1204,7 @@ struct device *get_device(struct device *dev)
{ {
return dev ? kobj_to_dev(kobject_get(&dev->kobj)) : NULL; return dev ? kobj_to_dev(kobject_get(&dev->kobj)) : NULL;
} }
EXPORT_SYMBOL_GPL(get_device);
/** /**
* put_device - decrement reference count. * put_device - decrement reference count.
...@@ -1235,6 +1216,7 @@ void put_device(struct device *dev) ...@@ -1235,6 +1216,7 @@ void put_device(struct device *dev)
if (dev) if (dev)
kobject_put(&dev->kobj); kobject_put(&dev->kobj);
} }
EXPORT_SYMBOL_GPL(put_device);
/** /**
* device_del - delete device from system. * device_del - delete device from system.
...@@ -1266,7 +1248,7 @@ void device_del(struct device *dev) ...@@ -1266,7 +1248,7 @@ void device_del(struct device *dev)
if (MAJOR(dev->devt)) { if (MAJOR(dev->devt)) {
devtmpfs_delete_node(dev); devtmpfs_delete_node(dev);
device_remove_sys_dev_entry(dev); device_remove_sys_dev_entry(dev);
device_remove_file(dev, &devt_attr); device_remove_file(dev, &dev_attr_dev);
} }
if (dev->class) { if (dev->class) {
device_remove_class_symlinks(dev); device_remove_class_symlinks(dev);
...@@ -1281,7 +1263,7 @@ void device_del(struct device *dev) ...@@ -1281,7 +1263,7 @@ void device_del(struct device *dev)
klist_del(&dev->knode_class); klist_del(&dev->knode_class);
mutex_unlock(&dev->class->p->mutex); mutex_unlock(&dev->class->p->mutex);
} }
device_remove_file(dev, &uevent_attr); device_remove_file(dev, &dev_attr_uevent);
device_remove_attrs(dev); device_remove_attrs(dev);
bus_remove_device(dev); bus_remove_device(dev);
device_pm_remove(dev); device_pm_remove(dev);
...@@ -1297,6 +1279,7 @@ void device_del(struct device *dev) ...@@ -1297,6 +1279,7 @@ void device_del(struct device *dev)
kobject_del(&dev->kobj); kobject_del(&dev->kobj);
put_device(parent); put_device(parent);
} }
EXPORT_SYMBOL_GPL(device_del);
/** /**
* device_unregister - unregister device from system. * device_unregister - unregister device from system.
...@@ -1315,6 +1298,7 @@ void device_unregister(struct device *dev) ...@@ -1315,6 +1298,7 @@ void device_unregister(struct device *dev)
device_del(dev); device_del(dev);
put_device(dev); put_device(dev);
} }
EXPORT_SYMBOL_GPL(device_unregister);
static struct device *next_device(struct klist_iter *i) static struct device *next_device(struct klist_iter *i)
{ {
...@@ -1403,6 +1387,7 @@ int device_for_each_child(struct device *parent, void *data, ...@@ -1403,6 +1387,7 @@ int device_for_each_child(struct device *parent, void *data,
klist_iter_exit(&i); klist_iter_exit(&i);
return error; return error;
} }
EXPORT_SYMBOL_GPL(device_for_each_child);
/** /**
* device_find_child - device iterator for locating a particular device. * device_find_child - device iterator for locating a particular device.
...@@ -1437,6 +1422,7 @@ struct device *device_find_child(struct device *parent, void *data, ...@@ -1437,6 +1422,7 @@ struct device *device_find_child(struct device *parent, void *data,
klist_iter_exit(&i); klist_iter_exit(&i);
return child; return child;
} }
EXPORT_SYMBOL_GPL(device_find_child);
int __init devices_init(void) int __init devices_init(void)
{ {
...@@ -1464,21 +1450,6 @@ int __init devices_init(void) ...@@ -1464,21 +1450,6 @@ int __init devices_init(void)
return -ENOMEM; return -ENOMEM;
} }
EXPORT_SYMBOL_GPL(device_for_each_child);
EXPORT_SYMBOL_GPL(device_find_child);
EXPORT_SYMBOL_GPL(device_initialize);
EXPORT_SYMBOL_GPL(device_add);
EXPORT_SYMBOL_GPL(device_register);
EXPORT_SYMBOL_GPL(device_del);
EXPORT_SYMBOL_GPL(device_unregister);
EXPORT_SYMBOL_GPL(get_device);
EXPORT_SYMBOL_GPL(put_device);
EXPORT_SYMBOL_GPL(device_create_file);
EXPORT_SYMBOL_GPL(device_remove_file);
static DEFINE_MUTEX(device_hotplug_lock); static DEFINE_MUTEX(device_hotplug_lock);
void lock_device_hotplug(void) void lock_device_hotplug(void)
......
...@@ -43,11 +43,14 @@ static int __ref cpu_subsys_online(struct device *dev) ...@@ -43,11 +43,14 @@ static int __ref cpu_subsys_online(struct device *dev)
struct cpu *cpu = container_of(dev, struct cpu, dev); struct cpu *cpu = container_of(dev, struct cpu, dev);
int cpuid = dev->id; int cpuid = dev->id;
int from_nid, to_nid; int from_nid, to_nid;
int ret; int ret = -ENODEV;
cpu_hotplug_driver_lock(); cpu_hotplug_driver_lock();
from_nid = cpu_to_node(cpuid); from_nid = cpu_to_node(cpuid);
if (from_nid == NUMA_NO_NODE)
goto out;
ret = cpu_up(cpuid); ret = cpu_up(cpuid);
/* /*
* When hot adding memory to memoryless node and enabling a cpu * When hot adding memory to memoryless node and enabling a cpu
...@@ -57,6 +60,7 @@ static int __ref cpu_subsys_online(struct device *dev) ...@@ -57,6 +60,7 @@ static int __ref cpu_subsys_online(struct device *dev)
if (from_nid != to_nid) if (from_nid != to_nid)
change_cpu_under_node(cpu, from_nid, to_nid); change_cpu_under_node(cpu, from_nid, to_nid);
out:
cpu_hotplug_driver_unlock(); cpu_hotplug_driver_unlock();
return ret; return ret;
} }
......
...@@ -134,7 +134,7 @@ void __init dma_contiguous_reserve(phys_addr_t limit) ...@@ -134,7 +134,7 @@ void __init dma_contiguous_reserve(phys_addr_t limit)
static DEFINE_MUTEX(cma_mutex); static DEFINE_MUTEX(cma_mutex);
static __init int cma_activate_area(unsigned long base_pfn, unsigned long count) static int __init cma_activate_area(unsigned long base_pfn, unsigned long count)
{ {
unsigned long pfn = base_pfn; unsigned long pfn = base_pfn;
unsigned i = count >> pageblock_order; unsigned i = count >> pageblock_order;
...@@ -156,7 +156,7 @@ static __init int cma_activate_area(unsigned long base_pfn, unsigned long count) ...@@ -156,7 +156,7 @@ static __init int cma_activate_area(unsigned long base_pfn, unsigned long count)
return 0; return 0;
} }
static __init struct cma *cma_create_area(unsigned long base_pfn, static struct cma * __init cma_create_area(unsigned long base_pfn,
unsigned long count) unsigned long count)
{ {
int bitmap_size = BITS_TO_LONGS(count) * sizeof(long); int bitmap_size = BITS_TO_LONGS(count) * sizeof(long);
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/string.h> #include <linux/string.h>
#include <linux/sysfs.h>
#include "base.h" #include "base.h"
static struct device *next_device(struct klist_iter *i) static struct device *next_device(struct klist_iter *i)
...@@ -123,34 +124,16 @@ void driver_remove_file(struct device_driver *drv, ...@@ -123,34 +124,16 @@ void driver_remove_file(struct device_driver *drv,
} }
EXPORT_SYMBOL_GPL(driver_remove_file); EXPORT_SYMBOL_GPL(driver_remove_file);
static int driver_add_groups(struct device_driver *drv, int driver_add_groups(struct device_driver *drv,
const struct attribute_group **groups) const struct attribute_group **groups)
{ {
int error = 0; return sysfs_create_groups(&drv->p->kobj, groups);
int i;
if (groups) {
for (i = 0; groups[i]; i++) {
error = sysfs_create_group(&drv->p->kobj, groups[i]);
if (error) {
while (--i >= 0)
sysfs_remove_group(&drv->p->kobj,
groups[i]);
break;
}
}
}
return error;
} }
static void driver_remove_groups(struct device_driver *drv, void driver_remove_groups(struct device_driver *drv,
const struct attribute_group **groups) const struct attribute_group **groups)
{ {
int i; sysfs_remove_groups(&drv->p->kobj, groups);
if (groups)
for (i = 0; groups[i]; i++)
sysfs_remove_group(&drv->p->kobj, groups[i]);
} }
/** /**
......
...@@ -486,9 +486,8 @@ static struct notifier_block fw_shutdown_nb = { ...@@ -486,9 +486,8 @@ static struct notifier_block fw_shutdown_nb = {
.notifier_call = fw_shutdown_notify, .notifier_call = fw_shutdown_notify,
}; };
static ssize_t firmware_timeout_show(struct class *class, static ssize_t timeout_show(struct class *class, struct class_attribute *attr,
struct class_attribute *attr, char *buf)
char *buf)
{ {
return sprintf(buf, "%d\n", loading_timeout); return sprintf(buf, "%d\n", loading_timeout);
} }
...@@ -506,9 +505,8 @@ static ssize_t firmware_timeout_show(struct class *class, ...@@ -506,9 +505,8 @@ static ssize_t firmware_timeout_show(struct class *class,
* *
* Note: zero means 'wait forever'. * Note: zero means 'wait forever'.
**/ **/
static ssize_t firmware_timeout_store(struct class *class, static ssize_t timeout_store(struct class *class, struct class_attribute *attr,
struct class_attribute *attr, const char *buf, size_t count)
const char *buf, size_t count)
{ {
loading_timeout = simple_strtol(buf, NULL, 10); loading_timeout = simple_strtol(buf, NULL, 10);
if (loading_timeout < 0) if (loading_timeout < 0)
...@@ -518,8 +516,7 @@ static ssize_t firmware_timeout_store(struct class *class, ...@@ -518,8 +516,7 @@ static ssize_t firmware_timeout_store(struct class *class,
} }
static struct class_attribute firmware_class_attrs[] = { static struct class_attribute firmware_class_attrs[] = {
__ATTR(timeout, S_IWUSR | S_IRUGO, __ATTR_RW(timeout),
firmware_timeout_show, firmware_timeout_store),
__ATTR_NULL __ATTR_NULL
}; };
...@@ -868,8 +865,15 @@ static int _request_firmware_load(struct firmware_priv *fw_priv, bool uevent, ...@@ -868,8 +865,15 @@ static int _request_firmware_load(struct firmware_priv *fw_priv, bool uevent,
goto err_del_dev; goto err_del_dev;
} }
mutex_lock(&fw_lock);
list_add(&buf->pending_list, &pending_fw_head);
mutex_unlock(&fw_lock);
retval = device_create_file(f_dev, &dev_attr_loading); retval = device_create_file(f_dev, &dev_attr_loading);
if (retval) { if (retval) {
mutex_lock(&fw_lock);
list_del_init(&buf->pending_list);
mutex_unlock(&fw_lock);
dev_err(f_dev, "%s: device_create_file failed\n", __func__); dev_err(f_dev, "%s: device_create_file failed\n", __func__);
goto err_del_bin_attr; goto err_del_bin_attr;
} }
...@@ -884,10 +888,6 @@ static int _request_firmware_load(struct firmware_priv *fw_priv, bool uevent, ...@@ -884,10 +888,6 @@ static int _request_firmware_load(struct firmware_priv *fw_priv, bool uevent,
kobject_uevent(&fw_priv->dev.kobj, KOBJ_ADD); kobject_uevent(&fw_priv->dev.kobj, KOBJ_ADD);
} }
mutex_lock(&fw_lock);
list_add(&buf->pending_list, &pending_fw_head);
mutex_unlock(&fw_lock);
wait_for_completion(&buf->completion); wait_for_completion(&buf->completion);
cancel_delayed_work_sync(&fw_priv->timeout_work); cancel_delayed_work_sync(&fw_priv->timeout_work);
......
...@@ -16,7 +16,6 @@ ...@@ -16,7 +16,6 @@
#include <linux/capability.h> #include <linux/capability.h>
#include <linux/device.h> #include <linux/device.h>
#include <linux/memory.h> #include <linux/memory.h>
#include <linux/kobject.h>
#include <linux/memory_hotplug.h> #include <linux/memory_hotplug.h>
#include <linux/mm.h> #include <linux/mm.h>
#include <linux/mutex.h> #include <linux/mutex.h>
...@@ -30,6 +29,8 @@ static DEFINE_MUTEX(mem_sysfs_mutex); ...@@ -30,6 +29,8 @@ static DEFINE_MUTEX(mem_sysfs_mutex);
#define MEMORY_CLASS_NAME "memory" #define MEMORY_CLASS_NAME "memory"
#define to_memory_block(dev) container_of(dev, struct memory_block, dev)
static int sections_per_block; static int sections_per_block;
static inline int base_memory_block_id(int section_nr) static inline int base_memory_block_id(int section_nr)
...@@ -77,7 +78,7 @@ EXPORT_SYMBOL(unregister_memory_isolate_notifier); ...@@ -77,7 +78,7 @@ EXPORT_SYMBOL(unregister_memory_isolate_notifier);
static void memory_block_release(struct device *dev) static void memory_block_release(struct device *dev)
{ {
struct memory_block *mem = container_of(dev, struct memory_block, dev); struct memory_block *mem = to_memory_block(dev);
kfree(mem); kfree(mem);
} }
...@@ -110,8 +111,7 @@ static unsigned long get_memory_block_size(void) ...@@ -110,8 +111,7 @@ static unsigned long get_memory_block_size(void)
static ssize_t show_mem_start_phys_index(struct device *dev, static ssize_t show_mem_start_phys_index(struct device *dev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
{ {
struct memory_block *mem = struct memory_block *mem = to_memory_block(dev);
container_of(dev, struct memory_block, dev);
unsigned long phys_index; unsigned long phys_index;
phys_index = mem->start_section_nr / sections_per_block; phys_index = mem->start_section_nr / sections_per_block;
...@@ -121,8 +121,7 @@ static ssize_t show_mem_start_phys_index(struct device *dev, ...@@ -121,8 +121,7 @@ static ssize_t show_mem_start_phys_index(struct device *dev,
static ssize_t show_mem_end_phys_index(struct device *dev, static ssize_t show_mem_end_phys_index(struct device *dev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
{ {
struct memory_block *mem = struct memory_block *mem = to_memory_block(dev);
container_of(dev, struct memory_block, dev);
unsigned long phys_index; unsigned long phys_index;
phys_index = mem->end_section_nr / sections_per_block; phys_index = mem->end_section_nr / sections_per_block;
...@@ -137,8 +136,7 @@ static ssize_t show_mem_removable(struct device *dev, ...@@ -137,8 +136,7 @@ static ssize_t show_mem_removable(struct device *dev,
{ {
unsigned long i, pfn; unsigned long i, pfn;
int ret = 1; int ret = 1;
struct memory_block *mem = struct memory_block *mem = to_memory_block(dev);
container_of(dev, struct memory_block, dev);
for (i = 0; i < sections_per_block; i++) { for (i = 0; i < sections_per_block; i++) {
if (!present_section_nr(mem->start_section_nr + i)) if (!present_section_nr(mem->start_section_nr + i))
...@@ -156,8 +154,7 @@ static ssize_t show_mem_removable(struct device *dev, ...@@ -156,8 +154,7 @@ static ssize_t show_mem_removable(struct device *dev,
static ssize_t show_mem_state(struct device *dev, static ssize_t show_mem_state(struct device *dev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
{ {
struct memory_block *mem = struct memory_block *mem = to_memory_block(dev);
container_of(dev, struct memory_block, dev);
ssize_t len = 0; ssize_t len = 0;
/* /*
...@@ -263,9 +260,8 @@ memory_block_action(unsigned long phys_index, unsigned long action, int online_t ...@@ -263,9 +260,8 @@ memory_block_action(unsigned long phys_index, unsigned long action, int online_t
return ret; return ret;
} }
static int __memory_block_change_state(struct memory_block *mem, static int memory_block_change_state(struct memory_block *mem,
unsigned long to_state, unsigned long from_state_req, unsigned long to_state, unsigned long from_state_req)
int online_type)
{ {
int ret = 0; int ret = 0;
...@@ -275,105 +271,89 @@ static int __memory_block_change_state(struct memory_block *mem, ...@@ -275,105 +271,89 @@ static int __memory_block_change_state(struct memory_block *mem,
if (to_state == MEM_OFFLINE) if (to_state == MEM_OFFLINE)
mem->state = MEM_GOING_OFFLINE; mem->state = MEM_GOING_OFFLINE;
ret = memory_block_action(mem->start_section_nr, to_state, online_type); ret = memory_block_action(mem->start_section_nr, to_state,
mem->online_type);
mem->state = ret ? from_state_req : to_state; mem->state = ret ? from_state_req : to_state;
return ret; return ret;
} }
/* The device lock serializes operations on memory_subsys_[online|offline] */
static int memory_subsys_online(struct device *dev) static int memory_subsys_online(struct device *dev)
{ {
struct memory_block *mem = container_of(dev, struct memory_block, dev); struct memory_block *mem = to_memory_block(dev);
int ret; int ret;
mutex_lock(&mem->state_mutex); if (mem->state == MEM_ONLINE)
return 0;
ret = mem->state == MEM_ONLINE ? 0 :
__memory_block_change_state(mem, MEM_ONLINE, MEM_OFFLINE,
ONLINE_KEEP);
mutex_unlock(&mem->state_mutex); /*
return ret; * If we are called from store_mem_state(), online_type will be
} * set >= 0 Otherwise we were called from the device online
* attribute and need to set the online_type.
static int memory_subsys_offline(struct device *dev) */
{ if (mem->online_type < 0)
struct memory_block *mem = container_of(dev, struct memory_block, dev); mem->online_type = ONLINE_KEEP;
int ret;
mutex_lock(&mem->state_mutex); ret = memory_block_change_state(mem, MEM_ONLINE, MEM_OFFLINE);
ret = mem->state == MEM_OFFLINE ? 0 : /* clear online_type */
__memory_block_change_state(mem, MEM_OFFLINE, MEM_ONLINE, -1); mem->online_type = -1;
mutex_unlock(&mem->state_mutex);
return ret; return ret;
} }
static int __memory_block_change_state_uevent(struct memory_block *mem, static int memory_subsys_offline(struct device *dev)
unsigned long to_state, unsigned long from_state_req,
int online_type)
{
int ret = __memory_block_change_state(mem, to_state, from_state_req,
online_type);
if (!ret) {
switch (mem->state) {
case MEM_OFFLINE:
kobject_uevent(&mem->dev.kobj, KOBJ_OFFLINE);
break;
case MEM_ONLINE:
kobject_uevent(&mem->dev.kobj, KOBJ_ONLINE);
break;
default:
break;
}
}
return ret;
}
static int memory_block_change_state(struct memory_block *mem,
unsigned long to_state, unsigned long from_state_req,
int online_type)
{ {
int ret; struct memory_block *mem = to_memory_block(dev);
mutex_lock(&mem->state_mutex); if (mem->state == MEM_OFFLINE)
ret = __memory_block_change_state_uevent(mem, to_state, from_state_req, return 0;
online_type);
mutex_unlock(&mem->state_mutex);
return ret; return memory_block_change_state(mem, MEM_OFFLINE, MEM_ONLINE);
} }
static ssize_t static ssize_t
store_mem_state(struct device *dev, store_mem_state(struct device *dev,
struct device_attribute *attr, const char *buf, size_t count) struct device_attribute *attr, const char *buf, size_t count)
{ {
struct memory_block *mem; struct memory_block *mem = to_memory_block(dev);
bool offline; int ret, online_type;
int ret = -EINVAL;
mem = container_of(dev, struct memory_block, dev);
lock_device_hotplug(); lock_device_hotplug();
if (!strncmp(buf, "online_kernel", min_t(int, count, 13))) { if (!strncmp(buf, "online_kernel", min_t(int, count, 13)))
offline = false; online_type = ONLINE_KERNEL;
ret = memory_block_change_state(mem, MEM_ONLINE, else if (!strncmp(buf, "online_movable", min_t(int, count, 14)))
MEM_OFFLINE, ONLINE_KERNEL); online_type = ONLINE_MOVABLE;
} else if (!strncmp(buf, "online_movable", min_t(int, count, 14))) { else if (!strncmp(buf, "online", min_t(int, count, 6)))
offline = false; online_type = ONLINE_KEEP;
ret = memory_block_change_state(mem, MEM_ONLINE, else if (!strncmp(buf, "offline", min_t(int, count, 7)))
MEM_OFFLINE, ONLINE_MOVABLE); online_type = -1;
} else if (!strncmp(buf, "online", min_t(int, count, 6))) { else
offline = false; return -EINVAL;
ret = memory_block_change_state(mem, MEM_ONLINE,
MEM_OFFLINE, ONLINE_KEEP); switch (online_type) {
} else if(!strncmp(buf, "offline", min_t(int, count, 7))) { case ONLINE_KERNEL:
offline = true; case ONLINE_MOVABLE:
ret = memory_block_change_state(mem, MEM_OFFLINE, case ONLINE_KEEP:
MEM_ONLINE, -1); /*
* mem->online_type is not protected so there can be a
* race here. However, when racing online, the first
* will succeed and the second will just return as the
* block will already be online. The online type
* could be either one, but that is expected.
*/
mem->online_type = online_type;
ret = device_online(&mem->dev);
break;
case -1:
ret = device_offline(&mem->dev);
break;
default:
ret = -EINVAL; /* should never happen */
} }
if (!ret)
dev->offline = offline;
unlock_device_hotplug(); unlock_device_hotplug();
...@@ -394,8 +374,7 @@ store_mem_state(struct device *dev, ...@@ -394,8 +374,7 @@ store_mem_state(struct device *dev,
static ssize_t show_phys_device(struct device *dev, static ssize_t show_phys_device(struct device *dev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
{ {
struct memory_block *mem = struct memory_block *mem = to_memory_block(dev);
container_of(dev, struct memory_block, dev);
return sprintf(buf, "%d\n", mem->phys_device); return sprintf(buf, "%d\n", mem->phys_device);
} }
...@@ -471,7 +450,7 @@ store_soft_offline_page(struct device *dev, ...@@ -471,7 +450,7 @@ store_soft_offline_page(struct device *dev,
u64 pfn; u64 pfn;
if (!capable(CAP_SYS_ADMIN)) if (!capable(CAP_SYS_ADMIN))
return -EPERM; return -EPERM;
if (strict_strtoull(buf, 0, &pfn) < 0) if (kstrtoull(buf, 0, &pfn) < 0)
return -EINVAL; return -EINVAL;
pfn >>= PAGE_SHIFT; pfn >>= PAGE_SHIFT;
if (!pfn_valid(pfn)) if (!pfn_valid(pfn))
...@@ -490,7 +469,7 @@ store_hard_offline_page(struct device *dev, ...@@ -490,7 +469,7 @@ store_hard_offline_page(struct device *dev,
u64 pfn; u64 pfn;
if (!capable(CAP_SYS_ADMIN)) if (!capable(CAP_SYS_ADMIN))
return -EPERM; return -EPERM;
if (strict_strtoull(buf, 0, &pfn) < 0) if (kstrtoull(buf, 0, &pfn) < 0)
return -EINVAL; return -EINVAL;
pfn >>= PAGE_SHIFT; pfn >>= PAGE_SHIFT;
ret = memory_failure(pfn, 0, 0); ret = memory_failure(pfn, 0, 0);
...@@ -527,7 +506,7 @@ struct memory_block *find_memory_block_hinted(struct mem_section *section, ...@@ -527,7 +506,7 @@ struct memory_block *find_memory_block_hinted(struct mem_section *section,
put_device(&hint->dev); put_device(&hint->dev);
if (!dev) if (!dev)
return NULL; return NULL;
return container_of(dev, struct memory_block, dev); return to_memory_block(dev);
} }
/* /*
...@@ -567,16 +546,13 @@ static const struct attribute_group *memory_memblk_attr_groups[] = { ...@@ -567,16 +546,13 @@ static const struct attribute_group *memory_memblk_attr_groups[] = {
static static
int register_memory(struct memory_block *memory) int register_memory(struct memory_block *memory)
{ {
int error;
memory->dev.bus = &memory_subsys; memory->dev.bus = &memory_subsys;
memory->dev.id = memory->start_section_nr / sections_per_block; memory->dev.id = memory->start_section_nr / sections_per_block;
memory->dev.release = memory_block_release; memory->dev.release = memory_block_release;
memory->dev.groups = memory_memblk_attr_groups; memory->dev.groups = memory_memblk_attr_groups;
memory->dev.offline = memory->state == MEM_OFFLINE; memory->dev.offline = memory->state == MEM_OFFLINE;
error = device_register(&memory->dev); return device_register(&memory->dev);
return error;
} }
static int init_memory_block(struct memory_block **memory, static int init_memory_block(struct memory_block **memory,
...@@ -597,7 +573,6 @@ static int init_memory_block(struct memory_block **memory, ...@@ -597,7 +573,6 @@ static int init_memory_block(struct memory_block **memory,
mem->end_section_nr = mem->start_section_nr + sections_per_block - 1; mem->end_section_nr = mem->start_section_nr + sections_per_block - 1;
mem->state = state; mem->state = state;
mem->section_count++; mem->section_count++;
mutex_init(&mem->state_mutex);
start_pfn = section_nr_to_pfn(mem->start_section_nr); start_pfn = section_nr_to_pfn(mem->start_section_nr);
mem->phys_device = arch_get_memory_phys_device(start_pfn); mem->phys_device = arch_get_memory_phys_device(start_pfn);
...@@ -607,55 +582,57 @@ static int init_memory_block(struct memory_block **memory, ...@@ -607,55 +582,57 @@ static int init_memory_block(struct memory_block **memory,
return ret; return ret;
} }
static int add_memory_section(int nid, struct mem_section *section, static int add_memory_block(int base_section_nr)
struct memory_block **mem_p,
unsigned long state, enum mem_add_context context)
{ {
struct memory_block *mem = NULL; struct memory_block *mem;
int scn_nr = __section_nr(section); int i, ret, section_count = 0, section_nr;
int ret = 0;
mutex_lock(&mem_sysfs_mutex);
if (context == BOOT) {
/* same memory block ? */
if (mem_p && *mem_p)
if (scn_nr >= (*mem_p)->start_section_nr &&
scn_nr <= (*mem_p)->end_section_nr) {
mem = *mem_p;
kobject_get(&mem->dev.kobj);
}
} else
mem = find_memory_block(section);
if (mem) {
mem->section_count++;
kobject_put(&mem->dev.kobj);
} else {
ret = init_memory_block(&mem, section, state);
/* store memory_block pointer for next loop */
if (!ret && context == BOOT)
if (mem_p)
*mem_p = mem;
}
if (!ret) { for (i = base_section_nr;
if (context == HOTPLUG && (i < base_section_nr + sections_per_block) && i < NR_MEM_SECTIONS;
mem->section_count == sections_per_block) i++) {
ret = register_mem_sect_under_node(mem, nid); if (!present_section_nr(i))
continue;
if (section_count == 0)
section_nr = i;
section_count++;
} }
mutex_unlock(&mem_sysfs_mutex); if (section_count == 0)
return ret; return 0;
ret = init_memory_block(&mem, __nr_to_section(section_nr), MEM_ONLINE);
if (ret)
return ret;
mem->section_count = section_count;
return 0;
} }
/* /*
* need an interface for the VM to add new memory regions, * need an interface for the VM to add new memory regions,
* but without onlining it. * but without onlining it.
*/ */
int register_new_memory(int nid, struct mem_section *section) int register_new_memory(int nid, struct mem_section *section)
{ {
return add_memory_section(nid, section, NULL, MEM_OFFLINE, HOTPLUG); int ret = 0;
struct memory_block *mem;
mutex_lock(&mem_sysfs_mutex);
mem = find_memory_block(section);
if (mem) {
mem->section_count++;
put_device(&mem->dev);
} else {
ret = init_memory_block(&mem, section, MEM_OFFLINE);
if (ret)
goto out;
}
if (mem->section_count == sections_per_block)
ret = register_mem_sect_under_node(mem, nid);
out:
mutex_unlock(&mem_sysfs_mutex);
return ret;
} }
#ifdef CONFIG_MEMORY_HOTREMOVE #ifdef CONFIG_MEMORY_HOTREMOVE
...@@ -665,7 +642,7 @@ unregister_memory(struct memory_block *memory) ...@@ -665,7 +642,7 @@ unregister_memory(struct memory_block *memory)
BUG_ON(memory->dev.bus != &memory_subsys); BUG_ON(memory->dev.bus != &memory_subsys);
/* drop the ref. we got in remove_memory_block() */ /* drop the ref. we got in remove_memory_block() */
kobject_put(&memory->dev.kobj); put_device(&memory->dev);
device_unregister(&memory->dev); device_unregister(&memory->dev);
} }
...@@ -682,7 +659,7 @@ static int remove_memory_block(unsigned long node_id, ...@@ -682,7 +659,7 @@ static int remove_memory_block(unsigned long node_id,
if (mem->section_count == 0) if (mem->section_count == 0)
unregister_memory(mem); unregister_memory(mem);
else else
kobject_put(&mem->dev.kobj); put_device(&mem->dev);
mutex_unlock(&mem_sysfs_mutex); mutex_unlock(&mem_sysfs_mutex);
return 0; return 0;
...@@ -735,7 +712,6 @@ int __init memory_dev_init(void) ...@@ -735,7 +712,6 @@ int __init memory_dev_init(void)
int ret; int ret;
int err; int err;
unsigned long block_sz; unsigned long block_sz;
struct memory_block *mem = NULL;
ret = subsys_system_register(&memory_subsys, memory_root_attr_groups); ret = subsys_system_register(&memory_subsys, memory_root_attr_groups);
if (ret) if (ret)
...@@ -748,17 +724,13 @@ int __init memory_dev_init(void) ...@@ -748,17 +724,13 @@ int __init memory_dev_init(void)
* Create entries for memory sections that were found * Create entries for memory sections that were found
* during boot and have been initialized * during boot and have been initialized
*/ */
for (i = 0; i < NR_MEM_SECTIONS; i++) { mutex_lock(&mem_sysfs_mutex);
if (!present_section_nr(i)) for (i = 0; i < NR_MEM_SECTIONS; i += sections_per_block) {
continue; err = add_memory_block(i);
/* don't need to reuse memory_block if only one per block */
err = add_memory_section(0, __nr_to_section(i),
(sections_per_block == 1) ? NULL : &mem,
MEM_ONLINE,
BOOT);
if (!ret) if (!ret)
ret = err; ret = err;
} }
mutex_unlock(&mem_sysfs_mutex);
out: out:
if (ret) if (ret)
......
...@@ -672,11 +672,13 @@ static ssize_t modalias_show(struct device *dev, struct device_attribute *a, ...@@ -672,11 +672,13 @@ static ssize_t modalias_show(struct device *dev, struct device_attribute *a,
return (len >= PAGE_SIZE) ? (PAGE_SIZE - 1) : len; return (len >= PAGE_SIZE) ? (PAGE_SIZE - 1) : len;
} }
static DEVICE_ATTR_RO(modalias);
static struct device_attribute platform_dev_attrs[] = { static struct attribute *platform_dev_attrs[] = {
__ATTR_RO(modalias), &dev_attr_modalias.attr,
__ATTR_NULL, NULL,
}; };
ATTRIBUTE_GROUPS(platform_dev);
static int platform_uevent(struct device *dev, struct kobj_uevent_env *env) static int platform_uevent(struct device *dev, struct kobj_uevent_env *env)
{ {
...@@ -893,7 +895,7 @@ static const struct dev_pm_ops platform_dev_pm_ops = { ...@@ -893,7 +895,7 @@ static const struct dev_pm_ops platform_dev_pm_ops = {
struct bus_type platform_bus_type = { struct bus_type platform_bus_type = {
.name = "platform", .name = "platform",
.dev_attrs = platform_dev_attrs, .dev_groups = platform_dev_groups,
.match = platform_match, .match = platform_match,
.uevent = platform_uevent, .uevent = platform_uevent,
.pm = &platform_dev_pm_ops, .pm = &platform_dev_pm_ops,
...@@ -1054,7 +1056,7 @@ void __init early_platform_driver_register_all(char *class_str) ...@@ -1054,7 +1056,7 @@ void __init early_platform_driver_register_all(char *class_str)
* @epdrv: early platform driver structure * @epdrv: early platform driver structure
* @id: id to match against * @id: id to match against
*/ */
static __init struct platform_device * static struct platform_device * __init
early_platform_match(struct early_platform_driver *epdrv, int id) early_platform_match(struct early_platform_driver *epdrv, int id)
{ {
struct platform_device *pd; struct platform_device *pd;
...@@ -1072,7 +1074,7 @@ early_platform_match(struct early_platform_driver *epdrv, int id) ...@@ -1072,7 +1074,7 @@ early_platform_match(struct early_platform_driver *epdrv, int id)
* @epdrv: early platform driver structure * @epdrv: early platform driver structure
* @id: return true if id or above exists * @id: return true if id or above exists
*/ */
static __init int early_platform_left(struct early_platform_driver *epdrv, static int __init early_platform_left(struct early_platform_driver *epdrv,
int id) int id)
{ {
struct platform_device *pd; struct platform_device *pd;
......
...@@ -206,7 +206,7 @@ static ssize_t autosuspend_delay_ms_store(struct device *dev, ...@@ -206,7 +206,7 @@ static ssize_t autosuspend_delay_ms_store(struct device *dev,
if (!dev->power.use_autosuspend) if (!dev->power.use_autosuspend)
return -EIO; return -EIO;
if (strict_strtol(buf, 10, &delay) != 0 || delay != (int) delay) if (kstrtol(buf, 10, &delay) != 0 || delay != (int) delay)
return -EINVAL; return -EINVAL;
device_lock(dev); device_lock(dev);
......
...@@ -281,7 +281,7 @@ static ssize_t regmap_map_write_file(struct file *file, ...@@ -281,7 +281,7 @@ static ssize_t regmap_map_write_file(struct file *file,
reg = simple_strtoul(start, &start, 16); reg = simple_strtoul(start, &start, 16);
while (*start == ' ') while (*start == ' ')
start++; start++;
if (strict_strtoul(start, 16, &value)) if (kstrtoul(start, 16, &value))
return -EINVAL; return -EINVAL;
/* Userspace has been fiddling around behind the kernel's back */ /* Userspace has been fiddling around behind the kernel's back */
......
...@@ -62,25 +62,6 @@ static ssize_t show_cpumap(int type, const struct cpumask *mask, char *buf) ...@@ -62,25 +62,6 @@ static ssize_t show_cpumap(int type, const struct cpumask *mask, char *buf)
} }
#endif #endif
#ifdef arch_provides_topology_pointers
#define define_siblings_show_map(name) \
static ssize_t show_##name(struct device *dev, \
struct device_attribute *attr, char *buf) \
{ \
unsigned int cpu = dev->id; \
return show_cpumap(0, topology_##name(cpu), buf); \
}
#define define_siblings_show_list(name) \
static ssize_t show_##name##_list(struct device *dev, \
struct device_attribute *attr, \
char *buf) \
{ \
unsigned int cpu = dev->id; \
return show_cpumap(1, topology_##name(cpu), buf); \
}
#else
#define define_siblings_show_map(name) \ #define define_siblings_show_map(name) \
static ssize_t show_##name(struct device *dev, \ static ssize_t show_##name(struct device *dev, \
struct device_attribute *attr, char *buf) \ struct device_attribute *attr, char *buf) \
...@@ -95,7 +76,6 @@ static ssize_t show_##name##_list(struct device *dev, \ ...@@ -95,7 +76,6 @@ static ssize_t show_##name##_list(struct device *dev, \
{ \ { \
return show_cpumap(1, topology_##name(dev->id), buf); \ return show_cpumap(1, topology_##name(dev->id), buf); \
} }
#endif
#define define_siblings_show_func(name) \ #define define_siblings_show_func(name) \
define_siblings_show_map(name); define_siblings_show_list(name) define_siblings_show_map(name); define_siblings_show_list(name)
......
...@@ -397,15 +397,19 @@ static ssize_t rbd_remove(struct bus_type *bus, const char *buf, ...@@ -397,15 +397,19 @@ static ssize_t rbd_remove(struct bus_type *bus, const char *buf,
static int rbd_dev_image_probe(struct rbd_device *rbd_dev, bool mapping); static int rbd_dev_image_probe(struct rbd_device *rbd_dev, bool mapping);
static void rbd_spec_put(struct rbd_spec *spec); static void rbd_spec_put(struct rbd_spec *spec);
static struct bus_attribute rbd_bus_attrs[] = { static BUS_ATTR(add, S_IWUSR, NULL, rbd_add);
__ATTR(add, S_IWUSR, NULL, rbd_add), static BUS_ATTR(remove, S_IWUSR, NULL, rbd_remove);
__ATTR(remove, S_IWUSR, NULL, rbd_remove),
__ATTR_NULL static struct attribute *rbd_bus_attrs[] = {
&bus_attr_add.attr,
&bus_attr_remove.attr,
NULL,
}; };
ATTRIBUTE_GROUPS(rbd_bus);
static struct bus_type rbd_bus_type = { static struct bus_type rbd_bus_type = {
.name = "rbd", .name = "rbd",
.bus_attrs = rbd_bus_attrs, .bus_groups = rbd_bus_groups,
}; };
static void rbd_root_dev_release(struct device *dev) static void rbd_root_dev_release(struct device *dev)
......
...@@ -95,6 +95,7 @@ bsr_size_show(struct device *dev, struct device_attribute *attr, char *buf) ...@@ -95,6 +95,7 @@ bsr_size_show(struct device *dev, struct device_attribute *attr, char *buf)
struct bsr_dev *bsr_dev = dev_get_drvdata(dev); struct bsr_dev *bsr_dev = dev_get_drvdata(dev);
return sprintf(buf, "%u\n", bsr_dev->bsr_bytes); return sprintf(buf, "%u\n", bsr_dev->bsr_bytes);
} }
static DEVICE_ATTR_RO(bsr_size);
static ssize_t static ssize_t
bsr_stride_show(struct device *dev, struct device_attribute *attr, char *buf) bsr_stride_show(struct device *dev, struct device_attribute *attr, char *buf)
...@@ -102,20 +103,23 @@ bsr_stride_show(struct device *dev, struct device_attribute *attr, char *buf) ...@@ -102,20 +103,23 @@ bsr_stride_show(struct device *dev, struct device_attribute *attr, char *buf)
struct bsr_dev *bsr_dev = dev_get_drvdata(dev); struct bsr_dev *bsr_dev = dev_get_drvdata(dev);
return sprintf(buf, "%u\n", bsr_dev->bsr_stride); return sprintf(buf, "%u\n", bsr_dev->bsr_stride);
} }
static DEVICE_ATTR_RO(bsr_stride);
static ssize_t static ssize_t
bsr_len_show(struct device *dev, struct device_attribute *attr, char *buf) bsr_length_show(struct device *dev, struct device_attribute *attr, char *buf)
{ {
struct bsr_dev *bsr_dev = dev_get_drvdata(dev); struct bsr_dev *bsr_dev = dev_get_drvdata(dev);
return sprintf(buf, "%llu\n", bsr_dev->bsr_len); return sprintf(buf, "%llu\n", bsr_dev->bsr_len);
} }
static DEVICE_ATTR_RO(bsr_length);
static struct device_attribute bsr_dev_attrs[] = { static struct attribute *bsr_dev_attrs[] = {
__ATTR(bsr_size, S_IRUGO, bsr_size_show, NULL), &dev_attr_bsr_size.attr,
__ATTR(bsr_stride, S_IRUGO, bsr_stride_show, NULL), &dev_attr_bsr_stride.attr,
__ATTR(bsr_length, S_IRUGO, bsr_len_show, NULL), &dev_attr_bsr_length.attr,
__ATTR_NULL NULL,
}; };
ATTRIBUTE_GROUPS(bsr_dev);
static int bsr_mmap(struct file *filp, struct vm_area_struct *vma) static int bsr_mmap(struct file *filp, struct vm_area_struct *vma)
{ {
...@@ -308,7 +312,7 @@ static int __init bsr_init(void) ...@@ -308,7 +312,7 @@ static int __init bsr_init(void)
ret = PTR_ERR(bsr_class); ret = PTR_ERR(bsr_class);
goto out_err_1; goto out_err_1;
} }
bsr_class->dev_attrs = bsr_dev_attrs; bsr_class->dev_groups = bsr_dev_groups;
ret = alloc_chrdev_region(&bsr_dev, 0, BSR_MAX_DEVS, "bsr"); ret = alloc_chrdev_region(&bsr_dev, 0, BSR_MAX_DEVS, "bsr");
bsr_major = MAJOR(bsr_dev); bsr_major = MAJOR(bsr_dev);
......
...@@ -279,33 +279,37 @@ loff_t srom_llseek(struct file *file, loff_t offset, int origin) ...@@ -279,33 +279,37 @@ loff_t srom_llseek(struct file *file, loff_t offset, int origin)
return fixed_size_llseek(file, offset, origin, srom->total_size); return fixed_size_llseek(file, offset, origin, srom->total_size);
} }
static ssize_t total_show(struct device *dev, static ssize_t total_size_show(struct device *dev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
{ {
struct srom_dev *srom = dev_get_drvdata(dev); struct srom_dev *srom = dev_get_drvdata(dev);
return sprintf(buf, "%u\n", srom->total_size); return sprintf(buf, "%u\n", srom->total_size);
} }
static DEVICE_ATTR_RO(total_size);
static ssize_t sector_show(struct device *dev, static ssize_t sector_size_show(struct device *dev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
{ {
struct srom_dev *srom = dev_get_drvdata(dev); struct srom_dev *srom = dev_get_drvdata(dev);
return sprintf(buf, "%u\n", srom->sector_size); return sprintf(buf, "%u\n", srom->sector_size);
} }
static DEVICE_ATTR_RO(sector_size);
static ssize_t page_show(struct device *dev, static ssize_t page_size_show(struct device *dev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
{ {
struct srom_dev *srom = dev_get_drvdata(dev); struct srom_dev *srom = dev_get_drvdata(dev);
return sprintf(buf, "%u\n", srom->page_size); return sprintf(buf, "%u\n", srom->page_size);
} }
static DEVICE_ATTR_RO(page_size);
static struct device_attribute srom_dev_attrs[] = { static struct attribute *srom_dev_attrs[] = {
__ATTR(total_size, S_IRUGO, total_show, NULL), &dev_attr_total_size.attr,
__ATTR(sector_size, S_IRUGO, sector_show, NULL), &dev_attr_sector_size.attr,
__ATTR(page_size, S_IRUGO, page_show, NULL), &dev_attr_page_size.attr,
__ATTR_NULL NULL,
}; };
ATTRIBUTE_GROUPS(srom_dev);
static char *srom_devnode(struct device *dev, umode_t *mode) static char *srom_devnode(struct device *dev, umode_t *mode)
{ {
...@@ -418,7 +422,7 @@ static int srom_init(void) ...@@ -418,7 +422,7 @@ static int srom_init(void)
result = PTR_ERR(srom_class); result = PTR_ERR(srom_class);
goto fail_cdev; goto fail_cdev;
} }
srom_class->dev_attrs = srom_dev_attrs; srom_class->dev_groups = srom_dev_groups;
srom_class->devnode = srom_devnode; srom_class->devnode = srom_devnode;
/* Do per-partition initialization */ /* Do per-partition initialization */
......
...@@ -703,7 +703,7 @@ int devfreq_remove_governor(struct devfreq_governor *governor) ...@@ -703,7 +703,7 @@ int devfreq_remove_governor(struct devfreq_governor *governor)
} }
EXPORT_SYMBOL(devfreq_remove_governor); EXPORT_SYMBOL(devfreq_remove_governor);
static ssize_t show_governor(struct device *dev, static ssize_t governor_show(struct device *dev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
{ {
if (!to_devfreq(dev)->governor) if (!to_devfreq(dev)->governor)
...@@ -712,7 +712,7 @@ static ssize_t show_governor(struct device *dev, ...@@ -712,7 +712,7 @@ static ssize_t show_governor(struct device *dev,
return sprintf(buf, "%s\n", to_devfreq(dev)->governor->name); return sprintf(buf, "%s\n", to_devfreq(dev)->governor->name);
} }
static ssize_t store_governor(struct device *dev, struct device_attribute *attr, static ssize_t governor_store(struct device *dev, struct device_attribute *attr,
const char *buf, size_t count) const char *buf, size_t count)
{ {
struct devfreq *df = to_devfreq(dev); struct devfreq *df = to_devfreq(dev);
...@@ -754,9 +754,11 @@ static ssize_t store_governor(struct device *dev, struct device_attribute *attr, ...@@ -754,9 +754,11 @@ static ssize_t store_governor(struct device *dev, struct device_attribute *attr,
ret = count; ret = count;
return ret; return ret;
} }
static ssize_t show_available_governors(struct device *d, static DEVICE_ATTR_RW(governor);
struct device_attribute *attr,
char *buf) static ssize_t available_governors_show(struct device *d,
struct device_attribute *attr,
char *buf)
{ {
struct devfreq_governor *tmp_governor; struct devfreq_governor *tmp_governor;
ssize_t count = 0; ssize_t count = 0;
...@@ -775,9 +777,10 @@ static ssize_t show_available_governors(struct device *d, ...@@ -775,9 +777,10 @@ static ssize_t show_available_governors(struct device *d,
return count; return count;
} }
static DEVICE_ATTR_RO(available_governors);
static ssize_t show_freq(struct device *dev, static ssize_t cur_freq_show(struct device *dev, struct device_attribute *attr,
struct device_attribute *attr, char *buf) char *buf)
{ {
unsigned long freq; unsigned long freq;
struct devfreq *devfreq = to_devfreq(dev); struct devfreq *devfreq = to_devfreq(dev);
...@@ -788,20 +791,22 @@ static ssize_t show_freq(struct device *dev, ...@@ -788,20 +791,22 @@ static ssize_t show_freq(struct device *dev,
return sprintf(buf, "%lu\n", devfreq->previous_freq); return sprintf(buf, "%lu\n", devfreq->previous_freq);
} }
static DEVICE_ATTR_RO(cur_freq);
static ssize_t show_target_freq(struct device *dev, static ssize_t target_freq_show(struct device *dev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
{ {
return sprintf(buf, "%lu\n", to_devfreq(dev)->previous_freq); return sprintf(buf, "%lu\n", to_devfreq(dev)->previous_freq);
} }
static DEVICE_ATTR_RO(target_freq);
static ssize_t show_polling_interval(struct device *dev, static ssize_t polling_interval_show(struct device *dev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
{ {
return sprintf(buf, "%d\n", to_devfreq(dev)->profile->polling_ms); return sprintf(buf, "%d\n", to_devfreq(dev)->profile->polling_ms);
} }
static ssize_t store_polling_interval(struct device *dev, static ssize_t polling_interval_store(struct device *dev,
struct device_attribute *attr, struct device_attribute *attr,
const char *buf, size_t count) const char *buf, size_t count)
{ {
...@@ -821,8 +826,9 @@ static ssize_t store_polling_interval(struct device *dev, ...@@ -821,8 +826,9 @@ static ssize_t store_polling_interval(struct device *dev,
return ret; return ret;
} }
static DEVICE_ATTR_RW(polling_interval);
static ssize_t store_min_freq(struct device *dev, struct device_attribute *attr, static ssize_t min_freq_store(struct device *dev, struct device_attribute *attr,
const char *buf, size_t count) const char *buf, size_t count)
{ {
struct devfreq *df = to_devfreq(dev); struct devfreq *df = to_devfreq(dev);
...@@ -849,13 +855,13 @@ static ssize_t store_min_freq(struct device *dev, struct device_attribute *attr, ...@@ -849,13 +855,13 @@ static ssize_t store_min_freq(struct device *dev, struct device_attribute *attr,
return ret; return ret;
} }
static ssize_t show_min_freq(struct device *dev, struct device_attribute *attr, static ssize_t min_freq_show(struct device *dev, struct device_attribute *attr,
char *buf) char *buf)
{ {
return sprintf(buf, "%lu\n", to_devfreq(dev)->min_freq); return sprintf(buf, "%lu\n", to_devfreq(dev)->min_freq);
} }
static ssize_t store_max_freq(struct device *dev, struct device_attribute *attr, static ssize_t max_freq_store(struct device *dev, struct device_attribute *attr,
const char *buf, size_t count) const char *buf, size_t count)
{ {
struct devfreq *df = to_devfreq(dev); struct devfreq *df = to_devfreq(dev);
...@@ -881,16 +887,18 @@ static ssize_t store_max_freq(struct device *dev, struct device_attribute *attr, ...@@ -881,16 +887,18 @@ static ssize_t store_max_freq(struct device *dev, struct device_attribute *attr,
mutex_unlock(&df->lock); mutex_unlock(&df->lock);
return ret; return ret;
} }
static DEVICE_ATTR_RW(min_freq);
static ssize_t show_max_freq(struct device *dev, struct device_attribute *attr, static ssize_t max_freq_show(struct device *dev, struct device_attribute *attr,
char *buf) char *buf)
{ {
return sprintf(buf, "%lu\n", to_devfreq(dev)->max_freq); return sprintf(buf, "%lu\n", to_devfreq(dev)->max_freq);
} }
static DEVICE_ATTR_RW(max_freq);
static ssize_t show_available_freqs(struct device *d, static ssize_t available_frequencies_show(struct device *d,
struct device_attribute *attr, struct device_attribute *attr,
char *buf) char *buf)
{ {
struct devfreq *df = to_devfreq(d); struct devfreq *df = to_devfreq(d);
struct device *dev = df->dev.parent; struct device *dev = df->dev.parent;
...@@ -918,9 +926,10 @@ static ssize_t show_available_freqs(struct device *d, ...@@ -918,9 +926,10 @@ static ssize_t show_available_freqs(struct device *d,
return count; return count;
} }
static DEVICE_ATTR_RO(available_frequencies);
static ssize_t show_trans_table(struct device *dev, struct device_attribute *attr, static ssize_t trans_stat_show(struct device *dev,
char *buf) struct device_attribute *attr, char *buf)
{ {
struct devfreq *devfreq = to_devfreq(dev); struct devfreq *devfreq = to_devfreq(dev);
ssize_t len; ssize_t len;
...@@ -959,20 +968,21 @@ static ssize_t show_trans_table(struct device *dev, struct device_attribute *att ...@@ -959,20 +968,21 @@ static ssize_t show_trans_table(struct device *dev, struct device_attribute *att
devfreq->total_trans); devfreq->total_trans);
return len; return len;
} }
static DEVICE_ATTR_RO(trans_stat);
static struct device_attribute devfreq_attrs[] = {
__ATTR(governor, S_IRUGO | S_IWUSR, show_governor, store_governor), static struct attribute *devfreq_attrs[] = {
__ATTR(available_governors, S_IRUGO, show_available_governors, NULL), &dev_attr_governor.attr,
__ATTR(cur_freq, S_IRUGO, show_freq, NULL), &dev_attr_available_governors.attr,
__ATTR(available_frequencies, S_IRUGO, show_available_freqs, NULL), &dev_attr_cur_freq.attr,
__ATTR(target_freq, S_IRUGO, show_target_freq, NULL), &dev_attr_available_frequencies.attr,
__ATTR(polling_interval, S_IRUGO | S_IWUSR, show_polling_interval, &dev_attr_target_freq.attr,
store_polling_interval), &dev_attr_polling_interval.attr,
__ATTR(min_freq, S_IRUGO | S_IWUSR, show_min_freq, store_min_freq), &dev_attr_min_freq.attr,
__ATTR(max_freq, S_IRUGO | S_IWUSR, show_max_freq, store_max_freq), &dev_attr_max_freq.attr,
__ATTR(trans_stat, S_IRUGO, show_trans_table, NULL), &dev_attr_trans_stat.attr,
{ }, NULL,
}; };
ATTRIBUTE_GROUPS(devfreq);
static int __init devfreq_init(void) static int __init devfreq_init(void)
{ {
...@@ -988,7 +998,7 @@ static int __init devfreq_init(void) ...@@ -988,7 +998,7 @@ static int __init devfreq_init(void)
pr_err("%s: couldn't create workqueue\n", __FILE__); pr_err("%s: couldn't create workqueue\n", __FILE__);
return PTR_ERR(devfreq_wq); return PTR_ERR(devfreq_wq);
} }
devfreq_class->dev_attrs = devfreq_attrs; devfreq_class->dev_groups = devfreq_groups;
return 0; return 0;
} }
......
...@@ -87,7 +87,8 @@ static struct dma_chan *dev_to_dma_chan(struct device *dev) ...@@ -87,7 +87,8 @@ static struct dma_chan *dev_to_dma_chan(struct device *dev)
return chan_dev->chan; return chan_dev->chan;
} }
static ssize_t show_memcpy_count(struct device *dev, struct device_attribute *attr, char *buf) static ssize_t memcpy_count_show(struct device *dev,
struct device_attribute *attr, char *buf)
{ {
struct dma_chan *chan; struct dma_chan *chan;
unsigned long count = 0; unsigned long count = 0;
...@@ -106,9 +107,10 @@ static ssize_t show_memcpy_count(struct device *dev, struct device_attribute *at ...@@ -106,9 +107,10 @@ static ssize_t show_memcpy_count(struct device *dev, struct device_attribute *at
return err; return err;
} }
static DEVICE_ATTR_RO(memcpy_count);
static ssize_t show_bytes_transferred(struct device *dev, struct device_attribute *attr, static ssize_t bytes_transferred_show(struct device *dev,
char *buf) struct device_attribute *attr, char *buf)
{ {
struct dma_chan *chan; struct dma_chan *chan;
unsigned long count = 0; unsigned long count = 0;
...@@ -127,8 +129,10 @@ static ssize_t show_bytes_transferred(struct device *dev, struct device_attribut ...@@ -127,8 +129,10 @@ static ssize_t show_bytes_transferred(struct device *dev, struct device_attribut
return err; return err;
} }
static DEVICE_ATTR_RO(bytes_transferred);
static ssize_t show_in_use(struct device *dev, struct device_attribute *attr, char *buf) static ssize_t in_use_show(struct device *dev, struct device_attribute *attr,
char *buf)
{ {
struct dma_chan *chan; struct dma_chan *chan;
int err; int err;
...@@ -143,13 +147,15 @@ static ssize_t show_in_use(struct device *dev, struct device_attribute *attr, ch ...@@ -143,13 +147,15 @@ static ssize_t show_in_use(struct device *dev, struct device_attribute *attr, ch
return err; return err;
} }
static DEVICE_ATTR_RO(in_use);
static struct device_attribute dma_attrs[] = { static struct attribute *dma_dev_attrs[] = {
__ATTR(memcpy_count, S_IRUGO, show_memcpy_count, NULL), &dev_attr_memcpy_count.attr,
__ATTR(bytes_transferred, S_IRUGO, show_bytes_transferred, NULL), &dev_attr_bytes_transferred.attr,
__ATTR(in_use, S_IRUGO, show_in_use, NULL), &dev_attr_in_use.attr,
__ATTR_NULL NULL,
}; };
ATTRIBUTE_GROUPS(dma_dev);
static void chan_dev_release(struct device *dev) static void chan_dev_release(struct device *dev)
{ {
...@@ -167,7 +173,7 @@ static void chan_dev_release(struct device *dev) ...@@ -167,7 +173,7 @@ static void chan_dev_release(struct device *dev)
static struct class dma_devclass = { static struct class dma_devclass = {
.name = "dma", .name = "dma",
.dev_attrs = dma_attrs, .dev_groups = dma_dev_groups,
.dev_release = chan_dev_release, .dev_release = chan_dev_release,
}; };
......
...@@ -148,6 +148,7 @@ static ssize_t state_store(struct device *dev, struct device_attribute *attr, ...@@ -148,6 +148,7 @@ static ssize_t state_store(struct device *dev, struct device_attribute *attr,
return count; return count;
} }
static DEVICE_ATTR_RW(state);
static ssize_t name_show(struct device *dev, struct device_attribute *attr, static ssize_t name_show(struct device *dev, struct device_attribute *attr,
char *buf) char *buf)
...@@ -163,6 +164,7 @@ static ssize_t name_show(struct device *dev, struct device_attribute *attr, ...@@ -163,6 +164,7 @@ static ssize_t name_show(struct device *dev, struct device_attribute *attr,
return sprintf(buf, "%s\n", dev_name(edev->dev)); return sprintf(buf, "%s\n", dev_name(edev->dev));
} }
static DEVICE_ATTR_RO(name);
static ssize_t cable_name_show(struct device *dev, static ssize_t cable_name_show(struct device *dev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
...@@ -527,11 +529,12 @@ int extcon_unregister_notifier(struct extcon_dev *edev, ...@@ -527,11 +529,12 @@ int extcon_unregister_notifier(struct extcon_dev *edev,
} }
EXPORT_SYMBOL_GPL(extcon_unregister_notifier); EXPORT_SYMBOL_GPL(extcon_unregister_notifier);
static struct device_attribute extcon_attrs[] = { static struct attribute *extcon_attrs[] = {
__ATTR(state, S_IRUGO | S_IWUSR, state_show, state_store), &dev_attr_state.attr,
__ATTR_RO(name), &dev_attr_name.attr,
__ATTR_NULL, NULL,
}; };
ATTRIBUTE_GROUPS(extcon);
static int create_extcon_class(void) static int create_extcon_class(void)
{ {
...@@ -539,7 +542,7 @@ static int create_extcon_class(void) ...@@ -539,7 +542,7 @@ static int create_extcon_class(void)
extcon_class = class_create(THIS_MODULE, "extcon"); extcon_class = class_create(THIS_MODULE, "extcon");
if (IS_ERR(extcon_class)) if (IS_ERR(extcon_class))
return PTR_ERR(extcon_class); return PTR_ERR(extcon_class);
extcon_class->dev_attrs = extcon_attrs; extcon_class->dev_groups = extcon_groups;
#if defined(CONFIG_ANDROID) #if defined(CONFIG_ANDROID)
switch_class = class_compat_register("switch"); switch_class = class_compat_register("switch");
......
...@@ -535,11 +535,12 @@ static struct attribute *dcdbas_dev_attrs[] = { ...@@ -535,11 +535,12 @@ static struct attribute *dcdbas_dev_attrs[] = {
static struct attribute_group dcdbas_attr_group = { static struct attribute_group dcdbas_attr_group = {
.attrs = dcdbas_dev_attrs, .attrs = dcdbas_dev_attrs,
.bin_attrs = dcdbas_bin_attrs,
}; };
static int dcdbas_probe(struct platform_device *dev) static int dcdbas_probe(struct platform_device *dev)
{ {
int i, error; int error;
host_control_action = HC_ACTION_NONE; host_control_action = HC_ACTION_NONE;
host_control_smi_type = HC_SMITYPE_NONE; host_control_smi_type = HC_SMITYPE_NONE;
...@@ -555,18 +556,6 @@ static int dcdbas_probe(struct platform_device *dev) ...@@ -555,18 +556,6 @@ static int dcdbas_probe(struct platform_device *dev)
if (error) if (error)
return error; return error;
for (i = 0; dcdbas_bin_attrs[i]; i++) {
error = sysfs_create_bin_file(&dev->dev.kobj,
dcdbas_bin_attrs[i]);
if (error) {
while (--i >= 0)
sysfs_remove_bin_file(&dev->dev.kobj,
dcdbas_bin_attrs[i]);
sysfs_remove_group(&dev->dev.kobj, &dcdbas_attr_group);
return error;
}
}
register_reboot_notifier(&dcdbas_reboot_nb); register_reboot_notifier(&dcdbas_reboot_nb);
dev_info(&dev->dev, "%s (version %s)\n", dev_info(&dev->dev, "%s (version %s)\n",
...@@ -577,11 +566,7 @@ static int dcdbas_probe(struct platform_device *dev) ...@@ -577,11 +566,7 @@ static int dcdbas_probe(struct platform_device *dev)
static int dcdbas_remove(struct platform_device *dev) static int dcdbas_remove(struct platform_device *dev)
{ {
int i;
unregister_reboot_notifier(&dcdbas_reboot_nb); unregister_reboot_notifier(&dcdbas_reboot_nb);
for (i = 0; dcdbas_bin_attrs[i]; i++)
sysfs_remove_bin_file(&dev->dev.kobj, dcdbas_bin_attrs[i]);
sysfs_remove_group(&dev->dev.kobj, &dcdbas_attr_group); sysfs_remove_group(&dev->dev.kobj, &dcdbas_attr_group);
return 0; return 0;
......
...@@ -1917,11 +1917,13 @@ static ssize_t modalias_show(struct device *dev, struct device_attribute *a, ...@@ -1917,11 +1917,13 @@ static ssize_t modalias_show(struct device *dev, struct device_attribute *a,
return (len >= PAGE_SIZE) ? (PAGE_SIZE - 1) : len; return (len >= PAGE_SIZE) ? (PAGE_SIZE - 1) : len;
} }
static DEVICE_ATTR_RO(modalias);
static struct device_attribute hid_dev_attrs[] = { static struct attribute *hid_dev_attrs[] = {
__ATTR_RO(modalias), &dev_attr_modalias.attr,
__ATTR_NULL, NULL,
}; };
ATTRIBUTE_GROUPS(hid_dev);
static int hid_uevent(struct device *dev, struct kobj_uevent_env *env) static int hid_uevent(struct device *dev, struct kobj_uevent_env *env)
{ {
...@@ -1949,7 +1951,7 @@ static int hid_uevent(struct device *dev, struct kobj_uevent_env *env) ...@@ -1949,7 +1951,7 @@ static int hid_uevent(struct device *dev, struct kobj_uevent_env *env)
static struct bus_type hid_bus_type = { static struct bus_type hid_bus_type = {
.name = "hid", .name = "hid",
.dev_attrs = hid_dev_attrs, .dev_groups = hid_dev_groups,
.match = hid_bus_match, .match = hid_bus_match,
.probe = hid_device_probe, .probe = hid_device_probe,
.remove = hid_device_remove, .remove = hid_device_remove,
......
...@@ -75,6 +75,8 @@ static ssize_t arvo_sysfs_set_mode_key(struct device *dev, ...@@ -75,6 +75,8 @@ static ssize_t arvo_sysfs_set_mode_key(struct device *dev,
return size; return size;
} }
static DEVICE_ATTR(mode_key, 0660,
arvo_sysfs_show_mode_key, arvo_sysfs_set_mode_key);
static ssize_t arvo_sysfs_show_key_mask(struct device *dev, static ssize_t arvo_sysfs_show_key_mask(struct device *dev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
...@@ -123,6 +125,8 @@ static ssize_t arvo_sysfs_set_key_mask(struct device *dev, ...@@ -123,6 +125,8 @@ static ssize_t arvo_sysfs_set_key_mask(struct device *dev,
return size; return size;
} }
static DEVICE_ATTR(key_mask, 0660,
arvo_sysfs_show_key_mask, arvo_sysfs_set_key_mask);
/* retval is 1-5 on success, < 0 on error */ /* retval is 1-5 on success, < 0 on error */
static int arvo_get_actual_profile(struct usb_device *usb_dev) static int arvo_get_actual_profile(struct usb_device *usb_dev)
...@@ -179,6 +183,9 @@ static ssize_t arvo_sysfs_set_actual_profile(struct device *dev, ...@@ -179,6 +183,9 @@ static ssize_t arvo_sysfs_set_actual_profile(struct device *dev,
mutex_unlock(&arvo->arvo_lock); mutex_unlock(&arvo->arvo_lock);
return retval; return retval;
} }
static DEVICE_ATTR(actual_profile, 0660,
arvo_sysfs_show_actual_profile,
arvo_sysfs_set_actual_profile);
static ssize_t arvo_sysfs_write(struct file *fp, static ssize_t arvo_sysfs_write(struct file *fp,
struct kobject *kobj, void const *buf, struct kobject *kobj, void const *buf,
...@@ -230,6 +237,8 @@ static ssize_t arvo_sysfs_write_button(struct file *fp, ...@@ -230,6 +237,8 @@ static ssize_t arvo_sysfs_write_button(struct file *fp,
return arvo_sysfs_write(fp, kobj, buf, off, count, return arvo_sysfs_write(fp, kobj, buf, off, count,
sizeof(struct arvo_button), ARVO_COMMAND_BUTTON); sizeof(struct arvo_button), ARVO_COMMAND_BUTTON);
} }
static BIN_ATTR(button, 0220, NULL, arvo_sysfs_write_button,
sizeof(struct arvo_button));
static ssize_t arvo_sysfs_read_info(struct file *fp, static ssize_t arvo_sysfs_read_info(struct file *fp,
struct kobject *kobj, struct bin_attribute *attr, char *buf, struct kobject *kobj, struct bin_attribute *attr, char *buf,
...@@ -238,31 +247,30 @@ static ssize_t arvo_sysfs_read_info(struct file *fp, ...@@ -238,31 +247,30 @@ static ssize_t arvo_sysfs_read_info(struct file *fp,
return arvo_sysfs_read(fp, kobj, buf, off, count, return arvo_sysfs_read(fp, kobj, buf, off, count,
sizeof(struct arvo_info), ARVO_COMMAND_INFO); sizeof(struct arvo_info), ARVO_COMMAND_INFO);
} }
static BIN_ATTR(info, 0440, arvo_sysfs_read_info, NULL,
sizeof(struct arvo_info));
static struct attribute *arvo_attrs[] = {
&dev_attr_mode_key.attr,
&dev_attr_key_mask.attr,
&dev_attr_actual_profile.attr,
NULL,
};
static struct bin_attribute *arvo_bin_attributes[] = {
&bin_attr_button,
&bin_attr_info,
NULL,
};
static struct device_attribute arvo_attributes[] = { static const struct attribute_group arvo_group = {
__ATTR(mode_key, 0660, .attrs = arvo_attrs,
arvo_sysfs_show_mode_key, arvo_sysfs_set_mode_key), .bin_attrs = arvo_bin_attributes,
__ATTR(key_mask, 0660,
arvo_sysfs_show_key_mask, arvo_sysfs_set_key_mask),
__ATTR(actual_profile, 0660,
arvo_sysfs_show_actual_profile,
arvo_sysfs_set_actual_profile),
__ATTR_NULL
}; };
static struct bin_attribute arvo_bin_attributes[] = { static const struct attribute_group *arvo_groups[] = {
{ &arvo_group,
.attr = { .name = "button", .mode = 0220 }, NULL,
.size = sizeof(struct arvo_button),
.write = arvo_sysfs_write_button
},
{
.attr = { .name = "info", .mode = 0440 },
.size = sizeof(struct arvo_info),
.read = arvo_sysfs_read_info
},
__ATTR_NULL
}; };
static int arvo_init_arvo_device_struct(struct usb_device *usb_dev, static int arvo_init_arvo_device_struct(struct usb_device *usb_dev,
...@@ -430,8 +438,7 @@ static int __init arvo_init(void) ...@@ -430,8 +438,7 @@ static int __init arvo_init(void)
arvo_class = class_create(THIS_MODULE, "arvo"); arvo_class = class_create(THIS_MODULE, "arvo");
if (IS_ERR(arvo_class)) if (IS_ERR(arvo_class))
return PTR_ERR(arvo_class); return PTR_ERR(arvo_class);
arvo_class->dev_attrs = arvo_attributes; arvo_class->dev_groups = arvo_groups;
arvo_class->dev_bin_attrs = arvo_bin_attributes;
retval = hid_register_driver(&arvo_driver); retval = hid_register_driver(&arvo_driver);
if (retval) if (retval)
......
...@@ -109,12 +109,12 @@ static ssize_t isku_sysfs_set_actual_profile(struct device *dev, ...@@ -109,12 +109,12 @@ static ssize_t isku_sysfs_set_actual_profile(struct device *dev,
return size; return size;
} }
static DEVICE_ATTR(actual_profile, 0660, isku_sysfs_show_actual_profile,
isku_sysfs_set_actual_profile);
static struct device_attribute isku_attributes[] = { static struct attribute *isku_attrs[] = {
__ATTR(actual_profile, 0660, &dev_attr_actual_profile.attr,
isku_sysfs_show_actual_profile, NULL,
isku_sysfs_set_actual_profile),
__ATTR_NULL
}; };
static ssize_t isku_sysfs_read(struct file *fp, struct kobject *kobj, static ssize_t isku_sysfs_read(struct file *fp, struct kobject *kobj,
...@@ -184,7 +184,8 @@ ISKU_SYSFS_R(thingy, THINGY) \ ...@@ -184,7 +184,8 @@ ISKU_SYSFS_R(thingy, THINGY) \
ISKU_SYSFS_W(thingy, THINGY) ISKU_SYSFS_W(thingy, THINGY)
#define ISKU_BIN_ATTR_RW(thingy, THINGY) \ #define ISKU_BIN_ATTR_RW(thingy, THINGY) \
{ \ ISKU_SYSFS_RW(thingy, THINGY); \
static struct bin_attribute bin_attr_##thingy = { \
.attr = { .name = #thingy, .mode = 0660 }, \ .attr = { .name = #thingy, .mode = 0660 }, \
.size = ISKU_SIZE_ ## THINGY, \ .size = ISKU_SIZE_ ## THINGY, \
.read = isku_sysfs_read_ ## thingy, \ .read = isku_sysfs_read_ ## thingy, \
...@@ -192,52 +193,64 @@ ISKU_SYSFS_W(thingy, THINGY) ...@@ -192,52 +193,64 @@ ISKU_SYSFS_W(thingy, THINGY)
} }
#define ISKU_BIN_ATTR_R(thingy, THINGY) \ #define ISKU_BIN_ATTR_R(thingy, THINGY) \
{ \ ISKU_SYSFS_R(thingy, THINGY); \
static struct bin_attribute bin_attr_##thingy = { \
.attr = { .name = #thingy, .mode = 0440 }, \ .attr = { .name = #thingy, .mode = 0440 }, \
.size = ISKU_SIZE_ ## THINGY, \ .size = ISKU_SIZE_ ## THINGY, \
.read = isku_sysfs_read_ ## thingy, \ .read = isku_sysfs_read_ ## thingy, \
} }
#define ISKU_BIN_ATTR_W(thingy, THINGY) \ #define ISKU_BIN_ATTR_W(thingy, THINGY) \
{ \ ISKU_SYSFS_W(thingy, THINGY); \
static struct bin_attribute bin_attr_##thingy = { \
.attr = { .name = #thingy, .mode = 0220 }, \ .attr = { .name = #thingy, .mode = 0220 }, \
.size = ISKU_SIZE_ ## THINGY, \ .size = ISKU_SIZE_ ## THINGY, \
.write = isku_sysfs_write_ ## thingy \ .write = isku_sysfs_write_ ## thingy \
} }
ISKU_SYSFS_RW(macro, MACRO) ISKU_BIN_ATTR_RW(macro, MACRO);
ISKU_SYSFS_RW(keys_function, KEYS_FUNCTION) ISKU_BIN_ATTR_RW(keys_function, KEYS_FUNCTION);
ISKU_SYSFS_RW(keys_easyzone, KEYS_EASYZONE) ISKU_BIN_ATTR_RW(keys_easyzone, KEYS_EASYZONE);
ISKU_SYSFS_RW(keys_media, KEYS_MEDIA) ISKU_BIN_ATTR_RW(keys_media, KEYS_MEDIA);
ISKU_SYSFS_RW(keys_thumbster, KEYS_THUMBSTER) ISKU_BIN_ATTR_RW(keys_thumbster, KEYS_THUMBSTER);
ISKU_SYSFS_RW(keys_macro, KEYS_MACRO) ISKU_BIN_ATTR_RW(keys_macro, KEYS_MACRO);
ISKU_SYSFS_RW(keys_capslock, KEYS_CAPSLOCK) ISKU_BIN_ATTR_RW(keys_capslock, KEYS_CAPSLOCK);
ISKU_SYSFS_RW(light, LIGHT) ISKU_BIN_ATTR_RW(light, LIGHT);
ISKU_SYSFS_RW(key_mask, KEY_MASK) ISKU_BIN_ATTR_RW(key_mask, KEY_MASK);
ISKU_SYSFS_RW(last_set, LAST_SET) ISKU_BIN_ATTR_RW(last_set, LAST_SET);
ISKU_SYSFS_W(talk, TALK) ISKU_BIN_ATTR_W(talk, TALK);
ISKU_SYSFS_W(talkfx, TALKFX) ISKU_BIN_ATTR_W(talkfx, TALKFX);
ISKU_SYSFS_R(info, INFO) ISKU_BIN_ATTR_W(control, CONTROL);
ISKU_SYSFS_W(control, CONTROL) ISKU_BIN_ATTR_W(reset, RESET);
ISKU_SYSFS_W(reset, RESET) ISKU_BIN_ATTR_R(info, INFO);
static struct bin_attribute isku_bin_attributes[] = { static struct bin_attribute *isku_bin_attributes[] = {
ISKU_BIN_ATTR_RW(macro, MACRO), &bin_attr_macro,
ISKU_BIN_ATTR_RW(keys_function, KEYS_FUNCTION), &bin_attr_keys_function,
ISKU_BIN_ATTR_RW(keys_easyzone, KEYS_EASYZONE), &bin_attr_keys_easyzone,
ISKU_BIN_ATTR_RW(keys_media, KEYS_MEDIA), &bin_attr_keys_media,
ISKU_BIN_ATTR_RW(keys_thumbster, KEYS_THUMBSTER), &bin_attr_keys_thumbster,
ISKU_BIN_ATTR_RW(keys_macro, KEYS_MACRO), &bin_attr_keys_macro,
ISKU_BIN_ATTR_RW(keys_capslock, KEYS_CAPSLOCK), &bin_attr_keys_capslock,
ISKU_BIN_ATTR_RW(light, LIGHT), &bin_attr_light,
ISKU_BIN_ATTR_RW(key_mask, KEY_MASK), &bin_attr_key_mask,
ISKU_BIN_ATTR_RW(last_set, LAST_SET), &bin_attr_last_set,
ISKU_BIN_ATTR_W(talk, TALK), &bin_attr_talk,
ISKU_BIN_ATTR_W(talkfx, TALKFX), &bin_attr_talkfx,
ISKU_BIN_ATTR_R(info, INFO), &bin_attr_control,
ISKU_BIN_ATTR_W(control, CONTROL), &bin_attr_reset,
ISKU_BIN_ATTR_W(reset, RESET), &bin_attr_info,
__ATTR_NULL NULL,
};
static const struct attribute_group isku_group = {
.attrs = isku_attrs,
.bin_attrs = isku_bin_attributes,
};
static const struct attribute_group *isku_groups[] = {
&isku_group,
NULL,
}; };
static int isku_init_isku_device_struct(struct usb_device *usb_dev, static int isku_init_isku_device_struct(struct usb_device *usb_dev,
...@@ -427,8 +440,7 @@ static int __init isku_init(void) ...@@ -427,8 +440,7 @@ static int __init isku_init(void)
isku_class = class_create(THIS_MODULE, "isku"); isku_class = class_create(THIS_MODULE, "isku");
if (IS_ERR(isku_class)) if (IS_ERR(isku_class))
return PTR_ERR(isku_class); return PTR_ERR(isku_class);
isku_class->dev_attrs = isku_attributes; isku_class->dev_groups = isku_groups;
isku_class->dev_bin_attrs = isku_bin_attributes;
retval = hid_register_driver(&isku_driver); retval = hid_register_driver(&isku_driver);
if (retval) if (retval)
......
...@@ -324,6 +324,8 @@ static ssize_t kone_sysfs_write_settings(struct file *fp, struct kobject *kobj, ...@@ -324,6 +324,8 @@ static ssize_t kone_sysfs_write_settings(struct file *fp, struct kobject *kobj,
return sizeof(struct kone_settings); return sizeof(struct kone_settings);
} }
static BIN_ATTR(settings, 0660, kone_sysfs_read_settings,
kone_sysfs_write_settings, sizeof(struct kone_settings));
static ssize_t kone_sysfs_read_profilex(struct file *fp, static ssize_t kone_sysfs_read_profilex(struct file *fp,
struct kobject *kobj, struct bin_attribute *attr, struct kobject *kobj, struct bin_attribute *attr,
...@@ -378,6 +380,19 @@ static ssize_t kone_sysfs_write_profilex(struct file *fp, ...@@ -378,6 +380,19 @@ static ssize_t kone_sysfs_write_profilex(struct file *fp,
return sizeof(struct kone_profile); return sizeof(struct kone_profile);
} }
#define PROFILE_ATTR(number) \
static struct bin_attribute bin_attr_profile##number = { \
.attr = { .name = "profile##number", .mode = 0660 }, \
.size = sizeof(struct kone_profile), \
.read = kone_sysfs_read_profilex, \
.write = kone_sysfs_write_profilex, \
.private = &profile_numbers[number-1], \
};
PROFILE_ATTR(1);
PROFILE_ATTR(2);
PROFILE_ATTR(3);
PROFILE_ATTR(4);
PROFILE_ATTR(5);
static ssize_t kone_sysfs_show_actual_profile(struct device *dev, static ssize_t kone_sysfs_show_actual_profile(struct device *dev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
...@@ -386,6 +401,7 @@ static ssize_t kone_sysfs_show_actual_profile(struct device *dev, ...@@ -386,6 +401,7 @@ static ssize_t kone_sysfs_show_actual_profile(struct device *dev,
hid_get_drvdata(dev_get_drvdata(dev->parent->parent)); hid_get_drvdata(dev_get_drvdata(dev->parent->parent));
return snprintf(buf, PAGE_SIZE, "%d\n", kone->actual_profile); return snprintf(buf, PAGE_SIZE, "%d\n", kone->actual_profile);
} }
static DEVICE_ATTR(actual_profile, 0440, kone_sysfs_show_actual_profile, NULL);
static ssize_t kone_sysfs_show_actual_dpi(struct device *dev, static ssize_t kone_sysfs_show_actual_dpi(struct device *dev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
...@@ -394,6 +410,7 @@ static ssize_t kone_sysfs_show_actual_dpi(struct device *dev, ...@@ -394,6 +410,7 @@ static ssize_t kone_sysfs_show_actual_dpi(struct device *dev,
hid_get_drvdata(dev_get_drvdata(dev->parent->parent)); hid_get_drvdata(dev_get_drvdata(dev->parent->parent));
return snprintf(buf, PAGE_SIZE, "%d\n", kone->actual_dpi); return snprintf(buf, PAGE_SIZE, "%d\n", kone->actual_dpi);
} }
static DEVICE_ATTR(actual_dpi, 0440, kone_sysfs_show_actual_dpi, NULL);
/* weight is read each time, since we don't get informed when it's changed */ /* weight is read each time, since we don't get informed when it's changed */
static ssize_t kone_sysfs_show_weight(struct device *dev, static ssize_t kone_sysfs_show_weight(struct device *dev,
...@@ -416,6 +433,7 @@ static ssize_t kone_sysfs_show_weight(struct device *dev, ...@@ -416,6 +433,7 @@ static ssize_t kone_sysfs_show_weight(struct device *dev,
return retval; return retval;
return snprintf(buf, PAGE_SIZE, "%d\n", weight); return snprintf(buf, PAGE_SIZE, "%d\n", weight);
} }
static DEVICE_ATTR(weight, 0440, kone_sysfs_show_weight, NULL);
static ssize_t kone_sysfs_show_firmware_version(struct device *dev, static ssize_t kone_sysfs_show_firmware_version(struct device *dev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
...@@ -424,6 +442,8 @@ static ssize_t kone_sysfs_show_firmware_version(struct device *dev, ...@@ -424,6 +442,8 @@ static ssize_t kone_sysfs_show_firmware_version(struct device *dev,
hid_get_drvdata(dev_get_drvdata(dev->parent->parent)); hid_get_drvdata(dev_get_drvdata(dev->parent->parent));
return snprintf(buf, PAGE_SIZE, "%d\n", kone->firmware_version); return snprintf(buf, PAGE_SIZE, "%d\n", kone->firmware_version);
} }
static DEVICE_ATTR(firmware_version, 0440, kone_sysfs_show_firmware_version,
NULL);
static ssize_t kone_sysfs_show_tcu(struct device *dev, static ssize_t kone_sysfs_show_tcu(struct device *dev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
...@@ -524,6 +544,7 @@ static ssize_t kone_sysfs_set_tcu(struct device *dev, ...@@ -524,6 +544,7 @@ static ssize_t kone_sysfs_set_tcu(struct device *dev,
mutex_unlock(&kone->kone_lock); mutex_unlock(&kone->kone_lock);
return retval; return retval;
} }
static DEVICE_ATTR(tcu, 0660, kone_sysfs_show_tcu, kone_sysfs_set_tcu);
static ssize_t kone_sysfs_show_startup_profile(struct device *dev, static ssize_t kone_sysfs_show_startup_profile(struct device *dev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
...@@ -570,15 +591,17 @@ static ssize_t kone_sysfs_set_startup_profile(struct device *dev, ...@@ -570,15 +591,17 @@ static ssize_t kone_sysfs_set_startup_profile(struct device *dev,
mutex_unlock(&kone->kone_lock); mutex_unlock(&kone->kone_lock);
return size; return size;
} }
static DEVICE_ATTR(startup_profile, 0660, kone_sysfs_show_startup_profile,
kone_sysfs_set_startup_profile);
static struct device_attribute kone_attributes[] = { static struct attribute *kone_attrs[] = {
/* /*
* Read actual dpi settings. * Read actual dpi settings.
* Returns raw value for further processing. Refer to enum * Returns raw value for further processing. Refer to enum
* kone_polling_rates to get real value. * kone_polling_rates to get real value.
*/ */
__ATTR(actual_dpi, 0440, kone_sysfs_show_actual_dpi, NULL), &dev_attr_actual_dpi.attr,
__ATTR(actual_profile, 0440, kone_sysfs_show_actual_profile, NULL), &dev_attr_actual_profile.attr,
/* /*
* The mouse can be equipped with one of four supplied weights from 5 * The mouse can be equipped with one of four supplied weights from 5
...@@ -587,7 +610,7 @@ static struct device_attribute kone_attributes[] = { ...@@ -587,7 +610,7 @@ static struct device_attribute kone_attributes[] = {
* by software. Refer to enum kone_weights to get corresponding real * by software. Refer to enum kone_weights to get corresponding real
* weight. * weight.
*/ */
__ATTR(weight, 0440, kone_sysfs_show_weight, NULL), &dev_attr_weight.attr,
/* /*
* Prints firmware version stored in mouse as integer. * Prints firmware version stored in mouse as integer.
...@@ -595,66 +618,38 @@ static struct device_attribute kone_attributes[] = { ...@@ -595,66 +618,38 @@ static struct device_attribute kone_attributes[] = {
* to get the real version number the decimal point has to be shifted 2 * to get the real version number the decimal point has to be shifted 2
* positions to the left. E.g. a value of 138 means 1.38. * positions to the left. E.g. a value of 138 means 1.38.
*/ */
__ATTR(firmware_version, 0440, &dev_attr_firmware_version.attr,
kone_sysfs_show_firmware_version, NULL),
/* /*
* Prints state of Tracking Control Unit as number where 0 = off and * Prints state of Tracking Control Unit as number where 0 = off and
* 1 = on. Writing 0 deactivates tcu and writing 1 calibrates and * 1 = on. Writing 0 deactivates tcu and writing 1 calibrates and
* activates the tcu * activates the tcu
*/ */
__ATTR(tcu, 0660, kone_sysfs_show_tcu, kone_sysfs_set_tcu), &dev_attr_tcu.attr,
/* Prints and takes the number of the profile the mouse starts with */ /* Prints and takes the number of the profile the mouse starts with */
__ATTR(startup_profile, 0660, &dev_attr_startup_profile.attr,
kone_sysfs_show_startup_profile, NULL,
kone_sysfs_set_startup_profile), };
__ATTR_NULL
static struct bin_attribute *kone_bin_attributes[] = {
&bin_attr_settings,
&bin_attr_profile1,
&bin_attr_profile2,
&bin_attr_profile3,
&bin_attr_profile4,
&bin_attr_profile5,
NULL,
};
static const struct attribute_group kone_group = {
.attrs = kone_attrs,
.bin_attrs = kone_bin_attributes,
}; };
static struct bin_attribute kone_bin_attributes[] = { static const struct attribute_group *kone_groups[] = {
{ &kone_group,
.attr = { .name = "settings", .mode = 0660 }, NULL,
.size = sizeof(struct kone_settings),
.read = kone_sysfs_read_settings,
.write = kone_sysfs_write_settings
},
{
.attr = { .name = "profile1", .mode = 0660 },
.size = sizeof(struct kone_profile),
.read = kone_sysfs_read_profilex,
.write = kone_sysfs_write_profilex,
.private = &profile_numbers[0]
},
{
.attr = { .name = "profile2", .mode = 0660 },
.size = sizeof(struct kone_profile),
.read = kone_sysfs_read_profilex,
.write = kone_sysfs_write_profilex,
.private = &profile_numbers[1]
},
{
.attr = { .name = "profile3", .mode = 0660 },
.size = sizeof(struct kone_profile),
.read = kone_sysfs_read_profilex,
.write = kone_sysfs_write_profilex,
.private = &profile_numbers[2]
},
{
.attr = { .name = "profile4", .mode = 0660 },
.size = sizeof(struct kone_profile),
.read = kone_sysfs_read_profilex,
.write = kone_sysfs_write_profilex,
.private = &profile_numbers[3]
},
{
.attr = { .name = "profile5", .mode = 0660 },
.size = sizeof(struct kone_profile),
.read = kone_sysfs_read_profilex,
.write = kone_sysfs_write_profilex,
.private = &profile_numbers[4]
},
__ATTR_NULL
}; };
static int kone_init_kone_device_struct(struct usb_device *usb_dev, static int kone_init_kone_device_struct(struct usb_device *usb_dev,
...@@ -891,8 +886,7 @@ static int __init kone_init(void) ...@@ -891,8 +886,7 @@ static int __init kone_init(void)
kone_class = class_create(THIS_MODULE, "kone"); kone_class = class_create(THIS_MODULE, "kone");
if (IS_ERR(kone_class)) if (IS_ERR(kone_class))
return PTR_ERR(kone_class); return PTR_ERR(kone_class);
kone_class->dev_attrs = kone_attributes; kone_class->dev_groups = kone_groups;
kone_class->dev_bin_attrs = kone_bin_attributes;
retval = hid_register_driver(&kone_driver); retval = hid_register_driver(&kone_driver);
if (retval) if (retval)
......
...@@ -156,7 +156,8 @@ KONEPLUS_SYSFS_W(thingy, THINGY) \ ...@@ -156,7 +156,8 @@ KONEPLUS_SYSFS_W(thingy, THINGY) \
KONEPLUS_SYSFS_R(thingy, THINGY) KONEPLUS_SYSFS_R(thingy, THINGY)
#define KONEPLUS_BIN_ATTRIBUTE_RW(thingy, THINGY) \ #define KONEPLUS_BIN_ATTRIBUTE_RW(thingy, THINGY) \
{ \ KONEPLUS_SYSFS_RW(thingy, THINGY); \
static struct bin_attribute bin_attr_##thingy = { \
.attr = { .name = #thingy, .mode = 0660 }, \ .attr = { .name = #thingy, .mode = 0660 }, \
.size = KONEPLUS_SIZE_ ## THINGY, \ .size = KONEPLUS_SIZE_ ## THINGY, \
.read = koneplus_sysfs_read_ ## thingy, \ .read = koneplus_sysfs_read_ ## thingy, \
...@@ -164,28 +165,29 @@ KONEPLUS_SYSFS_R(thingy, THINGY) ...@@ -164,28 +165,29 @@ KONEPLUS_SYSFS_R(thingy, THINGY)
} }
#define KONEPLUS_BIN_ATTRIBUTE_R(thingy, THINGY) \ #define KONEPLUS_BIN_ATTRIBUTE_R(thingy, THINGY) \
{ \ KONEPLUS_SYSFS_R(thingy, THINGY); \
static struct bin_attribute bin_attr_##thingy = { \
.attr = { .name = #thingy, .mode = 0440 }, \ .attr = { .name = #thingy, .mode = 0440 }, \
.size = KONEPLUS_SIZE_ ## THINGY, \ .size = KONEPLUS_SIZE_ ## THINGY, \
.read = koneplus_sysfs_read_ ## thingy, \ .read = koneplus_sysfs_read_ ## thingy, \
} }
#define KONEPLUS_BIN_ATTRIBUTE_W(thingy, THINGY) \ #define KONEPLUS_BIN_ATTRIBUTE_W(thingy, THINGY) \
{ \ KONEPLUS_SYSFS_W(thingy, THINGY); \
static struct bin_attribute bin_attr_##thingy = { \
.attr = { .name = #thingy, .mode = 0220 }, \ .attr = { .name = #thingy, .mode = 0220 }, \
.size = KONEPLUS_SIZE_ ## THINGY, \ .size = KONEPLUS_SIZE_ ## THINGY, \
.write = koneplus_sysfs_write_ ## thingy \ .write = koneplus_sysfs_write_ ## thingy \
} }
KONEPLUS_BIN_ATTRIBUTE_W(control, CONTROL);
KONEPLUS_SYSFS_W(control, CONTROL) KONEPLUS_BIN_ATTRIBUTE_W(talk, TALK);
KONEPLUS_SYSFS_RW(info, INFO) KONEPLUS_BIN_ATTRIBUTE_W(macro, MACRO);
KONEPLUS_SYSFS_W(talk, TALK) KONEPLUS_BIN_ATTRIBUTE_R(tcu_image, TCU_IMAGE);
KONEPLUS_SYSFS_W(macro, MACRO) KONEPLUS_BIN_ATTRIBUTE_RW(info, INFO);
KONEPLUS_SYSFS_RW(sensor, SENSOR) KONEPLUS_BIN_ATTRIBUTE_RW(sensor, SENSOR);
KONEPLUS_SYSFS_RW(tcu, TCU) KONEPLUS_BIN_ATTRIBUTE_RW(tcu, TCU);
KONEPLUS_SYSFS_R(tcu_image, TCU_IMAGE) KONEPLUS_BIN_ATTRIBUTE_RW(profile_settings, PROFILE_SETTINGS);
KONEPLUS_SYSFS_RW(profile_settings, PROFILE_SETTINGS) KONEPLUS_BIN_ATTRIBUTE_RW(profile_buttons, PROFILE_BUTTONS);
KONEPLUS_SYSFS_RW(profile_buttons, PROFILE_BUTTONS)
static ssize_t koneplus_sysfs_read_profilex_settings(struct file *fp, static ssize_t koneplus_sysfs_read_profilex_settings(struct file *fp,
struct kobject *kobj, struct bin_attribute *attr, char *buf, struct kobject *kobj, struct bin_attribute *attr, char *buf,
...@@ -225,6 +227,25 @@ static ssize_t koneplus_sysfs_read_profilex_buttons(struct file *fp, ...@@ -225,6 +227,25 @@ static ssize_t koneplus_sysfs_read_profilex_buttons(struct file *fp,
KONEPLUS_COMMAND_PROFILE_BUTTONS); KONEPLUS_COMMAND_PROFILE_BUTTONS);
} }
#define PROFILE_ATTR(number) \
static struct bin_attribute bin_attr_profile##number##_settings = { \
.attr = { .name = "profile##number##_settings", .mode = 0440 }, \
.size = KONEPLUS_SIZE_PROFILE_SETTINGS, \
.read = koneplus_sysfs_read_profilex_settings, \
.private = &profile_numbers[number-1], \
}; \
static struct bin_attribute bin_attr_profile##number##_buttons = { \
.attr = { .name = "profile##number##_buttons", .mode = 0440 }, \
.size = KONEPLUS_SIZE_PROFILE_BUTTONS, \
.read = koneplus_sysfs_read_profilex_buttons, \
.private = &profile_numbers[number-1], \
};
PROFILE_ATTR(1);
PROFILE_ATTR(2);
PROFILE_ATTR(3);
PROFILE_ATTR(4);
PROFILE_ATTR(5);
static ssize_t koneplus_sysfs_show_actual_profile(struct device *dev, static ssize_t koneplus_sysfs_show_actual_profile(struct device *dev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
{ {
...@@ -274,6 +295,12 @@ static ssize_t koneplus_sysfs_set_actual_profile(struct device *dev, ...@@ -274,6 +295,12 @@ static ssize_t koneplus_sysfs_set_actual_profile(struct device *dev,
return size; return size;
} }
static DEVICE_ATTR(actual_profile, 0660,
koneplus_sysfs_show_actual_profile,
koneplus_sysfs_set_actual_profile);
static DEVICE_ATTR(startup_profile, 0660,
koneplus_sysfs_show_actual_profile,
koneplus_sysfs_set_actual_profile);
static ssize_t koneplus_sysfs_show_firmware_version(struct device *dev, static ssize_t koneplus_sysfs_show_firmware_version(struct device *dev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
...@@ -293,90 +320,47 @@ static ssize_t koneplus_sysfs_show_firmware_version(struct device *dev, ...@@ -293,90 +320,47 @@ static ssize_t koneplus_sysfs_show_firmware_version(struct device *dev,
return snprintf(buf, PAGE_SIZE, "%d\n", info.firmware_version); return snprintf(buf, PAGE_SIZE, "%d\n", info.firmware_version);
} }
static DEVICE_ATTR(firmware_version, 0440,
koneplus_sysfs_show_firmware_version, NULL);
static struct attribute *koneplus_attrs[] = {
&dev_attr_actual_profile.attr,
&dev_attr_startup_profile.attr,
&dev_attr_firmware_version.attr,
NULL,
};
static struct bin_attribute *koneplus_bin_attributes[] = {
&bin_attr_control,
&bin_attr_talk,
&bin_attr_macro,
&bin_attr_tcu_image,
&bin_attr_info,
&bin_attr_sensor,
&bin_attr_tcu,
&bin_attr_profile_settings,
&bin_attr_profile_buttons,
&bin_attr_profile1_settings,
&bin_attr_profile2_settings,
&bin_attr_profile3_settings,
&bin_attr_profile4_settings,
&bin_attr_profile5_settings,
&bin_attr_profile1_buttons,
&bin_attr_profile2_buttons,
&bin_attr_profile3_buttons,
&bin_attr_profile4_buttons,
&bin_attr_profile5_buttons,
NULL,
};
static struct device_attribute koneplus_attributes[] = { static const struct attribute_group koneplus_group = {
__ATTR(actual_profile, 0660, .attrs = koneplus_attrs,
koneplus_sysfs_show_actual_profile, .bin_attrs = koneplus_bin_attributes,
koneplus_sysfs_set_actual_profile),
__ATTR(startup_profile, 0660,
koneplus_sysfs_show_actual_profile,
koneplus_sysfs_set_actual_profile),
__ATTR(firmware_version, 0440,
koneplus_sysfs_show_firmware_version, NULL),
__ATTR_NULL
}; };
static struct bin_attribute koneplus_bin_attributes[] = { static const struct attribute_group *koneplus_groups[] = {
KONEPLUS_BIN_ATTRIBUTE_W(control, CONTROL), &koneplus_group,
KONEPLUS_BIN_ATTRIBUTE_RW(info, INFO), NULL,
KONEPLUS_BIN_ATTRIBUTE_W(talk, TALK),
KONEPLUS_BIN_ATTRIBUTE_W(macro, MACRO),
KONEPLUS_BIN_ATTRIBUTE_RW(sensor, SENSOR),
KONEPLUS_BIN_ATTRIBUTE_RW(tcu, TCU),
KONEPLUS_BIN_ATTRIBUTE_R(tcu_image, TCU_IMAGE),
KONEPLUS_BIN_ATTRIBUTE_RW(profile_settings, PROFILE_SETTINGS),
KONEPLUS_BIN_ATTRIBUTE_RW(profile_buttons, PROFILE_BUTTONS),
{
.attr = { .name = "profile1_settings", .mode = 0440 },
.size = KONEPLUS_SIZE_PROFILE_SETTINGS,
.read = koneplus_sysfs_read_profilex_settings,
.private = &profile_numbers[0]
},
{
.attr = { .name = "profile2_settings", .mode = 0440 },
.size = KONEPLUS_SIZE_PROFILE_SETTINGS,
.read = koneplus_sysfs_read_profilex_settings,
.private = &profile_numbers[1]
},
{
.attr = { .name = "profile3_settings", .mode = 0440 },
.size = KONEPLUS_SIZE_PROFILE_SETTINGS,
.read = koneplus_sysfs_read_profilex_settings,
.private = &profile_numbers[2]
},
{
.attr = { .name = "profile4_settings", .mode = 0440 },
.size = KONEPLUS_SIZE_PROFILE_SETTINGS,
.read = koneplus_sysfs_read_profilex_settings,
.private = &profile_numbers[3]
},
{
.attr = { .name = "profile5_settings", .mode = 0440 },
.size = KONEPLUS_SIZE_PROFILE_SETTINGS,
.read = koneplus_sysfs_read_profilex_settings,
.private = &profile_numbers[4]
},
{
.attr = { .name = "profile1_buttons", .mode = 0440 },
.size = KONEPLUS_SIZE_PROFILE_BUTTONS,
.read = koneplus_sysfs_read_profilex_buttons,
.private = &profile_numbers[0]
},
{
.attr = { .name = "profile2_buttons", .mode = 0440 },
.size = KONEPLUS_SIZE_PROFILE_BUTTONS,
.read = koneplus_sysfs_read_profilex_buttons,
.private = &profile_numbers[1]
},
{
.attr = { .name = "profile3_buttons", .mode = 0440 },
.size = KONEPLUS_SIZE_PROFILE_BUTTONS,
.read = koneplus_sysfs_read_profilex_buttons,
.private = &profile_numbers[2]
},
{
.attr = { .name = "profile4_buttons", .mode = 0440 },
.size = KONEPLUS_SIZE_PROFILE_BUTTONS,
.read = koneplus_sysfs_read_profilex_buttons,
.private = &profile_numbers[3]
},
{
.attr = { .name = "profile5_buttons", .mode = 0440 },
.size = KONEPLUS_SIZE_PROFILE_BUTTONS,
.read = koneplus_sysfs_read_profilex_buttons,
.private = &profile_numbers[4]
},
__ATTR_NULL
}; };
static int koneplus_init_koneplus_device_struct(struct usb_device *usb_dev, static int koneplus_init_koneplus_device_struct(struct usb_device *usb_dev,
...@@ -572,8 +556,7 @@ static int __init koneplus_init(void) ...@@ -572,8 +556,7 @@ static int __init koneplus_init(void)
koneplus_class = class_create(THIS_MODULE, "koneplus"); koneplus_class = class_create(THIS_MODULE, "koneplus");
if (IS_ERR(koneplus_class)) if (IS_ERR(koneplus_class))
return PTR_ERR(koneplus_class); return PTR_ERR(koneplus_class);
koneplus_class->dev_attrs = koneplus_attributes; koneplus_class->dev_groups = koneplus_groups;
koneplus_class->dev_bin_attrs = koneplus_bin_attributes;
retval = hid_register_driver(&koneplus_driver); retval = hid_register_driver(&koneplus_driver);
if (retval) if (retval)
......
...@@ -94,7 +94,8 @@ KONEPURE_SYSFS_W(thingy, THINGY) \ ...@@ -94,7 +94,8 @@ KONEPURE_SYSFS_W(thingy, THINGY) \
KONEPURE_SYSFS_R(thingy, THINGY) KONEPURE_SYSFS_R(thingy, THINGY)
#define KONEPURE_BIN_ATTRIBUTE_RW(thingy, THINGY) \ #define KONEPURE_BIN_ATTRIBUTE_RW(thingy, THINGY) \
{ \ KONEPURE_SYSFS_RW(thingy, THINGY); \
static struct bin_attribute bin_attr_##thingy = { \
.attr = { .name = #thingy, .mode = 0660 }, \ .attr = { .name = #thingy, .mode = 0660 }, \
.size = KONEPURE_SIZE_ ## THINGY, \ .size = KONEPURE_SIZE_ ## THINGY, \
.read = konepure_sysfs_read_ ## thingy, \ .read = konepure_sysfs_read_ ## thingy, \
...@@ -102,44 +103,56 @@ KONEPURE_SYSFS_R(thingy, THINGY) ...@@ -102,44 +103,56 @@ KONEPURE_SYSFS_R(thingy, THINGY)
} }
#define KONEPURE_BIN_ATTRIBUTE_R(thingy, THINGY) \ #define KONEPURE_BIN_ATTRIBUTE_R(thingy, THINGY) \
{ \ KONEPURE_SYSFS_R(thingy, THINGY); \
static struct bin_attribute bin_attr_##thingy = { \
.attr = { .name = #thingy, .mode = 0440 }, \ .attr = { .name = #thingy, .mode = 0440 }, \
.size = KONEPURE_SIZE_ ## THINGY, \ .size = KONEPURE_SIZE_ ## THINGY, \
.read = konepure_sysfs_read_ ## thingy, \ .read = konepure_sysfs_read_ ## thingy, \
} }
#define KONEPURE_BIN_ATTRIBUTE_W(thingy, THINGY) \ #define KONEPURE_BIN_ATTRIBUTE_W(thingy, THINGY) \
{ \ KONEPURE_SYSFS_W(thingy, THINGY); \
static struct bin_attribute bin_attr_##thingy = { \
.attr = { .name = #thingy, .mode = 0220 }, \ .attr = { .name = #thingy, .mode = 0220 }, \
.size = KONEPURE_SIZE_ ## THINGY, \ .size = KONEPURE_SIZE_ ## THINGY, \
.write = konepure_sysfs_write_ ## thingy \ .write = konepure_sysfs_write_ ## thingy \
} }
KONEPURE_SYSFS_RW(actual_profile, ACTUAL_PROFILE) KONEPURE_BIN_ATTRIBUTE_RW(actual_profile, ACTUAL_PROFILE);
KONEPURE_SYSFS_W(control, CONTROL) KONEPURE_BIN_ATTRIBUTE_RW(info, INFO);
KONEPURE_SYSFS_RW(info, INFO) KONEPURE_BIN_ATTRIBUTE_RW(sensor, SENSOR);
KONEPURE_SYSFS_W(talk, TALK) KONEPURE_BIN_ATTRIBUTE_RW(tcu, TCU);
KONEPURE_SYSFS_W(macro, MACRO) KONEPURE_BIN_ATTRIBUTE_RW(profile_settings, PROFILE_SETTINGS);
KONEPURE_SYSFS_RW(sensor, SENSOR) KONEPURE_BIN_ATTRIBUTE_RW(profile_buttons, PROFILE_BUTTONS);
KONEPURE_SYSFS_RW(tcu, TCU) KONEPURE_BIN_ATTRIBUTE_W(control, CONTROL);
KONEPURE_SYSFS_R(tcu_image, TCU_IMAGE) KONEPURE_BIN_ATTRIBUTE_W(talk, TALK);
KONEPURE_SYSFS_RW(profile_settings, PROFILE_SETTINGS) KONEPURE_BIN_ATTRIBUTE_W(macro, MACRO);
KONEPURE_SYSFS_RW(profile_buttons, PROFILE_BUTTONS) KONEPURE_BIN_ATTRIBUTE_R(tcu_image, TCU_IMAGE);
static struct bin_attribute konepure_bin_attributes[] = { static struct bin_attribute *konepure_bin_attributes[] = {
KONEPURE_BIN_ATTRIBUTE_RW(actual_profile, ACTUAL_PROFILE), &bin_attr_actual_profile,
KONEPURE_BIN_ATTRIBUTE_W(control, CONTROL), &bin_attr_info,
KONEPURE_BIN_ATTRIBUTE_RW(info, INFO), &bin_attr_sensor,
KONEPURE_BIN_ATTRIBUTE_W(talk, TALK), &bin_attr_tcu,
KONEPURE_BIN_ATTRIBUTE_W(macro, MACRO), &bin_attr_profile_settings,
KONEPURE_BIN_ATTRIBUTE_RW(sensor, SENSOR), &bin_attr_profile_buttons,
KONEPURE_BIN_ATTRIBUTE_RW(tcu, TCU), &bin_attr_control,
KONEPURE_BIN_ATTRIBUTE_R(tcu_image, TCU_IMAGE), &bin_attr_talk,
KONEPURE_BIN_ATTRIBUTE_RW(profile_settings, PROFILE_SETTINGS), &bin_attr_macro,
KONEPURE_BIN_ATTRIBUTE_RW(profile_buttons, PROFILE_BUTTONS), &bin_attr_tcu_image,
__ATTR_NULL NULL,
};
static const struct attribute_group konepure_group = {
.bin_attrs = konepure_bin_attributes,
};
static const struct attribute_group *konepure_groups[] = {
&konepure_group,
NULL,
}; };
static int konepure_init_konepure_device_struct(struct usb_device *usb_dev, static int konepure_init_konepure_device_struct(struct usb_device *usb_dev,
struct konepure_device *konepure) struct konepure_device *konepure)
{ {
...@@ -282,7 +295,7 @@ static int __init konepure_init(void) ...@@ -282,7 +295,7 @@ static int __init konepure_init(void)
konepure_class = class_create(THIS_MODULE, "konepure"); konepure_class = class_create(THIS_MODULE, "konepure");
if (IS_ERR(konepure_class)) if (IS_ERR(konepure_class))
return PTR_ERR(konepure_class); return PTR_ERR(konepure_class);
konepure_class->dev_bin_attrs = konepure_bin_attributes; konepure_class->dev_groups = konepure_groups;
retval = hid_register_driver(&konepure_driver); retval = hid_register_driver(&konepure_driver);
if (retval) if (retval)
......
...@@ -197,31 +197,25 @@ KOVAPLUS_SYSFS_W(thingy, THINGY) \ ...@@ -197,31 +197,25 @@ KOVAPLUS_SYSFS_W(thingy, THINGY) \
KOVAPLUS_SYSFS_R(thingy, THINGY) KOVAPLUS_SYSFS_R(thingy, THINGY)
#define KOVAPLUS_BIN_ATTRIBUTE_RW(thingy, THINGY) \ #define KOVAPLUS_BIN_ATTRIBUTE_RW(thingy, THINGY) \
{ \ KOVAPLUS_SYSFS_RW(thingy, THINGY); \
static struct bin_attribute bin_attr_##thingy = { \
.attr = { .name = #thingy, .mode = 0660 }, \ .attr = { .name = #thingy, .mode = 0660 }, \
.size = KOVAPLUS_SIZE_ ## THINGY, \ .size = KOVAPLUS_SIZE_ ## THINGY, \
.read = kovaplus_sysfs_read_ ## thingy, \ .read = kovaplus_sysfs_read_ ## thingy, \
.write = kovaplus_sysfs_write_ ## thingy \ .write = kovaplus_sysfs_write_ ## thingy \
} }
#define KOVAPLUS_BIN_ATTRIBUTE_R(thingy, THINGY) \
{ \
.attr = { .name = #thingy, .mode = 0440 }, \
.size = KOVAPLUS_SIZE_ ## THINGY, \
.read = kovaplus_sysfs_read_ ## thingy, \
}
#define KOVAPLUS_BIN_ATTRIBUTE_W(thingy, THINGY) \ #define KOVAPLUS_BIN_ATTRIBUTE_W(thingy, THINGY) \
{ \ KOVAPLUS_SYSFS_W(thingy, THINGY); \
static struct bin_attribute bin_attr_##thingy = { \
.attr = { .name = #thingy, .mode = 0220 }, \ .attr = { .name = #thingy, .mode = 0220 }, \
.size = KOVAPLUS_SIZE_ ## THINGY, \ .size = KOVAPLUS_SIZE_ ## THINGY, \
.write = kovaplus_sysfs_write_ ## thingy \ .write = kovaplus_sysfs_write_ ## thingy \
} }
KOVAPLUS_BIN_ATTRIBUTE_W(control, CONTROL);
KOVAPLUS_SYSFS_W(control, CONTROL) KOVAPLUS_BIN_ATTRIBUTE_RW(info, INFO);
KOVAPLUS_SYSFS_RW(info, INFO) KOVAPLUS_BIN_ATTRIBUTE_RW(profile_settings, PROFILE_SETTINGS);
KOVAPLUS_SYSFS_RW(profile_settings, PROFILE_SETTINGS) KOVAPLUS_BIN_ATTRIBUTE_RW(profile_buttons, PROFILE_BUTTONS);
KOVAPLUS_SYSFS_RW(profile_buttons, PROFILE_BUTTONS)
static ssize_t kovaplus_sysfs_read_profilex_settings(struct file *fp, static ssize_t kovaplus_sysfs_read_profilex_settings(struct file *fp,
struct kobject *kobj, struct bin_attribute *attr, char *buf, struct kobject *kobj, struct bin_attribute *attr, char *buf,
...@@ -261,6 +255,25 @@ static ssize_t kovaplus_sysfs_read_profilex_buttons(struct file *fp, ...@@ -261,6 +255,25 @@ static ssize_t kovaplus_sysfs_read_profilex_buttons(struct file *fp,
KOVAPLUS_COMMAND_PROFILE_BUTTONS); KOVAPLUS_COMMAND_PROFILE_BUTTONS);
} }
#define PROFILE_ATTR(number) \
static struct bin_attribute bin_attr_profile##number##_settings = { \
.attr = { .name = "profile##number##_settings", .mode = 0440 }, \
.size = KOVAPLUS_SIZE_PROFILE_SETTINGS, \
.read = kovaplus_sysfs_read_profilex_settings, \
.private = &profile_numbers[number-1], \
}; \
static struct bin_attribute bin_attr_profile##number##_buttons = { \
.attr = { .name = "profile##number##_buttons", .mode = 0440 }, \
.size = KOVAPLUS_SIZE_PROFILE_BUTTONS, \
.read = kovaplus_sysfs_read_profilex_buttons, \
.private = &profile_numbers[number-1], \
};
PROFILE_ATTR(1);
PROFILE_ATTR(2);
PROFILE_ATTR(3);
PROFILE_ATTR(4);
PROFILE_ATTR(5);
static ssize_t kovaplus_sysfs_show_actual_profile(struct device *dev, static ssize_t kovaplus_sysfs_show_actual_profile(struct device *dev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
{ {
...@@ -310,6 +323,9 @@ static ssize_t kovaplus_sysfs_set_actual_profile(struct device *dev, ...@@ -310,6 +323,9 @@ static ssize_t kovaplus_sysfs_set_actual_profile(struct device *dev,
return size; return size;
} }
static DEVICE_ATTR(actual_profile, 0660,
kovaplus_sysfs_show_actual_profile,
kovaplus_sysfs_set_actual_profile);
static ssize_t kovaplus_sysfs_show_actual_cpi(struct device *dev, static ssize_t kovaplus_sysfs_show_actual_cpi(struct device *dev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
...@@ -318,6 +334,7 @@ static ssize_t kovaplus_sysfs_show_actual_cpi(struct device *dev, ...@@ -318,6 +334,7 @@ static ssize_t kovaplus_sysfs_show_actual_cpi(struct device *dev,
hid_get_drvdata(dev_get_drvdata(dev->parent->parent)); hid_get_drvdata(dev_get_drvdata(dev->parent->parent));
return snprintf(buf, PAGE_SIZE, "%d\n", kovaplus->actual_cpi); return snprintf(buf, PAGE_SIZE, "%d\n", kovaplus->actual_cpi);
} }
static DEVICE_ATTR(actual_cpi, 0440, kovaplus_sysfs_show_actual_cpi, NULL);
static ssize_t kovaplus_sysfs_show_actual_sensitivity_x(struct device *dev, static ssize_t kovaplus_sysfs_show_actual_sensitivity_x(struct device *dev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
...@@ -326,6 +343,8 @@ static ssize_t kovaplus_sysfs_show_actual_sensitivity_x(struct device *dev, ...@@ -326,6 +343,8 @@ static ssize_t kovaplus_sysfs_show_actual_sensitivity_x(struct device *dev,
hid_get_drvdata(dev_get_drvdata(dev->parent->parent)); hid_get_drvdata(dev_get_drvdata(dev->parent->parent));
return snprintf(buf, PAGE_SIZE, "%d\n", kovaplus->actual_x_sensitivity); return snprintf(buf, PAGE_SIZE, "%d\n", kovaplus->actual_x_sensitivity);
} }
static DEVICE_ATTR(actual_sensitivity_x, 0440,
kovaplus_sysfs_show_actual_sensitivity_x, NULL);
static ssize_t kovaplus_sysfs_show_actual_sensitivity_y(struct device *dev, static ssize_t kovaplus_sysfs_show_actual_sensitivity_y(struct device *dev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
...@@ -334,6 +353,8 @@ static ssize_t kovaplus_sysfs_show_actual_sensitivity_y(struct device *dev, ...@@ -334,6 +353,8 @@ static ssize_t kovaplus_sysfs_show_actual_sensitivity_y(struct device *dev,
hid_get_drvdata(dev_get_drvdata(dev->parent->parent)); hid_get_drvdata(dev_get_drvdata(dev->parent->parent));
return snprintf(buf, PAGE_SIZE, "%d\n", kovaplus->actual_y_sensitivity); return snprintf(buf, PAGE_SIZE, "%d\n", kovaplus->actual_y_sensitivity);
} }
static DEVICE_ATTR(actual_sensitivity_y, 0440,
kovaplus_sysfs_show_actual_sensitivity_y, NULL);
static ssize_t kovaplus_sysfs_show_firmware_version(struct device *dev, static ssize_t kovaplus_sysfs_show_firmware_version(struct device *dev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
...@@ -353,88 +374,44 @@ static ssize_t kovaplus_sysfs_show_firmware_version(struct device *dev, ...@@ -353,88 +374,44 @@ static ssize_t kovaplus_sysfs_show_firmware_version(struct device *dev,
return snprintf(buf, PAGE_SIZE, "%d\n", info.firmware_version); return snprintf(buf, PAGE_SIZE, "%d\n", info.firmware_version);
} }
static DEVICE_ATTR(firmware_version, 0440,
kovaplus_sysfs_show_firmware_version, NULL);
static struct attribute *kovaplus_attrs[] = {
&dev_attr_actual_cpi.attr,
&dev_attr_firmware_version.attr,
&dev_attr_actual_profile.attr,
&dev_attr_actual_sensitivity_x.attr,
&dev_attr_actual_sensitivity_y.attr,
NULL,
};
static struct bin_attribute *kovaplus_bin_attributes[] = {
&bin_attr_control,
&bin_attr_info,
&bin_attr_profile_settings,
&bin_attr_profile_buttons,
&bin_attr_profile1_settings,
&bin_attr_profile2_settings,
&bin_attr_profile3_settings,
&bin_attr_profile4_settings,
&bin_attr_profile5_settings,
&bin_attr_profile1_buttons,
&bin_attr_profile2_buttons,
&bin_attr_profile3_buttons,
&bin_attr_profile4_buttons,
&bin_attr_profile5_buttons,
NULL,
};
static struct device_attribute kovaplus_attributes[] = { static const struct attribute_group kovaplus_group = {
__ATTR(actual_cpi, 0440, .attrs = kovaplus_attrs,
kovaplus_sysfs_show_actual_cpi, NULL), .bin_attrs = kovaplus_bin_attributes,
__ATTR(firmware_version, 0440,
kovaplus_sysfs_show_firmware_version, NULL),
__ATTR(actual_profile, 0660,
kovaplus_sysfs_show_actual_profile,
kovaplus_sysfs_set_actual_profile),
__ATTR(actual_sensitivity_x, 0440,
kovaplus_sysfs_show_actual_sensitivity_x, NULL),
__ATTR(actual_sensitivity_y, 0440,
kovaplus_sysfs_show_actual_sensitivity_y, NULL),
__ATTR_NULL
}; };
static struct bin_attribute kovaplus_bin_attributes[] = { static const struct attribute_group *kovaplus_groups[] = {
KOVAPLUS_BIN_ATTRIBUTE_W(control, CONTROL), &kovaplus_group,
KOVAPLUS_BIN_ATTRIBUTE_RW(info, INFO), NULL,
KOVAPLUS_BIN_ATTRIBUTE_RW(profile_settings, PROFILE_SETTINGS),
KOVAPLUS_BIN_ATTRIBUTE_RW(profile_buttons, PROFILE_BUTTONS),
{
.attr = { .name = "profile1_settings", .mode = 0440 },
.size = KOVAPLUS_SIZE_PROFILE_SETTINGS,
.read = kovaplus_sysfs_read_profilex_settings,
.private = &profile_numbers[0]
},
{
.attr = { .name = "profile2_settings", .mode = 0440 },
.size = KOVAPLUS_SIZE_PROFILE_SETTINGS,
.read = kovaplus_sysfs_read_profilex_settings,
.private = &profile_numbers[1]
},
{
.attr = { .name = "profile3_settings", .mode = 0440 },
.size = KOVAPLUS_SIZE_PROFILE_SETTINGS,
.read = kovaplus_sysfs_read_profilex_settings,
.private = &profile_numbers[2]
},
{
.attr = { .name = "profile4_settings", .mode = 0440 },
.size = KOVAPLUS_SIZE_PROFILE_SETTINGS,
.read = kovaplus_sysfs_read_profilex_settings,
.private = &profile_numbers[3]
},
{
.attr = { .name = "profile5_settings", .mode = 0440 },
.size = KOVAPLUS_SIZE_PROFILE_SETTINGS,
.read = kovaplus_sysfs_read_profilex_settings,
.private = &profile_numbers[4]
},
{
.attr = { .name = "profile1_buttons", .mode = 0440 },
.size = KOVAPLUS_SIZE_PROFILE_BUTTONS,
.read = kovaplus_sysfs_read_profilex_buttons,
.private = &profile_numbers[0]
},
{
.attr = { .name = "profile2_buttons", .mode = 0440 },
.size = KOVAPLUS_SIZE_PROFILE_BUTTONS,
.read = kovaplus_sysfs_read_profilex_buttons,
.private = &profile_numbers[1]
},
{
.attr = { .name = "profile3_buttons", .mode = 0440 },
.size = KOVAPLUS_SIZE_PROFILE_BUTTONS,
.read = kovaplus_sysfs_read_profilex_buttons,
.private = &profile_numbers[2]
},
{
.attr = { .name = "profile4_buttons", .mode = 0440 },
.size = KOVAPLUS_SIZE_PROFILE_BUTTONS,
.read = kovaplus_sysfs_read_profilex_buttons,
.private = &profile_numbers[3]
},
{
.attr = { .name = "profile5_buttons", .mode = 0440 },
.size = KOVAPLUS_SIZE_PROFILE_BUTTONS,
.read = kovaplus_sysfs_read_profilex_buttons,
.private = &profile_numbers[4]
},
__ATTR_NULL
}; };
static int kovaplus_init_kovaplus_device_struct(struct usb_device *usb_dev, static int kovaplus_init_kovaplus_device_struct(struct usb_device *usb_dev,
...@@ -662,8 +639,7 @@ static int __init kovaplus_init(void) ...@@ -662,8 +639,7 @@ static int __init kovaplus_init(void)
kovaplus_class = class_create(THIS_MODULE, "kovaplus"); kovaplus_class = class_create(THIS_MODULE, "kovaplus");
if (IS_ERR(kovaplus_class)) if (IS_ERR(kovaplus_class))
return PTR_ERR(kovaplus_class); return PTR_ERR(kovaplus_class);
kovaplus_class->dev_attrs = kovaplus_attributes; kovaplus_class->dev_groups = kovaplus_groups;
kovaplus_class->dev_bin_attrs = kovaplus_bin_attributes;
retval = hid_register_driver(&kovaplus_driver); retval = hid_register_driver(&kovaplus_driver);
if (retval) if (retval)
......
...@@ -156,7 +156,8 @@ PYRA_SYSFS_W(thingy, THINGY) \ ...@@ -156,7 +156,8 @@ PYRA_SYSFS_W(thingy, THINGY) \
PYRA_SYSFS_R(thingy, THINGY) PYRA_SYSFS_R(thingy, THINGY)
#define PYRA_BIN_ATTRIBUTE_RW(thingy, THINGY) \ #define PYRA_BIN_ATTRIBUTE_RW(thingy, THINGY) \
{ \ PYRA_SYSFS_RW(thingy, THINGY); \
static struct bin_attribute bin_attr_##thingy = { \
.attr = { .name = #thingy, .mode = 0660 }, \ .attr = { .name = #thingy, .mode = 0660 }, \
.size = PYRA_SIZE_ ## THINGY, \ .size = PYRA_SIZE_ ## THINGY, \
.read = pyra_sysfs_read_ ## thingy, \ .read = pyra_sysfs_read_ ## thingy, \
...@@ -164,24 +165,25 @@ PYRA_SYSFS_R(thingy, THINGY) ...@@ -164,24 +165,25 @@ PYRA_SYSFS_R(thingy, THINGY)
} }
#define PYRA_BIN_ATTRIBUTE_R(thingy, THINGY) \ #define PYRA_BIN_ATTRIBUTE_R(thingy, THINGY) \
{ \ PYRA_SYSFS_R(thingy, THINGY); \
static struct bin_attribute bin_attr_##thingy = { \
.attr = { .name = #thingy, .mode = 0440 }, \ .attr = { .name = #thingy, .mode = 0440 }, \
.size = PYRA_SIZE_ ## THINGY, \ .size = PYRA_SIZE_ ## THINGY, \
.read = pyra_sysfs_read_ ## thingy, \ .read = pyra_sysfs_read_ ## thingy, \
} }
#define PYRA_BIN_ATTRIBUTE_W(thingy, THINGY) \ #define PYRA_BIN_ATTRIBUTE_W(thingy, THINGY) \
{ \ PYRA_SYSFS_W(thingy, THINGY); \
static struct bin_attribute bin_attr_##thingy = { \
.attr = { .name = #thingy, .mode = 0220 }, \ .attr = { .name = #thingy, .mode = 0220 }, \
.size = PYRA_SIZE_ ## THINGY, \ .size = PYRA_SIZE_ ## THINGY, \
.write = pyra_sysfs_write_ ## thingy \ .write = pyra_sysfs_write_ ## thingy \
} }
PYRA_SYSFS_W(control, CONTROL) PYRA_BIN_ATTRIBUTE_W(control, CONTROL);
PYRA_SYSFS_RW(info, INFO) PYRA_BIN_ATTRIBUTE_RW(info, INFO);
PYRA_SYSFS_RW(profile_settings, PROFILE_SETTINGS) PYRA_BIN_ATTRIBUTE_RW(profile_settings, PROFILE_SETTINGS);
PYRA_SYSFS_RW(profile_buttons, PROFILE_BUTTONS) PYRA_BIN_ATTRIBUTE_RW(profile_buttons, PROFILE_BUTTONS);
PYRA_SYSFS_R(settings, SETTINGS)
static ssize_t pyra_sysfs_read_profilex_settings(struct file *fp, static ssize_t pyra_sysfs_read_profilex_settings(struct file *fp,
struct kobject *kobj, struct bin_attribute *attr, char *buf, struct kobject *kobj, struct bin_attribute *attr, char *buf,
...@@ -221,6 +223,25 @@ static ssize_t pyra_sysfs_read_profilex_buttons(struct file *fp, ...@@ -221,6 +223,25 @@ static ssize_t pyra_sysfs_read_profilex_buttons(struct file *fp,
PYRA_COMMAND_PROFILE_BUTTONS); PYRA_COMMAND_PROFILE_BUTTONS);
} }
#define PROFILE_ATTR(number) \
static struct bin_attribute bin_attr_profile##number##_settings = { \
.attr = { .name = "profile##number##_settings", .mode = 0440 }, \
.size = PYRA_SIZE_PROFILE_SETTINGS, \
.read = pyra_sysfs_read_profilex_settings, \
.private = &profile_numbers[number-1], \
}; \
static struct bin_attribute bin_attr_profile##number##_buttons = { \
.attr = { .name = "profile##number##_buttons", .mode = 0440 }, \
.size = PYRA_SIZE_PROFILE_BUTTONS, \
.read = pyra_sysfs_read_profilex_buttons, \
.private = &profile_numbers[number-1], \
};
PROFILE_ATTR(1);
PROFILE_ATTR(2);
PROFILE_ATTR(3);
PROFILE_ATTR(4);
PROFILE_ATTR(5);
static ssize_t pyra_sysfs_write_settings(struct file *fp, static ssize_t pyra_sysfs_write_settings(struct file *fp,
struct kobject *kobj, struct bin_attribute *attr, char *buf, struct kobject *kobj, struct bin_attribute *attr, char *buf,
loff_t off, size_t count) loff_t off, size_t count)
...@@ -258,6 +279,11 @@ static ssize_t pyra_sysfs_write_settings(struct file *fp, ...@@ -258,6 +279,11 @@ static ssize_t pyra_sysfs_write_settings(struct file *fp,
return PYRA_SIZE_SETTINGS; return PYRA_SIZE_SETTINGS;
} }
PYRA_SYSFS_R(settings, SETTINGS);
static struct bin_attribute bin_attr_settings =
__BIN_ATTR(settings, (S_IWUSR | S_IRUGO),
pyra_sysfs_read_settings, pyra_sysfs_write_settings,
PYRA_SIZE_SETTINGS);
static ssize_t pyra_sysfs_show_actual_cpi(struct device *dev, static ssize_t pyra_sysfs_show_actual_cpi(struct device *dev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
...@@ -266,6 +292,7 @@ static ssize_t pyra_sysfs_show_actual_cpi(struct device *dev, ...@@ -266,6 +292,7 @@ static ssize_t pyra_sysfs_show_actual_cpi(struct device *dev,
hid_get_drvdata(dev_get_drvdata(dev->parent->parent)); hid_get_drvdata(dev_get_drvdata(dev->parent->parent));
return snprintf(buf, PAGE_SIZE, "%d\n", pyra->actual_cpi); return snprintf(buf, PAGE_SIZE, "%d\n", pyra->actual_cpi);
} }
static DEVICE_ATTR(actual_cpi, 0440, pyra_sysfs_show_actual_cpi, NULL);
static ssize_t pyra_sysfs_show_actual_profile(struct device *dev, static ssize_t pyra_sysfs_show_actual_profile(struct device *dev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
...@@ -282,6 +309,8 @@ static ssize_t pyra_sysfs_show_actual_profile(struct device *dev, ...@@ -282,6 +309,8 @@ static ssize_t pyra_sysfs_show_actual_profile(struct device *dev,
return snprintf(buf, PAGE_SIZE, "%d\n", settings.startup_profile); return snprintf(buf, PAGE_SIZE, "%d\n", settings.startup_profile);
} }
static DEVICE_ATTR(actual_profile, 0440, pyra_sysfs_show_actual_profile, NULL);
static DEVICE_ATTR(startup_profile, 0440, pyra_sysfs_show_actual_profile, NULL);
static ssize_t pyra_sysfs_show_firmware_version(struct device *dev, static ssize_t pyra_sysfs_show_firmware_version(struct device *dev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
...@@ -301,84 +330,44 @@ static ssize_t pyra_sysfs_show_firmware_version(struct device *dev, ...@@ -301,84 +330,44 @@ static ssize_t pyra_sysfs_show_firmware_version(struct device *dev,
return snprintf(buf, PAGE_SIZE, "%d\n", info.firmware_version); return snprintf(buf, PAGE_SIZE, "%d\n", info.firmware_version);
} }
static DEVICE_ATTR(firmware_version, 0440, pyra_sysfs_show_firmware_version,
NULL);
static struct attribute *pyra_attrs[] = {
&dev_attr_actual_cpi.attr,
&dev_attr_actual_profile.attr,
&dev_attr_firmware_version.attr,
&dev_attr_startup_profile.attr,
NULL,
};
static struct bin_attribute *pyra_bin_attributes[] = {
&bin_attr_control,
&bin_attr_info,
&bin_attr_profile_settings,
&bin_attr_profile_buttons,
&bin_attr_settings,
&bin_attr_profile1_settings,
&bin_attr_profile2_settings,
&bin_attr_profile3_settings,
&bin_attr_profile4_settings,
&bin_attr_profile5_settings,
&bin_attr_profile1_buttons,
&bin_attr_profile2_buttons,
&bin_attr_profile3_buttons,
&bin_attr_profile4_buttons,
&bin_attr_profile5_buttons,
NULL,
};
static struct device_attribute pyra_attributes[] = { static const struct attribute_group pyra_group = {
__ATTR(actual_cpi, 0440, pyra_sysfs_show_actual_cpi, NULL), .attrs = pyra_attrs,
__ATTR(actual_profile, 0440, pyra_sysfs_show_actual_profile, NULL), .bin_attrs = pyra_bin_attributes,
__ATTR(firmware_version, 0440,
pyra_sysfs_show_firmware_version, NULL),
__ATTR(startup_profile, 0440,
pyra_sysfs_show_actual_profile, NULL),
__ATTR_NULL
}; };
static struct bin_attribute pyra_bin_attributes[] = { static const struct attribute_group *pyra_groups[] = {
PYRA_BIN_ATTRIBUTE_W(control, CONTROL), &pyra_group,
PYRA_BIN_ATTRIBUTE_RW(info, INFO), NULL,
PYRA_BIN_ATTRIBUTE_RW(profile_settings, PROFILE_SETTINGS),
PYRA_BIN_ATTRIBUTE_RW(profile_buttons, PROFILE_BUTTONS),
PYRA_BIN_ATTRIBUTE_RW(settings, SETTINGS),
{
.attr = { .name = "profile1_settings", .mode = 0440 },
.size = PYRA_SIZE_PROFILE_SETTINGS,
.read = pyra_sysfs_read_profilex_settings,
.private = &profile_numbers[0]
},
{
.attr = { .name = "profile2_settings", .mode = 0440 },
.size = PYRA_SIZE_PROFILE_SETTINGS,
.read = pyra_sysfs_read_profilex_settings,
.private = &profile_numbers[1]
},
{
.attr = { .name = "profile3_settings", .mode = 0440 },
.size = PYRA_SIZE_PROFILE_SETTINGS,
.read = pyra_sysfs_read_profilex_settings,
.private = &profile_numbers[2]
},
{
.attr = { .name = "profile4_settings", .mode = 0440 },
.size = PYRA_SIZE_PROFILE_SETTINGS,
.read = pyra_sysfs_read_profilex_settings,
.private = &profile_numbers[3]
},
{
.attr = { .name = "profile5_settings", .mode = 0440 },
.size = PYRA_SIZE_PROFILE_SETTINGS,
.read = pyra_sysfs_read_profilex_settings,
.private = &profile_numbers[4]
},
{
.attr = { .name = "profile1_buttons", .mode = 0440 },
.size = PYRA_SIZE_PROFILE_BUTTONS,
.read = pyra_sysfs_read_profilex_buttons,
.private = &profile_numbers[0]
},
{
.attr = { .name = "profile2_buttons", .mode = 0440 },
.size = PYRA_SIZE_PROFILE_BUTTONS,
.read = pyra_sysfs_read_profilex_buttons,
.private = &profile_numbers[1]
},
{
.attr = { .name = "profile3_buttons", .mode = 0440 },
.size = PYRA_SIZE_PROFILE_BUTTONS,
.read = pyra_sysfs_read_profilex_buttons,
.private = &profile_numbers[2]
},
{
.attr = { .name = "profile4_buttons", .mode = 0440 },
.size = PYRA_SIZE_PROFILE_BUTTONS,
.read = pyra_sysfs_read_profilex_buttons,
.private = &profile_numbers[3]
},
{
.attr = { .name = "profile5_buttons", .mode = 0440 },
.size = PYRA_SIZE_PROFILE_BUTTONS,
.read = pyra_sysfs_read_profilex_buttons,
.private = &profile_numbers[4]
},
__ATTR_NULL
}; };
static int pyra_init_pyra_device_struct(struct usb_device *usb_dev, static int pyra_init_pyra_device_struct(struct usb_device *usb_dev,
...@@ -600,8 +589,7 @@ static int __init pyra_init(void) ...@@ -600,8 +589,7 @@ static int __init pyra_init(void)
pyra_class = class_create(THIS_MODULE, "pyra"); pyra_class = class_create(THIS_MODULE, "pyra");
if (IS_ERR(pyra_class)) if (IS_ERR(pyra_class))
return PTR_ERR(pyra_class); return PTR_ERR(pyra_class);
pyra_class->dev_attrs = pyra_attributes; pyra_class->dev_groups = pyra_groups;
pyra_class->dev_bin_attrs = pyra_bin_attributes;
retval = hid_register_driver(&pyra_driver); retval = hid_register_driver(&pyra_driver);
if (retval) if (retval)
......
...@@ -94,44 +94,48 @@ SAVU_SYSFS_W(thingy, THINGY) \ ...@@ -94,44 +94,48 @@ SAVU_SYSFS_W(thingy, THINGY) \
SAVU_SYSFS_R(thingy, THINGY) SAVU_SYSFS_R(thingy, THINGY)
#define SAVU_BIN_ATTRIBUTE_RW(thingy, THINGY) \ #define SAVU_BIN_ATTRIBUTE_RW(thingy, THINGY) \
{ \ SAVU_SYSFS_RW(thingy, THINGY); \
static struct bin_attribute bin_attr_##thingy = { \
.attr = { .name = #thingy, .mode = 0660 }, \ .attr = { .name = #thingy, .mode = 0660 }, \
.size = SAVU_SIZE_ ## THINGY, \ .size = SAVU_SIZE_ ## THINGY, \
.read = savu_sysfs_read_ ## thingy, \ .read = savu_sysfs_read_ ## thingy, \
.write = savu_sysfs_write_ ## thingy \ .write = savu_sysfs_write_ ## thingy \
} }
#define SAVU_BIN_ATTRIBUTE_R(thingy, THINGY) \
{ \
.attr = { .name = #thingy, .mode = 0440 }, \
.size = SAVU_SIZE_ ## THINGY, \
.read = savu_sysfs_read_ ## thingy, \
}
#define SAVU_BIN_ATTRIBUTE_W(thingy, THINGY) \ #define SAVU_BIN_ATTRIBUTE_W(thingy, THINGY) \
{ \ SAVU_SYSFS_W(thingy, THINGY); \
static struct bin_attribute bin_attr_##thingy = { \
.attr = { .name = #thingy, .mode = 0220 }, \ .attr = { .name = #thingy, .mode = 0220 }, \
.size = SAVU_SIZE_ ## THINGY, \ .size = SAVU_SIZE_ ## THINGY, \
.write = savu_sysfs_write_ ## thingy \ .write = savu_sysfs_write_ ## thingy \
} }
SAVU_SYSFS_W(control, CONTROL) SAVU_BIN_ATTRIBUTE_W(control, CONTROL);
SAVU_SYSFS_RW(profile, PROFILE) SAVU_BIN_ATTRIBUTE_RW(profile, PROFILE);
SAVU_SYSFS_RW(general, GENERAL) SAVU_BIN_ATTRIBUTE_RW(general, GENERAL);
SAVU_SYSFS_RW(buttons, BUTTONS) SAVU_BIN_ATTRIBUTE_RW(buttons, BUTTONS);
SAVU_SYSFS_RW(macro, MACRO) SAVU_BIN_ATTRIBUTE_RW(macro, MACRO);
SAVU_SYSFS_RW(info, INFO) SAVU_BIN_ATTRIBUTE_RW(info, INFO);
SAVU_SYSFS_RW(sensor, SENSOR) SAVU_BIN_ATTRIBUTE_RW(sensor, SENSOR);
static struct bin_attribute savu_bin_attributes[] = { static struct bin_attribute *savu_bin_attributes[] = {
SAVU_BIN_ATTRIBUTE_W(control, CONTROL), &bin_attr_control,
SAVU_BIN_ATTRIBUTE_RW(profile, PROFILE), &bin_attr_profile,
SAVU_BIN_ATTRIBUTE_RW(general, GENERAL), &bin_attr_general,
SAVU_BIN_ATTRIBUTE_RW(buttons, BUTTONS), &bin_attr_buttons,
SAVU_BIN_ATTRIBUTE_RW(macro, MACRO), &bin_attr_macro,
SAVU_BIN_ATTRIBUTE_RW(info, INFO), &bin_attr_info,
SAVU_BIN_ATTRIBUTE_RW(sensor, SENSOR), &bin_attr_sensor,
__ATTR_NULL NULL,
};
static const struct attribute_group savu_group = {
.bin_attrs = savu_bin_attributes,
};
static const struct attribute_group *savu_groups[] = {
&savu_group,
NULL,
}; };
static int savu_init_savu_device_struct(struct usb_device *usb_dev, static int savu_init_savu_device_struct(struct usb_device *usb_dev,
...@@ -294,7 +298,7 @@ static int __init savu_init(void) ...@@ -294,7 +298,7 @@ static int __init savu_init(void)
savu_class = class_create(THIS_MODULE, "savu"); savu_class = class_create(THIS_MODULE, "savu");
if (IS_ERR(savu_class)) if (IS_ERR(savu_class))
return PTR_ERR(savu_class); return PTR_ERR(savu_class);
savu_class->dev_bin_attrs = savu_bin_attributes; savu_class->dev_groups = savu_groups;
retval = hid_register_driver(&savu_driver); retval = hid_register_driver(&savu_driver);
if (retval) if (retval)
......
...@@ -639,16 +639,18 @@ EXPORT_SYMBOL(gameport_unregister_port); ...@@ -639,16 +639,18 @@ EXPORT_SYMBOL(gameport_unregister_port);
* Gameport driver operations * Gameport driver operations
*/ */
static ssize_t gameport_driver_show_description(struct device_driver *drv, char *buf) static ssize_t description_show(struct device_driver *drv, char *buf)
{ {
struct gameport_driver *driver = to_gameport_driver(drv); struct gameport_driver *driver = to_gameport_driver(drv);
return sprintf(buf, "%s\n", driver->description ? driver->description : "(none)"); return sprintf(buf, "%s\n", driver->description ? driver->description : "(none)");
} }
static DRIVER_ATTR_RO(description);
static struct driver_attribute gameport_driver_attrs[] = { static struct attribute *gameport_driver_attrs[] = {
__ATTR(description, S_IRUGO, gameport_driver_show_description, NULL), &driver_attr_description.attr,
__ATTR_NULL NULL
}; };
ATTRIBUTE_GROUPS(gameport_driver);
static int gameport_driver_probe(struct device *dev) static int gameport_driver_probe(struct device *dev)
{ {
...@@ -749,7 +751,7 @@ static int gameport_bus_match(struct device *dev, struct device_driver *drv) ...@@ -749,7 +751,7 @@ static int gameport_bus_match(struct device *dev, struct device_driver *drv)
static struct bus_type gameport_bus = { static struct bus_type gameport_bus = {
.name = "gameport", .name = "gameport",
.dev_attrs = gameport_device_attrs, .dev_attrs = gameport_device_attrs,
.drv_attrs = gameport_driver_attrs, .drv_groups = gameport_driver_groups,
.match = gameport_bus_match, .match = gameport_bus_match,
.probe = gameport_driver_probe, .probe = gameport_driver_probe,
.remove = gameport_driver_remove, .remove = gameport_driver_remove,
......
...@@ -732,19 +732,20 @@ EXPORT_SYMBOL(serio_unregister_child_port); ...@@ -732,19 +732,20 @@ EXPORT_SYMBOL(serio_unregister_child_port);
* Serio driver operations * Serio driver operations
*/ */
static ssize_t serio_driver_show_description(struct device_driver *drv, char *buf) static ssize_t description_show(struct device_driver *drv, char *buf)
{ {
struct serio_driver *driver = to_serio_driver(drv); struct serio_driver *driver = to_serio_driver(drv);
return sprintf(buf, "%s\n", driver->description ? driver->description : "(none)"); return sprintf(buf, "%s\n", driver->description ? driver->description : "(none)");
} }
static DRIVER_ATTR_RO(description);
static ssize_t serio_driver_show_bind_mode(struct device_driver *drv, char *buf) static ssize_t bind_mode_show(struct device_driver *drv, char *buf)
{ {
struct serio_driver *serio_drv = to_serio_driver(drv); struct serio_driver *serio_drv = to_serio_driver(drv);
return sprintf(buf, "%s\n", serio_drv->manual_bind ? "manual" : "auto"); return sprintf(buf, "%s\n", serio_drv->manual_bind ? "manual" : "auto");
} }
static ssize_t serio_driver_set_bind_mode(struct device_driver *drv, const char *buf, size_t count) static ssize_t bind_mode_store(struct device_driver *drv, const char *buf, size_t count)
{ {
struct serio_driver *serio_drv = to_serio_driver(drv); struct serio_driver *serio_drv = to_serio_driver(drv);
int retval; int retval;
...@@ -760,14 +761,14 @@ static ssize_t serio_driver_set_bind_mode(struct device_driver *drv, const char ...@@ -760,14 +761,14 @@ static ssize_t serio_driver_set_bind_mode(struct device_driver *drv, const char
return retval; return retval;
} }
static DRIVER_ATTR_RW(bind_mode);
static struct attribute *serio_driver_attrs[] = {
static struct driver_attribute serio_driver_attrs[] = { &driver_attr_description.attr,
__ATTR(description, S_IRUGO, serio_driver_show_description, NULL), &driver_attr_bind_mode.attr,
__ATTR(bind_mode, S_IWUSR | S_IRUGO, NULL,
serio_driver_show_bind_mode, serio_driver_set_bind_mode),
__ATTR_NULL
}; };
ATTRIBUTE_GROUPS(serio_driver);
static int serio_driver_probe(struct device *dev) static int serio_driver_probe(struct device *dev)
{ {
...@@ -996,7 +997,7 @@ EXPORT_SYMBOL(serio_interrupt); ...@@ -996,7 +997,7 @@ EXPORT_SYMBOL(serio_interrupt);
static struct bus_type serio_bus = { static struct bus_type serio_bus = {
.name = "serio", .name = "serio",
.dev_attrs = serio_device_attrs, .dev_attrs = serio_device_attrs,
.drv_attrs = serio_driver_attrs, .drv_groups = serio_driver_groups,
.match = serio_bus_match, .match = serio_bus_match,
.uevent = serio_uevent, .uevent = serio_uevent,
.probe = serio_driver_probe, .probe = serio_driver_probe,
......
...@@ -37,8 +37,8 @@ static void mISDN_dev_release(struct device *dev) ...@@ -37,8 +37,8 @@ static void mISDN_dev_release(struct device *dev)
/* nothing to do: the device is part of its parent's data structure */ /* nothing to do: the device is part of its parent's data structure */
} }
static ssize_t _show_id(struct device *dev, static ssize_t id_show(struct device *dev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
{ {
struct mISDNdevice *mdev = dev_to_mISDN(dev); struct mISDNdevice *mdev = dev_to_mISDN(dev);
...@@ -46,9 +46,10 @@ static ssize_t _show_id(struct device *dev, ...@@ -46,9 +46,10 @@ static ssize_t _show_id(struct device *dev,
return -ENODEV; return -ENODEV;
return sprintf(buf, "%d\n", mdev->id); return sprintf(buf, "%d\n", mdev->id);
} }
static DEVICE_ATTR_RO(id);
static ssize_t _show_nrbchan(struct device *dev, static ssize_t nrbchan_show(struct device *dev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
{ {
struct mISDNdevice *mdev = dev_to_mISDN(dev); struct mISDNdevice *mdev = dev_to_mISDN(dev);
...@@ -56,9 +57,10 @@ static ssize_t _show_nrbchan(struct device *dev, ...@@ -56,9 +57,10 @@ static ssize_t _show_nrbchan(struct device *dev,
return -ENODEV; return -ENODEV;
return sprintf(buf, "%d\n", mdev->nrbchan); return sprintf(buf, "%d\n", mdev->nrbchan);
} }
static DEVICE_ATTR_RO(nrbchan);
static ssize_t _show_d_protocols(struct device *dev, static ssize_t d_protocols_show(struct device *dev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
{ {
struct mISDNdevice *mdev = dev_to_mISDN(dev); struct mISDNdevice *mdev = dev_to_mISDN(dev);
...@@ -66,9 +68,10 @@ static ssize_t _show_d_protocols(struct device *dev, ...@@ -66,9 +68,10 @@ static ssize_t _show_d_protocols(struct device *dev,
return -ENODEV; return -ENODEV;
return sprintf(buf, "%d\n", mdev->Dprotocols); return sprintf(buf, "%d\n", mdev->Dprotocols);
} }
static DEVICE_ATTR_RO(d_protocols);
static ssize_t _show_b_protocols(struct device *dev, static ssize_t b_protocols_show(struct device *dev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
{ {
struct mISDNdevice *mdev = dev_to_mISDN(dev); struct mISDNdevice *mdev = dev_to_mISDN(dev);
...@@ -76,9 +79,10 @@ static ssize_t _show_b_protocols(struct device *dev, ...@@ -76,9 +79,10 @@ static ssize_t _show_b_protocols(struct device *dev,
return -ENODEV; return -ENODEV;
return sprintf(buf, "%d\n", mdev->Bprotocols | get_all_Bprotocols()); return sprintf(buf, "%d\n", mdev->Bprotocols | get_all_Bprotocols());
} }
static DEVICE_ATTR_RO(b_protocols);
static ssize_t _show_protocol(struct device *dev, static ssize_t protocol_show(struct device *dev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
{ {
struct mISDNdevice *mdev = dev_to_mISDN(dev); struct mISDNdevice *mdev = dev_to_mISDN(dev);
...@@ -86,17 +90,19 @@ static ssize_t _show_protocol(struct device *dev, ...@@ -86,17 +90,19 @@ static ssize_t _show_protocol(struct device *dev,
return -ENODEV; return -ENODEV;
return sprintf(buf, "%d\n", mdev->D.protocol); return sprintf(buf, "%d\n", mdev->D.protocol);
} }
static DEVICE_ATTR_RO(protocol);
static ssize_t _show_name(struct device *dev, static ssize_t name_show(struct device *dev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
{ {
strcpy(buf, dev_name(dev)); strcpy(buf, dev_name(dev));
return strlen(buf); return strlen(buf);
} }
static DEVICE_ATTR_RO(name);
#if 0 /* hangs */ #if 0 /* hangs */
static ssize_t _set_name(struct device *dev, struct device_attribute *attr, static ssize_t name_set(struct device *dev, struct device_attribute *attr,
const char *buf, size_t count) const char *buf, size_t count)
{ {
int err = 0; int err = 0;
char *out = kmalloc(count + 1, GFP_KERNEL); char *out = kmalloc(count + 1, GFP_KERNEL);
...@@ -113,10 +119,11 @@ static ssize_t _set_name(struct device *dev, struct device_attribute *attr, ...@@ -113,10 +119,11 @@ static ssize_t _set_name(struct device *dev, struct device_attribute *attr,
return (err < 0) ? err : count; return (err < 0) ? err : count;
} }
static DEVICE_ATTR_RW(name);
#endif #endif
static ssize_t _show_channelmap(struct device *dev, static ssize_t channelmap_show(struct device *dev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
{ {
struct mISDNdevice *mdev = dev_to_mISDN(dev); struct mISDNdevice *mdev = dev_to_mISDN(dev);
char *bp = buf; char *bp = buf;
...@@ -127,18 +134,19 @@ static ssize_t _show_channelmap(struct device *dev, ...@@ -127,18 +134,19 @@ static ssize_t _show_channelmap(struct device *dev,
return bp - buf; return bp - buf;
} }
static DEVICE_ATTR_RO(channelmap);
static struct device_attribute mISDN_dev_attrs[] = {
__ATTR(id, S_IRUGO, _show_id, NULL), static struct attribute *mISDN_attrs[] = {
__ATTR(d_protocols, S_IRUGO, _show_d_protocols, NULL), &dev_attr_id.attr,
__ATTR(b_protocols, S_IRUGO, _show_b_protocols, NULL), &dev_attr_d_protocols.attr,
__ATTR(protocol, S_IRUGO, _show_protocol, NULL), &dev_attr_b_protocols.attr,
__ATTR(channelmap, S_IRUGO, _show_channelmap, NULL), &dev_attr_protocol.attr,
__ATTR(nrbchan, S_IRUGO, _show_nrbchan, NULL), &dev_attr_channelmap.attr,
__ATTR(name, S_IRUGO, _show_name, NULL), &dev_attr_nrbchan.attr,
/* __ATTR(name, S_IRUGO | S_IWUSR, _show_name, _set_name), */ &dev_attr_name.attr,
{} NULL,
}; };
ATTRIBUTE_GROUPS(mISDN);
static int mISDN_uevent(struct device *dev, struct kobj_uevent_env *env) static int mISDN_uevent(struct device *dev, struct kobj_uevent_env *env)
{ {
...@@ -162,7 +170,7 @@ static struct class mISDN_class = { ...@@ -162,7 +170,7 @@ static struct class mISDN_class = {
.name = "mISDN", .name = "mISDN",
.owner = THIS_MODULE, .owner = THIS_MODULE,
.dev_uevent = mISDN_uevent, .dev_uevent = mISDN_uevent,
.dev_attrs = mISDN_dev_attrs, .dev_groups = mISDN_groups,
.dev_release = mISDN_dev_release, .dev_release = mISDN_dev_release,
.class_release = mISDN_class_release, .class_release = mISDN_class_release,
}; };
......
...@@ -29,7 +29,7 @@ static void led_update_brightness(struct led_classdev *led_cdev) ...@@ -29,7 +29,7 @@ static void led_update_brightness(struct led_classdev *led_cdev)
led_cdev->brightness = led_cdev->brightness_get(led_cdev); led_cdev->brightness = led_cdev->brightness_get(led_cdev);
} }
static ssize_t led_brightness_show(struct device *dev, static ssize_t brightness_show(struct device *dev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
{ {
struct led_classdev *led_cdev = dev_get_drvdata(dev); struct led_classdev *led_cdev = dev_get_drvdata(dev);
...@@ -40,7 +40,7 @@ static ssize_t led_brightness_show(struct device *dev, ...@@ -40,7 +40,7 @@ static ssize_t led_brightness_show(struct device *dev,
return sprintf(buf, "%u\n", led_cdev->brightness); return sprintf(buf, "%u\n", led_cdev->brightness);
} }
static ssize_t led_brightness_store(struct device *dev, static ssize_t brightness_store(struct device *dev,
struct device_attribute *attr, const char *buf, size_t size) struct device_attribute *attr, const char *buf, size_t size)
{ {
struct led_classdev *led_cdev = dev_get_drvdata(dev); struct led_classdev *led_cdev = dev_get_drvdata(dev);
...@@ -57,6 +57,7 @@ static ssize_t led_brightness_store(struct device *dev, ...@@ -57,6 +57,7 @@ static ssize_t led_brightness_store(struct device *dev,
return size; return size;
} }
static DEVICE_ATTR_RW(brightness);
static ssize_t led_max_brightness_show(struct device *dev, static ssize_t led_max_brightness_show(struct device *dev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
...@@ -65,14 +66,35 @@ static ssize_t led_max_brightness_show(struct device *dev, ...@@ -65,14 +66,35 @@ static ssize_t led_max_brightness_show(struct device *dev,
return sprintf(buf, "%u\n", led_cdev->max_brightness); return sprintf(buf, "%u\n", led_cdev->max_brightness);
} }
static DEVICE_ATTR(max_brightness, 0444, led_max_brightness_show, NULL);
static struct device_attribute led_class_attrs[] = {
__ATTR(brightness, 0644, led_brightness_show, led_brightness_store),
__ATTR(max_brightness, 0444, led_max_brightness_show, NULL),
#ifdef CONFIG_LEDS_TRIGGERS #ifdef CONFIG_LEDS_TRIGGERS
__ATTR(trigger, 0644, led_trigger_show, led_trigger_store), static DEVICE_ATTR(trigger, 0644, led_trigger_show, led_trigger_store);
static struct attribute *led_trigger_attrs[] = {
&dev_attr_trigger.attr,
NULL,
};
static const struct attribute_group led_trigger_group = {
.attrs = led_trigger_attrs,
};
#endif
static struct attribute *led_class_attrs[] = {
&dev_attr_brightness.attr,
&dev_attr_max_brightness.attr,
NULL,
};
static const struct attribute_group led_group = {
.attrs = led_class_attrs,
};
static const struct attribute_group *led_groups[] = {
&led_group,
#ifdef CONFIG_LEDS_TRIGGERS
&led_trigger_group,
#endif #endif
__ATTR_NULL, NULL,
}; };
static void led_timer_function(unsigned long data) static void led_timer_function(unsigned long data)
...@@ -258,7 +280,7 @@ static int __init leds_init(void) ...@@ -258,7 +280,7 @@ static int __init leds_init(void)
if (IS_ERR(leds_class)) if (IS_ERR(leds_class))
return PTR_ERR(leds_class); return PTR_ERR(leds_class);
leds_class->pm = &leds_class_dev_pm_ops; leds_class->pm = &leds_class_dev_pm_ops;
leds_class->dev_attrs = led_class_attrs; leds_class->dev_groups = led_groups;
return 0; return 0;
} }
......
...@@ -38,24 +38,25 @@ ...@@ -38,24 +38,25 @@
* sysfs stuff * sysfs stuff
*/ */
static ssize_t show_index(struct device *cd, static ssize_t index_show(struct device *cd,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
{ {
struct video_device *vdev = to_video_device(cd); struct video_device *vdev = to_video_device(cd);
return sprintf(buf, "%i\n", vdev->index); return sprintf(buf, "%i\n", vdev->index);
} }
static DEVICE_ATTR_RO(index);
static ssize_t show_debug(struct device *cd, static ssize_t debug_show(struct device *cd,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
{ {
struct video_device *vdev = to_video_device(cd); struct video_device *vdev = to_video_device(cd);
return sprintf(buf, "%i\n", vdev->debug); return sprintf(buf, "%i\n", vdev->debug);
} }
static ssize_t set_debug(struct device *cd, struct device_attribute *attr, static ssize_t debug_store(struct device *cd, struct device_attribute *attr,
const char *buf, size_t len) const char *buf, size_t len)
{ {
struct video_device *vdev = to_video_device(cd); struct video_device *vdev = to_video_device(cd);
int res = 0; int res = 0;
...@@ -68,21 +69,24 @@ static ssize_t set_debug(struct device *cd, struct device_attribute *attr, ...@@ -68,21 +69,24 @@ static ssize_t set_debug(struct device *cd, struct device_attribute *attr,
vdev->debug = value; vdev->debug = value;
return len; return len;
} }
static DEVICE_ATTR_RW(debug);
static ssize_t show_name(struct device *cd, static ssize_t name_show(struct device *cd,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
{ {
struct video_device *vdev = to_video_device(cd); struct video_device *vdev = to_video_device(cd);
return sprintf(buf, "%.*s\n", (int)sizeof(vdev->name), vdev->name); return sprintf(buf, "%.*s\n", (int)sizeof(vdev->name), vdev->name);
} }
static DEVICE_ATTR_RO(name);
static struct device_attribute video_device_attrs[] = { static struct attribute *video_device_attrs[] = {
__ATTR(name, S_IRUGO, show_name, NULL), &dev_attr_name.attr,
__ATTR(debug, 0644, show_debug, set_debug), &dev_attr_debug.attr,
__ATTR(index, S_IRUGO, show_index, NULL), &dev_attr_index.attr,
__ATTR_NULL NULL,
}; };
ATTRIBUTE_GROUPS(video_device);
/* /*
* Active devices * Active devices
...@@ -217,7 +221,7 @@ static void v4l2_device_release(struct device *cd) ...@@ -217,7 +221,7 @@ static void v4l2_device_release(struct device *cd)
static struct class video_class = { static struct class video_class = {
.name = VIDEO_NAME, .name = VIDEO_NAME,
.dev_attrs = video_device_attrs, .dev_groups = video_device_groups,
}; };
struct video_device *video_devdata(struct file *file) struct video_device *video_devdata(struct file *file)
......
...@@ -311,6 +311,7 @@ static ssize_t c2port_show_name(struct device *dev, ...@@ -311,6 +311,7 @@ static ssize_t c2port_show_name(struct device *dev,
return sprintf(buf, "%s\n", c2dev->name); return sprintf(buf, "%s\n", c2dev->name);
} }
static DEVICE_ATTR(name, 0444, c2port_show_name, NULL);
static ssize_t c2port_show_flash_blocks_num(struct device *dev, static ssize_t c2port_show_flash_blocks_num(struct device *dev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
...@@ -320,6 +321,7 @@ static ssize_t c2port_show_flash_blocks_num(struct device *dev, ...@@ -320,6 +321,7 @@ static ssize_t c2port_show_flash_blocks_num(struct device *dev,
return sprintf(buf, "%d\n", ops->blocks_num); return sprintf(buf, "%d\n", ops->blocks_num);
} }
static DEVICE_ATTR(flash_blocks_num, 0444, c2port_show_flash_blocks_num, NULL);
static ssize_t c2port_show_flash_block_size(struct device *dev, static ssize_t c2port_show_flash_block_size(struct device *dev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
...@@ -329,6 +331,7 @@ static ssize_t c2port_show_flash_block_size(struct device *dev, ...@@ -329,6 +331,7 @@ static ssize_t c2port_show_flash_block_size(struct device *dev,
return sprintf(buf, "%d\n", ops->block_size); return sprintf(buf, "%d\n", ops->block_size);
} }
static DEVICE_ATTR(flash_block_size, 0444, c2port_show_flash_block_size, NULL);
static ssize_t c2port_show_flash_size(struct device *dev, static ssize_t c2port_show_flash_size(struct device *dev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
...@@ -338,18 +341,18 @@ static ssize_t c2port_show_flash_size(struct device *dev, ...@@ -338,18 +341,18 @@ static ssize_t c2port_show_flash_size(struct device *dev,
return sprintf(buf, "%d\n", ops->blocks_num * ops->block_size); return sprintf(buf, "%d\n", ops->blocks_num * ops->block_size);
} }
static DEVICE_ATTR(flash_size, 0444, c2port_show_flash_size, NULL);
static ssize_t c2port_show_access(struct device *dev, static ssize_t access_show(struct device *dev, struct device_attribute *attr,
struct device_attribute *attr, char *buf) char *buf)
{ {
struct c2port_device *c2dev = dev_get_drvdata(dev); struct c2port_device *c2dev = dev_get_drvdata(dev);
return sprintf(buf, "%d\n", c2dev->access); return sprintf(buf, "%d\n", c2dev->access);
} }
static ssize_t c2port_store_access(struct device *dev, static ssize_t access_store(struct device *dev, struct device_attribute *attr,
struct device_attribute *attr, const char *buf, size_t count)
const char *buf, size_t count)
{ {
struct c2port_device *c2dev = dev_get_drvdata(dev); struct c2port_device *c2dev = dev_get_drvdata(dev);
struct c2port_ops *ops = c2dev->ops; struct c2port_ops *ops = c2dev->ops;
...@@ -375,6 +378,7 @@ static ssize_t c2port_store_access(struct device *dev, ...@@ -375,6 +378,7 @@ static ssize_t c2port_store_access(struct device *dev,
return count; return count;
} }
static DEVICE_ATTR_RW(access);
static ssize_t c2port_store_reset(struct device *dev, static ssize_t c2port_store_reset(struct device *dev,
struct device_attribute *attr, struct device_attribute *attr,
...@@ -395,6 +399,7 @@ static ssize_t c2port_store_reset(struct device *dev, ...@@ -395,6 +399,7 @@ static ssize_t c2port_store_reset(struct device *dev,
return count; return count;
} }
static DEVICE_ATTR(reset, 0200, NULL, c2port_store_reset);
static ssize_t __c2port_show_dev_id(struct c2port_device *dev, char *buf) static ssize_t __c2port_show_dev_id(struct c2port_device *dev, char *buf)
{ {
...@@ -431,6 +436,7 @@ static ssize_t c2port_show_dev_id(struct device *dev, ...@@ -431,6 +436,7 @@ static ssize_t c2port_show_dev_id(struct device *dev,
return ret; return ret;
} }
static DEVICE_ATTR(dev_id, 0444, c2port_show_dev_id, NULL);
static ssize_t __c2port_show_rev_id(struct c2port_device *dev, char *buf) static ssize_t __c2port_show_rev_id(struct c2port_device *dev, char *buf)
{ {
...@@ -467,6 +473,7 @@ static ssize_t c2port_show_rev_id(struct device *dev, ...@@ -467,6 +473,7 @@ static ssize_t c2port_show_rev_id(struct device *dev,
return ret; return ret;
} }
static DEVICE_ATTR(rev_id, 0444, c2port_show_rev_id, NULL);
static ssize_t c2port_show_flash_access(struct device *dev, static ssize_t c2port_show_flash_access(struct device *dev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
...@@ -536,6 +543,8 @@ static ssize_t c2port_store_flash_access(struct device *dev, ...@@ -536,6 +543,8 @@ static ssize_t c2port_store_flash_access(struct device *dev,
return count; return count;
} }
static DEVICE_ATTR(flash_access, 0644, c2port_show_flash_access,
c2port_store_flash_access);
static ssize_t __c2port_write_flash_erase(struct c2port_device *dev) static ssize_t __c2port_write_flash_erase(struct c2port_device *dev)
{ {
...@@ -616,6 +625,7 @@ static ssize_t c2port_store_flash_erase(struct device *dev, ...@@ -616,6 +625,7 @@ static ssize_t c2port_store_flash_erase(struct device *dev,
return count; return count;
} }
static DEVICE_ATTR(flash_erase, 0200, NULL, c2port_store_flash_erase);
static ssize_t __c2port_read_flash_data(struct c2port_device *dev, static ssize_t __c2port_read_flash_data(struct c2port_device *dev,
char *buffer, loff_t offset, size_t count) char *buffer, loff_t offset, size_t count)
...@@ -846,35 +856,40 @@ static ssize_t c2port_write_flash_data(struct file *filp, struct kobject *kobj, ...@@ -846,35 +856,40 @@ static ssize_t c2port_write_flash_data(struct file *filp, struct kobject *kobj,
return ret; return ret;
} }
/* size is computed at run-time */
static BIN_ATTR(flash_data, 0644, c2port_read_flash_data,
c2port_write_flash_data, 0);
/* /*
* Class attributes * Class attributes
*/ */
static struct attribute *c2port_attrs[] = {
&dev_attr_name.attr,
&dev_attr_flash_blocks_num.attr,
&dev_attr_flash_block_size.attr,
&dev_attr_flash_size.attr,
&dev_attr_access.attr,
&dev_attr_reset.attr,
&dev_attr_dev_id.attr,
&dev_attr_rev_id.attr,
&dev_attr_flash_access.attr,
&dev_attr_flash_erase.attr,
NULL,
};
static struct device_attribute c2port_attrs[] = { static struct bin_attribute *c2port_bin_attrs[] = {
__ATTR(name, 0444, c2port_show_name, NULL), &bin_attr_flash_data,
__ATTR(flash_blocks_num, 0444, c2port_show_flash_blocks_num, NULL), NULL,
__ATTR(flash_block_size, 0444, c2port_show_flash_block_size, NULL),
__ATTR(flash_size, 0444, c2port_show_flash_size, NULL),
__ATTR(access, 0644, c2port_show_access, c2port_store_access),
__ATTR(reset, 0200, NULL, c2port_store_reset),
__ATTR(dev_id, 0444, c2port_show_dev_id, NULL),
__ATTR(rev_id, 0444, c2port_show_rev_id, NULL),
__ATTR(flash_access, 0644, c2port_show_flash_access,
c2port_store_flash_access),
__ATTR(flash_erase, 0200, NULL, c2port_store_flash_erase),
__ATTR_NULL,
}; };
static struct bin_attribute c2port_bin_attrs = { static const struct attribute_group c2port_group = {
.attr = { .attrs = c2port_attrs,
.name = "flash_data", .bin_attrs = c2port_bin_attrs,
.mode = 0644 };
},
.read = c2port_read_flash_data, static const struct attribute_group *c2port_groups[] = {
.write = c2port_write_flash_data, &c2port_group,
/* .size is computed at run-time */ NULL,
}; };
/* /*
...@@ -907,6 +922,8 @@ struct c2port_device *c2port_device_register(char *name, ...@@ -907,6 +922,8 @@ struct c2port_device *c2port_device_register(char *name,
goto error_idr_alloc; goto error_idr_alloc;
c2dev->id = ret; c2dev->id = ret;
bin_attr_flash_data.size = ops->blocks_num * ops->block_size;
c2dev->dev = device_create(c2port_class, NULL, 0, c2dev, c2dev->dev = device_create(c2port_class, NULL, 0, c2dev,
"c2port%d", c2dev->id); "c2port%d", c2dev->id);
if (unlikely(IS_ERR(c2dev->dev))) { if (unlikely(IS_ERR(c2dev->dev))) {
...@@ -919,12 +936,6 @@ struct c2port_device *c2port_device_register(char *name, ...@@ -919,12 +936,6 @@ struct c2port_device *c2port_device_register(char *name,
c2dev->ops = ops; c2dev->ops = ops;
mutex_init(&c2dev->mutex); mutex_init(&c2dev->mutex);
/* Create binary file */
c2port_bin_attrs.size = ops->blocks_num * ops->block_size;
ret = device_create_bin_file(c2dev->dev, &c2port_bin_attrs);
if (unlikely(ret))
goto error_device_create_bin_file;
/* By default C2 port access is off */ /* By default C2 port access is off */
c2dev->access = c2dev->flash_access = 0; c2dev->access = c2dev->flash_access = 0;
ops->access(c2dev, 0); ops->access(c2dev, 0);
...@@ -937,9 +948,6 @@ struct c2port_device *c2port_device_register(char *name, ...@@ -937,9 +948,6 @@ struct c2port_device *c2port_device_register(char *name,
return c2dev; return c2dev;
error_device_create_bin_file:
device_destroy(c2port_class, 0);
error_device_create: error_device_create:
spin_lock_irq(&c2port_idr_lock); spin_lock_irq(&c2port_idr_lock);
idr_remove(&c2port_idr, c2dev->id); idr_remove(&c2port_idr, c2dev->id);
...@@ -959,7 +967,6 @@ void c2port_device_unregister(struct c2port_device *c2dev) ...@@ -959,7 +967,6 @@ void c2port_device_unregister(struct c2port_device *c2dev)
dev_info(c2dev->dev, "C2 port %s removed\n", c2dev->name); dev_info(c2dev->dev, "C2 port %s removed\n", c2dev->name);
device_remove_bin_file(c2dev->dev, &c2port_bin_attrs);
spin_lock_irq(&c2port_idr_lock); spin_lock_irq(&c2port_idr_lock);
idr_remove(&c2port_idr, c2dev->id); idr_remove(&c2port_idr, c2dev->id);
spin_unlock_irq(&c2port_idr_lock); spin_unlock_irq(&c2port_idr_lock);
...@@ -984,7 +991,7 @@ static int __init c2port_init(void) ...@@ -984,7 +991,7 @@ static int __init c2port_init(void)
printk(KERN_ERR "c2port: failed to allocate class\n"); printk(KERN_ERR "c2port: failed to allocate class\n");
return PTR_ERR(c2port_class); return PTR_ERR(c2port_class);
} }
c2port_class->dev_attrs = c2port_attrs; c2port_class->dev_groups = c2port_groups;
return 0; return 0;
} }
......
...@@ -239,7 +239,7 @@ static void enclosure_component_release(struct device *dev) ...@@ -239,7 +239,7 @@ static void enclosure_component_release(struct device *dev)
put_device(dev->parent); put_device(dev->parent);
} }
static const struct attribute_group *enclosure_groups[]; static const struct attribute_group *enclosure_component_groups[];
/** /**
* enclosure_component_register - add a particular component to an enclosure * enclosure_component_register - add a particular component to an enclosure
...@@ -282,7 +282,7 @@ enclosure_component_register(struct enclosure_device *edev, ...@@ -282,7 +282,7 @@ enclosure_component_register(struct enclosure_device *edev,
dev_set_name(cdev, "%u", number); dev_set_name(cdev, "%u", number);
cdev->release = enclosure_component_release; cdev->release = enclosure_component_release;
cdev->groups = enclosure_groups; cdev->groups = enclosure_component_groups;
err = device_register(cdev); err = device_register(cdev);
if (err) { if (err) {
...@@ -365,25 +365,26 @@ EXPORT_SYMBOL_GPL(enclosure_remove_device); ...@@ -365,25 +365,26 @@ EXPORT_SYMBOL_GPL(enclosure_remove_device);
* sysfs pieces below * sysfs pieces below
*/ */
static ssize_t enclosure_show_components(struct device *cdev, static ssize_t components_show(struct device *cdev,
struct device_attribute *attr, struct device_attribute *attr, char *buf)
char *buf)
{ {
struct enclosure_device *edev = to_enclosure_device(cdev); struct enclosure_device *edev = to_enclosure_device(cdev);
return snprintf(buf, 40, "%d\n", edev->components); return snprintf(buf, 40, "%d\n", edev->components);
} }
static DEVICE_ATTR_RO(components);
static struct device_attribute enclosure_attrs[] = { static struct attribute *enclosure_class_attrs[] = {
__ATTR(components, S_IRUGO, enclosure_show_components, NULL), &dev_attr_components.attr,
__ATTR_NULL NULL,
}; };
ATTRIBUTE_GROUPS(enclosure_class);
static struct class enclosure_class = { static struct class enclosure_class = {
.name = "enclosure", .name = "enclosure",
.owner = THIS_MODULE, .owner = THIS_MODULE,
.dev_release = enclosure_release, .dev_release = enclosure_release,
.dev_attrs = enclosure_attrs, .dev_groups = enclosure_class_groups,
}; };
static const char *const enclosure_status [] = { static const char *const enclosure_status [] = {
...@@ -536,15 +537,7 @@ static struct attribute *enclosure_component_attrs[] = { ...@@ -536,15 +537,7 @@ static struct attribute *enclosure_component_attrs[] = {
&dev_attr_type.attr, &dev_attr_type.attr,
NULL NULL
}; };
ATTRIBUTE_GROUPS(enclosure_component);
static struct attribute_group enclosure_group = {
.attrs = enclosure_component_attrs,
};
static const struct attribute_group *enclosure_groups[] = {
&enclosure_group,
NULL
};
static int __init enclosure_init(void) static int __init enclosure_init(void)
{ {
......
...@@ -108,11 +108,13 @@ static ssize_t modalias_show(struct device *dev, struct device_attribute *a, ...@@ -108,11 +108,13 @@ static ssize_t modalias_show(struct device *dev, struct device_attribute *a,
return (len >= PAGE_SIZE) ? (PAGE_SIZE - 1) : len; return (len >= PAGE_SIZE) ? (PAGE_SIZE - 1) : len;
} }
static DEVICE_ATTR_RO(modalias);
static struct device_attribute mei_cl_dev_attrs[] = { static struct attribute *mei_cl_dev_attrs[] = {
__ATTR_RO(modalias), &dev_attr_modalias.attr,
__ATTR_NULL, NULL,
}; };
ATTRIBUTE_GROUPS(mei_cl_dev);
static int mei_cl_uevent(struct device *dev, struct kobj_uevent_env *env) static int mei_cl_uevent(struct device *dev, struct kobj_uevent_env *env)
{ {
...@@ -124,7 +126,7 @@ static int mei_cl_uevent(struct device *dev, struct kobj_uevent_env *env) ...@@ -124,7 +126,7 @@ static int mei_cl_uevent(struct device *dev, struct kobj_uevent_env *env)
static struct bus_type mei_cl_bus_type = { static struct bus_type mei_cl_bus_type = {
.name = "mei", .name = "mei",
.dev_attrs = mei_cl_dev_attrs, .dev_groups = mei_cl_dev_groups,
.match = mei_cl_device_match, .match = mei_cl_device_match,
.probe = mei_cl_device_probe, .probe = mei_cl_device_probe,
.remove = mei_cl_device_remove, .remove = mei_cl_device_remove,
......
...@@ -9478,7 +9478,7 @@ static struct niu_parent *niu_new_parent(struct niu *np, ...@@ -9478,7 +9478,7 @@ static struct niu_parent *niu_new_parent(struct niu *np,
if (IS_ERR(plat_dev)) if (IS_ERR(plat_dev))
return NULL; return NULL;
for (i = 0; attr_name(niu_parent_attributes[i]); i++) { for (i = 0; niu_parent_attributes[i].attr.name; i++) {
int err = device_create_file(&plat_dev->dev, int err = device_create_file(&plat_dev->dev,
&niu_parent_attributes[i]); &niu_parent_attributes[i]);
if (err) if (err)
......
...@@ -693,11 +693,13 @@ static ssize_t modalias_show(struct device *dev, struct device_attribute *attr, ...@@ -693,11 +693,13 @@ static ssize_t modalias_show(struct device *dev, struct device_attribute *attr,
return sprintf(buf, "wmi:%s\n", guid_string); return sprintf(buf, "wmi:%s\n", guid_string);
} }
static DEVICE_ATTR_RO(modalias);
static struct device_attribute wmi_dev_attrs[] = { static struct attribute *wmi_attrs[] = {
__ATTR_RO(modalias), &dev_attr_modalias.attr,
__ATTR_NULL NULL,
}; };
ATTRIBUTE_GROUPS(wmi);
static int wmi_dev_uevent(struct device *dev, struct kobj_uevent_env *env) static int wmi_dev_uevent(struct device *dev, struct kobj_uevent_env *env)
{ {
...@@ -732,7 +734,7 @@ static struct class wmi_class = { ...@@ -732,7 +734,7 @@ static struct class wmi_class = {
.name = "wmi", .name = "wmi",
.dev_release = wmi_dev_free, .dev_release = wmi_dev_free,
.dev_uevent = wmi_dev_uevent, .dev_uevent = wmi_dev_uevent,
.dev_attrs = wmi_dev_attrs, .dev_groups = wmi_groups,
}; };
static int wmi_create_device(const struct guid_block *gblock, static int wmi_create_device(const struct guid_block *gblock,
......
...@@ -406,7 +406,7 @@ static int __init pps_init(void) ...@@ -406,7 +406,7 @@ static int __init pps_init(void)
pr_err("failed to allocate class\n"); pr_err("failed to allocate class\n");
return PTR_ERR(pps_class); return PTR_ERR(pps_class);
} }
pps_class->dev_attrs = pps_attrs; pps_class->dev_groups = pps_groups;
err = alloc_chrdev_region(&pps_devt, 0, PPS_MAX_SOURCES, "pps"); err = alloc_chrdev_region(&pps_devt, 0, PPS_MAX_SOURCES, "pps");
if (err < 0) { if (err < 0) {
......
...@@ -29,8 +29,8 @@ ...@@ -29,8 +29,8 @@
* Attribute functions * Attribute functions
*/ */
static ssize_t pps_show_assert(struct device *dev, static ssize_t assert_show(struct device *dev, struct device_attribute *attr,
struct device_attribute *attr, char *buf) char *buf)
{ {
struct pps_device *pps = dev_get_drvdata(dev); struct pps_device *pps = dev_get_drvdata(dev);
...@@ -41,9 +41,10 @@ static ssize_t pps_show_assert(struct device *dev, ...@@ -41,9 +41,10 @@ static ssize_t pps_show_assert(struct device *dev,
(long long) pps->assert_tu.sec, pps->assert_tu.nsec, (long long) pps->assert_tu.sec, pps->assert_tu.nsec,
pps->assert_sequence); pps->assert_sequence);
} }
static DEVICE_ATTR_RO(assert);
static ssize_t pps_show_clear(struct device *dev, static ssize_t clear_show(struct device *dev, struct device_attribute *attr,
struct device_attribute *attr, char *buf) char *buf)
{ {
struct pps_device *pps = dev_get_drvdata(dev); struct pps_device *pps = dev_get_drvdata(dev);
...@@ -54,45 +55,59 @@ static ssize_t pps_show_clear(struct device *dev, ...@@ -54,45 +55,59 @@ static ssize_t pps_show_clear(struct device *dev,
(long long) pps->clear_tu.sec, pps->clear_tu.nsec, (long long) pps->clear_tu.sec, pps->clear_tu.nsec,
pps->clear_sequence); pps->clear_sequence);
} }
static DEVICE_ATTR_RO(clear);
static ssize_t pps_show_mode(struct device *dev, static ssize_t mode_show(struct device *dev, struct device_attribute *attr,
struct device_attribute *attr, char *buf) char *buf)
{ {
struct pps_device *pps = dev_get_drvdata(dev); struct pps_device *pps = dev_get_drvdata(dev);
return sprintf(buf, "%4x\n", pps->info.mode); return sprintf(buf, "%4x\n", pps->info.mode);
} }
static DEVICE_ATTR_RO(mode);
static ssize_t pps_show_echo(struct device *dev, static ssize_t echo_show(struct device *dev, struct device_attribute *attr,
struct device_attribute *attr, char *buf) char *buf)
{ {
struct pps_device *pps = dev_get_drvdata(dev); struct pps_device *pps = dev_get_drvdata(dev);
return sprintf(buf, "%d\n", !!pps->info.echo); return sprintf(buf, "%d\n", !!pps->info.echo);
} }
static DEVICE_ATTR_RO(echo);
static ssize_t pps_show_name(struct device *dev, static ssize_t name_show(struct device *dev, struct device_attribute *attr,
struct device_attribute *attr, char *buf) char *buf)
{ {
struct pps_device *pps = dev_get_drvdata(dev); struct pps_device *pps = dev_get_drvdata(dev);
return sprintf(buf, "%s\n", pps->info.name); return sprintf(buf, "%s\n", pps->info.name);
} }
static DEVICE_ATTR_RO(name);
static ssize_t pps_show_path(struct device *dev, static ssize_t path_show(struct device *dev, struct device_attribute *attr,
struct device_attribute *attr, char *buf) char *buf)
{ {
struct pps_device *pps = dev_get_drvdata(dev); struct pps_device *pps = dev_get_drvdata(dev);
return sprintf(buf, "%s\n", pps->info.path); return sprintf(buf, "%s\n", pps->info.path);
} }
static DEVICE_ATTR_RO(path);
static struct attribute *pps_attrs[] = {
&dev_attr_assert.attr,
&dev_attr_clear.attr,
&dev_attr_mode.attr,
&dev_attr_echo.attr,
&dev_attr_name.attr,
&dev_attr_path.attr,
NULL,
};
static const struct attribute_group pps_group = {
.attrs = pps_attrs,
};
struct device_attribute pps_attrs[] = { const struct attribute_group *pps_groups[] = {
__ATTR(assert, S_IRUGO, pps_show_assert, NULL), &pps_group,
__ATTR(clear, S_IRUGO, pps_show_clear, NULL), NULL,
__ATTR(mode, S_IRUGO, pps_show_mode, NULL),
__ATTR(echo, S_IRUGO, pps_show_echo, NULL),
__ATTR(name, S_IRUGO, pps_show_name, NULL),
__ATTR(path, S_IRUGO, pps_show_path, NULL),
__ATTR_NULL,
}; };
...@@ -330,7 +330,7 @@ static int __init ptp_init(void) ...@@ -330,7 +330,7 @@ static int __init ptp_init(void)
goto no_region; goto no_region;
} }
ptp_class->dev_attrs = ptp_dev_attrs; ptp_class->dev_groups = ptp_groups;
pr_info("PTP clock support registered\n"); pr_info("PTP clock support registered\n");
return 0; return 0;
......
...@@ -84,7 +84,7 @@ uint ptp_poll(struct posix_clock *pc, ...@@ -84,7 +84,7 @@ uint ptp_poll(struct posix_clock *pc,
* see ptp_sysfs.c * see ptp_sysfs.c
*/ */
extern struct device_attribute ptp_dev_attrs[]; extern const struct attribute_group *ptp_groups[];
int ptp_cleanup_sysfs(struct ptp_clock *ptp); int ptp_cleanup_sysfs(struct ptp_clock *ptp);
......
...@@ -27,36 +27,43 @@ static ssize_t clock_name_show(struct device *dev, ...@@ -27,36 +27,43 @@ static ssize_t clock_name_show(struct device *dev,
struct ptp_clock *ptp = dev_get_drvdata(dev); struct ptp_clock *ptp = dev_get_drvdata(dev);
return snprintf(page, PAGE_SIZE-1, "%s\n", ptp->info->name); return snprintf(page, PAGE_SIZE-1, "%s\n", ptp->info->name);
} }
static DEVICE_ATTR(clock_name, 0444, clock_name_show, NULL);
#define PTP_SHOW_INT(name) \ #define PTP_SHOW_INT(name, var) \
static ssize_t name##_show(struct device *dev, \ static ssize_t var##_show(struct device *dev, \
struct device_attribute *attr, char *page) \ struct device_attribute *attr, char *page) \
{ \ { \
struct ptp_clock *ptp = dev_get_drvdata(dev); \ struct ptp_clock *ptp = dev_get_drvdata(dev); \
return snprintf(page, PAGE_SIZE-1, "%d\n", ptp->info->name); \ return snprintf(page, PAGE_SIZE-1, "%d\n", ptp->info->var); \
} } \
static DEVICE_ATTR(name, 0444, var##_show, NULL);
PTP_SHOW_INT(max_adj);
PTP_SHOW_INT(n_alarm); PTP_SHOW_INT(max_adjustment, max_adj);
PTP_SHOW_INT(n_ext_ts); PTP_SHOW_INT(n_alarms, n_alarm);
PTP_SHOW_INT(n_per_out); PTP_SHOW_INT(n_external_timestamps, n_ext_ts);
PTP_SHOW_INT(pps); PTP_SHOW_INT(n_periodic_outputs, n_per_out);
PTP_SHOW_INT(pps_available, pps);
static struct attribute *ptp_attrs[] = {
&dev_attr_clock_name.attr,
&dev_attr_max_adjustment.attr,
&dev_attr_n_alarms.attr,
&dev_attr_n_external_timestamps.attr,
&dev_attr_n_periodic_outputs.attr,
&dev_attr_pps_available.attr,
NULL,
};
#define PTP_RO_ATTR(_var, _name) { \ static const struct attribute_group ptp_group = {
.attr = { .name = __stringify(_name), .mode = 0444 }, \ .attrs = ptp_attrs,
.show = _var##_show, \ };
}
struct device_attribute ptp_dev_attrs[] = { const struct attribute_group *ptp_groups[] = {
PTP_RO_ATTR(clock_name, clock_name), &ptp_group,
PTP_RO_ATTR(max_adj, max_adjustment), NULL,
PTP_RO_ATTR(n_alarm, n_alarms),
PTP_RO_ATTR(n_ext_ts, n_external_timestamps),
PTP_RO_ATTR(n_per_out, n_periodic_outputs),
PTP_RO_ATTR(pps, pps_available),
__ATTR_NULL,
}; };
static ssize_t extts_enable_store(struct device *dev, static ssize_t extts_enable_store(struct device *dev,
struct device_attribute *attr, struct device_attribute *attr,
const char *buf, size_t count) const char *buf, size_t count)
......
...@@ -25,15 +25,14 @@ ...@@ -25,15 +25,14 @@
*/ */
static ssize_t static ssize_t
rtc_sysfs_show_name(struct device *dev, struct device_attribute *attr, name_show(struct device *dev, struct device_attribute *attr, char *buf)
char *buf)
{ {
return sprintf(buf, "%s\n", to_rtc_device(dev)->name); return sprintf(buf, "%s\n", to_rtc_device(dev)->name);
} }
static DEVICE_ATTR_RO(name);
static ssize_t static ssize_t
rtc_sysfs_show_date(struct device *dev, struct device_attribute *attr, date_show(struct device *dev, struct device_attribute *attr, char *buf)
char *buf)
{ {
ssize_t retval; ssize_t retval;
struct rtc_time tm; struct rtc_time tm;
...@@ -46,10 +45,10 @@ rtc_sysfs_show_date(struct device *dev, struct device_attribute *attr, ...@@ -46,10 +45,10 @@ rtc_sysfs_show_date(struct device *dev, struct device_attribute *attr,
return retval; return retval;
} }
static DEVICE_ATTR_RO(date);
static ssize_t static ssize_t
rtc_sysfs_show_time(struct device *dev, struct device_attribute *attr, time_show(struct device *dev, struct device_attribute *attr, char *buf)
char *buf)
{ {
ssize_t retval; ssize_t retval;
struct rtc_time tm; struct rtc_time tm;
...@@ -62,10 +61,10 @@ rtc_sysfs_show_time(struct device *dev, struct device_attribute *attr, ...@@ -62,10 +61,10 @@ rtc_sysfs_show_time(struct device *dev, struct device_attribute *attr,
return retval; return retval;
} }
static DEVICE_ATTR_RO(time);
static ssize_t static ssize_t
rtc_sysfs_show_since_epoch(struct device *dev, struct device_attribute *attr, since_epoch_show(struct device *dev, struct device_attribute *attr, char *buf)
char *buf)
{ {
ssize_t retval; ssize_t retval;
struct rtc_time tm; struct rtc_time tm;
...@@ -79,16 +78,16 @@ rtc_sysfs_show_since_epoch(struct device *dev, struct device_attribute *attr, ...@@ -79,16 +78,16 @@ rtc_sysfs_show_since_epoch(struct device *dev, struct device_attribute *attr,
return retval; return retval;
} }
static DEVICE_ATTR_RO(since_epoch);
static ssize_t static ssize_t
rtc_sysfs_show_max_user_freq(struct device *dev, struct device_attribute *attr, max_user_freq_show(struct device *dev, struct device_attribute *attr, char *buf)
char *buf)
{ {
return sprintf(buf, "%d\n", to_rtc_device(dev)->max_user_freq); return sprintf(buf, "%d\n", to_rtc_device(dev)->max_user_freq);
} }
static ssize_t static ssize_t
rtc_sysfs_set_max_user_freq(struct device *dev, struct device_attribute *attr, max_user_freq_store(struct device *dev, struct device_attribute *attr,
const char *buf, size_t n) const char *buf, size_t n)
{ {
struct rtc_device *rtc = to_rtc_device(dev); struct rtc_device *rtc = to_rtc_device(dev);
...@@ -101,6 +100,7 @@ rtc_sysfs_set_max_user_freq(struct device *dev, struct device_attribute *attr, ...@@ -101,6 +100,7 @@ rtc_sysfs_set_max_user_freq(struct device *dev, struct device_attribute *attr,
return n; return n;
} }
static DEVICE_ATTR_RW(max_user_freq);
/** /**
* rtc_sysfs_show_hctosys - indicate if the given RTC set the system time * rtc_sysfs_show_hctosys - indicate if the given RTC set the system time
...@@ -109,8 +109,7 @@ rtc_sysfs_set_max_user_freq(struct device *dev, struct device_attribute *attr, ...@@ -109,8 +109,7 @@ rtc_sysfs_set_max_user_freq(struct device *dev, struct device_attribute *attr,
* boot or resume event. * boot or resume event.
*/ */
static ssize_t static ssize_t
rtc_sysfs_show_hctosys(struct device *dev, struct device_attribute *attr, hctosys_show(struct device *dev, struct device_attribute *attr, char *buf)
char *buf)
{ {
#ifdef CONFIG_RTC_HCTOSYS_DEVICE #ifdef CONFIG_RTC_HCTOSYS_DEVICE
if (rtc_hctosys_ret == 0 && if (rtc_hctosys_ret == 0 &&
...@@ -121,17 +120,18 @@ rtc_sysfs_show_hctosys(struct device *dev, struct device_attribute *attr, ...@@ -121,17 +120,18 @@ rtc_sysfs_show_hctosys(struct device *dev, struct device_attribute *attr,
#endif #endif
return sprintf(buf, "0\n"); return sprintf(buf, "0\n");
} }
static DEVICE_ATTR_RO(hctosys);
static struct device_attribute rtc_attrs[] = {
__ATTR(name, S_IRUGO, rtc_sysfs_show_name, NULL), static struct attribute *rtc_attrs[] = {
__ATTR(date, S_IRUGO, rtc_sysfs_show_date, NULL), &dev_attr_name.attr,
__ATTR(time, S_IRUGO, rtc_sysfs_show_time, NULL), &dev_attr_date.attr,
__ATTR(since_epoch, S_IRUGO, rtc_sysfs_show_since_epoch, NULL), &dev_attr_time.attr,
__ATTR(max_user_freq, S_IRUGO | S_IWUSR, rtc_sysfs_show_max_user_freq, &dev_attr_since_epoch.attr,
rtc_sysfs_set_max_user_freq), &dev_attr_max_user_freq.attr,
__ATTR(hctosys, S_IRUGO, rtc_sysfs_show_hctosys, NULL), &dev_attr_hctosys.attr,
{ }, NULL,
}; };
ATTRIBUTE_GROUPS(rtc);
static ssize_t static ssize_t
rtc_sysfs_show_wakealarm(struct device *dev, struct device_attribute *attr, rtc_sysfs_show_wakealarm(struct device *dev, struct device_attribute *attr,
...@@ -261,5 +261,5 @@ void rtc_sysfs_del_device(struct rtc_device *rtc) ...@@ -261,5 +261,5 @@ void rtc_sysfs_del_device(struct rtc_device *rtc)
void __init rtc_sysfs_init(struct class *rtc_class) void __init rtc_sysfs_init(struct class *rtc_class)
{ {
rtc_class->dev_attrs = rtc_attrs; rtc_class->dev_groups = rtc_groups;
} }
...@@ -107,6 +107,7 @@ static ssize_t osdname_show(struct device *dev, struct device_attribute *attr, ...@@ -107,6 +107,7 @@ static ssize_t osdname_show(struct device *dev, struct device_attribute *attr,
class_dev); class_dev);
return sprintf(buf, "%s\n", ould->odi.osdname); return sprintf(buf, "%s\n", ould->odi.osdname);
} }
static DEVICE_ATTR_RO(osdname);
static ssize_t systemid_show(struct device *dev, struct device_attribute *attr, static ssize_t systemid_show(struct device *dev, struct device_attribute *attr,
char *buf) char *buf)
...@@ -117,17 +118,19 @@ static ssize_t systemid_show(struct device *dev, struct device_attribute *attr, ...@@ -117,17 +118,19 @@ static ssize_t systemid_show(struct device *dev, struct device_attribute *attr,
memcpy(buf, ould->odi.systemid, ould->odi.systemid_len); memcpy(buf, ould->odi.systemid, ould->odi.systemid_len);
return ould->odi.systemid_len; return ould->odi.systemid_len;
} }
static DEVICE_ATTR_RO(systemid);
static struct device_attribute osd_uld_attrs[] = { static struct attribute *osd_uld_attrs[] = {
__ATTR(osdname, S_IRUGO, osdname_show, NULL), &dev_attr_osdname.attr,
__ATTR(systemid, S_IRUGO, systemid_show, NULL), &dev_attr_systemid.attr,
__ATTR_NULL, NULL,
}; };
ATTRIBUTE_GROUPS(osd_uld);
static struct class osd_uld_class = { static struct class osd_uld_class = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.name = "scsi_osd", .name = "scsi_osd",
.dev_attrs = osd_uld_attrs, .dev_groups = osd_uld_groups,
}; };
/* /*
......
...@@ -262,7 +262,7 @@ static int resize_async_buffer(struct comedi_device *dev, ...@@ -262,7 +262,7 @@ static int resize_async_buffer(struct comedi_device *dev,
/* sysfs attribute files */ /* sysfs attribute files */
static ssize_t show_max_read_buffer_kb(struct device *csdev, static ssize_t max_read_buffer_kb_show(struct device *csdev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
{ {
unsigned int minor = MINOR(csdev->devt); unsigned int minor = MINOR(csdev->devt);
...@@ -283,7 +283,7 @@ static ssize_t show_max_read_buffer_kb(struct device *csdev, ...@@ -283,7 +283,7 @@ static ssize_t show_max_read_buffer_kb(struct device *csdev,
return snprintf(buf, PAGE_SIZE, "%i\n", size); return snprintf(buf, PAGE_SIZE, "%i\n", size);
} }
static ssize_t store_max_read_buffer_kb(struct device *csdev, static ssize_t max_read_buffer_kb_store(struct device *csdev,
struct device_attribute *attr, struct device_attribute *attr,
const char *buf, size_t count) const char *buf, size_t count)
{ {
...@@ -314,8 +314,9 @@ static ssize_t store_max_read_buffer_kb(struct device *csdev, ...@@ -314,8 +314,9 @@ static ssize_t store_max_read_buffer_kb(struct device *csdev,
return err ? err : count; return err ? err : count;
} }
static DEVICE_ATTR_RW(max_read_buffer_kb);
static ssize_t show_read_buffer_kb(struct device *csdev, static ssize_t read_buffer_kb_show(struct device *csdev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
{ {
unsigned int minor = MINOR(csdev->devt); unsigned int minor = MINOR(csdev->devt);
...@@ -336,7 +337,7 @@ static ssize_t show_read_buffer_kb(struct device *csdev, ...@@ -336,7 +337,7 @@ static ssize_t show_read_buffer_kb(struct device *csdev,
return snprintf(buf, PAGE_SIZE, "%i\n", size); return snprintf(buf, PAGE_SIZE, "%i\n", size);
} }
static ssize_t store_read_buffer_kb(struct device *csdev, static ssize_t read_buffer_kb_store(struct device *csdev,
struct device_attribute *attr, struct device_attribute *attr,
const char *buf, size_t count) const char *buf, size_t count)
{ {
...@@ -367,8 +368,9 @@ static ssize_t store_read_buffer_kb(struct device *csdev, ...@@ -367,8 +368,9 @@ static ssize_t store_read_buffer_kb(struct device *csdev,
return err ? err : count; return err ? err : count;
} }
static DEVICE_ATTR_RW(read_buffer_kb);
static ssize_t show_max_write_buffer_kb(struct device *csdev, static ssize_t max_write_buffer_kb_show(struct device *csdev,
struct device_attribute *attr, struct device_attribute *attr,
char *buf) char *buf)
{ {
...@@ -390,7 +392,7 @@ static ssize_t show_max_write_buffer_kb(struct device *csdev, ...@@ -390,7 +392,7 @@ static ssize_t show_max_write_buffer_kb(struct device *csdev,
return snprintf(buf, PAGE_SIZE, "%i\n", size); return snprintf(buf, PAGE_SIZE, "%i\n", size);
} }
static ssize_t store_max_write_buffer_kb(struct device *csdev, static ssize_t max_write_buffer_kb_store(struct device *csdev,
struct device_attribute *attr, struct device_attribute *attr,
const char *buf, size_t count) const char *buf, size_t count)
{ {
...@@ -421,8 +423,9 @@ static ssize_t store_max_write_buffer_kb(struct device *csdev, ...@@ -421,8 +423,9 @@ static ssize_t store_max_write_buffer_kb(struct device *csdev,
return err ? err : count; return err ? err : count;
} }
static DEVICE_ATTR_RW(max_write_buffer_kb);
static ssize_t show_write_buffer_kb(struct device *csdev, static ssize_t write_buffer_kb_show(struct device *csdev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
{ {
unsigned int minor = MINOR(csdev->devt); unsigned int minor = MINOR(csdev->devt);
...@@ -443,7 +446,7 @@ static ssize_t show_write_buffer_kb(struct device *csdev, ...@@ -443,7 +446,7 @@ static ssize_t show_write_buffer_kb(struct device *csdev,
return snprintf(buf, PAGE_SIZE, "%i\n", size); return snprintf(buf, PAGE_SIZE, "%i\n", size);
} }
static ssize_t store_write_buffer_kb(struct device *csdev, static ssize_t write_buffer_kb_store(struct device *csdev,
struct device_attribute *attr, struct device_attribute *attr,
const char *buf, size_t count) const char *buf, size_t count)
{ {
...@@ -474,18 +477,16 @@ static ssize_t store_write_buffer_kb(struct device *csdev, ...@@ -474,18 +477,16 @@ static ssize_t store_write_buffer_kb(struct device *csdev,
return err ? err : count; return err ? err : count;
} }
static DEVICE_ATTR_RW(write_buffer_kb);
static struct device_attribute comedi_dev_attrs[] = { static struct attribute *comedi_dev_attrs[] = {
__ATTR(max_read_buffer_kb, S_IRUGO | S_IWUSR, &dev_attr_max_read_buffer_kb.attr,
show_max_read_buffer_kb, store_max_read_buffer_kb), &dev_attr_read_buffer_kb.attr,
__ATTR(read_buffer_kb, S_IRUGO | S_IWUSR | S_IWGRP, &dev_attr_max_write_buffer_kb.attr,
show_read_buffer_kb, store_read_buffer_kb), &dev_attr_write_buffer_kb.attr,
__ATTR(max_write_buffer_kb, S_IRUGO | S_IWUSR, NULL,
show_max_write_buffer_kb, store_max_write_buffer_kb),
__ATTR(write_buffer_kb, S_IRUGO | S_IWUSR | S_IWGRP,
show_write_buffer_kb, store_write_buffer_kb),
__ATTR_NULL
}; };
ATTRIBUTE_GROUPS(comedi_dev);
static void comedi_set_subdevice_runflags(struct comedi_subdevice *s, static void comedi_set_subdevice_runflags(struct comedi_subdevice *s,
unsigned mask, unsigned bits) unsigned mask, unsigned bits)
...@@ -2564,7 +2565,7 @@ static int __init comedi_init(void) ...@@ -2564,7 +2565,7 @@ static int __init comedi_init(void)
return PTR_ERR(comedi_class); return PTR_ERR(comedi_class);
} }
comedi_class->dev_attrs = comedi_dev_attrs; comedi_class->dev_groups = comedi_dev_groups;
/* XXX requires /proc interface */ /* XXX requires /proc interface */
comedi_proc_init(); comedi_proc_init();
......
...@@ -223,38 +223,42 @@ static struct kobj_type portio_attr_type = { ...@@ -223,38 +223,42 @@ static struct kobj_type portio_attr_type = {
.default_attrs = portio_attrs, .default_attrs = portio_attrs,
}; };
static ssize_t show_name(struct device *dev, static ssize_t name_show(struct device *dev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
{ {
struct uio_device *idev = dev_get_drvdata(dev); struct uio_device *idev = dev_get_drvdata(dev);
return sprintf(buf, "%s\n", idev->info->name); return sprintf(buf, "%s\n", idev->info->name);
} }
static DEVICE_ATTR_RO(name);
static ssize_t show_version(struct device *dev, static ssize_t version_show(struct device *dev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
{ {
struct uio_device *idev = dev_get_drvdata(dev); struct uio_device *idev = dev_get_drvdata(dev);
return sprintf(buf, "%s\n", idev->info->version); return sprintf(buf, "%s\n", idev->info->version);
} }
static DEVICE_ATTR_RO(version);
static ssize_t show_event(struct device *dev, static ssize_t event_show(struct device *dev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
{ {
struct uio_device *idev = dev_get_drvdata(dev); struct uio_device *idev = dev_get_drvdata(dev);
return sprintf(buf, "%u\n", (unsigned int)atomic_read(&idev->event)); return sprintf(buf, "%u\n", (unsigned int)atomic_read(&idev->event));
} }
static DEVICE_ATTR_RO(event);
static struct device_attribute uio_class_attributes[] = { static struct attribute *uio_attrs[] = {
__ATTR(name, S_IRUGO, show_name, NULL), &dev_attr_name.attr,
__ATTR(version, S_IRUGO, show_version, NULL), &dev_attr_version.attr,
__ATTR(event, S_IRUGO, show_event, NULL), &dev_attr_event.attr,
{} NULL,
}; };
ATTRIBUTE_GROUPS(uio);
/* UIO class infrastructure */ /* UIO class infrastructure */
static struct class uio_class = { static struct class uio_class = {
.name = "uio", .name = "uio",
.dev_attrs = uio_class_attributes, .dev_groups = uio_groups,
}; };
/* /*
......
...@@ -121,7 +121,7 @@ static int usb_serial_device_remove(struct device *dev) ...@@ -121,7 +121,7 @@ static int usb_serial_device_remove(struct device *dev)
return retval; return retval;
} }
static ssize_t store_new_id(struct device_driver *driver, static ssize_t new_id_store(struct device_driver *driver,
const char *buf, size_t count) const char *buf, size_t count)
{ {
struct usb_serial_driver *usb_drv = to_usb_serial_driver(driver); struct usb_serial_driver *usb_drv = to_usb_serial_driver(driver);
...@@ -134,17 +134,19 @@ static ssize_t store_new_id(struct device_driver *driver, ...@@ -134,17 +134,19 @@ static ssize_t store_new_id(struct device_driver *driver,
return retval; return retval;
} }
static ssize_t show_dynids(struct device_driver *driver, char *buf) static ssize_t new_id_show(struct device_driver *driver, char *buf)
{ {
struct usb_serial_driver *usb_drv = to_usb_serial_driver(driver); struct usb_serial_driver *usb_drv = to_usb_serial_driver(driver);
return usb_show_dynids(&usb_drv->dynids, buf); return usb_show_dynids(&usb_drv->dynids, buf);
} }
static DRIVER_ATTR_RW(new_id);
static struct driver_attribute drv_attrs[] = { static struct attribute *usb_serial_drv_attrs[] = {
__ATTR(new_id, S_IRUGO | S_IWUSR, show_dynids, store_new_id), &driver_attr_new_id.attr,
__ATTR_NULL, NULL,
}; };
ATTRIBUTE_GROUPS(usb_serial_drv);
static void free_dynids(struct usb_serial_driver *drv) static void free_dynids(struct usb_serial_driver *drv)
{ {
...@@ -163,7 +165,7 @@ struct bus_type usb_serial_bus_type = { ...@@ -163,7 +165,7 @@ struct bus_type usb_serial_bus_type = {
.match = usb_serial_device_match, .match = usb_serial_device_match,
.probe = usb_serial_device_probe, .probe = usb_serial_device_probe,
.remove = usb_serial_device_remove, .remove = usb_serial_device_remove,
.drv_attrs = drv_attrs, .drv_groups = usb_serial_drv_groups,
}; };
int usb_serial_bus_register(struct usb_serial_driver *driver) int usb_serial_bus_register(struct usb_serial_driver *driver)
......
...@@ -103,16 +103,16 @@ static void backlight_generate_event(struct backlight_device *bd, ...@@ -103,16 +103,16 @@ static void backlight_generate_event(struct backlight_device *bd,
sysfs_notify(&bd->dev.kobj, NULL, "actual_brightness"); sysfs_notify(&bd->dev.kobj, NULL, "actual_brightness");
} }
static ssize_t backlight_show_power(struct device *dev, static ssize_t bl_power_show(struct device *dev, struct device_attribute *attr,
struct device_attribute *attr, char *buf) char *buf)
{ {
struct backlight_device *bd = to_backlight_device(dev); struct backlight_device *bd = to_backlight_device(dev);
return sprintf(buf, "%d\n", bd->props.power); return sprintf(buf, "%d\n", bd->props.power);
} }
static ssize_t backlight_store_power(struct device *dev, static ssize_t bl_power_store(struct device *dev, struct device_attribute *attr,
struct device_attribute *attr, const char *buf, size_t count) const char *buf, size_t count)
{ {
int rc; int rc;
struct backlight_device *bd = to_backlight_device(dev); struct backlight_device *bd = to_backlight_device(dev);
...@@ -136,8 +136,9 @@ static ssize_t backlight_store_power(struct device *dev, ...@@ -136,8 +136,9 @@ static ssize_t backlight_store_power(struct device *dev,
return rc; return rc;
} }
static DEVICE_ATTR_RW(bl_power);
static ssize_t backlight_show_brightness(struct device *dev, static ssize_t brightness_show(struct device *dev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
{ {
struct backlight_device *bd = to_backlight_device(dev); struct backlight_device *bd = to_backlight_device(dev);
...@@ -145,7 +146,7 @@ static ssize_t backlight_show_brightness(struct device *dev, ...@@ -145,7 +146,7 @@ static ssize_t backlight_show_brightness(struct device *dev,
return sprintf(buf, "%d\n", bd->props.brightness); return sprintf(buf, "%d\n", bd->props.brightness);
} }
static ssize_t backlight_store_brightness(struct device *dev, static ssize_t brightness_store(struct device *dev,
struct device_attribute *attr, const char *buf, size_t count) struct device_attribute *attr, const char *buf, size_t count)
{ {
int rc; int rc;
...@@ -175,24 +176,27 @@ static ssize_t backlight_store_brightness(struct device *dev, ...@@ -175,24 +176,27 @@ static ssize_t backlight_store_brightness(struct device *dev,
return rc; return rc;
} }
static DEVICE_ATTR_RW(brightness);
static ssize_t backlight_show_type(struct device *dev, static ssize_t type_show(struct device *dev, struct device_attribute *attr,
struct device_attribute *attr, char *buf) char *buf)
{ {
struct backlight_device *bd = to_backlight_device(dev); struct backlight_device *bd = to_backlight_device(dev);
return sprintf(buf, "%s\n", backlight_types[bd->props.type]); return sprintf(buf, "%s\n", backlight_types[bd->props.type]);
} }
static DEVICE_ATTR_RO(type);
static ssize_t backlight_show_max_brightness(struct device *dev, static ssize_t max_brightness_show(struct device *dev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
{ {
struct backlight_device *bd = to_backlight_device(dev); struct backlight_device *bd = to_backlight_device(dev);
return sprintf(buf, "%d\n", bd->props.max_brightness); return sprintf(buf, "%d\n", bd->props.max_brightness);
} }
static DEVICE_ATTR_RO(max_brightness);
static ssize_t backlight_show_actual_brightness(struct device *dev, static ssize_t actual_brightness_show(struct device *dev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
{ {
int rc = -ENXIO; int rc = -ENXIO;
...@@ -205,6 +209,7 @@ static ssize_t backlight_show_actual_brightness(struct device *dev, ...@@ -205,6 +209,7 @@ static ssize_t backlight_show_actual_brightness(struct device *dev,
return rc; return rc;
} }
static DEVICE_ATTR_RO(actual_brightness);
static struct class *backlight_class; static struct class *backlight_class;
...@@ -247,16 +252,15 @@ static void bl_device_release(struct device *dev) ...@@ -247,16 +252,15 @@ static void bl_device_release(struct device *dev)
kfree(bd); kfree(bd);
} }
static struct device_attribute bl_device_attributes[] = { static struct attribute *bl_device_attrs[] = {
__ATTR(bl_power, 0644, backlight_show_power, backlight_store_power), &dev_attr_bl_power.attr,
__ATTR(brightness, 0644, backlight_show_brightness, &dev_attr_brightness.attr,
backlight_store_brightness), &dev_attr_actual_brightness.attr,
__ATTR(actual_brightness, 0444, backlight_show_actual_brightness, &dev_attr_max_brightness.attr,
NULL), &dev_attr_type.attr,
__ATTR(max_brightness, 0444, backlight_show_max_brightness, NULL), NULL,
__ATTR(type, 0444, backlight_show_type, NULL),
__ATTR_NULL,
}; };
ATTRIBUTE_GROUPS(bl_device);
/** /**
* backlight_force_update - tell the backlight subsystem that hardware state * backlight_force_update - tell the backlight subsystem that hardware state
...@@ -493,7 +497,7 @@ static int __init backlight_class_init(void) ...@@ -493,7 +497,7 @@ static int __init backlight_class_init(void)
return PTR_ERR(backlight_class); return PTR_ERR(backlight_class);
} }
backlight_class->dev_attrs = bl_device_attributes; backlight_class->dev_groups = bl_device_groups;
backlight_class->pm = &backlight_class_dev_pm_ops; backlight_class->pm = &backlight_class_dev_pm_ops;
return 0; return 0;
} }
......
...@@ -89,7 +89,7 @@ static inline void lcd_unregister_fb(struct lcd_device *ld) ...@@ -89,7 +89,7 @@ static inline void lcd_unregister_fb(struct lcd_device *ld)
} }
#endif /* CONFIG_FB */ #endif /* CONFIG_FB */
static ssize_t lcd_show_power(struct device *dev, struct device_attribute *attr, static ssize_t lcd_power_show(struct device *dev, struct device_attribute *attr,
char *buf) char *buf)
{ {
int rc; int rc;
...@@ -105,7 +105,7 @@ static ssize_t lcd_show_power(struct device *dev, struct device_attribute *attr, ...@@ -105,7 +105,7 @@ static ssize_t lcd_show_power(struct device *dev, struct device_attribute *attr,
return rc; return rc;
} }
static ssize_t lcd_store_power(struct device *dev, static ssize_t lcd_power_store(struct device *dev,
struct device_attribute *attr, const char *buf, size_t count) struct device_attribute *attr, const char *buf, size_t count)
{ {
int rc; int rc;
...@@ -128,8 +128,9 @@ static ssize_t lcd_store_power(struct device *dev, ...@@ -128,8 +128,9 @@ static ssize_t lcd_store_power(struct device *dev,
return rc; return rc;
} }
static DEVICE_ATTR_RW(lcd_power);
static ssize_t lcd_show_contrast(struct device *dev, static ssize_t contrast_show(struct device *dev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
{ {
int rc = -ENXIO; int rc = -ENXIO;
...@@ -143,7 +144,7 @@ static ssize_t lcd_show_contrast(struct device *dev, ...@@ -143,7 +144,7 @@ static ssize_t lcd_show_contrast(struct device *dev,
return rc; return rc;
} }
static ssize_t lcd_store_contrast(struct device *dev, static ssize_t contrast_store(struct device *dev,
struct device_attribute *attr, const char *buf, size_t count) struct device_attribute *attr, const char *buf, size_t count)
{ {
int rc; int rc;
...@@ -166,14 +167,16 @@ static ssize_t lcd_store_contrast(struct device *dev, ...@@ -166,14 +167,16 @@ static ssize_t lcd_store_contrast(struct device *dev,
return rc; return rc;
} }
static DEVICE_ATTR_RW(contrast);
static ssize_t lcd_show_max_contrast(struct device *dev, static ssize_t max_contrast_show(struct device *dev,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
{ {
struct lcd_device *ld = to_lcd_device(dev); struct lcd_device *ld = to_lcd_device(dev);
return sprintf(buf, "%d\n", ld->props.max_contrast); return sprintf(buf, "%d\n", ld->props.max_contrast);
} }
static DEVICE_ATTR_RO(max_contrast);
static struct class *lcd_class; static struct class *lcd_class;
...@@ -183,12 +186,13 @@ static void lcd_device_release(struct device *dev) ...@@ -183,12 +186,13 @@ static void lcd_device_release(struct device *dev)
kfree(ld); kfree(ld);
} }
static struct device_attribute lcd_device_attributes[] = { static struct attribute *lcd_device_attrs[] = {
__ATTR(lcd_power, 0644, lcd_show_power, lcd_store_power), &dev_attr_lcd_power.attr,
__ATTR(contrast, 0644, lcd_show_contrast, lcd_store_contrast), &dev_attr_contrast.attr,
__ATTR(max_contrast, 0444, lcd_show_max_contrast, NULL), &dev_attr_max_contrast.attr,
__ATTR_NULL, NULL,
}; };
ATTRIBUTE_GROUPS(lcd_device);
/** /**
* lcd_device_register - register a new object of lcd_device class. * lcd_device_register - register a new object of lcd_device class.
...@@ -344,7 +348,7 @@ static int __init lcd_class_init(void) ...@@ -344,7 +348,7 @@ static int __init lcd_class_init(void)
return PTR_ERR(lcd_class); return PTR_ERR(lcd_class);
} }
lcd_class->dev_attrs = lcd_device_attributes; lcd_class->dev_groups = lcd_device_groups;
return 0; return 0;
} }
......
...@@ -72,10 +72,9 @@ static int _read_reg(struct w1_slave *sl, u8 address, unsigned char* buf) ...@@ -72,10 +72,9 @@ static int _read_reg(struct w1_slave *sl, u8 address, unsigned char* buf)
return 1; return 1;
} }
static ssize_t w1_f29_read_state( static ssize_t state_read(struct file *filp, struct kobject *kobj,
struct file *filp, struct kobject *kobj, struct bin_attribute *bin_attr, char *buf, loff_t off,
struct bin_attribute *bin_attr, size_t count)
char *buf, loff_t off, size_t count)
{ {
dev_dbg(&kobj_to_w1_slave(kobj)->dev, dev_dbg(&kobj_to_w1_slave(kobj)->dev,
"Reading %s kobj: %p, off: %0#10x, count: %zu, buff addr: %p", "Reading %s kobj: %p, off: %0#10x, count: %zu, buff addr: %p",
...@@ -85,10 +84,9 @@ static ssize_t w1_f29_read_state( ...@@ -85,10 +84,9 @@ static ssize_t w1_f29_read_state(
return _read_reg(kobj_to_w1_slave(kobj), W1_F29_REG_LOGIG_STATE, buf); return _read_reg(kobj_to_w1_slave(kobj), W1_F29_REG_LOGIG_STATE, buf);
} }
static ssize_t w1_f29_read_output( static ssize_t output_read(struct file *filp, struct kobject *kobj,
struct file *filp, struct kobject *kobj, struct bin_attribute *bin_attr, char *buf,
struct bin_attribute *bin_attr, loff_t off, size_t count)
char *buf, loff_t off, size_t count)
{ {
dev_dbg(&kobj_to_w1_slave(kobj)->dev, dev_dbg(&kobj_to_w1_slave(kobj)->dev,
"Reading %s kobj: %p, off: %0#10x, count: %zu, buff addr: %p", "Reading %s kobj: %p, off: %0#10x, count: %zu, buff addr: %p",
...@@ -99,10 +97,9 @@ static ssize_t w1_f29_read_output( ...@@ -99,10 +97,9 @@ static ssize_t w1_f29_read_output(
W1_F29_REG_OUTPUT_LATCH_STATE, buf); W1_F29_REG_OUTPUT_LATCH_STATE, buf);
} }
static ssize_t w1_f29_read_activity( static ssize_t activity_read(struct file *filp, struct kobject *kobj,
struct file *filp, struct kobject *kobj, struct bin_attribute *bin_attr, char *buf,
struct bin_attribute *bin_attr, loff_t off, size_t count)
char *buf, loff_t off, size_t count)
{ {
dev_dbg(&kobj_to_w1_slave(kobj)->dev, dev_dbg(&kobj_to_w1_slave(kobj)->dev,
"Reading %s kobj: %p, off: %0#10x, count: %zu, buff addr: %p", "Reading %s kobj: %p, off: %0#10x, count: %zu, buff addr: %p",
...@@ -113,10 +110,9 @@ static ssize_t w1_f29_read_activity( ...@@ -113,10 +110,9 @@ static ssize_t w1_f29_read_activity(
W1_F29_REG_ACTIVITY_LATCH_STATE, buf); W1_F29_REG_ACTIVITY_LATCH_STATE, buf);
} }
static ssize_t w1_f29_read_cond_search_mask( static ssize_t cond_search_mask_read(struct file *filp, struct kobject *kobj,
struct file *filp, struct kobject *kobj, struct bin_attribute *bin_attr, char *buf,
struct bin_attribute *bin_attr, loff_t off, size_t count)
char *buf, loff_t off, size_t count)
{ {
dev_dbg(&kobj_to_w1_slave(kobj)->dev, dev_dbg(&kobj_to_w1_slave(kobj)->dev,
"Reading %s kobj: %p, off: %0#10x, count: %zu, buff addr: %p", "Reading %s kobj: %p, off: %0#10x, count: %zu, buff addr: %p",
...@@ -127,10 +123,10 @@ static ssize_t w1_f29_read_cond_search_mask( ...@@ -127,10 +123,10 @@ static ssize_t w1_f29_read_cond_search_mask(
W1_F29_REG_COND_SEARCH_SELECT_MASK, buf); W1_F29_REG_COND_SEARCH_SELECT_MASK, buf);
} }
static ssize_t w1_f29_read_cond_search_polarity( static ssize_t cond_search_polarity_read(struct file *filp,
struct file *filp, struct kobject *kobj, struct kobject *kobj,
struct bin_attribute *bin_attr, struct bin_attribute *bin_attr,
char *buf, loff_t off, size_t count) char *buf, loff_t off, size_t count)
{ {
if (count != 1 || off != 0) if (count != 1 || off != 0)
return -EFAULT; return -EFAULT;
...@@ -138,10 +134,9 @@ static ssize_t w1_f29_read_cond_search_polarity( ...@@ -138,10 +134,9 @@ static ssize_t w1_f29_read_cond_search_polarity(
W1_F29_REG_COND_SEARCH_POL_SELECT, buf); W1_F29_REG_COND_SEARCH_POL_SELECT, buf);
} }
static ssize_t w1_f29_read_status_control( static ssize_t status_control_read(struct file *filp, struct kobject *kobj,
struct file *filp, struct kobject *kobj, struct bin_attribute *bin_attr, char *buf,
struct bin_attribute *bin_attr, loff_t off, size_t count)
char *buf, loff_t off, size_t count)
{ {
if (count != 1 || off != 0) if (count != 1 || off != 0)
return -EFAULT; return -EFAULT;
...@@ -149,13 +144,9 @@ static ssize_t w1_f29_read_status_control( ...@@ -149,13 +144,9 @@ static ssize_t w1_f29_read_status_control(
W1_F29_REG_CONTROL_AND_STATUS, buf); W1_F29_REG_CONTROL_AND_STATUS, buf);
} }
static ssize_t output_write(struct file *filp, struct kobject *kobj,
struct bin_attribute *bin_attr, char *buf,
loff_t off, size_t count)
static ssize_t w1_f29_write_output(
struct file *filp, struct kobject *kobj,
struct bin_attribute *bin_attr,
char *buf, loff_t off, size_t count)
{ {
struct w1_slave *sl = kobj_to_w1_slave(kobj); struct w1_slave *sl = kobj_to_w1_slave(kobj);
u8 w1_buf[3]; u8 w1_buf[3];
...@@ -224,10 +215,9 @@ static ssize_t w1_f29_write_output( ...@@ -224,10 +215,9 @@ static ssize_t w1_f29_write_output(
/** /**
* Writing to the activity file resets the activity latches. * Writing to the activity file resets the activity latches.
*/ */
static ssize_t w1_f29_write_activity( static ssize_t activity_write(struct file *filp, struct kobject *kobj,
struct file *filp, struct kobject *kobj, struct bin_attribute *bin_attr, char *buf,
struct bin_attribute *bin_attr, loff_t off, size_t count)
char *buf, loff_t off, size_t count)
{ {
struct w1_slave *sl = kobj_to_w1_slave(kobj); struct w1_slave *sl = kobj_to_w1_slave(kobj);
unsigned int retries = W1_F29_RETRIES; unsigned int retries = W1_F29_RETRIES;
...@@ -255,13 +245,9 @@ static ssize_t w1_f29_write_activity( ...@@ -255,13 +245,9 @@ static ssize_t w1_f29_write_activity(
return -EIO; return -EIO;
} }
static ssize_t w1_f29_write_status_control( static ssize_t status_control_write(struct file *filp, struct kobject *kobj,
struct file *filp, struct bin_attribute *bin_attr, char *buf,
struct kobject *kobj, loff_t off, size_t count)
struct bin_attribute *bin_attr,
char *buf,
loff_t off,
size_t count)
{ {
struct w1_slave *sl = kobj_to_w1_slave(kobj); struct w1_slave *sl = kobj_to_w1_slave(kobj);
u8 w1_buf[4]; u8 w1_buf[4];
...@@ -330,91 +316,35 @@ static int w1_f29_disable_test_mode(struct w1_slave *sl) ...@@ -330,91 +316,35 @@ static int w1_f29_disable_test_mode(struct w1_slave *sl)
return res; return res;
} }
static struct bin_attribute w1_f29_sysfs_bin_files[] = { static BIN_ATTR_RO(state, 1);
{ static BIN_ATTR_RW(output, 1);
.attr = { static BIN_ATTR_RW(activity, 1);
.name = "state", static BIN_ATTR_RO(cond_search_mask, 1);
.mode = S_IRUGO, static BIN_ATTR_RO(cond_search_polarity, 1);
}, static BIN_ATTR_RW(status_control, 1);
.size = 1,
.read = w1_f29_read_state, static struct bin_attribute *w1_f29_bin_attrs[] = {
}, &bin_attr_state,
{ &bin_attr_output,
.attr = { &bin_attr_activity,
.name = "output", &bin_attr_cond_search_mask,
.mode = S_IRUGO | S_IWUSR | S_IWGRP, &bin_attr_cond_search_polarity,
}, &bin_attr_status_control,
.size = 1, NULL,
.read = w1_f29_read_output,
.write = w1_f29_write_output,
},
{
.attr = {
.name = "activity",
.mode = S_IRUGO,
},
.size = 1,
.read = w1_f29_read_activity,
.write = w1_f29_write_activity,
},
{
.attr = {
.name = "cond_search_mask",
.mode = S_IRUGO,
},
.size = 1,
.read = w1_f29_read_cond_search_mask,
},
{
.attr = {
.name = "cond_search_polarity",
.mode = S_IRUGO,
},
.size = 1,
.read = w1_f29_read_cond_search_polarity,
},
{
.attr = {
.name = "status_control",
.mode = S_IRUGO | S_IWUSR | S_IWGRP,
},
.size = 1,
.read = w1_f29_read_status_control,
.write = w1_f29_write_status_control,
}
}; };
static int w1_f29_add_slave(struct w1_slave *sl) static const struct attribute_group w1_f29_group = {
{ .bin_attrs = w1_f29_bin_attrs,
int err = 0; };
int i;
err = w1_f29_disable_test_mode(sl);
if (err)
return err;
for (i = 0; i < ARRAY_SIZE(w1_f29_sysfs_bin_files) && !err; ++i)
err = sysfs_create_bin_file(
&sl->dev.kobj,
&(w1_f29_sysfs_bin_files[i]));
if (err)
while (--i >= 0)
sysfs_remove_bin_file(&sl->dev.kobj,
&(w1_f29_sysfs_bin_files[i]));
return err;
}
static void w1_f29_remove_slave(struct w1_slave *sl) static const struct attribute_group *w1_f29_groups[] = {
{ &w1_f29_group,
int i; NULL,
for (i = ARRAY_SIZE(w1_f29_sysfs_bin_files) - 1; i >= 0; --i) };
sysfs_remove_bin_file(&sl->dev.kobj,
&(w1_f29_sysfs_bin_files[i]));
}
static struct w1_family_ops w1_f29_fops = { static struct w1_family_ops w1_f29_fops = {
.add_slave = w1_f29_add_slave, .add_slave = w1_f29_disable_test_mode,
.remove_slave = w1_f29_remove_slave, .groups = w1_f29_groups,
}; };
static struct w1_family w1_family_29 = { static struct w1_family w1_family_29 = {
......
...@@ -30,10 +30,9 @@ MODULE_ALIAS("w1-family-" __stringify(W1_FAMILY_DS2413)); ...@@ -30,10 +30,9 @@ MODULE_ALIAS("w1-family-" __stringify(W1_FAMILY_DS2413));
#define W1_F3A_FUNC_PIO_ACCESS_WRITE 0x5A #define W1_F3A_FUNC_PIO_ACCESS_WRITE 0x5A
#define W1_F3A_SUCCESS_CONFIRM_BYTE 0xAA #define W1_F3A_SUCCESS_CONFIRM_BYTE 0xAA
static ssize_t w1_f3a_read_state( static ssize_t state_read(struct file *filp, struct kobject *kobj,
struct file *filp, struct kobject *kobj, struct bin_attribute *bin_attr, char *buf, loff_t off,
struct bin_attribute *bin_attr, size_t count)
char *buf, loff_t off, size_t count)
{ {
struct w1_slave *sl = kobj_to_w1_slave(kobj); struct w1_slave *sl = kobj_to_w1_slave(kobj);
dev_dbg(&sl->dev, dev_dbg(&sl->dev,
...@@ -66,10 +65,11 @@ static ssize_t w1_f3a_read_state( ...@@ -66,10 +65,11 @@ static ssize_t w1_f3a_read_state(
return 1; return 1;
} }
static ssize_t w1_f3a_write_output( static BIN_ATTR_RO(state, 1);
struct file *filp, struct kobject *kobj,
struct bin_attribute *bin_attr, static ssize_t output_write(struct file *filp, struct kobject *kobj,
char *buf, loff_t off, size_t count) struct bin_attribute *bin_attr, char *buf,
loff_t off, size_t count)
{ {
struct w1_slave *sl = kobj_to_w1_slave(kobj); struct w1_slave *sl = kobj_to_w1_slave(kobj);
u8 w1_buf[3]; u8 w1_buf[3];
...@@ -110,53 +110,25 @@ static ssize_t w1_f3a_write_output( ...@@ -110,53 +110,25 @@ static ssize_t w1_f3a_write_output(
return -EIO; return -EIO;
} }
#define NB_SYSFS_BIN_FILES 2 static BIN_ATTR(output, S_IRUGO | S_IWUSR | S_IWGRP, NULL, output_write, 1);
static struct bin_attribute w1_f3a_sysfs_bin_files[NB_SYSFS_BIN_FILES] = {
{ static struct bin_attribute *w1_f3a_bin_attrs[] = {
.attr = { &bin_attr_state,
.name = "state", &bin_attr_output,
.mode = S_IRUGO, NULL,
},
.size = 1,
.read = w1_f3a_read_state,
},
{
.attr = {
.name = "output",
.mode = S_IRUGO | S_IWUSR | S_IWGRP,
},
.size = 1,
.write = w1_f3a_write_output,
}
}; };
static int w1_f3a_add_slave(struct w1_slave *sl) static const struct attribute_group w1_f3a_group = {
{ .bin_attrs = w1_f3a_bin_attrs,
int err = 0; };
int i;
for (i = 0; i < NB_SYSFS_BIN_FILES && !err; ++i)
err = sysfs_create_bin_file(
&sl->dev.kobj,
&(w1_f3a_sysfs_bin_files[i]));
if (err)
while (--i >= 0)
sysfs_remove_bin_file(&sl->dev.kobj,
&(w1_f3a_sysfs_bin_files[i]));
return err;
}
static void w1_f3a_remove_slave(struct w1_slave *sl) static const struct attribute_group *w1_f3a_groups[] = {
{ &w1_f3a_group,
int i; NULL,
for (i = NB_SYSFS_BIN_FILES - 1; i >= 0; --i) };
sysfs_remove_bin_file(&sl->dev.kobj,
&(w1_f3a_sysfs_bin_files[i]));
}
static struct w1_family_ops w1_f3a_fops = { static struct w1_family_ops w1_f3a_fops = {
.add_slave = w1_f3a_add_slave, .groups = w1_f3a_groups,
.remove_slave = w1_f3a_remove_slave,
}; };
static struct w1_family w1_family_3a = { static struct w1_family w1_family_3a = {
......
...@@ -40,14 +40,8 @@ ...@@ -40,14 +40,8 @@
#define COUNTER_COUNT 4 #define COUNTER_COUNT 4
#define READ_BYTE_COUNT 42 #define READ_BYTE_COUNT 42
static ssize_t w1_counter_read(struct device *device, static ssize_t w1_slave_show(struct device *device,
struct device_attribute *attr, char *buf); struct device_attribute *attr, char *out_buf)
static struct device_attribute w1_counter_attr =
__ATTR(w1_slave, S_IRUGO, w1_counter_read, NULL);
static ssize_t w1_counter_read(struct device *device,
struct device_attribute *attr, char *out_buf)
{ {
struct w1_slave *sl = dev_to_w1_slave(device); struct w1_slave *sl = dev_to_w1_slave(device);
struct w1_master *dev = sl->master; struct w1_master *dev = sl->master;
...@@ -128,19 +122,16 @@ static ssize_t w1_counter_read(struct device *device, ...@@ -128,19 +122,16 @@ static ssize_t w1_counter_read(struct device *device,
return PAGE_SIZE - c; return PAGE_SIZE - c;
} }
static int w1_f1d_add_slave(struct w1_slave *sl) static DEVICE_ATTR_RO(w1_slave);
{
return device_create_file(&sl->dev, &w1_counter_attr);
}
static void w1_f1d_remove_slave(struct w1_slave *sl) static struct attribute *w1_f1d_attrs[] = {
{ &dev_attr_w1_slave.attr,
device_remove_file(&sl->dev, &w1_counter_attr); NULL,
} };
ATTRIBUTE_GROUPS(w1_f1d);
static struct w1_family_ops w1_f1d_fops = { static struct w1_family_ops w1_f1d_fops = {
.add_slave = w1_f1d_add_slave, .groups = w1_f1d_groups,
.remove_slave = w1_f1d_remove_slave,
}; };
static struct w1_family w1_family_1d = { static struct w1_family w1_family_1d = {
......
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
...@@ -59,25 +59,19 @@ static int w1_strong_pullup = 1; ...@@ -59,25 +59,19 @@ static int w1_strong_pullup = 1;
module_param_named(strong_pullup, w1_strong_pullup, int, 0); module_param_named(strong_pullup, w1_strong_pullup, int, 0);
static ssize_t w1_therm_read(struct device *device, static ssize_t w1_slave_show(struct device *device,
struct device_attribute *attr, char *buf); struct device_attribute *attr, char *buf);
static struct device_attribute w1_therm_attr = static DEVICE_ATTR_RO(w1_slave);
__ATTR(w1_slave, S_IRUGO, w1_therm_read, NULL);
static int w1_therm_add_slave(struct w1_slave *sl) static struct attribute *w1_therm_attrs[] = {
{ &dev_attr_w1_slave.attr,
return device_create_file(&sl->dev, &w1_therm_attr); NULL,
} };
ATTRIBUTE_GROUPS(w1_therm);
static void w1_therm_remove_slave(struct w1_slave *sl)
{
device_remove_file(&sl->dev, &w1_therm_attr);
}
static struct w1_family_ops w1_therm_fops = { static struct w1_family_ops w1_therm_fops = {
.add_slave = w1_therm_add_slave, .groups = w1_therm_groups,
.remove_slave = w1_therm_remove_slave,
}; };
static struct w1_family w1_therm_family_DS18S20 = { static struct w1_family w1_therm_family_DS18S20 = {
...@@ -178,7 +172,7 @@ static inline int w1_convert_temp(u8 rom[9], u8 fid) ...@@ -178,7 +172,7 @@ static inline int w1_convert_temp(u8 rom[9], u8 fid)
} }
static ssize_t w1_therm_read(struct device *device, static ssize_t w1_slave_show(struct device *device,
struct device_attribute *attr, char *buf) struct device_attribute *attr, char *buf)
{ {
struct w1_slave *sl = dev_to_w1_slave(device); struct w1_slave *sl = dev_to_w1_slave(device);
......
此差异已折叠。
...@@ -52,6 +52,7 @@ struct w1_family_ops ...@@ -52,6 +52,7 @@ struct w1_family_ops
{ {
int (* add_slave)(struct w1_slave *); int (* add_slave)(struct w1_slave *);
void (* remove_slave)(struct w1_slave *); void (* remove_slave)(struct w1_slave *);
const struct attribute_group **groups;
}; };
struct w1_family struct w1_family
......
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
...@@ -64,7 +64,7 @@ static int sysfs_fill_super(struct super_block *sb, void *data, int silent) ...@@ -64,7 +64,7 @@ static int sysfs_fill_super(struct super_block *sb, void *data, int silent)
/* instantiate and link root dentry */ /* instantiate and link root dentry */
root = d_make_root(inode); root = d_make_root(inode);
if (!root) { if (!root) {
pr_debug("%s: could not get root dentry!\n",__func__); pr_debug("%s: could not get root dentry!\n", __func__);
return -ENOMEM; return -ENOMEM;
} }
root->d_fsdata = &sysfs_root; root->d_fsdata = &sysfs_root;
......
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册