Skip to content

Commit 370d1da

Browse files
committed
Merge branch 'bits/100-bluetooth' into asahi-wip
2 parents d84dfd9 + 50771d6 commit 370d1da

1 file changed

Lines changed: 45 additions & 14 deletions

File tree

drivers/bluetooth/hci_bcm4377.c

Lines changed: 45 additions & 14 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
@@ -510,6 +513,7 @@ struct bcm4377_hw {
510513
u32 bar0_window1;
511514
u32 bar0_window2;
512515
u32 bar0_core2_window2;
516+
u32 bar2_offset;
513517

514518
unsigned long has_bar0_core2_window2 : 1;
515519
unsigned long clear_pciecfg_subsystem_ctrl_bit19 : 1;
@@ -835,8 +839,8 @@ static irqreturn_t bcm4377_irq(int irq, void *data)
835839
struct bcm4377_data *bcm4377 = data;
836840
u32 bootstage, rti_status;
837841

838-
bootstage = ioread32(bcm4377->bar2 + BCM4377_BAR2_BOOTSTAGE);
839-
rti_status = ioread32(bcm4377->bar2 + BCM4377_BAR2_RTI_STATUS);
842+
bootstage = ioread32(bcm4377->bar2 + bcm4377->hw->bar2_offset + BCM4377_BAR2_BOOTSTAGE);
843+
rti_status = ioread32(bcm4377->bar2 + bcm4377->hw->bar2_offset + BCM4377_BAR2_RTI_STATUS);
840844

841845
if (bootstage != bcm4377->bootstage ||
842846
rti_status != bcm4377->rti_status) {
@@ -1196,6 +1200,14 @@ static int bcm4387_send_calibration(struct bcm4377_data *bcm4377)
11961200
bcm4377->taurus_cal_size);
11971201
}
11981202

1203+
static int bcm4388_send_calibration(struct bcm4377_data *bcm4377)
1204+
{
1205+
/* Guess that these always use beamforming */
1206+
return __bcm4378_send_calibration(
1207+
bcm4377, bcm4377->taurus_beamforming_cal_blob,
1208+
bcm4377->taurus_beamforming_cal_size);
1209+
}
1210+
11991211
static const struct firmware *bcm4377_request_blob(struct bcm4377_data *bcm4377,
12001212
const char *suffix)
12011213
{
@@ -1819,8 +1831,8 @@ static int bcm4377_boot(struct bcm4377_data *bcm4377)
18191831
int ret = 0;
18201832
u32 bootstage, rti_status;
18211833

1822-
bootstage = ioread32(bcm4377->bar2 + BCM4377_BAR2_BOOTSTAGE);
1823-
rti_status = ioread32(bcm4377->bar2 + BCM4377_BAR2_RTI_STATUS);
1834+
bootstage = ioread32(bcm4377->bar2 + bcm4377->hw->bar2_offset + BCM4377_BAR2_BOOTSTAGE);
1835+
rti_status = ioread32(bcm4377->bar2 + bcm4377->hw->bar2_offset + BCM4377_BAR2_RTI_STATUS);
18241836

18251837
if (bootstage != 0) {
18261838
dev_err(&bcm4377->pdev->dev, "bootstage is %d and not 0\n",
@@ -1854,15 +1866,18 @@ static int bcm4377_boot(struct bcm4377_data *bcm4377)
18541866
iowrite32(BCM4377_DMA_MASK,
18551867
bcm4377->bar0 + BCM4377_BAR0_HOST_WINDOW_SIZE);
18561868

1857-
iowrite32(lower_32_bits(fw_dma), bcm4377->bar2 + BCM4377_BAR2_FW_LO);
1858-
iowrite32(upper_32_bits(fw_dma), bcm4377->bar2 + BCM4377_BAR2_FW_HI);
1859-
iowrite32(fw->size, bcm4377->bar2 + BCM4377_BAR2_FW_SIZE);
1869+
iowrite32(lower_32_bits(fw_dma),
1870+
bcm4377->bar2 + bcm4377->hw->bar2_offset + BCM4377_BAR2_FW_LO);
1871+
iowrite32(upper_32_bits(fw_dma),
1872+
bcm4377->bar2 + bcm4377->hw->bar2_offset + BCM4377_BAR2_FW_HI);
1873+
iowrite32(fw->size,
1874+
bcm4377->bar2 + bcm4377->hw->bar2_offset + BCM4377_BAR2_FW_SIZE);
18601875
iowrite32(0, bcm4377->bar0 + BCM4377_BAR0_FW_DOORBELL);
18611876

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

18641879
ret = wait_for_completion_interruptible_timeout(&bcm4377->event,
1865-
BCM4377_TIMEOUT);
1880+
BCM4377_BOOT_TIMEOUT);
18661881
if (ret == 0) {
18671882
ret = -ETIMEDOUT;
18681883
goto out_dma_free;
@@ -1913,16 +1928,16 @@ static int bcm4377_setup_rti(struct bcm4377_data *bcm4377)
19131928
dev_dbg(&bcm4377->pdev->dev, "RTI is in state 1\n");
19141929

19151930
/* allow access to the entire IOVA space again */
1916-
iowrite32(0, bcm4377->bar2 + BCM4377_BAR2_RTI_WINDOW_LO);
1917-
iowrite32(0, bcm4377->bar2 + BCM4377_BAR2_RTI_WINDOW_HI);
1931+
iowrite32(0, bcm4377->bar2 + bcm4377->hw->bar2_offset + BCM4377_BAR2_RTI_WINDOW_LO);
1932+
iowrite32(0, bcm4377->bar2 + bcm4377->hw->bar2_offset + BCM4377_BAR2_RTI_WINDOW_HI);
19181933
iowrite32(BCM4377_DMA_MASK,
1919-
bcm4377->bar2 + BCM4377_BAR2_RTI_WINDOW_SIZE);
1934+
bcm4377->bar2 + bcm4377->hw->bar2_offset + BCM4377_BAR2_RTI_WINDOW_SIZE);
19201935

19211936
/* setup "Converged IPC" context */
19221937
iowrite32(lower_32_bits(bcm4377->ctx_dma),
1923-
bcm4377->bar2 + BCM4377_BAR2_CONTEXT_ADDR_LO);
1938+
bcm4377->bar2 + bcm4377->hw->bar2_offset + BCM4377_BAR2_CONTEXT_ADDR_LO);
19241939
iowrite32(upper_32_bits(bcm4377->ctx_dma),
1925-
bcm4377->bar2 + BCM4377_BAR2_CONTEXT_ADDR_HI);
1940+
bcm4377->bar2 + bcm4377->hw->bar2_offset + BCM4377_BAR2_CONTEXT_ADDR_HI);
19261941
iowrite32(2, bcm4377->bar0 + BCM4377_BAR0_RTI_CONTROL);
19271942

19281943
ret = wait_for_completion_interruptible_timeout(&bcm4377->event,
@@ -2488,6 +2503,21 @@ static const struct bcm4377_hw bcm4377_hw_variants[] = {
24882503
.send_calibration = bcm4387_send_calibration,
24892504
.send_ptb = bcm4378_send_ptb,
24902505
},
2506+
2507+
[BCM4388] = {
2508+
.id = 0x4388,
2509+
.otp_offset = 0x415c,
2510+
.bar2_offset = 0x200000,
2511+
.bar0_window1 = 0x18002000,
2512+
.bar0_window2 = 0x18109000,
2513+
.bar0_core2_window2 = 0x18106000,
2514+
.has_bar0_core2_window2 = true,
2515+
.broken_mws_transport_config = true,
2516+
.broken_le_coded = true,
2517+
.broken_le_ext_adv_report_phy = true,
2518+
.send_calibration = bcm4388_send_calibration,
2519+
.send_ptb = bcm4378_send_ptb,
2520+
},
24912521
};
24922522

24932523
#define BCM4377_DEVID_ENTRY(id) \
@@ -2501,6 +2531,7 @@ static const struct pci_device_id bcm4377_devid_table[] = {
25012531
BCM4377_DEVID_ENTRY(4377),
25022532
BCM4377_DEVID_ENTRY(4378),
25032533
BCM4377_DEVID_ENTRY(4387),
2534+
BCM4377_DEVID_ENTRY(4388),
25042535
{},
25052536
};
25062537
MODULE_DEVICE_TABLE(pci, bcm4377_devid_table);

0 commit comments

Comments
 (0)