Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/drivers/misc/ti-st/st_kim.c
15111 views
1
/*
2
* Shared Transport Line discipline driver Core
3
* Init Manager module responsible for GPIO control
4
* and firmware download
5
* Copyright (C) 2009-2010 Texas Instruments
6
* Author: Pavan Savoy <[email protected]>
7
*
8
* This program is free software; you can redistribute it and/or modify
9
* it under the terms of the GNU General Public License version 2 as
10
* published by the Free Software Foundation.
11
*
12
* This program is distributed in the hope that it will be useful,
13
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
* GNU General Public License for more details.
16
*
17
* You should have received a copy of the GNU General Public License
18
* along with this program; if not, write to the Free Software
19
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20
*
21
*/
22
23
#define pr_fmt(fmt) "(stk) :" fmt
24
#include <linux/platform_device.h>
25
#include <linux/jiffies.h>
26
#include <linux/firmware.h>
27
#include <linux/delay.h>
28
#include <linux/wait.h>
29
#include <linux/gpio.h>
30
#include <linux/debugfs.h>
31
#include <linux/seq_file.h>
32
#include <linux/sched.h>
33
#include <linux/sysfs.h>
34
#include <linux/tty.h>
35
36
#include <linux/skbuff.h>
37
#include <linux/ti_wilink_st.h>
38
39
40
#define MAX_ST_DEVICES 3 /* Imagine 1 on each UART for now */
41
static struct platform_device *st_kim_devices[MAX_ST_DEVICES];
42
43
/**********************************************************************/
44
/* internal functions */
45
46
/**
47
* st_get_plat_device -
48
* function which returns the reference to the platform device
49
* requested by id. As of now only 1 such device exists (id=0)
50
* the context requesting for reference can get the id to be
51
* requested by a. The protocol driver which is registering or
52
* b. the tty device which is opened.
53
*/
54
static struct platform_device *st_get_plat_device(int id)
55
{
56
return st_kim_devices[id];
57
}
58
59
/**
60
* validate_firmware_response -
61
* function to return whether the firmware response was proper
62
* in case of error don't complete so that waiting for proper
63
* response times out
64
*/
65
void validate_firmware_response(struct kim_data_s *kim_gdata)
66
{
67
struct sk_buff *skb = kim_gdata->rx_skb;
68
if (unlikely(skb->data[5] != 0)) {
69
pr_err("no proper response during fw download");
70
pr_err("data6 %x", skb->data[5]);
71
return; /* keep waiting for the proper response */
72
}
73
/* becos of all the script being downloaded */
74
complete_all(&kim_gdata->kim_rcvd);
75
kfree_skb(skb);
76
}
77
78
/* check for data len received inside kim_int_recv
79
* most often hit the last case to update state to waiting for data
80
*/
81
static inline int kim_check_data_len(struct kim_data_s *kim_gdata, int len)
82
{
83
register int room = skb_tailroom(kim_gdata->rx_skb);
84
85
pr_debug("len %d room %d", len, room);
86
87
if (!len) {
88
validate_firmware_response(kim_gdata);
89
} else if (len > room) {
90
/* Received packet's payload length is larger.
91
* We can't accommodate it in created skb.
92
*/
93
pr_err("Data length is too large len %d room %d", len,
94
room);
95
kfree_skb(kim_gdata->rx_skb);
96
} else {
97
/* Packet header has non-zero payload length and
98
* we have enough space in created skb. Lets read
99
* payload data */
100
kim_gdata->rx_state = ST_W4_DATA;
101
kim_gdata->rx_count = len;
102
return len;
103
}
104
105
/* Change ST LL state to continue to process next
106
* packet */
107
kim_gdata->rx_state = ST_W4_PACKET_TYPE;
108
kim_gdata->rx_skb = NULL;
109
kim_gdata->rx_count = 0;
110
111
return 0;
112
}
113
114
/**
115
* kim_int_recv - receive function called during firmware download
116
* firmware download responses on different UART drivers
117
* have been observed to come in bursts of different
118
* tty_receive and hence the logic
119
*/
120
void kim_int_recv(struct kim_data_s *kim_gdata,
121
const unsigned char *data, long count)
122
{
123
const unsigned char *ptr;
124
int len = 0, type = 0;
125
unsigned char *plen;
126
127
pr_debug("%s", __func__);
128
/* Decode received bytes here */
129
ptr = data;
130
if (unlikely(ptr == NULL)) {
131
pr_err(" received null from TTY ");
132
return;
133
}
134
135
while (count) {
136
if (kim_gdata->rx_count) {
137
len = min_t(unsigned int, kim_gdata->rx_count, count);
138
memcpy(skb_put(kim_gdata->rx_skb, len), ptr, len);
139
kim_gdata->rx_count -= len;
140
count -= len;
141
ptr += len;
142
143
if (kim_gdata->rx_count)
144
continue;
145
146
/* Check ST RX state machine , where are we? */
147
switch (kim_gdata->rx_state) {
148
/* Waiting for complete packet ? */
149
case ST_W4_DATA:
150
pr_debug("Complete pkt received");
151
validate_firmware_response(kim_gdata);
152
kim_gdata->rx_state = ST_W4_PACKET_TYPE;
153
kim_gdata->rx_skb = NULL;
154
continue;
155
/* Waiting for Bluetooth event header ? */
156
case ST_W4_HEADER:
157
plen =
158
(unsigned char *)&kim_gdata->rx_skb->data[1];
159
pr_debug("event hdr: plen 0x%02x\n", *plen);
160
kim_check_data_len(kim_gdata, *plen);
161
continue;
162
} /* end of switch */
163
} /* end of if rx_state */
164
switch (*ptr) {
165
/* Bluetooth event packet? */
166
case 0x04:
167
kim_gdata->rx_state = ST_W4_HEADER;
168
kim_gdata->rx_count = 2;
169
type = *ptr;
170
break;
171
default:
172
pr_info("unknown packet");
173
ptr++;
174
count--;
175
continue;
176
}
177
ptr++;
178
count--;
179
kim_gdata->rx_skb =
180
alloc_skb(1024+8, GFP_ATOMIC);
181
if (!kim_gdata->rx_skb) {
182
pr_err("can't allocate mem for new packet");
183
kim_gdata->rx_state = ST_W4_PACKET_TYPE;
184
kim_gdata->rx_count = 0;
185
return;
186
}
187
skb_reserve(kim_gdata->rx_skb, 8);
188
kim_gdata->rx_skb->cb[0] = 4;
189
kim_gdata->rx_skb->cb[1] = 0;
190
191
}
192
return;
193
}
194
195
static long read_local_version(struct kim_data_s *kim_gdata, char *bts_scr_name)
196
{
197
unsigned short version = 0, chip = 0, min_ver = 0, maj_ver = 0;
198
const char read_ver_cmd[] = { 0x01, 0x01, 0x10, 0x00 };
199
200
pr_debug("%s", __func__);
201
202
INIT_COMPLETION(kim_gdata->kim_rcvd);
203
if (4 != st_int_write(kim_gdata->core_data, read_ver_cmd, 4)) {
204
pr_err("kim: couldn't write 4 bytes");
205
return -EIO;
206
}
207
208
if (!wait_for_completion_timeout
209
(&kim_gdata->kim_rcvd, msecs_to_jiffies(CMD_RESP_TIME))) {
210
pr_err(" waiting for ver info- timed out ");
211
return -ETIMEDOUT;
212
}
213
214
version =
215
MAKEWORD(kim_gdata->resp_buffer[13],
216
kim_gdata->resp_buffer[14]);
217
chip = (version & 0x7C00) >> 10;
218
min_ver = (version & 0x007F);
219
maj_ver = (version & 0x0380) >> 7;
220
221
if (version & 0x8000)
222
maj_ver |= 0x0008;
223
224
sprintf(bts_scr_name, "TIInit_%d.%d.%d.bts", chip, maj_ver, min_ver);
225
226
/* to be accessed later via sysfs entry */
227
kim_gdata->version.full = version;
228
kim_gdata->version.chip = chip;
229
kim_gdata->version.maj_ver = maj_ver;
230
kim_gdata->version.min_ver = min_ver;
231
232
pr_info("%s", bts_scr_name);
233
return 0;
234
}
235
236
void skip_change_remote_baud(unsigned char **ptr, long *len)
237
{
238
unsigned char *nxt_action, *cur_action;
239
cur_action = *ptr;
240
241
nxt_action = cur_action + sizeof(struct bts_action) +
242
((struct bts_action *) cur_action)->size;
243
244
if (((struct bts_action *) nxt_action)->type != ACTION_WAIT_EVENT) {
245
pr_err("invalid action after change remote baud command");
246
} else {
247
*ptr = *ptr + sizeof(struct bts_action) +
248
((struct bts_action *)cur_action)->size;
249
*len = *len - (sizeof(struct bts_action) +
250
((struct bts_action *)cur_action)->size);
251
/* warn user on not commenting these in firmware */
252
pr_warn("skipping the wait event of change remote baud");
253
}
254
}
255
256
/**
257
* download_firmware -
258
* internal function which parses through the .bts firmware
259
* script file intreprets SEND, DELAY actions only as of now
260
*/
261
static long download_firmware(struct kim_data_s *kim_gdata)
262
{
263
long err = 0;
264
long len = 0;
265
unsigned char *ptr = NULL;
266
unsigned char *action_ptr = NULL;
267
unsigned char bts_scr_name[30] = { 0 }; /* 30 char long bts scr name? */
268
int wr_room_space;
269
int cmd_size;
270
unsigned long timeout;
271
272
err = read_local_version(kim_gdata, bts_scr_name);
273
if (err != 0) {
274
pr_err("kim: failed to read local ver");
275
return err;
276
}
277
err =
278
request_firmware(&kim_gdata->fw_entry, bts_scr_name,
279
&kim_gdata->kim_pdev->dev);
280
if (unlikely((err != 0) || (kim_gdata->fw_entry->data == NULL) ||
281
(kim_gdata->fw_entry->size == 0))) {
282
pr_err(" request_firmware failed(errno %ld) for %s", err,
283
bts_scr_name);
284
return -EINVAL;
285
}
286
ptr = (void *)kim_gdata->fw_entry->data;
287
len = kim_gdata->fw_entry->size;
288
/* bts_header to remove out magic number and
289
* version
290
*/
291
ptr += sizeof(struct bts_header);
292
len -= sizeof(struct bts_header);
293
294
while (len > 0 && ptr) {
295
pr_debug(" action size %d, type %d ",
296
((struct bts_action *)ptr)->size,
297
((struct bts_action *)ptr)->type);
298
299
switch (((struct bts_action *)ptr)->type) {
300
case ACTION_SEND_COMMAND: /* action send */
301
action_ptr = &(((struct bts_action *)ptr)->data[0]);
302
if (unlikely
303
(((struct hci_command *)action_ptr)->opcode ==
304
0xFF36)) {
305
/* ignore remote change
306
* baud rate HCI VS command */
307
pr_warn("change remote baud"
308
" rate command in firmware");
309
skip_change_remote_baud(&ptr, &len);
310
break;
311
}
312
/*
313
* Make sure we have enough free space in uart
314
* tx buffer to write current firmware command
315
*/
316
cmd_size = ((struct bts_action *)ptr)->size;
317
timeout = jiffies + msecs_to_jiffies(CMD_WR_TIME);
318
do {
319
wr_room_space =
320
st_get_uart_wr_room(kim_gdata->core_data);
321
if (wr_room_space < 0) {
322
pr_err("Unable to get free "
323
"space info from uart tx buffer");
324
release_firmware(kim_gdata->fw_entry);
325
return wr_room_space;
326
}
327
mdelay(1); /* wait 1ms before checking room */
328
} while ((wr_room_space < cmd_size) &&
329
time_before(jiffies, timeout));
330
331
/* Timeout happened ? */
332
if (time_after_eq(jiffies, timeout)) {
333
pr_err("Timeout while waiting for free "
334
"free space in uart tx buffer");
335
release_firmware(kim_gdata->fw_entry);
336
return -ETIMEDOUT;
337
}
338
339
/*
340
* Free space found in uart buffer, call st_int_write
341
* to send current firmware command to the uart tx
342
* buffer.
343
*/
344
err = st_int_write(kim_gdata->core_data,
345
((struct bts_action_send *)action_ptr)->data,
346
((struct bts_action *)ptr)->size);
347
if (unlikely(err < 0)) {
348
release_firmware(kim_gdata->fw_entry);
349
return err;
350
}
351
/*
352
* Check number of bytes written to the uart tx buffer
353
* and requested command write size
354
*/
355
if (err != cmd_size) {
356
pr_err("Number of bytes written to uart "
357
"tx buffer are not matching with "
358
"requested cmd write size");
359
release_firmware(kim_gdata->fw_entry);
360
return -EIO;
361
}
362
break;
363
case ACTION_WAIT_EVENT: /* wait */
364
if (!wait_for_completion_timeout
365
(&kim_gdata->kim_rcvd,
366
msecs_to_jiffies(CMD_RESP_TIME))) {
367
pr_err("response timeout during fw download ");
368
/* timed out */
369
release_firmware(kim_gdata->fw_entry);
370
return -ETIMEDOUT;
371
}
372
INIT_COMPLETION(kim_gdata->kim_rcvd);
373
break;
374
case ACTION_DELAY: /* sleep */
375
pr_info("sleep command in scr");
376
action_ptr = &(((struct bts_action *)ptr)->data[0]);
377
mdelay(((struct bts_action_delay *)action_ptr)->msec);
378
break;
379
}
380
len =
381
len - (sizeof(struct bts_action) +
382
((struct bts_action *)ptr)->size);
383
ptr =
384
ptr + sizeof(struct bts_action) +
385
((struct bts_action *)ptr)->size;
386
}
387
/* fw download complete */
388
release_firmware(kim_gdata->fw_entry);
389
return 0;
390
}
391
392
/**********************************************************************/
393
/* functions called from ST core */
394
/* called from ST Core, when REG_IN_PROGRESS (registration in progress)
395
* can be because of
396
* 1. response to read local version
397
* 2. during send/recv's of firmware download
398
*/
399
void st_kim_recv(void *disc_data, const unsigned char *data, long count)
400
{
401
struct st_data_s *st_gdata = (struct st_data_s *)disc_data;
402
struct kim_data_s *kim_gdata = st_gdata->kim_data;
403
404
/* copy to local buffer */
405
if (unlikely(data[4] == 0x01 && data[5] == 0x10 && data[0] == 0x04)) {
406
/* must be the read_ver_cmd */
407
memcpy(kim_gdata->resp_buffer, data, count);
408
complete_all(&kim_gdata->kim_rcvd);
409
return;
410
} else {
411
kim_int_recv(kim_gdata, data, count);
412
/* either completes or times out */
413
}
414
return;
415
}
416
417
/* to signal completion of line discipline installation
418
* called from ST Core, upon tty_open
419
*/
420
void st_kim_complete(void *kim_data)
421
{
422
struct kim_data_s *kim_gdata = (struct kim_data_s *)kim_data;
423
complete(&kim_gdata->ldisc_installed);
424
}
425
426
/**
427
* st_kim_start - called from ST Core upon 1st registration
428
* This involves toggling the chip enable gpio, reading
429
* the firmware version from chip, forming the fw file name
430
* based on the chip version, requesting the fw, parsing it
431
* and perform download(send/recv).
432
*/
433
long st_kim_start(void *kim_data)
434
{
435
long err = 0;
436
long retry = POR_RETRY_COUNT;
437
struct kim_data_s *kim_gdata = (struct kim_data_s *)kim_data;
438
439
pr_info(" %s", __func__);
440
441
do {
442
/* Configure BT nShutdown to HIGH state */
443
gpio_set_value(kim_gdata->nshutdown, GPIO_LOW);
444
mdelay(5); /* FIXME: a proper toggle */
445
gpio_set_value(kim_gdata->nshutdown, GPIO_HIGH);
446
mdelay(100);
447
/* re-initialize the completion */
448
INIT_COMPLETION(kim_gdata->ldisc_installed);
449
/* send notification to UIM */
450
kim_gdata->ldisc_install = 1;
451
pr_info("ldisc_install = 1");
452
sysfs_notify(&kim_gdata->kim_pdev->dev.kobj,
453
NULL, "install");
454
/* wait for ldisc to be installed */
455
err = wait_for_completion_timeout(&kim_gdata->ldisc_installed,
456
msecs_to_jiffies(LDISC_TIME));
457
if (!err) { /* timeout */
458
pr_err("line disc installation timed out ");
459
kim_gdata->ldisc_install = 0;
460
pr_info("ldisc_install = 0");
461
sysfs_notify(&kim_gdata->kim_pdev->dev.kobj,
462
NULL, "install");
463
err = -ETIMEDOUT;
464
continue;
465
} else {
466
/* ldisc installed now */
467
pr_info(" line discipline installed ");
468
err = download_firmware(kim_gdata);
469
if (err != 0) {
470
pr_err("download firmware failed");
471
kim_gdata->ldisc_install = 0;
472
pr_info("ldisc_install = 0");
473
sysfs_notify(&kim_gdata->kim_pdev->dev.kobj,
474
NULL, "install");
475
continue;
476
} else { /* on success don't retry */
477
break;
478
}
479
}
480
} while (retry--);
481
return err;
482
}
483
484
/**
485
* st_kim_stop - called from ST Core, on the last un-registration
486
* toggle low the chip enable gpio
487
*/
488
long st_kim_stop(void *kim_data)
489
{
490
long err = 0;
491
struct kim_data_s *kim_gdata = (struct kim_data_s *)kim_data;
492
493
INIT_COMPLETION(kim_gdata->ldisc_installed);
494
495
/* Flush any pending characters in the driver and discipline. */
496
tty_ldisc_flush(kim_gdata->core_data->tty);
497
tty_driver_flush_buffer(kim_gdata->core_data->tty);
498
499
/* send uninstall notification to UIM */
500
pr_info("ldisc_install = 0");
501
kim_gdata->ldisc_install = 0;
502
sysfs_notify(&kim_gdata->kim_pdev->dev.kobj, NULL, "install");
503
504
/* wait for ldisc to be un-installed */
505
err = wait_for_completion_timeout(&kim_gdata->ldisc_installed,
506
msecs_to_jiffies(LDISC_TIME));
507
if (!err) { /* timeout */
508
pr_err(" timed out waiting for ldisc to be un-installed");
509
return -ETIMEDOUT;
510
}
511
512
/* By default configure BT nShutdown to LOW state */
513
gpio_set_value(kim_gdata->nshutdown, GPIO_LOW);
514
mdelay(1);
515
gpio_set_value(kim_gdata->nshutdown, GPIO_HIGH);
516
mdelay(1);
517
gpio_set_value(kim_gdata->nshutdown, GPIO_LOW);
518
return err;
519
}
520
521
/**********************************************************************/
522
/* functions called from subsystems */
523
/* called when debugfs entry is read from */
524
525
static int show_version(struct seq_file *s, void *unused)
526
{
527
struct kim_data_s *kim_gdata = (struct kim_data_s *)s->private;
528
seq_printf(s, "%04X %d.%d.%d\n", kim_gdata->version.full,
529
kim_gdata->version.chip, kim_gdata->version.maj_ver,
530
kim_gdata->version.min_ver);
531
return 0;
532
}
533
534
static int show_list(struct seq_file *s, void *unused)
535
{
536
struct kim_data_s *kim_gdata = (struct kim_data_s *)s->private;
537
kim_st_list_protocols(kim_gdata->core_data, s);
538
return 0;
539
}
540
541
static ssize_t show_install(struct device *dev,
542
struct device_attribute *attr, char *buf)
543
{
544
struct kim_data_s *kim_data = dev_get_drvdata(dev);
545
return sprintf(buf, "%d\n", kim_data->ldisc_install);
546
}
547
548
static ssize_t show_dev_name(struct device *dev,
549
struct device_attribute *attr, char *buf)
550
{
551
struct kim_data_s *kim_data = dev_get_drvdata(dev);
552
return sprintf(buf, "%s\n", kim_data->dev_name);
553
}
554
555
static ssize_t show_baud_rate(struct device *dev,
556
struct device_attribute *attr, char *buf)
557
{
558
struct kim_data_s *kim_data = dev_get_drvdata(dev);
559
return sprintf(buf, "%ld\n", kim_data->baud_rate);
560
}
561
562
static ssize_t show_flow_cntrl(struct device *dev,
563
struct device_attribute *attr, char *buf)
564
{
565
struct kim_data_s *kim_data = dev_get_drvdata(dev);
566
return sprintf(buf, "%d\n", kim_data->flow_cntrl);
567
}
568
569
/* structures specific for sysfs entries */
570
static struct kobj_attribute ldisc_install =
571
__ATTR(install, 0444, (void *)show_install, NULL);
572
573
static struct kobj_attribute uart_dev_name =
574
__ATTR(dev_name, 0444, (void *)show_dev_name, NULL);
575
576
static struct kobj_attribute uart_baud_rate =
577
__ATTR(baud_rate, 0444, (void *)show_baud_rate, NULL);
578
579
static struct kobj_attribute uart_flow_cntrl =
580
__ATTR(flow_cntrl, 0444, (void *)show_flow_cntrl, NULL);
581
582
static struct attribute *uim_attrs[] = {
583
&ldisc_install.attr,
584
&uart_dev_name.attr,
585
&uart_baud_rate.attr,
586
&uart_flow_cntrl.attr,
587
NULL,
588
};
589
590
static struct attribute_group uim_attr_grp = {
591
.attrs = uim_attrs,
592
};
593
594
/**
595
* st_kim_ref - reference the core's data
596
* This references the per-ST platform device in the arch/xx/
597
* board-xx.c file.
598
* This would enable multiple such platform devices to exist
599
* on a given platform
600
*/
601
void st_kim_ref(struct st_data_s **core_data, int id)
602
{
603
struct platform_device *pdev;
604
struct kim_data_s *kim_gdata;
605
/* get kim_gdata reference from platform device */
606
pdev = st_get_plat_device(id);
607
if (!pdev) {
608
*core_data = NULL;
609
return;
610
}
611
kim_gdata = dev_get_drvdata(&pdev->dev);
612
*core_data = kim_gdata->core_data;
613
}
614
615
static int kim_version_open(struct inode *i, struct file *f)
616
{
617
return single_open(f, show_version, i->i_private);
618
}
619
620
static int kim_list_open(struct inode *i, struct file *f)
621
{
622
return single_open(f, show_list, i->i_private);
623
}
624
625
static const struct file_operations version_debugfs_fops = {
626
/* version info */
627
.open = kim_version_open,
628
.read = seq_read,
629
.llseek = seq_lseek,
630
.release = single_release,
631
};
632
static const struct file_operations list_debugfs_fops = {
633
/* protocols info */
634
.open = kim_list_open,
635
.read = seq_read,
636
.llseek = seq_lseek,
637
.release = single_release,
638
};
639
640
/**********************************************************************/
641
/* functions called from platform device driver subsystem
642
* need to have a relevant platform device entry in the platform's
643
* board-*.c file
644
*/
645
646
struct dentry *kim_debugfs_dir;
647
static int kim_probe(struct platform_device *pdev)
648
{
649
long status;
650
struct kim_data_s *kim_gdata;
651
struct ti_st_plat_data *pdata = pdev->dev.platform_data;
652
653
if ((pdev->id != -1) && (pdev->id < MAX_ST_DEVICES)) {
654
/* multiple devices could exist */
655
st_kim_devices[pdev->id] = pdev;
656
} else {
657
/* platform's sure about existence of 1 device */
658
st_kim_devices[0] = pdev;
659
}
660
661
kim_gdata = kzalloc(sizeof(struct kim_data_s), GFP_ATOMIC);
662
if (!kim_gdata) {
663
pr_err("no mem to allocate");
664
return -ENOMEM;
665
}
666
dev_set_drvdata(&pdev->dev, kim_gdata);
667
668
status = st_core_init(&kim_gdata->core_data);
669
if (status != 0) {
670
pr_err(" ST core init failed");
671
return -EIO;
672
}
673
/* refer to itself */
674
kim_gdata->core_data->kim_data = kim_gdata;
675
676
/* Claim the chip enable nShutdown gpio from the system */
677
kim_gdata->nshutdown = pdata->nshutdown_gpio;
678
status = gpio_request(kim_gdata->nshutdown, "kim");
679
if (unlikely(status)) {
680
pr_err(" gpio %ld request failed ", kim_gdata->nshutdown);
681
return status;
682
}
683
684
/* Configure nShutdown GPIO as output=0 */
685
status = gpio_direction_output(kim_gdata->nshutdown, 0);
686
if (unlikely(status)) {
687
pr_err(" unable to configure gpio %ld", kim_gdata->nshutdown);
688
return status;
689
}
690
/* get reference of pdev for request_firmware
691
*/
692
kim_gdata->kim_pdev = pdev;
693
init_completion(&kim_gdata->kim_rcvd);
694
init_completion(&kim_gdata->ldisc_installed);
695
696
status = sysfs_create_group(&pdev->dev.kobj, &uim_attr_grp);
697
if (status) {
698
pr_err("failed to create sysfs entries");
699
return status;
700
}
701
702
/* copying platform data */
703
strncpy(kim_gdata->dev_name, pdata->dev_name, UART_DEV_NAME_LEN);
704
kim_gdata->flow_cntrl = pdata->flow_cntrl;
705
kim_gdata->baud_rate = pdata->baud_rate;
706
pr_info("sysfs entries created\n");
707
708
kim_debugfs_dir = debugfs_create_dir("ti-st", NULL);
709
if (IS_ERR(kim_debugfs_dir)) {
710
pr_err(" debugfs entries creation failed ");
711
kim_debugfs_dir = NULL;
712
return -EIO;
713
}
714
715
debugfs_create_file("version", S_IRUGO, kim_debugfs_dir,
716
kim_gdata, &version_debugfs_fops);
717
debugfs_create_file("protocols", S_IRUGO, kim_debugfs_dir,
718
kim_gdata, &list_debugfs_fops);
719
pr_info(" debugfs entries created ");
720
return 0;
721
}
722
723
static int kim_remove(struct platform_device *pdev)
724
{
725
/* free the GPIOs requested */
726
struct ti_st_plat_data *pdata = pdev->dev.platform_data;
727
struct kim_data_s *kim_gdata;
728
729
kim_gdata = dev_get_drvdata(&pdev->dev);
730
731
/* Free the Bluetooth/FM/GPIO
732
* nShutdown gpio from the system
733
*/
734
gpio_free(pdata->nshutdown_gpio);
735
pr_info("nshutdown GPIO Freed");
736
737
debugfs_remove_recursive(kim_debugfs_dir);
738
sysfs_remove_group(&pdev->dev.kobj, &uim_attr_grp);
739
pr_info("sysfs entries removed");
740
741
kim_gdata->kim_pdev = NULL;
742
st_core_exit(kim_gdata->core_data);
743
744
kfree(kim_gdata);
745
kim_gdata = NULL;
746
return 0;
747
}
748
749
int kim_suspend(struct platform_device *pdev, pm_message_t state)
750
{
751
struct ti_st_plat_data *pdata = pdev->dev.platform_data;
752
753
if (pdata->suspend)
754
return pdata->suspend(pdev, state);
755
756
return -EOPNOTSUPP;
757
}
758
759
int kim_resume(struct platform_device *pdev)
760
{
761
struct ti_st_plat_data *pdata = pdev->dev.platform_data;
762
763
if (pdata->resume)
764
return pdata->resume(pdev);
765
766
return -EOPNOTSUPP;
767
}
768
769
/**********************************************************************/
770
/* entry point for ST KIM module, called in from ST Core */
771
static struct platform_driver kim_platform_driver = {
772
.probe = kim_probe,
773
.remove = kim_remove,
774
.suspend = kim_suspend,
775
.resume = kim_resume,
776
.driver = {
777
.name = "kim",
778
.owner = THIS_MODULE,
779
},
780
};
781
782
static int __init st_kim_init(void)
783
{
784
return platform_driver_register(&kim_platform_driver);
785
}
786
787
static void __exit st_kim_deinit(void)
788
{
789
platform_driver_unregister(&kim_platform_driver);
790
}
791
792
793
module_init(st_kim_init);
794
module_exit(st_kim_deinit);
795
MODULE_AUTHOR("Pavan Savoy <[email protected]>");
796
MODULE_DESCRIPTION("Shared Transport Driver for TI BT/FM/GPS combo chips ");
797
MODULE_LICENSE("GPL");
798
799