Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

soc: ti: K2G: provide APIs to support driver probe deferral

This patch provide APIs to allow client drivers to support
probe deferral. On K2G SoC, devices can be probed only
after the ti_sci_pm_domains driver is probed and ready.
As drivers may get probed at different order, any driver
that depends on knav dma and qmss drivers, for example
netcp network driver, needs to defer probe until
knav devices are probed and ready to service. To do this,
add an API to query the device ready status from the knav
dma and qmss devices.

Signed-off-by: Murali Karicheri <m-karicheri2@ti.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Murali Karicheri and committed by
David S. Miller
a2dd6877 350601b4

+29
+8
drivers/soc/ti/knav_dma.c
··· 134 134 135 135 static struct knav_dma_pool_device *kdev; 136 136 137 + static bool device_ready; 138 + bool knav_dma_device_ready(void) 139 + { 140 + return device_ready; 141 + } 142 + EXPORT_SYMBOL_GPL(knav_dma_device_ready); 143 + 137 144 static bool check_config(struct knav_dma_chan *chan, struct knav_dma_cfg *cfg) 138 145 { 139 146 if (!memcmp(&chan->cfg, cfg, sizeof(*cfg))) ··· 780 773 debugfs_create_file("knav_dma", S_IFREG | S_IRUGO, NULL, NULL, 781 774 &knav_dma_debug_ops); 782 775 776 + device_ready = true; 783 777 return ret; 784 778 } 785 779
+8
drivers/soc/ti/knav_qmss_queue.c
··· 74 74 */ 75 75 const char *knav_acc_firmwares[] = {"ks2_qmss_pdsp_acc48.bin"}; 76 76 77 + static bool device_ready; 78 + bool knav_qmss_device_ready(void) 79 + { 80 + return device_ready; 81 + } 82 + EXPORT_SYMBOL_GPL(knav_qmss_device_ready); 83 + 77 84 /** 78 85 * knav_queue_notify: qmss queue notfier call 79 86 * ··· 1856 1849 1857 1850 debugfs_create_file("qmss", S_IFREG | S_IRUGO, NULL, NULL, 1858 1851 &knav_queue_debug_ops); 1852 + device_ready = true; 1859 1853 return 0; 1860 1854 1861 1855 err:
+12
include/linux/soc/ti/knav_dma.h
··· 167 167 void *knav_dma_open_channel(struct device *dev, const char *name, 168 168 struct knav_dma_cfg *config); 169 169 void knav_dma_close_channel(void *channel); 170 + int knav_dma_get_flow(void *channel); 171 + bool knav_dma_device_ready(void); 170 172 #else 171 173 static inline void *knav_dma_open_channel(struct device *dev, const char *name, 172 174 struct knav_dma_cfg *config) ··· 177 175 } 178 176 static inline void knav_dma_close_channel(void *channel) 179 177 {} 178 + 179 + static inline int knav_dma_get_flow(void *channel) 180 + { 181 + return -EINVAL; 182 + } 183 + 184 + static inline bool knav_dma_device_ready(void) 185 + { 186 + return false; 187 + } 180 188 181 189 #endif 182 190
+1
include/linux/soc/ti/knav_qmss.h
··· 86 86 void *knav_pool_desc_unmap(void *ph, dma_addr_t dma, unsigned dma_sz); 87 87 dma_addr_t knav_pool_desc_virt_to_dma(void *ph, void *virt); 88 88 void *knav_pool_desc_dma_to_virt(void *ph, dma_addr_t dma); 89 + bool knav_qmss_device_ready(void); 89 90 90 91 #endif /* __SOC_TI_KNAV_QMSS_H__ */