@ -28,44 +28,22 @@
# include <video/omapdss.h>
# include "dss.h"
static struct omap_dss_device * to_dss_device_sysfs ( struct device * dev )
static ssize_t display_name_show ( struct omap_dss_device * dssdev , char * buf )
{
struct omap_dss_device * dssdev = NULL ;
for_each_dss_dev ( dssdev ) {
if ( dssdev - > dev = = dev ) {
omap_dss_put_device ( dssdev ) ;
return dssdev ;
}
}
return NULL ;
}
static ssize_t display_name_show ( struct device * dev ,
struct device_attribute * attr , char * buf )
{
struct omap_dss_device * dssdev = to_dss_device_sysfs ( dev ) ;
return snprintf ( buf , PAGE_SIZE , " %s \n " ,
dssdev - > name ?
dssdev - > name : " " ) ;
}
static ssize_t display_enabled_show ( struct device * dev ,
struct device_attribute * attr , char * buf )
static ssize_t display_enabled_show ( struct omap_dss_device * dssdev , char * buf )
{
struct omap_dss_device * dssdev = to_dss_device_sysfs ( dev ) ;
return snprintf ( buf , PAGE_SIZE , " %d \n " ,
omapdss_device_is_enabled ( dssdev ) ) ;
}
static ssize_t display_enabled_store ( struct device * dev ,
struct device_attribute * attr ,
static ssize_t display_enabled_store ( struct omap_dss_device * dssdev ,
const char * buf , size_t size )
{
struct omap_dss_device * dssdev = to_dss_device_sysfs ( dev ) ;
int r ;
bool enable ;
@ -90,19 +68,16 @@ static ssize_t display_enabled_store(struct device *dev,
return size ;
}
static ssize_t display_tear_show ( struct device * dev ,
struct device_attribute * attr , char * buf )
static ssize_t display_tear_show ( struct omap_dss_device * dssdev , char * buf )
{
struct omap_dss_device * dssdev = to_dss_device_sysfs ( dev ) ;
return snprintf ( buf , PAGE_SIZE , " %d \n " ,
dssdev - > driver - > get_te ?
dssdev - > driver - > get_te ( dssdev ) : 0 ) ;
}
static ssize_t display_tear_store ( struct device * dev ,
struct device_attribute * attr , const char * buf , size_t size )
static ssize_t display_tear_store ( struct omap_dss_ device * dss dev,
const char * buf , size_t size )
{
struct omap_dss_device * dssdev = to_dss_device_sysfs ( dev ) ;
int r ;
bool te ;
@ -120,10 +95,8 @@ static ssize_t display_tear_store(struct device *dev,
return size ;
}
static ssize_t display_timings_show ( struct device * dev ,
struct device_attribute * attr , char * buf )
static ssize_t display_timings_show ( struct omap_dss_device * dssdev , char * buf )
{
struct omap_dss_device * dssdev = to_dss_device_sysfs ( dev ) ;
struct omap_video_timings t ;
if ( ! dssdev - > driver - > get_timings )
@ -137,10 +110,9 @@ static ssize_t display_timings_show(struct device *dev,
t . y_res , t . vfp , t . vbp , t . vsw ) ;
}
static ssize_t display_timings_store ( struct device * dev ,
struct device_attribute * attr , const char * buf , size_t size )
static ssize_t display_timings_store ( struct omap_dss_ device * dss dev,
const char * buf , size_t size )
{
struct omap_dss_device * dssdev = to_dss_device_sysfs ( dev ) ;
struct omap_video_timings t = dssdev - > panel . timings ;
int r , found ;
@ -176,10 +148,8 @@ static ssize_t display_timings_store(struct device *dev,
return size ;
}
static ssize_t display_rotate_show ( struct device * dev ,
struct device_attribute * attr , char * buf )
static ssize_t display_rotate_show ( struct omap_dss_device * dssdev , char * buf )
{
struct omap_dss_device * dssdev = to_dss_device_sysfs ( dev ) ;
int rotate ;
if ( ! dssdev - > driver - > get_rotate )
return - ENOENT ;
@ -187,10 +157,9 @@ static ssize_t display_rotate_show(struct device *dev,
return snprintf ( buf , PAGE_SIZE , " %u \n " , rotate ) ;
}
static ssize_t display_rotate_store ( struct device * dev ,
struct device_attribute * attr , const char * buf , size_t size )
static ssize_t display_rotate_store ( struct omap_dss_ device * dss dev,
const char * buf , size_t size )
{
struct omap_dss_device * dssdev = to_dss_device_sysfs ( dev ) ;
int rot , r ;
if ( ! dssdev - > driver - > set_rotate | | ! dssdev - > driver - > get_rotate )
@ -207,10 +176,8 @@ static ssize_t display_rotate_store(struct device *dev,
return size ;
}
static ssize_t display_mirror_show ( struct device * dev ,
struct device_attribute * attr , char * buf )
static ssize_t display_mirror_show ( struct omap_dss_device * dssdev , char * buf )
{
struct omap_dss_device * dssdev = to_dss_device_sysfs ( dev ) ;
int mirror ;
if ( ! dssdev - > driver - > get_mirror )
return - ENOENT ;
@ -218,10 +185,9 @@ static ssize_t display_mirror_show(struct device *dev,
return snprintf ( buf , PAGE_SIZE , " %u \n " , mirror ) ;
}
static ssize_t display_mirror_store ( struct device * dev ,
struct device_attribute * attr , const char * buf , size_t size )
static ssize_t display_mirror_store ( struct omap_dss_ device * dss dev,
const char * buf , size_t size )
{
struct omap_dss_device * dssdev = to_dss_device_sysfs ( dev ) ;
int r ;
bool mirror ;
@ -239,10 +205,8 @@ static ssize_t display_mirror_store(struct device *dev,
return size ;
}
static ssize_t display_wss_show ( struct device * dev ,
struct device_attribute * attr , char * buf )
static ssize_t display_wss_show ( struct omap_dss_device * dssdev , char * buf )
{
struct omap_dss_device * dssdev = to_dss_device_sysfs ( dev ) ;
unsigned int wss ;
if ( ! dssdev - > driver - > get_wss )
@ -253,10 +217,9 @@ static ssize_t display_wss_show(struct device *dev,
return snprintf ( buf , PAGE_SIZE , " 0x%05x \n " , wss ) ;
}
static ssize_t display_wss_store ( struct device * dev ,
struct device_attribute * attr , const char * buf , size_t size )
static ssize_t display_wss_store ( struct omap_dss_ device * dss dev,
const char * buf , size_t size )
{
struct omap_dss_device * dssdev = to_dss_device_sysfs ( dev ) ;
u32 wss ;
int r ;
@ -277,50 +240,94 @@ static ssize_t display_wss_store(struct device *dev,
return size ;
}
static DEVICE_ATTR ( display_name , S_IRUGO , display_name_show , NULL ) ;
static DEVICE_ATTR ( enabled , S_IRUGO | S_IWUSR ,
struct display_attribute {
struct attribute attr ;
ssize_t ( * show ) ( struct omap_dss_device * , char * ) ;
ssize_t ( * store ) ( struct omap_dss_device * , const char * , size_t ) ;
} ;
# define DISPLAY_ATTR(_name, _mode, _show, _store) \
struct display_attribute display_attr_ # # _name = \
__ATTR ( _name , _mode , _show , _store )
static DISPLAY_ATTR ( name , S_IRUGO , display_name_show , NULL ) ;
static DISPLAY_ATTR ( display_name , S_IRUGO , display_name_show , NULL ) ;
static DISPLAY_ATTR ( enabled , S_IRUGO | S_IWUSR ,
display_enabled_show , display_enabled_store ) ;
static DEVICE_ATTR ( tear_elim , S_IRUGO | S_IWUSR ,
static DISPLAY _ATTR ( tear_elim , S_IRUGO | S_IWUSR ,
display_tear_show , display_tear_store ) ;
static DEVICE_ATTR ( timings , S_IRUGO | S_IWUSR ,
static DISPLAY _ATTR ( timings , S_IRUGO | S_IWUSR ,
display_timings_show , display_timings_store ) ;
static DEVICE_ATTR ( rotate , S_IRUGO | S_IWUSR ,
static DISPLAY _ATTR ( rotate , S_IRUGO | S_IWUSR ,
display_rotate_show , display_rotate_store ) ;
static DEVICE_ATTR ( mirror , S_IRUGO | S_IWUSR ,
static DISPLAY _ATTR ( mirror , S_IRUGO | S_IWUSR ,
display_mirror_show , display_mirror_store ) ;
static DEVICE_ATTR ( wss , S_IRUGO | S_IWUSR ,
static DISPLAY _ATTR ( wss , S_IRUGO | S_IWUSR ,
display_wss_show , display_wss_store ) ;
static const struct attribute * display_sysfs_attrs [ ] = {
& dev_attr_display_name . attr ,
& dev_attr_enabled . attr ,
& dev_attr_tear_elim . attr ,
& dev_attr_timings . attr ,
& dev_attr_rotate . attr ,
& dev_attr_mirror . attr ,
& dev_attr_wss . attr ,
static struct attribute * display_sysfs_attrs [ ] = {
& display_attr_name . attr ,
& display_attr_display_name . attr ,
& display_attr_enabled . attr ,
& display_attr_tear_elim . attr ,
& display_attr_timings . attr ,
& display_attr_rotate . attr ,
& display_attr_mirror . attr ,
& display_attr_wss . attr ,
NULL
} ;
static ssize_t display_attr_show ( struct kobject * kobj , struct attribute * attr ,
char * buf )
{
struct omap_dss_device * dssdev ;
struct display_attribute * display_attr ;
dssdev = container_of ( kobj , struct omap_dss_device , kobj ) ;
display_attr = container_of ( attr , struct display_attribute , attr ) ;
if ( ! display_attr - > show )
return - ENOENT ;
return display_attr - > show ( dssdev , buf ) ;
}
static ssize_t display_attr_store ( struct kobject * kobj , struct attribute * attr ,
const char * buf , size_t size )
{
struct omap_dss_device * dssdev ;
struct display_attribute * display_attr ;
dssdev = container_of ( kobj , struct omap_dss_device , kobj ) ;
display_attr = container_of ( attr , struct display_attribute , attr ) ;
if ( ! display_attr - > store )
return - ENOENT ;
return display_attr - > store ( dssdev , buf , size ) ;
}
static const struct sysfs_ops display_sysfs_ops = {
. show = display_attr_show ,
. store = display_attr_store ,
} ;
static struct kobj_type display_ktype = {
. sysfs_ops = & display_sysfs_ops ,
. default_attrs = display_sysfs_attrs ,
} ;
int display_init_sysfs ( struct platform_device * pdev )
{
struct omap_dss_device * dssdev = NULL ;
int r ;
for_each_dss_dev ( dssdev ) {
struct kobject * kobj = & dssdev - > dev - > kobj ;
r = sysfs_create_files ( kobj , display_sysfs_attrs ) ;
r = kobject_init_and_add ( & dssdev - > kobj , & display_ktype ,
& pdev - > dev . kobj , dssdev - > alias ) ;
if ( r ) {
DSSERR ( " failed to create sysfs files \n " ) ;
goto err ;
}
r = sysfs_create_link ( & pdev - > dev . kobj , kobj , dssdev - > alias ) ;
if ( r ) {
sysfs_remove_files ( kobj , display_sysfs_attrs ) ;
DSSERR ( " failed to create sysfs display link \n " ) ;
omap_dss_put_device ( dssdev ) ;
goto err ;
}
}
@ -338,8 +345,12 @@ void display_uninit_sysfs(struct platform_device *pdev)
struct omap_dss_device * dssdev = NULL ;
for_each_dss_dev ( dssdev ) {
sysfs_remove_link ( & pdev - > dev . kobj , dssdev - > alias ) ;
sysfs_remove_files ( & dssdev - > dev - > kobj ,
display_sysfs_attrs ) ;
if ( kobject_name ( & dssdev - > kobj ) = = NULL )
continue ;
kobject_del ( & dssdev - > kobj ) ;
kobject_put ( & dssdev - > kobj ) ;
memset ( & dssdev - > kobj , 0 , sizeof ( dssdev - > kobj ) ) ;
}
}