30
30
#include <linux/can/error.h>
31
31
#include <linux/phy/phy.h>
32
32
#include <linux/pm_runtime.h>
33
+ #include <linux/reset.h>
33
34
34
35
#define DRIVER_NAME "xilinx_can"
35
36
@@ -200,6 +201,7 @@ struct xcan_devtype_data {
200
201
* @can_clk: Pointer to struct clk
201
202
* @devtype: Device type specific constants
202
203
* @transceiver: Optional pointer to associated CAN transceiver
204
+ * @rstc: Pointer to reset control
203
205
*/
204
206
struct xcan_priv {
205
207
struct can_priv can ;
@@ -218,6 +220,7 @@ struct xcan_priv {
218
220
struct clk * can_clk ;
219
221
struct xcan_devtype_data devtype ;
220
222
struct phy * transceiver ;
223
+ struct reset_control * rstc ;
221
224
};
222
225
223
226
/* CAN Bittiming constants as per Xilinx CAN specs */
@@ -1799,6 +1802,16 @@ static int xcan_probe(struct platform_device *pdev)
1799
1802
priv -> can .do_get_berr_counter = xcan_get_berr_counter ;
1800
1803
priv -> can .ctrlmode_supported = CAN_CTRLMODE_LOOPBACK |
1801
1804
CAN_CTRLMODE_BERR_REPORTING ;
1805
+ priv -> rstc = devm_reset_control_get_optional_exclusive (& pdev -> dev , NULL );
1806
+ if (IS_ERR (priv -> rstc )) {
1807
+ dev_err (& pdev -> dev , "Cannot get CAN reset.\n" );
1808
+ ret = PTR_ERR (priv -> rstc );
1809
+ goto err_free ;
1810
+ }
1811
+
1812
+ ret = reset_control_reset (priv -> rstc );
1813
+ if (ret )
1814
+ goto err_free ;
1802
1815
1803
1816
if (devtype -> cantype == XAXI_CANFD ) {
1804
1817
priv -> can .data_bittiming_const =
@@ -1827,7 +1840,7 @@ static int xcan_probe(struct platform_device *pdev)
1827
1840
/* Get IRQ for the device */
1828
1841
ret = platform_get_irq (pdev , 0 );
1829
1842
if (ret < 0 )
1830
- goto err_free ;
1843
+ goto err_reset ;
1831
1844
1832
1845
ndev -> irq = ret ;
1833
1846
@@ -1843,21 +1856,21 @@ static int xcan_probe(struct platform_device *pdev)
1843
1856
if (IS_ERR (priv -> can_clk )) {
1844
1857
ret = dev_err_probe (& pdev -> dev , PTR_ERR (priv -> can_clk ),
1845
1858
"device clock not found\n" );
1846
- goto err_free ;
1859
+ goto err_reset ;
1847
1860
}
1848
1861
1849
1862
priv -> bus_clk = devm_clk_get (& pdev -> dev , devtype -> bus_clk_name );
1850
1863
if (IS_ERR (priv -> bus_clk )) {
1851
1864
ret = dev_err_probe (& pdev -> dev , PTR_ERR (priv -> bus_clk ),
1852
1865
"bus clock not found\n" );
1853
- goto err_free ;
1866
+ goto err_reset ;
1854
1867
}
1855
1868
1856
1869
transceiver = devm_phy_optional_get (& pdev -> dev , NULL );
1857
1870
if (IS_ERR (transceiver )) {
1858
1871
ret = PTR_ERR (transceiver );
1859
1872
dev_err_probe (& pdev -> dev , ret , "failed to get phy\n" );
1860
- goto err_free ;
1873
+ goto err_reset ;
1861
1874
}
1862
1875
priv -> transceiver = transceiver ;
1863
1876
@@ -1904,6 +1917,8 @@ static int xcan_probe(struct platform_device *pdev)
1904
1917
err_disableclks :
1905
1918
pm_runtime_put (priv -> dev );
1906
1919
pm_runtime_disable (& pdev -> dev );
1920
+ err_reset :
1921
+ reset_control_assert (priv -> rstc );
1907
1922
err_free :
1908
1923
free_candev (ndev );
1909
1924
err :
@@ -1920,9 +1935,11 @@ static int xcan_probe(struct platform_device *pdev)
1920
1935
static void xcan_remove (struct platform_device * pdev )
1921
1936
{
1922
1937
struct net_device * ndev = platform_get_drvdata (pdev );
1938
+ struct xcan_priv * priv = netdev_priv (ndev );
1923
1939
1924
1940
unregister_candev (ndev );
1925
1941
pm_runtime_disable (& pdev -> dev );
1942
+ reset_control_assert (priv -> rstc );
1926
1943
free_candev (ndev );
1927
1944
}
1928
1945
0 commit comments