diff options
Diffstat (limited to 'kernel/drivers/net/ieee802154/dw3000_core.c')
-rw-r--r-- | kernel/drivers/net/ieee802154/dw3000_core.c | 45 |
1 files changed, 41 insertions, 4 deletions
diff --git a/kernel/drivers/net/ieee802154/dw3000_core.c b/kernel/drivers/net/ieee802154/dw3000_core.c index 4b384b9..0419221 100644 --- a/kernel/drivers/net/ieee802154/dw3000_core.c +++ b/kernel/drivers/net/ieee802154/dw3000_core.c @@ -187,8 +187,8 @@ const struct dw3000_chip_version dw3000_chip_versions[] = { #define DW3000_TXRXSWITCH_TX 0x01011100 #define DW3000_TXRXSWITCH_AUTO 0x1C000000 -#define DW3000_RF_TXCTRL_CH5 0x1C071134UL -#define DW3000_RF_TXCTRL_CH9 0x1C010034UL +#define DW3000_RF_TXCTRL_CH5 0x1C081134UL +#define DW3000_RF_TXCTRL_CH9 0x1C020034UL #define DW3000_RF_TXCTRL_LO_B2 0x0E #define DW3000_RF_PLL_CFG_CH5 0x1F3C #define DW3000_RF_PLL_CFG_CH9 0x0F3C @@ -297,6 +297,12 @@ enum ciadiag_dbl_options { /* Disable CIA diagnostic. CIACONFIG's bit-4 in RX_ANTENNA_DELAY + 1 */ #define DW3000_CIA_CONFIG_DIAG_OFF (0x1 << 4) +/* LDO VOUT value */ +#define DW3000_RF_LDO_VOUT 0x0D7FFFFFUL + +/* PLL common value */ +#define DW3000_RF_PLL_COMMON 0xE104 + struct dw3000_ciadiag_reg_info { u32 diag1; u32 diag12; @@ -1796,6 +1802,12 @@ static int dw3000_power_supply(struct dw3000 *dw, int onoff) onoff ? "enable" : "disable", rc); return rc; } + /* Set 2p5 reg to 2.7V */ + rc = regulator_set_voltage(power->regulator_2p5, 2700000, 2700000); + if (rc < 0) { + dev_err(dw->dev, "regulator failed to set voltage :%d\n", rc); + return rc; + } rc = dw3000_power_supply_one(power->regulator_vdd, onoff); if (rc < 0) { @@ -1823,6 +1835,7 @@ static int dw3000_power_supply(struct dw3000 *dw, int onoff) static int dw3000_reset_assert(struct dw3000 *dw, bool reset) { int rc; + int value; if (!gpio_is_valid(dw->reset_gpio)) { dev_err(dw->dev, "invalid reset gpio\n"); @@ -1838,10 +1851,22 @@ static int dw3000_reset_assert(struct dw3000 *dw, bool reset) } else { /* Release RESET GPIO. * Reset should be open drain, or switched to input whenever not driven - * low. It should not be driven high. */ + * low. It should not be driven high during chip cold boot process. */ rc = gpio_direction_input(dw->reset_gpio); - if (rc) + if (rc) { dev_err(dw->dev, "Could not set reset gpio as input\n"); + return rc; + } + /* check if dw3000 finishes cold boot */ + value = gpio_get_value(dw->reset_gpio); + if (!value) { + return -EPROBE_DEFER; + } + + /* set pin to output and drive high */ + rc = gpio_direction_output(dw->reset_gpio, 1); + if (rc) + dev_err(dw->dev, "Could not set reset gpio as output\n"); } return rc; } @@ -4253,6 +4278,11 @@ static inline int dw3000_configure_rf(struct dw3000 *dw) rc = dw3000_reg_write16(dw, DW3000_PLL_CFG_ID, 0, rf_pll_cfg); if (rc) return rc; + + rc = dw3000_reg_write16(dw, DW3000_PLL_COMMON_ID, 0, DW3000_RF_PLL_COMMON); + if (rc) + return rc; + rc = dw3000_reg_write8(dw, DW3000_LDO_RLOAD_ID, 1, DW3000_LDO_RLOAD_VAL_B1); if (rc) @@ -4390,6 +4420,8 @@ int dw3000_configure_chan(struct dw3000 *dw) rc = dw3000_configure_rf(dw); if (rc) return rc; + /* Disable AGC */ + dw3000_reg_modify32(dw, DW3000_AGC_CFG_ID, 0, DW3000_AGC_DIS_MASK, 0); /* Configure DGC. */ return dw3000_configure_dgc(dw); } @@ -5213,6 +5245,8 @@ static int dw3000_configure(struct dw3000 *dw) /* Update configuration dependent timings */ dw3000_update_timings(dw); + /* update VOUT */ + rc = dw3000_reg_write32(dw, DW3000_LDO_VOUT_ID, 0, DW3000_RF_LDO_VOUT); return rc; } @@ -7453,6 +7487,9 @@ static inline int dw3000_isr_handle_spi_ready(struct dw3000 *dw, /* TODO: So, just add below this line more required unsaved registers * setup. */ + rc = dw3000_reg_write32(dw, DW3000_LDO_VOUT_ID, 0, DW3000_RF_LDO_VOUT); + if (rc) + return rc; setuperror: #ifdef CONFIG_DW3000_DEBUG |