Commit 906a039d authored by David S. Miller's avatar David S. Miller

Merge branch 'for-upstream' of...

Merge branch 'for-upstream' of git://git.kernel.org/pub/scm/linux/kernel/git/bluetooth/bluetooth-next

Johan Hedberg says:

====================
pull request: bluetooth-next 2017-08-01

Here's our first batch of Bluetooth patches for the 4.14 kernel:

 - Several new USB IDs for the btusb driver
 - Memory leak fix in btusb driver
 - Cleanups & fixes to hci_nokia, hci_serdev and hci_bcm drivers
 - Fixed cleanup path in mrf24j40 (802.15.4) driver probe function
 - A few other smaller cleanups & fixes to drivers

Please let me know if there are any issues pulling. Thanks.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents c613c209 d829b9e2
...@@ -98,6 +98,7 @@ config BT_HCIUART_NOKIA ...@@ -98,6 +98,7 @@ config BT_HCIUART_NOKIA
depends on BT_HCIUART_SERDEV depends on BT_HCIUART_SERDEV
depends on PM depends on PM
select BT_HCIUART_H4 select BT_HCIUART_H4
select BT_BCM
help help
Nokia H4+ is serial protocol for communication between Bluetooth Nokia H4+ is serial protocol for communication between Bluetooth
device and host. This protocol is required for Bluetooth devices device and host. This protocol is required for Bluetooth devices
......
...@@ -140,7 +140,8 @@ MODULE_DEVICE_TABLE(usb, ath3k_table); ...@@ -140,7 +140,8 @@ MODULE_DEVICE_TABLE(usb, ath3k_table);
#define BTUSB_ATH3012 0x80 #define BTUSB_ATH3012 0x80
/* This table is to load patch and sysconfig files /* This table is to load patch and sysconfig files
* for AR3012 */ * for AR3012
*/
static const struct usb_device_id ath3k_blist_tbl[] = { static const struct usb_device_id ath3k_blist_tbl[] = {
/* Atheros AR3012 with sflash firmware*/ /* Atheros AR3012 with sflash firmware*/
......
...@@ -684,14 +684,16 @@ static int bt3c_config(struct pcmcia_device *link) ...@@ -684,14 +684,16 @@ static int bt3c_config(struct pcmcia_device *link)
unsigned long try; unsigned long try;
/* First pass: look for a config entry that looks normal. /* First pass: look for a config entry that looks normal.
Two tries: without IO aliases, then with aliases */ * Two tries: without IO aliases, then with aliases
*/
for (try = 0; try < 2; try++) for (try = 0; try < 2; try++)
if (!pcmcia_loop_config(link, bt3c_check_config, (void *) try)) if (!pcmcia_loop_config(link, bt3c_check_config, (void *) try))
goto found_port; goto found_port;
/* Second pass: try to find an entry that isn't picky about /* Second pass: try to find an entry that isn't picky about
its base address, then try to grab any standard serial port * its base address, then try to grab any standard serial port
address, and finally try to get any free port. */ * address, and finally try to get any free port.
*/
if (!pcmcia_loop_config(link, bt3c_check_config_notpicky, NULL)) if (!pcmcia_loop_config(link, bt3c_check_config_notpicky, NULL))
goto found_port; goto found_port;
......
...@@ -1455,7 +1455,8 @@ static void btmrvl_sdio_dump_firmware(struct btmrvl_private *priv) ...@@ -1455,7 +1455,8 @@ static void btmrvl_sdio_dump_firmware(struct btmrvl_private *priv)
fw_dump_ptr = fw_dump_data; fw_dump_ptr = fw_dump_data;
/* Dump all the memory data into single file, a userspace script will /* Dump all the memory data into single file, a userspace script will
be used to split all the memory data to multiple files*/ * be used to split all the memory data to multiple files
*/
BT_INFO("== btmrvl firmware dump to /sys/class/devcoredump start"); BT_INFO("== btmrvl firmware dump to /sys/class/devcoredump start");
for (idx = 0; idx < dump_num; idx++) { for (idx = 0; idx < dump_num; idx++) {
struct memory_type_mapping *entry = &mem_type_mapping_tbl[idx]; struct memory_type_mapping *entry = &mem_type_mapping_tbl[idx];
...@@ -1482,7 +1483,8 @@ static void btmrvl_sdio_dump_firmware(struct btmrvl_private *priv) ...@@ -1482,7 +1483,8 @@ static void btmrvl_sdio_dump_firmware(struct btmrvl_private *priv)
} }
/* fw_dump_data will be free in device coredump release function /* fw_dump_data will be free in device coredump release function
after 5 min*/ * after 5 min
*/
dev_coredumpv(&card->func->dev, fw_dump_data, fw_dump_len, GFP_KERNEL); dev_coredumpv(&card->func->dev, fw_dump_data, fw_dump_len, GFP_KERNEL);
BT_INFO("== btmrvl firmware dump to /sys/class/devcoredump end"); BT_INFO("== btmrvl firmware dump to /sys/class/devcoredump end");
} }
......
...@@ -81,7 +81,7 @@ static int rome_patch_ver_req(struct hci_dev *hdev, u32 *rome_version) ...@@ -81,7 +81,7 @@ static int rome_patch_ver_req(struct hci_dev *hdev, u32 *rome_version)
* and lower 2 bytes from patch will be used. * and lower 2 bytes from patch will be used.
*/ */
*rome_version = (le32_to_cpu(ver->soc_id) << 16) | *rome_version = (le32_to_cpu(ver->soc_id) << 16) |
(le16_to_cpu(ver->rome_ver) & 0x0000ffff); (le16_to_cpu(ver->rome_ver) & 0x0000ffff);
out: out:
kfree_skb(skb); kfree_skb(skb);
......
...@@ -279,6 +279,8 @@ static int rtl_load_config(struct hci_dev *hdev, const char *name, u8 **buff) ...@@ -279,6 +279,8 @@ static int rtl_load_config(struct hci_dev *hdev, const char *name, u8 **buff)
return ret; return ret;
ret = fw->size; ret = fw->size;
*buff = kmemdup(fw->data, ret, GFP_KERNEL); *buff = kmemdup(fw->data, ret, GFP_KERNEL);
if (!*buff)
ret = -ENOMEM;
release_firmware(fw); release_firmware(fw);
......
...@@ -144,7 +144,8 @@ static int btsdio_rx_packet(struct btsdio_data *data) ...@@ -144,7 +144,8 @@ static int btsdio_rx_packet(struct btsdio_data *data)
if (!skb) { if (!skb) {
/* Out of memory. Prepare a read retry and just /* Out of memory. Prepare a read retry and just
* return with the expectation that the next time * return with the expectation that the next time
* we're called we'll have more memory. */ * we're called we'll have more memory.
*/
return -ENOMEM; return -ENOMEM;
} }
......
...@@ -614,14 +614,16 @@ static int btuart_config(struct pcmcia_device *link) ...@@ -614,14 +614,16 @@ static int btuart_config(struct pcmcia_device *link)
int try; int try;
/* First pass: look for a config entry that looks normal. /* First pass: look for a config entry that looks normal.
Two tries: without IO aliases, then with aliases */ * Two tries: without IO aliases, then with aliases
*/
for (try = 0; try < 2; try++) for (try = 0; try < 2; try++)
if (!pcmcia_loop_config(link, btuart_check_config, &try)) if (!pcmcia_loop_config(link, btuart_check_config, &try))
goto found_port; goto found_port;
/* Second pass: try to find an entry that isn't picky about /* Second pass: try to find an entry that isn't picky about
its base address, then try to grab any standard serial port * its base address, then try to grab any standard serial port
address, and finally try to get any free port. */ * address, and finally try to get any free port.
*/
if (!pcmcia_loop_config(link, btuart_check_config_notpicky, NULL)) if (!pcmcia_loop_config(link, btuart_check_config_notpicky, NULL))
goto found_port; goto found_port;
......
...@@ -131,7 +131,8 @@ static const struct usb_device_id btusb_table[] = { ...@@ -131,7 +131,8 @@ static const struct usb_device_id btusb_table[] = {
{ USB_DEVICE(0x19ff, 0x0239), .driver_info = BTUSB_BCM_PATCHRAM }, { USB_DEVICE(0x19ff, 0x0239), .driver_info = BTUSB_BCM_PATCHRAM },
/* Broadcom BCM43142A0 (Foxconn/Lenovo) */ /* Broadcom BCM43142A0 (Foxconn/Lenovo) */
{ USB_DEVICE(0x105b, 0xe065), .driver_info = BTUSB_BCM_PATCHRAM }, { USB_VENDOR_AND_INTERFACE_INFO(0x105b, 0xff, 0x01, 0x01),
.driver_info = BTUSB_BCM_PATCHRAM },
/* Broadcom BCM920703 (HTC Vive) */ /* Broadcom BCM920703 (HTC Vive) */
{ USB_VENDOR_AND_INTERFACE_INFO(0x0bb4, 0xff, 0x01, 0x01), { USB_VENDOR_AND_INTERFACE_INFO(0x0bb4, 0xff, 0x01, 0x01),
...@@ -268,6 +269,7 @@ static const struct usb_device_id blacklist_table[] = { ...@@ -268,6 +269,7 @@ static const struct usb_device_id blacklist_table[] = {
{ USB_DEVICE(0x0489, 0xe092), .driver_info = BTUSB_QCA_ROME }, { USB_DEVICE(0x0489, 0xe092), .driver_info = BTUSB_QCA_ROME },
{ USB_DEVICE(0x0489, 0xe0a2), .driver_info = BTUSB_QCA_ROME }, { USB_DEVICE(0x0489, 0xe0a2), .driver_info = BTUSB_QCA_ROME },
{ USB_DEVICE(0x04ca, 0x3011), .driver_info = BTUSB_QCA_ROME }, { USB_DEVICE(0x04ca, 0x3011), .driver_info = BTUSB_QCA_ROME },
{ USB_DEVICE(0x04ca, 0x3016), .driver_info = BTUSB_QCA_ROME },
/* Broadcom BCM2035 */ /* Broadcom BCM2035 */
{ USB_DEVICE(0x0a5c, 0x2009), .driver_info = BTUSB_BCM92035 }, { USB_DEVICE(0x0a5c, 0x2009), .driver_info = BTUSB_BCM92035 },
...@@ -656,7 +658,8 @@ static void btusb_intr_complete(struct urb *urb) ...@@ -656,7 +658,8 @@ static void btusb_intr_complete(struct urb *urb)
err = usb_submit_urb(urb, GFP_ATOMIC); err = usb_submit_urb(urb, GFP_ATOMIC);
if (err < 0) { if (err < 0) {
/* -EPERM: urb is being killed; /* -EPERM: urb is being killed;
* -ENODEV: device got disconnected */ * -ENODEV: device got disconnected
*/
if (err != -EPERM && err != -ENODEV) if (err != -EPERM && err != -ENODEV)
BT_ERR("%s urb %p failed to resubmit (%d)", BT_ERR("%s urb %p failed to resubmit (%d)",
hdev->name, urb, -err); hdev->name, urb, -err);
...@@ -745,7 +748,8 @@ static void btusb_bulk_complete(struct urb *urb) ...@@ -745,7 +748,8 @@ static void btusb_bulk_complete(struct urb *urb)
err = usb_submit_urb(urb, GFP_ATOMIC); err = usb_submit_urb(urb, GFP_ATOMIC);
if (err < 0) { if (err < 0) {
/* -EPERM: urb is being killed; /* -EPERM: urb is being killed;
* -ENODEV: device got disconnected */ * -ENODEV: device got disconnected
*/
if (err != -EPERM && err != -ENODEV) if (err != -EPERM && err != -ENODEV)
BT_ERR("%s urb %p failed to resubmit (%d)", BT_ERR("%s urb %p failed to resubmit (%d)",
hdev->name, urb, -err); hdev->name, urb, -err);
...@@ -840,7 +844,8 @@ static void btusb_isoc_complete(struct urb *urb) ...@@ -840,7 +844,8 @@ static void btusb_isoc_complete(struct urb *urb)
err = usb_submit_urb(urb, GFP_ATOMIC); err = usb_submit_urb(urb, GFP_ATOMIC);
if (err < 0) { if (err < 0) {
/* -EPERM: urb is being killed; /* -EPERM: urb is being killed;
* -ENODEV: device got disconnected */ * -ENODEV: device got disconnected
*/
if (err != -EPERM && err != -ENODEV) if (err != -EPERM && err != -ENODEV)
BT_ERR("%s urb %p failed to resubmit (%d)", BT_ERR("%s urb %p failed to resubmit (%d)",
hdev->name, urb, -err); hdev->name, urb, -err);
...@@ -952,7 +957,8 @@ static void btusb_diag_complete(struct urb *urb) ...@@ -952,7 +957,8 @@ static void btusb_diag_complete(struct urb *urb)
err = usb_submit_urb(urb, GFP_ATOMIC); err = usb_submit_urb(urb, GFP_ATOMIC);
if (err < 0) { if (err < 0) {
/* -EPERM: urb is being killed; /* -EPERM: urb is being killed;
* -ENODEV: device got disconnected */ * -ENODEV: device got disconnected
*/
if (err != -EPERM && err != -ENODEV) if (err != -EPERM && err != -ENODEV)
BT_ERR("%s urb %p failed to resubmit (%d)", BT_ERR("%s urb %p failed to resubmit (%d)",
hdev->name, urb, -err); hdev->name, urb, -err);
...@@ -2896,7 +2902,8 @@ static int btusb_probe(struct usb_interface *intf, ...@@ -2896,7 +2902,8 @@ static int btusb_probe(struct usb_interface *intf,
struct usb_device *udev = interface_to_usbdev(intf); struct usb_device *udev = interface_to_usbdev(intf);
/* Old firmware would otherwise let ath3k driver load /* Old firmware would otherwise let ath3k driver load
* patch and sysconfig files */ * patch and sysconfig files
*/
if (le16_to_cpu(udev->descriptor.bcdDevice) <= 0x0001) if (le16_to_cpu(udev->descriptor.bcdDevice) <= 0x0001)
return -ENODEV; return -ENODEV;
} }
...@@ -3067,6 +3074,12 @@ static int btusb_probe(struct usb_interface *intf, ...@@ -3067,6 +3074,12 @@ static int btusb_probe(struct usb_interface *intf,
if (id->driver_info & BTUSB_QCA_ROME) { if (id->driver_info & BTUSB_QCA_ROME) {
data->setup_on_usb = btusb_setup_qca; data->setup_on_usb = btusb_setup_qca;
hdev->set_bdaddr = btusb_set_bdaddr_ath3012; hdev->set_bdaddr = btusb_set_bdaddr_ath3012;
/* QCA Rome devices lose their updated firmware over suspend,
* but the USB hub doesn't notice any status change.
* Explicitly request a device reset on resume.
*/
set_bit(BTUSB_RESET_RESUME, &data->flags);
} }
#ifdef CONFIG_BT_HCIBTUSB_RTL #ifdef CONFIG_BT_HCIBTUSB_RTL
...@@ -3259,13 +3272,28 @@ static void play_deferred(struct btusb_data *data) ...@@ -3259,13 +3272,28 @@ static void play_deferred(struct btusb_data *data)
int err; int err;
while ((urb = usb_get_from_anchor(&data->deferred))) { while ((urb = usb_get_from_anchor(&data->deferred))) {
usb_anchor_urb(urb, &data->tx_anchor);
err = usb_submit_urb(urb, GFP_ATOMIC); err = usb_submit_urb(urb, GFP_ATOMIC);
if (err < 0) if (err < 0) {
if (err != -EPERM && err != -ENODEV)
BT_ERR("%s urb %p submission failed (%d)",
data->hdev->name, urb, -err);
kfree(urb->setup_packet);
usb_unanchor_urb(urb);
usb_free_urb(urb);
break; break;
}
data->tx_in_flight++; data->tx_in_flight++;
usb_free_urb(urb);
}
/* Cleanup the rest deferred urbs. */
while ((urb = usb_get_from_anchor(&data->deferred))) {
kfree(urb->setup_packet);
usb_free_urb(urb);
} }
usb_scuttle_anchored_urbs(&data->deferred);
} }
static int btusb_resume(struct usb_interface *intf) static int btusb_resume(struct usb_interface *intf)
......
...@@ -93,8 +93,7 @@ static void st_reg_completion_cb(void *priv_data, int data) ...@@ -93,8 +93,7 @@ static void st_reg_completion_cb(void *priv_data, int data)
complete(&lhst->wait_reg_completion); complete(&lhst->wait_reg_completion);
} }
/* Called by Shared Transport layer when receive data is /* Called by Shared Transport layer when receive data is available */
* available */
static long st_receive(void *priv_data, struct sk_buff *skb) static long st_receive(void *priv_data, struct sk_buff *skb)
{ {
struct ti_st *lhst = priv_data; struct ti_st *lhst = priv_data;
...@@ -198,7 +197,8 @@ static int ti_st_open(struct hci_dev *hdev) ...@@ -198,7 +197,8 @@ static int ti_st_open(struct hci_dev *hdev)
} }
/* Is ST registration callback /* Is ST registration callback
* called with ERROR status? */ * called with ERROR status?
*/
if (hst->reg_status != 0) { if (hst->reg_status != 0) {
BT_ERR("ST registration completed with invalid " BT_ERR("ST registration completed with invalid "
"status %d", hst->reg_status); "status %d", hst->reg_status);
...@@ -276,7 +276,7 @@ static int ti_st_send_frame(struct hci_dev *hdev, struct sk_buff *skb) ...@@ -276,7 +276,7 @@ static int ti_st_send_frame(struct hci_dev *hdev, struct sk_buff *skb)
static int bt_ti_probe(struct platform_device *pdev) static int bt_ti_probe(struct platform_device *pdev)
{ {
static struct ti_st *hst; struct ti_st *hst;
struct hci_dev *hdev; struct hci_dev *hdev;
int err; int err;
......
...@@ -176,7 +176,7 @@ static irqreturn_t bcm_host_wake(int irq, void *data) ...@@ -176,7 +176,7 @@ static irqreturn_t bcm_host_wake(int irq, void *data)
static int bcm_request_irq(struct bcm_data *bcm) static int bcm_request_irq(struct bcm_data *bcm)
{ {
struct bcm_device *bdev = bcm->dev; struct bcm_device *bdev = bcm->dev;
int err = 0; int err;
/* If this is not a platform device, do not enable PM functionalities */ /* If this is not a platform device, do not enable PM functionalities */
mutex_lock(&bcm_device_lock); mutex_lock(&bcm_device_lock);
...@@ -185,21 +185,23 @@ static int bcm_request_irq(struct bcm_data *bcm) ...@@ -185,21 +185,23 @@ static int bcm_request_irq(struct bcm_data *bcm)
goto unlock; goto unlock;
} }
if (bdev->irq > 0) { if (bdev->irq <= 0) {
err = devm_request_irq(&bdev->pdev->dev, bdev->irq, err = -EOPNOTSUPP;
bcm_host_wake, IRQF_TRIGGER_RISING, goto unlock;
"host_wake", bdev); }
if (err)
goto unlock;
device_init_wakeup(&bdev->pdev->dev, true); err = devm_request_irq(&bdev->pdev->dev, bdev->irq, bcm_host_wake,
IRQF_TRIGGER_RISING, "host_wake", bdev);
if (err)
goto unlock;
pm_runtime_set_autosuspend_delay(&bdev->pdev->dev, device_init_wakeup(&bdev->pdev->dev, true);
BCM_AUTOSUSPEND_DELAY);
pm_runtime_use_autosuspend(&bdev->pdev->dev); pm_runtime_set_autosuspend_delay(&bdev->pdev->dev,
pm_runtime_set_active(&bdev->pdev->dev); BCM_AUTOSUSPEND_DELAY);
pm_runtime_enable(&bdev->pdev->dev); pm_runtime_use_autosuspend(&bdev->pdev->dev);
} pm_runtime_set_active(&bdev->pdev->dev);
pm_runtime_enable(&bdev->pdev->dev);
unlock: unlock:
mutex_unlock(&bcm_device_lock); mutex_unlock(&bcm_device_lock);
......
...@@ -172,7 +172,7 @@ struct sk_buff *h4_recv_buf(struct hci_dev *hdev, struct sk_buff *skb, ...@@ -172,7 +172,7 @@ struct sk_buff *h4_recv_buf(struct hci_dev *hdev, struct sk_buff *skb,
const struct h4_recv_pkt *pkts, int pkts_count) const struct h4_recv_pkt *pkts, int pkts_count)
{ {
struct hci_uart *hu = hci_get_drvdata(hdev); struct hci_uart *hu = hci_get_drvdata(hdev);
u8 alignment = hu->alignment; u8 alignment = hu->alignment ? hu->alignment : 1;
while (count) { while (count) {
int i, len; int i, len;
......
...@@ -457,7 +457,8 @@ static int hci_uart_tty_open(struct tty_struct *tty) ...@@ -457,7 +457,8 @@ static int hci_uart_tty_open(struct tty_struct *tty)
BT_DBG("tty %p", tty); BT_DBG("tty %p", tty);
/* Error if the tty has no write op instead of leaving an exploitable /* Error if the tty has no write op instead of leaving an exploitable
hole */ * hole
*/
if (tty->ops->write == NULL) if (tty->ops->write == NULL)
return -EOPNOTSUPP; return -EOPNOTSUPP;
......
...@@ -622,7 +622,8 @@ static int download_firmware(struct ll_device *lldev) ...@@ -622,7 +622,8 @@ static int download_firmware(struct ll_device *lldev)
cmd = (struct hci_command *)action_ptr; cmd = (struct hci_command *)action_ptr;
if (cmd->opcode == 0xff36) { if (cmd->opcode == 0xff36) {
/* ignore remote change /* ignore remote change
* baud rate HCI VS command */ * baud rate HCI VS command
*/
bt_dev_warn(lldev->hu.hdev, "change remote baud rate command in firmware"); bt_dev_warn(lldev->hu.hdev, "change remote baud rate command in firmware");
break; break;
} }
...@@ -742,14 +743,8 @@ static int hci_ti_probe(struct serdev_device *serdev) ...@@ -742,14 +743,8 @@ static int hci_ti_probe(struct serdev_device *serdev)
static void hci_ti_remove(struct serdev_device *serdev) static void hci_ti_remove(struct serdev_device *serdev)
{ {
struct ll_device *lldev = serdev_device_get_drvdata(serdev); struct ll_device *lldev = serdev_device_get_drvdata(serdev);
struct hci_uart *hu = &lldev->hu;
struct hci_dev *hdev = hu->hdev;
cancel_work_sync(&hu->write_work); hci_uart_unregister_device(&lldev->hu);
hci_unregister_dev(hdev);
hci_free_dev(hdev);
hu->proto->close(hu);
} }
static const struct of_device_id hci_ti_of_match[] = { static const struct of_device_id hci_ti_of_match[] = {
......
...@@ -767,16 +767,8 @@ static int nokia_bluetooth_serdev_probe(struct serdev_device *serdev) ...@@ -767,16 +767,8 @@ static int nokia_bluetooth_serdev_probe(struct serdev_device *serdev)
static void nokia_bluetooth_serdev_remove(struct serdev_device *serdev) static void nokia_bluetooth_serdev_remove(struct serdev_device *serdev)
{ {
struct nokia_bt_dev *btdev = serdev_device_get_drvdata(serdev); struct nokia_bt_dev *btdev = serdev_device_get_drvdata(serdev);
struct hci_uart *hu = &btdev->hu;
struct hci_dev *hdev = hu->hdev;
cancel_work_sync(&hu->write_work); hci_uart_unregister_device(&btdev->hu);
hci_unregister_dev(hdev);
hci_free_dev(hdev);
hu->proto->close(hu);
pm_runtime_disable(&btdev->serdev->dev);
} }
static int nokia_bluetooth_runtime_suspend(struct device *dev) static int nokia_bluetooth_runtime_suspend(struct device *dev)
......
...@@ -354,3 +354,16 @@ int hci_uart_register_device(struct hci_uart *hu, ...@@ -354,3 +354,16 @@ int hci_uart_register_device(struct hci_uart *hu,
return err; return err;
} }
EXPORT_SYMBOL_GPL(hci_uart_register_device); EXPORT_SYMBOL_GPL(hci_uart_register_device);
void hci_uart_unregister_device(struct hci_uart *hu)
{
struct hci_dev *hdev = hu->hdev;
hci_unregister_dev(hdev);
hci_free_dev(hdev);
cancel_work_sync(&hu->write_work);
hu->proto->close(hu);
}
EXPORT_SYMBOL_GPL(hci_uart_unregister_device);
...@@ -112,6 +112,7 @@ struct hci_uart { ...@@ -112,6 +112,7 @@ struct hci_uart {
int hci_uart_register_proto(const struct hci_uart_proto *p); int hci_uart_register_proto(const struct hci_uart_proto *p);
int hci_uart_unregister_proto(const struct hci_uart_proto *p); int hci_uart_unregister_proto(const struct hci_uart_proto *p);
int hci_uart_register_device(struct hci_uart *hu, const struct hci_uart_proto *p); int hci_uart_register_device(struct hci_uart *hu, const struct hci_uart_proto *p);
void hci_uart_unregister_device(struct hci_uart *hu);
int hci_uart_tx_wakeup(struct hci_uart *hu); int hci_uart_tx_wakeup(struct hci_uart *hu);
int hci_uart_init_ready(struct hci_uart *hu); int hci_uart_init_ready(struct hci_uart *hu);
......
...@@ -1330,7 +1330,8 @@ static int mrf24j40_probe(struct spi_device *spi) ...@@ -1330,7 +1330,8 @@ static int mrf24j40_probe(struct spi_device *spi)
if (spi->max_speed_hz > MAX_SPI_SPEED_HZ) { if (spi->max_speed_hz > MAX_SPI_SPEED_HZ) {
dev_warn(&spi->dev, "spi clock above possible maximum: %d", dev_warn(&spi->dev, "spi clock above possible maximum: %d",
MAX_SPI_SPEED_HZ); MAX_SPI_SPEED_HZ);
return -EINVAL; ret = -EINVAL;
goto err_register_device;
} }
ret = mrf24j40_hw_init(devrec); ret = mrf24j40_hw_init(devrec);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment