st_kim.c 21.3 KB
Newer Older
1 2 3 4
/*
 *  Shared Transport Line discipline driver Core
 *	Init Manager module responsible for GPIO control
 *	and firmware download
5 6
 *  Copyright (C) 2009-2010 Texas Instruments
 *  Author: Pavan Savoy <pavan_savoy@ti.com>
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License version 2 as
 *  published by the Free Software Foundation.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 */

#define pr_fmt(fmt) "(stk) :" fmt
#include <linux/platform_device.h>
#include <linux/jiffies.h>
#include <linux/firmware.h>
#include <linux/delay.h>
#include <linux/wait.h>
#include <linux/gpio.h>
30 31
#include <linux/debugfs.h>
#include <linux/seq_file.h>
32
#include <linux/sched.h>
33
#include <linux/tty.h>
34

35
#include <linux/skbuff.h>
36
#include <linux/ti_wilink_st.h>
37

38

39
#define MAX_ST_DEVICES	3	/* Imagine 1 on each UART for now */
40
static struct platform_device *st_kim_devices[MAX_ST_DEVICES];
41 42 43 44

/**********************************************************************/
/* internal functions */

45 46 47 48 49 50 51 52 53 54 55 56 57
/**
 * st_get_plat_device -
 *	function which returns the reference to the platform device
 *	requested by id. As of now only 1 such device exists (id=0)
 *	the context requesting for reference can get the id to be
 *	requested by a. The protocol driver which is registering or
 *	b. the tty device which is opened.
 */
static struct platform_device *st_get_plat_device(int id)
{
	return st_kim_devices[id];
}

58 59 60 61 62
/**
 * validate_firmware_response -
 *	function to return whether the firmware response was proper
 *	in case of error don't complete so that waiting for proper
 *	response times out
63
 */
64
void validate_firmware_response(struct kim_data_s *kim_gdata)
65
{
66
	struct sk_buff *skb = kim_gdata->rx_skb;
67 68 69 70 71 72 73 74 75 76 77 78 79
	if (unlikely(skb->data[5] != 0)) {
		pr_err("no proper response during fw download");
		pr_err("data6 %x", skb->data[5]);
		return;		/* keep waiting for the proper response */
	}
	/* becos of all the script being downloaded */
	complete_all(&kim_gdata->kim_rcvd);
	kfree_skb(skb);
}

/* check for data len received inside kim_int_recv
 * most often hit the last case to update state to waiting for data
 */
80
static inline int kim_check_data_len(struct kim_data_s *kim_gdata, int len)
81 82 83
{
	register int room = skb_tailroom(kim_gdata->rx_skb);

84
	pr_debug("len %d room %d", len, room);
85 86

	if (!len) {
87
		validate_firmware_response(kim_gdata);
88 89 90 91 92 93 94 95 96 97 98
	} else if (len > room) {
		/* Received packet's payload length is larger.
		 * We can't accommodate it in created skb.
		 */
		pr_err("Data length is too large len %d room %d", len,
			   room);
		kfree_skb(kim_gdata->rx_skb);
	} else {
		/* Packet header has non-zero payload length and
		 * we have enough space in created skb. Lets read
		 * payload data */
99
		kim_gdata->rx_state = ST_W4_DATA;
100 101 102 103 104 105 106 107 108 109 110 111 112
		kim_gdata->rx_count = len;
		return len;
	}

	/* Change ST LL state to continue to process next
	 * packet */
	kim_gdata->rx_state = ST_W4_PACKET_TYPE;
	kim_gdata->rx_skb = NULL;
	kim_gdata->rx_count = 0;

	return 0;
}

113 114 115 116 117
/**
 * kim_int_recv - receive function called during firmware download
 *	firmware download responses on different UART drivers
 *	have been observed to come in bursts of different
 *	tty_receive and hence the logic
118
 */
119 120
void kim_int_recv(struct kim_data_s *kim_gdata,
	const unsigned char *data, long count)
121
{
122 123
	const unsigned char *ptr;
	int len = 0, type = 0;
124
	unsigned char *plen;
125

126
	pr_debug("%s", __func__);
127
	/* Decode received bytes here */
128
	ptr = data;
129 130 131 132
	if (unlikely(ptr == NULL)) {
		pr_err(" received null from TTY ");
		return;
	}
133

134 135 136 137 138 139 140 141 142 143 144 145 146 147
	while (count) {
		if (kim_gdata->rx_count) {
			len = min_t(unsigned int, kim_gdata->rx_count, count);
			memcpy(skb_put(kim_gdata->rx_skb, len), ptr, len);
			kim_gdata->rx_count -= len;
			count -= len;
			ptr += len;

			if (kim_gdata->rx_count)
				continue;

			/* Check ST RX state machine , where are we? */
			switch (kim_gdata->rx_state) {
				/* Waiting for complete packet ? */
148
			case ST_W4_DATA:
149
				pr_debug("Complete pkt received");
150
				validate_firmware_response(kim_gdata);
151 152 153 154
				kim_gdata->rx_state = ST_W4_PACKET_TYPE;
				kim_gdata->rx_skb = NULL;
				continue;
				/* Waiting for Bluetooth event header ? */
155 156 157 158 159
			case ST_W4_HEADER:
				plen =
				(unsigned char *)&kim_gdata->rx_skb->data[1];
				pr_debug("event hdr: plen 0x%02x\n", *plen);
				kim_check_data_len(kim_gdata, *plen);
160 161 162 163 164
				continue;
			}	/* end of switch */
		}		/* end of if rx_state */
		switch (*ptr) {
			/* Bluetooth event packet? */
165 166 167 168
		case 0x04:
			kim_gdata->rx_state = ST_W4_HEADER;
			kim_gdata->rx_count = 2;
			type = *ptr;
169 170 171 172 173 174
			break;
		default:
			pr_info("unknown packet");
			ptr++;
			count--;
			continue;
175
		}
176 177 178
		ptr++;
		count--;
		kim_gdata->rx_skb =
179
			alloc_skb(1024+8, GFP_ATOMIC);
180 181 182 183 184
		if (!kim_gdata->rx_skb) {
			pr_err("can't allocate mem for new packet");
			kim_gdata->rx_state = ST_W4_PACKET_TYPE;
			kim_gdata->rx_count = 0;
			return;
185
		}
186 187 188 189
		skb_reserve(kim_gdata->rx_skb, 8);
		kim_gdata->rx_skb->cb[0] = 4;
		kim_gdata->rx_skb->cb[1] = 0;

190
	}
191 192 193
	return;
}

194
static long read_local_version(struct kim_data_s *kim_gdata, char *bts_scr_name)
195 196
{
	unsigned short version = 0, chip = 0, min_ver = 0, maj_ver = 0;
197
	const char read_ver_cmd[] = { 0x01, 0x01, 0x10, 0x00 };
198

199
	pr_debug("%s", __func__);
200 201 202 203

	INIT_COMPLETION(kim_gdata->kim_rcvd);
	if (4 != st_int_write(kim_gdata->core_data, read_ver_cmd, 4)) {
		pr_err("kim: couldn't write 4 bytes");
204
		return -EIO;
205 206 207 208 209
	}

	if (!wait_for_completion_timeout
	    (&kim_gdata->kim_rcvd, msecs_to_jiffies(CMD_RESP_TIME))) {
		pr_err(" waiting for ver info- timed out ");
210
		return -ETIMEDOUT;
211 212 213
	}

	version =
214 215
		MAKEWORD(kim_gdata->resp_buffer[13],
				kim_gdata->resp_buffer[14]);
216 217 218 219 220 221 222 223
	chip = (version & 0x7C00) >> 10;
	min_ver = (version & 0x007F);
	maj_ver = (version & 0x0380) >> 7;

	if (version & 0x8000)
		maj_ver |= 0x0008;

	sprintf(bts_scr_name, "TIInit_%d.%d.%d.bts", chip, maj_ver, min_ver);
224 225 226 227 228 229 230

	/* to be accessed later via sysfs entry */
	kim_gdata->version.full = version;
	kim_gdata->version.chip = chip;
	kim_gdata->version.maj_ver = maj_ver;
	kim_gdata->version.min_ver = min_ver;

231
	pr_info("%s", bts_scr_name);
232
	return 0;
233 234
}

235 236 237 238
/**
 * download_firmware -
 *	internal function which parses through the .bts firmware
 *	script file intreprets SEND, DELAY actions only as of now
239
 */
240
static long download_firmware(struct kim_data_s *kim_gdata)
241
{
242
	long err = 0;
243
	long len = 0;
244 245
	unsigned char *ptr = NULL;
	unsigned char *action_ptr = NULL;
246 247
	unsigned char bts_scr_name[30] = { 0 };	/* 30 char long bts scr name? */

248
	err = read_local_version(kim_gdata, bts_scr_name);
249
	if (err != 0) {
250 251 252 253 254 255 256 257 258 259
		pr_err("kim: failed to read local ver");
		return err;
	}
	err =
	    request_firmware(&kim_gdata->fw_entry, bts_scr_name,
			     &kim_gdata->kim_pdev->dev);
	if (unlikely((err != 0) || (kim_gdata->fw_entry->data == NULL) ||
		     (kim_gdata->fw_entry->size == 0))) {
		pr_err(" request_firmware failed(errno %ld) for %s", err,
			   bts_scr_name);
260
		return -EINVAL;
261 262 263 264 265 266 267 268 269 270
	}
	ptr = (void *)kim_gdata->fw_entry->data;
	len = kim_gdata->fw_entry->size;
	/* bts_header to remove out magic number and
	 * version
	 */
	ptr += sizeof(struct bts_header);
	len -= sizeof(struct bts_header);

	while (len > 0 && ptr) {
271
		pr_debug(" action size %d, type %d ",
272 273 274 275 276 277 278 279 280 281 282 283
			   ((struct bts_action *)ptr)->size,
			   ((struct bts_action *)ptr)->type);

		switch (((struct bts_action *)ptr)->type) {
		case ACTION_SEND_COMMAND:	/* action send */
			action_ptr = &(((struct bts_action *)ptr)->data[0]);
			if (unlikely
			    (((struct hci_command *)action_ptr)->opcode ==
			     0xFF36)) {
				/* ignore remote change
				 * baud rate HCI VS command */
				pr_err
284 285
				    (" change remote baud"
				    " rate command in firmware");
286 287 288 289 290 291 292 293 294
				break;
			}

			INIT_COMPLETION(kim_gdata->kim_rcvd);
			err = st_int_write(kim_gdata->core_data,
			((struct bts_action_send *)action_ptr)->data,
					   ((struct bts_action *)ptr)->size);
			if (unlikely(err < 0)) {
				release_firmware(kim_gdata->fw_entry);
295
				return err;
296 297 298 299 300 301 302 303
			}
			if (!wait_for_completion_timeout
			    (&kim_gdata->kim_rcvd,
			     msecs_to_jiffies(CMD_RESP_TIME))) {
				pr_err
				    (" response timeout during fw download ");
				/* timed out */
				release_firmware(kim_gdata->fw_entry);
304
				return -ETIMEDOUT;
305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321
			}
			break;
		case ACTION_DELAY:	/* sleep */
			pr_info("sleep command in scr");
			action_ptr = &(((struct bts_action *)ptr)->data[0]);
			mdelay(((struct bts_action_delay *)action_ptr)->msec);
			break;
		}
		len =
		    len - (sizeof(struct bts_action) +
			   ((struct bts_action *)ptr)->size);
		ptr =
		    ptr + sizeof(struct bts_action) +
		    ((struct bts_action *)ptr)->size;
	}
	/* fw download complete */
	release_firmware(kim_gdata->fw_entry);
322
	return 0;
323 324 325 326 327 328 329 330 331
}

/**********************************************************************/
/* functions called from ST core */
/* function to toggle the GPIO
 * needs to know whether the GPIO is active high or active low
 */
void st_kim_chip_toggle(enum proto_type type, enum kim_gpio_state state)
{
332 333
	struct platform_device	*kim_pdev;
	struct kim_data_s	*kim_gdata;
334 335
	pr_info(" %s ", __func__);

336
	kim_pdev = st_get_plat_device(0);
337 338
	kim_gdata = dev_get_drvdata(&kim_pdev->dev);

339
	if (kim_gdata->gpios[type] == -1) {
340
		pr_info("gpio not requested for protocol %d", type);
341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361
		return;
	}
	switch (type) {
	case ST_BT:
		/*Do Nothing */
		break;

	case ST_FM:
		if (state == KIM_GPIO_ACTIVE)
			gpio_set_value(kim_gdata->gpios[ST_FM], GPIO_LOW);
		else
			gpio_set_value(kim_gdata->gpios[ST_FM], GPIO_HIGH);
		break;

	case ST_GPS:
		if (state == KIM_GPIO_ACTIVE)
			gpio_set_value(kim_gdata->gpios[ST_GPS], GPIO_HIGH);
		else
			gpio_set_value(kim_gdata->gpios[ST_GPS], GPIO_LOW);
		break;

362
	case ST_MAX_CHANNELS:
363 364 365 366 367 368 369 370 371 372 373 374 375 376
	default:
		break;
	}

	return;
}

/* called from ST Core, when REG_IN_PROGRESS (registration in progress)
 * can be because of
 * 1. response to read local version
 * 2. during send/recv's of firmware download
 */
void st_kim_recv(void *disc_data, const unsigned char *data, long count)
{
377 378 379
	struct st_data_s	*st_gdata = (struct st_data_s *)disc_data;
	struct kim_data_s	*kim_gdata = st_gdata->kim_data;

380 381 382 383 384 385 386
	/* copy to local buffer */
	if (unlikely(data[4] == 0x01 && data[5] == 0x10 && data[0] == 0x04)) {
		/* must be the read_ver_cmd */
		memcpy(kim_gdata->resp_buffer, data, count);
		complete_all(&kim_gdata->kim_rcvd);
		return;
	} else {
387
		kim_int_recv(kim_gdata, data, count);
388 389 390 391 392 393 394 395
		/* either completes or times out */
	}
	return;
}

/* to signal completion of line discipline installation
 * called from ST Core, upon tty_open
 */
396
void st_kim_complete(void *kim_data)
397
{
398
	struct kim_data_s	*kim_gdata = (struct kim_data_s *)kim_data;
399 400 401
	complete(&kim_gdata->ldisc_installed);
}

402 403 404 405 406 407 408
/**
 * st_kim_start - called from ST Core upon 1st registration
 *	This involves toggling the chip enable gpio, reading
 *	the firmware version from chip, forming the fw file name
 *	based on the chip version, requesting the fw, parsing it
 *	and perform download(send/recv).
 */
409
long st_kim_start(void *kim_data)
410
{
411
	long err = 0;
412
	long retry = POR_RETRY_COUNT;
413 414
	struct kim_data_s	*kim_gdata = (struct kim_data_s *)kim_data;

415 416 417 418 419 420 421 422 423 424
	pr_info(" %s", __func__);

	do {
		/* Configure BT nShutdown to HIGH state */
		gpio_set_value(kim_gdata->gpios[ST_BT], GPIO_LOW);
		mdelay(5);	/* FIXME: a proper toggle */
		gpio_set_value(kim_gdata->gpios[ST_BT], GPIO_HIGH);
		mdelay(100);
		/* re-initialize the completion */
		INIT_COMPLETION(kim_gdata->ldisc_installed);
425 426 427 428 429
		/* send notification to UIM */
		kim_gdata->ldisc_install = 1;
		pr_info("ldisc_install = 1");
		sysfs_notify(&kim_gdata->kim_pdev->dev.kobj,
				NULL, "install");
430 431 432 433 434
		/* wait for ldisc to be installed */
		err = wait_for_completion_timeout(&kim_gdata->ldisc_installed,
				msecs_to_jiffies(LDISC_TIME));
		if (!err) {	/* timeout */
			pr_err("line disc installation timed out ");
435 436 437 438
			kim_gdata->ldisc_install = 0;
			pr_info("ldisc_install = 0");
			sysfs_notify(&kim_gdata->kim_pdev->dev.kobj,
					NULL, "install");
439
			err = -ETIMEDOUT;
440 441 442 443
			continue;
		} else {
			/* ldisc installed now */
			pr_info(" line discipline installed ");
444
			err = download_firmware(kim_gdata);
445
			if (err != 0) {
446
				pr_err("download firmware failed");
447 448 449 450
				kim_gdata->ldisc_install = 0;
				pr_info("ldisc_install = 0");
				sysfs_notify(&kim_gdata->kim_pdev->dev.kobj,
						NULL, "install");
451 452 453 454 455 456 457 458 459
				continue;
			} else {	/* on success don't retry */
				break;
			}
		}
	} while (retry--);
	return err;
}

460 461 462 463
/**
 * st_kim_stop - called from ST Core, on the last un-registration
 *	toggle low the chip enable gpio
 */
464
long st_kim_stop(void *kim_data)
465
{
466
	long err = 0;
467
	struct kim_data_s	*kim_gdata = (struct kim_data_s *)kim_data;
468 469

	INIT_COMPLETION(kim_gdata->ldisc_installed);
470 471 472 473 474 475 476 477 478

	/* Flush any pending characters in the driver and discipline. */
	tty_ldisc_flush(kim_gdata->core_data->tty);
	tty_driver_flush_buffer(kim_gdata->core_data->tty);

	/* send uninstall notification to UIM */
	pr_info("ldisc_install = 0");
	kim_gdata->ldisc_install = 0;
	sysfs_notify(&kim_gdata->kim_pdev->dev.kobj, NULL, "install");
479 480 481 482 483 484

	/* wait for ldisc to be un-installed */
	err = wait_for_completion_timeout(&kim_gdata->ldisc_installed,
			msecs_to_jiffies(LDISC_TIME));
	if (!err) {		/* timeout */
		pr_err(" timed out waiting for ldisc to be un-installed");
485
		return -ETIMEDOUT;
486 487 488 489 490 491 492 493 494 495 496 497 498
	}

	/* By default configure BT nShutdown to LOW state */
	gpio_set_value(kim_gdata->gpios[ST_BT], GPIO_LOW);
	mdelay(1);
	gpio_set_value(kim_gdata->gpios[ST_BT], GPIO_HIGH);
	mdelay(1);
	gpio_set_value(kim_gdata->gpios[ST_BT], GPIO_LOW);
	return err;
}

/**********************************************************************/
/* functions called from subsystems */
499
/* called when debugfs entry is read from */
500

501
static int show_version(struct seq_file *s, void *unused)
502
{
503 504
	struct kim_data_s *kim_gdata = (struct kim_data_s *)s->private;
	seq_printf(s, "%04X %d.%d.%d\n", kim_gdata->version.full,
505 506
			kim_gdata->version.chip, kim_gdata->version.maj_ver,
			kim_gdata->version.min_ver);
507
	return 0;
508 509
}

510
static int show_list(struct seq_file *s, void *unused)
511
{
512 513 514
	struct kim_data_s *kim_gdata = (struct kim_data_s *)s->private;
	kim_st_list_protocols(kim_gdata->core_data, s);
	return 0;
515 516
}

517 518
static ssize_t show_install(struct device *dev,
		struct device_attribute *attr, char *buf)
519
{
520 521 522
	struct kim_data_s *kim_data = dev_get_drvdata(dev);
	return sprintf(buf, "%d\n", kim_data->ldisc_install);
}
523

524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542
static ssize_t show_dev_name(struct device *dev,
		struct device_attribute *attr, char *buf)
{
	struct kim_data_s *kim_data = dev_get_drvdata(dev);
	return sprintf(buf, "%s\n", kim_data->dev_name);
}

static ssize_t show_baud_rate(struct device *dev,
		struct device_attribute *attr, char *buf)
{
	struct kim_data_s *kim_data = dev_get_drvdata(dev);
	return sprintf(buf, "%ld\n", kim_data->baud_rate);
}

static ssize_t show_flow_cntrl(struct device *dev,
		struct device_attribute *attr, char *buf)
{
	struct kim_data_s *kim_data = dev_get_drvdata(dev);
	return sprintf(buf, "%d\n", kim_data->flow_cntrl);
543 544
}

545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569
/* structures specific for sysfs entries */
static struct kobj_attribute ldisc_install =
__ATTR(install, 0444, (void *)show_install, NULL);

static struct kobj_attribute uart_dev_name =
__ATTR(dev_name, 0444, (void *)show_dev_name, NULL);

static struct kobj_attribute uart_baud_rate =
__ATTR(baud_rate, 0444, (void *)show_baud_rate, NULL);

static struct kobj_attribute uart_flow_cntrl =
__ATTR(flow_cntrl, 0444, (void *)show_flow_cntrl, NULL);

static struct attribute *uim_attrs[] = {
	&ldisc_install.attr,
	&uart_dev_name.attr,
	&uart_baud_rate.attr,
	&uart_flow_cntrl.attr,
	NULL,
};

static struct attribute_group uim_attr_grp = {
	.attrs = uim_attrs,
};

570 571 572 573 574 575 576
/**
 * st_kim_ref - reference the core's data
 *	This references the per-ST platform device in the arch/xx/
 *	board-xx.c file.
 *	This would enable multiple such platform devices to exist
 *	on a given platform
 */
577
void st_kim_ref(struct st_data_s **core_data, int id)
578
{
579 580 581
	struct platform_device	*pdev;
	struct kim_data_s	*kim_gdata;
	/* get kim_gdata reference from platform device */
582
	pdev = st_get_plat_device(id);
583
	kim_gdata = dev_get_drvdata(&pdev->dev);
584 585 586
	*core_data = kim_gdata->core_data;
}

587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611
static int kim_version_open(struct inode *i, struct file *f)
{
	return single_open(f, show_version, i->i_private);
}

static int kim_list_open(struct inode *i, struct file *f)
{
	return single_open(f, show_list, i->i_private);
}

static const struct file_operations version_debugfs_fops = {
	/* version info */
	.open = kim_version_open,
	.read = seq_read,
	.llseek = seq_lseek,
	.release = single_release,
};
static const struct file_operations list_debugfs_fops = {
	/* protocols info */
	.open = kim_list_open,
	.read = seq_read,
	.llseek = seq_lseek,
	.release = single_release,
};

612 613 614 615 616 617
/**********************************************************************/
/* functions called from platform device driver subsystem
 * need to have a relevant platform device entry in the platform's
 * board-*.c file
 */

618
struct dentry *kim_debugfs_dir;
619 620 621 622
static int kim_probe(struct platform_device *pdev)
{
	long status;
	long proto;
623
	struct kim_data_s	*kim_gdata;
624 625
	struct ti_st_plat_data	*pdata = pdev->dev.platform_data;
	long *gpios = pdata->gpios;
626

627 628 629 630 631 632 633 634
	if ((pdev->id != -1) && (pdev->id < MAX_ST_DEVICES)) {
		/* multiple devices could exist */
		st_kim_devices[pdev->id] = pdev;
	} else {
		/* platform's sure about existance of 1 device */
		st_kim_devices[0] = pdev;
	}

635 636 637 638 639 640
	kim_gdata = kzalloc(sizeof(struct kim_data_s), GFP_ATOMIC);
	if (!kim_gdata) {
		pr_err("no mem to allocate");
		return -ENOMEM;
	}
	dev_set_drvdata(&pdev->dev, kim_gdata);
641 642 643 644

	status = st_core_init(&kim_gdata->core_data);
	if (status != 0) {
		pr_err(" ST core init failed");
645
		return -EIO;
646
	}
647 648
	/* refer to itself */
	kim_gdata->core_data->kim_data = kim_gdata;
649

650
	for (proto = 0; proto < ST_MAX_CHANNELS; proto++) {
651 652 653 654
		kim_gdata->gpios[proto] = gpios[proto];
		pr_info(" %ld gpio to be requested", gpios[proto]);
	}

655 656
	for (proto = 0; (proto < ST_MAX_CHANNELS)
			&& (gpios[proto] != -1); proto++) {
657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689
		/* Claim the Bluetooth/FM/GPIO
		 * nShutdown gpio from the system
		 */
		status = gpio_request(gpios[proto], "kim");
		if (unlikely(status)) {
			pr_err(" gpio %ld request failed ", gpios[proto]);
			proto -= 1;
			while (proto >= 0) {
				if (gpios[proto] != -1)
					gpio_free(gpios[proto]);
			}
			return status;
		}

		/* Configure nShutdown GPIO as output=0 */
		status =
		    gpio_direction_output(gpios[proto], 0);
		if (unlikely(status)) {
			pr_err(" unable to configure gpio %ld",
				   gpios[proto]);
			proto -= 1;
			while (proto >= 0) {
				if (gpios[proto] != -1)
					gpio_free(gpios[proto]);
			}
			return status;
		}
	}
	/* get reference of pdev for request_firmware
	 */
	kim_gdata->kim_pdev = pdev;
	init_completion(&kim_gdata->kim_rcvd);
	init_completion(&kim_gdata->ldisc_installed);
N
Naveen Jain 已提交
690

691 692 693 694
	status = sysfs_create_group(&pdev->dev.kobj, &uim_attr_grp);
	if (status) {
		pr_err("failed to create sysfs entries");
		return status;
695
	}
696

697 698 699 700 701 702
	/* copying platform data */
	strncpy(kim_gdata->dev_name, pdata->dev_name, UART_DEV_NAME_LEN);
	kim_gdata->flow_cntrl = pdata->flow_cntrl;
	kim_gdata->baud_rate = pdata->baud_rate;
	pr_info("sysfs entries created\n");

703 704 705 706
	kim_debugfs_dir = debugfs_create_dir("ti-st", NULL);
	if (IS_ERR(kim_debugfs_dir)) {
		pr_err(" debugfs entries creation failed ");
		kim_debugfs_dir = NULL;
707
		return -EIO;
708
	}
709 710 711 712 713 714

	debugfs_create_file("version", S_IRUGO, kim_debugfs_dir,
				kim_gdata, &version_debugfs_fops);
	debugfs_create_file("protocols", S_IRUGO, kim_debugfs_dir,
				kim_gdata, &list_debugfs_fops);
	pr_info(" debugfs entries created ");
715
	return 0;
716 717 718 719
}

static int kim_remove(struct platform_device *pdev)
{
720 721 722
	/* free the GPIOs requested */
	struct ti_st_plat_data	*pdata = pdev->dev.platform_data;
	long *gpios = pdata->gpios;
723
	long proto;
724 725 726
	struct kim_data_s	*kim_gdata;

	kim_gdata = dev_get_drvdata(&pdev->dev);
727

728 729
	for (proto = 0; (proto < ST_MAX_CHANNELS)
		&& (gpios[proto] != -1); proto++) {
730 731 732 733 734 735
		/* Claim the Bluetooth/FM/GPIO
		 * nShutdown gpio from the system
		 */
		gpio_free(gpios[proto]);
	}
	pr_info("kim: GPIO Freed");
736
	debugfs_remove_recursive(kim_debugfs_dir);
737 738

	sysfs_remove_group(&pdev->dev.kobj, &uim_attr_grp);
739 740
	kim_gdata->kim_pdev = NULL;
	st_core_exit(kim_gdata->core_data);
741 742 743

	kfree(kim_gdata);
	kim_gdata = NULL;
744
	return 0;
745 746
}

747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766
int kim_suspend(struct platform_device *pdev, pm_message_t state)
{
	struct ti_st_plat_data	*pdata = pdev->dev.platform_data;

	if (pdata->suspend)
		return pdata->suspend(pdev, state);

	return -EOPNOTSUPP;
}

int kim_resume(struct platform_device *pdev)
{
	struct ti_st_plat_data	*pdata = pdev->dev.platform_data;

	if (pdata->resume)
		return pdata->resume(pdev);

	return -EOPNOTSUPP;
}

767 768
/**********************************************************************/
/* entry point for ST KIM module, called in from ST Core */
769 770 771 772 773 774 775 776 777 778
static struct platform_driver kim_platform_driver = {
	.probe = kim_probe,
	.remove = kim_remove,
	.suspend = kim_suspend,
	.resume = kim_resume,
	.driver = {
		.name = "kim",
		.owner = THIS_MODULE,
	},
};
779 780 781

static int __init st_kim_init(void)
{
782
	return platform_driver_register(&kim_platform_driver);
783 784 785 786 787 788 789 790 791 792 793 794 795
}

static void __exit st_kim_deinit(void)
{
	platform_driver_unregister(&kim_platform_driver);
}


module_init(st_kim_init);
module_exit(st_kim_deinit);
MODULE_AUTHOR("Pavan Savoy <pavan_savoy@ti.com>");
MODULE_DESCRIPTION("Shared Transport Driver for TI BT/FM/GPS combo chips ");
MODULE_LICENSE("GPL");