2874c5fd28
Based on 1 normalized pattern(s): 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 extracted by the scancode license scanner the SPDX license identifier GPL-2.0-or-later has been chosen to replace the boilerplate/reference in 3029 file(s). Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Reviewed-by: Allison Randal <allison@lohutok.net> Cc: linux-spdx@vger.kernel.org Link: https://lkml.kernel.org/r/20190527070032.746973796@linutronix.de Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
78 lines
1.8 KiB
C
78 lines
1.8 KiB
C
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
/*
|
|
* Stuff used by all variants of the driver
|
|
*
|
|
* Copyright (c) 2001 by Stefan Eilers,
|
|
* Hansjoerg Lipp <hjlipp@web.de>,
|
|
* Tilman Schmidt <tilman@imap.cc>.
|
|
*
|
|
* =====================================================================
|
|
* =====================================================================
|
|
*/
|
|
|
|
#include "gigaset.h"
|
|
|
|
static ssize_t show_cidmode(struct device *dev,
|
|
struct device_attribute *attr, char *buf)
|
|
{
|
|
struct cardstate *cs = dev_get_drvdata(dev);
|
|
|
|
return sprintf(buf, "%u\n", cs->cidmode);
|
|
}
|
|
|
|
static ssize_t set_cidmode(struct device *dev, struct device_attribute *attr,
|
|
const char *buf, size_t count)
|
|
{
|
|
struct cardstate *cs = dev_get_drvdata(dev);
|
|
long int value;
|
|
char *end;
|
|
|
|
value = simple_strtol(buf, &end, 0);
|
|
while (*end)
|
|
if (!isspace(*end++))
|
|
return -EINVAL;
|
|
if (value < 0 || value > 1)
|
|
return -EINVAL;
|
|
|
|
if (mutex_lock_interruptible(&cs->mutex))
|
|
return -ERESTARTSYS;
|
|
|
|
cs->waiting = 1;
|
|
if (!gigaset_add_event(cs, &cs->at_state, EV_PROC_CIDMODE,
|
|
NULL, value, NULL)) {
|
|
cs->waiting = 0;
|
|
mutex_unlock(&cs->mutex);
|
|
return -ENOMEM;
|
|
}
|
|
gigaset_schedule_event(cs);
|
|
|
|
wait_event(cs->waitqueue, !cs->waiting);
|
|
|
|
mutex_unlock(&cs->mutex);
|
|
|
|
return count;
|
|
}
|
|
|
|
static DEVICE_ATTR(cidmode, S_IRUGO | S_IWUSR, show_cidmode, set_cidmode);
|
|
|
|
/* free sysfs for device */
|
|
void gigaset_free_dev_sysfs(struct cardstate *cs)
|
|
{
|
|
if (!cs->tty_dev)
|
|
return;
|
|
|
|
gig_dbg(DEBUG_INIT, "removing sysfs entries");
|
|
device_remove_file(cs->tty_dev, &dev_attr_cidmode);
|
|
}
|
|
|
|
/* initialize sysfs for device */
|
|
void gigaset_init_dev_sysfs(struct cardstate *cs)
|
|
{
|
|
if (!cs->tty_dev)
|
|
return;
|
|
|
|
gig_dbg(DEBUG_INIT, "setting up sysfs");
|
|
if (device_create_file(cs->tty_dev, &dev_attr_cidmode))
|
|
pr_err("could not create sysfs attribute\n");
|
|
}
|