|
8 | 8 | #include <linux/delay.h>
|
9 | 9 | #include <linux/export.h>
|
10 | 10 | #include <linux/gpio.h>
|
| 11 | +#include <linux/gpio/consumer.h> |
11 | 12 | #include <linux/kernel.h>
|
12 | 13 | #include <linux/module.h>
|
13 | 14 | #include <linux/platform_data/microchip-ksz.h>
|
14 | 15 | #include <linux/phy.h>
|
15 | 16 | #include <linux/etherdevice.h>
|
16 | 17 | #include <linux/if_bridge.h>
|
| 18 | +#include <linux/of_gpio.h> |
17 | 19 | #include <linux/of_net.h>
|
18 | 20 | #include <net/dsa.h>
|
19 | 21 | #include <net/switchdev.h>
|
@@ -294,6 +296,17 @@ int ksz_switch_register(struct ksz_device *dev,
|
294 | 296 | if (dev->pdata)
|
295 | 297 | dev->chip_id = dev->pdata->chip_id;
|
296 | 298 |
|
| 299 | + dev->reset_gpio = devm_gpiod_get_optional(dev->dev, "reset", |
| 300 | + GPIOD_OUT_LOW); |
| 301 | + if (IS_ERR(dev->reset_gpio)) |
| 302 | + return PTR_ERR(dev->reset_gpio); |
| 303 | + |
| 304 | + if (dev->reset_gpio) { |
| 305 | + gpiod_set_value(dev->reset_gpio, 1); |
| 306 | + mdelay(10); |
| 307 | + gpiod_set_value(dev->reset_gpio, 0); |
| 308 | + } |
| 309 | + |
297 | 310 | mutex_init(&dev->reg_mutex);
|
298 | 311 | mutex_init(&dev->stats_mutex);
|
299 | 312 | mutex_init(&dev->alu_mutex);
|
@@ -329,6 +342,10 @@ void ksz_switch_remove(struct ksz_device *dev)
|
329 | 342 | {
|
330 | 343 | dev->dev_ops->exit(dev);
|
331 | 344 | dsa_unregister_switch(dev->ds);
|
| 345 | + |
| 346 | + if (dev->reset_gpio) |
| 347 | + gpiod_set_value(dev->reset_gpio, 1); |
| 348 | + |
332 | 349 | }
|
333 | 350 | EXPORT_SYMBOL(ksz_switch_remove);
|
334 | 351 |
|
|
0 commit comments