Re: [Linaro-mm-sig] [PATCH 2/4] staging: android: ion: Restrict cache maintenance to dma mapped memory

2019-02-06 Thread Christoph Hellwig
The CPU may only access DMA mapped memory if ownership has been
transferred back to the CPU using dma_sync_{single,sg}_to_cpu, and then
before the device can access it again ownership needs to be transferred
back to the device using dma_sync_{single,sg}_to_device.

> I've run some testing, and this patch does indeed fix the crash in
> dma_sync_sg_for_cpu when it tried to use the 0 dma_address from the sg
> list.
> 
> Tested-by: Ørjan Eide 
> 
> I tested this on an older kernel, v4.14, since the dma-mapping code
> moved, in v4.19, to ignore the dma_address and instead use sg_phys() to
> get a valid address from the page, which is always valid in the ion sg
> lists. While this wouldn't crash on newer kernels, it's still good to
> avoid the unnecessary work when no CMO is needed.

Can you also test is with CONFIG_DMA_API_DEBUG enabled, as that should
catch all the usual mistakes in DMA API usage, including the one found?
___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 6/9] staging: wilc1000: added 'wilc_' prefix for function in wilc_sdio.c file

2019-02-06 Thread Ajay.Kathat
From: Ajay Singh 

Cleanup patch to have proper follow clear namespace in wilc_sdio.c file.

Signed-off-by: Ajay Singh 
---
 drivers/staging/wilc1000/wilc_sdio.c | 92 ++--
 1 file changed, 46 insertions(+), 46 deletions(-)

diff --git a/drivers/staging/wilc1000/wilc_sdio.c 
b/drivers/staging/wilc1000/wilc_sdio.c
index a62eabe..2ca6757 100644
--- a/drivers/staging/wilc1000/wilc_sdio.c
+++ b/drivers/staging/wilc1000/wilc_sdio.c
@@ -166,7 +166,7 @@ static void linux_sdio_remove(struct sdio_func *func)
wilc_netdev_cleanup(wilc);
 }
 
-static int sdio_reset(struct wilc *wilc)
+static int wilc_sdio_reset(struct wilc *wilc)
 {
struct sdio_cmd52 cmd;
int ret;
@@ -201,7 +201,7 @@ static int wilc_sdio_suspend(struct device *dev)
chip_allow_sleep(wilc);
}
 
-   ret = sdio_reset(wilc);
+   ret = wilc_sdio_reset(wilc);
if (ret) {
dev_err(&func->dev, "Fail reset sdio\n");
return ret;
@@ -245,7 +245,7 @@ static void wilc_sdio_disable_interrupt(struct wilc *dev)
  *
  /
 
-static int sdio_set_func0_csa_address(struct wilc *wilc, u32 adr)
+static int wilc_sdio_set_func0_csa_address(struct wilc *wilc, u32 adr)
 {
struct sdio_func *func = dev_to_sdio_func(wilc->dev);
struct sdio_cmd52 cmd;
@@ -286,7 +286,7 @@ static int sdio_set_func0_csa_address(struct wilc *wilc, 
u32 adr)
return 0;
 }
 
-static int sdio_set_func0_block_size(struct wilc *wilc, u32 block_size)
+static int wilc_sdio_set_func0_block_size(struct wilc *wilc, u32 block_size)
 {
struct sdio_func *func = dev_to_sdio_func(wilc->dev);
struct sdio_cmd52 cmd;
@@ -322,7 +322,7 @@ static int sdio_set_func0_block_size(struct wilc *wilc, u32 
block_size)
  *
  /
 
-static int sdio_set_func1_block_size(struct wilc *wilc, u32 block_size)
+static int wilc_sdio_set_func1_block_size(struct wilc *wilc, u32 block_size)
 {
struct sdio_func *func = dev_to_sdio_func(wilc->dev);
struct sdio_cmd52 cmd;
@@ -356,7 +356,7 @@ static int sdio_set_func1_block_size(struct wilc *wilc, u32 
block_size)
  *  Sdio interfaces
  *
  /
-static int sdio_write_reg(struct wilc *wilc, u32 addr, u32 data)
+static int wilc_sdio_write_reg(struct wilc *wilc, u32 addr, u32 data)
 {
struct sdio_func *func = dev_to_sdio_func(wilc->dev);
struct wilc_sdio *sdio_priv = wilc->bus_data;
@@ -384,7 +384,7 @@ static int sdio_write_reg(struct wilc *wilc, u32 addr, u32 
data)
/**
 *  set the AHB address
 **/
-   if (!sdio_set_func0_csa_address(wilc, addr))
+   if (!wilc_sdio_set_func0_csa_address(wilc, addr))
goto fail;
 
cmd.read_write = 1;
@@ -410,7 +410,7 @@ static int sdio_write_reg(struct wilc *wilc, u32 addr, u32 
data)
return 0;
 }
 
-static int sdio_write(struct wilc *wilc, u32 addr, u8 *buf, u32 size)
+static int wilc_sdio_write(struct wilc *wilc, u32 addr, u8 *buf, u32 size)
 {
struct sdio_func *func = dev_to_sdio_func(wilc->dev);
struct wilc_sdio *sdio_priv = wilc->bus_data;
@@ -459,7 +459,7 @@ static int sdio_write(struct wilc *wilc, u32 addr, u8 *buf, 
u32 size)
cmd.buffer = buf;
cmd.block_size = block_size;
if (addr > 0) {
-   if (!sdio_set_func0_csa_address(wilc, addr))
+   if (!wilc_sdio_set_func0_csa_address(wilc, addr))
goto fail;
}
ret = wilc_sdio_cmd53(wilc, &cmd);
@@ -482,7 +482,7 @@ static int sdio_write(struct wilc *wilc, u32 addr, u8 *buf, 
u32 size)
cmd.block_size = block_size;
 
if (addr > 0) {
-   if (!sdio_set_func0_csa_address(wilc, addr))
+   if (!wilc_sdio_set_func0_csa_address(wilc, addr))
goto fail;
}
ret = wilc_sdio_cmd53(wilc, &cmd);
@@ -500,7 +500,7 @@ static int sdio_write(struct wilc *wilc, u32 addr, u8 *buf, 
u32 size)
return 0;
 }
 
-static int sdio_read_reg(struct wilc *wilc, u32 addr, u32 *data)
+static int wilc_sdio_read_reg(struct wilc *wilc, u32 addr, u32 *data)
 {
struct sdio_func *func = dev_to_sdio_func(wilc->dev);
struct wilc_sdio *sdio_priv = wilc->bus_data;
@@ -523,7 +523,7 @@ static int sdio_read_reg(struct wilc *wilc, u32 addr, u32 
*data)
} else {
struct sdio_cmd53 cmd;
 
-   if (!sdio_set_func0_csa_address(wilc, addr))
+   if (!wilc_sdio_set_func0_csa_address(wilc, addr))
goto fail;
 
cmd.read_write = 0;
@@ -552,7 +552,7 @@ static int sdio_read_reg(struct wilc *wilc, u32 addr, u32 
*data)
return 0

[PATCH 9/9] staging: wilc1000: rename linux_wlan.c and linux_mon.c

2019-02-06 Thread Ajay.Kathat
From: Ajay Singh 

Rename linux_wlan.c and linux_mon.c to wilc_netdev.c and wilc_mon.c to
include 'wilc_' prefix.

Signed-off-by: Ajay Singh 
---
 drivers/staging/wilc1000/Makefile| 2 +-
 drivers/staging/wilc1000/{linux_mon.c => wilc_mon.c} | 0
 drivers/staging/wilc1000/{linux_wlan.c => wilc_netdev.c} | 0
 3 files changed, 1 insertion(+), 1 deletion(-)
 rename drivers/staging/wilc1000/{linux_mon.c => wilc_mon.c} (100%)
 rename drivers/staging/wilc1000/{linux_wlan.c => wilc_netdev.c} (100%)

diff --git a/drivers/staging/wilc1000/Makefile 
b/drivers/staging/wilc1000/Makefile
index 72a4daa..2ad3fee 100644
--- a/drivers/staging/wilc1000/Makefile
+++ b/drivers/staging/wilc1000/Makefile
@@ -4,7 +4,7 @@ obj-$(CONFIG_WILC1000) += wilc1000.o
 ccflags-y += -DFIRMWARE_1002=\"atmel/wilc1002_firmware.bin\" \
-DFIRMWARE_1003=\"atmel/wilc1003_firmware.bin\"
 
-wilc1000-objs := wilc_wfi_cfgoperations.o linux_wlan.o linux_mon.o \
+wilc1000-objs := wilc_wfi_cfgoperations.o wilc_netdev.o wilc_mon.o \
host_interface.o wilc_wlan_cfg.o wilc_wlan.o
 
 obj-$(CONFIG_WILC1000_SDIO) += wilc1000-sdio.o
diff --git a/drivers/staging/wilc1000/linux_mon.c 
b/drivers/staging/wilc1000/wilc_mon.c
similarity index 100%
rename from drivers/staging/wilc1000/linux_mon.c
rename to drivers/staging/wilc1000/wilc_mon.c
diff --git a/drivers/staging/wilc1000/linux_wlan.c 
b/drivers/staging/wilc1000/wilc_netdev.c
similarity index 100%
rename from drivers/staging/wilc1000/linux_wlan.c
rename to drivers/staging/wilc1000/wilc_netdev.c
-- 
2.7.4

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 8/9] staging: wilc1000: remove 'linux_' prefix in function names

2019-02-06 Thread Ajay.Kathat
From: Ajay Singh 

Remove 'linux_' prefix and replace it with 'wilc_' namespace.

Signed-off-by: Ajay Singh 
---
 drivers/staging/wilc1000/linux_wlan.c | 17 -
 drivers/staging/wilc1000/wilc_sdio.c  | 10 +-
 2 files changed, 13 insertions(+), 14 deletions(-)

diff --git a/drivers/staging/wilc1000/linux_wlan.c 
b/drivers/staging/wilc1000/linux_wlan.c
index 533e444..5c05504 100644
--- a/drivers/staging/wilc1000/linux_wlan.c
+++ b/drivers/staging/wilc1000/linux_wlan.c
@@ -139,7 +139,7 @@ int wilc_wlan_get_num_conn_ifcs(struct wilc *wilc)
return ret_val;
 }
 
-static int linux_wlan_txq_task(void *vp)
+static int wilc_txq_task(void *vp)
 {
int ret;
u32 txq_count;
@@ -202,7 +202,7 @@ static int wilc_wlan_get_firmware(struct net_device *dev)
return ret;
 }
 
-static int linux_wlan_start_firmware(struct net_device *dev)
+static int wilc_start_firmware(struct net_device *dev)
 {
struct wilc_vif *vif = netdev_priv(dev);
struct wilc *wilc = vif->wilc;
@@ -243,8 +243,7 @@ static int wilc1000_firmware_download(struct net_device 
*dev)
return 0;
 }
 
-static int linux_wlan_init_fw_config(struct net_device *dev,
-struct wilc_vif *vif)
+static int wilc_init_fw_config(struct net_device *dev, struct wilc_vif *vif)
 {
struct wilc_priv *priv;
struct host_if_drv *hif_drv;
@@ -502,7 +501,7 @@ static int wlan_initialize_threads(struct net_device *dev)
struct wilc_vif *vif = netdev_priv(dev);
struct wilc *wilc = vif->wilc;
 
-   wilc->txq_thread = kthread_run(linux_wlan_txq_task, (void *)dev,
+   wilc->txq_thread = kthread_run(wilc_txq_task, (void *)dev,
   "K_TXQ_TASK");
if (IS_ERR(wilc->txq_thread)) {
netdev_err(dev, "couldn't create TXQ thread\n");
@@ -560,7 +559,7 @@ static int wilc_wlan_initialize(struct net_device *dev, 
struct wilc_vif *vif)
goto fail_irq_enable;
}
 
-   ret = linux_wlan_start_firmware(dev);
+   ret = wilc_start_firmware(dev);
if (ret < 0) {
ret = -EIO;
goto fail_irq_enable;
@@ -576,7 +575,7 @@ static int wilc_wlan_initialize(struct net_device *dev, 
struct wilc_vif *vif)
firmware_ver[size] = '\0';
netdev_dbg(dev, "Firmware Ver = %s\n", firmware_ver);
}
-   ret = linux_wlan_init_fw_config(dev, vif);
+   ret = wilc_init_fw_config(dev, vif);
 
if (ret < 0) {
netdev_err(dev, "Failed to configure firmware\n");
@@ -726,7 +725,7 @@ static void wilc_set_multicast_list(struct net_device *dev)
kfree(mc_list);
 }
 
-static void linux_wlan_tx_complete(void *priv, int status)
+static void wilc_tx_complete(void *priv, int status)
 {
struct tx_complete_data *pv_data = priv;
 
@@ -762,7 +761,7 @@ netdev_tx_t wilc_mac_xmit(struct sk_buff *skb, struct 
net_device *ndev)
tx_data->bssid = wilc->vif[vif->idx]->bssid;
queue_count = wilc_wlan_txq_add_net_pkt(ndev, (void *)tx_data,
tx_data->buff, tx_data->size,
-   linux_wlan_tx_complete);
+   wilc_tx_complete);
 
if (queue_count > FLOW_CONTROL_UPPER_THRESHOLD) {
if (wilc->vif[0]->mac_opened)
diff --git a/drivers/staging/wilc1000/wilc_sdio.c 
b/drivers/staging/wilc1000/wilc_sdio.c
index 2ca6757..b789c57 100644
--- a/drivers/staging/wilc1000/wilc_sdio.c
+++ b/drivers/staging/wilc1000/wilc_sdio.c
@@ -117,8 +117,8 @@ static int wilc_sdio_cmd53(struct wilc *wilc, struct 
sdio_cmd53 *cmd)
return ret;
 }
 
-static int linux_sdio_probe(struct sdio_func *func,
-   const struct sdio_device_id *id)
+static int wilc_sdio_probe(struct sdio_func *func,
+  const struct sdio_device_id *id)
 {
struct wilc *wilc;
int ret;
@@ -156,7 +156,7 @@ static int linux_sdio_probe(struct sdio_func *func,
return 0;
 }
 
-static void linux_sdio_remove(struct sdio_func *func)
+static void wilc_sdio_remove(struct sdio_func *func)
 {
struct wilc *wilc = sdio_get_drvdata(func);
 
@@ -1127,8 +1127,8 @@ static const struct dev_pm_ops wilc_sdio_pm_ops = {
 static struct sdio_driver wilc_sdio_driver = {
.name   = SDIO_MODALIAS,
.id_table   = wilc_sdio_ids,
-   .probe  = linux_sdio_probe,
-   .remove = linux_sdio_remove,
+   .probe  = wilc_sdio_probe,
+   .remove = wilc_sdio_remove,
.drv = {
.pm = &wilc_sdio_pm_ops,
.of_match_table = wilc_of_match,
-- 
2.7.4

___
devel mailing list
de...@linuxdriverproject.org
http:/

[PATCH 7/9] staging: wilc1000: rename wilc_frmw_to_linux()

2019-02-06 Thread Ajay.Kathat
From: Ajay Singh 

Rename wilc_frmw_to_linux() to wilc_frmw_to_host() to be remove the _linux
suffix.

Signed-off-by: Ajay Singh 
---
 drivers/staging/wilc1000/linux_wlan.c | 3 ++-
 drivers/staging/wilc1000/wilc_wfi_netdevice.h | 2 +-
 drivers/staging/wilc1000/wilc_wlan.c  | 5 ++---
 3 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/drivers/staging/wilc1000/linux_wlan.c 
b/drivers/staging/wilc1000/linux_wlan.c
index b279811..533e444 100644
--- a/drivers/staging/wilc1000/linux_wlan.c
+++ b/drivers/staging/wilc1000/linux_wlan.c
@@ -803,7 +803,8 @@ static int wilc_mac_close(struct net_device *ndev)
return 0;
 }
 
-void wilc_frmw_to_linux(struct wilc *wilc, u8 *buff, u32 size, u32 pkt_offset)
+void wilc_frmw_to_host(struct wilc *wilc, u8 *buff, u32 size,
+  u32 pkt_offset)
 {
unsigned int frame_len = 0;
int stats;
diff --git a/drivers/staging/wilc1000/wilc_wfi_netdevice.h 
b/drivers/staging/wilc1000/wilc_wfi_netdevice.h
index 2b9b8b5..df00762 100644
--- a/drivers/staging/wilc1000/wilc_wfi_netdevice.h
+++ b/drivers/staging/wilc1000/wilc_wfi_netdevice.h
@@ -281,7 +281,7 @@ struct wilc_wfi_mon_priv {
struct net_device *real_ndev;
 };
 
-void wilc_frmw_to_linux(struct wilc *wilc, u8 *buff, u32 size, u32 pkt_offset);
+void wilc_frmw_to_host(struct wilc *wilc, u8 *buff, u32 size, u32 pkt_offset);
 void wilc_mac_indicate(struct wilc *wilc);
 void wilc_netdev_cleanup(struct wilc *wilc);
 int wilc_netdev_init(struct wilc **wilc, struct device *dev, int io_type,
diff --git a/drivers/staging/wilc1000/wilc_wlan.c 
b/drivers/staging/wilc1000/wilc_wlan.c
index af1c4d8..c238969 100644
--- a/drivers/staging/wilc1000/wilc_wlan.c
+++ b/drivers/staging/wilc1000/wilc_wlan.c
@@ -717,9 +717,8 @@ static void wilc_wlan_handle_rx_buff(struct wilc *wilc, u8 
*buffer, int size)
} else {
if (!is_cfg_packet) {
if (pkt_len > 0) {
-   wilc_frmw_to_linux(wilc, buff_ptr,
-  pkt_len,
-  pkt_offset);
+   wilc_frmw_to_host(wilc, buff_ptr,
+ pkt_len, pkt_offset);
}
} else {
struct wilc_cfg_rsp rsp;
-- 
2.7.4

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 4/9] staging: wilc1000: move macro and function prototype from wilc_wlan_if.h file

2019-02-06 Thread Ajay.Kathat
From: Ajay Singh 

Move data structure and function prototype from 'wilc_wlan_if.h file.
Now, this file contains constant specific to the firmware.

Signed-off-by: Ajay Singh 
---
 drivers/staging/wilc1000/host_interface.c |  1 +
 drivers/staging/wilc1000/host_interface.h | 11 ++
 drivers/staging/wilc1000/linux_wlan.c |  2 ++
 drivers/staging/wilc1000/wilc_wlan.h  |  9 
 drivers/staging/wilc1000/wilc_wlan_if.h   | 36 ---
 5 files changed, 23 insertions(+), 36 deletions(-)

diff --git a/drivers/staging/wilc1000/host_interface.c 
b/drivers/staging/wilc1000/host_interface.c
index 9abe341..50dc2dd 100644
--- a/drivers/staging/wilc1000/host_interface.c
+++ b/drivers/staging/wilc1000/host_interface.c
@@ -10,6 +10,7 @@
 #define WILC_HIF_CONNECT_TIMEOUT_MS 9500
 
 #define WILC_FALSE_FRMWR_CHANNEL   100
+#define WILC_MAX_RATES_SUPPORTED   12
 
 struct wilc_rcvd_mac_info {
u8 status;
diff --git a/drivers/staging/wilc1000/host_interface.h 
b/drivers/staging/wilc1000/host_interface.h
index a007625..678e623 100644
--- a/drivers/staging/wilc1000/host_interface.h
+++ b/drivers/staging/wilc1000/host_interface.h
@@ -97,6 +97,17 @@ enum conn_event {
CONN_DISCONN_EVENT_FORCE_32BIT  = 0x
 };
 
+enum {
+   WILC_HIF_SDIO = 0,
+   WILC_HIF_SPI = BIT(0)
+};
+
+enum {
+   WILC_MAC_STATUS_INIT = -1,
+   WILC_MAC_STATUS_DISCONNECTED = 0,
+   WILC_MAC_STATUS_CONNECTED = 1
+};
+
 struct wilc_rcvd_net_info {
s8 rssi;
u8 ch;
diff --git a/drivers/staging/wilc1000/linux_wlan.c 
b/drivers/staging/wilc1000/linux_wlan.c
index 8fa5f90..b279811 100644
--- a/drivers/staging/wilc1000/linux_wlan.c
+++ b/drivers/staging/wilc1000/linux_wlan.c
@@ -12,6 +12,8 @@
 
 #include "wilc_wfi_cfgoperations.h"
 
+#define WILC_MULTICAST_TABLE_SIZE  8
+
 static irqreturn_t isr_uh_routine(int irq, void *user_data)
 {
struct net_device *dev = user_data;
diff --git a/drivers/staging/wilc1000/wilc_wlan.h 
b/drivers/staging/wilc1000/wilc_wlan.h
index d8fabe8..1a27f62 100644
--- a/drivers/staging/wilc1000/wilc_wlan.h
+++ b/drivers/staging/wilc1000/wilc_wlan.h
@@ -250,6 +250,13 @@ struct wilc_hif_func {
 
 #define WILC_MAX_CFG_FRAME_SIZE1468
 
+struct tx_complete_data {
+   int size;
+   void *buff;
+   u8 *bssid;
+   struct sk_buff *skb;
+};
+
 struct wilc_cfg_cmd_hdr {
u8 cmd_type;
u8 seq_no;
@@ -301,4 +308,6 @@ void chip_allow_sleep(struct wilc *wilc);
 void chip_wakeup(struct wilc *wilc);
 int wilc_send_config_pkt(struct wilc_vif *vif, u8 mode, struct wid *wids,
 u32 count, u32 drv);
+int wilc_wlan_init(struct net_device *dev);
+u32 wilc_get_chipid(struct wilc *wilc, bool update);
 #endif
diff --git a/drivers/staging/wilc1000/wilc_wlan_if.h 
b/drivers/staging/wilc1000/wilc_wlan_if.h
index 9b8cce8..b15de36 100644
--- a/drivers/staging/wilc1000/wilc_wlan_if.h
+++ b/drivers/staging/wilc1000/wilc_wlan_if.h
@@ -11,41 +11,9 @@
 
 /
  *
- *  Host Interface Defines
- *
- /
-
-enum {
-   WILC_HIF_SDIO = 0,
-   WILC_HIF_SPI = BIT(0)
-};
-
-/
- *
- *  Wlan Interface Defines
- *
- /
-
-enum {
-   WILC_MAC_STATUS_INIT = -1,
-   WILC_MAC_STATUS_DISCONNECTED = 0,
-   WILC_MAC_STATUS_CONNECTED = 1
-};
-
-struct tx_complete_data {
-   int size;
-   void *buff;
-   u8 *bssid;
-   struct sk_buff *skb;
-};
-
-/
- *
  *  Wlan Configuration ID
  *
  /
-#define WILC_MULTICAST_TABLE_SIZE  8
-#define WILC_MAX_RATES_SUPPORTED 12
 
 enum bss_types {
WILC_FW_BSS_TYPE_INFRA = 0,
@@ -832,8 +800,4 @@ enum {
WID_MAX = 0x
 };
 
-struct wilc;
-int wilc_wlan_init(struct net_device *dev);
-u32 wilc_get_chipid(struct wilc *wilc, bool update);
-
 #endif
-- 
2.7.4

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 0/9] staging: wilc1000: fixes & changes for mainline review comments

2019-02-06 Thread Ajay.Kathat
From: Ajay Singh 

This series contains the following changes:
 - fix to set 'vif_num' value correctly. The previous Fixes patch
   for vif count had not fixed the issue completely, so reverted it
   and added a new patch to fix the issue.
 - use 'wilc_' prefix for variables and function names.
 - avoid use of unnecessary 'linux_' prefix from file names.

Ajay Singh (9):
  staging: wilc1000: revert fix related to vif index
  staging: wilc1000: fix to set the correct value for 'vif_num'
  staging: wilc1000: add 'wilc_' prefix to have proper namespace
  staging: wilc1000: move macro and function prototype from
wilc_wlan_if.h file
  staging: wilc1000: avoid function forward declaration in wilc_sdio.c
file
  staging: wilc1000: added 'wilc_' prefix for function in wilc_sdio.c
file
  staging: wilc1000: rename wilc_frmw_to_linux()
  staging: wilc1000: remove 'linux_' prefix in function names
  staging: wilc1000: rename linux_wlan.c and linux_mon.c

 drivers/staging/wilc1000/Makefile  |   2 +-
 drivers/staging/wilc1000/host_interface.c  |  55 +++---
 drivers/staging/wilc1000/host_interface.h  |  23 ++-
 .../staging/wilc1000/{linux_mon.c => wilc_mon.c}   |   0
 .../wilc1000/{linux_wlan.c => wilc_netdev.c}   |  27 +--
 drivers/staging/wilc1000/wilc_sdio.c   | 187 ++---
 drivers/staging/wilc1000/wilc_spi.c|   4 +-
 drivers/staging/wilc1000/wilc_wfi_cfgoperations.c  |  22 +--
 drivers/staging/wilc1000/wilc_wfi_netdevice.h  |   2 +-
 drivers/staging/wilc1000/wilc_wlan.c   |  13 +-
 drivers/staging/wilc1000/wilc_wlan.h   |  17 +-
 drivers/staging/wilc1000/wilc_wlan_cfg.c   |  12 +-
 drivers/staging/wilc1000/wilc_wlan_if.h|  36 
 13 files changed, 190 insertions(+), 210 deletions(-)
 rename drivers/staging/wilc1000/{linux_mon.c => wilc_mon.c} (100%)
 rename drivers/staging/wilc1000/{linux_wlan.c => wilc_netdev.c} (97%)

-- 
2.7.4

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 3/9] staging: wilc1000: add 'wilc_' prefix to have proper namespace

2019-02-06 Thread Ajay.Kathat
From: Ajay Singh 

Cleanup patch to rename data structure and function name to have 'wilc_'
prefix.

Signed-off-by: Ajay Singh 
---
 drivers/staging/wilc1000/host_interface.c | 54 +++
 drivers/staging/wilc1000/host_interface.h | 12 ++---
 drivers/staging/wilc1000/wilc_spi.c   |  4 +-
 drivers/staging/wilc1000/wilc_wfi_cfgoperations.c | 22 -
 drivers/staging/wilc1000/wilc_wlan.c  |  8 ++--
 drivers/staging/wilc1000/wilc_wlan.h  |  8 ++--
 drivers/staging/wilc1000/wilc_wlan_cfg.c  | 12 ++---
 drivers/staging/wilc1000/wilc_wlan_if.h   |  2 +-
 8 files changed, 61 insertions(+), 61 deletions(-)

diff --git a/drivers/staging/wilc1000/host_interface.c 
b/drivers/staging/wilc1000/host_interface.c
index 0fb6ca3..9abe341 100644
--- a/drivers/staging/wilc1000/host_interface.c
+++ b/drivers/staging/wilc1000/host_interface.c
@@ -9,7 +9,7 @@
 #define WILC_HIF_SCAN_TIMEOUT_MS4000
 #define WILC_HIF_CONNECT_TIMEOUT_MS 9500
 
-#define FALSE_FRMWR_CHANNEL100
+#define WILC_FALSE_FRMWR_CHANNEL   100
 
 struct wilc_rcvd_mac_info {
u8 status;
@@ -21,7 +21,7 @@ struct wilc_set_multicast {
u8 *mc_list;
 };
 
-struct del_all_sta {
+struct wilc_del_all_sta {
u8 assoc_sta;
u8 mac[WILC_MAX_NUM_STA][ETH_ALEN];
 };
@@ -68,16 +68,16 @@ struct wilc_gtk_key {
u8 key[0];
 } __packed;
 
-union message_body {
+union wilc_message_body {
struct wilc_rcvd_net_info net_info;
struct wilc_rcvd_mac_info mac_info;
struct wilc_set_multicast mc_info;
-   struct remain_ch remain_on_ch;
+   struct wilc_remain_ch remain_on_ch;
char *data;
 };
 
 struct host_if_msg {
-   union message_body body;
+   union wilc_message_body body;
struct wilc_vif *vif;
struct work_struct work;
void (*fn)(struct work_struct *ws);
@@ -110,7 +110,7 @@ struct wilc_join_bss_param {
u8 bssid[ETH_ALEN];
__le16 beacon_period;
u8 dtim_period;
-   u8 supp_rates[MAX_RATES_SUPPORTED + 1];
+   u8 supp_rates[WILC_MAX_RATES_SUPPORTED + 1];
u8 wmm_cap;
u8 uapsd_cap;
u8 ht_capable;
@@ -195,7 +195,7 @@ static int handle_scan_done(struct wilc_vif *vif, enum 
scan_event evt)
u8 abort_running_scan;
struct wid wid;
struct host_if_drv *hif_drv = vif->hif_drv;
-   struct user_scan_req *scan_req;
+   struct wilc_user_scan_req *scan_req;
 
if (evt == SCAN_EVENT_ABORTED) {
abort_running_scan = 1;
@@ -475,8 +475,8 @@ void *wilc_parse_join_bss_param(struct cfg80211_bss *bss,
supp_rates_ie = cfg80211_find_ie(WLAN_EID_EXT_SUPP_RATES, ies->data,
 ies->len);
if (supp_rates_ie) {
-   if (supp_rates_ie[1] > (MAX_RATES_SUPPORTED - rates_len))
-   param->supp_rates[0] = MAX_RATES_SUPPORTED;
+   if (supp_rates_ie[1] > (WILC_MAX_RATES_SUPPORTED - rates_len))
+   param->supp_rates[0] = WILC_MAX_RATES_SUPPORTED;
else
param->supp_rates[0] += supp_rates_ie[1];
 
@@ -563,7 +563,7 @@ static void handle_rcvd_ntwrk_info(struct work_struct *work)
 {
struct host_if_msg *msg = container_of(work, struct host_if_msg, work);
struct wilc_rcvd_net_info *rcvd_info = &msg->body.net_info;
-   struct user_scan_req *scan_req = &msg->vif->hif_drv->usr_scan_req;
+   struct wilc_user_scan_req *scan_req = &msg->vif->hif_drv->usr_scan_req;
const u8 *ch_elm;
u8 *ies;
int ies_len;
@@ -758,7 +758,7 @@ int wilc_disconnect(struct wilc_vif *vif)
 {
struct wid wid;
struct host_if_drv *hif_drv = vif->hif_drv;
-   struct user_scan_req *scan_req;
+   struct wilc_user_scan_req *scan_req;
struct wilc_conn_info *conn_info;
int result;
u16 dummy_reason_code = 0;
@@ -911,7 +911,7 @@ static void wilc_hif_pack_sta_param(u8 *cur_byte, const u8 
*mac,
 }
 
 static int handle_remain_on_chan(struct wilc_vif *vif,
-struct remain_ch *hif_remain_ch)
+struct wilc_remain_ch *hif_remain_ch)
 {
int result;
u8 remain_on_chan_flag;
@@ -957,7 +957,7 @@ static void handle_listen_state_expired(struct work_struct 
*work)
 {
struct host_if_msg *msg = container_of(work, struct host_if_msg, work);
struct wilc_vif *vif = msg->vif;
-   struct remain_ch *hif_remain_ch = &msg->body.remain_on_ch;
+   struct wilc_remain_ch *hif_remain_ch = &msg->body.remain_on_ch;
u8 remain_on_chan_flag;
struct wid wid;
int result;
@@ -975,7 +975,7 @@ static void handle_listen_state_expired(struct work_struct 
*work)
goto free_msg;
 
wid.val[0] = remain_on_chan_flag;
-   wid.val[1] = FALSE_FRMWR_

[PATCH 2/9] staging: wilc1000: fix to set the correct value for 'vif_num'

2019-02-06 Thread Ajay.Kathat
From: Ajay Singh 

Set correct interface count value in '->vif_num'.
'vif_num' was incorrectly set one less than total number of interfaces
because 'i' is used to set its value, which starts from 0.

Fixes: 735bb39ca3be ("staging: wilc1000: simplify vif[i]->ndev accesses")
Cc:  # v4.10
Signed-off-by: Ajay Singh 
---
 drivers/staging/wilc1000/linux_wlan.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/staging/wilc1000/linux_wlan.c 
b/drivers/staging/wilc1000/linux_wlan.c
index 648b658..8fa5f90 100644
--- a/drivers/staging/wilc1000/linux_wlan.c
+++ b/drivers/staging/wilc1000/linux_wlan.c
@@ -1021,7 +1021,7 @@ int wilc_netdev_init(struct wilc **wilc, struct device 
*dev, int io_type,
vif->wilc = *wilc;
vif->ndev = ndev;
wl->vif[i] = vif;
-   wl->vif_num = i;
+   wl->vif_num = i + 1;
ndev->netdev_ops = &wilc_netdev_ops;
 
wdev = wilc_create_wiphy(ndev, dev);
-- 
2.7.4

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 5/9] staging: wilc1000: avoid function forward declaration in wilc_sdio.c file

2019-02-06 Thread Ajay.Kathat
From: Ajay Singh 

Cleanup patch to avoid function forward declaration by reordering the
function.

Signed-off-by: Ajay Singh 
---
 drivers/staging/wilc1000/wilc_sdio.c | 91 +---
 1 file changed, 43 insertions(+), 48 deletions(-)

diff --git a/drivers/staging/wilc1000/wilc_sdio.c 
b/drivers/staging/wilc1000/wilc_sdio.c
index e2f739f..a62eabe 100644
--- a/drivers/staging/wilc1000/wilc_sdio.c
+++ b/drivers/staging/wilc1000/wilc_sdio.c
@@ -51,10 +51,6 @@ struct sdio_cmd53 {
 
 static const struct wilc_hif_func wilc_hif_sdio;
 
-static int sdio_write_reg(struct wilc *wilc, u32 addr, u32 data);
-static int sdio_read_reg(struct wilc *wilc, u32 addr, u32 *data);
-static int sdio_init(struct wilc *wilc, bool resume);
-
 static void wilc_sdio_interrupt(struct sdio_func *func)
 {
sdio_release_host(func);
@@ -215,50 +211,6 @@ static int wilc_sdio_suspend(struct device *dev)
return 0;
 }
 
-static int wilc_sdio_resume(struct device *dev)
-{
-   struct sdio_func *func = dev_to_sdio_func(dev);
-   struct wilc *wilc = sdio_get_drvdata(func);
-
-   dev_info(dev, "sdio resume\n");
-   sdio_release_host(func);
-   chip_wakeup(wilc);
-   sdio_init(wilc, true);
-
-   if (wilc->suspend_event)
-   host_wakeup_notify(wilc);
-
-   chip_allow_sleep(wilc);
-
-   return 0;
-}
-
-static const struct of_device_id wilc_of_match[] = {
-   { .compatible = "microchip,wilc1000-sdio", },
-   { /* sentinel */ }
-};
-MODULE_DEVICE_TABLE(of, wilc_of_match);
-
-static const struct dev_pm_ops wilc_sdio_pm_ops = {
-   .suspend = wilc_sdio_suspend,
-   .resume = wilc_sdio_resume,
-};
-
-static struct sdio_driver wilc_sdio_driver = {
-   .name   = SDIO_MODALIAS,
-   .id_table   = wilc_sdio_ids,
-   .probe  = linux_sdio_probe,
-   .remove = linux_sdio_remove,
-   .drv = {
-   .pm = &wilc_sdio_pm_ops,
-   .of_match_table = wilc_of_match,
-   }
-};
-module_driver(wilc_sdio_driver,
- sdio_register_driver,
- sdio_unregister_driver);
-MODULE_LICENSE("GPL");
-
 static int wilc_sdio_enable_interrupt(struct wilc *dev)
 {
struct sdio_func *func = container_of(dev->dev, struct sdio_func, dev);
@@ -1143,3 +1095,46 @@ static const struct wilc_hif_func wilc_hif_sdio = {
.disable_interrupt = wilc_sdio_disable_interrupt,
 };
 
+static int wilc_sdio_resume(struct device *dev)
+{
+   struct sdio_func *func = dev_to_sdio_func(dev);
+   struct wilc *wilc = sdio_get_drvdata(func);
+
+   dev_info(dev, "sdio resume\n");
+   sdio_release_host(func);
+   chip_wakeup(wilc);
+   sdio_init(wilc, true);
+
+   if (wilc->suspend_event)
+   host_wakeup_notify(wilc);
+
+   chip_allow_sleep(wilc);
+
+   return 0;
+}
+
+static const struct of_device_id wilc_of_match[] = {
+   { .compatible = "microchip,wilc1000-sdio", },
+   { /* sentinel */ }
+};
+MODULE_DEVICE_TABLE(of, wilc_of_match);
+
+static const struct dev_pm_ops wilc_sdio_pm_ops = {
+   .suspend = wilc_sdio_suspend,
+   .resume = wilc_sdio_resume,
+};
+
+static struct sdio_driver wilc_sdio_driver = {
+   .name   = SDIO_MODALIAS,
+   .id_table   = wilc_sdio_ids,
+   .probe  = linux_sdio_probe,
+   .remove = linux_sdio_remove,
+   .drv = {
+   .pm = &wilc_sdio_pm_ops,
+   .of_match_table = wilc_of_match,
+   }
+};
+module_driver(wilc_sdio_driver,
+ sdio_register_driver,
+ sdio_unregister_driver);
+MODULE_LICENSE("GPL");
-- 
2.7.4

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 1/9] staging: wilc1000: revert fix related to vif index

2019-02-06 Thread Ajay.Kathat
From: Ajay Singh 

This patch reverts 0e490657c721 ("staging: wilc1000: Fix problem with
wrong vif index") commit.

The issue was not completely fixed with the above commit.
After 'for' loop completion, '->idx' value is correct but '->vif_num'
still contains incorrect interface count.

Fixes: 0e490657c721 ("staging: wilc1000: Fix problem with wrong vif index")
Cc:  # v4.12
Signed-off-by: Ajay Singh 
---
 drivers/staging/wilc1000/linux_wlan.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/drivers/staging/wilc1000/linux_wlan.c 
b/drivers/staging/wilc1000/linux_wlan.c
index f096f9e..648b658 100644
--- a/drivers/staging/wilc1000/linux_wlan.c
+++ b/drivers/staging/wilc1000/linux_wlan.c
@@ -1017,12 +1017,11 @@ int wilc_netdev_init(struct wilc **wilc, struct device 
*dev, int io_type,
strcpy(ndev->name, "p2p%d");
vif->ifc_id = 0;
}
+   vif->idx = wl->vif_num;
vif->wilc = *wilc;
vif->ndev = ndev;
wl->vif[i] = vif;
wl->vif_num = i;
-   vif->idx = wl->vif_num;
-
ndev->netdev_ops = &wilc_netdev_ops;
 
wdev = wilc_create_wiphy(ndev, dev);
-- 
2.7.4

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


Re: [PATCH] staging: vt6656: Use the correct style for SPDX license Identifier

2019-02-06 Thread Joe Perches
On Wed, 2019-02-06 at 17:25 +0100, Greg Kroah-Hartman wrote:
> On Tue, Feb 05, 2019 at 10:59:40AM -0800, Joe Perches wrote:
> > On Tue, 2019-02-05 at 19:44 +0100, Greg Kroah-Hartman wrote:
> > > On Tue, Feb 05, 2019 at 08:36:24PM +0530, Nishad Kamdar wrote:
> > > > This patch corrects the style for SPDX license Identifier in mac.h
> > > > by using "/* */" in place of "//" as per Linux kernel licensing rules.
> > > > Issue found by checkpatch.
> > > > 
> > > > Signed-off-by: Nishad Kamdar 
> > > > ---
> > > >  drivers/staging/vt6656/mac.h | 4 ++--
> > > >  1 file changed, 2 insertions(+), 2 deletions(-)
> > > > 
> > > > diff --git a/drivers/staging/vt6656/mac.h b/drivers/staging/vt6656/mac.h
> > > > index 94e700fcd0b6..75166020f7c6 100644
> > > > --- a/drivers/staging/vt6656/mac.h
> > > > +++ b/drivers/staging/vt6656/mac.h
> > > > @@ -1,5 +1,5 @@
> > > > -// SPDX-License-Identifier: GPL-2.0+
> > > > -/*
> > > > +/* SPDX-License-Identifier: GPL-2.0+
> > > 
> > > Should really be:
> > > 
> > > /* SPDX-License-Identifier: GPL-2.0+ */
> > 
> > There's a fair number of style inconsistencies in the kernel
> > sources for that already.
> > 
> > ~8% of the .h files that have an 'SPDX-License-Identifier:'
> > don't use the recommended style.
> > 
> > $ git grep -h "SPDX-License" -- '*.h' | \
> >   perl -p -e 's@Identifier:.*\*/*@Identifier: ... */@; s@Identifier: 
> > [^\.].*@Identifier:@' | \
> >   sort | uniq -c | sort -rn
> >8506 /* SPDX-License-Identifier: ... */
> > 593 // SPDX-License-Identifier:
> > 154 /* SPDX-License-Identifier:
> >  53  * SPDX-License-Identifier:
> >   1  * SPDX-License-Identifier: GPL-2.0
> >   1 //SPDX-License-Identifier:
> >   1 /*  SPDX-License-Identifier: ... */
> 
> Then let's fix them, the documentation says what the correct format is,
> there's no reason we can't actually follow what is written...

So here's a script that does most all of them except
the 50 or so that use the SPDX-License-Identifier
in the middle of a comment block.

Using:

$ git grep --name-only 'SPDX-License-Identifier:' -- '*.h' | \
  xargs grep -L '/\* SPDX-License-Identifier:.*\*/'| \
  while read file ; do perl -i update_spdx.perl $file ; done

produces

$ git diff --shortstat
 748 files changed, 902 insertions(+), 902 deletions(-)

And

$ git grep -h "SPDX-License" -- '*.h' | \
  perl -p -e 's@Identifier:.*\*/*@Identifier: ... */@; s@Identifier: 
[^\.].*@Identifier:@' | \
  sort | uniq -c | sort -rn
   9254 /* SPDX-License-Identifier: ... */
 53  * SPDX-License-Identifier:
  1  * SPDX-License-Identifier: GPL-2.0
  1 /*  SPDX-License-Identifier: ... */

and the perl script below is also attached

$ cat update_spdx.perl
local $/;
my $file = (<>);

my $spdx_regex = '/\*[ \t]*SPDX-License-Identifier:[ \t]*';
my $spdx_actual = '/* SPDX-License-Identifier: ';

# any // use converted to /* ... */
$file =~ s@^//[ \t]*SPDX-License-Identifier:[ \t]*(.*)\n@/* 
SPDX-License-Identifier: $1 */\n@;

# first line use with /* without trailing */ gets */ added and 2nd line updated
$file =~ m@^\s*${spdx_regex}([^\n]+)\n@;
if (defined $1 && $1 !~ m@\*/$@) {
$file =~ s@^[ \t]*${spdx_regex}([^\n]+)\n@${spdx_actual}$1 */\n/* @;
$file =~ s@^[ \t]*${spdx_regex}([^\n]+)\n[ \t]*/\*[ 
\t]+\*@${spdx_actual}$1\n/* @;
$file =~ s@^\s*${spdx_regex}([^\n]+)\n/\* \n@${spdx_actual}$1\n/*\n@;
}

print $file;



update_spdx.perl
Description: Perl program
___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


Re: [PATCH 1/3] sched/wait: use freezable_schedule when possible

2019-02-06 Thread Hugo Lefeuvre
Hi Joel,

> I'm curious did you try the freezing process and see if pointless wakeups are
> reduced?  That would be an added bonus if you did.

I'm currently testing these changes. I hope to be able to come back with
more concrete results soon.

Also, I just noticed that the third patch removes a necessary #include
. I will submit an updated version tomorrow.

Thanks for the review!

regards,
 Hugo

-- 
Hugo Lefeuvre (hle)|www.owl.eu.com
RSA4096_ 360B 03B3 BF27 4F4D 7A3F D5E8 14AA 1EB8 A247 3DFD
ed25519_ 37B2 6D38 0B25 B8A2 6B9F 3A65 A36F 5357 5F2D DC4C
___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH v14.1] media: staging/imx7: add MIPI CSI-2 receiver subdev for i.MX7

2019-02-06 Thread Rui Miguel Silva
Adds MIPI CSI-2 subdev for i.MX7 to connect with sensors with a MIPI
CSI-2 interface.

Signed-off-by: Rui Miguel Silva 
---

kbuild-bot:
 - remove __exit from debugfs_exit to solve

tree:   git://linuxtv.org/hverkuil/media_tree.git imx7
head:   a95edaa9069c275170a9ecf5aedc68be974678a2
commit: 4bb816545b626911079514028f0d14891627020c [5/9] media: staging/imx7: add 
MIPI CSI-2 receiver subdev for i.MX7
config: ia64-allyesconfig (attached as .config)
compiler: ia64-linux-gcc (GCC) 8.2.0
reproduce:
wget 
https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O 
~/bin/make.cross
chmod +x ~/bin/make.cross
git checkout 4bb816545b626911079514028f0d14891627020c
# save the attached .config to linux build tree
GCC_VERSION=8.2.0 make.cross ARCH=ia64 

All warnings (new ones prefixed by >>):

>> WARNING: vmlinux.o(.text+0x8703e02): Section mismatch in reference from the 
>> function mipi_csis_probe() to the function 
>> .exit.text:mipi_csis_debugfs_exit()
   The function mipi_csis_probe() references a function in an exit section.
   Often the function mipi_csis_debugfs_exit() has valid usage outside the exit 
section
   and the fix is to remove the __exit annotation of mipi_csis_debugfs_exit.
--
>> WARNING: vmlinux.o(.text.unlikely+0x147662): Section mismatch in reference 
>> from the function mipi_csis_remove() to the function 
>> .exit.text:mipi_csis_debugfs_exit()
   The function mipi_csis_remove() references a function in an exit section.
   Often the function mipi_csis_debugfs_exit() has valid usage outside the exit 
section
   and the fix is to remove the __exit annotation of mipi_csis_debugfs_exit.

 drivers/staging/media/imx/Makefile |1 +
 drivers/staging/media/imx/imx7-mipi-csis.c | 1186 
 2 files changed, 1187 insertions(+)
 create mode 100644 drivers/staging/media/imx/imx7-mipi-csis.c

diff --git a/drivers/staging/media/imx/Makefile 
b/drivers/staging/media/imx/Makefile
index 074f016d3519..d2d909a36239 100644
--- a/drivers/staging/media/imx/Makefile
+++ b/drivers/staging/media/imx/Makefile
@@ -14,3 +14,4 @@ obj-$(CONFIG_VIDEO_IMX_CSI) += imx-media-csi.o
 obj-$(CONFIG_VIDEO_IMX_CSI) += imx6-mipi-csi2.o
 
 obj-$(CONFIG_VIDEO_IMX7_CSI) += imx7-media-csi.o
+obj-$(CONFIG_VIDEO_IMX7_CSI) += imx7-mipi-csis.o
diff --git a/drivers/staging/media/imx/imx7-mipi-csis.c 
b/drivers/staging/media/imx/imx7-mipi-csis.c
new file mode 100644
index ..c92d18f2194c
--- /dev/null
+++ b/drivers/staging/media/imx/imx7-mipi-csis.c
@@ -0,0 +1,1186 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Freescale i.MX7 SoC series MIPI-CSI V3.3 receiver driver
+ *
+ * Copyright (C) 2019 Linaro Ltd
+ * Copyright (C) 2015-2016 Freescale Semiconductor, Inc. All Rights Reserved.
+ * Copyright (C) 2011 - 2013 Samsung Electronics Co., Ltd.
+ *
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include 
+#include 
+#include 
+
+#include "imx-media.h"
+
+#define CSIS_DRIVER_NAME   "imx7-mipi-csis"
+#define CSIS_SUBDEV_NAME   CSIS_DRIVER_NAME
+
+#define CSIS_PAD_SINK  0
+#define CSIS_PAD_SOURCE1
+#define CSIS_PADS_NUM  2
+
+#define MIPI_CSIS_DEF_PIX_WIDTH640
+#define MIPI_CSIS_DEF_PIX_HEIGHT   480
+
+/* Register map definition */
+
+/* CSIS common control */
+#define MIPI_CSIS_CMN_CTRL 0x04
+#define MIPI_CSIS_CMN_CTRL_UPDATE_SHADOW   BIT(16)
+#define MIPI_CSIS_CMN_CTRL_INTER_MODE  BIT(10)
+#define MIPI_CSIS_CMN_CTRL_UPDATE_SHADOW_CTRL  BIT(2)
+#define MIPI_CSIS_CMN_CTRL_RESET   BIT(1)
+#define MIPI_CSIS_CMN_CTRL_ENABLE  BIT(0)
+
+#define MIPI_CSIS_CMN_CTRL_LANE_NR_OFFSET  8
+#define MIPI_CSIS_CMN_CTRL_LANE_NR_MASK(3 << 8)
+
+/* CSIS clock control */
+#define MIPI_CSIS_CLK_CTRL 0x08
+#define MIPI_CSIS_CLK_CTRL_CLKGATE_TRAIL_CH3(x)((x) << 28)
+#define MIPI_CSIS_CLK_CTRL_CLKGATE_TRAIL_CH2(x)((x) << 24)
+#define MIPI_CSIS_CLK_CTRL_CLKGATE_TRAIL_CH1(x)((x) << 20)
+#define MIPI_CSIS_CLK_CTRL_CLKGATE_TRAIL_CH0(x)((x) << 16)
+#define MIPI_CSIS_CLK_CTRL_CLKGATE_EN_MSK  (0xf << 4)
+#define MIPI_CSIS_CLK_CTRL_WCLK_SRCBIT(0)
+
+/* CSIS Interrupt mask */
+#define MIPI_CSIS_INTMSK   0x10
+#define MIPI_CSIS_INTMSK_EVEN_BEFORE   BIT(31)
+#define MIPI_CSIS_INTMSK_EVEN_AFTERBIT(30)
+#define MIPI_CSIS_INTMSK_ODD_BEFOREBIT(29)
+#define MIPI_CSIS_INTMSK_ODD_AFTER BIT(28)
+#define MIPI_CSIS_INTMSK_FRAME_START   BIT(24)
+#define MIPI_CSIS_INTMSK_FRAME_END BIT(20)
+#define MIPI_CSIS_INTMSK_ERR_SOT_HSBIT(16)
+#define MIPI_CSIS_INTMSK_ERR_LOST_FS   BIT(12)
+#define MIPI_CSIS_INTMSK_ERR_LOST_FE   BIT(8)
+#define MIPI_CSIS_INTMSK_ERR_OVER  BIT(4)
+#define MIPI_CSIS_INTMSK_ERR_WRONG_CFG BIT(3)
+#define MIPI_CSIS_INTMSK_ERR_

Re: [PATCH net-next v4 00/12] net: Introduce ndo_get_port_parent_id()

2019-02-06 Thread David Miller
From: David Miller 
Date: Wed, 06 Feb 2019 13:50:50 -0800 (PST)

> From: Florian Fainelli 
> Date: Wed,  6 Feb 2019 09:45:34 -0800
> 
>> Based on discussion with Ido and feedback from Jakub there are clearly
>> two classes of users that implement SWITCHDEV_ATTR_ID_PORT_PARENT_ID:
>> 
>> - PF/VF drivers which typically only implement return the port's parent
>>   ID, yet have to implement switchdev_port_attr_get() just for that
>> 
>> - Ethernet switch drivers: mlxsw, ocelot, DSA, etc. which implement more
>>   attributes which we want to be able to eventually veto in the context
>>   of the caller, thus making them candidates for using a blocking notifier
>>   chain
>> 
>> Changes in v4:
>  ..
> 
> Series applied, thanks Florian.
> 
> I'll push this out to net-next after my build tests complete.

I had to remove the unused variable 'rocker' to kill a warning introduced
by patch #8.

Just FYI...
___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


Re: [PATCH net-next v4 00/12] net: Introduce ndo_get_port_parent_id()

2019-02-06 Thread David Miller
From: Florian Fainelli 
Date: Wed,  6 Feb 2019 09:45:34 -0800

> Based on discussion with Ido and feedback from Jakub there are clearly
> two classes of users that implement SWITCHDEV_ATTR_ID_PORT_PARENT_ID:
> 
> - PF/VF drivers which typically only implement return the port's parent
>   ID, yet have to implement switchdev_port_attr_get() just for that
> 
> - Ethernet switch drivers: mlxsw, ocelot, DSA, etc. which implement more
>   attributes which we want to be able to eventually veto in the context
>   of the caller, thus making them candidates for using a blocking notifier
>   chain
> 
> Changes in v4:
 ..

Series applied, thanks Florian.

I'll push this out to net-next after my build tests complete.
___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


Re: [PATCH net-next v4 12/12] net: Get rid of SWITCHDEV_ATTR_ID_PORT_PARENT_ID

2019-02-06 Thread Ido Schimmel
On Wed, Feb 06, 2019 at 09:45:46AM -0800, Florian Fainelli wrote:
> Now that we have a dedicated NDO for getting a port's parent ID, get rid
> of SWITCHDEV_ATTR_ID_PORT_PARENT_ID and convert all callers to use the
> NDO exclusively. This is a preliminary change to getting rid of
> switchdev_ops eventually.
> 
> Signed-off-by: Florian Fainelli 

Reviewed-by: Ido Schimmel 
___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


Re: [PATCH net-next v4 01/12] net: Introduce ndo_get_port_parent_id()

2019-02-06 Thread Ido Schimmel
On Wed, Feb 06, 2019 at 09:45:35AM -0800, Florian Fainelli wrote:
> In preparation for getting rid of switchdev_ops, create a dedicated NDO
> operation for getting the port's parent identifier. There are
> essentially two classes of drivers that need to implement getting the
> port's parent ID which are VF/PF drivers with a built-in switch, and
> pure switchdev drivers such as mlxsw, ocelot, dsa etc.
> 
> We introduce a helper function: dev_get_port_parent_id() which supports
> recursion into the lower devices to obtain the first port's parent ID.
> 
> Convert the bridge, core and ipv4 multicast routing code to check for
> such ndo_get_port_parent_id() and call the helper function when valid
> before falling back to switchdev_port_attr_get(). This will allow us to
> convert all relevant drivers in one go instead of having to implement
> both switchdev_port_attr_get() and ndo_get_port_parent_id() operations,
> then get rid of switchdev_port_attr_get().
> 
> Acked-by: Jiri Pirko 
> Signed-off-by: Florian Fainelli 

Reviewed-by: Ido Schimmel 
___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


Re: [PATCH net-next v4 05/12] mlxsw: Implement ndo_get_port_parent_id()

2019-02-06 Thread Ido Schimmel
On Wed, Feb 06, 2019 at 09:45:39AM -0800, Florian Fainelli wrote:
> mlxsw implements SWITCHDEV_ATTR_ID_PORT_PARENT_ID and we want to get rid
> of switchdev_ops eventually, ease that migration by implementing a
> ndo_get_port_parent_id() function which returns what
> switchdev_port_attr_get() would do.
> 
> Acked-by: Jiri Pirko 
> Signed-off-by: Florian Fainelli 

Reviewed-by: Ido Schimmel 
___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


Re: [PATCH net-next v3 11/12] net: dsa: Implement ndo_get_port_parent_id()

2019-02-06 Thread Vivien Didelot
Hi Florian,

On Tue,  5 Feb 2019 15:53:25 -0800, Florian Fainelli  
wrote:
> DSA implements SWITCHDEV_ATTR_ID_PORT_PARENT_ID and we want to get rid
> of switchdev_ops eventually, ease that migration by implementing a
> ndo_get_port_parent_id() function which returns what
> switchdev_port_attr_get() would do.
> 
> Signed-off-by: Florian Fainelli 
> ---
>  net/dsa/slave.c | 18 --
>  1 file changed, 12 insertions(+), 6 deletions(-)
> 
> diff --git a/net/dsa/slave.c b/net/dsa/slave.c
> index 91de3a663226..70395a0ae52e 100644
> --- a/net/dsa/slave.c
> +++ b/net/dsa/slave.c
> @@ -362,18 +362,23 @@ static int dsa_slave_port_obj_del(struct net_device 
> *dev,
>   return err;
>  }
>  
> -static int dsa_slave_port_attr_get(struct net_device *dev,
> -struct switchdev_attr *attr)
> +static int dsa_slave_get_port_parent_id(struct net_device *dev,
> + struct netdev_phys_item_id *ppid)
>  {
>   struct dsa_port *dp = dsa_slave_to_port(dev);
>   struct dsa_switch *ds = dp->ds;
>   struct dsa_switch_tree *dst = ds->dst;
>  
> + ppid->id_len = sizeof(dst->index);
> + memcpy(&ppid->id, &dst->index, ppid->id_len);
> +
> + return 0;
> +}

Finally this will give us a way to distinguish two ports with the same switch
and port IDs on a system with two disjoint switch trees, thanks!

Reviewed-by: Vivien Didelot 
___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH net-next v4 12/12] net: Get rid of SWITCHDEV_ATTR_ID_PORT_PARENT_ID

2019-02-06 Thread Florian Fainelli
Now that we have a dedicated NDO for getting a port's parent ID, get rid
of SWITCHDEV_ATTR_ID_PORT_PARENT_ID and convert all callers to use the
NDO exclusively. This is a preliminary change to getting rid of
switchdev_ops eventually.

Signed-off-by: Florian Fainelli 
---
 include/net/switchdev.h   | 11 ---
 net/bridge/br_switchdev.c | 14 +++---
 net/core/net-sysfs.c  | 19 ---
 net/core/rtnetlink.c  | 16 +++-
 net/ipv4/ipmr.c   | 19 +--
 net/switchdev/switchdev.c | 20 
 6 files changed, 15 insertions(+), 84 deletions(-)

diff --git a/include/net/switchdev.h b/include/net/switchdev.h
index 63843ae5dc81..5e87b54c5dc5 100644
--- a/include/net/switchdev.h
+++ b/include/net/switchdev.h
@@ -43,7 +43,6 @@ static inline bool switchdev_trans_ph_commit(struct 
switchdev_trans *trans)
 
 enum switchdev_attr_id {
SWITCHDEV_ATTR_ID_UNDEFINED,
-   SWITCHDEV_ATTR_ID_PORT_PARENT_ID,
SWITCHDEV_ATTR_ID_PORT_STP_STATE,
SWITCHDEV_ATTR_ID_PORT_BRIDGE_FLAGS,
SWITCHDEV_ATTR_ID_PORT_BRIDGE_FLAGS_SUPPORT,
@@ -61,7 +60,6 @@ struct switchdev_attr {
void *complete_priv;
void (*complete)(struct net_device *dev, int err, void *priv);
union {
-   struct netdev_phys_item_id ppid;/* PORT_PARENT_ID */
u8 stp_state;   /* PORT_STP_STATE */
unsigned long brport_flags; /* PORT_BRIDGE_FLAGS */
unsigned long brport_flags_support; /* 
PORT_BRIDGE_FLAGS_SUPPORT */
@@ -208,9 +206,6 @@ void switchdev_port_fwd_mark_set(struct net_device *dev,
 struct net_device *group_dev,
 bool joining);
 
-bool switchdev_port_same_parent_id(struct net_device *a,
-  struct net_device *b);
-
 int switchdev_handle_port_obj_add(struct net_device *dev,
struct switchdev_notifier_port_obj_info *port_obj_info,
bool (*check_cb)(const struct net_device *dev),
@@ -295,12 +290,6 @@ call_switchdev_blocking_notifiers(unsigned long val,
return NOTIFY_DONE;
 }
 
-static inline bool switchdev_port_same_parent_id(struct net_device *a,
-struct net_device *b)
-{
-   return false;
-}
-
 static inline int
 switchdev_handle_port_obj_add(struct net_device *dev,
struct switchdev_notifier_port_obj_info *port_obj_info,
diff --git a/net/bridge/br_switchdev.c b/net/bridge/br_switchdev.c
index 06b0ae44585f..db9e8ab96d48 100644
--- a/net/bridge/br_switchdev.c
+++ b/net/bridge/br_switchdev.c
@@ -14,8 +14,7 @@ static int br_switchdev_mark_get(struct net_bridge *br, 
struct net_device *dev)
 
/* dev is yet to be added to the port list. */
list_for_each_entry(p, &br->port_list, list) {
-   if (netdev_port_same_parent_id(dev, p->dev) ||
-   switchdev_port_same_parent_id(dev, p->dev))
+   if (netdev_port_same_parent_id(dev, p->dev))
return p->offload_fwd_mark;
}
 
@@ -24,19 +23,12 @@ static int br_switchdev_mark_get(struct net_bridge *br, 
struct net_device *dev)
 
 int nbp_switchdev_mark_set(struct net_bridge_port *p)
 {
-   const struct net_device_ops *ops = p->dev->netdev_ops;
-   struct switchdev_attr attr = {
-   .orig_dev = p->dev,
-   .id = SWITCHDEV_ATTR_ID_PORT_PARENT_ID,
-   };
+   struct netdev_phys_item_id ppid = { };
int err;
 
ASSERT_RTNL();
 
-   if (ops->ndo_get_port_parent_id)
-   err = dev_get_port_parent_id(p->dev, &attr.u.ppid, true);
-   else
-   err = switchdev_port_attr_get(p->dev, &attr);
+   err = dev_get_port_parent_id(p->dev, &ppid, true);
if (err) {
if (err == -EOPNOTSUPP)
return 0;
diff --git a/net/core/net-sysfs.c b/net/core/net-sysfs.c
index 4eace9f1dcf9..7c5061123ead 100644
--- a/net/core/net-sysfs.c
+++ b/net/core/net-sysfs.c
@@ -12,7 +12,6 @@
 #include 
 #include 
 #include 
-#include 
 #include 
 #include 
 #include 
@@ -495,27 +494,17 @@ static ssize_t phys_switch_id_show(struct device *dev,
   struct device_attribute *attr, char *buf)
 {
struct net_device *netdev = to_net_dev(dev);
-   const struct net_device_ops *ops = netdev->netdev_ops;
ssize_t ret = -EINVAL;
 
if (!rtnl_trylock())
return restart_syscall();
 
if (dev_isalive(netdev)) {
-   struct switchdev_attr attr = {
-   .orig_dev = netdev,
-   .id = SWITCHDEV_ATTR_ID_PORT_PARENT_ID,
-   .flags = SWITCHDEV_F_NO_RECURSE,
-   };
-
-   if (ops->ndo_get_port_parent_id)
-   ret = dev_get_port_parent_id(netdev, &a

[PATCH net-next v4 03/12] liquidio: Implement ndo_get_port_parent_id()

2019-02-06 Thread Florian Fainelli
Liquidio only supports SWITCHDEV_ATTR_ID_PORT_PARENT_ID, which makes it
a great candidate to be converted to use the ndo_get_port_parent_id()
NDO instead of implementing switchdev_port_attr_get().

Acked-by: Jiri Pirko 
Signed-off-by: Florian Fainelli 
---
 .../net/ethernet/cavium/liquidio/lio_main.c   | 22 
 .../net/ethernet/cavium/liquidio/lio_vf_rep.c | 25 ++-
 2 files changed, 12 insertions(+), 35 deletions(-)

diff --git a/drivers/net/ethernet/cavium/liquidio/lio_main.c 
b/drivers/net/ethernet/cavium/liquidio/lio_main.c
index 3d24133e5e49..e97e6754ee09 100644
--- a/drivers/net/ethernet/cavium/liquidio/lio_main.c
+++ b/drivers/net/ethernet/cavium/liquidio/lio_main.c
@@ -21,7 +21,6 @@
 #include 
 #include 
 #include 
-#include 
 #include "liquidio_common.h"
 #include "octeon_droq.h"
 #include "octeon_iq.h"
@@ -3184,7 +3183,8 @@ static const struct devlink_ops liquidio_devlink_ops = {
 };
 
 static int
-lio_pf_switchdev_attr_get(struct net_device *dev, struct switchdev_attr *attr)
+liquidio_get_port_parent_id(struct net_device *dev,
+   struct netdev_phys_item_id *ppid)
 {
struct lio *lio = GET_LIO(dev);
struct octeon_device *oct = lio->oct_dev;
@@ -3192,24 +3192,12 @@ lio_pf_switchdev_attr_get(struct net_device *dev, 
struct switchdev_attr *attr)
if (oct->eswitch_mode != DEVLINK_ESWITCH_MODE_SWITCHDEV)
return -EOPNOTSUPP;
 
-   switch (attr->id) {
-   case SWITCHDEV_ATTR_ID_PORT_PARENT_ID:
-   attr->u.ppid.id_len = ETH_ALEN;
-   ether_addr_copy(attr->u.ppid.id,
-   (void *)&lio->linfo.hw_addr + 2);
-   break;
-
-   default:
-   return -EOPNOTSUPP;
-   }
+   ppid->id_len = ETH_ALEN;
+   ether_addr_copy(ppid->id, (void *)&lio->linfo.hw_addr + 2);
 
return 0;
 }
 
-static const struct switchdev_ops lio_pf_switchdev_ops = {
-   .switchdev_port_attr_get = lio_pf_switchdev_attr_get,
-};
-
 static int liquidio_get_vf_stats(struct net_device *netdev, int vfidx,
 struct ifla_vf_stats *vf_stats)
 {
@@ -3259,6 +3247,7 @@ static const struct net_device_ops lionetdevops = {
.ndo_set_vf_trust   = liquidio_set_vf_trust,
.ndo_set_vf_link_state  = liquidio_set_vf_link_state,
.ndo_get_vf_stats   = liquidio_get_vf_stats,
+   .ndo_get_port_parent_id = liquidio_get_port_parent_id,
 };
 
 /** \brief Entry point for the liquidio module
@@ -3534,7 +3523,6 @@ static int setup_nic_devices(struct octeon_device 
*octeon_dev)
 * netdev tasks.
 */
netdev->netdev_ops = &lionetdevops;
-   SWITCHDEV_SET_OPS(netdev, &lio_pf_switchdev_ops);
 
retval = netif_set_real_num_rx_queues(netdev, num_oqueues);
if (retval) {
diff --git a/drivers/net/ethernet/cavium/liquidio/lio_vf_rep.c 
b/drivers/net/ethernet/cavium/liquidio/lio_vf_rep.c
index de61060721c4..f3f2e71431ac 100644
--- a/drivers/net/ethernet/cavium/liquidio/lio_vf_rep.c
+++ b/drivers/net/ethernet/cavium/liquidio/lio_vf_rep.c
@@ -25,7 +25,6 @@
 #include "octeon_nic.h"
 #include "octeon_main.h"
 #include "octeon_network.h"
-#include 
 #include "lio_vf_rep.h"
 
 static int lio_vf_rep_open(struct net_device *ndev);
@@ -38,6 +37,8 @@ static int lio_vf_rep_phys_port_name(struct net_device *dev,
 static void lio_vf_rep_get_stats64(struct net_device *dev,
   struct rtnl_link_stats64 *stats64);
 static int lio_vf_rep_change_mtu(struct net_device *ndev, int new_mtu);
+static int lio_vf_get_port_parent_id(struct net_device *dev,
+struct netdev_phys_item_id *ppid);
 
 static const struct net_device_ops lio_vf_rep_ndev_ops = {
.ndo_open = lio_vf_rep_open,
@@ -47,6 +48,7 @@ static const struct net_device_ops lio_vf_rep_ndev_ops = {
.ndo_get_phys_port_name = lio_vf_rep_phys_port_name,
.ndo_get_stats64 = lio_vf_rep_get_stats64,
.ndo_change_mtu = lio_vf_rep_change_mtu,
+   .ndo_get_port_parent_id = lio_vf_get_port_parent_id,
 };
 
 static int
@@ -443,31 +445,19 @@ lio_vf_rep_pkt_xmit(struct sk_buff *skb, struct 
net_device *ndev)
return NETDEV_TX_OK;
 }
 
-static int
-lio_vf_rep_attr_get(struct net_device *dev, struct switchdev_attr *attr)
+static int lio_vf_get_port_parent_id(struct net_device *dev,
+struct netdev_phys_item_id *ppid)
 {
struct lio_vf_rep_desc *vf_rep = netdev_priv(dev);
struct net_device *parent_ndev = vf_rep->parent_ndev;
struct lio *lio = GET_LIO(parent_ndev);
 
-   switch (attr->id) {
-   case SWITCHDEV_ATTR_ID_PORT_PARENT_ID:
-   attr->u.ppid.id_len = ETH_ALEN;
-   ether_addr_copy(attr->u.ppid.id,
-   (void *)&lio->linfo.hw_addr + 2);
-   break;
-
-   default:
-  

[PATCH net-next v4 04/12] net/mlx5e: Implement ndo_get_port_parent_id()

2019-02-06 Thread Florian Fainelli
mlx5e only supports SWITCHDEV_ATTR_ID_PORT_PARENT_ID, which makes it a
great candidate to be converted to use the ndo_get_port_parent_id() NDO
instead of implementing switchdev_port_attr_get().

Since mlx5e makes use of switchdev_port_parent_id() convert it to use
netdev_port_same_parent_id().

Acked-by: Jiri Pirko 
Signed-off-by: Florian Fainelli 
---
 .../ethernet/mellanox/mlx5/core/en/tc_tun.c   |  2 +-
 .../net/ethernet/mellanox/mlx5/core/en_rep.c  | 31 +++
 .../net/ethernet/mellanox/mlx5/core/en_tc.c   |  5 ++-
 3 files changed, 14 insertions(+), 24 deletions(-)

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun.c 
b/drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun.c
index 046948ead152..19dc4a963b90 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en/tc_tun.c
@@ -25,7 +25,7 @@ static int get_route_and_out_devs(struct mlx5e_priv *priv,
/* if the egress device isn't on the same HW e-switch or
 * it's a LAG device, use the uplink
 */
-   if (!switchdev_port_same_parent_id(priv->netdev, dev) ||
+   if (!netdev_port_same_parent_id(priv->netdev, dev) ||
dst_is_lag_dev) {
*route_dev = uplink_dev;
*out_dev = *route_dev;
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c 
b/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c
index 5d2e0c2f6624..0b1988b330f3 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c
@@ -381,7 +381,8 @@ static const struct ethtool_ops 
mlx5e_uplink_rep_ethtool_ops = {
.set_pauseparam= mlx5e_uplink_rep_set_pauseparam,
 };
 
-static int mlx5e_attr_get(struct net_device *dev, struct switchdev_attr *attr)
+static int mlx5e_rep_get_port_parent_id(struct net_device *dev,
+   struct netdev_phys_item_id *ppid)
 {
struct mlx5e_priv *priv = netdev_priv(dev);
struct mlx5_eswitch *esw = priv->mdev->priv.eswitch;
@@ -398,20 +399,14 @@ static int mlx5e_attr_get(struct net_device *dev, struct 
switchdev_attr *attr)
uplink_priv = netdev_priv(uplink_dev);
}
 
-   switch (attr->id) {
-   case SWITCHDEV_ATTR_ID_PORT_PARENT_ID:
-   attr->u.ppid.id_len = ETH_ALEN;
-   if (uplink_upper && mlx5_lag_is_sriov(uplink_priv->mdev)) {
-   ether_addr_copy(attr->u.ppid.id, 
uplink_upper->dev_addr);
-   } else {
-   struct mlx5e_rep_priv *rpriv = priv->ppriv;
-   struct mlx5_eswitch_rep *rep = rpriv->rep;
+   ppid->id_len = ETH_ALEN;
+   if (uplink_upper && mlx5_lag_is_sriov(uplink_priv->mdev)) {
+   ether_addr_copy(ppid->id, uplink_upper->dev_addr);
+   } else {
+   struct mlx5e_rep_priv *rpriv = priv->ppriv;
+   struct mlx5_eswitch_rep *rep = rpriv->rep;
 
-   ether_addr_copy(attr->u.ppid.id, rep->hw_id);
-   }
-   break;
-   default:
-   return -EOPNOTSUPP;
+   ether_addr_copy(ppid->id, rep->hw_id);
}
 
return 0;
@@ -1284,10 +1279,6 @@ static int mlx5e_uplink_rep_set_vf_vlan(struct 
net_device *dev, int vf, u16 vlan
return 0;
 }
 
-static const struct switchdev_ops mlx5e_rep_switchdev_ops = {
-   .switchdev_port_attr_get= mlx5e_attr_get,
-};
-
 static const struct net_device_ops mlx5e_netdev_ops_vf_rep = {
.ndo_open= mlx5e_vf_rep_open,
.ndo_stop= mlx5e_vf_rep_close,
@@ -1298,6 +1289,7 @@ static const struct net_device_ops 
mlx5e_netdev_ops_vf_rep = {
.ndo_has_offload_stats   = mlx5e_rep_has_offload_stats,
.ndo_get_offload_stats   = mlx5e_rep_get_offload_stats,
.ndo_change_mtu  = mlx5e_vf_rep_change_mtu,
+   .ndo_get_port_parent_id  = mlx5e_rep_get_port_parent_id,
 };
 
 static const struct net_device_ops mlx5e_netdev_ops_uplink_rep = {
@@ -1319,6 +1311,7 @@ static const struct net_device_ops 
mlx5e_netdev_ops_uplink_rep = {
.ndo_get_vf_config   = mlx5e_get_vf_config,
.ndo_get_vf_stats= mlx5e_get_vf_stats,
.ndo_set_vf_vlan = mlx5e_uplink_rep_set_vf_vlan,
+   .ndo_get_port_parent_id  = mlx5e_rep_get_port_parent_id,
 };
 
 bool mlx5e_eswitch_rep(struct net_device *netdev)
@@ -1393,8 +1386,6 @@ static void mlx5e_build_rep_netdev(struct net_device 
*netdev)
netdev->watchdog_timeo= 15 * HZ;
 
 
-   netdev->switchdev_ops = &mlx5e_rep_switchdev_ops;
-
netdev->features |= NETIF_F_HW_TC | NETIF_F_NETNS_LOCAL;
netdev->hw_features  |= NETIF_F_HW_TC;
 
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c 
b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
index 74159d39dd66..098b28feba0c 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
+++ b/drivers/net/ethe

[PATCH net-next v4 05/12] mlxsw: Implement ndo_get_port_parent_id()

2019-02-06 Thread Florian Fainelli
mlxsw implements SWITCHDEV_ATTR_ID_PORT_PARENT_ID and we want to get rid
of switchdev_ops eventually, ease that migration by implementing a
ndo_get_port_parent_id() function which returns what
switchdev_port_attr_get() would do.

Acked-by: Jiri Pirko 
Signed-off-by: Florian Fainelli 
---
 .../net/ethernet/mellanox/mlxsw/spectrum.c| 13 +++
 .../mellanox/mlxsw/spectrum_switchdev.c   |  5 ---
 .../net/ethernet/mellanox/mlxsw/switchx2.c| 37 +++
 3 files changed, 26 insertions(+), 29 deletions(-)

diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c 
b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
index a88169738b4a..8dd808b7f931 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
@@ -1700,6 +1700,18 @@ static int mlxsw_sp_set_features(struct net_device *dev,
   mlxsw_sp_feature_hw_tc);
 }
 
+static int mlxsw_sp_port_get_port_parent_id(struct net_device *dev,
+   struct netdev_phys_item_id *ppid)
+{
+   struct mlxsw_sp_port *mlxsw_sp_port = netdev_priv(dev);
+   struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
+
+   ppid->id_len = sizeof(mlxsw_sp->base_mac);
+   memcpy(&ppid->id, &mlxsw_sp->base_mac, ppid->id_len);
+
+   return 0;
+}
+
 static const struct net_device_ops mlxsw_sp_port_netdev_ops = {
.ndo_open   = mlxsw_sp_port_open,
.ndo_stop   = mlxsw_sp_port_stop,
@@ -1715,6 +1727,7 @@ static const struct net_device_ops 
mlxsw_sp_port_netdev_ops = {
.ndo_vlan_rx_kill_vid   = mlxsw_sp_port_kill_vid,
.ndo_get_phys_port_name = mlxsw_sp_port_get_phys_port_name,
.ndo_set_features   = mlxsw_sp_set_features,
+   .ndo_get_port_parent_id = mlxsw_sp_port_get_port_parent_id,
 };
 
 static void mlxsw_sp_port_get_drvinfo(struct net_device *dev,
diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c 
b/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c
index a4a9fe992193..95e37de3e48f 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c
@@ -451,11 +451,6 @@ static int mlxsw_sp_port_attr_get(struct net_device *dev,
struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
 
switch (attr->id) {
-   case SWITCHDEV_ATTR_ID_PORT_PARENT_ID:
-   attr->u.ppid.id_len = sizeof(mlxsw_sp->base_mac);
-   memcpy(&attr->u.ppid.id, &mlxsw_sp->base_mac,
-  attr->u.ppid.id_len);
-   break;
case SWITCHDEV_ATTR_ID_PORT_BRIDGE_FLAGS:
mlxsw_sp_port_bridge_flags_get(mlxsw_sp->bridge, attr->orig_dev,
   &attr->u.brport_flags);
diff --git a/drivers/net/ethernet/mellanox/mlxsw/switchx2.c 
b/drivers/net/ethernet/mellanox/mlxsw/switchx2.c
index 2d4f213e154d..533fe6235b7c 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/switchx2.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/switchx2.c
@@ -11,7 +11,6 @@
 #include 
 #include 
 #include 
-#include 
 
 #include "pci.h"
 #include "core.h"
@@ -390,6 +389,18 @@ static int mlxsw_sx_port_get_phys_port_name(struct 
net_device *dev, char *name,
  name, len);
 }
 
+static int mlxsw_sx_port_get_port_parent_id(struct net_device *dev,
+   struct netdev_phys_item_id *ppid)
+{
+   struct mlxsw_sx_port *mlxsw_sx_port = netdev_priv(dev);
+   struct mlxsw_sx *mlxsw_sx = mlxsw_sx_port->mlxsw_sx;
+
+   ppid->id_len = sizeof(mlxsw_sx->hw_id);
+   memcpy(&ppid->id, &mlxsw_sx->hw_id, ppid->id_len);
+
+   return 0;
+}
+
 static const struct net_device_ops mlxsw_sx_port_netdev_ops = {
.ndo_open   = mlxsw_sx_port_open,
.ndo_stop   = mlxsw_sx_port_stop,
@@ -397,6 +408,7 @@ static const struct net_device_ops mlxsw_sx_port_netdev_ops 
= {
.ndo_change_mtu = mlxsw_sx_port_change_mtu,
.ndo_get_stats64= mlxsw_sx_port_get_stats64,
.ndo_get_phys_port_name = mlxsw_sx_port_get_phys_port_name,
+   .ndo_get_port_parent_id = mlxsw_sx_port_get_port_parent_id,
 };
 
 static void mlxsw_sx_port_get_drvinfo(struct net_device *dev,
@@ -901,28 +913,6 @@ static const struct ethtool_ops mlxsw_sx_port_ethtool_ops 
= {
.set_link_ksettings = mlxsw_sx_port_set_link_ksettings,
 };
 
-static int mlxsw_sx_port_attr_get(struct net_device *dev,
- struct switchdev_attr *attr)
-{
-   struct mlxsw_sx_port *mlxsw_sx_port = netdev_priv(dev);
-   struct mlxsw_sx *mlxsw_sx = mlxsw_sx_port->mlxsw_sx;
-
-   switch (attr->id) {
-   case SWITCHDEV_ATTR_ID_PORT_PARENT_ID:
-   attr->u.ppid.id_len = sizeof(mlxsw_sx->hw_id);
-   memcpy(&attr->u.ppid.id, &mlxsw_sx->hw_id, attr->u.ppid.id_len);
- 

[PATCH net-next v4 11/12] net: dsa: Implement ndo_get_port_parent_id()

2019-02-06 Thread Florian Fainelli
DSA implements SWITCHDEV_ATTR_ID_PORT_PARENT_ID and we want to get rid
of switchdev_ops eventually, ease that migration by implementing a
ndo_get_port_parent_id() function which returns what
switchdev_port_attr_get() would do.

Acked-by: Jiri Pirko 
Signed-off-by: Florian Fainelli 
---
 net/dsa/slave.c | 18 --
 1 file changed, 12 insertions(+), 6 deletions(-)

diff --git a/net/dsa/slave.c b/net/dsa/slave.c
index 91de3a663226..70395a0ae52e 100644
--- a/net/dsa/slave.c
+++ b/net/dsa/slave.c
@@ -362,18 +362,23 @@ static int dsa_slave_port_obj_del(struct net_device *dev,
return err;
 }
 
-static int dsa_slave_port_attr_get(struct net_device *dev,
-  struct switchdev_attr *attr)
+static int dsa_slave_get_port_parent_id(struct net_device *dev,
+   struct netdev_phys_item_id *ppid)
 {
struct dsa_port *dp = dsa_slave_to_port(dev);
struct dsa_switch *ds = dp->ds;
struct dsa_switch_tree *dst = ds->dst;
 
+   ppid->id_len = sizeof(dst->index);
+   memcpy(&ppid->id, &dst->index, ppid->id_len);
+
+   return 0;
+}
+
+static int dsa_slave_port_attr_get(struct net_device *dev,
+  struct switchdev_attr *attr)
+{
switch (attr->id) {
-   case SWITCHDEV_ATTR_ID_PORT_PARENT_ID:
-   attr->u.ppid.id_len = sizeof(dst->index);
-   memcpy(&attr->u.ppid.id, &dst->index, attr->u.ppid.id_len);
-   break;
case SWITCHDEV_ATTR_ID_PORT_BRIDGE_FLAGS_SUPPORT:
attr->u.brport_flags_support = 0;
break;
@@ -1046,6 +1051,7 @@ static const struct net_device_ops dsa_slave_netdev_ops = 
{
.ndo_get_phys_port_name = dsa_slave_get_phys_port_name,
.ndo_setup_tc   = dsa_slave_setup_tc,
.ndo_get_stats64= dsa_slave_get_stats64,
+   .ndo_get_port_parent_id = dsa_slave_get_port_parent_id,
 };
 
 static const struct switchdev_ops dsa_slave_switchdev_ops = {
-- 
2.17.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH net-next v4 10/12] staging: fsl-dpaa2: ethsw: Implement ndo_get_port_parent_id()

2019-02-06 Thread Florian Fainelli
ethsw implements SWITCHDEV_ATTR_ID_PORT_PARENT_ID and we want to get rid
of switchdev_ops eventually, ease that migration by implementing a
ndo_get_port_parent_id() function which returns what
switchdev_port_attr_get() would do.

Signed-off-by: Florian Fainelli 
---
 drivers/staging/fsl-dpaa2/ethsw/ethsw.c | 16 
 1 file changed, 12 insertions(+), 4 deletions(-)

diff --git a/drivers/staging/fsl-dpaa2/ethsw/ethsw.c 
b/drivers/staging/fsl-dpaa2/ethsw/ethsw.c
index daabaceeea52..e559f4c25cf7 100644
--- a/drivers/staging/fsl-dpaa2/ethsw/ethsw.c
+++ b/drivers/staging/fsl-dpaa2/ethsw/ethsw.c
@@ -505,6 +505,17 @@ static netdev_tx_t port_dropframe(struct sk_buff *skb,
return NETDEV_TX_OK;
 }
 
+static int swdev_get_port_parent_id(struct net_device *dev,
+   struct netdev_phys_item_id *ppid)
+{
+   struct ethsw_port_priv *port_priv = netdev_priv(dev);
+
+   ppid->id_len = 1;
+   ppid->id[0] = port_priv->ethsw_data->dev_id;
+
+   return 0;
+}
+
 static const struct net_device_ops ethsw_port_ops = {
.ndo_open   = port_open,
.ndo_stop   = port_stop,
@@ -515,6 +526,7 @@ static const struct net_device_ops ethsw_port_ops = {
.ndo_get_offload_stats  = port_get_offload_stats,
 
.ndo_start_xmit = port_dropframe,
+   .ndo_get_port_parent_id = swdev_get_port_parent_id,
 };
 
 static void ethsw_links_state_update(struct ethsw_core *ethsw)
@@ -634,10 +646,6 @@ static int swdev_port_attr_get(struct net_device *netdev,
struct ethsw_port_priv *port_priv = netdev_priv(netdev);
 
switch (attr->id) {
-   case SWITCHDEV_ATTR_ID_PORT_PARENT_ID:
-   attr->u.ppid.id_len = 1;
-   attr->u.ppid.id[0] = port_priv->ethsw_data->dev_id;
-   break;
case SWITCHDEV_ATTR_ID_PORT_BRIDGE_FLAGS:
attr->u.brport_flags =
(port_priv->ethsw_data->learning ? BR_LEARNING : 0) |
-- 
2.17.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH net-next v4 08/12] rocker: Implement ndo_get_port_parent_id()

2019-02-06 Thread Florian Fainelli
mlxsw implements SWITCHDEV_ATTR_ID_PORT_PARENT_ID and we want to get rid
of switchdev_ops eventually, ease that migration by implementing a
ndo_get_port_parent_id() function which returns what
switchdev_port_attr_get() would do.

Acked-by: Jiri Pirko 
Signed-off-by: Florian Fainelli 
---
 drivers/net/ethernet/rocker/rocker_main.c | 17 +
 1 file changed, 13 insertions(+), 4 deletions(-)

diff --git a/drivers/net/ethernet/rocker/rocker_main.c 
b/drivers/net/ethernet/rocker/rocker_main.c
index 62a205eba9f7..596f44dbfae1 100644
--- a/drivers/net/ethernet/rocker/rocker_main.c
+++ b/drivers/net/ethernet/rocker/rocker_main.c
@@ -2026,6 +2026,18 @@ static void rocker_port_neigh_destroy(struct net_device 
*dev,
err);
 }
 
+static int rocker_port_get_port_parent_id(struct net_device *dev,
+ struct netdev_phys_item_id *ppid)
+{
+   const struct rocker_port *rocker_port = netdev_priv(dev);
+   const struct rocker *rocker = rocker_port->rocker;
+
+   ppid->id_len = sizeof(rocker->hw.id);
+   memcpy(&ppid->id, &rocker->hw.id, ppid->id_len);
+
+   return 0;
+}
+
 static const struct net_device_ops rocker_port_netdev_ops = {
.ndo_open   = rocker_port_open,
.ndo_stop   = rocker_port_stop,
@@ -2035,6 +2047,7 @@ static const struct net_device_ops rocker_port_netdev_ops 
= {
.ndo_get_phys_port_name = rocker_port_get_phys_port_name,
.ndo_change_proto_down  = rocker_port_change_proto_down,
.ndo_neigh_destroy  = rocker_port_neigh_destroy,
+   .ndo_get_port_parent_id = rocker_port_get_port_parent_id,
 };
 
 /
@@ -2049,10 +2062,6 @@ static int rocker_port_attr_get(struct net_device *dev,
int err = 0;
 
switch (attr->id) {
-   case SWITCHDEV_ATTR_ID_PORT_PARENT_ID:
-   attr->u.ppid.id_len = sizeof(rocker->hw.id);
-   memcpy(&attr->u.ppid.id, &rocker->hw.id, attr->u.ppid.id_len);
-   break;
case SWITCHDEV_ATTR_ID_PORT_BRIDGE_FLAGS:
err = rocker_world_port_attr_bridge_flags_get(rocker_port,
  
&attr->u.brport_flags);
-- 
2.17.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH net-next v4 06/12] mscc: ocelot: Implement ndo_get_port_parent_id()

2019-02-06 Thread Florian Fainelli
Ocelot only supports SWITCHDEV_ATTR_ID_PORT_PARENT_ID as a valid
switchdev attribute getter, convert it to use ndo_get_port_parent_id()
and get rid of the switchdev_ops::switchdev_port_attr_get altogether.

Acked-by: Jiri Pirko 
Signed-off-by: Florian Fainelli 
---
 drivers/net/ethernet/mscc/ocelot.c | 33 --
 1 file changed, 13 insertions(+), 20 deletions(-)

diff --git a/drivers/net/ethernet/mscc/ocelot.c 
b/drivers/net/ethernet/mscc/ocelot.c
index c6a575eb0ff5..195306d05bcd 100644
--- a/drivers/net/ethernet/mscc/ocelot.c
+++ b/drivers/net/ethernet/mscc/ocelot.c
@@ -916,6 +916,18 @@ static int ocelot_set_features(struct net_device *dev,
return 0;
 }
 
+static int ocelot_get_port_parent_id(struct net_device *dev,
+struct netdev_phys_item_id *ppid)
+{
+   struct ocelot_port *ocelot_port = netdev_priv(dev);
+   struct ocelot *ocelot = ocelot_port->ocelot;
+
+   ppid->id_len = sizeof(ocelot->base_mac);
+   memcpy(&ppid->id, &ocelot->base_mac, ppid->id_len);
+
+   return 0;
+}
+
 static const struct net_device_ops ocelot_port_netdev_ops = {
.ndo_open   = ocelot_port_open,
.ndo_stop   = ocelot_port_stop,
@@ -930,6 +942,7 @@ static const struct net_device_ops ocelot_port_netdev_ops = 
{
.ndo_vlan_rx_add_vid= ocelot_vlan_rx_add_vid,
.ndo_vlan_rx_kill_vid   = ocelot_vlan_rx_kill_vid,
.ndo_set_features   = ocelot_set_features,
+   .ndo_get_port_parent_id = ocelot_get_port_parent_id,
 };
 
 static void ocelot_get_strings(struct net_device *netdev, u32 sset, u8 *data)
@@ -1013,25 +1026,6 @@ static const struct ethtool_ops ocelot_ethtool_ops = {
.set_link_ksettings = phy_ethtool_set_link_ksettings,
 };
 
-static int ocelot_port_attr_get(struct net_device *dev,
-   struct switchdev_attr *attr)
-{
-   struct ocelot_port *ocelot_port = netdev_priv(dev);
-   struct ocelot *ocelot = ocelot_port->ocelot;
-
-   switch (attr->id) {
-   case SWITCHDEV_ATTR_ID_PORT_PARENT_ID:
-   attr->u.ppid.id_len = sizeof(ocelot->base_mac);
-   memcpy(&attr->u.ppid.id, &ocelot->base_mac,
-  attr->u.ppid.id_len);
-   break;
-   default:
-   return -EOPNOTSUPP;
-   }
-
-   return 0;
-}
-
 static int ocelot_port_attr_stp_state_set(struct ocelot_port *ocelot_port,
  struct switchdev_trans *trans,
  u8 state)
@@ -1331,7 +1325,6 @@ static int ocelot_port_obj_del(struct net_device *dev,
 }
 
 static const struct switchdev_ops ocelot_port_switchdev_ops = {
-   .switchdev_port_attr_get= ocelot_port_attr_get,
.switchdev_port_attr_set= ocelot_port_attr_set,
 };
 
-- 
2.17.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH net-next v4 09/12] netdevsim: Implement ndo_get_port_parent_id()

2019-02-06 Thread Florian Fainelli
netdevsim only supports SWITCHDEV_ATTR_ID_PORT_PARENT_ID, which makes it a
great candidate to be converted to use the ndo_get_port_parent_id() NDO
instead of implementing switchdev_port_attr_get().

Acked-by: Jiri Pirko 
Signed-off-by: Florian Fainelli 
---
 drivers/net/netdevsim/netdev.c | 23 ++-
 1 file changed, 6 insertions(+), 17 deletions(-)

diff --git a/drivers/net/netdevsim/netdev.c b/drivers/net/netdevsim/netdev.c
index 8d8e2b3f263e..75a50b59cb8f 100644
--- a/drivers/net/netdevsim/netdev.c
+++ b/drivers/net/netdevsim/netdev.c
@@ -22,7 +22,6 @@
 #include 
 #include 
 #include 
-#include 
 
 #include "netdevsim.h"
 
@@ -148,26 +147,16 @@ static struct device_type nsim_dev_type = {
.release = nsim_dev_release,
 };
 
-static int
-nsim_port_attr_get(struct net_device *dev, struct switchdev_attr *attr)
+static int nsim_get_port_parent_id(struct net_device *dev,
+  struct netdev_phys_item_id *ppid)
 {
struct netdevsim *ns = netdev_priv(dev);
 
-   switch (attr->id) {
-   case SWITCHDEV_ATTR_ID_PORT_PARENT_ID:
-   attr->u.ppid.id_len = sizeof(ns->sdev->switch_id);
-   memcpy(&attr->u.ppid.id, &ns->sdev->switch_id,
-  attr->u.ppid.id_len);
-   return 0;
-   default:
-   return -EOPNOTSUPP;
-   }
+   ppid->id_len = sizeof(ns->sdev->switch_id);
+   memcpy(&ppid->id, &ns->sdev->switch_id, ppid->id_len);
+   return 0;
 }
 
-static const struct switchdev_ops nsim_switchdev_ops = {
-   .switchdev_port_attr_get= nsim_port_attr_get,
-};
-
 static int nsim_init(struct net_device *dev)
 {
char sdev_ddir_name[10], sdev_link_name[32];
@@ -214,7 +203,6 @@ static int nsim_init(struct net_device *dev)
goto err_bpf_uninit;
 
SET_NETDEV_DEV(dev, &ns->dev);
-   SWITCHDEV_SET_OPS(dev, &nsim_switchdev_ops);
 
err = nsim_devlink_setup(ns);
if (err)
@@ -493,6 +481,7 @@ static const struct net_device_ops nsim_netdev_ops = {
.ndo_setup_tc   = nsim_setup_tc,
.ndo_set_features   = nsim_set_features,
.ndo_bpf= nsim_bpf,
+   .ndo_get_port_parent_id = nsim_get_port_parent_id,
 };
 
 static void nsim_setup(struct net_device *dev)
-- 
2.17.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH net-next v4 07/12] nfp: Implement ndo_get_port_parent_id()

2019-02-06 Thread Florian Fainelli
NFP only supports SWITCHDEV_ATTR_ID_PORT_PARENT_ID, which makes it a
great candidate to be converted to use the ndo_get_port_parent_id() NDO
instead of implementing switchdev_port_attr_get().

Since NFP uses switchdev_port_same_parent_id() convert it to use
netdev_port_same_parent_id().

Acked-by: Jiri Pirko 
Signed-off-by: Florian Fainelli 
---
 .../ethernet/netronome/nfp/flower/action.c|  3 +--
 .../ethernet/netronome/nfp/nfp_net_common.c   |  4 +---
 .../net/ethernet/netronome/nfp/nfp_net_repr.c |  4 +---
 drivers/net/ethernet/netronome/nfp/nfp_port.c | 22 +--
 drivers/net/ethernet/netronome/nfp/nfp_port.h |  4 +++-
 5 files changed, 11 insertions(+), 26 deletions(-)

diff --git a/drivers/net/ethernet/netronome/nfp/flower/action.c 
b/drivers/net/ethernet/netronome/nfp/flower/action.c
index 8d54b36afee8..7b217d7285c7 100644
--- a/drivers/net/ethernet/netronome/nfp/flower/action.c
+++ b/drivers/net/ethernet/netronome/nfp/flower/action.c
@@ -3,7 +3,6 @@
 
 #include 
 #include 
-#include 
 #include 
 #include 
 #include 
@@ -137,7 +136,7 @@ nfp_fl_output(struct nfp_app *app, struct nfp_fl_output 
*output,
 
if (nfp_netdev_is_nfp_repr(in_dev)) {
/* Confirm ingress and egress are on same device. */
-   if (!switchdev_port_same_parent_id(in_dev, out_dev))
+   if (!netdev_port_same_parent_id(in_dev, out_dev))
return -EOPNOTSUPP;
}
 
diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net_common.c 
b/drivers/net/ethernet/netronome/nfp/nfp_net_common.c
index 7d2d4241498f..776f6c07701b 100644
--- a/drivers/net/ethernet/netronome/nfp/nfp_net_common.c
+++ b/drivers/net/ethernet/netronome/nfp/nfp_net_common.c
@@ -36,7 +36,6 @@
 #include 
 #include 
 
-#include 
 #include 
 
 #include "nfpcore/nfp_nsp.h"
@@ -3531,6 +3530,7 @@ const struct net_device_ops nfp_net_netdev_ops = {
.ndo_udp_tunnel_add = nfp_net_add_vxlan_port,
.ndo_udp_tunnel_del = nfp_net_del_vxlan_port,
.ndo_bpf= nfp_net_xdp,
+   .ndo_get_port_parent_id = nfp_port_get_port_parent_id,
 };
 
 /**
@@ -3815,8 +3815,6 @@ static void nfp_net_netdev_init(struct nfp_net *nn)
netdev->netdev_ops = &nfp_net_netdev_ops;
netdev->watchdog_timeo = msecs_to_jiffies(5 * 1000);
 
-   SWITCHDEV_SET_OPS(netdev, &nfp_port_switchdev_ops);
-
/* MTU range: 68 - hw-specific max */
netdev->min_mtu = ETH_MIN_MTU;
netdev->max_mtu = nn->max_mtu;
diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net_repr.c 
b/drivers/net/ethernet/netronome/nfp/nfp_net_repr.c
index 69d7aebda09b..62839807e21e 100644
--- a/drivers/net/ethernet/netronome/nfp/nfp_net_repr.c
+++ b/drivers/net/ethernet/netronome/nfp/nfp_net_repr.c
@@ -5,7 +5,6 @@
 #include 
 #include 
 #include 
-#include 
 
 #include "nfpcore/nfp_cpp.h"
 #include "nfpcore/nfp_nsp.h"
@@ -273,6 +272,7 @@ const struct net_device_ops nfp_repr_netdev_ops = {
.ndo_fix_features   = nfp_repr_fix_features,
.ndo_set_features   = nfp_port_set_features,
.ndo_set_mac_address= eth_mac_addr,
+   .ndo_get_port_parent_id = nfp_port_get_port_parent_id,
 };
 
 void
@@ -336,8 +336,6 @@ int nfp_repr_init(struct nfp_app *app, struct net_device 
*netdev,
 
netdev->max_mtu = pf_netdev->max_mtu;
 
-   SWITCHDEV_SET_OPS(netdev, &nfp_port_switchdev_ops);
-
/* Set features the lower device can support with representors */
if (repr_cap & NFP_NET_CFG_CTRL_LIVE_ADDR)
netdev->priv_flags |= IFF_LIVE_ADDR_CHANGE;
diff --git a/drivers/net/ethernet/netronome/nfp/nfp_port.c 
b/drivers/net/ethernet/netronome/nfp/nfp_port.c
index 86bc149ca231..7e90880fa46b 100644
--- a/drivers/net/ethernet/netronome/nfp/nfp_port.c
+++ b/drivers/net/ethernet/netronome/nfp/nfp_port.c
@@ -31,34 +31,22 @@ struct nfp_port *nfp_port_from_netdev(struct net_device 
*netdev)
return NULL;
 }
 
-static int
-nfp_port_attr_get(struct net_device *netdev, struct switchdev_attr *attr)
+int nfp_port_get_port_parent_id(struct net_device *netdev,
+   struct netdev_phys_item_id *ppid)
 {
struct nfp_port *port;
+   const u8 *serial;
 
port = nfp_port_from_netdev(netdev);
if (!port)
return -EOPNOTSUPP;
 
-   switch (attr->id) {
-   case SWITCHDEV_ATTR_ID_PORT_PARENT_ID: {
-   const u8 *serial;
-   /* N.B: attr->u.ppid.id is binary data */
-   attr->u.ppid.id_len = nfp_cpp_serial(port->app->cpp, &serial);
-   memcpy(&attr->u.ppid.id, serial, attr->u.ppid.id_len);
-   break;
-   }
-   default:
-   return -EOPNOTSUPP;
-   }
+   ppid->id_len = nfp_cpp_serial(port->app->cpp, &serial);
+   memcpy(&ppid->id, serial, ppid->id_len);
 
return 0;
 }
 
-const struct switchdev_ops nfp_port_switchdev_ops = {
-   .switc

[PATCH net-next v4 01/12] net: Introduce ndo_get_port_parent_id()

2019-02-06 Thread Florian Fainelli
In preparation for getting rid of switchdev_ops, create a dedicated NDO
operation for getting the port's parent identifier. There are
essentially two classes of drivers that need to implement getting the
port's parent ID which are VF/PF drivers with a built-in switch, and
pure switchdev drivers such as mlxsw, ocelot, dsa etc.

We introduce a helper function: dev_get_port_parent_id() which supports
recursion into the lower devices to obtain the first port's parent ID.

Convert the bridge, core and ipv4 multicast routing code to check for
such ndo_get_port_parent_id() and call the helper function when valid
before falling back to switchdev_port_attr_get(). This will allow us to
convert all relevant drivers in one go instead of having to implement
both switchdev_port_attr_get() and ndo_get_port_parent_id() operations,
then get rid of switchdev_port_attr_get().

Acked-by: Jiri Pirko 
Signed-off-by: Florian Fainelli 
---
 include/linux/netdevice.h |  9 +++
 net/bridge/br_switchdev.c |  9 +--
 net/core/dev.c| 57 +++
 net/core/net-sysfs.c  |  7 -
 net/core/rtnetlink.c  |  6 -
 net/ipv4/ipmr.c   |  8 +-
 6 files changed, 91 insertions(+), 5 deletions(-)

diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index ba57d0ba425e..1d95e634f3fe 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -1188,6 +1188,10 @@ struct dev_ifalias {
  * not implement this, it is assumed that the hw is not able to have
  * multiple net devices on single physical port.
  *
+ * int (*ndo_get_port_parent_id)(struct net_device *dev,
+ *  struct netdev_phys_item_id *ppid)
+ * Called to get the parent ID of the physical port of this device.
+ *
  * void (*ndo_udp_tunnel_add)(struct net_device *dev,
  *   struct udp_tunnel_info *ti);
  * Called by UDP tunnel to notify a driver about the UDP port and socket
@@ -1412,6 +1416,8 @@ struct net_device_ops {
  bool new_carrier);
int (*ndo_get_phys_port_id)(struct net_device *dev,
struct 
netdev_phys_item_id *ppid);
+   int (*ndo_get_port_parent_id)(struct net_device 
*dev,
+ struct 
netdev_phys_item_id *ppid);
int (*ndo_get_phys_port_name)(struct net_device 
*dev,
  char *name, size_t 
len);
void(*ndo_udp_tunnel_add)(struct net_device *dev,
@@ -3651,6 +3657,9 @@ int dev_get_phys_port_id(struct net_device *dev,
 struct netdev_phys_item_id *ppid);
 int dev_get_phys_port_name(struct net_device *dev,
   char *name, size_t len);
+int dev_get_port_parent_id(struct net_device *dev,
+  struct netdev_phys_item_id *ppid, bool recurse);
+bool netdev_port_same_parent_id(struct net_device *a, struct net_device *b);
 int dev_change_proto_down(struct net_device *dev, bool proto_down);
 struct sk_buff *validate_xmit_skb_list(struct sk_buff *skb, struct net_device 
*dev, bool *again);
 struct sk_buff *dev_hard_start_xmit(struct sk_buff *skb, struct net_device 
*dev,
diff --git a/net/bridge/br_switchdev.c b/net/bridge/br_switchdev.c
index 4d2b9eb7604a..06b0ae44585f 100644
--- a/net/bridge/br_switchdev.c
+++ b/net/bridge/br_switchdev.c
@@ -14,7 +14,8 @@ static int br_switchdev_mark_get(struct net_bridge *br, 
struct net_device *dev)
 
/* dev is yet to be added to the port list. */
list_for_each_entry(p, &br->port_list, list) {
-   if (switchdev_port_same_parent_id(dev, p->dev))
+   if (netdev_port_same_parent_id(dev, p->dev) ||
+   switchdev_port_same_parent_id(dev, p->dev))
return p->offload_fwd_mark;
}
 
@@ -23,6 +24,7 @@ static int br_switchdev_mark_get(struct net_bridge *br, 
struct net_device *dev)
 
 int nbp_switchdev_mark_set(struct net_bridge_port *p)
 {
+   const struct net_device_ops *ops = p->dev->netdev_ops;
struct switchdev_attr attr = {
.orig_dev = p->dev,
.id = SWITCHDEV_ATTR_ID_PORT_PARENT_ID,
@@ -31,7 +33,10 @@ int nbp_switchdev_mark_set(struct net_bridge_port *p)
 
ASSERT_RTNL();
 
-   err = switchdev_port_attr_get(p->dev, &attr);
+   if (ops->ndo_get_port_parent_id)
+   err = dev_get_port_parent_id(p->dev, &attr.u.ppid, true);
+   else
+   err = switchdev_port_attr_get(p->dev, &attr);
if (err) {
if (err == -EOPNOTSUPP)
return 0;
diff --git a/net/core/dev.c b/net/core/dev.c
index bfa4be42afff..8c6d5cf8a308 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -7877,6 +7877,63 @@ int dev_get_phys_port_name

[PATCH net-next v4 02/12] bnxt: Implement ndo_get_port_parent_id()

2019-02-06 Thread Florian Fainelli
BNXT only supports SWITCHDEV_ATTR_ID_PORT_PARENT_ID, which makes it a
great candidate to be converted to use the ndo_get_port_parent_id() NDO
instead of implementing switchdev_port_attr_get(). The conversion is
straight forward here since the PF and VF code use the same getter.

Since bnxt makes uses of switchdev_port_same_parent_id() convert it to
use netdev_port_same_parent_id().

Acked-by: Jiri Pirko 
Signed-off-by: Florian Fainelli 
---
 drivers/net/ethernet/broadcom/bnxt/bnxt.c | 28 ++-
 drivers/net/ethernet/broadcom/bnxt/bnxt.h |  4 +--
 drivers/net/ethernet/broadcom/bnxt/bnxt_tc.c  |  2 +-
 drivers/net/ethernet/broadcom/bnxt/bnxt_vfr.c | 12 +++-
 4 files changed, 15 insertions(+), 31 deletions(-)

diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c 
b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
index 6a512871176b..1c2987c3d708 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
@@ -9981,8 +9981,11 @@ static int bnxt_get_phys_port_name(struct net_device 
*dev, char *buf,
return 0;
 }
 
-int bnxt_port_attr_get(struct bnxt *bp, struct switchdev_attr *attr)
+int bnxt_get_port_parent_id(struct net_device *dev,
+   struct netdev_phys_item_id *ppid)
 {
+   struct bnxt *bp = netdev_priv(dev);
+
if (bp->eswitch_mode != DEVLINK_ESWITCH_MODE_SWITCHDEV)
return -EOPNOTSUPP;
 
@@ -9990,27 +9993,12 @@ int bnxt_port_attr_get(struct bnxt *bp, struct 
switchdev_attr *attr)
if (!BNXT_PF(bp))
return -EOPNOTSUPP;
 
-   switch (attr->id) {
-   case SWITCHDEV_ATTR_ID_PORT_PARENT_ID:
-   attr->u.ppid.id_len = sizeof(bp->switch_id);
-   memcpy(attr->u.ppid.id, bp->switch_id, attr->u.ppid.id_len);
-   break;
-   default:
-   return -EOPNOTSUPP;
-   }
-   return 0;
-}
+   ppid->id_len = sizeof(bp->switch_id);
+   memcpy(ppid->id, bp->switch_id, ppid->id_len);
 
-static int bnxt_swdev_port_attr_get(struct net_device *dev,
-   struct switchdev_attr *attr)
-{
-   return bnxt_port_attr_get(netdev_priv(dev), attr);
+   return 0;
 }
 
-static const struct switchdev_ops bnxt_switchdev_ops = {
-   .switchdev_port_attr_get= bnxt_swdev_port_attr_get
-};
-
 static const struct net_device_ops bnxt_netdev_ops = {
.ndo_open   = bnxt_open,
.ndo_start_xmit = bnxt_start_xmit,
@@ -10042,6 +10030,7 @@ static const struct net_device_ops bnxt_netdev_ops = {
.ndo_bpf= bnxt_xdp,
.ndo_bridge_getlink = bnxt_bridge_getlink,
.ndo_bridge_setlink = bnxt_bridge_setlink,
+   .ndo_get_port_parent_id = bnxt_get_port_parent_id,
.ndo_get_phys_port_name = bnxt_get_phys_port_name
 };
 
@@ -10400,7 +10389,6 @@ static int bnxt_init_one(struct pci_dev *pdev, const 
struct pci_device_id *ent)
dev->netdev_ops = &bnxt_netdev_ops;
dev->watchdog_timeo = BNXT_TX_TIMEOUT;
dev->ethtool_ops = &bnxt_ethtool_ops;
-   SWITCHDEV_SET_OPS(dev, &bnxt_switchdev_ops);
pci_set_drvdata(pdev, dev);
 
rc = bnxt_alloc_hwrm_resources(bp);
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h 
b/drivers/net/ethernet/broadcom/bnxt/bnxt.h
index 5c886a700bcc..17554d4be651 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h
@@ -22,7 +22,6 @@
 #include 
 #include 
 #include 
-#include 
 #include 
 #include 
 
@@ -1795,7 +1794,8 @@ int bnxt_check_rings(struct bnxt *bp, int tx, int rx, 
bool sh, int tcs,
 int bnxt_setup_mq_tc(struct net_device *dev, u8 tc);
 int bnxt_get_max_rings(struct bnxt *, int *, int *, bool);
 int bnxt_restore_pf_fw_resources(struct bnxt *bp);
-int bnxt_port_attr_get(struct bnxt *bp, struct switchdev_attr *attr);
+int bnxt_get_port_parent_id(struct net_device *dev,
+   struct netdev_phys_item_id *ppid);
 void bnxt_dim_work(struct work_struct *work);
 int bnxt_hwrm_set_ring_coal(struct bnxt *bp, struct bnxt_napi *bnapi);
 
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_tc.c 
b/drivers/net/ethernet/broadcom/bnxt/bnxt_tc.c
index c683b5e96b1d..86950f70de1f 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_tc.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_tc.c
@@ -45,7 +45,7 @@ static u16 bnxt_flow_get_dst_fid(struct bnxt *pf_bp, struct 
net_device *dev)
struct bnxt *bp;
 
/* check if dev belongs to the same switch */
-   if (!switchdev_port_same_parent_id(pf_bp->dev, dev)) {
+   if (!netdev_port_same_parent_id(pf_bp->dev, dev)) {
netdev_info(pf_bp->dev, "dev(ifindex=%d) not on same switch",
dev->ifindex);
return BNXT_FID_INVALID;
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_vfr.c 
b/drivers/net/ethernet/broadcom/bnxt/bnxt_vfr.c
index 9a25c05aa571..2bdd2da9aac7 100644
--- a/drive

[PATCH net-next v4 00/12] net: Introduce ndo_get_port_parent_id()

2019-02-06 Thread Florian Fainelli
Hi all,

Based on discussion with Ido and feedback from Jakub there are clearly
two classes of users that implement SWITCHDEV_ATTR_ID_PORT_PARENT_ID:

- PF/VF drivers which typically only implement return the port's parent
  ID, yet have to implement switchdev_port_attr_get() just for that

- Ethernet switch drivers: mlxsw, ocelot, DSA, etc. which implement more
  attributes which we want to be able to eventually veto in the context
  of the caller, thus making them candidates for using a blocking notifier
  chain

Changes in v4:

- remove superfluous net/switchdev.h inclusions in a few files
- added Jiri's Acked-by where given
- removed err = -EOPNOTSUPP initializations
- changed according to Jiri's suggestion in net/ipv4/ipmr.c

Changes in v3:

- keep ethsw's switchdev_ops assignment
- remove inclusion of net/switchdev.h in netdevsim which is no longer
  necesary

Changes in v2:

- resolved build failures spotted by kbuild test robot
- added helpers functions into the core network device layer:
  dev_get_port_parent_id() and netdev_port_same_parent_id();
- added support for recursion to lower devices

Changes from RFC:

- introduce a ndo_get_port_parent_id() and convert all relevant drivers
  to use it

- get rid of SWITCHDEV_ATTR_ID_PORT_PARENT_ID

A subsequent set of patches will convert switchdev_port_attr_set() to
use a blocking notifier call, and still get rid of
switchdev_port_attr_get() altogether.

Florian Fainelli (12):
  net: Introduce ndo_get_port_parent_id()
  bnxt: Implement ndo_get_port_parent_id()
  liquidio: Implement ndo_get_port_parent_id()
  net/mlx5e: Implement ndo_get_port_parent_id()
  mlxsw: Implement ndo_get_port_parent_id()
  mscc: ocelot: Implement ndo_get_port_parent_id()
  nfp: Implement ndo_get_port_parent_id()
  rocker: Implement ndo_get_port_parent_id()
  netdevsim: Implement ndo_get_port_parent_id()
  staging: fsl-dpaa2: ethsw: Implement ndo_get_port_parent_id()
  net: dsa: Implement ndo_get_port_parent_id()
  net: Get rid of SWITCHDEV_ATTR_ID_PORT_PARENT_ID

 drivers/net/ethernet/broadcom/bnxt/bnxt.c | 28 +++--
 drivers/net/ethernet/broadcom/bnxt/bnxt.h |  4 +-
 drivers/net/ethernet/broadcom/bnxt/bnxt_tc.c  |  2 +-
 drivers/net/ethernet/broadcom/bnxt/bnxt_vfr.c | 12 ++--
 .../net/ethernet/cavium/liquidio/lio_main.c   | 22 ++-
 .../net/ethernet/cavium/liquidio/lio_vf_rep.c | 25 +++-
 .../ethernet/mellanox/mlx5/core/en/tc_tun.c   |  2 +-
 .../net/ethernet/mellanox/mlx5/core/en_rep.c  | 31 --
 .../net/ethernet/mellanox/mlx5/core/en_tc.c   |  5 +-
 .../net/ethernet/mellanox/mlxsw/spectrum.c| 13 +
 .../mellanox/mlxsw/spectrum_switchdev.c   |  5 --
 .../net/ethernet/mellanox/mlxsw/switchx2.c| 37 +---
 drivers/net/ethernet/mscc/ocelot.c| 33 +--
 .../ethernet/netronome/nfp/flower/action.c|  3 +-
 .../ethernet/netronome/nfp/nfp_net_common.c   |  4 +-
 .../net/ethernet/netronome/nfp/nfp_net_repr.c |  4 +-
 drivers/net/ethernet/netronome/nfp/nfp_port.c | 22 ++-
 drivers/net/ethernet/netronome/nfp/nfp_port.h |  4 +-
 drivers/net/ethernet/rocker/rocker_main.c | 17 --
 drivers/net/netdevsim/netdev.c| 23 ++--
 drivers/staging/fsl-dpaa2/ethsw/ethsw.c   | 16 --
 include/linux/netdevice.h |  9 +++
 include/net/switchdev.h   | 11 
 net/bridge/br_switchdev.c |  9 +--
 net/core/dev.c| 57 +++
 net/core/net-sysfs.c  | 12 +---
 net/core/rtnetlink.c  | 12 +---
 net/dsa/slave.c   | 18 --
 net/ipv4/ipmr.c   | 13 ++---
 net/switchdev/switchdev.c | 20 ---
 30 files changed, 214 insertions(+), 259 deletions(-)

-- 
2.17.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


Re: [PATCH] staging: vt6656: Use the correct style for SPDX license Identifier

2019-02-06 Thread Greg Kroah-Hartman
On Tue, Feb 05, 2019 at 10:59:40AM -0800, Joe Perches wrote:
> On Tue, 2019-02-05 at 19:44 +0100, Greg Kroah-Hartman wrote:
> > On Tue, Feb 05, 2019 at 08:36:24PM +0530, Nishad Kamdar wrote:
> > > This patch corrects the style for SPDX license Identifier in mac.h
> > > by using "/* */" in place of "//" as per Linux kernel licensing rules.
> > > Issue found by checkpatch.
> > > 
> > > Signed-off-by: Nishad Kamdar 
> > > ---
> > >  drivers/staging/vt6656/mac.h | 4 ++--
> > >  1 file changed, 2 insertions(+), 2 deletions(-)
> > > 
> > > diff --git a/drivers/staging/vt6656/mac.h b/drivers/staging/vt6656/mac.h
> > > index 94e700fcd0b6..75166020f7c6 100644
> > > --- a/drivers/staging/vt6656/mac.h
> > > +++ b/drivers/staging/vt6656/mac.h
> > > @@ -1,5 +1,5 @@
> > > -// SPDX-License-Identifier: GPL-2.0+
> > > -/*
> > > +/* SPDX-License-Identifier: GPL-2.0+
> > 
> > Should really be:
> > 
> > /* SPDX-License-Identifier: GPL-2.0+ */
> 
> There's a fair number of style inconsistencies in the kernel
> sources for that already.
> 
> ~8% of the .h files that have an 'SPDX-License-Identifier:'
> don't use the recommended style.
> 
> $ git grep -h "SPDX-License" -- '*.h' | \
>   perl -p -e 's@Identifier:.*\*/*@Identifier: ... */@; s@Identifier: 
> [^\.].*@Identifier:@' | \
>   sort | uniq -c | sort -rn
>8506 /* SPDX-License-Identifier: ... */
> 593 // SPDX-License-Identifier:
> 154 /* SPDX-License-Identifier:
>  53  * SPDX-License-Identifier:
>   1  * SPDX-License-Identifier:   GPL-2.0
>   1 //SPDX-License-Identifier:
>   1 /*  SPDX-License-Identifier: ... */

Then let's fix them, the documentation says what the correct format is,
there's no reason we can't actually follow what is written...
___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH v14.1] media: staging/imx: refactor imx media device probe

2019-02-06 Thread Rui Miguel Silva
Refactor and move media device initialization code to a new common
module, so it can be used by other devices, this will allow for example
a near to introduce imx7 CSI driver, to use this media device.

Signed-off-by: Rui Miguel Silva 
---

v14->v14.1:
 - Fix SPDX in dev-common

 drivers/staging/media/imx/Makefile|  1 +
 .../staging/media/imx/imx-media-dev-common.c  | 90 +++
 drivers/staging/media/imx/imx-media-dev.c | 86 --
 drivers/staging/media/imx/imx-media-of.c  |  6 +-
 drivers/staging/media/imx/imx-media.h | 14 +++
 5 files changed, 127 insertions(+), 70 deletions(-)
 create mode 100644 drivers/staging/media/imx/imx-media-dev-common.c

diff --git a/drivers/staging/media/imx/Makefile 
b/drivers/staging/media/imx/Makefile
index 698a4210316e..a30b3033f9a3 100644
--- a/drivers/staging/media/imx/Makefile
+++ b/drivers/staging/media/imx/Makefile
@@ -1,5 +1,6 @@
 # SPDX-License-Identifier: GPL-2.0
 imx-media-objs := imx-media-dev.o imx-media-internal-sd.o imx-media-of.o
+imx-media-objs += imx-media-dev-common.o
 imx-media-common-objs := imx-media-utils.o imx-media-fim.o
 imx-media-ic-objs := imx-ic-common.o imx-ic-prp.o imx-ic-prpencvf.o
 
diff --git a/drivers/staging/media/imx/imx-media-dev-common.c 
b/drivers/staging/media/imx/imx-media-dev-common.c
new file mode 100644
index ..910594125889
--- /dev/null
+++ b/drivers/staging/media/imx/imx-media-dev-common.c
@@ -0,0 +1,90 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * V4L2 Media Controller Driver for Freescale common i.MX5/6/7 SOC
+ *
+ * Copyright (c) 2019 Linaro Ltd
+ * Copyright (c) 2016 Mentor Graphics Inc.
+ */
+
+#include 
+#include 
+#include "imx-media.h"
+
+static const struct v4l2_async_notifier_operations imx_media_subdev_ops = {
+   .bound = imx_media_subdev_bound,
+   .complete = imx_media_probe_complete,
+};
+
+static const struct media_device_ops imx_media_md_ops = {
+   .link_notify = imx_media_link_notify,
+};
+
+struct imx_media_dev *imx_media_dev_init(struct device *dev)
+{
+   struct imx_media_dev *imxmd;
+   int ret;
+
+   imxmd = devm_kzalloc(dev, sizeof(*imxmd), GFP_KERNEL);
+   if (!imxmd)
+   return ERR_PTR(-ENOMEM);
+
+   dev_set_drvdata(dev, imxmd);
+
+   strlcpy(imxmd->md.model, "imx-media", sizeof(imxmd->md.model));
+   imxmd->md.ops = &imx_media_md_ops;
+   imxmd->md.dev = dev;
+
+   mutex_init(&imxmd->mutex);
+
+   imxmd->v4l2_dev.mdev = &imxmd->md;
+   imxmd->v4l2_dev.notify = imx_media_notify;
+   strlcpy(imxmd->v4l2_dev.name, "imx-media",
+   sizeof(imxmd->v4l2_dev.name));
+
+   media_device_init(&imxmd->md);
+
+   ret = v4l2_device_register(dev, &imxmd->v4l2_dev);
+   if (ret < 0) {
+   v4l2_err(&imxmd->v4l2_dev,
+"Failed to register v4l2_device: %d\n", ret);
+   goto cleanup;
+   }
+
+   dev_set_drvdata(imxmd->v4l2_dev.dev, imxmd);
+
+   INIT_LIST_HEAD(&imxmd->vdev_list);
+
+   v4l2_async_notifier_init(&imxmd->notifier);
+
+   return imxmd;
+
+cleanup:
+   media_device_cleanup(&imxmd->md);
+
+   return ERR_PTR(ret);
+}
+EXPORT_SYMBOL_GPL(imx_media_dev_init);
+
+int imx_media_dev_notifier_register(struct imx_media_dev *imxmd)
+{
+   int ret;
+
+   /* no subdevs? just bail */
+   if (list_empty(&imxmd->notifier.asd_list)) {
+   v4l2_err(&imxmd->v4l2_dev, "no subdevs\n");
+   return -ENODEV;
+   }
+
+   /* prepare the async subdev notifier and register it */
+   imxmd->notifier.ops = &imx_media_subdev_ops;
+   ret = v4l2_async_notifier_register(&imxmd->v4l2_dev,
+  &imxmd->notifier);
+   if (ret) {
+   v4l2_err(&imxmd->v4l2_dev,
+"v4l2_async_notifier_register failed with %d\n", ret);
+   return ret;
+   }
+
+   return 0;
+}
+EXPORT_SYMBOL_GPL(imx_media_dev_notifier_register);
diff --git a/drivers/staging/media/imx/imx-media-dev.c 
b/drivers/staging/media/imx/imx-media-dev.c
index 25e916562c66..c42bddd78906 100644
--- a/drivers/staging/media/imx/imx-media-dev.c
+++ b/drivers/staging/media/imx/imx-media-dev.c
@@ -116,9 +116,9 @@ static int imx_media_get_ipu(struct imx_media_dev *imxmd,
 }
 
 /* async subdev bound notifier */
-static int imx_media_subdev_bound(struct v4l2_async_notifier *notifier,
- struct v4l2_subdev *sd,
- struct v4l2_async_subdev *asd)
+int imx_media_subdev_bound(struct v4l2_async_notifier *notifier,
+  struct v4l2_subdev *sd,
+  struct v4l2_async_subdev *asd)
 {
struct imx_media_dev *imxmd = notifier2dev(notifier);
int ret = 0;
@@ -302,7 +302,7 @@ static int imx_media_create_pad_vdev_lists(struct 
imx_media_dev *imxmd)
 }
 
 /* async subdev complete notifier */
-static int imx_media_probe_

Re: [Linaro-mm-sig] [PATCH 2/4] staging: android: ion: Restrict cache maintenance to dma mapped memory

2019-02-06 Thread Ørjan Eide
On Wed, Jan 30, 2019 at 11:31:23AM +, Brian Starkey wrote:
> 
> On Tue, Jan 29, 2019 at 03:44:53PM -0800, Liam Mark wrote:
> > On Fri, 18 Jan 2019, Liam Mark wrote:
> > 
> > > On Fri, 18 Jan 2019, Andrew F. Davis wrote:
> > > 
> > > > On 1/18/19 12:37 PM, Liam Mark wrote:
> > > > > The ION begin_cpu_access and end_cpu_access functions use the
> > > > > dma_sync_sg_for_cpu and dma_sync_sg_for_device APIs to perform cache
> > > > > maintenance.
> > > > > 
> > > > > Currently it is possible to apply cache maintenance, via the
> > > > > begin_cpu_access and end_cpu_access APIs, to ION buffers which are not
> > > > > dma mapped.
> > > > > 
> > > > > The dma sync sg APIs should not be called on sg lists which have not 
> > > > > been
> > > > > dma mapped as this can result in cache maintenance being applied to 
> > > > > the
> > > > > wrong address. If an sg list has not been dma mapped then its 
> > > > > dma_address
> > > > > field has not been populated, some dma ops such as the 
> > > > > swiotlb_dma_ops ops
> > > > > use the dma_address field to calculate the address onto which to apply
> > > > > cache maintenance.
> > > > > 
> > > > > Also I don’t think we want CMOs to be applied to a buffer which is not
> > > > > dma mapped as the memory should already be coherent for access from 
> > > > > the
> > > > > CPU. Any CMOs required for device access taken care of in the
> > > > > dma_buf_map_attachment and dma_buf_unmap_attachment calls.
> > > > > So really it only makes sense for begin_cpu_access and end_cpu_access 
> > > > > to
> > > > > apply CMOs if the buffer is dma mapped.
> > > > > 
> > > > > Fix the ION begin_cpu_access and end_cpu_access functions to only 
> > > > > apply
> > > > > cache maintenance to buffers which are dma mapped.
> > > > > 
> > > > > Fixes: 2a55e7b5e544 ("staging: android: ion: Call dma_map_sg for 
> > > > > syncing and mapping")
> > > > > Signed-off-by: Liam Mark 
> > > > > ---
> > > > >  drivers/staging/android/ion/ion.c | 26 +-
> > > > >  1 file changed, 21 insertions(+), 5 deletions(-)
> > > > > 
> > > > > diff --git a/drivers/staging/android/ion/ion.c 
> > > > > b/drivers/staging/android/ion/ion.c
> > > > > index 6f5afab7c1a1..1fe633a7fdba 100644
> > > > > --- a/drivers/staging/android/ion/ion.c
> > > > > +++ b/drivers/staging/android/ion/ion.c
> > > > > @@ -210,6 +210,7 @@ struct ion_dma_buf_attachment {
> > > > >   struct device *dev;
> > > > >   struct sg_table *table;
> > > > >   struct list_head list;
> > > > > + bool dma_mapped;
> > > > >  };
> > > > >  
> > > > >  static int ion_dma_buf_attach(struct dma_buf *dmabuf,
> > > > > @@ -231,6 +232,7 @@ static int ion_dma_buf_attach(struct dma_buf 
> > > > > *dmabuf,
> > > > >  
> > > > >   a->table = table;
> > > > >   a->dev = attachment->dev;
> > > > > + a->dma_mapped = false;
> > > > >   INIT_LIST_HEAD(&a->list);
> > > > >  
> > > > >   attachment->priv = a;
> > > > > @@ -261,12 +263,18 @@ static struct sg_table *ion_map_dma_buf(struct 
> > > > > dma_buf_attachment *attachment,
> > > > >  {
> > > > >   struct ion_dma_buf_attachment *a = attachment->priv;
> > > > >   struct sg_table *table;
> > > > > + struct ion_buffer *buffer = attachment->dmabuf->priv;
> > > > >  
> > > > >   table = a->table;
> > > > >  
> > > > > + mutex_lock(&buffer->lock);
> > > > >   if (!dma_map_sg(attachment->dev, table->sgl, table->nents,
> > > > > - direction))
> > > > > + direction)) {
> > > > > + mutex_unlock(&buffer->lock);
> > > > >   return ERR_PTR(-ENOMEM);
> > > > > + }
> > > > > + a->dma_mapped = true;
> > > > > + mutex_unlock(&buffer->lock);
> > > > >  
> > > > >   return table;
> > > > >  }
> > > > > @@ -275,7 +283,13 @@ static void ion_unmap_dma_buf(struct 
> > > > > dma_buf_attachment *attachment,
> > > > > struct sg_table *table,
> > > > > enum dma_data_direction direction)
> > > > >  {
> > > > > + struct ion_dma_buf_attachment *a = attachment->priv;
> > > > > + struct ion_buffer *buffer = attachment->dmabuf->priv;
> > > > > +
> > > > > + mutex_lock(&buffer->lock);
> > > > >   dma_unmap_sg(attachment->dev, table->sgl, table->nents, 
> > > > > direction);
> > > > > + a->dma_mapped = false;
> > > > > + mutex_unlock(&buffer->lock);
> > > > >  }
> > > > >  
> > > > >  static int ion_mmap(struct dma_buf *dmabuf, struct vm_area_struct 
> > > > > *vma)
> > > > > @@ -346,8 +360,9 @@ static int ion_dma_buf_begin_cpu_access(struct 
> > > > > dma_buf *dmabuf,
> > > > >  
> > > > >   mutex_lock(&buffer->lock);
> > > > >   list_for_each_entry(a, &buffer->attachments, list) {
> > > > 
> > > > When no devices are attached then buffer->attachments is empty and the
> > > > below does not run, so if I understand this patch correctly then what
> > > > you are protecting against is CPU access in the wi

Re: [PATCH v14 01/13] media: staging/imx: refactor imx media device probe

2019-02-06 Thread Hans Verkuil
On 2/6/19 4:13 PM, Rui Miguel Silva wrote:
> Refactor and move media device initialization code to a new common
> module, so it can be used by other devices, this will allow for example
> a near to introduce imx7 CSI driver, to use this media device.
> 
> Signed-off-by: Rui Miguel Silva 
> ---
>  drivers/staging/media/imx/Makefile|  1 +
>  .../staging/media/imx/imx-media-dev-common.c  | 90 +++
>  drivers/staging/media/imx/imx-media-dev.c | 86 --
>  drivers/staging/media/imx/imx-media-of.c  |  6 +-
>  drivers/staging/media/imx/imx-media.h | 14 +++
>  5 files changed, 127 insertions(+), 70 deletions(-)
>  create mode 100644 drivers/staging/media/imx/imx-media-dev-common.c
> 
> diff --git a/drivers/staging/media/imx/Makefile 
> b/drivers/staging/media/imx/Makefile
> index 698a4210316e..a30b3033f9a3 100644
> --- a/drivers/staging/media/imx/Makefile
> +++ b/drivers/staging/media/imx/Makefile
> @@ -1,5 +1,6 @@
>  # SPDX-License-Identifier: GPL-2.0
>  imx-media-objs := imx-media-dev.o imx-media-internal-sd.o imx-media-of.o
> +imx-media-objs += imx-media-dev-common.o
>  imx-media-common-objs := imx-media-utils.o imx-media-fim.o
>  imx-media-ic-objs := imx-ic-common.o imx-ic-prp.o imx-ic-prpencvf.o
>  
> diff --git a/drivers/staging/media/imx/imx-media-dev-common.c 
> b/drivers/staging/media/imx/imx-media-dev-common.c
> new file mode 100644
> index ..28bcb31cf6ca
> --- /dev/null
> +++ b/drivers/staging/media/imx/imx-media-dev-common.c
> @@ -0,0 +1,90 @@
> +// SPDX-License-Identifier: GPL

WARNING: 'SPDX-License-Identifier: GPL' is not supported in LICENSES/...
#18: FILE: drivers/staging/media/imx/imx-media-dev-common.c:1:
+// SPDX-License-Identifier: GPL

You no doubt mean GPL-2.0. Just repost this patch with this change.

Regards,

Hans

> +/*
> + * V4L2 Media Controller Driver for Freescale common i.MX5/6/7 SOC
> + *
> + * Copyright (c) 2019 Linaro Ltd
> + * Copyright (c) 2016 Mentor Graphics Inc.
> + */
> +
> +#include 
> +#include 
> +#include "imx-media.h"
> +
> +static const struct v4l2_async_notifier_operations imx_media_subdev_ops = {
> + .bound = imx_media_subdev_bound,
> + .complete = imx_media_probe_complete,
> +};
> +
> +static const struct media_device_ops imx_media_md_ops = {
> + .link_notify = imx_media_link_notify,
> +};
> +
> +struct imx_media_dev *imx_media_dev_init(struct device *dev)
> +{
> + struct imx_media_dev *imxmd;
> + int ret;
> +
> + imxmd = devm_kzalloc(dev, sizeof(*imxmd), GFP_KERNEL);
> + if (!imxmd)
> + return ERR_PTR(-ENOMEM);
> +
> + dev_set_drvdata(dev, imxmd);
> +
> + strlcpy(imxmd->md.model, "imx-media", sizeof(imxmd->md.model));
> + imxmd->md.ops = &imx_media_md_ops;
> + imxmd->md.dev = dev;
> +
> + mutex_init(&imxmd->mutex);
> +
> + imxmd->v4l2_dev.mdev = &imxmd->md;
> + imxmd->v4l2_dev.notify = imx_media_notify;
> + strlcpy(imxmd->v4l2_dev.name, "imx-media",
> + sizeof(imxmd->v4l2_dev.name));
> +
> + media_device_init(&imxmd->md);
> +
> + ret = v4l2_device_register(dev, &imxmd->v4l2_dev);
> + if (ret < 0) {
> + v4l2_err(&imxmd->v4l2_dev,
> +  "Failed to register v4l2_device: %d\n", ret);
> + goto cleanup;
> + }
> +
> + dev_set_drvdata(imxmd->v4l2_dev.dev, imxmd);
> +
> + INIT_LIST_HEAD(&imxmd->vdev_list);
> +
> + v4l2_async_notifier_init(&imxmd->notifier);
> +
> + return imxmd;
> +
> +cleanup:
> + media_device_cleanup(&imxmd->md);
> +
> + return ERR_PTR(ret);
> +}
> +EXPORT_SYMBOL_GPL(imx_media_dev_init);
> +
> +int imx_media_dev_notifier_register(struct imx_media_dev *imxmd)
> +{
> + int ret;
> +
> + /* no subdevs? just bail */
> + if (list_empty(&imxmd->notifier.asd_list)) {
> + v4l2_err(&imxmd->v4l2_dev, "no subdevs\n");
> + return -ENODEV;
> + }
> +
> + /* prepare the async subdev notifier and register it */
> + imxmd->notifier.ops = &imx_media_subdev_ops;
> + ret = v4l2_async_notifier_register(&imxmd->v4l2_dev,
> +&imxmd->notifier);
> + if (ret) {
> + v4l2_err(&imxmd->v4l2_dev,
> +  "v4l2_async_notifier_register failed with %d\n", ret);
> + return ret;
> + }
> +
> + return 0;
> +}
> +EXPORT_SYMBOL_GPL(imx_media_dev_notifier_register);
> diff --git a/drivers/staging/media/imx/imx-media-dev.c 
> b/drivers/staging/media/imx/imx-media-dev.c
> index 25e916562c66..c42bddd78906 100644
> --- a/drivers/staging/media/imx/imx-media-dev.c
> +++ b/drivers/staging/media/imx/imx-media-dev.c
> @@ -116,9 +116,9 @@ static int imx_media_get_ipu(struct imx_media_dev *imxmd,
>  }
>  
>  /* async subdev bound notifier */
> -static int imx_media_subdev_bound(struct v4l2_async_notifier *notifier,
> -   struct v4l2_subdev *sd,
> -   struct v4l2_async_s

[PATCH v2 3/3] staging: rtl8192e: rename members of struct rtllib_device - style

2019-02-06 Thread Himadri Pandya
Rename following members of struct rtllib_device to fix checkpatch
warning: Avoid CamelCase
pDot11dInfo -> dot11d_info
bGlobalDomain -> global_domain
IbssStartChnl -> bss_start_channel

Signed-off-by: Himadri Pandya 
---
Changes in V2:

Rename "IbssStartChnl" to "bss_start_channel" instead of
"ibss_start_chnl" in order to remove the "i" from the beginning of
the name and include full spelling of "channel" to make it more readable
and understandable.
---
 drivers/staging/rtl8192e/dot11d.c | 58 +++
 drivers/staging/rtl8192e/dot11d.h |  2 +-
 drivers/staging/rtl8192e/rtllib.h |  6 +--
 drivers/staging/rtl8192e/rtllib_softmac.c | 12 ++---
 4 files changed, 39 insertions(+), 39 deletions(-)

diff --git a/drivers/staging/rtl8192e/dot11d.c 
b/drivers/staging/rtl8192e/dot11d.c
index 764e798a84c0..6c26af3f377f 100644
--- a/drivers/staging/rtl8192e/dot11d.c
+++ b/drivers/staging/rtl8192e/dot11d.c
@@ -44,14 +44,14 @@ static struct channel_list channel_array[] = {
 
 void dot11d_init(struct rtllib_device *ieee)
 {
-   struct rt_dot11d_info *pDot11dInfo = GET_DOT11D_INFO(ieee);
+   struct rt_dot11d_info *dot11d_info = GET_DOT11D_INFO(ieee);
 
-   pDot11dInfo->enabled = false;
+   dot11d_info->enabled = false;
 
-   pDot11dInfo->state = DOT11D_STATE_NONE;
-   pDot11dInfo->country_len = 0;
-   memset(pDot11dInfo->channel_map, 0, MAX_CHANNEL_NUMBER + 1);
-   memset(pDot11dInfo->max_tx_power_list, 0xFF, MAX_CHANNEL_NUMBER + 1);
+   dot11d_info->state = DOT11D_STATE_NONE;
+   dot11d_info->country_len = 0;
+   memset(dot11d_info->channel_map, 0, MAX_CHANNEL_NUMBER + 1);
+   memset(dot11d_info->max_tx_power_list, 0xFF, MAX_CHANNEL_NUMBER + 1);
RESET_CIE_WATCHDOG(ieee);
 }
 EXPORT_SYMBOL(dot11d_init);
@@ -60,7 +60,7 @@ void Dot11d_Channelmap(u8 channel_plan, struct rtllib_device 
*ieee)
 {
int i, max_chan = 14, min_chan = 1;
 
-   ieee->bGlobalDomain = false;
+   ieee->global_domain = false;
 
if (channel_array[channel_plan].len != 0) {
memset(GET_DOT11D_INFO(ieee)->channel_map, 0,
@@ -76,22 +76,22 @@ void Dot11d_Channelmap(u8 channel_plan, struct 
rtllib_device *ieee)
 
switch (channel_plan) {
case COUNTRY_CODE_GLOBAL_DOMAIN:
-   ieee->bGlobalDomain = true;
+   ieee->global_domain = true;
for (i = 12; i <= 14; i++)
GET_DOT11D_INFO(ieee)->channel_map[i] = 2;
-   ieee->IbssStartChnl = 10;
+   ieee->bss_start_channel = 10;
ieee->ibss_maxjoin_chal = 11;
break;
 
case COUNTRY_CODE_WORLD_WIDE_13:
for (i = 12; i <= 13; i++)
GET_DOT11D_INFO(ieee)->channel_map[i] = 2;
-   ieee->IbssStartChnl = 10;
+   ieee->bss_start_channel = 10;
ieee->ibss_maxjoin_chal = 11;
break;
 
default:
-   ieee->IbssStartChnl = 1;
+   ieee->bss_start_channel = 1;
ieee->ibss_maxjoin_chal = 14;
break;
}
@@ -100,29 +100,29 @@ EXPORT_SYMBOL(Dot11d_Channelmap);
 
 void Dot11d_Reset(struct rtllib_device *ieee)
 {
-   struct rt_dot11d_info *pDot11dInfo = GET_DOT11D_INFO(ieee);
+   struct rt_dot11d_info *dot11d_info = GET_DOT11D_INFO(ieee);
u32 i;
 
-   memset(pDot11dInfo->channel_map, 0, MAX_CHANNEL_NUMBER + 1);
-   memset(pDot11dInfo->max_tx_power_list, 0xFF, MAX_CHANNEL_NUMBER + 1);
+   memset(dot11d_info->channel_map, 0, MAX_CHANNEL_NUMBER + 1);
+   memset(dot11d_info->max_tx_power_list, 0xFF, MAX_CHANNEL_NUMBER + 1);
for (i = 1; i <= 11; i++)
-   (pDot11dInfo->channel_map)[i] = 1;
+   (dot11d_info->channel_map)[i] = 1;
for (i = 12; i <= 14; i++)
-   (pDot11dInfo->channel_map)[i] = 2;
-   pDot11dInfo->state = DOT11D_STATE_NONE;
-   pDot11dInfo->country_len = 0;
+   (dot11d_info->channel_map)[i] = 2;
+   dot11d_info->state = DOT11D_STATE_NONE;
+   dot11d_info->country_len = 0;
RESET_CIE_WATCHDOG(ieee);
 }
 
 void Dot11d_UpdateCountryIe(struct rtllib_device *dev, u8 *pTaddr,
u16 CoutryIeLen, u8 *pCoutryIe)
 {
-   struct rt_dot11d_info *pDot11dInfo = GET_DOT11D_INFO(dev);
+   struct rt_dot11d_info *dot11d_info = GET_DOT11D_INFO(dev);
u8 i, j, NumTriples, MaxChnlNum;
struct chnl_txpow_triple *pTriple;
 
-   memset(pDot11dInfo->channel_map, 0, MAX_CHANNEL_NUMBER + 1);
-   memset(pDot11dInfo->max_tx_power_list, 0xFF, MAX_CHANNEL_NUMBER + 1);
+   memset(dot11d_info->channel_map, 0, MAX_CHANNEL_NUMBER + 1);
+   memset(dot11d_info->max_tx_power_list, 0xFF, MAX_CHANNEL_NUMBER + 1);
MaxChnlNum = 0;
NumTriples = (CoutryIeLen - 3) / 3;
pTriple = (struct chnl_txpow_triple *)(pCoutryIe + 3);
@@ -142,8 +

[PATCH v2 2/3] staging: rtl8192e: rename members of struct rt_dot11d_info - style

2019-02-06 Thread Himadri Pandya
Rename following members of struct rt_dot11d_info to fix checkpatch
warning: Avoid Camelcase
bEnabled -> enabled
CountryIeLen -> country_len
CountryIeBuf -> country_buffer
CountryIeSrcAddr -> country_src_addr
CountryIeWatchdog -> country_watchdog
MaxTxPwrDbmList -> max_tx_power_list
State -> state

Signed-off-by: Himadri Pandya 
---
Changes in V2:

Fix typo in new name "max_tx_power_list" in commit
message(mac_tx_power_list -> max_tx_power_list).
---
 drivers/staging/rtl8192e/dot11d.c | 28 ++--
 drivers/staging/rtl8192e/dot11d.h | 30 +++---
 2 files changed, 29 insertions(+), 29 deletions(-)

diff --git a/drivers/staging/rtl8192e/dot11d.c 
b/drivers/staging/rtl8192e/dot11d.c
index 76a9e07ec90f..764e798a84c0 100644
--- a/drivers/staging/rtl8192e/dot11d.c
+++ b/drivers/staging/rtl8192e/dot11d.c
@@ -46,12 +46,12 @@ void dot11d_init(struct rtllib_device *ieee)
 {
struct rt_dot11d_info *pDot11dInfo = GET_DOT11D_INFO(ieee);
 
-   pDot11dInfo->bEnabled = false;
+   pDot11dInfo->enabled = false;
 
-   pDot11dInfo->State = DOT11D_STATE_NONE;
-   pDot11dInfo->CountryIeLen = 0;
+   pDot11dInfo->state = DOT11D_STATE_NONE;
+   pDot11dInfo->country_len = 0;
memset(pDot11dInfo->channel_map, 0, MAX_CHANNEL_NUMBER + 1);
-   memset(pDot11dInfo->MaxTxPwrDbmList, 0xFF, MAX_CHANNEL_NUMBER + 1);
+   memset(pDot11dInfo->max_tx_power_list, 0xFF, MAX_CHANNEL_NUMBER + 1);
RESET_CIE_WATCHDOG(ieee);
 }
 EXPORT_SYMBOL(dot11d_init);
@@ -104,13 +104,13 @@ void Dot11d_Reset(struct rtllib_device *ieee)
u32 i;
 
memset(pDot11dInfo->channel_map, 0, MAX_CHANNEL_NUMBER + 1);
-   memset(pDot11dInfo->MaxTxPwrDbmList, 0xFF, MAX_CHANNEL_NUMBER + 1);
+   memset(pDot11dInfo->max_tx_power_list, 0xFF, MAX_CHANNEL_NUMBER + 1);
for (i = 1; i <= 11; i++)
(pDot11dInfo->channel_map)[i] = 1;
for (i = 12; i <= 14; i++)
(pDot11dInfo->channel_map)[i] = 2;
-   pDot11dInfo->State = DOT11D_STATE_NONE;
-   pDot11dInfo->CountryIeLen = 0;
+   pDot11dInfo->state = DOT11D_STATE_NONE;
+   pDot11dInfo->country_len = 0;
RESET_CIE_WATCHDOG(ieee);
 }
 
@@ -122,7 +122,7 @@ void Dot11d_UpdateCountryIe(struct rtllib_device *dev, u8 
*pTaddr,
struct chnl_txpow_triple *pTriple;
 
memset(pDot11dInfo->channel_map, 0, MAX_CHANNEL_NUMBER + 1);
-   memset(pDot11dInfo->MaxTxPwrDbmList, 0xFF, MAX_CHANNEL_NUMBER + 1);
+   memset(pDot11dInfo->max_tx_power_list, 0xFF, MAX_CHANNEL_NUMBER + 1);
MaxChnlNum = 0;
NumTriples = (CoutryIeLen - 3) / 3;
pTriple = (struct chnl_txpow_triple *)(pCoutryIe + 3);
@@ -143,7 +143,7 @@ void Dot11d_UpdateCountryIe(struct rtllib_device *dev, u8 
*pTaddr,
 
for (j = 0; j < pTriple->num_channels; j++) {
pDot11dInfo->channel_map[pTriple->first_channel + j] = 
1;
-   pDot11dInfo->MaxTxPwrDbmList[pTriple->first_channel + 
j] =
+   pDot11dInfo->max_tx_power_list[pTriple->first_channel + 
j] =
 pTriple->max_tx_power;
MaxChnlNum = pTriple->first_channel + j;
}
@@ -153,18 +153,18 @@ void Dot11d_UpdateCountryIe(struct rtllib_device *dev, u8 
*pTaddr,
 
UPDATE_CIE_SRC(dev, pTaddr);
 
-   pDot11dInfo->CountryIeLen = CoutryIeLen;
-   memcpy(pDot11dInfo->CountryIeBuf, pCoutryIe, CoutryIeLen);
-   pDot11dInfo->State = DOT11D_STATE_LEARNED;
+   pDot11dInfo->country_len = CoutryIeLen;
+   memcpy(pDot11dInfo->country_buffer, pCoutryIe, CoutryIeLen);
+   pDot11dInfo->state = DOT11D_STATE_LEARNED;
 }
 
 void DOT11D_ScanComplete(struct rtllib_device *dev)
 {
struct rt_dot11d_info *pDot11dInfo = GET_DOT11D_INFO(dev);
 
-   switch (pDot11dInfo->State) {
+   switch (pDot11dInfo->state) {
case DOT11D_STATE_LEARNED:
-   pDot11dInfo->State = DOT11D_STATE_DONE;
+   pDot11dInfo->state = DOT11D_STATE_DONE;
break;
case DOT11D_STATE_DONE:
Dot11d_Reset(dev);
diff --git a/drivers/staging/rtl8192e/dot11d.h 
b/drivers/staging/rtl8192e/dot11d.h
index e007295fe9d0..015f77841065 100644
--- a/drivers/staging/rtl8192e/dot11d.h
+++ b/drivers/staging/rtl8192e/dot11d.h
@@ -30,27 +30,27 @@ enum dot11d_state {
 };
 
 /**
- * struct rt_dot11d_info * @CountryIeLen: value greater than 0 if
- *   @CountryIeBuf contains valid country information element.
+ * struct rt_dot11d_info * @country_len: value greater than 0 if
+ *   @country_buffer contains valid country information element.
  * @channel_map: holds channel values
  * 0 - invalid,
  * 1 - valid (active scan),
  * 2 - valid (passive scan)
- * @CountryIeSrcAddr - Source AP of the country IE
+ * @country_src_addr

[PATCH v2 1/3] staging: rtl8192e: rename members of struct chnl_txpow_triple - style

2019-02-06 Thread Himadri Pandya
Rename following members of chnl_txpow_triple to fix checkpatch
warning: Avoid CamelCase
FirstChnl -> first_channel
NumChnls -> num_channels
MaxTxPowerInDbm -> max_tx_power

Signed-off-by: Himadri Pandya 
---
Changes in V2:

Rename "FirstChnl" to "first_channel" instead of "first_chnl" and rename
"NumChnls" to "num_channels" instead of "num_chnls" in order to make
them more readable and understandable for non-native english speakers.
---
 drivers/staging/rtl8192e/dot11d.c | 16 
 drivers/staging/rtl8192e/dot11d.h |  6 +++---
 2 files changed, 11 insertions(+), 11 deletions(-)

diff --git a/drivers/staging/rtl8192e/dot11d.c 
b/drivers/staging/rtl8192e/dot11d.c
index be9a21062a2e..76a9e07ec90f 100644
--- a/drivers/staging/rtl8192e/dot11d.c
+++ b/drivers/staging/rtl8192e/dot11d.c
@@ -127,25 +127,25 @@ void Dot11d_UpdateCountryIe(struct rtllib_device *dev, u8 
*pTaddr,
NumTriples = (CoutryIeLen - 3) / 3;
pTriple = (struct chnl_txpow_triple *)(pCoutryIe + 3);
for (i = 0; i < NumTriples; i++) {
-   if (MaxChnlNum >= pTriple->FirstChnl) {
+   if (MaxChnlNum >= pTriple->first_channel) {
netdev_info(dev->dev,
"%s: Invalid country IE, skip it..1\n",
__func__);
return;
}
-   if (MAX_CHANNEL_NUMBER < (pTriple->FirstChnl +
-   pTriple->NumChnls)) {
+   if (MAX_CHANNEL_NUMBER < (pTriple->first_channel +
+   pTriple->num_channels)) {
netdev_info(dev->dev,
"%s: Invalid country IE, skip it..2\n",
__func__);
return;
}
 
-   for (j = 0; j < pTriple->NumChnls; j++) {
-   pDot11dInfo->channel_map[pTriple->FirstChnl + j] = 1;
-   pDot11dInfo->MaxTxPwrDbmList[pTriple->FirstChnl + j] =
-pTriple->MaxTxPowerInDbm;
-   MaxChnlNum = pTriple->FirstChnl + j;
+   for (j = 0; j < pTriple->num_channels; j++) {
+   pDot11dInfo->channel_map[pTriple->first_channel + j] = 
1;
+   pDot11dInfo->MaxTxPwrDbmList[pTriple->first_channel + 
j] =
+pTriple->max_tx_power;
+   MaxChnlNum = pTriple->first_channel + j;
}
 
pTriple = (struct chnl_txpow_triple *)((u8 *)pTriple + 3);
diff --git a/drivers/staging/rtl8192e/dot11d.h 
b/drivers/staging/rtl8192e/dot11d.h
index 7fa3c4d963c4..e007295fe9d0 100644
--- a/drivers/staging/rtl8192e/dot11d.h
+++ b/drivers/staging/rtl8192e/dot11d.h
@@ -18,9 +18,9 @@
 #include "rtllib.h"
 
 struct chnl_txpow_triple {
-   u8 FirstChnl;
-   u8  NumChnls;
-   u8  MaxTxPowerInDbm;
+   u8 first_channel;
+   u8  num_channels;
+   u8  max_tx_power;
 };
 
 enum dot11d_state {
-- 
2.17.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH v14 12/13] media: video-mux: add bayer formats

2019-02-06 Thread Rui Miguel Silva
Add non vendor bayer formats to the  allowed format array.

Signed-off-by: Rui Miguel Silva 
Reviewed-by: Philipp Zabel 
Acked-by: Sakari Ailus 
---
 drivers/media/platform/video-mux.c | 20 
 1 file changed, 20 insertions(+)

diff --git a/drivers/media/platform/video-mux.c 
b/drivers/media/platform/video-mux.c
index c33900e3c23e..0ba30756e1e4 100644
--- a/drivers/media/platform/video-mux.c
+++ b/drivers/media/platform/video-mux.c
@@ -263,6 +263,26 @@ static int video_mux_set_format(struct v4l2_subdev *sd,
case MEDIA_BUS_FMT_UYYVYY16_0_5X48:
case MEDIA_BUS_FMT_JPEG_1X8:
case MEDIA_BUS_FMT_AHSV_1X32:
+   case MEDIA_BUS_FMT_SBGGR8_1X8:
+   case MEDIA_BUS_FMT_SGBRG8_1X8:
+   case MEDIA_BUS_FMT_SGRBG8_1X8:
+   case MEDIA_BUS_FMT_SRGGB8_1X8:
+   case MEDIA_BUS_FMT_SBGGR10_1X10:
+   case MEDIA_BUS_FMT_SGBRG10_1X10:
+   case MEDIA_BUS_FMT_SGRBG10_1X10:
+   case MEDIA_BUS_FMT_SRGGB10_1X10:
+   case MEDIA_BUS_FMT_SBGGR12_1X12:
+   case MEDIA_BUS_FMT_SGBRG12_1X12:
+   case MEDIA_BUS_FMT_SGRBG12_1X12:
+   case MEDIA_BUS_FMT_SRGGB12_1X12:
+   case MEDIA_BUS_FMT_SBGGR14_1X14:
+   case MEDIA_BUS_FMT_SGBRG14_1X14:
+   case MEDIA_BUS_FMT_SGRBG14_1X14:
+   case MEDIA_BUS_FMT_SRGGB14_1X14:
+   case MEDIA_BUS_FMT_SBGGR16_1X16:
+   case MEDIA_BUS_FMT_SGBRG16_1X16:
+   case MEDIA_BUS_FMT_SGRBG16_1X16:
+   case MEDIA_BUS_FMT_SRGGB16_1X16:
break;
default:
sdformat->format.code = MEDIA_BUS_FMT_Y8_1X8;
-- 
2.20.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH v14 11/13] media: staging/imx: add i.MX7 entries to TODO file

2019-02-06 Thread Rui Miguel Silva
Add some i.MX7 related entries to TODO file.

Signed-off-by: Rui Miguel Silva 
Acked-by: Sakari Ailus 
---
 drivers/staging/media/imx/TODO | 9 +
 1 file changed, 9 insertions(+)

diff --git a/drivers/staging/media/imx/TODO b/drivers/staging/media/imx/TODO
index aeeb15494a49..6f29b5ca5324 100644
--- a/drivers/staging/media/imx/TODO
+++ b/drivers/staging/media/imx/TODO
@@ -45,3 +45,12 @@
 
  Which means a port must not contain mixed-use endpoints, they
  must all refer to media links between V4L2 subdevices.
+
+- i.MX7: all of the above, since it uses the imx media core
+
+- i.MX7: use Frame Interval Monitor
+
+- i.MX7: runtime testing with parallel sensor, links setup and streaming
+
+- i.MX7: runtime testing with different formats, for the time only 10-bit bayer
+  is tested
-- 
2.20.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH v14 10/13] media: imx7.rst: add documentation for i.MX7 media driver

2019-02-06 Thread Rui Miguel Silva
Add rst document to describe the i.MX7 media driver and also a working
example from the Warp7 board usage with a OV2680 sensor.

Signed-off-by: Rui Miguel Silva 
Acked-by: Sakari Ailus 
---
 Documentation/media/v4l-drivers/imx7.rst  | 159 ++
 Documentation/media/v4l-drivers/index.rst |   1 +
 2 files changed, 160 insertions(+)
 create mode 100644 Documentation/media/v4l-drivers/imx7.rst

diff --git a/Documentation/media/v4l-drivers/imx7.rst 
b/Documentation/media/v4l-drivers/imx7.rst
new file mode 100644
index ..804d900da535
--- /dev/null
+++ b/Documentation/media/v4l-drivers/imx7.rst
@@ -0,0 +1,159 @@
+.. SPDX-License-Identifier: GPL-2.0
+
+i.MX7 Video Capture Driver
+==
+
+Introduction
+
+
+The i.MX7 contrary to the i.MX5/6 family does not contain an Image Processing
+Unit (IPU); because of that the capabilities to perform operations or
+manipulation of the capture frames are less feature rich.
+
+For image capture the i.MX7 has three units:
+- CMOS Sensor Interface (CSI)
+- Video Multiplexer
+- MIPI CSI-2 Receiver
+
+::
+   |\
+   MIPI Camera Input ---> MIPI CSI-2 --- > | \
+   |  \
+   | M |
+   | U | -->  CSI ---> Capture
+   | X |
+   |  /
+   Parallel Camera Input > | /
+   |/
+
+For additional information, please refer to the latest versions of the i.MX7
+reference manual [#f1]_.
+
+Entities
+
+
+imx7-mipi-csi2
+--
+
+This is the MIPI CSI-2 receiver entity. It has one sink pad to receive the 
pixel
+data from MIPI CSI-2 camera sensor. It has one source pad, corresponding to the
+virtual channel 0. This module is compliant to previous version of Samsung
+D-phy, and supports two D-PHY Rx Data lanes.
+
+csi_mux
+---
+
+This is the video multiplexer. It has two sink pads to select from either 
camera
+sensor with a parallel interface or from MIPI CSI-2 virtual channel 0.  It has
+a single source pad that routes to the CSI.
+
+csi
+---
+
+The CSI enables the chip to connect directly to external CMOS image sensor. CSI
+can interface directly with Parallel and MIPI CSI-2 buses. It has 256 x 64 FIFO
+to store received image pixel data and embedded DMA controllers to transfer 
data
+from the FIFO through AHB bus.
+
+This entity has one sink pad that receives from the csi_mux entity and a single
+source pad that routes video frames directly to memory buffers. This pad is
+routed to a capture device node.
+
+Usage Notes
+---
+
+To aid in configuration and for backward compatibility with V4L2 applications
+that access controls only from video device nodes, the capture device 
interfaces
+inherit controls from the active entities in the current pipeline, so controls
+can be accessed either directly from the subdev or from the active capture
+device interface. For example, the sensor controls are available either from 
the
+sensor subdevs or from the active capture device.
+
+Warp7 with OV2680
+-
+
+On this platform an OV2680 MIPI CSI-2 module is connected to the internal MIPI
+CSI-2 receiver. The following example configures a video capture pipeline with
+an output of 800x600, and BGGR 10 bit bayer format:
+
+.. code-block:: none
+   # Setup links
+   media-ctl -l "'ov2680 1-0036':0 -> 'imx7-mipi-csis.0':0[1]"
+   media-ctl -l "'imx7-mipi-csis.0':1 -> 'csi_mux':1[1]"
+   media-ctl -l "'csi_mux':2 -> 'csi':0[1]"
+   media-ctl -l "'csi':1 -> 'csi capture':0[1]"
+
+   # Configure pads for pipeline
+   media-ctl -V "'ov2680 1-0036':0 [fmt:SBGGR10_1X10/800x600 field:none]"
+   media-ctl -V "'csi_mux':1 [fmt:SBGGR10_1X10/800x600 field:none]"
+   media-ctl -V "'csi_mux':2 [fmt:SBGGR10_1X10/800x600 field:none]"
+   media-ctl -V "'imx7-mipi-csis.0':0 [fmt:SBGGR10_1X10/800x600 field:none]"
+   media-ctl -V "'csi':0 [fmt:SBGGR10_1X10/800x600 field:none]"
+
+After this streaming can start. The v4l2-ctl tool can be used to select any of
+the resolutions supported by the sensor.
+
+.. code-block:: none
+root@imx7s-warp:~# media-ctl -p
+Media controller API version 4.17.0
+
+Media device information
+
+driver  imx-media
+model   imx-media
+serial
+bus info
+hw revision 0x0
+driver version  4.17.0
+
+Device topology
+- entity 1: csi (2 pads, 2 links)
+   type V4L2 subdev subtype Unknown flags 0
+   device node name /dev/v4l-subdev0
+   pad0: Sink
+   [fmt:SBGGR10_1X10/800x600 field:none]
+   <- "csi_mux":2 [ENABLED]
+   pad1: Source
+   [fmt:SBGGR10_1X10/800x600 field:none]
+   -> "csi capture":0 [ENABLED]
+
+- entity 4: c

[PATCH v14 13/13] media: MAINTAINERS: add entry for Freescale i.MX7 media driver

2019-02-06 Thread Rui Miguel Silva
Add maintainer entry for the imx7 media csi, mipi csis driver,
dt-bindings and documentation.

Signed-off-by: Rui Miguel Silva 
Acked-by: Sakari Ailus 
---
 MAINTAINERS | 11 +++
 1 file changed, 11 insertions(+)

diff --git a/MAINTAINERS b/MAINTAINERS
index 3e211916d2bc..d8e0c9040736 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -9348,6 +9348,17 @@ T:   git git://linuxtv.org/media_tree.git
 S: Maintained
 F: drivers/media/platform/imx-pxp.[ch]
 
+MEDIA DRIVERS FOR FREESCALE IMX7
+M: Rui Miguel Silva 
+L: linux-me...@vger.kernel.org
+T: git git://linuxtv.org/media_tree.git
+S: Maintained
+F: Documentation/devicetree/bindings/media/imx7-csi.txt
+F: Documentation/devicetree/bindings/media/imx7-mipi-csi2.txt
+F: Documentation/media/v4l-drivers/imx7.rst
+F: drivers/staging/media/imx/imx7-media-csi.c
+F: drivers/staging/media/imx/imx7-mipi-csis.c
+
 MEDIA DRIVERS FOR HELENE
 M: Abylay Ospan 
 L: linux-me...@vger.kernel.org
-- 
2.20.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH v14 09/13] ARM: dts: imx7s-warp: add ov2680 sensor node

2019-02-06 Thread Rui Miguel Silva
Warp7 comes with a Omnivision OV2680 sensor, add the node here to make
complete the camera data path for this system. Add the needed regulator
to the analog voltage supply, the port and endpoints in mipi_csi node
and the pinctrl for the reset gpio.

Signed-off-by: Rui Miguel Silva 
---
 arch/arm/boot/dts/imx7s-warp.dts | 44 
 1 file changed, 44 insertions(+)

diff --git a/arch/arm/boot/dts/imx7s-warp.dts b/arch/arm/boot/dts/imx7s-warp.dts
index 358bcae7ebaf..58d1a89ee3e3 100644
--- a/arch/arm/boot/dts/imx7s-warp.dts
+++ b/arch/arm/boot/dts/imx7s-warp.dts
@@ -55,6 +55,14 @@
regulator-always-on;
};
 
+   reg_peri_3p15v: regulator-peri-3p15v {
+   compatible = "regulator-fixed";
+   regulator-name = "peri_3p15v_reg";
+   regulator-min-microvolt = <315>;
+   regulator-max-microvolt = <315>;
+   regulator-always-on;
+   };
+
sound {
compatible = "simple-audio-card";
simple-audio-card,name = "imx7-sgtl5000";
@@ -178,6 +186,27 @@
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_i2c2>;
status = "okay";
+
+   ov2680: camera@36 {
+   compatible = "ovti,ov2680";
+   pinctrl-names = "default";
+   pinctrl-0 = <&pinctrl_ov2680>;
+   reg = <0x36>;
+   clocks = <&osc>;
+   clock-names = "xvclk";
+   reset-gpios = <&gpio1 3 GPIO_ACTIVE_LOW>;
+   DOVDD-supply = <&sw2_reg>;
+   DVDD-supply = <&sw2_reg>;
+   AVDD-supply = <®_peri_3p15v>;
+
+   port {
+   ov2680_to_mipi: endpoint {
+   remote-endpoint = <&mipi_from_sensor>;
+   clock-lanes = <0>;
+   data-lanes = <1>;
+   };
+   };
+   };
 };
 
 &i2c3 {
@@ -319,6 +348,15 @@
#size-cells = <0>;
fsl,csis-hs-settle = <3>;
 
+   port@0 {
+   reg = <0>;
+
+   mipi_from_sensor: endpoint {
+   remote-endpoint = <&ov2680_to_mipi>;
+   data-lanes = <1>;
+   };
+   };
+
port@1 {
reg = <1>;
 
@@ -382,6 +420,12 @@
>;
};
 
+   pinctrl_ov2680: ov2660grp {
+   fsl,pins = <
+   MX7D_PAD_LPSR_GPIO1_IO03__GPIO1_IO3 0x14
+   >;
+   };
+
pinctrl_sai1: sai1grp {
fsl,pins = <
MX7D_PAD_SAI1_RX_DATA__SAI1_RX_DATA00x1f
-- 
2.20.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH v14 05/13] media: staging/imx7: add MIPI CSI-2 receiver subdev for i.MX7

2019-02-06 Thread Rui Miguel Silva
Adds MIPI CSI-2 subdev for i.MX7 to connect with sensors with a MIPI
CSI-2 interface.

Signed-off-by: Rui Miguel Silva 
---
 drivers/staging/media/imx/Makefile |1 +
 drivers/staging/media/imx/imx7-mipi-csis.c | 1186 
 2 files changed, 1187 insertions(+)
 create mode 100644 drivers/staging/media/imx/imx7-mipi-csis.c

diff --git a/drivers/staging/media/imx/Makefile 
b/drivers/staging/media/imx/Makefile
index 074f016d3519..d2d909a36239 100644
--- a/drivers/staging/media/imx/Makefile
+++ b/drivers/staging/media/imx/Makefile
@@ -14,3 +14,4 @@ obj-$(CONFIG_VIDEO_IMX_CSI) += imx-media-csi.o
 obj-$(CONFIG_VIDEO_IMX_CSI) += imx6-mipi-csi2.o
 
 obj-$(CONFIG_VIDEO_IMX7_CSI) += imx7-media-csi.o
+obj-$(CONFIG_VIDEO_IMX7_CSI) += imx7-mipi-csis.o
diff --git a/drivers/staging/media/imx/imx7-mipi-csis.c 
b/drivers/staging/media/imx/imx7-mipi-csis.c
new file mode 100644
index ..516d308dc44b
--- /dev/null
+++ b/drivers/staging/media/imx/imx7-mipi-csis.c
@@ -0,0 +1,1186 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Freescale i.MX7 SoC series MIPI-CSI V3.3 receiver driver
+ *
+ * Copyright (C) 2019 Linaro Ltd
+ * Copyright (C) 2015-2016 Freescale Semiconductor, Inc. All Rights Reserved.
+ * Copyright (C) 2011 - 2013 Samsung Electronics Co., Ltd.
+ *
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include 
+#include 
+#include 
+
+#include "imx-media.h"
+
+#define CSIS_DRIVER_NAME   "imx7-mipi-csis"
+#define CSIS_SUBDEV_NAME   CSIS_DRIVER_NAME
+
+#define CSIS_PAD_SINK  0
+#define CSIS_PAD_SOURCE1
+#define CSIS_PADS_NUM  2
+
+#define MIPI_CSIS_DEF_PIX_WIDTH640
+#define MIPI_CSIS_DEF_PIX_HEIGHT   480
+
+/* Register map definition */
+
+/* CSIS common control */
+#define MIPI_CSIS_CMN_CTRL 0x04
+#define MIPI_CSIS_CMN_CTRL_UPDATE_SHADOW   BIT(16)
+#define MIPI_CSIS_CMN_CTRL_INTER_MODE  BIT(10)
+#define MIPI_CSIS_CMN_CTRL_UPDATE_SHADOW_CTRL  BIT(2)
+#define MIPI_CSIS_CMN_CTRL_RESET   BIT(1)
+#define MIPI_CSIS_CMN_CTRL_ENABLE  BIT(0)
+
+#define MIPI_CSIS_CMN_CTRL_LANE_NR_OFFSET  8
+#define MIPI_CSIS_CMN_CTRL_LANE_NR_MASK(3 << 8)
+
+/* CSIS clock control */
+#define MIPI_CSIS_CLK_CTRL 0x08
+#define MIPI_CSIS_CLK_CTRL_CLKGATE_TRAIL_CH3(x)((x) << 28)
+#define MIPI_CSIS_CLK_CTRL_CLKGATE_TRAIL_CH2(x)((x) << 24)
+#define MIPI_CSIS_CLK_CTRL_CLKGATE_TRAIL_CH1(x)((x) << 20)
+#define MIPI_CSIS_CLK_CTRL_CLKGATE_TRAIL_CH0(x)((x) << 16)
+#define MIPI_CSIS_CLK_CTRL_CLKGATE_EN_MSK  (0xf << 4)
+#define MIPI_CSIS_CLK_CTRL_WCLK_SRCBIT(0)
+
+/* CSIS Interrupt mask */
+#define MIPI_CSIS_INTMSK   0x10
+#define MIPI_CSIS_INTMSK_EVEN_BEFORE   BIT(31)
+#define MIPI_CSIS_INTMSK_EVEN_AFTERBIT(30)
+#define MIPI_CSIS_INTMSK_ODD_BEFOREBIT(29)
+#define MIPI_CSIS_INTMSK_ODD_AFTER BIT(28)
+#define MIPI_CSIS_INTMSK_FRAME_START   BIT(24)
+#define MIPI_CSIS_INTMSK_FRAME_END BIT(20)
+#define MIPI_CSIS_INTMSK_ERR_SOT_HSBIT(16)
+#define MIPI_CSIS_INTMSK_ERR_LOST_FS   BIT(12)
+#define MIPI_CSIS_INTMSK_ERR_LOST_FE   BIT(8)
+#define MIPI_CSIS_INTMSK_ERR_OVER  BIT(4)
+#define MIPI_CSIS_INTMSK_ERR_WRONG_CFG BIT(3)
+#define MIPI_CSIS_INTMSK_ERR_ECC   BIT(2)
+#define MIPI_CSIS_INTMSK_ERR_CRC   BIT(1)
+#define MIPI_CSIS_INTMSK_ERR_UNKNOWN   BIT(0)
+
+/* CSIS Interrupt source */
+#define MIPI_CSIS_INTSRC   0x14
+#define MIPI_CSIS_INTSRC_EVEN_BEFORE   BIT(31)
+#define MIPI_CSIS_INTSRC_EVEN_AFTERBIT(30)
+#define MIPI_CSIS_INTSRC_EVEN  BIT(30)
+#define MIPI_CSIS_INTSRC_ODD_BEFOREBIT(29)
+#define MIPI_CSIS_INTSRC_ODD_AFTER BIT(28)
+#define MIPI_CSIS_INTSRC_ODD   (0x3 << 28)
+#define MIPI_CSIS_INTSRC_NON_IMAGE_DATA(0xf << 28)
+#define MIPI_CSIS_INTSRC_FRAME_START   BIT(24)
+#define MIPI_CSIS_INTSRC_FRAME_END BIT(20)
+#define MIPI_CSIS_INTSRC_ERR_SOT_HSBIT(16)
+#define MIPI_CSIS_INTSRC_ERR_LOST_FS   BIT(12)
+#define MIPI_CSIS_INTSRC_ERR_LOST_FE   BIT(8)
+#define MIPI_CSIS_INTSRC_ERR_OVER  BIT(4)
+#define MIPI_CSIS_INTSRC_ERR_WRONG_CFG BIT(3)
+#define MIPI_CSIS_INTSRC_ERR_ECC   BIT(2)
+#define MIPI_CSIS_INTSRC_ERR_CRC   BIT(1)
+#define MIPI_CSIS_INTSRC_ERR_UNKNOWN   BIT(0)
+#define MIPI_CSIS_INTSRC_ERRORS0xf
+
+/* D-PHY status control */
+#define MIPI_CSIS_DPHYSTATUS   0x20
+#define MIPI_CSIS_DPHYSTATUS_ULPS_DAT  BIT(8)
+#define MIPI_CSIS_DPHYSTATUS_STOPSTATE_DAT BIT(4)
+#define MIPI_CSIS_DPHYSTATUS_ULPS_CLK  BIT(1)
+#define MIPI_CSIS_DPHYSTATUS_STOPSTATE_CLK BIT(0)
+
+/* D-PHY common control */
+#define MIPI_CSIS_DPHYCTRL 0x24
+#define MIPI_CSIS_DPHYCTRL_HSS_MASK(0xff << 24)
+#define MIPI_CSIS_DPHYCTRL_HSS_OFFSET  

[PATCH v14 08/13] ARM: dts: imx7: Add video mux, csi and mipi_csi and connections

2019-02-06 Thread Rui Miguel Silva
This patch adds the device tree nodes for csi, video multiplexer and
mipi-csi besides the graph connecting the necessary endpoints to make
the media capture entities to work in imx7 Warp board.

Signed-off-by: Rui Miguel Silva 
---
 arch/arm/boot/dts/imx7s-warp.dts | 51 
 arch/arm/boot/dts/imx7s.dtsi | 27 +
 2 files changed, 78 insertions(+)

diff --git a/arch/arm/boot/dts/imx7s-warp.dts b/arch/arm/boot/dts/imx7s-warp.dts
index 23431faecaf4..358bcae7ebaf 100644
--- a/arch/arm/boot/dts/imx7s-warp.dts
+++ b/arch/arm/boot/dts/imx7s-warp.dts
@@ -277,6 +277,57 @@
status = "okay";
 };
 
+&gpr {
+   csi_mux {
+   compatible = "video-mux";
+   mux-controls = <&mux 0>;
+   #address-cells = <1>;
+   #size-cells = <0>;
+
+   port@1 {
+   reg = <1>;
+
+   csi_mux_from_mipi_vc0: endpoint {
+   remote-endpoint = <&mipi_vc0_to_csi_mux>;
+   };
+   };
+
+   port@2 {
+   reg = <2>;
+
+   csi_mux_to_csi: endpoint {
+   remote-endpoint = <&csi_from_csi_mux>;
+   };
+   };
+   };
+};
+
+&csi {
+   status = "okay";
+
+   port {
+   csi_from_csi_mux: endpoint {
+   remote-endpoint = <&csi_mux_to_csi>;
+   };
+   };
+};
+
+&mipi_csi {
+   clock-frequency = <16600>;
+   status = "okay";
+   #address-cells = <1>;
+   #size-cells = <0>;
+   fsl,csis-hs-settle = <3>;
+
+   port@1 {
+   reg = <1>;
+
+   mipi_vc0_to_csi_mux: endpoint {
+   remote-endpoint = <&csi_mux_from_mipi_vc0>;
+   };
+   };
+};
+
 &wdog1 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_wdog>;
diff --git a/arch/arm/boot/dts/imx7s.dtsi b/arch/arm/boot/dts/imx7s.dtsi
index 792efcd2caa1..01962f85cab6 100644
--- a/arch/arm/boot/dts/imx7s.dtsi
+++ b/arch/arm/boot/dts/imx7s.dtsi
@@ -8,6 +8,7 @@
 #include 
 #include 
 #include 
+#include 
 #include "imx7d-pinfunc.h"
 
 / {
@@ -709,6 +710,17 @@
status = "disabled";
};
 
+   csi: csi@3071 {
+   compatible = "fsl,imx7-csi";
+   reg = <0x3071 0x1>;
+   interrupts = ;
+   clocks = <&clks IMX7D_CLK_DUMMY>,
+   <&clks IMX7D_CSI_MCLK_ROOT_CLK>,
+   <&clks IMX7D_CLK_DUMMY>;
+   clock-names = "axi", "mclk", "dcic";
+   status = "disabled";
+   };
+
lcdif: lcdif@3073 {
compatible = "fsl,imx7d-lcdif", 
"fsl,imx28-lcdif";
reg = <0x3073 0x1>;
@@ -718,6 +730,21 @@
clock-names = "pix", "axi";
status = "disabled";
};
+
+   mipi_csi: mipi-csi@3075 {
+   compatible = "fsl,imx7-mipi-csi2";
+   reg = <0x3075 0x1>;
+   interrupts = ;
+   clocks = <&clks IMX7D_IPG_ROOT_CLK>,
+   <&clks IMX7D_MIPI_CSI_ROOT_CLK>,
+   <&clks IMX7D_MIPI_DPHY_ROOT_CLK>;
+   clock-names = "pclk", "wrap", "phy";
+   power-domains = <&pgc_mipi_phy>;
+   phy-supply = <®_1p0d>;
+   resets = <&src IMX7_RESET_MIPI_PHY_MRST>;
+   reset-names = "mrst";
+   status = "disabled";
+   };
};
 
aips3: aips-bus@3080 {
-- 
2.20.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH v14 02/13] media: staging/imx: rearrange group id to take in account IPU

2019-02-06 Thread Rui Miguel Silva
Some imx system do not have IPU, so prepare the imx media drivers to
support this kind of devices. Rename the group ids to include an _IPU_
prefix, add a new group id to support systems with only a CSI without
IPU, and also rename the create internal links to make it clear that
only systems with IPU have internal subdevices.

Signed-off-by: Rui Miguel Silva 
Acked-by: Sakari Ailus 
---
 drivers/staging/media/imx/imx-ic-common.c |  6 ++---
 drivers/staging/media/imx/imx-ic-prp.c| 16 ++---
 drivers/staging/media/imx/imx-media-csi.c |  6 ++---
 drivers/staging/media/imx/imx-media-dev.c | 22 ++
 .../staging/media/imx/imx-media-internal-sd.c | 20 
 drivers/staging/media/imx/imx-media-utils.c   | 12 +-
 drivers/staging/media/imx/imx-media.h | 23 ++-
 7 files changed, 55 insertions(+), 50 deletions(-)

diff --git a/drivers/staging/media/imx/imx-ic-common.c 
b/drivers/staging/media/imx/imx-ic-common.c
index cfdd4900a3be..765919487a73 100644
--- a/drivers/staging/media/imx/imx-ic-common.c
+++ b/drivers/staging/media/imx/imx-ic-common.c
@@ -41,13 +41,13 @@ static int imx_ic_probe(struct platform_device *pdev)
pdata = priv->dev->platform_data;
priv->ipu_id = pdata->ipu_id;
switch (pdata->grp_id) {
-   case IMX_MEDIA_GRP_ID_IC_PRP:
+   case IMX_MEDIA_GRP_ID_IPU_IC_PRP:
priv->task_id = IC_TASK_PRP;
break;
-   case IMX_MEDIA_GRP_ID_IC_PRPENC:
+   case IMX_MEDIA_GRP_ID_IPU_IC_PRPENC:
priv->task_id = IC_TASK_ENCODER;
break;
-   case IMX_MEDIA_GRP_ID_IC_PRPVF:
+   case IMX_MEDIA_GRP_ID_IPU_IC_PRPVF:
priv->task_id = IC_TASK_VIEWFINDER;
break;
default:
diff --git a/drivers/staging/media/imx/imx-ic-prp.c 
b/drivers/staging/media/imx/imx-ic-prp.c
index 98923fc844ce..2702548f83cf 100644
--- a/drivers/staging/media/imx/imx-ic-prp.c
+++ b/drivers/staging/media/imx/imx-ic-prp.c
@@ -77,7 +77,7 @@ static int prp_start(struct prp_priv *priv)
priv->ipu = priv->md->ipu[ic_priv->ipu_id];
 
/* set IC to receive from CSI or VDI depending on source */
-   src_is_vdic = !!(priv->src_sd->grp_id & IMX_MEDIA_GRP_ID_VDIC);
+   src_is_vdic = !!(priv->src_sd->grp_id & IMX_MEDIA_GRP_ID_IPU_VDIC);
 
ipu_set_ic_src_mux(priv->ipu, priv->csi_id, src_is_vdic);
 
@@ -237,8 +237,8 @@ static int prp_link_setup(struct media_entity *entity,
ret = -EBUSY;
goto out;
}
-   if (priv->sink_sd_prpenc && (remote_sd->grp_id &
-IMX_MEDIA_GRP_ID_VDIC)) {
+   if (priv->sink_sd_prpenc &&
+   (remote_sd->grp_id & IMX_MEDIA_GRP_ID_IPU_VDIC)) {
ret = -EINVAL;
goto out;
}
@@ -259,7 +259,7 @@ static int prp_link_setup(struct media_entity *entity,
goto out;
}
if (priv->src_sd && (priv->src_sd->grp_id &
-IMX_MEDIA_GRP_ID_VDIC)) {
+IMX_MEDIA_GRP_ID_IPU_VDIC)) {
ret = -EINVAL;
goto out;
}
@@ -309,13 +309,13 @@ static int prp_link_validate(struct v4l2_subdev *sd,
return ret;
 
csi = imx_media_find_upstream_subdev(priv->md, &ic_priv->sd.entity,
-IMX_MEDIA_GRP_ID_CSI);
+IMX_MEDIA_GRP_ID_IPU_CSI);
if (IS_ERR(csi))
csi = NULL;
 
mutex_lock(&priv->lock);
 
-   if (priv->src_sd->grp_id & IMX_MEDIA_GRP_ID_VDIC) {
+   if (priv->src_sd->grp_id & IMX_MEDIA_GRP_ID_IPU_VDIC) {
/*
 * the ->PRPENC link cannot be enabled if the source
 * is the VDIC
@@ -334,10 +334,10 @@ static int prp_link_validate(struct v4l2_subdev *sd,
 
if (csi) {
switch (csi->grp_id) {
-   case IMX_MEDIA_GRP_ID_CSI0:
+   case IMX_MEDIA_GRP_ID_IPU_CSI0:
priv->csi_id = 0;
break;
-   case IMX_MEDIA_GRP_ID_CSI1:
+   case IMX_MEDIA_GRP_ID_IPU_CSI1:
priv->csi_id = 1;
break;
default:
diff --git a/drivers/staging/media/imx/imx-media-csi.c 
b/drivers/staging/media/imx/imx-media-csi.c
index d851ca2497b4..d957b8aa3ec5 100644
--- a/drivers/staging/media/imx/imx-media-csi.c
+++ b/drivers/staging/media/imx/imx-media-csi.c
@@ -1071,10 +1071,10 @@ static int csi_link_setup(struct media_entity *entity,
 
remote_sd = media_entity_to_v4l2_

[PATCH v14 06/13] ARM: dts: imx7s: add mipi phy power domain

2019-02-06 Thread Rui Miguel Silva
Add power domain index 0 related with mipi-phy to imx7s.

While at it rename pcie power-domain node to remove pgc prefix.

Signed-off-by: Rui Miguel Silva 
---
 arch/arm/boot/dts/imx7s.dtsi | 8 +++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/arch/arm/boot/dts/imx7s.dtsi b/arch/arm/boot/dts/imx7s.dtsi
index e88f53a4c7f4..9a680d3d6424 100644
--- a/arch/arm/boot/dts/imx7s.dtsi
+++ b/arch/arm/boot/dts/imx7s.dtsi
@@ -606,7 +606,13 @@
#address-cells = <1>;
#size-cells = <0>;
 
-   pgc_pcie_phy: pgc-power-domain@1 {
+   pgc_mipi_phy: power-domain@0 {
+   #power-domain-cells = <0>;
+   reg = <0>;
+   power-supply = <®_1p0d>;
+   };
+
+   pgc_pcie_phy: power-domain@1 {
#power-domain-cells = <0>;
reg = <1>;
power-supply = <®_1p0d>;
-- 
2.20.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH v14 00/13] media: staging/imx7: add i.MX7 media driver

2019-02-06 Thread Rui Miguel Silva
Hi,
This series introduces the Media driver to work with the i.MX7 SoC. it uses the
already existing imx media core drivers but since the i.MX7, contrary to
i.MX5/6, do not have an IPU and because of that some changes in the imx media
core are made along this series to make it support that case.

This patches adds CSI and MIPI-CSI2 drivers for i.MX7, along with several
configurations changes for this to work as a capture subsystem. Some bugs are
also fixed along the line. And necessary documentation.

For a more detailed view of the capture paths, pads links in the i.MX7 please
take a look at the documentation in PATCH 10.

The system used to test and develop this was the Warp7 board with an OV2680
sensor, which output format is 10-bit bayer. So, only MIPI interface was
tested, a scenario with an parallel input would nice to have.

Bellow goes an example of the output of the pads and links and the output of
v4l2-compliance testing.

The v4l-utils version used is:
v4l2-compliance SHA: 1a6c8fe9a65c26e78ba34bd4aa2df28ede7d00cb, 32 bits

The Media Driver fail some tests but this failures are coming from code out of
scope of this series (imx-capture), and some from the sensor OV2680
but that I think not related with the sensor driver but with the testing and
core.

The csi and mipi-csi entities pass all compliance tests.

Cheers,
Rui

v13->v14:
  - Fix rebase in v13 in patch 1/13
  Hans:
- Add SPDX label in imx7.rst file
- did not add MAINTAINERS entry since it is done in patch 13/13

v12->v13:
Fingers crossed :)
Hans:
- rebase latest master
f0ef022c8 media: vim2m: allow setting the default transaction time via 
parameter
Sakari:
- add Acked-by: Sakari Ailus  2 and 4
(did not do it to 1, because it changed on the rebase)

v11->v12:
  Sakari:
- check v4l2_ctrl_handler_free and init when exposed to userspace
- check csi_remove missing v4l2_async_notifier_unregister
- media device unregister before ctrl_handler_free
- GPL => GPL v2
- Fix squash of CSI patches, issue on v11
- add Acked-by: Sakari Ailus  10--13
- mipi_s_stream check for ret < 0 and call pm_runtime_put_noidle
- use __maybe_unused in pm functions
- Extra space before labels

v10->v11:
  Sakari:
- Remove cleanup functions in dev-common and do direct calls
- Fix notifier cleanup on error path

  Philipp Zabel:
- Add reviewed tag to video mux patch 12/13

v9->v10:
  Hans:
  - move dt-bindings patch up in the series to avoid checkpatch warnings
  - Fix SPDX tag

  Sakari:
  - use debugfs and drop driver parameters
  - use dev_*() macros all over the place, drop v4l2_*() ones
  - use clk_bulk
  - give control to power state to runtime PM
  - unsigned and const for some objects

v8->v9:
Hans Verkuil:
 - Fix issues detected by checkpatch strict, still some left:
 - bigger kconfig option description
 - some alignement parenthesis that were left as they are, to be more
 readable 
 - added new patch (PATCH13) for Maintainers update
 - SPDX in documentation rst file
Sakari Ailus:
 - remove pad check in csi, this is done by core already
 - destroy mutex in probe error path (add label)
 - swap order in driver release
 - initialize endpoint in stack
 - use clk_bulk
kbuild test robot:
 - add the missing imx-media-dev-common.c in patch 1/13
 - remove OWNER of module csis
Myself:
 - add MAINTAINERS entries - new patch

v7->v8:
Myself:
 - rebase to latest linux-next (s/V4L2_MBUS_CSI2/V4L2_MBUS_CSI2_DPHY/)
 - Rebuild and test with latest v4l2-compliance
 - add Sakari reviewed-by tag to dt-bindings

v6->v7:
Myself:
 - Clock patches removed from this version since they were already merged
 - Rebuild and test with the latest v4l2-compliance
 - Add patch to video-mux regarding bayer formats
 - remove reference to dependent patch serie (was already merged)

Sakari Ailus:
 - add port and endpoint explanantions
 - fix some wording should -> shall

v5->v6:
Rob Herring:
 - rename power-domain node name from: pgc-power-domain to power-domain
 - change mux-control-cells to 0
 - remove bus-width from mipi bindings and dts
 - remove err... regarding clock names line
 - remove clk-settle from example
 - split mipi-csi2 and csi bindings per file
 - add OF graph description to CSI

Philipp Zabel:
 - rework group IDs and rename them with an _IPU_ prefix, this allowed to remove
   the ipu_present flag need.

v4->v5:
Sakari Ailus:
 - fix remove of the capture entries in dts bindings in the right patch

Stephen Boyd:
 - Send all series to clk list

v3->v4:
Philipp Zabel:
 - refactor initialization code from media device probe to be possible to used
   from other modules
 - Remove index of csi from all accurrencs (dts, code, documentation)
 - Remove need for capture node for imx7
 - fix pinctrl for ov2680
 - add reviewed tag to add multiplexer controls patch

Fabio Estevam:
 - remove always on from new regulator

Randy Dunlap:
 - several text editing fixes in documentation

Myself:
 - reb

[PATCH v14 03/13] media: dt-bindings: add bindings for i.MX7 media driver

2019-02-06 Thread Rui Miguel Silva
Add bindings documentation for i.MX7 media drivers.
The imx7 MIPI CSI2 and imx7 CMOS Sensor Interface.

Signed-off-by: Rui Miguel Silva 
Reviewed-by: Rob Herring 
Acked-by: Sakari Ailus 
---
 .../devicetree/bindings/media/imx7-csi.txt| 45 ++
 .../bindings/media/imx7-mipi-csi2.txt | 90 +++
 2 files changed, 135 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/media/imx7-csi.txt
 create mode 100644 Documentation/devicetree/bindings/media/imx7-mipi-csi2.txt

diff --git a/Documentation/devicetree/bindings/media/imx7-csi.txt 
b/Documentation/devicetree/bindings/media/imx7-csi.txt
new file mode 100644
index ..3c07bc676bc3
--- /dev/null
+++ b/Documentation/devicetree/bindings/media/imx7-csi.txt
@@ -0,0 +1,45 @@
+Freescale i.MX7 CMOS Sensor Interface
+=
+
+csi node
+
+
+This is device node for the CMOS Sensor Interface (CSI) which enables the chip
+to connect directly to external CMOS image sensors.
+
+Required properties:
+
+- compatible: "fsl,imx7-csi";
+- reg   : base address and length of the register set for the device;
+- interrupts: should contain CSI interrupt;
+- clocks: list of clock specifiers, see
+Documentation/devicetree/bindings/clock/clock-bindings.txt for details;
+- clock-names   : must contain "axi", "mclk" and "dcic" entries, matching
+ entries in the clock property;
+
+The device node shall contain one 'port' child node with one child 'endpoint'
+node, according to the bindings defined in:
+Documentation/devicetree/bindings/media/video-interfaces.txt.
+
+In the following example a remote endpoint is a video multiplexer.
+
+example:
+
+csi: csi@3071 {
+#address-cells = <1>;
+#size-cells = <0>;
+
+compatible = "fsl,imx7-csi";
+reg = <0x3071 0x1>;
+interrupts = ;
+clocks = <&clks IMX7D_CLK_DUMMY>,
+<&clks IMX7D_CSI_MCLK_ROOT_CLK>,
+<&clks IMX7D_CLK_DUMMY>;
+clock-names = "axi", "mclk", "dcic";
+
+port {
+csi_from_csi_mux: endpoint {
+remote-endpoint = <&csi_mux_to_csi>;
+};
+};
+};
diff --git a/Documentation/devicetree/bindings/media/imx7-mipi-csi2.txt 
b/Documentation/devicetree/bindings/media/imx7-mipi-csi2.txt
new file mode 100644
index ..71fd74ed3ec8
--- /dev/null
+++ b/Documentation/devicetree/bindings/media/imx7-mipi-csi2.txt
@@ -0,0 +1,90 @@
+Freescale i.MX7 Mipi CSI2
+=
+
+mipi_csi2 node
+--
+
+This is the device node for the MIPI CSI-2 receiver core in i.MX7 SoC. It is
+compatible with previous version of Samsung D-phy.
+
+Required properties:
+
+- compatible: "fsl,imx7-mipi-csi2";
+- reg   : base address and length of the register set for the device;
+- interrupts: should contain MIPI CSIS interrupt;
+- clocks: list of clock specifiers, see
+Documentation/devicetree/bindings/clock/clock-bindings.txt for details;
+- clock-names   : must contain "pclk", "wrap" and "phy" entries, matching
+  entries in the clock property;
+- power-domains : a phandle to the power domain, see
+  Documentation/devicetree/bindings/power/power_domain.txt for details.
+- reset-names   : should include following entry "mrst";
+- resets: a list of phandle, should contain reset entry of
+  reset-names;
+- phy-supply: from the generic phy bindings, a phandle to a regulator that
+ provides power to MIPI CSIS core;
+
+Optional properties:
+
+- clock-frequency : The IP's main (system bus) clock frequency in Hz, default
+   value when this property is not specified is 166 MHz;
+- fsl,csis-hs-settle : differential receiver (HS-RX) settle time;
+
+The device node should contain two 'port' child nodes with one child 'endpoint'
+node, according to the bindings defined in:
+ Documentation/devicetree/bindings/ media/video-interfaces.txt.
+ The following are properties specific to those nodes.
+
+port node
+-
+
+- reg: (required) can take the values 0 or 1, where 0 shall be
+ related to the sink port and port 1 shall be the source
+ one;
+
+endpoint node
+-
+
+- data-lanes: (required) an array specifying active physical MIPI-CSI2
+   data input lanes and their mapping to logical lanes; this
+shall only be applied to port 0 (sink port), the array's
+content is unused only its length is meaningful,
+in this case the maximum le

[PATCH v14 07/13] ARM: dts: imx7s: add multiplexer controls

2019-02-06 Thread Rui Miguel Silva
The IOMUXC General Purpose Register has bitfield to control video bus
multiplexer to control the CSI input between the MIPI-CSI2 and parallel
interface. Add that register and mask.

Signed-off-by: Rui Miguel Silva 
Reviewed-by: Philipp Zabel 
---
 arch/arm/boot/dts/imx7s.dtsi | 9 -
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/arch/arm/boot/dts/imx7s.dtsi b/arch/arm/boot/dts/imx7s.dtsi
index 9a680d3d6424..792efcd2caa1 100644
--- a/arch/arm/boot/dts/imx7s.dtsi
+++ b/arch/arm/boot/dts/imx7s.dtsi
@@ -497,8 +497,15 @@
 
gpr: iomuxc-gpr@3034 {
compatible = "fsl,imx7d-iomuxc-gpr",
-   "fsl,imx6q-iomuxc-gpr", "syscon";
+   "fsl,imx6q-iomuxc-gpr", "syscon",
+   "simple-mfd";
reg = <0x3034 0x1>;
+
+   mux: mux-controller {
+   compatible = "mmio-mux";
+   #mux-control-cells = <0>;
+   mux-reg-masks = <0x14 0x0010>;
+   };
};
 
ocotp: ocotp-ctrl@3035 {
-- 
2.20.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH v14 04/13] media: staging/imx7: add imx7 CSI subdev driver

2019-02-06 Thread Rui Miguel Silva
This add the media entity subdevice and control driver for the i.MX7
CMOS Sensor Interface.

Signed-off-by: Rui Miguel Silva 
Acked-by: Sakari Ailus 
---
 drivers/staging/media/imx/Kconfig  |9 +-
 drivers/staging/media/imx/Makefile |2 +
 drivers/staging/media/imx/imx7-media-csi.c | 1365 
 3 files changed, 1375 insertions(+), 1 deletion(-)
 create mode 100644 drivers/staging/media/imx/imx7-media-csi.c

diff --git a/drivers/staging/media/imx/Kconfig 
b/drivers/staging/media/imx/Kconfig
index bfc17de56b17..36b276ea2ecc 100644
--- a/drivers/staging/media/imx/Kconfig
+++ b/drivers/staging/media/imx/Kconfig
@@ -11,7 +11,7 @@ config VIDEO_IMX_MEDIA
  driver for the i.MX5/6 SOC.
 
 if VIDEO_IMX_MEDIA
-menu "i.MX5/6 Media Sub devices"
+menu "i.MX5/6/7 Media Sub devices"
 
 config VIDEO_IMX_CSI
tristate "i.MX5/6 Camera Sensor Interface driver"
@@ -20,5 +20,12 @@ config VIDEO_IMX_CSI
---help---
  A video4linux camera sensor interface driver for i.MX5/6.
 
+config VIDEO_IMX7_CSI
+   tristate "i.MX7 Camera Sensor Interface driver"
+   depends on VIDEO_IMX_MEDIA && VIDEO_DEV && I2C
+   default y
+   help
+ Enable support for video4linux camera sensor interface driver for
+ i.MX7.
 endmenu
 endif
diff --git a/drivers/staging/media/imx/Makefile 
b/drivers/staging/media/imx/Makefile
index a30b3033f9a3..074f016d3519 100644
--- a/drivers/staging/media/imx/Makefile
+++ b/drivers/staging/media/imx/Makefile
@@ -12,3 +12,5 @@ obj-$(CONFIG_VIDEO_IMX_MEDIA) += imx-media-ic.o
 
 obj-$(CONFIG_VIDEO_IMX_CSI) += imx-media-csi.o
 obj-$(CONFIG_VIDEO_IMX_CSI) += imx6-mipi-csi2.o
+
+obj-$(CONFIG_VIDEO_IMX7_CSI) += imx7-media-csi.o
diff --git a/drivers/staging/media/imx/imx7-media-csi.c 
b/drivers/staging/media/imx/imx7-media-csi.c
new file mode 100644
index ..d5154f032979
--- /dev/null
+++ b/drivers/staging/media/imx/imx7-media-csi.c
@@ -0,0 +1,1365 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * V4L2 Capture CSI Subdev for Freescale i.MX7 SOC
+ *
+ * Copyright (c) 2019 Linaro Ltd
+ *
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include 
+#include "imx-media.h"
+
+#define IMX7_CSI_PAD_SINK  0
+#define IMX7_CSI_PAD_SRC   1
+#define IMX7_CSI_PADS_NUM  2
+
+/* reset values */
+#define CSICR1_RESET_VAL   0x4800
+#define CSICR2_RESET_VAL   0x0
+#define CSICR3_RESET_VAL   0x0
+
+/* csi control reg 1 */
+#define BIT_SWAP16_EN  BIT(31)
+#define BIT_EXT_VSYNC  BIT(30)
+#define BIT_EOF_INT_EN BIT(29)
+#define BIT_PRP_IF_EN  BIT(28)
+#define BIT_CCIR_MODE  BIT(27)
+#define BIT_COF_INT_EN BIT(26)
+#define BIT_SF_OR_INTENBIT(25)
+#define BIT_RF_OR_INTENBIT(24)
+#define BIT_SFF_DMA_DONE_INTEN  BIT(22)
+#define BIT_STATFF_INTEN   BIT(21)
+#define BIT_FB2_DMA_DONE_INTEN  BIT(20)
+#define BIT_FB1_DMA_DONE_INTEN  BIT(19)
+#define BIT_RXFF_INTEN BIT(18)
+#define BIT_SOF_POLBIT(17)
+#define BIT_SOF_INTEN  BIT(16)
+#define BIT_MCLKDIV(0xF << 12)
+#define BIT_HSYNC_POL  BIT(11)
+#define BIT_CCIR_ENBIT(10)
+#define BIT_MCLKEN BIT(9)
+#define BIT_FCCBIT(8)
+#define BIT_PACK_DIR   BIT(7)
+#define BIT_CLR_STATFIFO   BIT(6)
+#define BIT_CLR_RXFIFO BIT(5)
+#define BIT_GCLK_MODE  BIT(4)
+#define BIT_INV_DATA   BIT(3)
+#define BIT_INV_PCLK   BIT(2)
+#define BIT_REDGE  BIT(1)
+#define BIT_PIXEL_BIT  BIT(0)
+
+#define SHIFT_MCLKDIV  12
+
+/* control reg 3 */
+#define BIT_FRMCNT (0x << 16)
+#define BIT_FRMCNT_RST BIT(15)
+#define BIT_DMA_REFLASH_RFFBIT(14)
+#define BIT_DMA_REFLASH_SFFBIT(13)
+#define BIT_DMA_REQ_EN_RFF BIT(12)
+#define BIT_DMA_REQ_EN_SFF BIT(11)
+#define BIT_STATFF_LEVEL   (0x7 << 8)
+#define BIT_HRESP_ERR_EN   BIT(7)
+#define BIT_RXFF_LEVEL (0x7 << 4)
+#define BIT_TWO_8BIT_SENSORBIT(3)
+#define BIT_ZERO_PACK_EN   BIT(2)
+#define BIT_ECC_INT_EN BIT(1)
+#define BIT_ECC_AUTO_ENBIT(0)
+
+#define SHIFT_FRMCNT   16
+#define SHIFT_RXFIFO_LEVEL 4
+
+/* csi status reg */
+#define BIT_ADDR_CH_ERR_INTBIT(28)
+#define BIT_FIELD0_INT BIT(27)
+#define BIT_FIELD1_INT BIT(26)
+#define BIT_SFF_OR_INT BIT(25)
+#define BIT_RFF_OR_INT BIT(24)
+#define BIT_DMA_TSF_DONE_SFF   BIT(22)
+#define BIT_STATFF_INT BIT(21)
+#define BIT_DMA_TSF_DONE_FB2   BIT(20)
+#define BIT_DMA_TSF_DONE_FB1   BIT(19)
+#define BIT_RXFF_INT   BIT(18)
+#define BIT_EOF_INTBIT(17)
+#define BIT_SOF_INTBIT(16)
+#define BIT_F2_INT BIT(15)
+#define BIT_F1_INT 

[PATCH v14 01/13] media: staging/imx: refactor imx media device probe

2019-02-06 Thread Rui Miguel Silva
Refactor and move media device initialization code to a new common
module, so it can be used by other devices, this will allow for example
a near to introduce imx7 CSI driver, to use this media device.

Signed-off-by: Rui Miguel Silva 
---
 drivers/staging/media/imx/Makefile|  1 +
 .../staging/media/imx/imx-media-dev-common.c  | 90 +++
 drivers/staging/media/imx/imx-media-dev.c | 86 --
 drivers/staging/media/imx/imx-media-of.c  |  6 +-
 drivers/staging/media/imx/imx-media.h | 14 +++
 5 files changed, 127 insertions(+), 70 deletions(-)
 create mode 100644 drivers/staging/media/imx/imx-media-dev-common.c

diff --git a/drivers/staging/media/imx/Makefile 
b/drivers/staging/media/imx/Makefile
index 698a4210316e..a30b3033f9a3 100644
--- a/drivers/staging/media/imx/Makefile
+++ b/drivers/staging/media/imx/Makefile
@@ -1,5 +1,6 @@
 # SPDX-License-Identifier: GPL-2.0
 imx-media-objs := imx-media-dev.o imx-media-internal-sd.o imx-media-of.o
+imx-media-objs += imx-media-dev-common.o
 imx-media-common-objs := imx-media-utils.o imx-media-fim.o
 imx-media-ic-objs := imx-ic-common.o imx-ic-prp.o imx-ic-prpencvf.o
 
diff --git a/drivers/staging/media/imx/imx-media-dev-common.c 
b/drivers/staging/media/imx/imx-media-dev-common.c
new file mode 100644
index ..28bcb31cf6ca
--- /dev/null
+++ b/drivers/staging/media/imx/imx-media-dev-common.c
@@ -0,0 +1,90 @@
+// SPDX-License-Identifier: GPL
+/*
+ * V4L2 Media Controller Driver for Freescale common i.MX5/6/7 SOC
+ *
+ * Copyright (c) 2019 Linaro Ltd
+ * Copyright (c) 2016 Mentor Graphics Inc.
+ */
+
+#include 
+#include 
+#include "imx-media.h"
+
+static const struct v4l2_async_notifier_operations imx_media_subdev_ops = {
+   .bound = imx_media_subdev_bound,
+   .complete = imx_media_probe_complete,
+};
+
+static const struct media_device_ops imx_media_md_ops = {
+   .link_notify = imx_media_link_notify,
+};
+
+struct imx_media_dev *imx_media_dev_init(struct device *dev)
+{
+   struct imx_media_dev *imxmd;
+   int ret;
+
+   imxmd = devm_kzalloc(dev, sizeof(*imxmd), GFP_KERNEL);
+   if (!imxmd)
+   return ERR_PTR(-ENOMEM);
+
+   dev_set_drvdata(dev, imxmd);
+
+   strlcpy(imxmd->md.model, "imx-media", sizeof(imxmd->md.model));
+   imxmd->md.ops = &imx_media_md_ops;
+   imxmd->md.dev = dev;
+
+   mutex_init(&imxmd->mutex);
+
+   imxmd->v4l2_dev.mdev = &imxmd->md;
+   imxmd->v4l2_dev.notify = imx_media_notify;
+   strlcpy(imxmd->v4l2_dev.name, "imx-media",
+   sizeof(imxmd->v4l2_dev.name));
+
+   media_device_init(&imxmd->md);
+
+   ret = v4l2_device_register(dev, &imxmd->v4l2_dev);
+   if (ret < 0) {
+   v4l2_err(&imxmd->v4l2_dev,
+"Failed to register v4l2_device: %d\n", ret);
+   goto cleanup;
+   }
+
+   dev_set_drvdata(imxmd->v4l2_dev.dev, imxmd);
+
+   INIT_LIST_HEAD(&imxmd->vdev_list);
+
+   v4l2_async_notifier_init(&imxmd->notifier);
+
+   return imxmd;
+
+cleanup:
+   media_device_cleanup(&imxmd->md);
+
+   return ERR_PTR(ret);
+}
+EXPORT_SYMBOL_GPL(imx_media_dev_init);
+
+int imx_media_dev_notifier_register(struct imx_media_dev *imxmd)
+{
+   int ret;
+
+   /* no subdevs? just bail */
+   if (list_empty(&imxmd->notifier.asd_list)) {
+   v4l2_err(&imxmd->v4l2_dev, "no subdevs\n");
+   return -ENODEV;
+   }
+
+   /* prepare the async subdev notifier and register it */
+   imxmd->notifier.ops = &imx_media_subdev_ops;
+   ret = v4l2_async_notifier_register(&imxmd->v4l2_dev,
+  &imxmd->notifier);
+   if (ret) {
+   v4l2_err(&imxmd->v4l2_dev,
+"v4l2_async_notifier_register failed with %d\n", ret);
+   return ret;
+   }
+
+   return 0;
+}
+EXPORT_SYMBOL_GPL(imx_media_dev_notifier_register);
diff --git a/drivers/staging/media/imx/imx-media-dev.c 
b/drivers/staging/media/imx/imx-media-dev.c
index 25e916562c66..c42bddd78906 100644
--- a/drivers/staging/media/imx/imx-media-dev.c
+++ b/drivers/staging/media/imx/imx-media-dev.c
@@ -116,9 +116,9 @@ static int imx_media_get_ipu(struct imx_media_dev *imxmd,
 }
 
 /* async subdev bound notifier */
-static int imx_media_subdev_bound(struct v4l2_async_notifier *notifier,
- struct v4l2_subdev *sd,
- struct v4l2_async_subdev *asd)
+int imx_media_subdev_bound(struct v4l2_async_notifier *notifier,
+  struct v4l2_subdev *sd,
+  struct v4l2_async_subdev *asd)
 {
struct imx_media_dev *imxmd = notifier2dev(notifier);
int ret = 0;
@@ -302,7 +302,7 @@ static int imx_media_create_pad_vdev_lists(struct 
imx_media_dev *imxmd)
 }
 
 /* async subdev complete notifier */
-static int imx_media_probe_complete(struct v4l2_async_notifier *notifie

Re: [PATCH 1/2] staging: iio: frequency: ad9834: Move frequency to standard iio types

2019-02-06 Thread Dan Carpenter
On Wed, Feb 06, 2019 at 02:05:41PM +0200, Beniamin Bia wrote:
> Frequency attribute is added with a standard type from iio framework
> instead of custom attribute. This is a small step towards removing any
> unnecessary custom attribute.
> 
> Signed-off-by: Beniamin Bia 


This doesn't match your email.  You should probably add a From: to
give your @analog.com address authorship credit.

> ---
>  drivers/staging/iio/frequency/ad9834.c | 97 +-
>  1 file changed, 80 insertions(+), 17 deletions(-)
> 
> diff --git a/drivers/staging/iio/frequency/ad9834.c 
> b/drivers/staging/iio/frequency/ad9834.c
> index f036f75d1f22..370e8263899e 100644
> --- a/drivers/staging/iio/frequency/ad9834.c
> +++ b/drivers/staging/iio/frequency/ad9834.c
> @@ -29,8 +29,7 @@
>  /* Registers */
>  
>  #define AD9834_REG_CMD   0
> -#define AD9834_REG_FREQ0 BIT(14)
> -#define AD9834_REG_FREQ1 BIT(15)
> +#define AD9834_REG_FREQ(chann)   (BIT(14) << (chann))

Only one 'n' in "chan", please.  But we actually pass the address not
the channel here so that was unexpected to me.  I think the channel is
always the same as the address?  So maybe it doesn't matter.

>  #define AD9834_REG_PHASE0(BIT(15) | BIT(14))
>  #define AD9834_REG_PHASE1(BIT(15) | BIT(14) | BIT(13))
>  
> @@ -81,6 +80,9 @@ struct ad9834_state {
>   struct spi_message  freq_msg;
>   struct mutexlock;   /* protect sensor state */
>  
> + unsigned long   frequency0;
> + unsigned long   frequency1;

I don't understand why we have two frequencies when we only ever use
one.

> +
>   /*
>* DMA (thus cache coherency maintenance) requires the
>* transfer buffers to live in their own cache lines.
> @@ -100,6 +102,25 @@ enum ad9834_supported_device_ids {
>   ID_AD9838,
>  };
>  
> +#define AD9833_CHANNEL(_chan) {  
> \

No need for the underscore.  (I think?)

> + .type = IIO_ALTVOLTAGE, \
> + .indexed = 1,   \
> + .output = 1,\
> + .address = (_chan), \
> + .channel = (_chan), \
> + .info_mask_separate = BIT(IIO_CHAN_INFO_FREQUENCY)  \
> +}

regards,
dan carpenter


___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH v2] staging: vt6656: Use the correct style for SPDX license Identifier

2019-02-06 Thread Nishad Kamdar
This patch corrects the style for SPDX license Identifier in mac.h
by using "/* */" in place of "//" as per Linux kernel licensing rules.
Issue found by checkpatch.

Signed-off-by: Nishad Kamdar 
---
Changes in v2:
  - Use the "/* */" comment style specifically for the SPDX identifier
as per licensing rules.
---
 drivers/staging/vt6656/mac.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/staging/vt6656/mac.h b/drivers/staging/vt6656/mac.h
index 94e700fcd0b6..3fd87f95c524 100644
--- a/drivers/staging/vt6656/mac.h
+++ b/drivers/staging/vt6656/mac.h
@@ -1,4 +1,4 @@
-// SPDX-License-Identifier: GPL-2.0+
+/* SPDX-License-Identifier: GPL-2.0+ */
 /*
  * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
  * All rights reserved.
-- 
2.17.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


Re: [PATCH v13 10/13] media: imx7.rst: add documentation for i.MX7 media driver

2019-02-06 Thread Rui Miguel Silva

Hi Hans,
On Wed 06 Feb 2019 at 10:54, Hans Verkuil wrote:

On 2/6/19 11:25 AM, Rui Miguel Silva wrote:
Add rst document to describe the i.MX7 media driver and also a 
working

example from the Warp7 board usage with a OV2680 sensor.

Signed-off-by: Rui Miguel Silva 
Acked-by: Sakari Ailus 


Checkpatch gives me:

Applying: media: imx7.rst: add documentation for i.MX7 media 
driver
WARNING: added, moved or deleted file(s), does MAINTAINERS need 
updating?

#2:
new file mode 100644

WARNING: Missing or malformed SPDX-License-Identifier tag in 
line 1

#7: FILE: Documentation/media/v4l-drivers/imx7.rst:1:
+i.MX7 Video Capture Driver

total: 0 errors, 2 warnings, 164 lines checked


Yeah, I missed checkpatch in the rst file.



Both warnings are valid, so can you make a v13.1 for this patch 
only?

Just include the MAINTAINERS change in this patch.


I will send a complete v14 since I screw up the first patch also.
Thanks any way.

---
Cheers,
Rui



Regards,

Hans


---
 Documentation/media/v4l-drivers/imx7.rst  | 157 
 ++

 Documentation/media/v4l-drivers/index.rst |   1 +
 2 files changed, 158 insertions(+)
 create mode 100644 Documentation/media/v4l-drivers/imx7.rst

diff --git a/Documentation/media/v4l-drivers/imx7.rst 
b/Documentation/media/v4l-drivers/imx7.rst

new file mode 100644
index ..cd1195d391c5
--- /dev/null
+++ b/Documentation/media/v4l-drivers/imx7.rst
@@ -0,0 +1,157 @@
+i.MX7 Video Capture Driver
+==
+
+Introduction
+
+
+The i.MX7 contrary to the i.MX5/6 family does not contain an 
Image Processing
+Unit (IPU); because of that the capabilities to perform 
operations or

+manipulation of the capture frames are less feature rich.
+
+For image capture the i.MX7 has three units:
+- CMOS Sensor Interface (CSI)
+- Video Multiplexer
+- MIPI CSI-2 Receiver
+
+::
+   |\
+   MIPI Camera Input ---> MIPI CSI-2 --- > | \
+   |  \
+   | M |
+   | U | -->  CSI 
---> Capture

+   | X |
+   |  /
+   Parallel Camera Input > | /
+   |/
+
+For additional information, please refer to the latest 
versions of the i.MX7

+reference manual [#f1]_.
+
+Entities
+
+
+imx7-mipi-csi2
+--
+
+This is the MIPI CSI-2 receiver entity. It has one sink pad to 
receive the pixel
+data from MIPI CSI-2 camera sensor. It has one source pad, 
corresponding to the
+virtual channel 0. This module is compliant to previous 
version of Samsung

+D-phy, and supports two D-PHY Rx Data lanes.
+
+csi_mux
+---
+
+This is the video multiplexer. It has two sink pads to select 
from either camera
+sensor with a parallel interface or from MIPI CSI-2 virtual 
channel 0.  It has

+a single source pad that routes to the CSI.
+
+csi
+---
+
+The CSI enables the chip to connect directly to external CMOS 
image sensor. CSI
+can interface directly with Parallel and MIPI CSI-2 buses. It 
has 256 x 64 FIFO
+to store received image pixel data and embedded DMA 
controllers to transfer data

+from the FIFO through AHB bus.
+
+This entity has one sink pad that receives from the csi_mux 
entity and a single
+source pad that routes video frames directly to memory 
buffers. This pad is

+routed to a capture device node.
+
+Usage Notes
+---
+
+To aid in configuration and for backward compatibility with 
V4L2 applications
+that access controls only from video device nodes, the capture 
device interfaces
+inherit controls from the active entities in the current 
pipeline, so controls
+can be accessed either directly from the subdev or from the 
active capture
+device interface. For example, the sensor controls are 
available either from the

+sensor subdevs or from the active capture device.
+
+Warp7 with OV2680
+-
+
+On this platform an OV2680 MIPI CSI-2 module is connected to 
the internal MIPI
+CSI-2 receiver. The following example configures a video 
capture pipeline with

+an output of 800x600, and BGGR 10 bit bayer format:
+
+.. code-block:: none
+   # Setup links
+   media-ctl -l "'ov2680 1-0036':0 -> 'imx7-mipi-csis.0':0[1]"
+   media-ctl -l "'imx7-mipi-csis.0':1 -> 'csi_mux':1[1]"
+   media-ctl -l "'csi_mux':2 -> 'csi':0[1]"
+   media-ctl -l "'csi':1 -> 'csi capture':0[1]"
+
+   # Configure pads for pipeline
+   media-ctl -V "'ov2680 1-0036':0 [fmt:SBGGR10_1X10/800x600 
field:none]"
+   media-ctl -V "'csi_mux':1 [fmt:SBGGR10_1X10/800x600 
field:none]"
+   media-ctl -V "'csi_mux':2 [fmt:SBGGR10_1X10/800x600 
field:none]"
+   media-ctl -V "'imx7-mipi-csis.0':0 
[fmt:SBGGR10_1X10/800x600 field:none]"
+   media-ctl -V "'csi':0 [fmt:SBGGR10_1X10/800x600 
field:none]"

+
+After this streaming can start. The v4l2-ctl tool can be used 
to se

Re: [PATCH net-next v3 00/12] net: Introduce ndo_get_port_parent_id()

2019-02-06 Thread Ido Schimmel
On Wed, Feb 06, 2019 at 09:51:36AM +0200, Ido Schimmel wrote:
> On Tue, Feb 05, 2019 at 03:53:14PM -0800, Florian Fainelli wrote:
> > Hi all,
> > 
> > Based on discussion with Ido and feedback from Jakub there are clearly
> > two classes of users that implement SWITCHDEV_ATTR_ID_PORT_PARENT_ID:
> > 
> > - PF/VF drivers which typically only implement return the port's parent
> >   ID, yet have to implement switchdev_port_attr_get() just for that
> > 
> > - Ethernet switch drivers: mlxsw, ocelot, DSA, etc. which implement more
> >   attributes which we want to be able to eventually veto in the context
> >   of the caller, thus making them candidates for using a blocking notifier
> >   chain
> 
> Florian, patches look good to me. I'm going to build a kernel with these
> patches and run some tests. Will report later today.

Ran most of our tests and nothing exploded. Thanks!
___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 1/2] staging: iio: frequency: ad9834: Move frequency to standard iio types

2019-02-06 Thread Beniamin Bia
Frequency attribute is added with a standard type from iio framework
instead of custom attribute. This is a small step towards removing any
unnecessary custom attribute.

Signed-off-by: Beniamin Bia 
---
 drivers/staging/iio/frequency/ad9834.c | 97 +-
 1 file changed, 80 insertions(+), 17 deletions(-)

diff --git a/drivers/staging/iio/frequency/ad9834.c 
b/drivers/staging/iio/frequency/ad9834.c
index f036f75d1f22..370e8263899e 100644
--- a/drivers/staging/iio/frequency/ad9834.c
+++ b/drivers/staging/iio/frequency/ad9834.c
@@ -29,8 +29,7 @@
 /* Registers */
 
 #define AD9834_REG_CMD 0
-#define AD9834_REG_FREQ0   BIT(14)
-#define AD9834_REG_FREQ1   BIT(15)
+#define AD9834_REG_FREQ(chann) (BIT(14) << (chann))
 #define AD9834_REG_PHASE0  (BIT(15) | BIT(14))
 #define AD9834_REG_PHASE1  (BIT(15) | BIT(14) | BIT(13))
 
@@ -81,6 +80,9 @@ struct ad9834_state {
struct spi_message  freq_msg;
struct mutexlock;   /* protect sensor state */
 
+   unsigned long   frequency0;
+   unsigned long   frequency1;
+
/*
 * DMA (thus cache coherency maintenance) requires the
 * transfer buffers to live in their own cache lines.
@@ -100,6 +102,25 @@ enum ad9834_supported_device_ids {
ID_AD9838,
 };
 
+#define AD9833_CHANNEL(_chan) {
\
+   .type = IIO_ALTVOLTAGE, \
+   .indexed = 1,   \
+   .output = 1,\
+   .address = (_chan), \
+   .channel = (_chan), \
+   .info_mask_separate = BIT(IIO_CHAN_INFO_FREQUENCY)  \
+}
+
+static const struct iio_chan_spec ad9833_channels[] = {
+   AD9833_CHANNEL(0),
+   AD9833_CHANNEL(1),
+};
+
+static const struct iio_chan_spec ad9834_channels[] = {
+   AD9833_CHANNEL(0),
+   AD9833_CHANNEL(1),
+};
+
 static unsigned int ad9834_calc_freqreg(unsigned long mclk, unsigned long fout)
 {
unsigned long long freqreg = (u64)fout * (u64)BIT(AD9834_FREQ_BITS);
@@ -113,6 +134,7 @@ static int ad9834_write_frequency(struct ad9834_state *st,
 {
unsigned long clk_freq;
unsigned long regval;
+   int ret;
 
clk_freq = clk_get_rate(st->mclk);
 
@@ -121,13 +143,22 @@ static int ad9834_write_frequency(struct ad9834_state *st,
 
regval = ad9834_calc_freqreg(clk_freq, fout);
 
-   st->freq_data[0] = cpu_to_be16(addr | (regval &
+   st->freq_data[0] = cpu_to_be16(AD9834_REG_FREQ(addr) | (regval &
   RES_MASK(AD9834_FREQ_BITS / 2)));
-   st->freq_data[1] = cpu_to_be16(addr | ((regval >>
+   st->freq_data[1] = cpu_to_be16(AD9834_REG_FREQ(addr) | ((regval >>
   (AD9834_FREQ_BITS / 2)) &
   RES_MASK(AD9834_FREQ_BITS / 2)));
 
-   return spi_sync(st->spi, &st->freq_msg);
+   ret = spi_sync(st->spi, &st->freq_msg);
+   if (ret)
+   return ret;
+
+   if (addr == 0)
+   st->frequency0 = fout;
+   else
+   st->frequency1 = fout;
+
+   return 0;
 }
 
 static int ad9834_write_phase(struct ad9834_state *st,
@@ -140,6 +171,40 @@ static int ad9834_write_phase(struct ad9834_state *st,
return spi_sync(st->spi, &st->msg);
 }
 
+static int ad9834_read_raw(struct iio_dev *indio_dev,
+  struct iio_chan_spec const *chan,
+  int *val, int *val2, long mask)
+{
+   struct ad9834_state *st = iio_priv(indio_dev);
+
+   switch (mask) {
+   case IIO_CHAN_INFO_FREQUENCY:
+   if (chan->address == 0)
+   *val = st->frequency0;
+   else
+   *val = st->frequency1;
+   return IIO_VAL_INT;
+   }
+
+   return -EINVAL;
+}
+
+static int ad9834_write_raw(struct iio_dev *indio_dev,
+   struct iio_chan_spec const *chan,
+   int val, int val2, long mask)
+{
+   struct ad9834_state *st = iio_priv(indio_dev);
+
+   switch (mask) {
+   case IIO_CHAN_INFO_FREQUENCY:
+   return ad9834_write_frequency(st, chan->address, val);
+   default:
+   return  -EINVAL;
+   }
+
+   return 0;
+}
+
 static ssize_t ad9834_write(struct device *dev,
struct device_attribute *attr,
const char *buf,
@@ -157,10 +222,6 @@ static ssize_t ad9834_write(struct device *dev,
 
mutex_lock(&st->lock);
switch ((u32)this_attr->address) {
-   case AD9834_REG_FREQ0:
-   case AD9834_REG_FREQ1:
-   ret = ad9834_write_frequency(st, this_attr->address, val);
- 

Re: [PATCH net-next v3 12/12] net: Get rid of SWITCHDEV_ATTR_ID_PORT_PARENT_ID

2019-02-06 Thread Jiri Pirko
Wed, Feb 06, 2019 at 12:53:26AM CET, f.faine...@gmail.com wrote:
>Now that we have a dedicated NDO for getting a port's parent ID, get rid
>of SWITCHDEV_ATTR_ID_PORT_PARENT_ID and convert all callers to use the
>NDO exclusively. This is a preliminary change to getting rid of
>switchdev_ops eventually.
>
>Signed-off-by: Florian Fainelli 

[...]


>@@ -24,19 +23,12 @@ static int br_switchdev_mark_get(struct net_bridge *br, 
>struct net_device *dev)
> 
> int nbp_switchdev_mark_set(struct net_bridge_port *p)
> {
>-  const struct net_device_ops *ops = p->dev->netdev_ops;
>-  struct switchdev_attr attr = {
>-  .orig_dev = p->dev,
>-  .id = SWITCHDEV_ATTR_ID_PORT_PARENT_ID,
>-  };
>-  int err;
>+  struct netdev_phys_item_id ppid = { };
>+  int err = -EOPNOTSUPP;

Pointless init.


> 
>   ASSERT_RTNL();
> 
>-  if (ops->ndo_get_port_parent_id)
>-  err = dev_get_port_parent_id(p->dev, &attr.u.ppid, true);
>-  else
>-  err = switchdev_port_attr_get(p->dev, &attr);
>+  err = dev_get_port_parent_id(p->dev, &ppid, true);
>   if (err) {
>   if (err == -EOPNOTSUPP)
>   return 0;

[...]


>@@ -1146,26 +1145,17 @@ static int rtnl_phys_port_name_fill(struct sk_buff 
>*skb, struct net_device *dev)
> 
> static int rtnl_phys_switch_id_fill(struct sk_buff *skb, struct net_device 
> *dev)
> {
>-  const struct net_device_ops *ops = dev->netdev_ops;
>-  int err;
>-  struct switchdev_attr attr = {
>-  .orig_dev = dev,
>-  .id = SWITCHDEV_ATTR_ID_PORT_PARENT_ID,
>-  .flags = SWITCHDEV_F_NO_RECURSE,
>-  };
>+  struct netdev_phys_item_id ppid = { };
>+  int err = -EOPNOTSUPP;

Pointless init.


> 
>-  if (ops->ndo_get_port_parent_id)
>-  err = dev_get_port_parent_id(dev, &attr.u.ppid, false);
>-  else
>-  err = switchdev_port_attr_get(dev, &attr);
>+  err = dev_get_port_parent_id(dev, &ppid, false);
>   if (err) {
>   if (err == -EOPNOTSUPP)
>   return 0;
>   return err;
>   }
> 
>-  if (nla_put(skb, IFLA_PHYS_SWITCH_ID, attr.u.ppid.id_len,
>-  attr.u.ppid.id))
>+  if (nla_put(skb, IFLA_PHYS_SWITCH_ID, ppid.id_len, ppid.id))
>   return -EMSGSIZE;
> 
>   return 0;

[...]


>@@ -920,15 +917,10 @@ static int vif_add(struct net *net, struct mr_table *mrt,
>   vifc->vifc_flags | (!mrtsock ? VIFF_STATIC : 0),
>   (VIFF_TUNNEL | VIFF_REGISTER));
> 
>-  attr.orig_dev = dev;
>   ops = dev->netdev_ops;
>-  if (ops->ndo_get_port_parent_id &&
>-  !dev_get_port_parent_id(dev, &attr.u.ppid, true)) {
>-  memcpy(v->dev_parent_id.id, attr.u.ppid.id, attr.u.ppid.id_len);
>-  v->dev_parent_id.id_len = attr.u.ppid.id_len;
>-  } else if (!switchdev_port_attr_get(dev, &attr)) {
>-  memcpy(v->dev_parent_id.id, attr.u.ppid.id, attr.u.ppid.id_len);
>-  v->dev_parent_id.id_len = attr.u.ppid.id_len;
>+  if (!dev_get_port_parent_id(dev, &ppid, true)) {

Please split this to:
err = dev_get_port_parent_id(dev, &ppid, true);
if (err) {


>+  memcpy(v->dev_parent_id.id, ppid.id, ppid.id_len);
>+  v->dev_parent_id.id_len = ppid.id_len;
>   } else {
>   v->dev_parent_id.id_len = 0;
>   }

[...]

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 2/2] staging: iio: frequency: ad9834: Move phase and scale to standard iio attribute

2019-02-06 Thread Beniamin Bia
The custom phase and scale attributes were moved to standard iio types.

Signed-off-by: Beniamin Bia 
---
 drivers/staging/iio/frequency/ad9834.c | 54 +++---
 1 file changed, 32 insertions(+), 22 deletions(-)

diff --git a/drivers/staging/iio/frequency/ad9834.c 
b/drivers/staging/iio/frequency/ad9834.c
index 370e8263899e..3ecf976ddefe 100644
--- a/drivers/staging/iio/frequency/ad9834.c
+++ b/drivers/staging/iio/frequency/ad9834.c
@@ -30,8 +30,7 @@
 
 #define AD9834_REG_CMD 0
 #define AD9834_REG_FREQ(chann) (BIT(14) << (chann))
-#define AD9834_REG_PHASE0  (BIT(15) | BIT(14))
-#define AD9834_REG_PHASE1  (BIT(15) | BIT(14) | BIT(13))
+#define AD9834_REG_PHASE(chann)(BIT(15) | BIT(14) | ((chann) << 13UL))
 
 /* Command Control Bits */
 
@@ -82,6 +81,8 @@ struct ad9834_state {
 
unsigned long   frequency0;
unsigned long   frequency1;
+   unsigned long   phase0;
+   unsigned long   phase1;
 
/*
 * DMA (thus cache coherency maintenance) requires the
@@ -109,6 +110,8 @@ enum ad9834_supported_device_ids {
.address = (_chan), \
.channel = (_chan), \
.info_mask_separate = BIT(IIO_CHAN_INFO_FREQUENCY)  \
+   | BIT(IIO_CHAN_INFO_PHASE),\
+   .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE),   \
 }
 
 static const struct iio_chan_spec ad9833_channels[] = {
@@ -164,11 +167,22 @@ static int ad9834_write_frequency(struct ad9834_state *st,
 static int ad9834_write_phase(struct ad9834_state *st,
  unsigned long addr, unsigned long phase)
 {
+   int ret;
+
if (phase > BIT(AD9834_PHASE_BITS))
return -EINVAL;
-   st->data = cpu_to_be16(addr | phase);
+   st->data = cpu_to_be16(AD9834_REG_PHASE(addr) | phase);
+
+   ret = spi_sync(st->spi, &st->msg);
+   if (ret)
+   return ret;
 
-   return spi_sync(st->spi, &st->msg);
+   if (addr == 0)
+   st->phase0 = phase;
+   else
+   st->phase1 = phase;
+
+   return 0;
 }
 
 static int ad9834_read_raw(struct iio_dev *indio_dev,
@@ -184,6 +198,16 @@ static int ad9834_read_raw(struct iio_dev *indio_dev,
else
*val = st->frequency1;
return IIO_VAL_INT;
+   case IIO_CHAN_INFO_PHASE:
+   if (chan->address == 0)
+   *val = st->phase0;
+   else
+   *val = st->phase1;
+   return IIO_VAL_INT;
+   case IIO_CHAN_INFO_SCALE:
+   /*1 hz */
+   *val = 1;
+   return IIO_VAL_INT;
}
 
return -EINVAL;
@@ -198,6 +222,8 @@ static int ad9834_write_raw(struct iio_dev *indio_dev,
switch (mask) {
case IIO_CHAN_INFO_FREQUENCY:
return ad9834_write_frequency(st, chan->address, val);
+   case IIO_CHAN_INFO_PHASE:
+   return ad9834_write_phase(st, chan->address, val);
default:
return  -EINVAL;
}
@@ -222,10 +248,6 @@ static ssize_t ad9834_write(struct device *dev,
 
mutex_lock(&st->lock);
switch ((u32)this_attr->address) {
-   case AD9834_REG_PHASE0:
-   case AD9834_REG_PHASE1:
-   ret = ad9834_write_phase(st, this_attr->address, val);
-   break;
case AD9834_OPBITEN:
if (st->control & AD9834_MODE) {
ret = -EINVAL;  /* AD9843 reserved mode */
@@ -385,12 +407,8 @@ static 
IIO_DEVICE_ATTR(out_altvoltage0_out1_wavetype_available, 0444,
  */
 
 static IIO_DEV_ATTR_FREQSYMBOL(0, 0200, NULL, ad9834_write, AD9834_FSEL);
-static IIO_CONST_ATTR_FREQ_SCALE(0, "1"); /* 1Hz */
 
-static IIO_DEV_ATTR_PHASE(0, 0, 0200, NULL, ad9834_write, AD9834_REG_PHASE0);
-static IIO_DEV_ATTR_PHASE(0, 1, 0200, NULL, ad9834_write, AD9834_REG_PHASE1);
 static IIO_DEV_ATTR_PHASESYMBOL(0, 0200, NULL, ad9834_write, AD9834_PSEL);
-static IIO_CONST_ATTR_PHASE_SCALE(0, "0.0015339808"); /* 2PI/2^12 rad*/
 
 static IIO_DEV_ATTR_PINCONTROL_EN(0, 0200, NULL,
ad9834_write, AD9834_PIN_SW);
@@ -401,10 +419,6 @@ static IIO_DEV_ATTR_OUT_WAVETYPE(0, 0, 
ad9834_store_wavetype, 0);
 static IIO_DEV_ATTR_OUT_WAVETYPE(0, 1, ad9834_store_wavetype, 1);
 
 static struct attribute *ad9834_attributes[] = {
-   &iio_const_attr_out_altvoltage0_frequency_scale.dev_attr.attr,
-   &iio_dev_attr_out_altvoltage0_phase0.dev_attr.attr,
-   &iio_dev_attr_out_altvoltage0_phase1.dev_attr.attr,
-   &iio_const_attr_out_altvoltage0_phase_scale.dev_attr.attr,
&iio_dev_attr_out_altvoltage0_pincontrol_en.dev_attr.attr,
&iio_dev_attr_out_altvoltage0_frequencysymbol.dev_attr.attr,
&iio_dev_attr_out_altvoltage0_phasesymbol.dev_attr.attr,
@

Re: [PATCH net-next v3 11/12] net: dsa: Implement ndo_get_port_parent_id()

2019-02-06 Thread Jiri Pirko
Wed, Feb 06, 2019 at 12:53:25AM CET, f.faine...@gmail.com wrote:
>DSA implements SWITCHDEV_ATTR_ID_PORT_PARENT_ID and we want to get rid
>of switchdev_ops eventually, ease that migration by implementing a
>ndo_get_port_parent_id() function which returns what
>switchdev_port_attr_get() would do.
>
>Signed-off-by: Florian Fainelli 

Acked-by: Jiri Pirko 
___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


Re: [PATCH net-next v3 09/12] netdevsim: Implement ndo_get_port_parent_id()

2019-02-06 Thread Jiri Pirko
Wed, Feb 06, 2019 at 12:53:23AM CET, f.faine...@gmail.com wrote:
>netdevsim only supports SWITCHDEV_ATTR_ID_PORT_PARENT_ID, which makes it a
>great candidate to be converted to use the ndo_get_port_parent_id() NDO
>instead of implementing switchdev_port_attr_get().
>
>Signed-off-by: Florian Fainelli 

Acked-by: Jiri Pirko 
___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


Re: [PATCH net-next v3 08/12] rocker: Implement ndo_get_port_parent_id()

2019-02-06 Thread Jiri Pirko
Wed, Feb 06, 2019 at 12:53:22AM CET, f.faine...@gmail.com wrote:
>mlxsw implements SWITCHDEV_ATTR_ID_PORT_PARENT_ID and we want to get rid
>of switchdev_ops eventually, ease that migration by implementing a
>ndo_get_port_parent_id() function which returns what
>switchdev_port_attr_get() would do.
>
>Signed-off-by: Florian Fainelli 

Acked-by: Jiri Pirko 
___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


Re: [PATCH net-next v3 07/12] nfp: Implement ndo_get_port_parent_id()

2019-02-06 Thread Jiri Pirko
Wed, Feb 06, 2019 at 12:53:21AM CET, f.faine...@gmail.com wrote:
>NFP only supports SWITCHDEV_ATTR_ID_PORT_PARENT_ID, which makes it a
>great candidate to be converted to use the ndo_get_port_parent_id() NDO
>instead of implementing switchdev_port_attr_get().
>
>Since NFP uses switchdev_port_same_parent_id() convert it to use
>netdev_port_same_parent_id().
>
>Signed-off-by: Florian Fainelli 

[...]

>@@ -31,34 +31,23 @@ struct nfp_port *nfp_port_from_netdev(struct net_device 
>*netdev)
>   return NULL;
> }
> 
>-static int
>-nfp_port_attr_get(struct net_device *netdev, struct switchdev_attr *attr)
>+int nfp_port_get_port_parent_id(struct net_device *netdev,
>+  struct netdev_phys_item_id *ppid)
> {
>   struct nfp_port *port;
>+  const u8 *serial;
> 
>   port = nfp_port_from_netdev(netdev);
>   if (!port)
>   return -EOPNOTSUPP;
> 
>-  switch (attr->id) {
>-  case SWITCHDEV_ATTR_ID_PORT_PARENT_ID: {
>-  const u8 *serial;
>-  /* N.B: attr->u.ppid.id is binary data */
>-  attr->u.ppid.id_len = nfp_cpp_serial(port->app->cpp, &serial);
>-  memcpy(&attr->u.ppid.id, serial, attr->u.ppid.id_len);
>-  break;
>-  }
>-  default:
>-  return -EOPNOTSUPP;
>-  }
>+  /* N.B: attr->u.ppid.id is binary data */

Comment is not updated. But I wonder if we really need it...

Otherwise this looks fine.
Acked-by: Jiri Pirko 


>+  ppid->id_len = nfp_cpp_serial(port->app->cpp, &serial);
>+  memcpy(&ppid->id, serial, ppid->id_len);
> 
>   return 0;
> }
> 
>-const struct switchdev_ops nfp_port_switchdev_ops = {
>-  .switchdev_port_attr_get= nfp_port_attr_get,
>-};
>-
> int nfp_port_setup_tc(struct net_device *netdev, enum tc_setup_type type,
> void *type_data)
> {

[...]
___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


Re: [PATCH net-next v3 06/12] mscc: ocelot: Implement ndo_get_port_parent_id()

2019-02-06 Thread Jiri Pirko
Wed, Feb 06, 2019 at 12:53:20AM CET, f.faine...@gmail.com wrote:
>Ocelot only supports SWITCHDEV_ATTR_ID_PORT_PARENT_ID as a valid
>switchdev attribute getter, convert it to use ndo_get_port_parent_id()
>and get rid of the switchdev_ops::switchdev_port_attr_get altogether.
>
>Signed-off-by: Florian Fainelli 

Acked-by: Jiri Pirko 
___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


Re: [PATCH net-next v3 05/12] mlxsw: Implement ndo_get_port_parent_id()

2019-02-06 Thread Jiri Pirko
Wed, Feb 06, 2019 at 12:53:19AM CET, f.faine...@gmail.com wrote:
>mlxsw implements SWITCHDEV_ATTR_ID_PORT_PARENT_ID and we want to get rid
>of switchdev_ops eventually, ease that migration by implementing a
>ndo_get_port_parent_id() function which returns what
>switchdev_port_attr_get() would do.
>
>Signed-off-by: Florian Fainelli 

[...]

>diff --git a/drivers/net/ethernet/mellanox/mlxsw/switchx2.c 
>b/drivers/net/ethernet/mellanox/mlxsw/switchx2.c
>index 2d4f213e154d..3814ba8af517 100644
>--- a/drivers/net/ethernet/mellanox/mlxsw/switchx2.c
>+++ b/drivers/net/ethernet/mellanox/mlxsw/switchx2.c

Please remove net/switchdev.h inclusion from this file, you don't need
it any longer.

Otherwise, looks fine.
Acked-by: Jiri Pirko 

[...]
___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


Re: [PATCH net-next v3 04/12] net/mlx5e: Implement ndo_get_port_parent_id()

2019-02-06 Thread Jiri Pirko
Wed, Feb 06, 2019 at 12:53:18AM CET, f.faine...@gmail.com wrote:
>mlx5e only supports SWITCHDEV_ATTR_ID_PORT_PARENT_ID, which makes it a
>great candidate to be converted to use the ndo_get_port_parent_id() NDO
>instead of implementing switchdev_port_attr_get().
>
>Since mlx5e makes use of switchdev_port_parent_id() convert it to use
>netdev_port_same_parent_id().
>
>Signed-off-by: Florian Fainelli 

Acked-by: Jiri Pirko 
___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


Re: [PATCH net-next v3 03/12] liquidio: Implement ndo_get_port_parent_id()

2019-02-06 Thread Jiri Pirko
Wed, Feb 06, 2019 at 12:53:17AM CET, f.faine...@gmail.com wrote:
>Liquidio only supports SWITCHDEV_ATTR_ID_PORT_PARENT_ID, which makes it
>a great candidate to be converted to use the ndo_get_port_parent_id()
>NDO instead of implementing switchdev_port_attr_get().
>
>Signed-off-by: Florian Fainelli 

Acked-by: Jiri Pirko 
___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


Re: [PATCH net-next v3 02/12] bnxt: Implement ndo_get_port_parent_id()

2019-02-06 Thread Jiri Pirko
Wed, Feb 06, 2019 at 12:53:16AM CET, f.faine...@gmail.com wrote:
>BNXT only supports SWITCHDEV_ATTR_ID_PORT_PARENT_ID, which makes it a
>great candidate to be converted to use the ndo_get_port_parent_id() NDO
>instead of implementing switchdev_port_attr_get(). The conversion is
>straight forward here since the PF and VF code use the same getter.
>
>Since bnxt makes uses of switchdev_port_same_parent_id() convert it to
>use netdev_port_same_parent_id().
>
>Signed-off-by: Florian Fainelli 

[...]

>diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_tc.c 
>b/drivers/net/ethernet/broadcom/bnxt/bnxt_tc.c
>index c683b5e96b1d..170d2fbbb91b 100644
>--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_tc.c
>+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_tc.c
>@@ -12,6 +12,7 @@
> #include 
> #include 
> #include 
>+#include 

You don't need this. Looks like a leftover.

Otherwise, looks fine.
Acked-by: Jiri Pirko 


> #include 
> #include 
> #include 

[...]
___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


Re: [PATCH net-next v3 01/12] net: Introduce ndo_get_port_parent_id()

2019-02-06 Thread Jiri Pirko
Wed, Feb 06, 2019 at 12:53:15AM CET, f.faine...@gmail.com wrote:
>In preparation for getting rid of switchdev_ops, create a dedicated NDO
>operation for getting the port's parent identifier. There are
>essentially two classes of drivers that need to implement getting the
>port's parent ID which are VF/PF drivers with a built-in switch, and
>pure switchdev drivers such as mlxsw, ocelot, dsa etc.
>
>We introduce a helper function: dev_get_port_parent_id() which supports
>recursing into the lower devices to obtain the first port's parent ID.
>
>Convert the bridge, core and ipv4 multicast routing code to check for
>such ndo_get_port_parent_id() and call the helper functino when valid

s/functino/function/


>before falling back to switchdev_port_attr_get(). This will allow us to
>convert all relevant drivers in one go instead of having to implement
>both switchdev_port_attr_get() and ndo_get_port_parent_id() operations,
>then get rid of switchdev_port_attr_get().

[...]


>@@ -3651,6 +3657,9 @@ int dev_get_phys_port_id(struct net_device *dev,
>struct netdev_phys_item_id *ppid);
> int dev_get_phys_port_name(struct net_device *dev,
>  char *name, size_t len);
>+int dev_get_port_parent_id(struct net_device *dev,
>+ struct netdev_phys_item_id *ppid, bool recurse);
>+bool netdev_port_same_parent_id(struct net_device *a, struct net_device *b);

One is "dev_" and the second is "netdev_". I see there is this
disconnect all over the code, but I wonder if we should not be
consistent for new things. But I don't insist. I see why both are named
differently (netdev_phys_item_id_same())

Acked-by: Jiri Pirko 
___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH 2/2] staging: iio: frequency: ad9834: Move phase and scale to standard iio attribute

2019-02-06 Thread Beniamin Bia
From: Beniamin Bia 

The custom phase and scale attributes were moved to standard iio types.

Signed-off-by: Beniamin Bia 
---
 drivers/staging/iio/frequency/ad9834.c | 54 +++---
 1 file changed, 32 insertions(+), 22 deletions(-)

diff --git a/drivers/staging/iio/frequency/ad9834.c 
b/drivers/staging/iio/frequency/ad9834.c
index 370e8263899e..3ecf976ddefe 100644
--- a/drivers/staging/iio/frequency/ad9834.c
+++ b/drivers/staging/iio/frequency/ad9834.c
@@ -30,8 +30,7 @@
 
 #define AD9834_REG_CMD 0
 #define AD9834_REG_FREQ(chann) (BIT(14) << (chann))
-#define AD9834_REG_PHASE0  (BIT(15) | BIT(14))
-#define AD9834_REG_PHASE1  (BIT(15) | BIT(14) | BIT(13))
+#define AD9834_REG_PHASE(chann)(BIT(15) | BIT(14) | ((chann) << 13UL))
 
 /* Command Control Bits */
 
@@ -82,6 +81,8 @@ struct ad9834_state {
 
unsigned long   frequency0;
unsigned long   frequency1;
+   unsigned long   phase0;
+   unsigned long   phase1;
 
/*
 * DMA (thus cache coherency maintenance) requires the
@@ -109,6 +110,8 @@ enum ad9834_supported_device_ids {
.address = (_chan), \
.channel = (_chan), \
.info_mask_separate = BIT(IIO_CHAN_INFO_FREQUENCY)  \
+   | BIT(IIO_CHAN_INFO_PHASE),\
+   .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE),   \
 }
 
 static const struct iio_chan_spec ad9833_channels[] = {
@@ -164,11 +167,22 @@ static int ad9834_write_frequency(struct ad9834_state *st,
 static int ad9834_write_phase(struct ad9834_state *st,
  unsigned long addr, unsigned long phase)
 {
+   int ret;
+
if (phase > BIT(AD9834_PHASE_BITS))
return -EINVAL;
-   st->data = cpu_to_be16(addr | phase);
+   st->data = cpu_to_be16(AD9834_REG_PHASE(addr) | phase);
+
+   ret = spi_sync(st->spi, &st->msg);
+   if (ret)
+   return ret;
 
-   return spi_sync(st->spi, &st->msg);
+   if (addr == 0)
+   st->phase0 = phase;
+   else
+   st->phase1 = phase;
+
+   return 0;
 }
 
 static int ad9834_read_raw(struct iio_dev *indio_dev,
@@ -184,6 +198,16 @@ static int ad9834_read_raw(struct iio_dev *indio_dev,
else
*val = st->frequency1;
return IIO_VAL_INT;
+   case IIO_CHAN_INFO_PHASE:
+   if (chan->address == 0)
+   *val = st->phase0;
+   else
+   *val = st->phase1;
+   return IIO_VAL_INT;
+   case IIO_CHAN_INFO_SCALE:
+   /*1 hz */
+   *val = 1;
+   return IIO_VAL_INT;
}
 
return -EINVAL;
@@ -198,6 +222,8 @@ static int ad9834_write_raw(struct iio_dev *indio_dev,
switch (mask) {
case IIO_CHAN_INFO_FREQUENCY:
return ad9834_write_frequency(st, chan->address, val);
+   case IIO_CHAN_INFO_PHASE:
+   return ad9834_write_phase(st, chan->address, val);
default:
return  -EINVAL;
}
@@ -222,10 +248,6 @@ static ssize_t ad9834_write(struct device *dev,
 
mutex_lock(&st->lock);
switch ((u32)this_attr->address) {
-   case AD9834_REG_PHASE0:
-   case AD9834_REG_PHASE1:
-   ret = ad9834_write_phase(st, this_attr->address, val);
-   break;
case AD9834_OPBITEN:
if (st->control & AD9834_MODE) {
ret = -EINVAL;  /* AD9843 reserved mode */
@@ -385,12 +407,8 @@ static 
IIO_DEVICE_ATTR(out_altvoltage0_out1_wavetype_available, 0444,
  */
 
 static IIO_DEV_ATTR_FREQSYMBOL(0, 0200, NULL, ad9834_write, AD9834_FSEL);
-static IIO_CONST_ATTR_FREQ_SCALE(0, "1"); /* 1Hz */
 
-static IIO_DEV_ATTR_PHASE(0, 0, 0200, NULL, ad9834_write, AD9834_REG_PHASE0);
-static IIO_DEV_ATTR_PHASE(0, 1, 0200, NULL, ad9834_write, AD9834_REG_PHASE1);
 static IIO_DEV_ATTR_PHASESYMBOL(0, 0200, NULL, ad9834_write, AD9834_PSEL);
-static IIO_CONST_ATTR_PHASE_SCALE(0, "0.0015339808"); /* 2PI/2^12 rad*/
 
 static IIO_DEV_ATTR_PINCONTROL_EN(0, 0200, NULL,
ad9834_write, AD9834_PIN_SW);
@@ -401,10 +419,6 @@ static IIO_DEV_ATTR_OUT_WAVETYPE(0, 0, 
ad9834_store_wavetype, 0);
 static IIO_DEV_ATTR_OUT_WAVETYPE(0, 1, ad9834_store_wavetype, 1);
 
 static struct attribute *ad9834_attributes[] = {
-   &iio_const_attr_out_altvoltage0_frequency_scale.dev_attr.attr,
-   &iio_dev_attr_out_altvoltage0_phase0.dev_attr.attr,
-   &iio_dev_attr_out_altvoltage0_phase1.dev_attr.attr,
-   &iio_const_attr_out_altvoltage0_phase_scale.dev_attr.attr,
&iio_dev_attr_out_altvoltage0_pincontrol_en.dev_attr.attr,
&iio_dev_attr_out_altvoltage0_frequencysymbol.dev_attr.attr,
&iio_dev_attr_out_altvoltage0_phasesy

[PATCH 1/2] staging: iio: frequency: ad9834: Move frequency to standard iio types

2019-02-06 Thread Beniamin Bia
From: Beniamin Bia 

Frequency attribute is added with a standard type from iio framework
instead of custom attribute. This is a small step towards removing any
unnecessary custom attribute.

Signed-off-by: Beniamin Bia 
---
 drivers/staging/iio/frequency/ad9834.c | 97 +-
 1 file changed, 80 insertions(+), 17 deletions(-)

diff --git a/drivers/staging/iio/frequency/ad9834.c 
b/drivers/staging/iio/frequency/ad9834.c
index f036f75d1f22..370e8263899e 100644
--- a/drivers/staging/iio/frequency/ad9834.c
+++ b/drivers/staging/iio/frequency/ad9834.c
@@ -29,8 +29,7 @@
 /* Registers */
 
 #define AD9834_REG_CMD 0
-#define AD9834_REG_FREQ0   BIT(14)
-#define AD9834_REG_FREQ1   BIT(15)
+#define AD9834_REG_FREQ(chann) (BIT(14) << (chann))
 #define AD9834_REG_PHASE0  (BIT(15) | BIT(14))
 #define AD9834_REG_PHASE1  (BIT(15) | BIT(14) | BIT(13))
 
@@ -81,6 +80,9 @@ struct ad9834_state {
struct spi_message  freq_msg;
struct mutexlock;   /* protect sensor state */
 
+   unsigned long   frequency0;
+   unsigned long   frequency1;
+
/*
 * DMA (thus cache coherency maintenance) requires the
 * transfer buffers to live in their own cache lines.
@@ -100,6 +102,25 @@ enum ad9834_supported_device_ids {
ID_AD9838,
 };
 
+#define AD9833_CHANNEL(_chan) {
\
+   .type = IIO_ALTVOLTAGE, \
+   .indexed = 1,   \
+   .output = 1,\
+   .address = (_chan), \
+   .channel = (_chan), \
+   .info_mask_separate = BIT(IIO_CHAN_INFO_FREQUENCY)  \
+}
+
+static const struct iio_chan_spec ad9833_channels[] = {
+   AD9833_CHANNEL(0),
+   AD9833_CHANNEL(1),
+};
+
+static const struct iio_chan_spec ad9834_channels[] = {
+   AD9833_CHANNEL(0),
+   AD9833_CHANNEL(1),
+};
+
 static unsigned int ad9834_calc_freqreg(unsigned long mclk, unsigned long fout)
 {
unsigned long long freqreg = (u64)fout * (u64)BIT(AD9834_FREQ_BITS);
@@ -113,6 +134,7 @@ static int ad9834_write_frequency(struct ad9834_state *st,
 {
unsigned long clk_freq;
unsigned long regval;
+   int ret;
 
clk_freq = clk_get_rate(st->mclk);
 
@@ -121,13 +143,22 @@ static int ad9834_write_frequency(struct ad9834_state *st,
 
regval = ad9834_calc_freqreg(clk_freq, fout);
 
-   st->freq_data[0] = cpu_to_be16(addr | (regval &
+   st->freq_data[0] = cpu_to_be16(AD9834_REG_FREQ(addr) | (regval &
   RES_MASK(AD9834_FREQ_BITS / 2)));
-   st->freq_data[1] = cpu_to_be16(addr | ((regval >>
+   st->freq_data[1] = cpu_to_be16(AD9834_REG_FREQ(addr) | ((regval >>
   (AD9834_FREQ_BITS / 2)) &
   RES_MASK(AD9834_FREQ_BITS / 2)));
 
-   return spi_sync(st->spi, &st->freq_msg);
+   ret = spi_sync(st->spi, &st->freq_msg);
+   if (ret)
+   return ret;
+
+   if (addr == 0)
+   st->frequency0 = fout;
+   else
+   st->frequency1 = fout;
+
+   return 0;
 }
 
 static int ad9834_write_phase(struct ad9834_state *st,
@@ -140,6 +171,40 @@ static int ad9834_write_phase(struct ad9834_state *st,
return spi_sync(st->spi, &st->msg);
 }
 
+static int ad9834_read_raw(struct iio_dev *indio_dev,
+  struct iio_chan_spec const *chan,
+  int *val, int *val2, long mask)
+{
+   struct ad9834_state *st = iio_priv(indio_dev);
+
+   switch (mask) {
+   case IIO_CHAN_INFO_FREQUENCY:
+   if (chan->address == 0)
+   *val = st->frequency0;
+   else
+   *val = st->frequency1;
+   return IIO_VAL_INT;
+   }
+
+   return -EINVAL;
+}
+
+static int ad9834_write_raw(struct iio_dev *indio_dev,
+   struct iio_chan_spec const *chan,
+   int val, int val2, long mask)
+{
+   struct ad9834_state *st = iio_priv(indio_dev);
+
+   switch (mask) {
+   case IIO_CHAN_INFO_FREQUENCY:
+   return ad9834_write_frequency(st, chan->address, val);
+   default:
+   return  -EINVAL;
+   }
+
+   return 0;
+}
+
 static ssize_t ad9834_write(struct device *dev,
struct device_attribute *attr,
const char *buf,
@@ -157,10 +222,6 @@ static ssize_t ad9834_write(struct device *dev,
 
mutex_lock(&st->lock);
switch ((u32)this_attr->address) {
-   case AD9834_REG_FREQ0:
-   case AD9834_REG_FREQ1:
-   ret = ad9834_write_frequency(st, this_attr->

Re: [PATCH v13 10/13] media: imx7.rst: add documentation for i.MX7 media driver

2019-02-06 Thread Hans Verkuil
On 2/6/19 11:25 AM, Rui Miguel Silva wrote:
> Add rst document to describe the i.MX7 media driver and also a working
> example from the Warp7 board usage with a OV2680 sensor.
> 
> Signed-off-by: Rui Miguel Silva 
> Acked-by: Sakari Ailus 

Checkpatch gives me:

Applying: media: imx7.rst: add documentation for i.MX7 media driver
WARNING: added, moved or deleted file(s), does MAINTAINERS need updating?
#2:
new file mode 100644

WARNING: Missing or malformed SPDX-License-Identifier tag in line 1
#7: FILE: Documentation/media/v4l-drivers/imx7.rst:1:
+i.MX7 Video Capture Driver

total: 0 errors, 2 warnings, 164 lines checked

Both warnings are valid, so can you make a v13.1 for this patch only?
Just include the MAINTAINERS change in this patch.

Regards,

Hans

> ---
>  Documentation/media/v4l-drivers/imx7.rst  | 157 ++
>  Documentation/media/v4l-drivers/index.rst |   1 +
>  2 files changed, 158 insertions(+)
>  create mode 100644 Documentation/media/v4l-drivers/imx7.rst
> 
> diff --git a/Documentation/media/v4l-drivers/imx7.rst 
> b/Documentation/media/v4l-drivers/imx7.rst
> new file mode 100644
> index ..cd1195d391c5
> --- /dev/null
> +++ b/Documentation/media/v4l-drivers/imx7.rst
> @@ -0,0 +1,157 @@
> +i.MX7 Video Capture Driver
> +==
> +
> +Introduction
> +
> +
> +The i.MX7 contrary to the i.MX5/6 family does not contain an Image Processing
> +Unit (IPU); because of that the capabilities to perform operations or
> +manipulation of the capture frames are less feature rich.
> +
> +For image capture the i.MX7 has three units:
> +- CMOS Sensor Interface (CSI)
> +- Video Multiplexer
> +- MIPI CSI-2 Receiver
> +
> +::
> +   |\
> +   MIPI Camera Input ---> MIPI CSI-2 --- > | \
> +   |  \
> +   | M |
> +   | U | -->  CSI ---> Capture
> +   | X |
> +   |  /
> +   Parallel Camera Input > | /
> +   |/
> +
> +For additional information, please refer to the latest versions of the i.MX7
> +reference manual [#f1]_.
> +
> +Entities
> +
> +
> +imx7-mipi-csi2
> +--
> +
> +This is the MIPI CSI-2 receiver entity. It has one sink pad to receive the 
> pixel
> +data from MIPI CSI-2 camera sensor. It has one source pad, corresponding to 
> the
> +virtual channel 0. This module is compliant to previous version of Samsung
> +D-phy, and supports two D-PHY Rx Data lanes.
> +
> +csi_mux
> +---
> +
> +This is the video multiplexer. It has two sink pads to select from either 
> camera
> +sensor with a parallel interface or from MIPI CSI-2 virtual channel 0.  It 
> has
> +a single source pad that routes to the CSI.
> +
> +csi
> +---
> +
> +The CSI enables the chip to connect directly to external CMOS image sensor. 
> CSI
> +can interface directly with Parallel and MIPI CSI-2 buses. It has 256 x 64 
> FIFO
> +to store received image pixel data and embedded DMA controllers to transfer 
> data
> +from the FIFO through AHB bus.
> +
> +This entity has one sink pad that receives from the csi_mux entity and a 
> single
> +source pad that routes video frames directly to memory buffers. This pad is
> +routed to a capture device node.
> +
> +Usage Notes
> +---
> +
> +To aid in configuration and for backward compatibility with V4L2 applications
> +that access controls only from video device nodes, the capture device 
> interfaces
> +inherit controls from the active entities in the current pipeline, so 
> controls
> +can be accessed either directly from the subdev or from the active capture
> +device interface. For example, the sensor controls are available either from 
> the
> +sensor subdevs or from the active capture device.
> +
> +Warp7 with OV2680
> +-
> +
> +On this platform an OV2680 MIPI CSI-2 module is connected to the internal 
> MIPI
> +CSI-2 receiver. The following example configures a video capture pipeline 
> with
> +an output of 800x600, and BGGR 10 bit bayer format:
> +
> +.. code-block:: none
> +   # Setup links
> +   media-ctl -l "'ov2680 1-0036':0 -> 'imx7-mipi-csis.0':0[1]"
> +   media-ctl -l "'imx7-mipi-csis.0':1 -> 'csi_mux':1[1]"
> +   media-ctl -l "'csi_mux':2 -> 'csi':0[1]"
> +   media-ctl -l "'csi':1 -> 'csi capture':0[1]"
> +
> +   # Configure pads for pipeline
> +   media-ctl -V "'ov2680 1-0036':0 [fmt:SBGGR10_1X10/800x600 field:none]"
> +   media-ctl -V "'csi_mux':1 [fmt:SBGGR10_1X10/800x600 field:none]"
> +   media-ctl -V "'csi_mux':2 [fmt:SBGGR10_1X10/800x600 field:none]"
> +   media-ctl -V "'imx7-mipi-csis.0':0 [fmt:SBGGR10_1X10/800x600 field:none]"
> +   media-ctl -V "'csi':0 [fmt:SBGGR10_1X10/800x600 field:none]"
> +
> +After this streaming can start. The v4l2-ctl tool can be used to select any 
> o

[PATCH v13 06/13] ARM: dts: imx7s: add mipi phy power domain

2019-02-06 Thread Rui Miguel Silva
Add power domain index 0 related with mipi-phy to imx7s.

While at it rename pcie power-domain node to remove pgc prefix.

Signed-off-by: Rui Miguel Silva 
---
 arch/arm/boot/dts/imx7s.dtsi | 8 +++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/arch/arm/boot/dts/imx7s.dtsi b/arch/arm/boot/dts/imx7s.dtsi
index e88f53a4c7f4..9a680d3d6424 100644
--- a/arch/arm/boot/dts/imx7s.dtsi
+++ b/arch/arm/boot/dts/imx7s.dtsi
@@ -606,7 +606,13 @@
#address-cells = <1>;
#size-cells = <0>;
 
-   pgc_pcie_phy: pgc-power-domain@1 {
+   pgc_mipi_phy: power-domain@0 {
+   #power-domain-cells = <0>;
+   reg = <0>;
+   power-supply = <®_1p0d>;
+   };
+
+   pgc_pcie_phy: power-domain@1 {
#power-domain-cells = <0>;
reg = <1>;
power-supply = <®_1p0d>;
-- 
2.20.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH v13 07/13] ARM: dts: imx7s: add multiplexer controls

2019-02-06 Thread Rui Miguel Silva
The IOMUXC General Purpose Register has bitfield to control video bus
multiplexer to control the CSI input between the MIPI-CSI2 and parallel
interface. Add that register and mask.

Signed-off-by: Rui Miguel Silva 
Reviewed-by: Philipp Zabel 
---
 arch/arm/boot/dts/imx7s.dtsi | 9 -
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/arch/arm/boot/dts/imx7s.dtsi b/arch/arm/boot/dts/imx7s.dtsi
index 9a680d3d6424..792efcd2caa1 100644
--- a/arch/arm/boot/dts/imx7s.dtsi
+++ b/arch/arm/boot/dts/imx7s.dtsi
@@ -497,8 +497,15 @@
 
gpr: iomuxc-gpr@3034 {
compatible = "fsl,imx7d-iomuxc-gpr",
-   "fsl,imx6q-iomuxc-gpr", "syscon";
+   "fsl,imx6q-iomuxc-gpr", "syscon",
+   "simple-mfd";
reg = <0x3034 0x1>;
+
+   mux: mux-controller {
+   compatible = "mmio-mux";
+   #mux-control-cells = <0>;
+   mux-reg-masks = <0x14 0x0010>;
+   };
};
 
ocotp: ocotp-ctrl@3035 {
-- 
2.20.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH v13 08/13] ARM: dts: imx7: Add video mux, csi and mipi_csi and connections

2019-02-06 Thread Rui Miguel Silva
This patch adds the device tree nodes for csi, video multiplexer and
mipi-csi besides the graph connecting the necessary endpoints to make
the media capture entities to work in imx7 Warp board.

Signed-off-by: Rui Miguel Silva 
---
 arch/arm/boot/dts/imx7s-warp.dts | 51 
 arch/arm/boot/dts/imx7s.dtsi | 27 +
 2 files changed, 78 insertions(+)

diff --git a/arch/arm/boot/dts/imx7s-warp.dts b/arch/arm/boot/dts/imx7s-warp.dts
index 23431faecaf4..358bcae7ebaf 100644
--- a/arch/arm/boot/dts/imx7s-warp.dts
+++ b/arch/arm/boot/dts/imx7s-warp.dts
@@ -277,6 +277,57 @@
status = "okay";
 };
 
+&gpr {
+   csi_mux {
+   compatible = "video-mux";
+   mux-controls = <&mux 0>;
+   #address-cells = <1>;
+   #size-cells = <0>;
+
+   port@1 {
+   reg = <1>;
+
+   csi_mux_from_mipi_vc0: endpoint {
+   remote-endpoint = <&mipi_vc0_to_csi_mux>;
+   };
+   };
+
+   port@2 {
+   reg = <2>;
+
+   csi_mux_to_csi: endpoint {
+   remote-endpoint = <&csi_from_csi_mux>;
+   };
+   };
+   };
+};
+
+&csi {
+   status = "okay";
+
+   port {
+   csi_from_csi_mux: endpoint {
+   remote-endpoint = <&csi_mux_to_csi>;
+   };
+   };
+};
+
+&mipi_csi {
+   clock-frequency = <16600>;
+   status = "okay";
+   #address-cells = <1>;
+   #size-cells = <0>;
+   fsl,csis-hs-settle = <3>;
+
+   port@1 {
+   reg = <1>;
+
+   mipi_vc0_to_csi_mux: endpoint {
+   remote-endpoint = <&csi_mux_from_mipi_vc0>;
+   };
+   };
+};
+
 &wdog1 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_wdog>;
diff --git a/arch/arm/boot/dts/imx7s.dtsi b/arch/arm/boot/dts/imx7s.dtsi
index 792efcd2caa1..01962f85cab6 100644
--- a/arch/arm/boot/dts/imx7s.dtsi
+++ b/arch/arm/boot/dts/imx7s.dtsi
@@ -8,6 +8,7 @@
 #include 
 #include 
 #include 
+#include 
 #include "imx7d-pinfunc.h"
 
 / {
@@ -709,6 +710,17 @@
status = "disabled";
};
 
+   csi: csi@3071 {
+   compatible = "fsl,imx7-csi";
+   reg = <0x3071 0x1>;
+   interrupts = ;
+   clocks = <&clks IMX7D_CLK_DUMMY>,
+   <&clks IMX7D_CSI_MCLK_ROOT_CLK>,
+   <&clks IMX7D_CLK_DUMMY>;
+   clock-names = "axi", "mclk", "dcic";
+   status = "disabled";
+   };
+
lcdif: lcdif@3073 {
compatible = "fsl,imx7d-lcdif", 
"fsl,imx28-lcdif";
reg = <0x3073 0x1>;
@@ -718,6 +730,21 @@
clock-names = "pix", "axi";
status = "disabled";
};
+
+   mipi_csi: mipi-csi@3075 {
+   compatible = "fsl,imx7-mipi-csi2";
+   reg = <0x3075 0x1>;
+   interrupts = ;
+   clocks = <&clks IMX7D_IPG_ROOT_CLK>,
+   <&clks IMX7D_MIPI_CSI_ROOT_CLK>,
+   <&clks IMX7D_MIPI_DPHY_ROOT_CLK>;
+   clock-names = "pclk", "wrap", "phy";
+   power-domains = <&pgc_mipi_phy>;
+   phy-supply = <®_1p0d>;
+   resets = <&src IMX7_RESET_MIPI_PHY_MRST>;
+   reset-names = "mrst";
+   status = "disabled";
+   };
};
 
aips3: aips-bus@3080 {
-- 
2.20.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH v13 12/13] media: video-mux: add bayer formats

2019-02-06 Thread Rui Miguel Silva
Add non vendor bayer formats to the  allowed format array.

Signed-off-by: Rui Miguel Silva 
Reviewed-by: Philipp Zabel 
Acked-by: Sakari Ailus 
---
 drivers/media/platform/video-mux.c | 20 
 1 file changed, 20 insertions(+)

diff --git a/drivers/media/platform/video-mux.c 
b/drivers/media/platform/video-mux.c
index c33900e3c23e..0ba30756e1e4 100644
--- a/drivers/media/platform/video-mux.c
+++ b/drivers/media/platform/video-mux.c
@@ -263,6 +263,26 @@ static int video_mux_set_format(struct v4l2_subdev *sd,
case MEDIA_BUS_FMT_UYYVYY16_0_5X48:
case MEDIA_BUS_FMT_JPEG_1X8:
case MEDIA_BUS_FMT_AHSV_1X32:
+   case MEDIA_BUS_FMT_SBGGR8_1X8:
+   case MEDIA_BUS_FMT_SGBRG8_1X8:
+   case MEDIA_BUS_FMT_SGRBG8_1X8:
+   case MEDIA_BUS_FMT_SRGGB8_1X8:
+   case MEDIA_BUS_FMT_SBGGR10_1X10:
+   case MEDIA_BUS_FMT_SGBRG10_1X10:
+   case MEDIA_BUS_FMT_SGRBG10_1X10:
+   case MEDIA_BUS_FMT_SRGGB10_1X10:
+   case MEDIA_BUS_FMT_SBGGR12_1X12:
+   case MEDIA_BUS_FMT_SGBRG12_1X12:
+   case MEDIA_BUS_FMT_SGRBG12_1X12:
+   case MEDIA_BUS_FMT_SRGGB12_1X12:
+   case MEDIA_BUS_FMT_SBGGR14_1X14:
+   case MEDIA_BUS_FMT_SGBRG14_1X14:
+   case MEDIA_BUS_FMT_SGRBG14_1X14:
+   case MEDIA_BUS_FMT_SRGGB14_1X14:
+   case MEDIA_BUS_FMT_SBGGR16_1X16:
+   case MEDIA_BUS_FMT_SGBRG16_1X16:
+   case MEDIA_BUS_FMT_SGRBG16_1X16:
+   case MEDIA_BUS_FMT_SRGGB16_1X16:
break;
default:
sdformat->format.code = MEDIA_BUS_FMT_Y8_1X8;
-- 
2.20.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH v13 09/13] ARM: dts: imx7s-warp: add ov2680 sensor node

2019-02-06 Thread Rui Miguel Silva
Warp7 comes with a Omnivision OV2680 sensor, add the node here to make
complete the camera data path for this system. Add the needed regulator
to the analog voltage supply, the port and endpoints in mipi_csi node
and the pinctrl for the reset gpio.

Signed-off-by: Rui Miguel Silva 
---
 arch/arm/boot/dts/imx7s-warp.dts | 44 
 1 file changed, 44 insertions(+)

diff --git a/arch/arm/boot/dts/imx7s-warp.dts b/arch/arm/boot/dts/imx7s-warp.dts
index 358bcae7ebaf..58d1a89ee3e3 100644
--- a/arch/arm/boot/dts/imx7s-warp.dts
+++ b/arch/arm/boot/dts/imx7s-warp.dts
@@ -55,6 +55,14 @@
regulator-always-on;
};
 
+   reg_peri_3p15v: regulator-peri-3p15v {
+   compatible = "regulator-fixed";
+   regulator-name = "peri_3p15v_reg";
+   regulator-min-microvolt = <315>;
+   regulator-max-microvolt = <315>;
+   regulator-always-on;
+   };
+
sound {
compatible = "simple-audio-card";
simple-audio-card,name = "imx7-sgtl5000";
@@ -178,6 +186,27 @@
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_i2c2>;
status = "okay";
+
+   ov2680: camera@36 {
+   compatible = "ovti,ov2680";
+   pinctrl-names = "default";
+   pinctrl-0 = <&pinctrl_ov2680>;
+   reg = <0x36>;
+   clocks = <&osc>;
+   clock-names = "xvclk";
+   reset-gpios = <&gpio1 3 GPIO_ACTIVE_LOW>;
+   DOVDD-supply = <&sw2_reg>;
+   DVDD-supply = <&sw2_reg>;
+   AVDD-supply = <®_peri_3p15v>;
+
+   port {
+   ov2680_to_mipi: endpoint {
+   remote-endpoint = <&mipi_from_sensor>;
+   clock-lanes = <0>;
+   data-lanes = <1>;
+   };
+   };
+   };
 };
 
 &i2c3 {
@@ -319,6 +348,15 @@
#size-cells = <0>;
fsl,csis-hs-settle = <3>;
 
+   port@0 {
+   reg = <0>;
+
+   mipi_from_sensor: endpoint {
+   remote-endpoint = <&ov2680_to_mipi>;
+   data-lanes = <1>;
+   };
+   };
+
port@1 {
reg = <1>;
 
@@ -382,6 +420,12 @@
>;
};
 
+   pinctrl_ov2680: ov2660grp {
+   fsl,pins = <
+   MX7D_PAD_LPSR_GPIO1_IO03__GPIO1_IO3 0x14
+   >;
+   };
+
pinctrl_sai1: sai1grp {
fsl,pins = <
MX7D_PAD_SAI1_RX_DATA__SAI1_RX_DATA00x1f
-- 
2.20.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH v13 11/13] media: staging/imx: add i.MX7 entries to TODO file

2019-02-06 Thread Rui Miguel Silva
Add some i.MX7 related entries to TODO file.

Signed-off-by: Rui Miguel Silva 
Acked-by: Sakari Ailus 
---
 drivers/staging/media/imx/TODO | 9 +
 1 file changed, 9 insertions(+)

diff --git a/drivers/staging/media/imx/TODO b/drivers/staging/media/imx/TODO
index aeeb15494a49..6f29b5ca5324 100644
--- a/drivers/staging/media/imx/TODO
+++ b/drivers/staging/media/imx/TODO
@@ -45,3 +45,12 @@
 
  Which means a port must not contain mixed-use endpoints, they
  must all refer to media links between V4L2 subdevices.
+
+- i.MX7: all of the above, since it uses the imx media core
+
+- i.MX7: use Frame Interval Monitor
+
+- i.MX7: runtime testing with parallel sensor, links setup and streaming
+
+- i.MX7: runtime testing with different formats, for the time only 10-bit bayer
+  is tested
-- 
2.20.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH v13 13/13] media: MAINTAINERS: add entry for Freescale i.MX7 media driver

2019-02-06 Thread Rui Miguel Silva
Add maintainer entry for the imx7 media csi, mipi csis driver,
dt-bindings and documentation.

Signed-off-by: Rui Miguel Silva 
Acked-by: Sakari Ailus 
---
 MAINTAINERS | 11 +++
 1 file changed, 11 insertions(+)

diff --git a/MAINTAINERS b/MAINTAINERS
index 3e211916d2bc..d8e0c9040736 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -9348,6 +9348,17 @@ T:   git git://linuxtv.org/media_tree.git
 S: Maintained
 F: drivers/media/platform/imx-pxp.[ch]
 
+MEDIA DRIVERS FOR FREESCALE IMX7
+M: Rui Miguel Silva 
+L: linux-me...@vger.kernel.org
+T: git git://linuxtv.org/media_tree.git
+S: Maintained
+F: Documentation/devicetree/bindings/media/imx7-csi.txt
+F: Documentation/devicetree/bindings/media/imx7-mipi-csi2.txt
+F: Documentation/media/v4l-drivers/imx7.rst
+F: drivers/staging/media/imx/imx7-media-csi.c
+F: drivers/staging/media/imx/imx7-mipi-csis.c
+
 MEDIA DRIVERS FOR HELENE
 M: Abylay Ospan 
 L: linux-me...@vger.kernel.org
-- 
2.20.1

___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel


[PATCH v13 10/13] media: imx7.rst: add documentation for i.MX7 media driver

2019-02-06 Thread Rui Miguel Silva
Add rst document to describe the i.MX7 media driver and also a working
example from the Warp7 board usage with a OV2680 sensor.

Signed-off-by: Rui Miguel Silva 
Acked-by: Sakari Ailus 
---
 Documentation/media/v4l-drivers/imx7.rst  | 157 ++
 Documentation/media/v4l-drivers/index.rst |   1 +
 2 files changed, 158 insertions(+)
 create mode 100644 Documentation/media/v4l-drivers/imx7.rst

diff --git a/Documentation/media/v4l-drivers/imx7.rst 
b/Documentation/media/v4l-drivers/imx7.rst
new file mode 100644
index ..cd1195d391c5
--- /dev/null
+++ b/Documentation/media/v4l-drivers/imx7.rst
@@ -0,0 +1,157 @@
+i.MX7 Video Capture Driver
+==
+
+Introduction
+
+
+The i.MX7 contrary to the i.MX5/6 family does not contain an Image Processing
+Unit (IPU); because of that the capabilities to perform operations or
+manipulation of the capture frames are less feature rich.
+
+For image capture the i.MX7 has three units:
+- CMOS Sensor Interface (CSI)
+- Video Multiplexer
+- MIPI CSI-2 Receiver
+
+::
+   |\
+   MIPI Camera Input ---> MIPI CSI-2 --- > | \
+   |  \
+   | M |
+   | U | -->  CSI ---> Capture
+   | X |
+   |  /
+   Parallel Camera Input > | /
+   |/
+
+For additional information, please refer to the latest versions of the i.MX7
+reference manual [#f1]_.
+
+Entities
+
+
+imx7-mipi-csi2
+--
+
+This is the MIPI CSI-2 receiver entity. It has one sink pad to receive the 
pixel
+data from MIPI CSI-2 camera sensor. It has one source pad, corresponding to the
+virtual channel 0. This module is compliant to previous version of Samsung
+D-phy, and supports two D-PHY Rx Data lanes.
+
+csi_mux
+---
+
+This is the video multiplexer. It has two sink pads to select from either 
camera
+sensor with a parallel interface or from MIPI CSI-2 virtual channel 0.  It has
+a single source pad that routes to the CSI.
+
+csi
+---
+
+The CSI enables the chip to connect directly to external CMOS image sensor. CSI
+can interface directly with Parallel and MIPI CSI-2 buses. It has 256 x 64 FIFO
+to store received image pixel data and embedded DMA controllers to transfer 
data
+from the FIFO through AHB bus.
+
+This entity has one sink pad that receives from the csi_mux entity and a single
+source pad that routes video frames directly to memory buffers. This pad is
+routed to a capture device node.
+
+Usage Notes
+---
+
+To aid in configuration and for backward compatibility with V4L2 applications
+that access controls only from video device nodes, the capture device 
interfaces
+inherit controls from the active entities in the current pipeline, so controls
+can be accessed either directly from the subdev or from the active capture
+device interface. For example, the sensor controls are available either from 
the
+sensor subdevs or from the active capture device.
+
+Warp7 with OV2680
+-
+
+On this platform an OV2680 MIPI CSI-2 module is connected to the internal MIPI
+CSI-2 receiver. The following example configures a video capture pipeline with
+an output of 800x600, and BGGR 10 bit bayer format:
+
+.. code-block:: none
+   # Setup links
+   media-ctl -l "'ov2680 1-0036':0 -> 'imx7-mipi-csis.0':0[1]"
+   media-ctl -l "'imx7-mipi-csis.0':1 -> 'csi_mux':1[1]"
+   media-ctl -l "'csi_mux':2 -> 'csi':0[1]"
+   media-ctl -l "'csi':1 -> 'csi capture':0[1]"
+
+   # Configure pads for pipeline
+   media-ctl -V "'ov2680 1-0036':0 [fmt:SBGGR10_1X10/800x600 field:none]"
+   media-ctl -V "'csi_mux':1 [fmt:SBGGR10_1X10/800x600 field:none]"
+   media-ctl -V "'csi_mux':2 [fmt:SBGGR10_1X10/800x600 field:none]"
+   media-ctl -V "'imx7-mipi-csis.0':0 [fmt:SBGGR10_1X10/800x600 field:none]"
+   media-ctl -V "'csi':0 [fmt:SBGGR10_1X10/800x600 field:none]"
+
+After this streaming can start. The v4l2-ctl tool can be used to select any of
+the resolutions supported by the sensor.
+
+.. code-block:: none
+root@imx7s-warp:~# media-ctl -p
+Media controller API version 4.17.0
+
+Media device information
+
+driver  imx-media
+model   imx-media
+serial
+bus info
+hw revision 0x0
+driver version  4.17.0
+
+Device topology
+- entity 1: csi (2 pads, 2 links)
+   type V4L2 subdev subtype Unknown flags 0
+   device node name /dev/v4l-subdev0
+   pad0: Sink
+   [fmt:SBGGR10_1X10/800x600 field:none]
+   <- "csi_mux":2 [ENABLED]
+   pad1: Source
+   [fmt:SBGGR10_1X10/800x600 field:none]
+   -> "csi capture":0 [ENABLED]
+
+- entity 4: csi capture (1 pad, 1 link)
+   

[PATCH v13 05/13] media: staging/imx7: add MIPI CSI-2 receiver subdev for i.MX7

2019-02-06 Thread Rui Miguel Silva
Adds MIPI CSI-2 subdev for i.MX7 to connect with sensors with a MIPI
CSI-2 interface.

Signed-off-by: Rui Miguel Silva 
---
 drivers/staging/media/imx/Makefile |1 +
 drivers/staging/media/imx/imx7-mipi-csis.c | 1186 
 2 files changed, 1187 insertions(+)
 create mode 100644 drivers/staging/media/imx/imx7-mipi-csis.c

diff --git a/drivers/staging/media/imx/Makefile 
b/drivers/staging/media/imx/Makefile
index 074f016d3519..d2d909a36239 100644
--- a/drivers/staging/media/imx/Makefile
+++ b/drivers/staging/media/imx/Makefile
@@ -14,3 +14,4 @@ obj-$(CONFIG_VIDEO_IMX_CSI) += imx-media-csi.o
 obj-$(CONFIG_VIDEO_IMX_CSI) += imx6-mipi-csi2.o
 
 obj-$(CONFIG_VIDEO_IMX7_CSI) += imx7-media-csi.o
+obj-$(CONFIG_VIDEO_IMX7_CSI) += imx7-mipi-csis.o
diff --git a/drivers/staging/media/imx/imx7-mipi-csis.c 
b/drivers/staging/media/imx/imx7-mipi-csis.c
new file mode 100644
index ..516d308dc44b
--- /dev/null
+++ b/drivers/staging/media/imx/imx7-mipi-csis.c
@@ -0,0 +1,1186 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Freescale i.MX7 SoC series MIPI-CSI V3.3 receiver driver
+ *
+ * Copyright (C) 2019 Linaro Ltd
+ * Copyright (C) 2015-2016 Freescale Semiconductor, Inc. All Rights Reserved.
+ * Copyright (C) 2011 - 2013 Samsung Electronics Co., Ltd.
+ *
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include 
+#include 
+#include 
+
+#include "imx-media.h"
+
+#define CSIS_DRIVER_NAME   "imx7-mipi-csis"
+#define CSIS_SUBDEV_NAME   CSIS_DRIVER_NAME
+
+#define CSIS_PAD_SINK  0
+#define CSIS_PAD_SOURCE1
+#define CSIS_PADS_NUM  2
+
+#define MIPI_CSIS_DEF_PIX_WIDTH640
+#define MIPI_CSIS_DEF_PIX_HEIGHT   480
+
+/* Register map definition */
+
+/* CSIS common control */
+#define MIPI_CSIS_CMN_CTRL 0x04
+#define MIPI_CSIS_CMN_CTRL_UPDATE_SHADOW   BIT(16)
+#define MIPI_CSIS_CMN_CTRL_INTER_MODE  BIT(10)
+#define MIPI_CSIS_CMN_CTRL_UPDATE_SHADOW_CTRL  BIT(2)
+#define MIPI_CSIS_CMN_CTRL_RESET   BIT(1)
+#define MIPI_CSIS_CMN_CTRL_ENABLE  BIT(0)
+
+#define MIPI_CSIS_CMN_CTRL_LANE_NR_OFFSET  8
+#define MIPI_CSIS_CMN_CTRL_LANE_NR_MASK(3 << 8)
+
+/* CSIS clock control */
+#define MIPI_CSIS_CLK_CTRL 0x08
+#define MIPI_CSIS_CLK_CTRL_CLKGATE_TRAIL_CH3(x)((x) << 28)
+#define MIPI_CSIS_CLK_CTRL_CLKGATE_TRAIL_CH2(x)((x) << 24)
+#define MIPI_CSIS_CLK_CTRL_CLKGATE_TRAIL_CH1(x)((x) << 20)
+#define MIPI_CSIS_CLK_CTRL_CLKGATE_TRAIL_CH0(x)((x) << 16)
+#define MIPI_CSIS_CLK_CTRL_CLKGATE_EN_MSK  (0xf << 4)
+#define MIPI_CSIS_CLK_CTRL_WCLK_SRCBIT(0)
+
+/* CSIS Interrupt mask */
+#define MIPI_CSIS_INTMSK   0x10
+#define MIPI_CSIS_INTMSK_EVEN_BEFORE   BIT(31)
+#define MIPI_CSIS_INTMSK_EVEN_AFTERBIT(30)
+#define MIPI_CSIS_INTMSK_ODD_BEFOREBIT(29)
+#define MIPI_CSIS_INTMSK_ODD_AFTER BIT(28)
+#define MIPI_CSIS_INTMSK_FRAME_START   BIT(24)
+#define MIPI_CSIS_INTMSK_FRAME_END BIT(20)
+#define MIPI_CSIS_INTMSK_ERR_SOT_HSBIT(16)
+#define MIPI_CSIS_INTMSK_ERR_LOST_FS   BIT(12)
+#define MIPI_CSIS_INTMSK_ERR_LOST_FE   BIT(8)
+#define MIPI_CSIS_INTMSK_ERR_OVER  BIT(4)
+#define MIPI_CSIS_INTMSK_ERR_WRONG_CFG BIT(3)
+#define MIPI_CSIS_INTMSK_ERR_ECC   BIT(2)
+#define MIPI_CSIS_INTMSK_ERR_CRC   BIT(1)
+#define MIPI_CSIS_INTMSK_ERR_UNKNOWN   BIT(0)
+
+/* CSIS Interrupt source */
+#define MIPI_CSIS_INTSRC   0x14
+#define MIPI_CSIS_INTSRC_EVEN_BEFORE   BIT(31)
+#define MIPI_CSIS_INTSRC_EVEN_AFTERBIT(30)
+#define MIPI_CSIS_INTSRC_EVEN  BIT(30)
+#define MIPI_CSIS_INTSRC_ODD_BEFOREBIT(29)
+#define MIPI_CSIS_INTSRC_ODD_AFTER BIT(28)
+#define MIPI_CSIS_INTSRC_ODD   (0x3 << 28)
+#define MIPI_CSIS_INTSRC_NON_IMAGE_DATA(0xf << 28)
+#define MIPI_CSIS_INTSRC_FRAME_START   BIT(24)
+#define MIPI_CSIS_INTSRC_FRAME_END BIT(20)
+#define MIPI_CSIS_INTSRC_ERR_SOT_HSBIT(16)
+#define MIPI_CSIS_INTSRC_ERR_LOST_FS   BIT(12)
+#define MIPI_CSIS_INTSRC_ERR_LOST_FE   BIT(8)
+#define MIPI_CSIS_INTSRC_ERR_OVER  BIT(4)
+#define MIPI_CSIS_INTSRC_ERR_WRONG_CFG BIT(3)
+#define MIPI_CSIS_INTSRC_ERR_ECC   BIT(2)
+#define MIPI_CSIS_INTSRC_ERR_CRC   BIT(1)
+#define MIPI_CSIS_INTSRC_ERR_UNKNOWN   BIT(0)
+#define MIPI_CSIS_INTSRC_ERRORS0xf
+
+/* D-PHY status control */
+#define MIPI_CSIS_DPHYSTATUS   0x20
+#define MIPI_CSIS_DPHYSTATUS_ULPS_DAT  BIT(8)
+#define MIPI_CSIS_DPHYSTATUS_STOPSTATE_DAT BIT(4)
+#define MIPI_CSIS_DPHYSTATUS_ULPS_CLK  BIT(1)
+#define MIPI_CSIS_DPHYSTATUS_STOPSTATE_CLK BIT(0)
+
+/* D-PHY common control */
+#define MIPI_CSIS_DPHYCTRL 0x24
+#define MIPI_CSIS_DPHYCTRL_HSS_MASK(0xff << 24)
+#define MIPI_CSIS_DPHYCTRL_HSS_OFFSET  

[PATCH v13 01/13] media: staging/imx: refactor imx media device probe

2019-02-06 Thread Rui Miguel Silva
Refactor and move media device initialization code to a new common
module, so it can be used by other devices, this will allow for example
a near to introduce imx7 CSI driver, to use this media device.

Signed-off-by: Rui Miguel Silva 
---
 drivers/staging/media/imx/Makefile|  1 +
 drivers/staging/media/imx/imx-media-dev.c | 86 +--
 drivers/staging/media/imx/imx-media-of.c  |  6 +-
 drivers/staging/media/imx/imx-media.h | 14 
 4 files changed, 37 insertions(+), 70 deletions(-)

diff --git a/drivers/staging/media/imx/Makefile 
b/drivers/staging/media/imx/Makefile
index 698a4210316e..a30b3033f9a3 100644
--- a/drivers/staging/media/imx/Makefile
+++ b/drivers/staging/media/imx/Makefile
@@ -1,5 +1,6 @@
 # SPDX-License-Identifier: GPL-2.0
 imx-media-objs := imx-media-dev.o imx-media-internal-sd.o imx-media-of.o
+imx-media-objs += imx-media-dev-common.o
 imx-media-common-objs := imx-media-utils.o imx-media-fim.o
 imx-media-ic-objs := imx-ic-common.o imx-ic-prp.o imx-ic-prpencvf.o
 
diff --git a/drivers/staging/media/imx/imx-media-dev.c 
b/drivers/staging/media/imx/imx-media-dev.c
index 25e916562c66..c42bddd78906 100644
--- a/drivers/staging/media/imx/imx-media-dev.c
+++ b/drivers/staging/media/imx/imx-media-dev.c
@@ -116,9 +116,9 @@ static int imx_media_get_ipu(struct imx_media_dev *imxmd,
 }
 
 /* async subdev bound notifier */
-static int imx_media_subdev_bound(struct v4l2_async_notifier *notifier,
- struct v4l2_subdev *sd,
- struct v4l2_async_subdev *asd)
+int imx_media_subdev_bound(struct v4l2_async_notifier *notifier,
+  struct v4l2_subdev *sd,
+  struct v4l2_async_subdev *asd)
 {
struct imx_media_dev *imxmd = notifier2dev(notifier);
int ret = 0;
@@ -302,7 +302,7 @@ static int imx_media_create_pad_vdev_lists(struct 
imx_media_dev *imxmd)
 }
 
 /* async subdev complete notifier */
-static int imx_media_probe_complete(struct v4l2_async_notifier *notifier)
+int imx_media_probe_complete(struct v4l2_async_notifier *notifier)
 {
struct imx_media_dev *imxmd = notifier2dev(notifier);
int ret;
@@ -326,11 +326,6 @@ static int imx_media_probe_complete(struct 
v4l2_async_notifier *notifier)
return media_device_register(&imxmd->md);
 }
 
-static const struct v4l2_async_notifier_operations imx_media_subdev_ops = {
-   .bound = imx_media_subdev_bound,
-   .complete = imx_media_probe_complete,
-};
-
 /*
  * adds controls to a video device from an entity subdevice.
  * Continues upstream from the entity's sink pads.
@@ -374,8 +369,8 @@ static int imx_media_inherit_controls(struct imx_media_dev 
*imxmd,
return ret;
 }
 
-static int imx_media_link_notify(struct media_link *link, u32 flags,
-unsigned int notification)
+int imx_media_link_notify(struct media_link *link, u32 flags,
+ unsigned int notification)
 {
struct media_entity *source = link->source->entity;
struct imx_media_pad_vdev *pad_vdev;
@@ -438,13 +433,8 @@ static int imx_media_link_notify(struct media_link *link, 
u32 flags,
return ret;
 }
 
-static const struct media_device_ops imx_media_md_ops = {
-   .link_notify = imx_media_link_notify,
-};
-
-static void imx_media_notify(struct v4l2_subdev *sd,
-unsigned int notification,
-void *arg)
+void imx_media_notify(struct v4l2_subdev *sd, unsigned int notification,
+ void *arg)
 {
struct media_entity *entity = &sd->entity;
int i;
@@ -472,77 +462,37 @@ static int imx_media_probe(struct platform_device *pdev)
struct imx_media_dev *imxmd;
int ret;
 
-   imxmd = devm_kzalloc(dev, sizeof(*imxmd), GFP_KERNEL);
-   if (!imxmd)
-   return -ENOMEM;
-
-   dev_set_drvdata(dev, imxmd);
-
-   strscpy(imxmd->md.model, "imx-media", sizeof(imxmd->md.model));
-   imxmd->md.ops = &imx_media_md_ops;
-   imxmd->md.dev = dev;
-
-   mutex_init(&imxmd->mutex);
-
-   imxmd->v4l2_dev.mdev = &imxmd->md;
-   imxmd->v4l2_dev.notify = imx_media_notify;
-   strscpy(imxmd->v4l2_dev.name, "imx-media",
-   sizeof(imxmd->v4l2_dev.name));
-
-   media_device_init(&imxmd->md);
-
-   ret = v4l2_device_register(dev, &imxmd->v4l2_dev);
-   if (ret < 0) {
-   v4l2_err(&imxmd->v4l2_dev,
-"Failed to register v4l2_device: %d\n", ret);
-   goto cleanup;
-   }
-
-   dev_set_drvdata(imxmd->v4l2_dev.dev, imxmd);
-
-   INIT_LIST_HEAD(&imxmd->vdev_list);
-
-   v4l2_async_notifier_init(&imxmd->notifier);
+   imxmd = imx_media_dev_init(dev);
+   if (IS_ERR(imxmd))
+   return PTR_ERR(imxmd);
 
ret = imx_media_add_of_subdevs(imxmd, node);
if (ret) {
v4l2_err(&imxmd->v4l2_dev,
   

[PATCH v13 02/13] media: staging/imx: rearrange group id to take in account IPU

2019-02-06 Thread Rui Miguel Silva
Some imx system do not have IPU, so prepare the imx media drivers to
support this kind of devices. Rename the group ids to include an _IPU_
prefix, add a new group id to support systems with only a CSI without
IPU, and also rename the create internal links to make it clear that
only systems with IPU have internal subdevices.

Signed-off-by: Rui Miguel Silva 
Acked-by: Sakari Ailus 
---
 drivers/staging/media/imx/imx-ic-common.c |  6 ++---
 drivers/staging/media/imx/imx-ic-prp.c| 16 ++---
 drivers/staging/media/imx/imx-media-csi.c |  6 ++---
 drivers/staging/media/imx/imx-media-dev.c | 22 ++
 .../staging/media/imx/imx-media-internal-sd.c | 20 
 drivers/staging/media/imx/imx-media-utils.c   | 12 +-
 drivers/staging/media/imx/imx-media.h | 23 ++-
 7 files changed, 55 insertions(+), 50 deletions(-)

diff --git a/drivers/staging/media/imx/imx-ic-common.c 
b/drivers/staging/media/imx/imx-ic-common.c
index cfdd4900a3be..765919487a73 100644
--- a/drivers/staging/media/imx/imx-ic-common.c
+++ b/drivers/staging/media/imx/imx-ic-common.c
@@ -41,13 +41,13 @@ static int imx_ic_probe(struct platform_device *pdev)
pdata = priv->dev->platform_data;
priv->ipu_id = pdata->ipu_id;
switch (pdata->grp_id) {
-   case IMX_MEDIA_GRP_ID_IC_PRP:
+   case IMX_MEDIA_GRP_ID_IPU_IC_PRP:
priv->task_id = IC_TASK_PRP;
break;
-   case IMX_MEDIA_GRP_ID_IC_PRPENC:
+   case IMX_MEDIA_GRP_ID_IPU_IC_PRPENC:
priv->task_id = IC_TASK_ENCODER;
break;
-   case IMX_MEDIA_GRP_ID_IC_PRPVF:
+   case IMX_MEDIA_GRP_ID_IPU_IC_PRPVF:
priv->task_id = IC_TASK_VIEWFINDER;
break;
default:
diff --git a/drivers/staging/media/imx/imx-ic-prp.c 
b/drivers/staging/media/imx/imx-ic-prp.c
index 98923fc844ce..2702548f83cf 100644
--- a/drivers/staging/media/imx/imx-ic-prp.c
+++ b/drivers/staging/media/imx/imx-ic-prp.c
@@ -77,7 +77,7 @@ static int prp_start(struct prp_priv *priv)
priv->ipu = priv->md->ipu[ic_priv->ipu_id];
 
/* set IC to receive from CSI or VDI depending on source */
-   src_is_vdic = !!(priv->src_sd->grp_id & IMX_MEDIA_GRP_ID_VDIC);
+   src_is_vdic = !!(priv->src_sd->grp_id & IMX_MEDIA_GRP_ID_IPU_VDIC);
 
ipu_set_ic_src_mux(priv->ipu, priv->csi_id, src_is_vdic);
 
@@ -237,8 +237,8 @@ static int prp_link_setup(struct media_entity *entity,
ret = -EBUSY;
goto out;
}
-   if (priv->sink_sd_prpenc && (remote_sd->grp_id &
-IMX_MEDIA_GRP_ID_VDIC)) {
+   if (priv->sink_sd_prpenc &&
+   (remote_sd->grp_id & IMX_MEDIA_GRP_ID_IPU_VDIC)) {
ret = -EINVAL;
goto out;
}
@@ -259,7 +259,7 @@ static int prp_link_setup(struct media_entity *entity,
goto out;
}
if (priv->src_sd && (priv->src_sd->grp_id &
-IMX_MEDIA_GRP_ID_VDIC)) {
+IMX_MEDIA_GRP_ID_IPU_VDIC)) {
ret = -EINVAL;
goto out;
}
@@ -309,13 +309,13 @@ static int prp_link_validate(struct v4l2_subdev *sd,
return ret;
 
csi = imx_media_find_upstream_subdev(priv->md, &ic_priv->sd.entity,
-IMX_MEDIA_GRP_ID_CSI);
+IMX_MEDIA_GRP_ID_IPU_CSI);
if (IS_ERR(csi))
csi = NULL;
 
mutex_lock(&priv->lock);
 
-   if (priv->src_sd->grp_id & IMX_MEDIA_GRP_ID_VDIC) {
+   if (priv->src_sd->grp_id & IMX_MEDIA_GRP_ID_IPU_VDIC) {
/*
 * the ->PRPENC link cannot be enabled if the source
 * is the VDIC
@@ -334,10 +334,10 @@ static int prp_link_validate(struct v4l2_subdev *sd,
 
if (csi) {
switch (csi->grp_id) {
-   case IMX_MEDIA_GRP_ID_CSI0:
+   case IMX_MEDIA_GRP_ID_IPU_CSI0:
priv->csi_id = 0;
break;
-   case IMX_MEDIA_GRP_ID_CSI1:
+   case IMX_MEDIA_GRP_ID_IPU_CSI1:
priv->csi_id = 1;
break;
default:
diff --git a/drivers/staging/media/imx/imx-media-csi.c 
b/drivers/staging/media/imx/imx-media-csi.c
index d851ca2497b4..d957b8aa3ec5 100644
--- a/drivers/staging/media/imx/imx-media-csi.c
+++ b/drivers/staging/media/imx/imx-media-csi.c
@@ -1071,10 +1071,10 @@ static int csi_link_setup(struct media_entity *entity,
 
remote_sd = media_entity_to_v4l2_

[PATCH v13 04/13] media: staging/imx7: add imx7 CSI subdev driver

2019-02-06 Thread Rui Miguel Silva
This add the media entity subdevice and control driver for the i.MX7
CMOS Sensor Interface.

Signed-off-by: Rui Miguel Silva 
Acked-by: Sakari Ailus 
---
 drivers/staging/media/imx/Kconfig  |9 +-
 drivers/staging/media/imx/Makefile |2 +
 drivers/staging/media/imx/imx7-media-csi.c | 1365 
 3 files changed, 1375 insertions(+), 1 deletion(-)
 create mode 100644 drivers/staging/media/imx/imx7-media-csi.c

diff --git a/drivers/staging/media/imx/Kconfig 
b/drivers/staging/media/imx/Kconfig
index bfc17de56b17..36b276ea2ecc 100644
--- a/drivers/staging/media/imx/Kconfig
+++ b/drivers/staging/media/imx/Kconfig
@@ -11,7 +11,7 @@ config VIDEO_IMX_MEDIA
  driver for the i.MX5/6 SOC.
 
 if VIDEO_IMX_MEDIA
-menu "i.MX5/6 Media Sub devices"
+menu "i.MX5/6/7 Media Sub devices"
 
 config VIDEO_IMX_CSI
tristate "i.MX5/6 Camera Sensor Interface driver"
@@ -20,5 +20,12 @@ config VIDEO_IMX_CSI
---help---
  A video4linux camera sensor interface driver for i.MX5/6.
 
+config VIDEO_IMX7_CSI
+   tristate "i.MX7 Camera Sensor Interface driver"
+   depends on VIDEO_IMX_MEDIA && VIDEO_DEV && I2C
+   default y
+   help
+ Enable support for video4linux camera sensor interface driver for
+ i.MX7.
 endmenu
 endif
diff --git a/drivers/staging/media/imx/Makefile 
b/drivers/staging/media/imx/Makefile
index a30b3033f9a3..074f016d3519 100644
--- a/drivers/staging/media/imx/Makefile
+++ b/drivers/staging/media/imx/Makefile
@@ -12,3 +12,5 @@ obj-$(CONFIG_VIDEO_IMX_MEDIA) += imx-media-ic.o
 
 obj-$(CONFIG_VIDEO_IMX_CSI) += imx-media-csi.o
 obj-$(CONFIG_VIDEO_IMX_CSI) += imx6-mipi-csi2.o
+
+obj-$(CONFIG_VIDEO_IMX7_CSI) += imx7-media-csi.o
diff --git a/drivers/staging/media/imx/imx7-media-csi.c 
b/drivers/staging/media/imx/imx7-media-csi.c
new file mode 100644
index ..d5154f032979
--- /dev/null
+++ b/drivers/staging/media/imx/imx7-media-csi.c
@@ -0,0 +1,1365 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * V4L2 Capture CSI Subdev for Freescale i.MX7 SOC
+ *
+ * Copyright (c) 2019 Linaro Ltd
+ *
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include 
+#include "imx-media.h"
+
+#define IMX7_CSI_PAD_SINK  0
+#define IMX7_CSI_PAD_SRC   1
+#define IMX7_CSI_PADS_NUM  2
+
+/* reset values */
+#define CSICR1_RESET_VAL   0x4800
+#define CSICR2_RESET_VAL   0x0
+#define CSICR3_RESET_VAL   0x0
+
+/* csi control reg 1 */
+#define BIT_SWAP16_EN  BIT(31)
+#define BIT_EXT_VSYNC  BIT(30)
+#define BIT_EOF_INT_EN BIT(29)
+#define BIT_PRP_IF_EN  BIT(28)
+#define BIT_CCIR_MODE  BIT(27)
+#define BIT_COF_INT_EN BIT(26)
+#define BIT_SF_OR_INTENBIT(25)
+#define BIT_RF_OR_INTENBIT(24)
+#define BIT_SFF_DMA_DONE_INTEN  BIT(22)
+#define BIT_STATFF_INTEN   BIT(21)
+#define BIT_FB2_DMA_DONE_INTEN  BIT(20)
+#define BIT_FB1_DMA_DONE_INTEN  BIT(19)
+#define BIT_RXFF_INTEN BIT(18)
+#define BIT_SOF_POLBIT(17)
+#define BIT_SOF_INTEN  BIT(16)
+#define BIT_MCLKDIV(0xF << 12)
+#define BIT_HSYNC_POL  BIT(11)
+#define BIT_CCIR_ENBIT(10)
+#define BIT_MCLKEN BIT(9)
+#define BIT_FCCBIT(8)
+#define BIT_PACK_DIR   BIT(7)
+#define BIT_CLR_STATFIFO   BIT(6)
+#define BIT_CLR_RXFIFO BIT(5)
+#define BIT_GCLK_MODE  BIT(4)
+#define BIT_INV_DATA   BIT(3)
+#define BIT_INV_PCLK   BIT(2)
+#define BIT_REDGE  BIT(1)
+#define BIT_PIXEL_BIT  BIT(0)
+
+#define SHIFT_MCLKDIV  12
+
+/* control reg 3 */
+#define BIT_FRMCNT (0x << 16)
+#define BIT_FRMCNT_RST BIT(15)
+#define BIT_DMA_REFLASH_RFFBIT(14)
+#define BIT_DMA_REFLASH_SFFBIT(13)
+#define BIT_DMA_REQ_EN_RFF BIT(12)
+#define BIT_DMA_REQ_EN_SFF BIT(11)
+#define BIT_STATFF_LEVEL   (0x7 << 8)
+#define BIT_HRESP_ERR_EN   BIT(7)
+#define BIT_RXFF_LEVEL (0x7 << 4)
+#define BIT_TWO_8BIT_SENSORBIT(3)
+#define BIT_ZERO_PACK_EN   BIT(2)
+#define BIT_ECC_INT_EN BIT(1)
+#define BIT_ECC_AUTO_ENBIT(0)
+
+#define SHIFT_FRMCNT   16
+#define SHIFT_RXFIFO_LEVEL 4
+
+/* csi status reg */
+#define BIT_ADDR_CH_ERR_INTBIT(28)
+#define BIT_FIELD0_INT BIT(27)
+#define BIT_FIELD1_INT BIT(26)
+#define BIT_SFF_OR_INT BIT(25)
+#define BIT_RFF_OR_INT BIT(24)
+#define BIT_DMA_TSF_DONE_SFF   BIT(22)
+#define BIT_STATFF_INT BIT(21)
+#define BIT_DMA_TSF_DONE_FB2   BIT(20)
+#define BIT_DMA_TSF_DONE_FB1   BIT(19)
+#define BIT_RXFF_INT   BIT(18)
+#define BIT_EOF_INTBIT(17)
+#define BIT_SOF_INTBIT(16)
+#define BIT_F2_INT BIT(15)
+#define BIT_F1_INT 

[PATCH v13 03/13] media: dt-bindings: add bindings for i.MX7 media driver

2019-02-06 Thread Rui Miguel Silva
Add bindings documentation for i.MX7 media drivers.
The imx7 MIPI CSI2 and imx7 CMOS Sensor Interface.

Signed-off-by: Rui Miguel Silva 
Reviewed-by: Rob Herring 
Acked-by: Sakari Ailus 
---
 .../devicetree/bindings/media/imx7-csi.txt| 45 ++
 .../bindings/media/imx7-mipi-csi2.txt | 90 +++
 2 files changed, 135 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/media/imx7-csi.txt
 create mode 100644 Documentation/devicetree/bindings/media/imx7-mipi-csi2.txt

diff --git a/Documentation/devicetree/bindings/media/imx7-csi.txt 
b/Documentation/devicetree/bindings/media/imx7-csi.txt
new file mode 100644
index ..3c07bc676bc3
--- /dev/null
+++ b/Documentation/devicetree/bindings/media/imx7-csi.txt
@@ -0,0 +1,45 @@
+Freescale i.MX7 CMOS Sensor Interface
+=
+
+csi node
+
+
+This is device node for the CMOS Sensor Interface (CSI) which enables the chip
+to connect directly to external CMOS image sensors.
+
+Required properties:
+
+- compatible: "fsl,imx7-csi";
+- reg   : base address and length of the register set for the device;
+- interrupts: should contain CSI interrupt;
+- clocks: list of clock specifiers, see
+Documentation/devicetree/bindings/clock/clock-bindings.txt for details;
+- clock-names   : must contain "axi", "mclk" and "dcic" entries, matching
+ entries in the clock property;
+
+The device node shall contain one 'port' child node with one child 'endpoint'
+node, according to the bindings defined in:
+Documentation/devicetree/bindings/media/video-interfaces.txt.
+
+In the following example a remote endpoint is a video multiplexer.
+
+example:
+
+csi: csi@3071 {
+#address-cells = <1>;
+#size-cells = <0>;
+
+compatible = "fsl,imx7-csi";
+reg = <0x3071 0x1>;
+interrupts = ;
+clocks = <&clks IMX7D_CLK_DUMMY>,
+<&clks IMX7D_CSI_MCLK_ROOT_CLK>,
+<&clks IMX7D_CLK_DUMMY>;
+clock-names = "axi", "mclk", "dcic";
+
+port {
+csi_from_csi_mux: endpoint {
+remote-endpoint = <&csi_mux_to_csi>;
+};
+};
+};
diff --git a/Documentation/devicetree/bindings/media/imx7-mipi-csi2.txt 
b/Documentation/devicetree/bindings/media/imx7-mipi-csi2.txt
new file mode 100644
index ..71fd74ed3ec8
--- /dev/null
+++ b/Documentation/devicetree/bindings/media/imx7-mipi-csi2.txt
@@ -0,0 +1,90 @@
+Freescale i.MX7 Mipi CSI2
+=
+
+mipi_csi2 node
+--
+
+This is the device node for the MIPI CSI-2 receiver core in i.MX7 SoC. It is
+compatible with previous version of Samsung D-phy.
+
+Required properties:
+
+- compatible: "fsl,imx7-mipi-csi2";
+- reg   : base address and length of the register set for the device;
+- interrupts: should contain MIPI CSIS interrupt;
+- clocks: list of clock specifiers, see
+Documentation/devicetree/bindings/clock/clock-bindings.txt for details;
+- clock-names   : must contain "pclk", "wrap" and "phy" entries, matching
+  entries in the clock property;
+- power-domains : a phandle to the power domain, see
+  Documentation/devicetree/bindings/power/power_domain.txt for details.
+- reset-names   : should include following entry "mrst";
+- resets: a list of phandle, should contain reset entry of
+  reset-names;
+- phy-supply: from the generic phy bindings, a phandle to a regulator that
+ provides power to MIPI CSIS core;
+
+Optional properties:
+
+- clock-frequency : The IP's main (system bus) clock frequency in Hz, default
+   value when this property is not specified is 166 MHz;
+- fsl,csis-hs-settle : differential receiver (HS-RX) settle time;
+
+The device node should contain two 'port' child nodes with one child 'endpoint'
+node, according to the bindings defined in:
+ Documentation/devicetree/bindings/ media/video-interfaces.txt.
+ The following are properties specific to those nodes.
+
+port node
+-
+
+- reg: (required) can take the values 0 or 1, where 0 shall be
+ related to the sink port and port 1 shall be the source
+ one;
+
+endpoint node
+-
+
+- data-lanes: (required) an array specifying active physical MIPI-CSI2
+   data input lanes and their mapping to logical lanes; this
+shall only be applied to port 0 (sink port), the array's
+content is unused only its length is meaningful,
+in this case the maximum le

[PATCH v13 00/13] media: staging/imx7: add i.MX7 media driver

2019-02-06 Thread Rui Miguel Silva
Hi,
This series introduces the Media driver to work with the i.MX7 SoC. it uses the
already existing imx media core drivers but since the i.MX7, contrary to
i.MX5/6, do not have an IPU and because of that some changes in the imx media
core are made along this series to make it support that case.

This patches adds CSI and MIPI-CSI2 drivers for i.MX7, along with several
configurations changes for this to work as a capture subsystem. Some bugs are
also fixed along the line. And necessary documentation.

For a more detailed view of the capture paths, pads links in the i.MX7 please
take a look at the documentation in PATCH 10.

The system used to test and develop this was the Warp7 board with an OV2680
sensor, which output format is 10-bit bayer. So, only MIPI interface was
tested, a scenario with an parallel input would nice to have.

Bellow goes an example of the output of the pads and links and the output of
v4l2-compliance testing.

The v4l-utils version used is:
v4l2-compliance SHA: 1a6c8fe9a65c26e78ba34bd4aa2df28ede7d00cb, 32 bits

The Media Driver fail some tests but this failures are coming from code out of
scope of this series (imx-capture), and some from the sensor OV2680
but that I think not related with the sensor driver but with the testing and
core.

The csi and mipi-csi entities pass all compliance tests.

Cheers,
Rui

v12->v13:
Fingers crossed :)
Hans:
- rebase latest master
f0ef022c8 media: vim2m: allow setting the default transaction time via 
parameter
Sakari:
- add Acked-by: Sakari Ailus  2 and 4
(did not do it to 1, because it changed on the rebase)

v11->v12:
  Sakari:
- check v4l2_ctrl_handler_free and init when exposed to userspace
- check csi_remove missing v4l2_async_notifier_unregister
- media device unregister before ctrl_handler_free
- GPL => GPL v2
- Fix squash of CSI patches, issue on v11
- add Acked-by: Sakari Ailus  10--13
- mipi_s_stream check for ret < 0 and call pm_runtime_put_noidle
- use __maybe_unused in pm functions
- Extra space before labels

v10->v11:
  Sakari:
- Remove cleanup functions in dev-common and do direct calls
- Fix notifier cleanup on error path

  Philipp Zabel:
- Add reviewed tag to video mux patch 12/13

v9->v10:
  Hans:
  - move dt-bindings patch up in the series to avoid checkpatch warnings
  - Fix SPDX tag

  Sakari:
  - use debugfs and drop driver parameters
  - use dev_*() macros all over the place, drop v4l2_*() ones
  - use clk_bulk
  - give control to power state to runtime PM
  - unsigned and const for some objects

v8->v9:
Hans Verkuil:
 - Fix issues detected by checkpatch strict, still some left:
 - bigger kconfig option description
 - some alignement parenthesis that were left as they are, to be more
 readable 
 - added new patch (PATCH13) for Maintainers update
 - SPDX in documentation rst file
Sakari Ailus:
 - remove pad check in csi, this is done by core already
 - destroy mutex in probe error path (add label)
 - swap order in driver release
 - initialize endpoint in stack
 - use clk_bulk
kbuild test robot:
 - add the missing imx-media-dev-common.c in patch 1/13
 - remove OWNER of module csis
Myself:
 - add MAINTAINERS entries - new patch

v7->v8:
Myself:
 - rebase to latest linux-next (s/V4L2_MBUS_CSI2/V4L2_MBUS_CSI2_DPHY/)
 - Rebuild and test with latest v4l2-compliance
 - add Sakari reviewed-by tag to dt-bindings

v6->v7:
Myself:
 - Clock patches removed from this version since they were already merged
 - Rebuild and test with the latest v4l2-compliance
 - Add patch to video-mux regarding bayer formats
 - remove reference to dependent patch serie (was already merged)

Sakari Ailus:
 - add port and endpoint explanantions
 - fix some wording should -> shall

v5->v6:
Rob Herring:
 - rename power-domain node name from: pgc-power-domain to power-domain
 - change mux-control-cells to 0
 - remove bus-width from mipi bindings and dts
 - remove err... regarding clock names line
 - remove clk-settle from example
 - split mipi-csi2 and csi bindings per file
 - add OF graph description to CSI

Philipp Zabel:
 - rework group IDs and rename them with an _IPU_ prefix, this allowed to remove
   the ipu_present flag need.

v4->v5:
Sakari Ailus:
 - fix remove of the capture entries in dts bindings in the right patch

Stephen Boyd:
 - Send all series to clk list

v3->v4:
Philipp Zabel:
 - refactor initialization code from media device probe to be possible to used
   from other modules
 - Remove index of csi from all accurrencs (dts, code, documentation)
 - Remove need for capture node for imx7
 - fix pinctrl for ov2680
 - add reviewed tag to add multiplexer controls patch

Fabio Estevam:
 - remove always on from new regulator

Randy Dunlap:
 - several text editing fixes in documentation

Myself:
 - rebase on top of v4 of Steve series
 - change CSI probe to initialize imx media device
 - remove csi mux parallel endpoint from mux to avoid warning message

v2->v3

Re: [PATCH net-next v3 00/12] net: Introduce ndo_get_port_parent_id()

2019-02-06 Thread Ido Schimmel
On Tue, Feb 05, 2019 at 03:53:14PM -0800, Florian Fainelli wrote:
> Hi all,
> 
> Based on discussion with Ido and feedback from Jakub there are clearly
> two classes of users that implement SWITCHDEV_ATTR_ID_PORT_PARENT_ID:
> 
> - PF/VF drivers which typically only implement return the port's parent
>   ID, yet have to implement switchdev_port_attr_get() just for that
> 
> - Ethernet switch drivers: mlxsw, ocelot, DSA, etc. which implement more
>   attributes which we want to be able to eventually veto in the context
>   of the caller, thus making them candidates for using a blocking notifier
>   chain

Florian, patches look good to me. I'm going to build a kernel with these
patches and run some tests. Will report later today.

Thanks
___
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel