cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

dln2.c (19622B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * Driver for the Diolan DLN-2 USB adapter
      4 *
      5 * Copyright (c) 2014 Intel Corporation
      6 *
      7 * Derived from:
      8 *  i2c-diolan-u2c.c
      9 *  Copyright (c) 2010-2011 Ericsson AB
     10 */
     11
     12#include <linux/kernel.h>
     13#include <linux/module.h>
     14#include <linux/types.h>
     15#include <linux/slab.h>
     16#include <linux/usb.h>
     17#include <linux/i2c.h>
     18#include <linux/mutex.h>
     19#include <linux/platform_device.h>
     20#include <linux/mfd/core.h>
     21#include <linux/mfd/dln2.h>
     22#include <linux/rculist.h>
     23
     24struct dln2_header {
     25	__le16 size;
     26	__le16 id;
     27	__le16 echo;
     28	__le16 handle;
     29};
     30
     31struct dln2_response {
     32	struct dln2_header hdr;
     33	__le16 result;
     34};
     35
     36#define DLN2_GENERIC_MODULE_ID		0x00
     37#define DLN2_GENERIC_CMD(cmd)		DLN2_CMD(cmd, DLN2_GENERIC_MODULE_ID)
     38#define CMD_GET_DEVICE_VER		DLN2_GENERIC_CMD(0x30)
     39#define CMD_GET_DEVICE_SN		DLN2_GENERIC_CMD(0x31)
     40
     41#define DLN2_HW_ID			0x200
     42#define DLN2_USB_TIMEOUT		200	/* in ms */
     43#define DLN2_MAX_RX_SLOTS		16
     44#define DLN2_MAX_URBS			16
     45#define DLN2_RX_BUF_SIZE		512
     46
     47enum dln2_handle {
     48	DLN2_HANDLE_EVENT = 0,		/* don't change, hardware defined */
     49	DLN2_HANDLE_CTRL,
     50	DLN2_HANDLE_GPIO,
     51	DLN2_HANDLE_I2C,
     52	DLN2_HANDLE_SPI,
     53	DLN2_HANDLE_ADC,
     54	DLN2_HANDLES
     55};
     56
     57/*
     58 * Receive context used between the receive demultiplexer and the transfer
     59 * routine. While sending a request the transfer routine will look for a free
     60 * receive context and use it to wait for a response and to receive the URB and
     61 * thus the response data.
     62 */
     63struct dln2_rx_context {
     64	/* completion used to wait for a response */
     65	struct completion done;
     66
     67	/* if non-NULL the URB contains the response */
     68	struct urb *urb;
     69
     70	/* if true then this context is used to wait for a response */
     71	bool in_use;
     72};
     73
     74/*
     75 * Receive contexts for a particular DLN2 module (i2c, gpio, etc.). We use the
     76 * handle header field to identify the module in dln2_dev.mod_rx_slots and then
     77 * the echo header field to index the slots field and find the receive context
     78 * for a particular request.
     79 */
     80struct dln2_mod_rx_slots {
     81	/* RX slots bitmap */
     82	DECLARE_BITMAP(bmap, DLN2_MAX_RX_SLOTS);
     83
     84	/* used to wait for a free RX slot */
     85	wait_queue_head_t wq;
     86
     87	/* used to wait for an RX operation to complete */
     88	struct dln2_rx_context slots[DLN2_MAX_RX_SLOTS];
     89
     90	/* avoid races between alloc/free_rx_slot and dln2_rx_transfer */
     91	spinlock_t lock;
     92};
     93
     94enum dln2_endpoint {
     95	DLN2_EP_OUT	= 0,
     96	DLN2_EP_IN	= 1,
     97};
     98
     99struct dln2_dev {
    100	struct usb_device *usb_dev;
    101	struct usb_interface *interface;
    102	u8 ep_in;
    103	u8 ep_out;
    104
    105	struct urb *rx_urb[DLN2_MAX_URBS];
    106	void *rx_buf[DLN2_MAX_URBS];
    107
    108	struct dln2_mod_rx_slots mod_rx_slots[DLN2_HANDLES];
    109
    110	struct list_head event_cb_list;
    111	spinlock_t event_cb_lock;
    112
    113	bool disconnect;
    114	int active_transfers;
    115	wait_queue_head_t disconnect_wq;
    116	spinlock_t disconnect_lock;
    117};
    118
    119struct dln2_event_cb_entry {
    120	struct list_head list;
    121	u16 id;
    122	struct platform_device *pdev;
    123	dln2_event_cb_t callback;
    124};
    125
    126int dln2_register_event_cb(struct platform_device *pdev, u16 id,
    127			   dln2_event_cb_t event_cb)
    128{
    129	struct dln2_dev *dln2 = dev_get_drvdata(pdev->dev.parent);
    130	struct dln2_event_cb_entry *i, *entry;
    131	unsigned long flags;
    132	int ret = 0;
    133
    134	entry = kzalloc(sizeof(*entry), GFP_KERNEL);
    135	if (!entry)
    136		return -ENOMEM;
    137
    138	entry->id = id;
    139	entry->callback = event_cb;
    140	entry->pdev = pdev;
    141
    142	spin_lock_irqsave(&dln2->event_cb_lock, flags);
    143
    144	list_for_each_entry(i, &dln2->event_cb_list, list) {
    145		if (i->id == id) {
    146			ret = -EBUSY;
    147			break;
    148		}
    149	}
    150
    151	if (!ret)
    152		list_add_rcu(&entry->list, &dln2->event_cb_list);
    153
    154	spin_unlock_irqrestore(&dln2->event_cb_lock, flags);
    155
    156	if (ret)
    157		kfree(entry);
    158
    159	return ret;
    160}
    161EXPORT_SYMBOL(dln2_register_event_cb);
    162
    163void dln2_unregister_event_cb(struct platform_device *pdev, u16 id)
    164{
    165	struct dln2_dev *dln2 = dev_get_drvdata(pdev->dev.parent);
    166	struct dln2_event_cb_entry *i;
    167	unsigned long flags;
    168	bool found = false;
    169
    170	spin_lock_irqsave(&dln2->event_cb_lock, flags);
    171
    172	list_for_each_entry(i, &dln2->event_cb_list, list) {
    173		if (i->id == id) {
    174			list_del_rcu(&i->list);
    175			found = true;
    176			break;
    177		}
    178	}
    179
    180	spin_unlock_irqrestore(&dln2->event_cb_lock, flags);
    181
    182	if (found) {
    183		synchronize_rcu();
    184		kfree(i);
    185	}
    186}
    187EXPORT_SYMBOL(dln2_unregister_event_cb);
    188
    189/*
    190 * Returns true if a valid transfer slot is found. In this case the URB must not
    191 * be resubmitted immediately in dln2_rx as we need the data when dln2_transfer
    192 * is woke up. It will be resubmitted there.
    193 */
    194static bool dln2_transfer_complete(struct dln2_dev *dln2, struct urb *urb,
    195				   u16 handle, u16 rx_slot)
    196{
    197	struct device *dev = &dln2->interface->dev;
    198	struct dln2_mod_rx_slots *rxs = &dln2->mod_rx_slots[handle];
    199	struct dln2_rx_context *rxc;
    200	unsigned long flags;
    201	bool valid_slot = false;
    202
    203	if (rx_slot >= DLN2_MAX_RX_SLOTS)
    204		goto out;
    205
    206	rxc = &rxs->slots[rx_slot];
    207
    208	spin_lock_irqsave(&rxs->lock, flags);
    209	if (rxc->in_use && !rxc->urb) {
    210		rxc->urb = urb;
    211		complete(&rxc->done);
    212		valid_slot = true;
    213	}
    214	spin_unlock_irqrestore(&rxs->lock, flags);
    215
    216out:
    217	if (!valid_slot)
    218		dev_warn(dev, "bad/late response %d/%d\n", handle, rx_slot);
    219
    220	return valid_slot;
    221}
    222
    223static void dln2_run_event_callbacks(struct dln2_dev *dln2, u16 id, u16 echo,
    224				     void *data, int len)
    225{
    226	struct dln2_event_cb_entry *i;
    227
    228	rcu_read_lock();
    229
    230	list_for_each_entry_rcu(i, &dln2->event_cb_list, list) {
    231		if (i->id == id) {
    232			i->callback(i->pdev, echo, data, len);
    233			break;
    234		}
    235	}
    236
    237	rcu_read_unlock();
    238}
    239
    240static void dln2_rx(struct urb *urb)
    241{
    242	struct dln2_dev *dln2 = urb->context;
    243	struct dln2_header *hdr = urb->transfer_buffer;
    244	struct device *dev = &dln2->interface->dev;
    245	u16 id, echo, handle, size;
    246	u8 *data;
    247	int len;
    248	int err;
    249
    250	switch (urb->status) {
    251	case 0:
    252		/* success */
    253		break;
    254	case -ECONNRESET:
    255	case -ENOENT:
    256	case -ESHUTDOWN:
    257	case -EPIPE:
    258		/* this urb is terminated, clean up */
    259		dev_dbg(dev, "urb shutting down with status %d\n", urb->status);
    260		return;
    261	default:
    262		dev_dbg(dev, "nonzero urb status received %d\n", urb->status);
    263		goto out;
    264	}
    265
    266	if (urb->actual_length < sizeof(struct dln2_header)) {
    267		dev_err(dev, "short response: %d\n", urb->actual_length);
    268		goto out;
    269	}
    270
    271	handle = le16_to_cpu(hdr->handle);
    272	id = le16_to_cpu(hdr->id);
    273	echo = le16_to_cpu(hdr->echo);
    274	size = le16_to_cpu(hdr->size);
    275
    276	if (size != urb->actual_length) {
    277		dev_err(dev, "size mismatch: handle %x cmd %x echo %x size %d actual %d\n",
    278			handle, id, echo, size, urb->actual_length);
    279		goto out;
    280	}
    281
    282	if (handle >= DLN2_HANDLES) {
    283		dev_warn(dev, "invalid handle %d\n", handle);
    284		goto out;
    285	}
    286
    287	data = urb->transfer_buffer + sizeof(struct dln2_header);
    288	len = urb->actual_length - sizeof(struct dln2_header);
    289
    290	if (handle == DLN2_HANDLE_EVENT) {
    291		unsigned long flags;
    292
    293		spin_lock_irqsave(&dln2->event_cb_lock, flags);
    294		dln2_run_event_callbacks(dln2, id, echo, data, len);
    295		spin_unlock_irqrestore(&dln2->event_cb_lock, flags);
    296	} else {
    297		/* URB will be re-submitted in _dln2_transfer (free_rx_slot) */
    298		if (dln2_transfer_complete(dln2, urb, handle, echo))
    299			return;
    300	}
    301
    302out:
    303	err = usb_submit_urb(urb, GFP_ATOMIC);
    304	if (err < 0)
    305		dev_err(dev, "failed to resubmit RX URB: %d\n", err);
    306}
    307
    308static void *dln2_prep_buf(u16 handle, u16 cmd, u16 echo, const void *obuf,
    309			   int *obuf_len, gfp_t gfp)
    310{
    311	int len;
    312	void *buf;
    313	struct dln2_header *hdr;
    314
    315	len = *obuf_len + sizeof(*hdr);
    316	buf = kmalloc(len, gfp);
    317	if (!buf)
    318		return NULL;
    319
    320	hdr = (struct dln2_header *)buf;
    321	hdr->id = cpu_to_le16(cmd);
    322	hdr->size = cpu_to_le16(len);
    323	hdr->echo = cpu_to_le16(echo);
    324	hdr->handle = cpu_to_le16(handle);
    325
    326	memcpy(buf + sizeof(*hdr), obuf, *obuf_len);
    327
    328	*obuf_len = len;
    329
    330	return buf;
    331}
    332
    333static int dln2_send_wait(struct dln2_dev *dln2, u16 handle, u16 cmd, u16 echo,
    334			  const void *obuf, int obuf_len)
    335{
    336	int ret = 0;
    337	int len = obuf_len;
    338	void *buf;
    339	int actual;
    340
    341	buf = dln2_prep_buf(handle, cmd, echo, obuf, &len, GFP_KERNEL);
    342	if (!buf)
    343		return -ENOMEM;
    344
    345	ret = usb_bulk_msg(dln2->usb_dev,
    346			   usb_sndbulkpipe(dln2->usb_dev, dln2->ep_out),
    347			   buf, len, &actual, DLN2_USB_TIMEOUT);
    348
    349	kfree(buf);
    350
    351	return ret;
    352}
    353
    354static bool find_free_slot(struct dln2_dev *dln2, u16 handle, int *slot)
    355{
    356	struct dln2_mod_rx_slots *rxs;
    357	unsigned long flags;
    358
    359	if (dln2->disconnect) {
    360		*slot = -ENODEV;
    361		return true;
    362	}
    363
    364	rxs = &dln2->mod_rx_slots[handle];
    365
    366	spin_lock_irqsave(&rxs->lock, flags);
    367
    368	*slot = find_first_zero_bit(rxs->bmap, DLN2_MAX_RX_SLOTS);
    369
    370	if (*slot < DLN2_MAX_RX_SLOTS) {
    371		struct dln2_rx_context *rxc = &rxs->slots[*slot];
    372
    373		set_bit(*slot, rxs->bmap);
    374		rxc->in_use = true;
    375	}
    376
    377	spin_unlock_irqrestore(&rxs->lock, flags);
    378
    379	return *slot < DLN2_MAX_RX_SLOTS;
    380}
    381
    382static int alloc_rx_slot(struct dln2_dev *dln2, u16 handle)
    383{
    384	int ret;
    385	int slot;
    386
    387	/*
    388	 * No need to timeout here, the wait is bounded by the timeout in
    389	 * _dln2_transfer.
    390	 */
    391	ret = wait_event_interruptible(dln2->mod_rx_slots[handle].wq,
    392				       find_free_slot(dln2, handle, &slot));
    393	if (ret < 0)
    394		return ret;
    395
    396	return slot;
    397}
    398
    399static void free_rx_slot(struct dln2_dev *dln2, u16 handle, int slot)
    400{
    401	struct dln2_mod_rx_slots *rxs;
    402	struct urb *urb = NULL;
    403	unsigned long flags;
    404	struct dln2_rx_context *rxc;
    405
    406	rxs = &dln2->mod_rx_slots[handle];
    407
    408	spin_lock_irqsave(&rxs->lock, flags);
    409
    410	clear_bit(slot, rxs->bmap);
    411
    412	rxc = &rxs->slots[slot];
    413	rxc->in_use = false;
    414	urb = rxc->urb;
    415	rxc->urb = NULL;
    416	reinit_completion(&rxc->done);
    417
    418	spin_unlock_irqrestore(&rxs->lock, flags);
    419
    420	if (urb) {
    421		int err;
    422		struct device *dev = &dln2->interface->dev;
    423
    424		err = usb_submit_urb(urb, GFP_KERNEL);
    425		if (err < 0)
    426			dev_err(dev, "failed to resubmit RX URB: %d\n", err);
    427	}
    428
    429	wake_up_interruptible(&rxs->wq);
    430}
    431
    432static int _dln2_transfer(struct dln2_dev *dln2, u16 handle, u16 cmd,
    433			  const void *obuf, unsigned obuf_len,
    434			  void *ibuf, unsigned *ibuf_len)
    435{
    436	int ret = 0;
    437	int rx_slot;
    438	struct dln2_response *rsp;
    439	struct dln2_rx_context *rxc;
    440	struct device *dev = &dln2->interface->dev;
    441	const unsigned long timeout = msecs_to_jiffies(DLN2_USB_TIMEOUT);
    442	struct dln2_mod_rx_slots *rxs = &dln2->mod_rx_slots[handle];
    443	int size;
    444
    445	spin_lock(&dln2->disconnect_lock);
    446	if (!dln2->disconnect)
    447		dln2->active_transfers++;
    448	else
    449		ret = -ENODEV;
    450	spin_unlock(&dln2->disconnect_lock);
    451
    452	if (ret)
    453		return ret;
    454
    455	rx_slot = alloc_rx_slot(dln2, handle);
    456	if (rx_slot < 0) {
    457		ret = rx_slot;
    458		goto out_decr;
    459	}
    460
    461	ret = dln2_send_wait(dln2, handle, cmd, rx_slot, obuf, obuf_len);
    462	if (ret < 0) {
    463		dev_err(dev, "USB write failed: %d\n", ret);
    464		goto out_free_rx_slot;
    465	}
    466
    467	rxc = &rxs->slots[rx_slot];
    468
    469	ret = wait_for_completion_interruptible_timeout(&rxc->done, timeout);
    470	if (ret <= 0) {
    471		if (!ret)
    472			ret = -ETIMEDOUT;
    473		goto out_free_rx_slot;
    474	} else {
    475		ret = 0;
    476	}
    477
    478	if (dln2->disconnect) {
    479		ret = -ENODEV;
    480		goto out_free_rx_slot;
    481	}
    482
    483	/* if we got here we know that the response header has been checked */
    484	rsp = rxc->urb->transfer_buffer;
    485	size = le16_to_cpu(rsp->hdr.size);
    486
    487	if (size < sizeof(*rsp)) {
    488		ret = -EPROTO;
    489		goto out_free_rx_slot;
    490	}
    491
    492	if (le16_to_cpu(rsp->result) > 0x80) {
    493		dev_dbg(dev, "%d received response with error %d\n",
    494			handle, le16_to_cpu(rsp->result));
    495		ret = -EREMOTEIO;
    496		goto out_free_rx_slot;
    497	}
    498
    499	if (!ibuf)
    500		goto out_free_rx_slot;
    501
    502	if (*ibuf_len > size - sizeof(*rsp))
    503		*ibuf_len = size - sizeof(*rsp);
    504
    505	memcpy(ibuf, rsp + 1, *ibuf_len);
    506
    507out_free_rx_slot:
    508	free_rx_slot(dln2, handle, rx_slot);
    509out_decr:
    510	spin_lock(&dln2->disconnect_lock);
    511	dln2->active_transfers--;
    512	spin_unlock(&dln2->disconnect_lock);
    513	if (dln2->disconnect)
    514		wake_up(&dln2->disconnect_wq);
    515
    516	return ret;
    517}
    518
    519int dln2_transfer(struct platform_device *pdev, u16 cmd,
    520		  const void *obuf, unsigned obuf_len,
    521		  void *ibuf, unsigned *ibuf_len)
    522{
    523	struct dln2_platform_data *dln2_pdata;
    524	struct dln2_dev *dln2;
    525	u16 handle;
    526
    527	dln2 = dev_get_drvdata(pdev->dev.parent);
    528	dln2_pdata = dev_get_platdata(&pdev->dev);
    529	handle = dln2_pdata->handle;
    530
    531	return _dln2_transfer(dln2, handle, cmd, obuf, obuf_len, ibuf,
    532			      ibuf_len);
    533}
    534EXPORT_SYMBOL(dln2_transfer);
    535
    536static int dln2_check_hw(struct dln2_dev *dln2)
    537{
    538	int ret;
    539	__le32 hw_type;
    540	int len = sizeof(hw_type);
    541
    542	ret = _dln2_transfer(dln2, DLN2_HANDLE_CTRL, CMD_GET_DEVICE_VER,
    543			     NULL, 0, &hw_type, &len);
    544	if (ret < 0)
    545		return ret;
    546	if (len < sizeof(hw_type))
    547		return -EREMOTEIO;
    548
    549	if (le32_to_cpu(hw_type) != DLN2_HW_ID) {
    550		dev_err(&dln2->interface->dev, "Device ID 0x%x not supported\n",
    551			le32_to_cpu(hw_type));
    552		return -ENODEV;
    553	}
    554
    555	return 0;
    556}
    557
    558static int dln2_print_serialno(struct dln2_dev *dln2)
    559{
    560	int ret;
    561	__le32 serial_no;
    562	int len = sizeof(serial_no);
    563	struct device *dev = &dln2->interface->dev;
    564
    565	ret = _dln2_transfer(dln2, DLN2_HANDLE_CTRL, CMD_GET_DEVICE_SN, NULL, 0,
    566			     &serial_no, &len);
    567	if (ret < 0)
    568		return ret;
    569	if (len < sizeof(serial_no))
    570		return -EREMOTEIO;
    571
    572	dev_info(dev, "Diolan DLN2 serial %u\n", le32_to_cpu(serial_no));
    573
    574	return 0;
    575}
    576
    577static int dln2_hw_init(struct dln2_dev *dln2)
    578{
    579	int ret;
    580
    581	ret = dln2_check_hw(dln2);
    582	if (ret < 0)
    583		return ret;
    584
    585	return dln2_print_serialno(dln2);
    586}
    587
    588static void dln2_free_rx_urbs(struct dln2_dev *dln2)
    589{
    590	int i;
    591
    592	for (i = 0; i < DLN2_MAX_URBS; i++) {
    593		usb_free_urb(dln2->rx_urb[i]);
    594		kfree(dln2->rx_buf[i]);
    595	}
    596}
    597
    598static void dln2_stop_rx_urbs(struct dln2_dev *dln2)
    599{
    600	int i;
    601
    602	for (i = 0; i < DLN2_MAX_URBS; i++)
    603		usb_kill_urb(dln2->rx_urb[i]);
    604}
    605
    606static void dln2_free(struct dln2_dev *dln2)
    607{
    608	dln2_free_rx_urbs(dln2);
    609	usb_put_dev(dln2->usb_dev);
    610	kfree(dln2);
    611}
    612
    613static int dln2_setup_rx_urbs(struct dln2_dev *dln2,
    614			      struct usb_host_interface *hostif)
    615{
    616	int i;
    617	const int rx_max_size = DLN2_RX_BUF_SIZE;
    618
    619	for (i = 0; i < DLN2_MAX_URBS; i++) {
    620		dln2->rx_buf[i] = kmalloc(rx_max_size, GFP_KERNEL);
    621		if (!dln2->rx_buf[i])
    622			return -ENOMEM;
    623
    624		dln2->rx_urb[i] = usb_alloc_urb(0, GFP_KERNEL);
    625		if (!dln2->rx_urb[i])
    626			return -ENOMEM;
    627
    628		usb_fill_bulk_urb(dln2->rx_urb[i], dln2->usb_dev,
    629				  usb_rcvbulkpipe(dln2->usb_dev, dln2->ep_in),
    630				  dln2->rx_buf[i], rx_max_size, dln2_rx, dln2);
    631	}
    632
    633	return 0;
    634}
    635
    636static int dln2_start_rx_urbs(struct dln2_dev *dln2, gfp_t gfp)
    637{
    638	struct device *dev = &dln2->interface->dev;
    639	int ret;
    640	int i;
    641
    642	for (i = 0; i < DLN2_MAX_URBS; i++) {
    643		ret = usb_submit_urb(dln2->rx_urb[i], gfp);
    644		if (ret < 0) {
    645			dev_err(dev, "failed to submit RX URB: %d\n", ret);
    646			return ret;
    647		}
    648	}
    649
    650	return 0;
    651}
    652
    653enum {
    654	DLN2_ACPI_MATCH_GPIO	= 0,
    655	DLN2_ACPI_MATCH_I2C	= 1,
    656	DLN2_ACPI_MATCH_SPI	= 2,
    657	DLN2_ACPI_MATCH_ADC	= 3,
    658};
    659
    660static struct dln2_platform_data dln2_pdata_gpio = {
    661	.handle = DLN2_HANDLE_GPIO,
    662};
    663
    664static struct mfd_cell_acpi_match dln2_acpi_match_gpio = {
    665	.adr = DLN2_ACPI_MATCH_GPIO,
    666};
    667
    668/* Only one I2C port seems to be supported on current hardware */
    669static struct dln2_platform_data dln2_pdata_i2c = {
    670	.handle = DLN2_HANDLE_I2C,
    671	.port = 0,
    672};
    673
    674static struct mfd_cell_acpi_match dln2_acpi_match_i2c = {
    675	.adr = DLN2_ACPI_MATCH_I2C,
    676};
    677
    678/* Only one SPI port supported */
    679static struct dln2_platform_data dln2_pdata_spi = {
    680	.handle = DLN2_HANDLE_SPI,
    681	.port = 0,
    682};
    683
    684static struct mfd_cell_acpi_match dln2_acpi_match_spi = {
    685	.adr = DLN2_ACPI_MATCH_SPI,
    686};
    687
    688/* Only one ADC port supported */
    689static struct dln2_platform_data dln2_pdata_adc = {
    690	.handle = DLN2_HANDLE_ADC,
    691	.port = 0,
    692};
    693
    694static struct mfd_cell_acpi_match dln2_acpi_match_adc = {
    695	.adr = DLN2_ACPI_MATCH_ADC,
    696};
    697
    698static const struct mfd_cell dln2_devs[] = {
    699	{
    700		.name = "dln2-gpio",
    701		.acpi_match = &dln2_acpi_match_gpio,
    702		.platform_data = &dln2_pdata_gpio,
    703		.pdata_size = sizeof(struct dln2_platform_data),
    704	},
    705	{
    706		.name = "dln2-i2c",
    707		.acpi_match = &dln2_acpi_match_i2c,
    708		.platform_data = &dln2_pdata_i2c,
    709		.pdata_size = sizeof(struct dln2_platform_data),
    710	},
    711	{
    712		.name = "dln2-spi",
    713		.acpi_match = &dln2_acpi_match_spi,
    714		.platform_data = &dln2_pdata_spi,
    715		.pdata_size = sizeof(struct dln2_platform_data),
    716	},
    717	{
    718		.name = "dln2-adc",
    719		.acpi_match = &dln2_acpi_match_adc,
    720		.platform_data = &dln2_pdata_adc,
    721		.pdata_size = sizeof(struct dln2_platform_data),
    722	},
    723};
    724
    725static void dln2_stop(struct dln2_dev *dln2)
    726{
    727	int i, j;
    728
    729	/* don't allow starting new transfers */
    730	spin_lock(&dln2->disconnect_lock);
    731	dln2->disconnect = true;
    732	spin_unlock(&dln2->disconnect_lock);
    733
    734	/* cancel in progress transfers */
    735	for (i = 0; i < DLN2_HANDLES; i++) {
    736		struct dln2_mod_rx_slots *rxs = &dln2->mod_rx_slots[i];
    737		unsigned long flags;
    738
    739		spin_lock_irqsave(&rxs->lock, flags);
    740
    741		/* cancel all response waiters */
    742		for (j = 0; j < DLN2_MAX_RX_SLOTS; j++) {
    743			struct dln2_rx_context *rxc = &rxs->slots[j];
    744
    745			if (rxc->in_use)
    746				complete(&rxc->done);
    747		}
    748
    749		spin_unlock_irqrestore(&rxs->lock, flags);
    750	}
    751
    752	/* wait for transfers to end */
    753	wait_event(dln2->disconnect_wq, !dln2->active_transfers);
    754
    755	dln2_stop_rx_urbs(dln2);
    756}
    757
    758static void dln2_disconnect(struct usb_interface *interface)
    759{
    760	struct dln2_dev *dln2 = usb_get_intfdata(interface);
    761
    762	dln2_stop(dln2);
    763
    764	mfd_remove_devices(&interface->dev);
    765
    766	dln2_free(dln2);
    767}
    768
    769static int dln2_probe(struct usb_interface *interface,
    770		      const struct usb_device_id *usb_id)
    771{
    772	struct usb_host_interface *hostif = interface->cur_altsetting;
    773	struct usb_endpoint_descriptor *epin;
    774	struct usb_endpoint_descriptor *epout;
    775	struct device *dev = &interface->dev;
    776	struct dln2_dev *dln2;
    777	int ret;
    778	int i, j;
    779
    780	if (hostif->desc.bInterfaceNumber != 0 ||
    781	    hostif->desc.bNumEndpoints < 2)
    782		return -ENODEV;
    783
    784	epout = &hostif->endpoint[DLN2_EP_OUT].desc;
    785	if (!usb_endpoint_is_bulk_out(epout))
    786		return -ENODEV;
    787	epin = &hostif->endpoint[DLN2_EP_IN].desc;
    788	if (!usb_endpoint_is_bulk_in(epin))
    789		return -ENODEV;
    790
    791	dln2 = kzalloc(sizeof(*dln2), GFP_KERNEL);
    792	if (!dln2)
    793		return -ENOMEM;
    794
    795	dln2->ep_out = epout->bEndpointAddress;
    796	dln2->ep_in = epin->bEndpointAddress;
    797	dln2->usb_dev = usb_get_dev(interface_to_usbdev(interface));
    798	dln2->interface = interface;
    799	usb_set_intfdata(interface, dln2);
    800	init_waitqueue_head(&dln2->disconnect_wq);
    801
    802	for (i = 0; i < DLN2_HANDLES; i++) {
    803		init_waitqueue_head(&dln2->mod_rx_slots[i].wq);
    804		spin_lock_init(&dln2->mod_rx_slots[i].lock);
    805		for (j = 0; j < DLN2_MAX_RX_SLOTS; j++)
    806			init_completion(&dln2->mod_rx_slots[i].slots[j].done);
    807	}
    808
    809	spin_lock_init(&dln2->event_cb_lock);
    810	spin_lock_init(&dln2->disconnect_lock);
    811	INIT_LIST_HEAD(&dln2->event_cb_list);
    812
    813	ret = dln2_setup_rx_urbs(dln2, hostif);
    814	if (ret)
    815		goto out_free;
    816
    817	ret = dln2_start_rx_urbs(dln2, GFP_KERNEL);
    818	if (ret)
    819		goto out_stop_rx;
    820
    821	ret = dln2_hw_init(dln2);
    822	if (ret < 0) {
    823		dev_err(dev, "failed to initialize hardware\n");
    824		goto out_stop_rx;
    825	}
    826
    827	ret = mfd_add_hotplug_devices(dev, dln2_devs, ARRAY_SIZE(dln2_devs));
    828	if (ret != 0) {
    829		dev_err(dev, "failed to add mfd devices to core\n");
    830		goto out_stop_rx;
    831	}
    832
    833	return 0;
    834
    835out_stop_rx:
    836	dln2_stop_rx_urbs(dln2);
    837
    838out_free:
    839	dln2_free(dln2);
    840
    841	return ret;
    842}
    843
    844static int dln2_suspend(struct usb_interface *iface, pm_message_t message)
    845{
    846	struct dln2_dev *dln2 = usb_get_intfdata(iface);
    847
    848	dln2_stop(dln2);
    849
    850	return 0;
    851}
    852
    853static int dln2_resume(struct usb_interface *iface)
    854{
    855	struct dln2_dev *dln2 = usb_get_intfdata(iface);
    856
    857	dln2->disconnect = false;
    858
    859	return dln2_start_rx_urbs(dln2, GFP_NOIO);
    860}
    861
    862static const struct usb_device_id dln2_table[] = {
    863	{ USB_DEVICE(0xa257, 0x2013) },
    864	{ }
    865};
    866
    867MODULE_DEVICE_TABLE(usb, dln2_table);
    868
    869static struct usb_driver dln2_driver = {
    870	.name = "dln2",
    871	.probe = dln2_probe,
    872	.disconnect = dln2_disconnect,
    873	.id_table = dln2_table,
    874	.suspend = dln2_suspend,
    875	.resume = dln2_resume,
    876};
    877
    878module_usb_driver(dln2_driver);
    879
    880MODULE_AUTHOR("Octavian Purdila <octavian.purdila@intel.com>");
    881MODULE_DESCRIPTION("Core driver for the Diolan DLN2 interface adapter");
    882MODULE_LICENSE("GPL v2");