1b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoney#include <linux/kernel.h> 2b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoney#include <linux/stat.h> 3b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoney#include <asm/macio.h> 4b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoney 5b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoney 6b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoney#define macio_config_of_attr(field, format_string) \ 7b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoneystatic ssize_t \ 8b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoneyfield##_show (struct device *dev, struct device_attribute *attr, \ 9b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoney char *buf) \ 10b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoney{ \ 11b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoney struct macio_dev *mdev = to_macio_device (dev); \ 1261c7a080a5a061c976988fd4b844dfb468dda255Grant Likely return sprintf (buf, format_string, mdev->ofdev.dev.of_node->field); \ 13b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoney} 14b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoney 15b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoneystatic ssize_t 16b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoneycompatible_show (struct device *dev, struct device_attribute *attr, char *buf) 17b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoney{ 182dc11581376829303b98eadb2de253bee065a56aGrant Likely struct platform_device *of; 19018a3d1db7cdb6127656c1622ee1d2302e16436dJeremy Kerr const char *compat; 20b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoney int cplen; 21b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoney int length = 0; 22b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoney 23b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoney of = &to_macio_device (dev)->ofdev; 2461c7a080a5a061c976988fd4b844dfb468dda255Grant Likely compat = of_get_property(of->dev.of_node, "compatible", &cplen); 25b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoney if (!compat) { 26b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoney *buf = '\0'; 27b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoney return 0; 28b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoney } 29b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoney while (cplen > 0) { 30b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoney int l; 31b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoney length += sprintf (buf, "%s\n", compat); 32b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoney buf += length; 33b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoney l = strlen (compat) + 1; 34b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoney compat += l; 35b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoney cplen -= l; 36b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoney } 37b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoney 38b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoney return length; 39b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoney} 40b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoney 41dcb34abb4d9bae0588c5c11101ed6afcee71f895scwhab@suse.destatic ssize_t modalias_show (struct device *dev, struct device_attribute *attr, 42dcb34abb4d9bae0588c5c11101ed6afcee71f895scwhab@suse.de char *buf) 43dcb34abb4d9bae0588c5c11101ed6afcee71f895scwhab@suse.de{ 4434a1c1e8c700f7cd849deb21193718a172722f8dGrant Likely int len = of_device_get_modalias(dev, buf, PAGE_SIZE - 2); 45dcb34abb4d9bae0588c5c11101ed6afcee71f895scwhab@suse.de 4629aa0289b895a0ad1641a90f94638c277f9cf8ecSylvain Munaut buf[len] = '\n'; 4729aa0289b895a0ad1641a90f94638c277f9cf8ecSylvain Munaut buf[len+1] = 0; 4829aa0289b895a0ad1641a90f94638c277f9cf8ecSylvain Munaut 4929aa0289b895a0ad1641a90f94638c277f9cf8ecSylvain Munaut return len+1; 50dcb34abb4d9bae0588c5c11101ed6afcee71f895scwhab@suse.de} 51dcb34abb4d9bae0588c5c11101ed6afcee71f895scwhab@suse.de 52140b932f8cb6cced10b96860651a198b1b89cbb9Olaf Heringstatic ssize_t devspec_show(struct device *dev, 53140b932f8cb6cced10b96860651a198b1b89cbb9Olaf Hering struct device_attribute *attr, char *buf) 54140b932f8cb6cced10b96860651a198b1b89cbb9Olaf Hering{ 552dc11581376829303b98eadb2de253bee065a56aGrant Likely struct platform_device *ofdev; 56140b932f8cb6cced10b96860651a198b1b89cbb9Olaf Hering 572dc11581376829303b98eadb2de253bee065a56aGrant Likely ofdev = to_platform_device(dev); 5861c7a080a5a061c976988fd4b844dfb468dda255Grant Likely return sprintf(buf, "%s\n", ofdev->dev.of_node->full_name); 59140b932f8cb6cced10b96860651a198b1b89cbb9Olaf Hering} 60140b932f8cb6cced10b96860651a198b1b89cbb9Olaf Hering 61b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoneymacio_config_of_attr (name, "%s\n"); 62b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoneymacio_config_of_attr (type, "%s\n"); 63b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoney 64b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoneystruct device_attribute macio_dev_attrs[] = { 65b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoney __ATTR_RO(name), 66b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoney __ATTR_RO(type), 67b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoney __ATTR_RO(compatible), 68dcb34abb4d9bae0588c5c11101ed6afcee71f895scwhab@suse.de __ATTR_RO(modalias), 69140b932f8cb6cced10b96860651a198b1b89cbb9Olaf Hering __ATTR_RO(devspec), 70b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoney __ATTR_NULL 71b5bf5b6786ccfc9e0c8801291f463d92c8e0b423Jeff Mahoney}; 72