Skip to content

Commit d9e8a58

Browse files
committed
Merge branch 'bits/100-bluetooth' into asahi-wip
2 parents aa28478 + 846b71f commit d9e8a58

File tree

1 file changed

+45
-15
lines changed

1 file changed

+45
-15
lines changed

drivers/bluetooth/hci_bcm4377.c

Lines changed: 45 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,16 @@ enum bcm4377_chip {
2626
BCM4377 = 0,
2727
BCM4378,
2828
BCM4387,
29+
BCM4388,
2930
};
3031

3132
#define BCM4377_DEVICE_ID 0x5fa0
3233
#define BCM4378_DEVICE_ID 0x5f69
3334
#define BCM4387_DEVICE_ID 0x5f71
35+
#define BCM4388_DEVICE_ID 0x5f72
3436

35-
#define BCM4377_TIMEOUT 1000
37+
#define BCM4377_TIMEOUT msecs_to_jiffies(1000)
38+
#define BCM4377_BOOT_TIMEOUT msecs_to_jiffies(5000)
3639

3740
/*
3841
* These devices only support DMA transactions inside a 32bit window
@@ -506,6 +509,7 @@ struct bcm4377_hw {
506509
u32 bar0_window1;
507510
u32 bar0_window2;
508511
u32 bar0_core2_window2;
512+
u32 bar2_offset;
509513

510514
unsigned long has_bar0_core2_window2 : 1;
511515
unsigned long clear_pciecfg_subsystem_ctrl_bit19 : 1;
@@ -716,7 +720,7 @@ static void bcm4377_handle_ack(struct bcm4377_data *bcm4377,
716720
ring->events[msgid] = NULL;
717721
}
718722

719-
bitmap_release_region(ring->msgids, msgid, ring->n_entries);
723+
bitmap_release_region(ring->msgids, msgid, 0);
720724

721725
unlock:
722726
spin_unlock_irqrestore(&ring->lock, flags);
@@ -830,8 +834,8 @@ static irqreturn_t bcm4377_irq(int irq, void *data)
830834
struct bcm4377_data *bcm4377 = data;
831835
u32 bootstage, rti_status;
832836

833-
bootstage = ioread32(bcm4377->bar2 + BCM4377_BAR2_BOOTSTAGE);
834-
rti_status = ioread32(bcm4377->bar2 + BCM4377_BAR2_RTI_STATUS);
837+
bootstage = ioread32(bcm4377->bar2 + bcm4377->hw->bar2_offset + BCM4377_BAR2_BOOTSTAGE);
838+
rti_status = ioread32(bcm4377->bar2 + bcm4377->hw->bar2_offset + BCM4377_BAR2_RTI_STATUS);
835839

836840
if (bootstage != bcm4377->bootstage ||
837841
rti_status != bcm4377->rti_status) {
@@ -1191,6 +1195,14 @@ static int bcm4387_send_calibration(struct bcm4377_data *bcm4377)
11911195
bcm4377->taurus_cal_size);
11921196
}
11931197

1198+
static int bcm4388_send_calibration(struct bcm4377_data *bcm4377)
1199+
{
1200+
/* Guess that these always use beamforming */
1201+
return __bcm4378_send_calibration(
1202+
bcm4377, bcm4377->taurus_beamforming_cal_blob,
1203+
bcm4377->taurus_beamforming_cal_size);
1204+
}
1205+
11941206
static const struct firmware *bcm4377_request_blob(struct bcm4377_data *bcm4377,
11951207
const char *suffix)
11961208
{
@@ -1814,8 +1826,8 @@ static int bcm4377_boot(struct bcm4377_data *bcm4377)
18141826
int ret = 0;
18151827
u32 bootstage, rti_status;
18161828

1817-
bootstage = ioread32(bcm4377->bar2 + BCM4377_BAR2_BOOTSTAGE);
1818-
rti_status = ioread32(bcm4377->bar2 + BCM4377_BAR2_RTI_STATUS);
1829+
bootstage = ioread32(bcm4377->bar2 + bcm4377->hw->bar2_offset + BCM4377_BAR2_BOOTSTAGE);
1830+
rti_status = ioread32(bcm4377->bar2 + bcm4377->hw->bar2_offset + BCM4377_BAR2_RTI_STATUS);
18191831

18201832
if (bootstage != 0) {
18211833
dev_err(&bcm4377->pdev->dev, "bootstage is %d and not 0\n",
@@ -1849,15 +1861,18 @@ static int bcm4377_boot(struct bcm4377_data *bcm4377)
18491861
iowrite32(BCM4377_DMA_MASK,
18501862
bcm4377->bar0 + BCM4377_BAR0_HOST_WINDOW_SIZE);
18511863

1852-
iowrite32(lower_32_bits(fw_dma), bcm4377->bar2 + BCM4377_BAR2_FW_LO);
1853-
iowrite32(upper_32_bits(fw_dma), bcm4377->bar2 + BCM4377_BAR2_FW_HI);
1854-
iowrite32(fw->size, bcm4377->bar2 + BCM4377_BAR2_FW_SIZE);
1864+
iowrite32(lower_32_bits(fw_dma),
1865+
bcm4377->bar2 + bcm4377->hw->bar2_offset + BCM4377_BAR2_FW_LO);
1866+
iowrite32(upper_32_bits(fw_dma),
1867+
bcm4377->bar2 + bcm4377->hw->bar2_offset + BCM4377_BAR2_FW_HI);
1868+
iowrite32(fw->size,
1869+
bcm4377->bar2 + bcm4377->hw->bar2_offset + BCM4377_BAR2_FW_SIZE);
18551870
iowrite32(0, bcm4377->bar0 + BCM4377_BAR0_FW_DOORBELL);
18561871

18571872
dev_dbg(&bcm4377->pdev->dev, "waiting for firmware to boot\n");
18581873

18591874
ret = wait_for_completion_interruptible_timeout(&bcm4377->event,
1860-
BCM4377_TIMEOUT);
1875+
BCM4377_BOOT_TIMEOUT);
18611876
if (ret == 0) {
18621877
ret = -ETIMEDOUT;
18631878
goto out_dma_free;
@@ -1908,16 +1923,16 @@ static int bcm4377_setup_rti(struct bcm4377_data *bcm4377)
19081923
dev_dbg(&bcm4377->pdev->dev, "RTI is in state 1\n");
19091924

19101925
/* allow access to the entire IOVA space again */
1911-
iowrite32(0, bcm4377->bar2 + BCM4377_BAR2_RTI_WINDOW_LO);
1912-
iowrite32(0, bcm4377->bar2 + BCM4377_BAR2_RTI_WINDOW_HI);
1926+
iowrite32(0, bcm4377->bar2 + bcm4377->hw->bar2_offset + BCM4377_BAR2_RTI_WINDOW_LO);
1927+
iowrite32(0, bcm4377->bar2 + bcm4377->hw->bar2_offset + BCM4377_BAR2_RTI_WINDOW_HI);
19131928
iowrite32(BCM4377_DMA_MASK,
1914-
bcm4377->bar2 + BCM4377_BAR2_RTI_WINDOW_SIZE);
1929+
bcm4377->bar2 + bcm4377->hw->bar2_offset + BCM4377_BAR2_RTI_WINDOW_SIZE);
19151930

19161931
/* setup "Converged IPC" context */
19171932
iowrite32(lower_32_bits(bcm4377->ctx_dma),
1918-
bcm4377->bar2 + BCM4377_BAR2_CONTEXT_ADDR_LO);
1933+
bcm4377->bar2 + bcm4377->hw->bar2_offset + BCM4377_BAR2_CONTEXT_ADDR_LO);
19191934
iowrite32(upper_32_bits(bcm4377->ctx_dma),
1920-
bcm4377->bar2 + BCM4377_BAR2_CONTEXT_ADDR_HI);
1935+
bcm4377->bar2 + bcm4377->hw->bar2_offset + BCM4377_BAR2_CONTEXT_ADDR_HI);
19211936
iowrite32(2, bcm4377->bar0 + BCM4377_BAR0_RTI_CONTROL);
19221937

19231938
ret = wait_for_completion_interruptible_timeout(&bcm4377->event,
@@ -2481,6 +2496,20 @@ static const struct bcm4377_hw bcm4377_hw_variants[] = {
24812496
.send_calibration = bcm4387_send_calibration,
24822497
.send_ptb = bcm4378_send_ptb,
24832498
},
2499+
2500+
[BCM4388] = {
2501+
.id = 0x4388,
2502+
.otp_offset = 0x415c,
2503+
.bar2_offset = 0x200000,
2504+
.bar0_window1 = 0x18002000,
2505+
.bar0_window2 = 0x18109000,
2506+
.bar0_core2_window2 = 0x18106000,
2507+
.has_bar0_core2_window2 = true,
2508+
.broken_mws_transport_config = true,
2509+
.broken_le_coded = true,
2510+
.send_calibration = bcm4388_send_calibration,
2511+
.send_ptb = bcm4378_send_ptb,
2512+
},
24842513
};
24852514

24862515
#define BCM4377_DEVID_ENTRY(id) \
@@ -2494,6 +2523,7 @@ static const struct pci_device_id bcm4377_devid_table[] = {
24942523
BCM4377_DEVID_ENTRY(4377),
24952524
BCM4377_DEVID_ENTRY(4378),
24962525
BCM4377_DEVID_ENTRY(4387),
2526+
BCM4377_DEVID_ENTRY(4388),
24972527
{},
24982528
};
24992529
MODULE_DEVICE_TABLE(pci, bcm4377_devid_table);

0 commit comments

Comments
 (0)