Is it possible to turn off a specific USB port so it doesn't accept any device?

I have a lot of ports on my computer. I would like to turn off one of them, so when I connect my phone to that port, it only charges. I do want my phone to work with my computer in some occasions though, so I hope other ports are not affected.

I would just like to know how possible this is.


First, run lsusb.

The output should be like:

Bus 001 Device 002: ID 8087:0020 Intel Corp. Integrated Rate Matching Hub
Bus 002 Device 002: ID 8087:0020 Intel Corp. Integrated Rate Matching Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 2232:1020  
Bus 002 Device 009: ID 0bc2:a013 Seagate RSS LLC 
Bus 002 Device 003: ID 0a5c:219c Broadcom Corp. 

In the output, find the device number of the port to be disabled. For example, the Seagate drive in the example has Device 009 - that is its device number. Then the id will be usb[device number] - such as usb9

Then, disable USB wake-up (do this only once):

Be sure to replace X in usbX with the device number.

echo disabled | sudo tee /sys/bus/usb/devices/usbX/power/wakeup 

Then turn it off:

echo suspend | sudo tee /sys/bus/usb/devices/usbX/power/level

Undo this:

echo enabled | sudo tee /sys/bus/usb/devices/usbX/power/wakeup
echo on | sudo tee /sys/bus/usb/devices/usbX/power/level

Here is a plug & play (literally) option:

charge only usb dongle

It's a good idea if you want to avoid pop-up messages and file browsers every time you plug your phone in for charging only.

This is also more fool-proof than the software approach because software that turns off the port for data can be reversed by software that turns it back on. Or it might be reinitialized during suspend/resume or some other process you didn't foresee.