2006-03-26 13:38:33 +04:00
/*
* Stuff used by all variants of the driver
*
2006-04-11 09:55:14 +04:00
* Copyright ( c ) 2001 by Stefan Eilers ,
2006-03-26 13:38:33 +04:00
* Hansjoerg Lipp < hjlipp @ web . de > ,
* Tilman Schmidt < tilman @ imap . cc > .
*
* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation ; either version 2 of
* the License , or ( at your option ) any later version .
* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
*/
# include "gigaset.h"
2006-08-08 09:19:37 +04:00
static ssize_t show_cidmode ( struct device * dev ,
struct device_attribute * attr , char * buf )
2006-03-26 13:38:33 +04:00
{
2006-08-08 09:19:37 +04:00
struct cardstate * cs = dev_get_drvdata ( dev ) ;
2006-04-11 09:55:16 +04:00
2007-10-16 12:27:50 +04:00
return sprintf ( buf , " %u \n " , cs - > cidmode ) ;
2006-03-26 13:38:33 +04:00
}
2006-08-08 09:19:37 +04:00
static ssize_t set_cidmode ( struct device * dev , struct device_attribute * attr ,
2006-04-11 09:55:00 +04:00
const char * buf , size_t count )
2006-03-26 13:38:33 +04:00
{
2006-08-08 09:19:37 +04:00
struct cardstate * cs = dev_get_drvdata ( dev ) ;
2006-03-26 13:38:33 +04:00
long int value ;
char * end ;
value = simple_strtol ( buf , & end , 0 ) ;
while ( * end )
if ( ! isspace ( * end + + ) )
return - EINVAL ;
if ( value < 0 | | value > 1 )
2012-02-20 07:52:38 +04:00
return - EINVAL ;
2006-03-26 13:38:33 +04:00
2006-04-11 09:55:12 +04:00
if ( mutex_lock_interruptible ( & cs - > mutex ) )
2009-10-25 12:30:17 +03:00
return - ERESTARTSYS ;
2006-03-26 13:38:33 +04:00
cs - > waiting = 1 ;
if ( ! gigaset_add_event ( cs , & cs - > at_state , EV_PROC_CIDMODE ,
2006-04-11 09:55:04 +04:00
NULL , value , NULL ) ) {
2006-03-26 13:38:33 +04:00
cs - > waiting = 0 ;
2006-04-11 09:55:12 +04:00
mutex_unlock ( & cs - > mutex ) ;
2006-03-26 13:38:33 +04:00
return - ENOMEM ;
}
gigaset_schedule_event ( cs ) ;
wait_event ( cs - > waitqueue , ! cs - > waiting ) ;
2006-04-11 09:55:12 +04:00
mutex_unlock ( & cs - > mutex ) ;
2006-03-26 13:38:33 +04:00
return count ;
}
2012-02-20 07:52:38 +04:00
static DEVICE_ATTR ( cidmode , S_IRUGO | S_IWUSR , show_cidmode , set_cidmode ) ;
2006-03-26 13:38:33 +04:00
/* free sysfs for device */
2006-04-11 09:55:07 +04:00
void gigaset_free_dev_sysfs ( struct cardstate * cs )
2006-03-26 13:38:33 +04:00
{
2006-08-08 09:19:37 +04:00
if ( ! cs - > tty_dev )
2006-04-22 20:43:00 +04:00
return ;
2006-04-11 09:55:04 +04:00
gig_dbg ( DEBUG_INIT , " removing sysfs entries " ) ;
2006-08-08 09:19:37 +04:00
device_remove_file ( cs - > tty_dev , & dev_attr_cidmode ) ;
2006-03-26 13:38:33 +04:00
}
/* initialize sysfs for device */
2006-04-11 09:55:07 +04:00
void gigaset_init_dev_sysfs ( struct cardstate * cs )
2006-03-26 13:38:33 +04:00
{
2006-08-08 09:19:37 +04:00
if ( ! cs - > tty_dev )
2006-04-22 20:43:00 +04:00
return ;
2006-04-11 09:55:04 +04:00
gig_dbg ( DEBUG_INIT , " setting up sysfs " ) ;
2006-08-08 09:19:37 +04:00
if ( device_create_file ( cs - > tty_dev , & dev_attr_cidmode ) )
2009-05-13 16:44:17 +04:00
pr_err ( " could not create sysfs attribute \n " ) ;
2006-03-26 13:38:33 +04:00
}