Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 970282d0 authored by David S. Miller's avatar David S. Miller
Browse files

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 2015-03-19

This wont the last 4.1 bluetooth-next pull request, but we've piled up
enough patches in less than a week that I wanted to save you from a
single huge "last-minute" pull somewhere closer to the merge window.

The main changes are:

 - Simultaneous LE & BR/EDR discovery support for HW that can do it
 - Complete LE OOB pairing support
 - More fine-grained mgmt-command access control (normal user can now do
   harmless read-only operations).
 - Added RF power amplifier support in cc2520 ieee802154 driver
 - Some cleanups/fixes in ieee802154 code

Please let me know if there are any issues pulling. Thanks.
====================

Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents c9bdc0dd ea6edfbc
Loading
Loading
Loading
Loading
+4 −0
Original line number Original line Diff line number Diff line
@@ -13,11 +13,15 @@ Required properties:
	- cca-gpio:		GPIO spec for the CCA pin
	- cca-gpio:		GPIO spec for the CCA pin
	- vreg-gpio:		GPIO spec for the VREG pin
	- vreg-gpio:		GPIO spec for the VREG pin
	- reset-gpio:		GPIO spec for the RESET pin
	- reset-gpio:		GPIO spec for the RESET pin
Optional properties:
	- amplified:		include if the CC2520 is connected to a CC2591 amplifier

Example:
Example:
	cc2520@0 {
	cc2520@0 {
		compatible = "ti,cc2520";
		compatible = "ti,cc2520";
		reg = <0>;
		reg = <0>;
		spi-max-frequency = <4000000>;
		spi-max-frequency = <4000000>;
		amplified;
		pinctrl-names = "default";
		pinctrl-names = "default";
		pinctrl-0 = <&cc2520_cape_pins>;
		pinctrl-0 = <&cc2520_cape_pins>;
		fifo-gpio = <&gpio1 18 0>;
		fifo-gpio = <&gpio1 18 0>;
+6 −2
Original line number Original line Diff line number Diff line
@@ -3019,6 +3019,7 @@ static int btusb_probe(struct usb_interface *intf,
		hdev->shutdown = btusb_shutdown_intel;
		hdev->shutdown = btusb_shutdown_intel;
		hdev->set_bdaddr = btusb_set_bdaddr_intel;
		hdev->set_bdaddr = btusb_set_bdaddr_intel;
		set_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks);
		set_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks);
		set_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks);
	}
	}


	if (id->driver_info & BTUSB_INTEL_NEW) {
	if (id->driver_info & BTUSB_INTEL_NEW) {
@@ -3042,6 +3043,7 @@ static int btusb_probe(struct usb_interface *intf,


	if (id->driver_info & BTUSB_ATH3012) {
	if (id->driver_info & BTUSB_ATH3012) {
		hdev->set_bdaddr = btusb_set_bdaddr_ath3012;
		hdev->set_bdaddr = btusb_set_bdaddr_ath3012;
		set_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks);
		set_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks);
		set_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks);
	}
	}


@@ -3085,6 +3087,8 @@ static int btusb_probe(struct usb_interface *intf,
		/* Fake CSR devices with broken commands */
		/* Fake CSR devices with broken commands */
		if (bcdDevice <= 0x100)
		if (bcdDevice <= 0x100)
			hdev->setup = btusb_setup_csr;
			hdev->setup = btusb_setup_csr;

		set_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks);
	}
	}


	if (id->driver_info & BTUSB_SNIFFER) {
	if (id->driver_info & BTUSB_SNIFFER) {
+1 −1
Original line number Original line Diff line number Diff line
@@ -325,7 +325,7 @@ at86rf230_read_subreg(struct at86rf230_local *lp,
	int rc;
	int rc;


	rc = __at86rf230_read(lp, addr, data);
	rc = __at86rf230_read(lp, addr, data);
	if (rc > 0)
	if (!rc)
		*data = (*data & mask) >> shift;
		*data = (*data & mask) >> shift;


	return rc;
	return rc;
+93 −57
Original line number Original line Diff line number Diff line
@@ -714,11 +714,45 @@ static irqreturn_t cc2520_sfd_isr(int irq, void *data)
	return IRQ_HANDLED;
	return IRQ_HANDLED;
}
}


static int cc2520_get_platform_data(struct spi_device *spi,
				    struct cc2520_platform_data *pdata)
{
	struct device_node *np = spi->dev.of_node;
	struct cc2520_private *priv = spi_get_drvdata(spi);

	if (!np) {
		struct cc2520_platform_data *spi_pdata = spi->dev.platform_data;
		if (!spi_pdata)
			return -ENOENT;
		*pdata = *spi_pdata;
		return 0;
	}

	pdata->fifo = of_get_named_gpio(np, "fifo-gpio", 0);
	priv->fifo_pin = pdata->fifo;

	pdata->fifop = of_get_named_gpio(np, "fifop-gpio", 0);

	pdata->sfd = of_get_named_gpio(np, "sfd-gpio", 0);
	pdata->cca = of_get_named_gpio(np, "cca-gpio", 0);
	pdata->vreg = of_get_named_gpio(np, "vreg-gpio", 0);
	pdata->reset = of_get_named_gpio(np, "reset-gpio", 0);

	pdata->amplified = of_property_read_bool(np, "amplified");

	return 0;
}

static int cc2520_hw_init(struct cc2520_private *priv)
static int cc2520_hw_init(struct cc2520_private *priv)
{
{
	u8 status = 0, state = 0xff;
	u8 status = 0, state = 0xff;
	int ret;
	int ret;
	int timeout = 100;
	int timeout = 100;
	struct cc2520_platform_data pdata;

	ret = cc2520_get_platform_data(priv->spi, &pdata);
	if (ret)
		goto err_ret;


	ret = cc2520_read_register(priv, CC2520_FSMSTAT1, &state);
	ret = cc2520_read_register(priv, CC2520_FSMSTAT1, &state);
	if (ret)
	if (ret)
@@ -741,11 +775,47 @@ static int cc2520_hw_init(struct cc2520_private *priv)


	dev_vdbg(&priv->spi->dev, "oscillator brought up\n");
	dev_vdbg(&priv->spi->dev, "oscillator brought up\n");


	/* Registers default value: section 28.1 in Datasheet */
	/* If the CC2520 is connected to a CC2591 amplifier, we must both
	 * configure GPIOs on the CC2520 to correctly configure the CC2591
	 * and change a couple settings of the CC2520 to work with the
	 * amplifier. See section 8 page 17 of TI application note AN065.
	 * http://www.ti.com/lit/an/swra229a/swra229a.pdf
	 */
	if (pdata.amplified) {
		ret = cc2520_write_register(priv, CC2520_TXPOWER, 0xF9);
		if (ret)
			goto err_ret;

		ret = cc2520_write_register(priv, CC2520_AGCCTRL1, 0x16);
		if (ret)
			goto err_ret;

		ret = cc2520_write_register(priv, CC2520_GPIOCTRL0, 0x46);
		if (ret)
			goto err_ret;

		ret = cc2520_write_register(priv, CC2520_GPIOCTRL5, 0x47);
		if (ret)
			goto err_ret;

		ret = cc2520_write_register(priv, CC2520_GPIOPOLARITY, 0x1e);
		if (ret)
			goto err_ret;

		ret = cc2520_write_register(priv, CC2520_TXCTRL, 0xc1);
		if (ret)
			goto err_ret;
	} else {
		ret = cc2520_write_register(priv, CC2520_TXPOWER, 0xF7);
		ret = cc2520_write_register(priv, CC2520_TXPOWER, 0xF7);
		if (ret)
		if (ret)
			goto err_ret;
			goto err_ret;


		ret = cc2520_write_register(priv, CC2520_AGCCTRL1, 0x11);
		if (ret)
			goto err_ret;
	}

	/* Registers default value: section 28.1 in Datasheet */
	ret = cc2520_write_register(priv, CC2520_CCACTRL0, 0x1A);
	ret = cc2520_write_register(priv, CC2520_CCACTRL0, 0x1A);
	if (ret)
	if (ret)
		goto err_ret;
		goto err_ret;
@@ -770,10 +840,6 @@ static int cc2520_hw_init(struct cc2520_private *priv)
	if (ret)
	if (ret)
		goto err_ret;
		goto err_ret;


	ret = cc2520_write_register(priv, CC2520_AGCCTRL1, 0x11);
	if (ret)
		goto err_ret;

	ret = cc2520_write_register(priv, CC2520_ADCTEST0, 0x10);
	ret = cc2520_write_register(priv, CC2520_ADCTEST0, 0x10);
	if (ret)
	if (ret)
		goto err_ret;
		goto err_ret;
@@ -808,40 +874,10 @@ static int cc2520_hw_init(struct cc2520_private *priv)
	return ret;
	return ret;
}
}


static struct cc2520_platform_data *
cc2520_get_platform_data(struct spi_device *spi)
{
	struct cc2520_platform_data *pdata;
	struct device_node *np = spi->dev.of_node;
	struct cc2520_private *priv = spi_get_drvdata(spi);

	if (!np)
		return spi->dev.platform_data;

	pdata = devm_kzalloc(&spi->dev, sizeof(*pdata), GFP_KERNEL);
	if (!pdata)
		goto done;

	pdata->fifo = of_get_named_gpio(np, "fifo-gpio", 0);
	priv->fifo_pin = pdata->fifo;

	pdata->fifop = of_get_named_gpio(np, "fifop-gpio", 0);

	pdata->sfd = of_get_named_gpio(np, "sfd-gpio", 0);
	pdata->cca = of_get_named_gpio(np, "cca-gpio", 0);
	pdata->vreg = of_get_named_gpio(np, "vreg-gpio", 0);
	pdata->reset = of_get_named_gpio(np, "reset-gpio", 0);

	spi->dev.platform_data = pdata;

done:
	return pdata;
}

static int cc2520_probe(struct spi_device *spi)
static int cc2520_probe(struct spi_device *spi)
{
{
	struct cc2520_private *priv;
	struct cc2520_private *priv;
	struct cc2520_platform_data *pdata;
	struct cc2520_platform_data pdata;
	int ret;
	int ret;


	priv = devm_kzalloc(&spi->dev, sizeof(*priv), GFP_KERNEL);
	priv = devm_kzalloc(&spi->dev, sizeof(*priv), GFP_KERNEL);
@@ -850,8 +886,8 @@ static int cc2520_probe(struct spi_device *spi)


	spi_set_drvdata(spi, priv);
	spi_set_drvdata(spi, priv);


	pdata = cc2520_get_platform_data(spi);
	ret = cc2520_get_platform_data(spi, &pdata);
	if (!pdata) {
	if (ret < 0) {
		dev_err(&spi->dev, "no platform data\n");
		dev_err(&spi->dev, "no platform data\n");
		return -EINVAL;
		return -EINVAL;
	}
	}
@@ -869,76 +905,76 @@ static int cc2520_probe(struct spi_device *spi)
	init_completion(&priv->tx_complete);
	init_completion(&priv->tx_complete);


	/* Request all the gpio's */
	/* Request all the gpio's */
	if (!gpio_is_valid(pdata->fifo)) {
	if (!gpio_is_valid(pdata.fifo)) {
		dev_err(&spi->dev, "fifo gpio is not valid\n");
		dev_err(&spi->dev, "fifo gpio is not valid\n");
		ret = -EINVAL;
		ret = -EINVAL;
		goto err_hw_init;
		goto err_hw_init;
	}
	}


	ret = devm_gpio_request_one(&spi->dev, pdata->fifo,
	ret = devm_gpio_request_one(&spi->dev, pdata.fifo,
				    GPIOF_IN, "fifo");
				    GPIOF_IN, "fifo");
	if (ret)
	if (ret)
		goto err_hw_init;
		goto err_hw_init;


	if (!gpio_is_valid(pdata->cca)) {
	if (!gpio_is_valid(pdata.cca)) {
		dev_err(&spi->dev, "cca gpio is not valid\n");
		dev_err(&spi->dev, "cca gpio is not valid\n");
		ret = -EINVAL;
		ret = -EINVAL;
		goto err_hw_init;
		goto err_hw_init;
	}
	}


	ret = devm_gpio_request_one(&spi->dev, pdata->cca,
	ret = devm_gpio_request_one(&spi->dev, pdata.cca,
				    GPIOF_IN, "cca");
				    GPIOF_IN, "cca");
	if (ret)
	if (ret)
		goto err_hw_init;
		goto err_hw_init;


	if (!gpio_is_valid(pdata->fifop)) {
	if (!gpio_is_valid(pdata.fifop)) {
		dev_err(&spi->dev, "fifop gpio is not valid\n");
		dev_err(&spi->dev, "fifop gpio is not valid\n");
		ret = -EINVAL;
		ret = -EINVAL;
		goto err_hw_init;
		goto err_hw_init;
	}
	}


	ret = devm_gpio_request_one(&spi->dev, pdata->fifop,
	ret = devm_gpio_request_one(&spi->dev, pdata.fifop,
				    GPIOF_IN, "fifop");
				    GPIOF_IN, "fifop");
	if (ret)
	if (ret)
		goto err_hw_init;
		goto err_hw_init;


	if (!gpio_is_valid(pdata->sfd)) {
	if (!gpio_is_valid(pdata.sfd)) {
		dev_err(&spi->dev, "sfd gpio is not valid\n");
		dev_err(&spi->dev, "sfd gpio is not valid\n");
		ret = -EINVAL;
		ret = -EINVAL;
		goto err_hw_init;
		goto err_hw_init;
	}
	}


	ret = devm_gpio_request_one(&spi->dev, pdata->sfd,
	ret = devm_gpio_request_one(&spi->dev, pdata.sfd,
				    GPIOF_IN, "sfd");
				    GPIOF_IN, "sfd");
	if (ret)
	if (ret)
		goto err_hw_init;
		goto err_hw_init;


	if (!gpio_is_valid(pdata->reset)) {
	if (!gpio_is_valid(pdata.reset)) {
		dev_err(&spi->dev, "reset gpio is not valid\n");
		dev_err(&spi->dev, "reset gpio is not valid\n");
		ret = -EINVAL;
		ret = -EINVAL;
		goto err_hw_init;
		goto err_hw_init;
	}
	}


	ret = devm_gpio_request_one(&spi->dev, pdata->reset,
	ret = devm_gpio_request_one(&spi->dev, pdata.reset,
				    GPIOF_OUT_INIT_LOW, "reset");
				    GPIOF_OUT_INIT_LOW, "reset");
	if (ret)
	if (ret)
		goto err_hw_init;
		goto err_hw_init;


	if (!gpio_is_valid(pdata->vreg)) {
	if (!gpio_is_valid(pdata.vreg)) {
		dev_err(&spi->dev, "vreg gpio is not valid\n");
		dev_err(&spi->dev, "vreg gpio is not valid\n");
		ret = -EINVAL;
		ret = -EINVAL;
		goto err_hw_init;
		goto err_hw_init;
	}
	}


	ret = devm_gpio_request_one(&spi->dev, pdata->vreg,
	ret = devm_gpio_request_one(&spi->dev, pdata.vreg,
				    GPIOF_OUT_INIT_LOW, "vreg");
				    GPIOF_OUT_INIT_LOW, "vreg");
	if (ret)
	if (ret)
		goto err_hw_init;
		goto err_hw_init;


	gpio_set_value(pdata->vreg, HIGH);
	gpio_set_value(pdata.vreg, HIGH);
	usleep_range(100, 150);
	usleep_range(100, 150);


	gpio_set_value(pdata->reset, HIGH);
	gpio_set_value(pdata.reset, HIGH);
	usleep_range(200, 250);
	usleep_range(200, 250);


	ret = cc2520_hw_init(priv);
	ret = cc2520_hw_init(priv);
@@ -947,7 +983,7 @@ static int cc2520_probe(struct spi_device *spi)


	/* Set up fifop interrupt */
	/* Set up fifop interrupt */
	ret = devm_request_irq(&spi->dev,
	ret = devm_request_irq(&spi->dev,
			       gpio_to_irq(pdata->fifop),
			       gpio_to_irq(pdata.fifop),
			       cc2520_fifop_isr,
			       cc2520_fifop_isr,
			       IRQF_TRIGGER_RISING,
			       IRQF_TRIGGER_RISING,
			       dev_name(&spi->dev),
			       dev_name(&spi->dev),
@@ -959,7 +995,7 @@ static int cc2520_probe(struct spi_device *spi)


	/* Set up sfd interrupt */
	/* Set up sfd interrupt */
	ret = devm_request_irq(&spi->dev,
	ret = devm_request_irq(&spi->dev,
			       gpio_to_irq(pdata->sfd),
			       gpio_to_irq(pdata.sfd),
			       cc2520_sfd_isr,
			       cc2520_sfd_isr,
			       IRQF_TRIGGER_FALLING,
			       IRQF_TRIGGER_FALLING,
			       dev_name(&spi->dev),
			       dev_name(&spi->dev),
+1 −0
Original line number Original line Diff line number Diff line
@@ -21,6 +21,7 @@ struct cc2520_platform_data {
	int sfd;
	int sfd;
	int reset;
	int reset;
	int vreg;
	int vreg;
	bool amplified;
};
};


#endif
#endif
Loading