summaryrefslogtreecommitdiff
path: root/kernel/drivers/net/ieee802154/dw3000_core.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/drivers/net/ieee802154/dw3000_core.c')
-rw-r--r--kernel/drivers/net/ieee802154/dw3000_core.c45
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