NFC 4.4 fixes
This is the 1st NFC fixes pull request for 4.4. It includes bug fixes and one fix for a build failure, all of them introduced with the first NFC pull request for 4.4. We have: - Fix nfcmrvl SPI driver potential build error due to a broken Kconfig dependency. - A few fixes for the firmware download implementation for the nfcmrvl UART driver. - A GPIO allocation leak for the nfcmrvl driver. - One code simplification for the nfcmrvl DT handling. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAABAgAGBQJWOpm4AAoJEIqAPN1PVmxKPkcP/2JfannhAqAeX6kJeR0tmLDU /urTpD5EETEpBxvKV+gVViLPbnGUDKxpgiU4o5Edp+vz3uEUN/uzftKHpCac+Gby AtnCQmoHpP79uiH/mAwMaYC6Ewo7i1rm3URQCdzGorTLx1Z4qlbQuoiXwDms3WzX kUOPd71S6H5yE4BJZAoMOYtrfp/06VR9TAPvKksyg8S/rcI/BYsl/Kqdfv0US7Em D2Nz4rUhRjWZpfva5FnHgfuJ7JrtOPa910upuHCVYDzJo/zXRzOAajn9ZpaMNL1d iyNbwtksJSnYrUZXh9prBhWu41deRPD2dB3M6pcwN0Afw9bAK9NwPbzNHOS9rtkA 97x3hFSV216ukdRNuLljd9cqVgh6KOXBjWjjacYhUFuyGM/3KzSYKqa+sGCZaYv3 NhLMdE9XeT9e7sCIUJLs3OTxIVJGM5igizemQOEbUV2AHth5B2dgLSkb88telTUD Hb477DgE5lXK1QGtrHW6gQKnhZ8wusZ/YA36IQoRF+rGDroy5fWmH5WIbRTpCThq BZuQfyznRfAEAfIHvc4FSkt8b1D8GQmsqux6mTDRXoDCdOV7rHP1InBAmpUUe8oO 05ieetfpXv4sW7VGSU6j+yJ7bw9zfgOVfJD556xEUYKgBfo743Yrbgk+wL+m3F0t +Tk2mISmjEpTzFOSB6dM =NK80 -----END PGP SIGNATURE----- Merge tag 'nfc-fixes-4.4-1' of git://git.kernel.org/pub/scm/linux/kernel/git/sameo/nfc-fixes Samuel Ortiz says: ==================== NFC 4.4 fixes This is the 1st NFC fixes pull request for 4.4. It includes bug fixes and one fix for a build failure, all of them introduced with the first NFC pull request for 4.4. We have: - Fix nfcmrvl SPI driver potential build error due to a broken Kconfig dependency. - A few fixes for the firmware download implementation for the nfcmrvl UART driver. - A GPIO allocation leak for the nfcmrvl driver. - One code simplification for the nfcmrvl DT handling. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
fb9a10d9d8
|
@ -44,7 +44,7 @@ config NFC_MRVL_I2C
|
||||||
|
|
||||||
config NFC_MRVL_SPI
|
config NFC_MRVL_SPI
|
||||||
tristate "Marvell NFC-over-SPI driver"
|
tristate "Marvell NFC-over-SPI driver"
|
||||||
depends on NFC_MRVL && SPI
|
depends on NFC_MRVL && NFC_NCI_SPI
|
||||||
help
|
help
|
||||||
Marvell NFC-over-SPI driver.
|
Marvell NFC-over-SPI driver.
|
||||||
|
|
||||||
|
|
|
@ -113,9 +113,12 @@ static void fw_dnld_over(struct nfcmrvl_private *priv, u32 error)
|
||||||
}
|
}
|
||||||
|
|
||||||
atomic_set(&priv->ndev->cmd_cnt, 0);
|
atomic_set(&priv->ndev->cmd_cnt, 0);
|
||||||
del_timer_sync(&priv->ndev->cmd_timer);
|
|
||||||
|
|
||||||
del_timer_sync(&priv->fw_dnld.timer);
|
if (timer_pending(&priv->ndev->cmd_timer))
|
||||||
|
del_timer_sync(&priv->ndev->cmd_timer);
|
||||||
|
|
||||||
|
if (timer_pending(&priv->fw_dnld.timer))
|
||||||
|
del_timer_sync(&priv->fw_dnld.timer);
|
||||||
|
|
||||||
nfc_info(priv->dev, "FW loading over (%d)]\n", error);
|
nfc_info(priv->dev, "FW loading over (%d)]\n", error);
|
||||||
|
|
||||||
|
@ -472,9 +475,12 @@ void nfcmrvl_fw_dnld_deinit(struct nfcmrvl_private *priv)
|
||||||
void nfcmrvl_fw_dnld_recv_frame(struct nfcmrvl_private *priv,
|
void nfcmrvl_fw_dnld_recv_frame(struct nfcmrvl_private *priv,
|
||||||
struct sk_buff *skb)
|
struct sk_buff *skb)
|
||||||
{
|
{
|
||||||
|
/* Discard command timer */
|
||||||
|
if (timer_pending(&priv->ndev->cmd_timer))
|
||||||
|
del_timer_sync(&priv->ndev->cmd_timer);
|
||||||
|
|
||||||
/* Allow next command */
|
/* Allow next command */
|
||||||
atomic_set(&priv->ndev->cmd_cnt, 1);
|
atomic_set(&priv->ndev->cmd_cnt, 1);
|
||||||
del_timer_sync(&priv->ndev->cmd_timer);
|
|
||||||
|
|
||||||
/* Queue and trigger rx work */
|
/* Queue and trigger rx work */
|
||||||
skb_queue_tail(&priv->fw_dnld.rx_q, skb);
|
skb_queue_tail(&priv->fw_dnld.rx_q, skb);
|
||||||
|
|
|
@ -194,6 +194,9 @@ void nfcmrvl_nci_unregister_dev(struct nfcmrvl_private *priv)
|
||||||
|
|
||||||
nfcmrvl_fw_dnld_deinit(priv);
|
nfcmrvl_fw_dnld_deinit(priv);
|
||||||
|
|
||||||
|
if (priv->config.reset_n_io)
|
||||||
|
devm_gpio_free(priv->dev, priv->config.reset_n_io);
|
||||||
|
|
||||||
nci_unregister_device(ndev);
|
nci_unregister_device(ndev);
|
||||||
nci_free_device(ndev);
|
nci_free_device(ndev);
|
||||||
kfree(priv);
|
kfree(priv);
|
||||||
|
@ -251,8 +254,6 @@ void nfcmrvl_chip_halt(struct nfcmrvl_private *priv)
|
||||||
gpio_set_value(priv->config.reset_n_io, 0);
|
gpio_set_value(priv->config.reset_n_io, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_OF
|
|
||||||
|
|
||||||
int nfcmrvl_parse_dt(struct device_node *node,
|
int nfcmrvl_parse_dt(struct device_node *node,
|
||||||
struct nfcmrvl_platform_data *pdata)
|
struct nfcmrvl_platform_data *pdata)
|
||||||
{
|
{
|
||||||
|
@ -275,16 +276,6 @@ int nfcmrvl_parse_dt(struct device_node *node,
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
int nfcmrvl_parse_dt(struct device_node *node,
|
|
||||||
struct nfcmrvl_platform_data *pdata)
|
|
||||||
{
|
|
||||||
return -ENODEV;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
EXPORT_SYMBOL_GPL(nfcmrvl_parse_dt);
|
EXPORT_SYMBOL_GPL(nfcmrvl_parse_dt);
|
||||||
|
|
||||||
MODULE_AUTHOR("Marvell International Ltd.");
|
MODULE_AUTHOR("Marvell International Ltd.");
|
||||||
|
|
|
@ -67,8 +67,6 @@ static struct nfcmrvl_if_ops uart_ops = {
|
||||||
.nci_update_config = nfcmrvl_uart_nci_update_config
|
.nci_update_config = nfcmrvl_uart_nci_update_config
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef CONFIG_OF
|
|
||||||
|
|
||||||
static int nfcmrvl_uart_parse_dt(struct device_node *node,
|
static int nfcmrvl_uart_parse_dt(struct device_node *node,
|
||||||
struct nfcmrvl_platform_data *pdata)
|
struct nfcmrvl_platform_data *pdata)
|
||||||
{
|
{
|
||||||
|
@ -102,16 +100,6 @@ static int nfcmrvl_uart_parse_dt(struct device_node *node,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
static int nfcmrvl_uart_parse_dt(struct device_node *node,
|
|
||||||
struct nfcmrvl_platform_data *pdata)
|
|
||||||
{
|
|
||||||
return -ENODEV;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** NCI UART OPS
|
** NCI UART OPS
|
||||||
*/
|
*/
|
||||||
|
@ -152,10 +140,6 @@ static int nfcmrvl_nci_uart_open(struct nci_uart *nu)
|
||||||
nu->drv_data = priv;
|
nu->drv_data = priv;
|
||||||
nu->ndev = priv->ndev;
|
nu->ndev = priv->ndev;
|
||||||
|
|
||||||
/* Set BREAK */
|
|
||||||
if (priv->config.break_control && nu->tty->ops->break_ctl)
|
|
||||||
nu->tty->ops->break_ctl(nu->tty, -1);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -174,6 +158,9 @@ static void nfcmrvl_nci_uart_tx_start(struct nci_uart *nu)
|
||||||
{
|
{
|
||||||
struct nfcmrvl_private *priv = (struct nfcmrvl_private *)nu->drv_data;
|
struct nfcmrvl_private *priv = (struct nfcmrvl_private *)nu->drv_data;
|
||||||
|
|
||||||
|
if (priv->ndev->nfc_dev->fw_download_in_progress)
|
||||||
|
return;
|
||||||
|
|
||||||
/* Remove BREAK to wake up the NFCC */
|
/* Remove BREAK to wake up the NFCC */
|
||||||
if (priv->config.break_control && nu->tty->ops->break_ctl) {
|
if (priv->config.break_control && nu->tty->ops->break_ctl) {
|
||||||
nu->tty->ops->break_ctl(nu->tty, 0);
|
nu->tty->ops->break_ctl(nu->tty, 0);
|
||||||
|
@ -185,13 +172,18 @@ static void nfcmrvl_nci_uart_tx_done(struct nci_uart *nu)
|
||||||
{
|
{
|
||||||
struct nfcmrvl_private *priv = (struct nfcmrvl_private *)nu->drv_data;
|
struct nfcmrvl_private *priv = (struct nfcmrvl_private *)nu->drv_data;
|
||||||
|
|
||||||
|
if (priv->ndev->nfc_dev->fw_download_in_progress)
|
||||||
|
return;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** To ensure that if the NFCC goes in DEEP SLEEP sate we can wake him
|
** To ensure that if the NFCC goes in DEEP SLEEP sate we can wake him
|
||||||
** up. we set BREAK. Once we will be ready to send again we will remove
|
** up. we set BREAK. Once we will be ready to send again we will remove
|
||||||
** it.
|
** it.
|
||||||
*/
|
*/
|
||||||
if (priv->config.break_control && nu->tty->ops->break_ctl)
|
if (priv->config.break_control && nu->tty->ops->break_ctl) {
|
||||||
nu->tty->ops->break_ctl(nu->tty, -1);
|
nu->tty->ops->break_ctl(nu->tty, -1);
|
||||||
|
usleep_range(1000, 3000);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct nci_uart nfcmrvl_nci_uart = {
|
static struct nci_uart nfcmrvl_nci_uart = {
|
||||||
|
|
Loading…
Reference in New Issue