onboard_dev
err = regulator_bulk_enable(onboard_dev->pdata->num_supplies,
onboard_dev->supplies);
dev_err(onboard_dev->dev, "failed to enable supplies: %pe\n",
fsleep(onboard_dev->pdata->reset_us);
gpiod_set_value_cansleep(onboard_dev->reset_gpio, 0);
fsleep(onboard_dev->pdata->power_on_delay_us);
onboard_dev->is_powered_on = true;
clk_disable_unprepare(onboard_dev->clk);
static int onboard_dev_power_off(struct onboard_dev *onboard_dev)
gpiod_set_value_cansleep(onboard_dev->reset_gpio, 1);
err = regulator_bulk_disable(onboard_dev->pdata->num_supplies,
onboard_dev->supplies);
dev_err(onboard_dev->dev, "failed to disable supplies: %pe\n",
clk_disable_unprepare(onboard_dev->clk);
onboard_dev->is_powered_on = false;
struct onboard_dev *onboard_dev = dev_get_drvdata(dev);
if (onboard_dev->always_powered_in_suspend)
mutex_lock(&onboard_dev->lock);
list_for_each_entry(node, &onboard_dev->udev_list, list) {
mutex_unlock(&onboard_dev->lock);
return onboard_dev_power_off(onboard_dev);
struct onboard_dev *onboard_dev = dev_get_drvdata(dev);
if (onboard_dev->is_powered_on)
return onboard_dev_power_on(onboard_dev);
static int onboard_dev_add_usbdev(struct onboard_dev *onboard_dev,
mutex_lock(&onboard_dev->lock);
if (onboard_dev->going_away) {
list_add(&node->list, &onboard_dev->udev_list);
mutex_unlock(&onboard_dev->lock);
WARN_ON(sysfs_create_link(&onboard_dev->dev->kobj, &udev->dev.kobj,
mutex_unlock(&onboard_dev->lock);
static void onboard_dev_remove_usbdev(struct onboard_dev *onboard_dev,
sysfs_remove_link(&onboard_dev->dev->kobj, link_name);
mutex_lock(&onboard_dev->lock);
list_for_each_entry(node, &onboard_dev->udev_list, list) {
mutex_unlock(&onboard_dev->lock);
const struct onboard_dev *onboard_dev = dev_get_drvdata(dev);
return sysfs_emit(buf, "%d\n", onboard_dev->always_powered_in_suspend);
struct onboard_dev *onboard_dev = dev_get_drvdata(dev);
onboard_dev->always_powered_in_suspend = val;
struct onboard_dev *onboard_dev = dev_get_drvdata(dev);
!onboard_dev->pdata->is_hub)
__ATTRIBUTE_GROUPS(onboard_dev);
struct onboard_dev *onboard_dev;
onboard_dev = devm_kzalloc(dev, sizeof(*onboard_dev), GFP_KERNEL);
if (!onboard_dev)
onboard_dev->pdata = device_get_match_data(dev);
if (!onboard_dev->pdata)
if (!onboard_dev->pdata->is_hub)
onboard_dev->always_powered_in_suspend = true;
onboard_dev->dev = dev;
err = onboard_dev_get_regulators(onboard_dev);
onboard_dev->clk = devm_clk_get_optional(dev, NULL);
if (IS_ERR(onboard_dev->clk))
return dev_err_probe(dev, PTR_ERR(onboard_dev->clk),
onboard_dev->reset_gpio = devm_gpiod_get_optional(dev, "reset",
if (IS_ERR(onboard_dev->reset_gpio))
return dev_err_probe(dev, PTR_ERR(onboard_dev->reset_gpio),
mutex_init(&onboard_dev->lock);
INIT_LIST_HEAD(&onboard_dev->udev_list);
dev_set_drvdata(dev, onboard_dev);
err = onboard_dev_power_on(onboard_dev);
onboard_dev->always_powered_in_suspend = true;
onboard_dev_power_off(onboard_dev);
struct onboard_dev *onboard_dev = dev_get_drvdata(&pdev->dev);
onboard_dev->going_away = true;
mutex_lock(&onboard_dev->lock);
while (!list_empty(&onboard_dev->udev_list)) {
node = list_first_entry(&onboard_dev->udev_list,
mutex_unlock(&onboard_dev->lock);
mutex_lock(&onboard_dev->lock);
mutex_unlock(&onboard_dev->lock);
onboard_dev_power_off(onboard_dev);
static struct onboard_dev *_find_onboard_dev(struct device *dev)
struct onboard_dev *onboard_dev;
onboard_dev = dev_get_drvdata(&pdev->dev);
if (!onboard_dev)
return onboard_dev;
struct onboard_dev *onboard_dev;
onboard_dev = _find_onboard_dev(dev);
if (IS_ERR(onboard_dev))
return PTR_ERR(onboard_dev);
dev_set_drvdata(dev, onboard_dev);
err = onboard_dev_add_usbdev(onboard_dev, udev);
struct onboard_dev *onboard_dev = dev_get_drvdata(&udev->dev);
onboard_dev_remove_usbdev(onboard_dev, udev);
static int onboard_dev_get_regulators(struct onboard_dev *onboard_dev)
const char * const *supply_names = onboard_dev->pdata->supply_names;
unsigned int num_supplies = onboard_dev->pdata->num_supplies;
struct device *dev = onboard_dev->dev;
onboard_dev->supplies[i].supply = supply_names[i];
err = devm_regulator_bulk_get(dev, num_supplies, onboard_dev->supplies);
static int onboard_dev_power_on(struct onboard_dev *onboard_dev)
err = clk_prepare_enable(onboard_dev->clk);
dev_err(onboard_dev->dev, "failed to enable clock: %pe\n",