blob: 290bf6e226acfa3d1ab1b7b2759cc24ce21e5ea2 [file] [log] [blame]
Lidza Louina0b99d582013-08-01 17:00:20 -04001/*
2 * Copyright 2004 Digi International (www.digi.com)
3 * Scott H Kilau <Scott_Kilau at digi dot com>
Lidza Louina7a97deb2013-08-21 11:08:08 -04004 *
Lidza Louina0b99d582013-08-01 17:00:20 -04005 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2, or (at your option)
8 * any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY, EXPRESS OR IMPLIED; without even the
Lidza Louina7a97deb2013-08-21 11:08:08 -040012 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
Lidza Louina0b99d582013-08-01 17:00:20 -040013 * PURPOSE. See the GNU General Public License for more details.
Lidza Louina0b99d582013-08-01 17:00:20 -040014 */
15
Lidza Louina0b99d582013-08-01 17:00:20 -040016#include <linux/kernel.h>
Lidza Louina0b99d582013-08-01 17:00:20 -040017#include <linux/module.h>
18#include <linux/ctype.h>
19#include <linux/string.h>
20#include <linux/serial_reg.h>
21#include <linux/device.h>
22#include <linux/pci.h>
23#include <linux/kdev_t.h>
Lidza Louina7a97deb2013-08-21 11:08:08 -040024
Lidza Louina0b99d582013-08-01 17:00:20 -040025#include "dgnc_driver.h"
Lidza Louina0b99d582013-08-01 17:00:20 -040026#include "dgnc_mgmt.h"
27
Matias Mucciolo0c8de4c2016-09-09 12:42:33 -030028static ssize_t version_show(struct device_driver *ddp, char *buf)
Lidza Louina0b99d582013-08-01 17:00:20 -040029{
30 return snprintf(buf, PAGE_SIZE, "%s\n", DG_PART);
31}
Matias Mucciolo0c8de4c2016-09-09 12:42:33 -030032static DRIVER_ATTR_RO(version);
Lidza Louina0b99d582013-08-01 17:00:20 -040033
Matias Mucciolo0c8de4c2016-09-09 12:42:33 -030034static ssize_t boards_show(struct device_driver *ddp, char *buf)
Lidza Louina0b99d582013-08-01 17:00:20 -040035{
Daeseok Youn80e3e242016-03-23 20:54:36 +090036 return snprintf(buf, PAGE_SIZE, "%d\n", dgnc_num_boards);
Lidza Louina0b99d582013-08-01 17:00:20 -040037}
Matias Mucciolo0c8de4c2016-09-09 12:42:33 -030038static DRIVER_ATTR_RO(boards);
Lidza Louina0b99d582013-08-01 17:00:20 -040039
Matias Mucciolo0c8de4c2016-09-09 12:42:33 -030040static ssize_t maxboards_show(struct device_driver *ddp, char *buf)
Lidza Louina0b99d582013-08-01 17:00:20 -040041{
42 return snprintf(buf, PAGE_SIZE, "%d\n", MAXBOARDS);
43}
Matias Mucciolo0c8de4c2016-09-09 12:42:33 -030044static DRIVER_ATTR_RO(maxboards);
Lidza Louina0b99d582013-08-01 17:00:20 -040045
Matias Mucciolo0c8de4c2016-09-09 12:42:33 -030046static ssize_t pollrate_show(struct device_driver *ddp, char *buf)
Lidza Louina0b99d582013-08-01 17:00:20 -040047{
48 return snprintf(buf, PAGE_SIZE, "%dms\n", dgnc_poll_tick);
49}
50
Matias Mucciolo0c8de4c2016-09-09 12:42:33 -030051static ssize_t pollrate_store(struct device_driver *ddp,
52 const char *buf, size_t count)
Lidza Louina0b99d582013-08-01 17:00:20 -040053{
Salah Triki51abf45c2015-10-04 02:49:48 +010054 unsigned long flags;
55 int tick;
Roberta Dobrescufb33aa42014-09-20 00:01:39 +030056 int ret;
57
Salah Triki51abf45c2015-10-04 02:49:48 +010058 ret = sscanf(buf, "%d\n", &tick);
Roberta Dobrescufb33aa42014-09-20 00:01:39 +030059 if (ret != 1)
60 return -EINVAL;
Salah Triki51abf45c2015-10-04 02:49:48 +010061
62 spin_lock_irqsave(&dgnc_poll_lock, flags);
63 dgnc_poll_tick = tick;
64 spin_unlock_irqrestore(&dgnc_poll_lock, flags);
65
Lidza Louina0b99d582013-08-01 17:00:20 -040066 return count;
67}
Matias Mucciolo0c8de4c2016-09-09 12:42:33 -030068static DRIVER_ATTR_RW(pollrate);
Lidza Louina0b99d582013-08-01 17:00:20 -040069
Lidza Louina0b99d582013-08-01 17:00:20 -040070void dgnc_create_driver_sysfiles(struct pci_driver *dgnc_driver)
71{
72 int rc = 0;
73 struct device_driver *driverfs = &dgnc_driver->driver;
74
75 rc |= driver_create_file(driverfs, &driver_attr_version);
76 rc |= driver_create_file(driverfs, &driver_attr_boards);
77 rc |= driver_create_file(driverfs, &driver_attr_maxboards);
Lidza Louina0b99d582013-08-01 17:00:20 -040078 rc |= driver_create_file(driverfs, &driver_attr_pollrate);
Gulsah Kose77b55d82014-09-21 22:56:15 +030079 if (rc)
Ioana Ciorneic471c982015-03-31 02:29:35 +030080 pr_err("DGNC: sysfs driver_create_file failed!\n");
Lidza Louina0b99d582013-08-01 17:00:20 -040081}
82
Lidza Louina0b99d582013-08-01 17:00:20 -040083void dgnc_remove_driver_sysfiles(struct pci_driver *dgnc_driver)
84{
85 struct device_driver *driverfs = &dgnc_driver->driver;
Gulsah Kosee8756d42014-09-20 19:31:15 +030086
Lidza Louina0b99d582013-08-01 17:00:20 -040087 driver_remove_file(driverfs, &driver_attr_version);
88 driver_remove_file(driverfs, &driver_attr_boards);
89 driver_remove_file(driverfs, &driver_attr_maxboards);
Lidza Louina0b99d582013-08-01 17:00:20 -040090 driver_remove_file(driverfs, &driver_attr_pollrate);
Lidza Louina0b99d582013-08-01 17:00:20 -040091}
92
Jeremiah Mahler635c4ef2014-07-12 18:26:39 -070093#define DGNC_VERIFY_BOARD(p, bd) \
94 do { \
95 if (!p) \
96 return 0; \
97 \
98 bd = dev_get_drvdata(p); \
99 if (!bd || bd->magic != DGNC_BOARD_MAGIC) \
100 return 0; \
101 if (bd->state != BOARD_READY) \
102 return 0; \
103 } while (0)
Lidza Louina0b99d582013-08-01 17:00:20 -0400104
Matias Mucciolo0c8de4c2016-09-09 12:42:33 -0300105static ssize_t vpd_show(struct device *p, struct device_attribute *attr,
106 char *buf)
Lidza Louina0b99d582013-08-01 17:00:20 -0400107{
Lidza Louina03425f52013-09-09 15:01:22 -0400108 struct dgnc_board *bd;
Lidza Louina0b99d582013-08-01 17:00:20 -0400109 int count = 0;
110 int i = 0;
111
112 DGNC_VERIFY_BOARD(p, bd);
113
Wim de With8ad524f2015-05-20 14:27:39 +0200114 count += sprintf(buf + count,
115 "\n 0 1 2 3 4 5 6 7 8 9 A B C D E F");
Lidza Louina0b99d582013-08-01 17:00:20 -0400116 for (i = 0; i < 0x40 * 2; i++) {
117 if (!(i % 16))
118 count += sprintf(buf + count, "\n%04X ", i * 2);
119 count += sprintf(buf + count, "%02X ", bd->vpd[i]);
120 }
121 count += sprintf(buf + count, "\n");
122
123 return count;
124}
Matias Mucciolo0c8de4c2016-09-09 12:42:33 -0300125static DEVICE_ATTR_RO(vpd);
Lidza Louina0b99d582013-08-01 17:00:20 -0400126
Matias Mucciolo0c8de4c2016-09-09 12:42:33 -0300127static ssize_t serial_number_show(struct device *p,
128 struct device_attribute *attr, char *buf)
Lidza Louina0b99d582013-08-01 17:00:20 -0400129{
Lidza Louina03425f52013-09-09 15:01:22 -0400130 struct dgnc_board *bd;
Lidza Louina0b99d582013-08-01 17:00:20 -0400131 int count = 0;
132
133 DGNC_VERIFY_BOARD(p, bd);
134
135 if (bd->serial_num[0] == '\0')
136 count += sprintf(buf + count, "<UNKNOWN>\n");
137 else
138 count += sprintf(buf + count, "%s\n", bd->serial_num);
139
140 return count;
141}
Matias Mucciolo0c8de4c2016-09-09 12:42:33 -0300142static DEVICE_ATTR_RO(serial_number);
Lidza Louina0b99d582013-08-01 17:00:20 -0400143
Matias Mucciolo0c8de4c2016-09-09 12:42:33 -0300144static ssize_t ports_state_show(struct device *p,
145 struct device_attribute *attr, char *buf)
Lidza Louina0b99d582013-08-01 17:00:20 -0400146{
Lidza Louina03425f52013-09-09 15:01:22 -0400147 struct dgnc_board *bd;
Lidza Louina0b99d582013-08-01 17:00:20 -0400148 int count = 0;
149 int i = 0;
150
151 DGNC_VERIFY_BOARD(p, bd);
152
153 for (i = 0; i < bd->nasync; i++) {
154 count += snprintf(buf + count, PAGE_SIZE - count,
155 "%d %s\n", bd->channels[i]->ch_portnum,
156 bd->channels[i]->ch_open_count ? "Open" : "Closed");
157 }
158 return count;
159}
Matias Mucciolo0c8de4c2016-09-09 12:42:33 -0300160static DEVICE_ATTR_RO(ports_state);
Lidza Louina0b99d582013-08-01 17:00:20 -0400161
Matias Mucciolo0c8de4c2016-09-09 12:42:33 -0300162static ssize_t ports_baud_show(struct device *p,
163 struct device_attribute *attr, char *buf)
Lidza Louina0b99d582013-08-01 17:00:20 -0400164{
Lidza Louina03425f52013-09-09 15:01:22 -0400165 struct dgnc_board *bd;
Lidza Louina0b99d582013-08-01 17:00:20 -0400166 int count = 0;
167 int i = 0;
168
169 DGNC_VERIFY_BOARD(p, bd);
170
171 for (i = 0; i < bd->nasync; i++) {
172 count += snprintf(buf + count, PAGE_SIZE - count,
Wim de With8ad524f2015-05-20 14:27:39 +0200173 "%d %d\n", bd->channels[i]->ch_portnum,
174 bd->channels[i]->ch_old_baud);
Lidza Louina0b99d582013-08-01 17:00:20 -0400175 }
176 return count;
177}
Matias Mucciolo0c8de4c2016-09-09 12:42:33 -0300178static DEVICE_ATTR_RO(ports_baud);
Lidza Louina0b99d582013-08-01 17:00:20 -0400179
Matias Mucciolo0c8de4c2016-09-09 12:42:33 -0300180static ssize_t ports_msignals_show(struct device *p,
181 struct device_attribute *attr, char *buf)
Lidza Louina0b99d582013-08-01 17:00:20 -0400182{
Lidza Louina03425f52013-09-09 15:01:22 -0400183 struct dgnc_board *bd;
Lidza Louina0b99d582013-08-01 17:00:20 -0400184 int count = 0;
185 int i = 0;
186
187 DGNC_VERIFY_BOARD(p, bd);
188
189 for (i = 0; i < bd->nasync; i++) {
Daeseok Younedd19a22016-05-09 11:46:50 +0900190 struct channel_t *ch = bd->channels[i];
191
192 if (ch->ch_open_count) {
Lidza Louina0b99d582013-08-01 17:00:20 -0400193 count += snprintf(buf + count, PAGE_SIZE - count,
Wim de With8ad524f2015-05-20 14:27:39 +0200194 "%d %s %s %s %s %s %s\n",
Daeseok Younedd19a22016-05-09 11:46:50 +0900195 ch->ch_portnum,
196 (ch->ch_mostat & UART_MCR_RTS) ? "RTS" : "",
197 (ch->ch_mistat & UART_MSR_CTS) ? "CTS" : "",
198 (ch->ch_mostat & UART_MCR_DTR) ? "DTR" : "",
199 (ch->ch_mistat & UART_MSR_DSR) ? "DSR" : "",
200 (ch->ch_mistat & UART_MSR_DCD) ? "DCD" : "",
201 (ch->ch_mistat & UART_MSR_RI) ? "RI" : "");
Lidza Louina0b99d582013-08-01 17:00:20 -0400202 } else {
203 count += snprintf(buf + count, PAGE_SIZE - count,
Daeseok Younedd19a22016-05-09 11:46:50 +0900204 "%d\n", ch->ch_portnum);
Lidza Louina0b99d582013-08-01 17:00:20 -0400205 }
206 }
207 return count;
208}
Matias Mucciolo0c8de4c2016-09-09 12:42:33 -0300209static DEVICE_ATTR_RO(ports_msignals);
Lidza Louina0b99d582013-08-01 17:00:20 -0400210
Matias Mucciolo0c8de4c2016-09-09 12:42:33 -0300211static ssize_t ports_iflag_show(struct device *p,
212 struct device_attribute *attr, char *buf)
Lidza Louina0b99d582013-08-01 17:00:20 -0400213{
Lidza Louina03425f52013-09-09 15:01:22 -0400214 struct dgnc_board *bd;
Lidza Louina0b99d582013-08-01 17:00:20 -0400215 int count = 0;
216 int i = 0;
217
218 DGNC_VERIFY_BOARD(p, bd);
219
220 for (i = 0; i < bd->nasync; i++) {
221 count += snprintf(buf + count, PAGE_SIZE - count, "%d %x\n",
Wim de With8ad524f2015-05-20 14:27:39 +0200222 bd->channels[i]->ch_portnum,
223 bd->channels[i]->ch_c_iflag);
Lidza Louina0b99d582013-08-01 17:00:20 -0400224 }
225 return count;
226}
Matias Mucciolo0c8de4c2016-09-09 12:42:33 -0300227static DEVICE_ATTR_RO(ports_iflag);
Lidza Louina0b99d582013-08-01 17:00:20 -0400228
Matias Mucciolo0c8de4c2016-09-09 12:42:33 -0300229static ssize_t ports_cflag_show(struct device *p,
230 struct device_attribute *attr, char *buf)
Lidza Louina0b99d582013-08-01 17:00:20 -0400231{
Lidza Louina03425f52013-09-09 15:01:22 -0400232 struct dgnc_board *bd;
Lidza Louina0b99d582013-08-01 17:00:20 -0400233 int count = 0;
234 int i = 0;
235
236 DGNC_VERIFY_BOARD(p, bd);
237
238 for (i = 0; i < bd->nasync; i++) {
239 count += snprintf(buf + count, PAGE_SIZE - count, "%d %x\n",
Wim de With8ad524f2015-05-20 14:27:39 +0200240 bd->channels[i]->ch_portnum,
241 bd->channels[i]->ch_c_cflag);
Lidza Louina0b99d582013-08-01 17:00:20 -0400242 }
243 return count;
244}
Matias Mucciolo0c8de4c2016-09-09 12:42:33 -0300245static DEVICE_ATTR_RO(ports_cflag);
Lidza Louina0b99d582013-08-01 17:00:20 -0400246
Matias Mucciolo0c8de4c2016-09-09 12:42:33 -0300247static ssize_t ports_oflag_show(struct device *p,
248 struct device_attribute *attr, char *buf)
Lidza Louina0b99d582013-08-01 17:00:20 -0400249{
Lidza Louina03425f52013-09-09 15:01:22 -0400250 struct dgnc_board *bd;
Lidza Louina0b99d582013-08-01 17:00:20 -0400251 int count = 0;
252 int i = 0;
253
254 DGNC_VERIFY_BOARD(p, bd);
255
256 for (i = 0; i < bd->nasync; i++) {
257 count += snprintf(buf + count, PAGE_SIZE - count, "%d %x\n",
Wim de With8ad524f2015-05-20 14:27:39 +0200258 bd->channels[i]->ch_portnum,
259 bd->channels[i]->ch_c_oflag);
Lidza Louina0b99d582013-08-01 17:00:20 -0400260 }
261 return count;
262}
Matias Mucciolo0c8de4c2016-09-09 12:42:33 -0300263static DEVICE_ATTR_RO(ports_oflag);
Lidza Louina0b99d582013-08-01 17:00:20 -0400264
Matias Mucciolo0c8de4c2016-09-09 12:42:33 -0300265static ssize_t ports_lflag_show(struct device *p,
266 struct device_attribute *attr, char *buf)
Lidza Louina0b99d582013-08-01 17:00:20 -0400267{
Lidza Louina03425f52013-09-09 15:01:22 -0400268 struct dgnc_board *bd;
Lidza Louina0b99d582013-08-01 17:00:20 -0400269 int count = 0;
270 int i = 0;
271
272 DGNC_VERIFY_BOARD(p, bd);
273
274 for (i = 0; i < bd->nasync; i++) {
275 count += snprintf(buf + count, PAGE_SIZE - count, "%d %x\n",
Wim de With8ad524f2015-05-20 14:27:39 +0200276 bd->channels[i]->ch_portnum,
277 bd->channels[i]->ch_c_lflag);
Lidza Louina0b99d582013-08-01 17:00:20 -0400278 }
279 return count;
280}
Matias Mucciolo0c8de4c2016-09-09 12:42:33 -0300281static DEVICE_ATTR_RO(ports_lflag);
Lidza Louina0b99d582013-08-01 17:00:20 -0400282
Matias Mucciolo0c8de4c2016-09-09 12:42:33 -0300283static ssize_t ports_digi_flag_show(struct device *p,
284 struct device_attribute *attr, char *buf)
Lidza Louina0b99d582013-08-01 17:00:20 -0400285{
Lidza Louina03425f52013-09-09 15:01:22 -0400286 struct dgnc_board *bd;
Lidza Louina0b99d582013-08-01 17:00:20 -0400287 int count = 0;
288 int i = 0;
289
290 DGNC_VERIFY_BOARD(p, bd);
291
292 for (i = 0; i < bd->nasync; i++) {
293 count += snprintf(buf + count, PAGE_SIZE - count, "%d %x\n",
Wim de With8ad524f2015-05-20 14:27:39 +0200294 bd->channels[i]->ch_portnum,
295 bd->channels[i]->ch_digi.digi_flags);
Lidza Louina0b99d582013-08-01 17:00:20 -0400296 }
297 return count;
298}
Matias Mucciolo0c8de4c2016-09-09 12:42:33 -0300299static DEVICE_ATTR_RO(ports_digi_flag);
Lidza Louina0b99d582013-08-01 17:00:20 -0400300
Matias Mucciolo0c8de4c2016-09-09 12:42:33 -0300301static ssize_t ports_rxcount_show(struct device *p,
302 struct device_attribute *attr, char *buf)
Lidza Louina0b99d582013-08-01 17:00:20 -0400303{
Lidza Louina03425f52013-09-09 15:01:22 -0400304 struct dgnc_board *bd;
Lidza Louina0b99d582013-08-01 17:00:20 -0400305 int count = 0;
306 int i = 0;
307
308 DGNC_VERIFY_BOARD(p, bd);
309
310 for (i = 0; i < bd->nasync; i++) {
311 count += snprintf(buf + count, PAGE_SIZE - count, "%d %ld\n",
Wim de With8ad524f2015-05-20 14:27:39 +0200312 bd->channels[i]->ch_portnum,
313 bd->channels[i]->ch_rxcount);
Lidza Louina0b99d582013-08-01 17:00:20 -0400314 }
315 return count;
316}
Matias Mucciolo0c8de4c2016-09-09 12:42:33 -0300317static DEVICE_ATTR_RO(ports_rxcount);
Lidza Louina0b99d582013-08-01 17:00:20 -0400318
Matias Mucciolo0c8de4c2016-09-09 12:42:33 -0300319static ssize_t ports_txcount_show(struct device *p,
320 struct device_attribute *attr, char *buf)
Lidza Louina0b99d582013-08-01 17:00:20 -0400321{
Lidza Louina03425f52013-09-09 15:01:22 -0400322 struct dgnc_board *bd;
Lidza Louina0b99d582013-08-01 17:00:20 -0400323 int count = 0;
324 int i = 0;
325
326 DGNC_VERIFY_BOARD(p, bd);
327
328 for (i = 0; i < bd->nasync; i++) {
329 count += snprintf(buf + count, PAGE_SIZE - count, "%d %ld\n",
Wim de With8ad524f2015-05-20 14:27:39 +0200330 bd->channels[i]->ch_portnum,
331 bd->channels[i]->ch_txcount);
Lidza Louina0b99d582013-08-01 17:00:20 -0400332 }
333 return count;
334}
Matias Mucciolo0c8de4c2016-09-09 12:42:33 -0300335static DEVICE_ATTR_RO(ports_txcount);
Lidza Louina0b99d582013-08-01 17:00:20 -0400336
Lidza Louina0b99d582013-08-01 17:00:20 -0400337/* this function creates the sys files that will export each signal status
338 * to sysfs each value will be put in a separate filename
339 */
Lidza Louina03425f52013-09-09 15:01:22 -0400340void dgnc_create_ports_sysfiles(struct dgnc_board *bd)
Lidza Louina0b99d582013-08-01 17:00:20 -0400341{
342 int rc = 0;
343
344 dev_set_drvdata(&bd->pdev->dev, bd);
Sudip Mukherjee7df227c2015-10-04 19:50:15 +0530345 rc |= device_create_file(&bd->pdev->dev, &dev_attr_ports_state);
346 rc |= device_create_file(&bd->pdev->dev, &dev_attr_ports_baud);
347 rc |= device_create_file(&bd->pdev->dev, &dev_attr_ports_msignals);
348 rc |= device_create_file(&bd->pdev->dev, &dev_attr_ports_iflag);
349 rc |= device_create_file(&bd->pdev->dev, &dev_attr_ports_cflag);
350 rc |= device_create_file(&bd->pdev->dev, &dev_attr_ports_oflag);
351 rc |= device_create_file(&bd->pdev->dev, &dev_attr_ports_lflag);
352 rc |= device_create_file(&bd->pdev->dev, &dev_attr_ports_digi_flag);
353 rc |= device_create_file(&bd->pdev->dev, &dev_attr_ports_rxcount);
354 rc |= device_create_file(&bd->pdev->dev, &dev_attr_ports_txcount);
355 rc |= device_create_file(&bd->pdev->dev, &dev_attr_vpd);
356 rc |= device_create_file(&bd->pdev->dev, &dev_attr_serial_number);
Gulsah Kose77b55d82014-09-21 22:56:15 +0300357 if (rc)
Cristina Opriceanac28645e2015-02-27 14:10:36 +0200358 dev_err(&bd->pdev->dev, "dgnc: sysfs device_create_file failed!\n");
Lidza Louina0b99d582013-08-01 17:00:20 -0400359}
360
Lidza Louina0b99d582013-08-01 17:00:20 -0400361/* removes all the sys files created for that port */
Lidza Louina03425f52013-09-09 15:01:22 -0400362void dgnc_remove_ports_sysfiles(struct dgnc_board *bd)
Lidza Louina0b99d582013-08-01 17:00:20 -0400363{
Sudip Mukherjee7df227c2015-10-04 19:50:15 +0530364 device_remove_file(&bd->pdev->dev, &dev_attr_ports_state);
365 device_remove_file(&bd->pdev->dev, &dev_attr_ports_baud);
366 device_remove_file(&bd->pdev->dev, &dev_attr_ports_msignals);
367 device_remove_file(&bd->pdev->dev, &dev_attr_ports_iflag);
368 device_remove_file(&bd->pdev->dev, &dev_attr_ports_cflag);
369 device_remove_file(&bd->pdev->dev, &dev_attr_ports_oflag);
370 device_remove_file(&bd->pdev->dev, &dev_attr_ports_lflag);
371 device_remove_file(&bd->pdev->dev, &dev_attr_ports_digi_flag);
372 device_remove_file(&bd->pdev->dev, &dev_attr_ports_rxcount);
373 device_remove_file(&bd->pdev->dev, &dev_attr_ports_txcount);
374 device_remove_file(&bd->pdev->dev, &dev_attr_vpd);
375 device_remove_file(&bd->pdev->dev, &dev_attr_serial_number);
Lidza Louina0b99d582013-08-01 17:00:20 -0400376}
377
Matias Mucciolo0c8de4c2016-09-09 12:42:33 -0300378static ssize_t tty_state_show(struct device *d,
379 struct device_attribute *attr, char *buf)
Lidza Louina0b99d582013-08-01 17:00:20 -0400380{
Lidza Louina03425f52013-09-09 15:01:22 -0400381 struct dgnc_board *bd;
Lidza Louina0b99d582013-08-01 17:00:20 -0400382 struct channel_t *ch;
383 struct un_t *un;
384
385 if (!d)
Lidza Louina8f90ef82013-09-09 15:01:23 -0400386 return 0;
Jingoo Han0e4f66b2013-09-26 08:35:49 +0900387 un = dev_get_drvdata(d);
Lidza Louina0b99d582013-08-01 17:00:20 -0400388 if (!un || un->magic != DGNC_UNIT_MAGIC)
Lidza Louina8f90ef82013-09-09 15:01:23 -0400389 return 0;
Lidza Louina0b99d582013-08-01 17:00:20 -0400390 ch = un->un_ch;
391 if (!ch || ch->magic != DGNC_CHANNEL_MAGIC)
Lidza Louina8f90ef82013-09-09 15:01:23 -0400392 return 0;
Lidza Louina0b99d582013-08-01 17:00:20 -0400393 bd = ch->ch_bd;
394 if (!bd || bd->magic != DGNC_BOARD_MAGIC)
Lidza Louina8f90ef82013-09-09 15:01:23 -0400395 return 0;
Lidza Louina0b99d582013-08-01 17:00:20 -0400396 if (bd->state != BOARD_READY)
Lidza Louina8f90ef82013-09-09 15:01:23 -0400397 return 0;
Lidza Louina0b99d582013-08-01 17:00:20 -0400398
Wim de With8ad524f2015-05-20 14:27:39 +0200399 return snprintf(buf, PAGE_SIZE, "%s",
400 un->un_open_count ? "Open" : "Closed");
Lidza Louina0b99d582013-08-01 17:00:20 -0400401}
Matias Mucciolo0c8de4c2016-09-09 12:42:33 -0300402static DEVICE_ATTR_RO(tty_state);
Lidza Louina0b99d582013-08-01 17:00:20 -0400403
Matias Mucciolo0c8de4c2016-09-09 12:42:33 -0300404static ssize_t tty_baud_show(struct device *d,
405 struct device_attribute *attr, char *buf)
Lidza Louina0b99d582013-08-01 17:00:20 -0400406{
Lidza Louina03425f52013-09-09 15:01:22 -0400407 struct dgnc_board *bd;
Lidza Louina0b99d582013-08-01 17:00:20 -0400408 struct channel_t *ch;
409 struct un_t *un;
410
411 if (!d)
Lidza Louina8f90ef82013-09-09 15:01:23 -0400412 return 0;
Jingoo Han0e4f66b2013-09-26 08:35:49 +0900413 un = dev_get_drvdata(d);
Lidza Louina0b99d582013-08-01 17:00:20 -0400414 if (!un || un->magic != DGNC_UNIT_MAGIC)
Lidza Louina8f90ef82013-09-09 15:01:23 -0400415 return 0;
Lidza Louina0b99d582013-08-01 17:00:20 -0400416 ch = un->un_ch;
417 if (!ch || ch->magic != DGNC_CHANNEL_MAGIC)
Lidza Louina8f90ef82013-09-09 15:01:23 -0400418 return 0;
Lidza Louina0b99d582013-08-01 17:00:20 -0400419 bd = ch->ch_bd;
420 if (!bd || bd->magic != DGNC_BOARD_MAGIC)
Lidza Louina8f90ef82013-09-09 15:01:23 -0400421 return 0;
Lidza Louina0b99d582013-08-01 17:00:20 -0400422 if (bd->state != BOARD_READY)
Lidza Louina8f90ef82013-09-09 15:01:23 -0400423 return 0;
Lidza Louina0b99d582013-08-01 17:00:20 -0400424
425 return snprintf(buf, PAGE_SIZE, "%d\n", ch->ch_old_baud);
426}
Matias Mucciolo0c8de4c2016-09-09 12:42:33 -0300427static DEVICE_ATTR_RO(tty_baud);
Lidza Louina0b99d582013-08-01 17:00:20 -0400428
Matias Mucciolo0c8de4c2016-09-09 12:42:33 -0300429static ssize_t tty_msignals_show(struct device *d,
430 struct device_attribute *attr, char *buf)
Lidza Louina0b99d582013-08-01 17:00:20 -0400431{
Lidza Louina03425f52013-09-09 15:01:22 -0400432 struct dgnc_board *bd;
Lidza Louina0b99d582013-08-01 17:00:20 -0400433 struct channel_t *ch;
434 struct un_t *un;
435
436 if (!d)
Lidza Louina8f90ef82013-09-09 15:01:23 -0400437 return 0;
Jingoo Han0e4f66b2013-09-26 08:35:49 +0900438 un = dev_get_drvdata(d);
Lidza Louina0b99d582013-08-01 17:00:20 -0400439 if (!un || un->magic != DGNC_UNIT_MAGIC)
Lidza Louina8f90ef82013-09-09 15:01:23 -0400440 return 0;
Lidza Louina0b99d582013-08-01 17:00:20 -0400441 ch = un->un_ch;
442 if (!ch || ch->magic != DGNC_CHANNEL_MAGIC)
Lidza Louina8f90ef82013-09-09 15:01:23 -0400443 return 0;
Lidza Louina0b99d582013-08-01 17:00:20 -0400444 bd = ch->ch_bd;
445 if (!bd || bd->magic != DGNC_BOARD_MAGIC)
Lidza Louina8f90ef82013-09-09 15:01:23 -0400446 return 0;
Lidza Louina0b99d582013-08-01 17:00:20 -0400447 if (bd->state != BOARD_READY)
Lidza Louina8f90ef82013-09-09 15:01:23 -0400448 return 0;
Lidza Louina0b99d582013-08-01 17:00:20 -0400449
450 if (ch->ch_open_count) {
451 return snprintf(buf, PAGE_SIZE, "%s %s %s %s %s %s\n",
452 (ch->ch_mostat & UART_MCR_RTS) ? "RTS" : "",
453 (ch->ch_mistat & UART_MSR_CTS) ? "CTS" : "",
454 (ch->ch_mostat & UART_MCR_DTR) ? "DTR" : "",
455 (ch->ch_mistat & UART_MSR_DSR) ? "DSR" : "",
456 (ch->ch_mistat & UART_MSR_DCD) ? "DCD" : "",
457 (ch->ch_mistat & UART_MSR_RI) ? "RI" : "");
458 }
459 return 0;
460}
Matias Mucciolo0c8de4c2016-09-09 12:42:33 -0300461static DEVICE_ATTR_RO(tty_msignals);
Lidza Louina0b99d582013-08-01 17:00:20 -0400462
Matias Mucciolo0c8de4c2016-09-09 12:42:33 -0300463static ssize_t tty_iflag_show(struct device *d,
464 struct device_attribute *attr, char *buf)
Lidza Louina0b99d582013-08-01 17:00:20 -0400465{
Lidza Louina03425f52013-09-09 15:01:22 -0400466 struct dgnc_board *bd;
Lidza Louina0b99d582013-08-01 17:00:20 -0400467 struct channel_t *ch;
468 struct un_t *un;
469
470 if (!d)
Lidza Louina8f90ef82013-09-09 15:01:23 -0400471 return 0;
Jingoo Han0e4f66b2013-09-26 08:35:49 +0900472 un = dev_get_drvdata(d);
Lidza Louina0b99d582013-08-01 17:00:20 -0400473 if (!un || un->magic != DGNC_UNIT_MAGIC)
Lidza Louina8f90ef82013-09-09 15:01:23 -0400474 return 0;
Lidza Louina0b99d582013-08-01 17:00:20 -0400475 ch = un->un_ch;
476 if (!ch || ch->magic != DGNC_CHANNEL_MAGIC)
Lidza Louina8f90ef82013-09-09 15:01:23 -0400477 return 0;
Lidza Louina0b99d582013-08-01 17:00:20 -0400478 bd = ch->ch_bd;
479 if (!bd || bd->magic != DGNC_BOARD_MAGIC)
Lidza Louina8f90ef82013-09-09 15:01:23 -0400480 return 0;
Lidza Louina0b99d582013-08-01 17:00:20 -0400481 if (bd->state != BOARD_READY)
Lidza Louina8f90ef82013-09-09 15:01:23 -0400482 return 0;
Lidza Louina0b99d582013-08-01 17:00:20 -0400483
484 return snprintf(buf, PAGE_SIZE, "%x\n", ch->ch_c_iflag);
485}
Matias Mucciolo0c8de4c2016-09-09 12:42:33 -0300486static DEVICE_ATTR_RO(tty_iflag);
Lidza Louina0b99d582013-08-01 17:00:20 -0400487
Matias Mucciolo0c8de4c2016-09-09 12:42:33 -0300488static ssize_t tty_cflag_show(struct device *d,
489 struct device_attribute *attr, char *buf)
Lidza Louina0b99d582013-08-01 17:00:20 -0400490{
Lidza Louina03425f52013-09-09 15:01:22 -0400491 struct dgnc_board *bd;
Lidza Louina0b99d582013-08-01 17:00:20 -0400492 struct channel_t *ch;
493 struct un_t *un;
494
495 if (!d)
Lidza Louina8f90ef82013-09-09 15:01:23 -0400496 return 0;
Jingoo Han0e4f66b2013-09-26 08:35:49 +0900497 un = dev_get_drvdata(d);
Lidza Louina0b99d582013-08-01 17:00:20 -0400498 if (!un || un->magic != DGNC_UNIT_MAGIC)
Lidza Louina8f90ef82013-09-09 15:01:23 -0400499 return 0;
Lidza Louina0b99d582013-08-01 17:00:20 -0400500 ch = un->un_ch;
501 if (!ch || ch->magic != DGNC_CHANNEL_MAGIC)
Lidza Louina8f90ef82013-09-09 15:01:23 -0400502 return 0;
Lidza Louina0b99d582013-08-01 17:00:20 -0400503 bd = ch->ch_bd;
504 if (!bd || bd->magic != DGNC_BOARD_MAGIC)
Lidza Louina8f90ef82013-09-09 15:01:23 -0400505 return 0;
Lidza Louina0b99d582013-08-01 17:00:20 -0400506 if (bd->state != BOARD_READY)
Lidza Louina8f90ef82013-09-09 15:01:23 -0400507 return 0;
Lidza Louina0b99d582013-08-01 17:00:20 -0400508
509 return snprintf(buf, PAGE_SIZE, "%x\n", ch->ch_c_cflag);
510}
Matias Mucciolo0c8de4c2016-09-09 12:42:33 -0300511static DEVICE_ATTR_RO(tty_cflag);
Lidza Louina0b99d582013-08-01 17:00:20 -0400512
Matias Mucciolo0c8de4c2016-09-09 12:42:33 -0300513static ssize_t tty_oflag_show(struct device *d,
514 struct device_attribute *attr, char *buf)
Lidza Louina0b99d582013-08-01 17:00:20 -0400515{
Lidza Louina03425f52013-09-09 15:01:22 -0400516 struct dgnc_board *bd;
Lidza Louina0b99d582013-08-01 17:00:20 -0400517 struct channel_t *ch;
518 struct un_t *un;
519
520 if (!d)
Lidza Louina8f90ef82013-09-09 15:01:23 -0400521 return 0;
Jingoo Han0e4f66b2013-09-26 08:35:49 +0900522 un = dev_get_drvdata(d);
Lidza Louina0b99d582013-08-01 17:00:20 -0400523 if (!un || un->magic != DGNC_UNIT_MAGIC)
Lidza Louina8f90ef82013-09-09 15:01:23 -0400524 return 0;
Lidza Louina0b99d582013-08-01 17:00:20 -0400525 ch = un->un_ch;
526 if (!ch || ch->magic != DGNC_CHANNEL_MAGIC)
Lidza Louina8f90ef82013-09-09 15:01:23 -0400527 return 0;
Lidza Louina0b99d582013-08-01 17:00:20 -0400528 bd = ch->ch_bd;
529 if (!bd || bd->magic != DGNC_BOARD_MAGIC)
Lidza Louina8f90ef82013-09-09 15:01:23 -0400530 return 0;
Lidza Louina0b99d582013-08-01 17:00:20 -0400531 if (bd->state != BOARD_READY)
Lidza Louina8f90ef82013-09-09 15:01:23 -0400532 return 0;
Lidza Louina0b99d582013-08-01 17:00:20 -0400533
534 return snprintf(buf, PAGE_SIZE, "%x\n", ch->ch_c_oflag);
535}
Matias Mucciolo0c8de4c2016-09-09 12:42:33 -0300536static DEVICE_ATTR_RO(tty_oflag);
Lidza Louina0b99d582013-08-01 17:00:20 -0400537
Matias Mucciolo0c8de4c2016-09-09 12:42:33 -0300538static ssize_t tty_lflag_show(struct device *d,
539 struct device_attribute *attr, char *buf)
Lidza Louina0b99d582013-08-01 17:00:20 -0400540{
Lidza Louina03425f52013-09-09 15:01:22 -0400541 struct dgnc_board *bd;
Lidza Louina0b99d582013-08-01 17:00:20 -0400542 struct channel_t *ch;
543 struct un_t *un;
544
545 if (!d)
Lidza Louina8f90ef82013-09-09 15:01:23 -0400546 return 0;
Jingoo Han0e4f66b2013-09-26 08:35:49 +0900547 un = dev_get_drvdata(d);
Lidza Louina0b99d582013-08-01 17:00:20 -0400548 if (!un || un->magic != DGNC_UNIT_MAGIC)
Lidza Louina8f90ef82013-09-09 15:01:23 -0400549 return 0;
Lidza Louina0b99d582013-08-01 17:00:20 -0400550 ch = un->un_ch;
551 if (!ch || ch->magic != DGNC_CHANNEL_MAGIC)
Lidza Louina8f90ef82013-09-09 15:01:23 -0400552 return 0;
Lidza Louina0b99d582013-08-01 17:00:20 -0400553 bd = ch->ch_bd;
554 if (!bd || bd->magic != DGNC_BOARD_MAGIC)
Lidza Louina8f90ef82013-09-09 15:01:23 -0400555 return 0;
Lidza Louina0b99d582013-08-01 17:00:20 -0400556 if (bd->state != BOARD_READY)
Lidza Louina8f90ef82013-09-09 15:01:23 -0400557 return 0;
Lidza Louina0b99d582013-08-01 17:00:20 -0400558
559 return snprintf(buf, PAGE_SIZE, "%x\n", ch->ch_c_lflag);
560}
Matias Mucciolo0c8de4c2016-09-09 12:42:33 -0300561static DEVICE_ATTR_RO(tty_lflag);
Lidza Louina0b99d582013-08-01 17:00:20 -0400562
Matias Mucciolo0c8de4c2016-09-09 12:42:33 -0300563static ssize_t tty_digi_flag_show(struct device *d,
564 struct device_attribute *attr, char *buf)
Lidza Louina0b99d582013-08-01 17:00:20 -0400565{
Lidza Louina03425f52013-09-09 15:01:22 -0400566 struct dgnc_board *bd;
Lidza Louina0b99d582013-08-01 17:00:20 -0400567 struct channel_t *ch;
568 struct un_t *un;
569
570 if (!d)
Lidza Louina8f90ef82013-09-09 15:01:23 -0400571 return 0;
Jingoo Han0e4f66b2013-09-26 08:35:49 +0900572 un = dev_get_drvdata(d);
Lidza Louina0b99d582013-08-01 17:00:20 -0400573 if (!un || un->magic != DGNC_UNIT_MAGIC)
Lidza Louina8f90ef82013-09-09 15:01:23 -0400574 return 0;
Lidza Louina0b99d582013-08-01 17:00:20 -0400575 ch = un->un_ch;
576 if (!ch || ch->magic != DGNC_CHANNEL_MAGIC)
Lidza Louina8f90ef82013-09-09 15:01:23 -0400577 return 0;
Lidza Louina0b99d582013-08-01 17:00:20 -0400578 bd = ch->ch_bd;
579 if (!bd || bd->magic != DGNC_BOARD_MAGIC)
Lidza Louina8f90ef82013-09-09 15:01:23 -0400580 return 0;
Lidza Louina0b99d582013-08-01 17:00:20 -0400581 if (bd->state != BOARD_READY)
Lidza Louina8f90ef82013-09-09 15:01:23 -0400582 return 0;
Lidza Louina0b99d582013-08-01 17:00:20 -0400583
584 return snprintf(buf, PAGE_SIZE, "%x\n", ch->ch_digi.digi_flags);
585}
Matias Mucciolo0c8de4c2016-09-09 12:42:33 -0300586static DEVICE_ATTR_RO(tty_digi_flag);
Lidza Louina0b99d582013-08-01 17:00:20 -0400587
Matias Mucciolo0c8de4c2016-09-09 12:42:33 -0300588static ssize_t tty_rxcount_show(struct device *d,
589 struct device_attribute *attr, char *buf)
Lidza Louina0b99d582013-08-01 17:00:20 -0400590{
Lidza Louina03425f52013-09-09 15:01:22 -0400591 struct dgnc_board *bd;
Lidza Louina0b99d582013-08-01 17:00:20 -0400592 struct channel_t *ch;
593 struct un_t *un;
594
595 if (!d)
Lidza Louina8f90ef82013-09-09 15:01:23 -0400596 return 0;
Jingoo Han0e4f66b2013-09-26 08:35:49 +0900597 un = dev_get_drvdata(d);
Lidza Louina0b99d582013-08-01 17:00:20 -0400598 if (!un || un->magic != DGNC_UNIT_MAGIC)
Lidza Louina8f90ef82013-09-09 15:01:23 -0400599 return 0;
Lidza Louina0b99d582013-08-01 17:00:20 -0400600 ch = un->un_ch;
601 if (!ch || ch->magic != DGNC_CHANNEL_MAGIC)
Lidza Louina8f90ef82013-09-09 15:01:23 -0400602 return 0;
Lidza Louina0b99d582013-08-01 17:00:20 -0400603 bd = ch->ch_bd;
604 if (!bd || bd->magic != DGNC_BOARD_MAGIC)
Lidza Louina8f90ef82013-09-09 15:01:23 -0400605 return 0;
Lidza Louina0b99d582013-08-01 17:00:20 -0400606 if (bd->state != BOARD_READY)
Lidza Louina8f90ef82013-09-09 15:01:23 -0400607 return 0;
Lidza Louina0b99d582013-08-01 17:00:20 -0400608
609 return snprintf(buf, PAGE_SIZE, "%ld\n", ch->ch_rxcount);
610}
Matias Mucciolo0c8de4c2016-09-09 12:42:33 -0300611static DEVICE_ATTR_RO(tty_rxcount);
Lidza Louina0b99d582013-08-01 17:00:20 -0400612
Matias Mucciolo0c8de4c2016-09-09 12:42:33 -0300613static ssize_t tty_txcount_show(struct device *d,
614 struct device_attribute *attr, char *buf)
Lidza Louina0b99d582013-08-01 17:00:20 -0400615{
Lidza Louina03425f52013-09-09 15:01:22 -0400616 struct dgnc_board *bd;
Lidza Louina0b99d582013-08-01 17:00:20 -0400617 struct channel_t *ch;
618 struct un_t *un;
619
620 if (!d)
Lidza Louina8f90ef82013-09-09 15:01:23 -0400621 return 0;
Jingoo Han0e4f66b2013-09-26 08:35:49 +0900622 un = dev_get_drvdata(d);
Lidza Louina0b99d582013-08-01 17:00:20 -0400623 if (!un || un->magic != DGNC_UNIT_MAGIC)
Lidza Louina8f90ef82013-09-09 15:01:23 -0400624 return 0;
Lidza Louina0b99d582013-08-01 17:00:20 -0400625 ch = un->un_ch;
626 if (!ch || ch->magic != DGNC_CHANNEL_MAGIC)
Lidza Louina8f90ef82013-09-09 15:01:23 -0400627 return 0;
Lidza Louina0b99d582013-08-01 17:00:20 -0400628 bd = ch->ch_bd;
629 if (!bd || bd->magic != DGNC_BOARD_MAGIC)
Lidza Louina8f90ef82013-09-09 15:01:23 -0400630 return 0;
Lidza Louina0b99d582013-08-01 17:00:20 -0400631 if (bd->state != BOARD_READY)
Lidza Louina8f90ef82013-09-09 15:01:23 -0400632 return 0;
Lidza Louina0b99d582013-08-01 17:00:20 -0400633
634 return snprintf(buf, PAGE_SIZE, "%ld\n", ch->ch_txcount);
635}
Matias Mucciolo0c8de4c2016-09-09 12:42:33 -0300636static DEVICE_ATTR_RO(tty_txcount);
Lidza Louina0b99d582013-08-01 17:00:20 -0400637
Matias Mucciolo0c8de4c2016-09-09 12:42:33 -0300638static ssize_t tty_custom_name_show(struct device *d,
639 struct device_attribute *attr, char *buf)
Lidza Louina0b99d582013-08-01 17:00:20 -0400640{
Lidza Louina03425f52013-09-09 15:01:22 -0400641 struct dgnc_board *bd;
Lidza Louina0b99d582013-08-01 17:00:20 -0400642 struct channel_t *ch;
643 struct un_t *un;
644
645 if (!d)
Lidza Louina8f90ef82013-09-09 15:01:23 -0400646 return 0;
Jingoo Han0e4f66b2013-09-26 08:35:49 +0900647 un = dev_get_drvdata(d);
Lidza Louina0b99d582013-08-01 17:00:20 -0400648 if (!un || un->magic != DGNC_UNIT_MAGIC)
Lidza Louina8f90ef82013-09-09 15:01:23 -0400649 return 0;
Lidza Louina0b99d582013-08-01 17:00:20 -0400650 ch = un->un_ch;
651 if (!ch || ch->magic != DGNC_CHANNEL_MAGIC)
Lidza Louina8f90ef82013-09-09 15:01:23 -0400652 return 0;
Lidza Louina0b99d582013-08-01 17:00:20 -0400653 bd = ch->ch_bd;
654 if (!bd || bd->magic != DGNC_BOARD_MAGIC)
Lidza Louina8f90ef82013-09-09 15:01:23 -0400655 return 0;
Lidza Louina0b99d582013-08-01 17:00:20 -0400656 if (bd->state != BOARD_READY)
Lidza Louina8f90ef82013-09-09 15:01:23 -0400657 return 0;
Lidza Louina0b99d582013-08-01 17:00:20 -0400658
659 return snprintf(buf, PAGE_SIZE, "%sn%d%c\n",
660 (un->un_type == DGNC_PRINT) ? "pr" : "tty",
661 bd->boardnum + 1, 'a' + ch->ch_portnum);
662}
Matias Mucciolo0c8de4c2016-09-09 12:42:33 -0300663static DEVICE_ATTR_RO(tty_custom_name);
Lidza Louina0b99d582013-08-01 17:00:20 -0400664
Lidza Louina0b99d582013-08-01 17:00:20 -0400665static struct attribute *dgnc_sysfs_tty_entries[] = {
Matias Mucciolo0c8de4c2016-09-09 12:42:33 -0300666 &dev_attr_tty_state.attr,
667 &dev_attr_tty_baud.attr,
668 &dev_attr_tty_msignals.attr,
669 &dev_attr_tty_iflag.attr,
670 &dev_attr_tty_cflag.attr,
671 &dev_attr_tty_oflag.attr,
672 &dev_attr_tty_lflag.attr,
673 &dev_attr_tty_digi_flag.attr,
674 &dev_attr_tty_rxcount.attr,
675 &dev_attr_tty_txcount.attr,
676 &dev_attr_tty_custom_name.attr,
Lidza Louina0b99d582013-08-01 17:00:20 -0400677 NULL
678};
679
Bhumika Goyal7b346da2016-09-29 20:18:54 +0530680static const struct attribute_group dgnc_tty_attribute_group = {
Lidza Louina0a60eb32013-08-21 13:30:10 -0400681 .name = NULL,
682 .attrs = dgnc_sysfs_tty_entries,
Lidza Louina0b99d582013-08-01 17:00:20 -0400683};
684
Lidza Louina0b99d582013-08-01 17:00:20 -0400685void dgnc_create_tty_sysfs(struct un_t *un, struct device *c)
686{
687 int ret;
688
689 ret = sysfs_create_group(&c->kobj, &dgnc_tty_attribute_group);
690 if (ret) {
Martin Kepplinger0f33ae12014-04-29 11:43:08 +0200691 dev_err(c, "dgnc: failed to create sysfs tty device attributes.\n");
Lidza Louina0b99d582013-08-01 17:00:20 -0400692 sysfs_remove_group(&c->kobj, &dgnc_tty_attribute_group);
693 return;
694 }
695
696 dev_set_drvdata(c, un);
Lidza Louina0b99d582013-08-01 17:00:20 -0400697}
698
Lidza Louina0b99d582013-08-01 17:00:20 -0400699void dgnc_remove_tty_sysfs(struct device *c)
700{
701 sysfs_remove_group(&c->kobj, &dgnc_tty_attribute_group);
702}
703