Symbol: hd3ss3220
drivers/usb/typec/hd3ss3220.c
107
dev_err(hd3ss3220->dev, "bad port type: %d\n", type);
drivers/usb/typec/hd3ss3220.c
112
err = regmap_update_bits(hd3ss3220->regmap, HD3SS3220_REG_GEN_CTRL,
drivers/usb/typec/hd3ss3220.c
116
dev_err(hd3ss3220->dev, "Failed to disable port for mode change: %d\n", err);
drivers/usb/typec/hd3ss3220.c
120
err = regmap_update_bits(hd3ss3220->regmap, HD3SS3220_REG_GEN_CTRL,
drivers/usb/typec/hd3ss3220.c
124
dev_err(hd3ss3220->dev, "Failed to change mode: %d\n", err);
drivers/usb/typec/hd3ss3220.c
125
regmap_update_bits(hd3ss3220->regmap, HD3SS3220_REG_GEN_CTRL,
drivers/usb/typec/hd3ss3220.c
130
err = regmap_update_bits(hd3ss3220->regmap, HD3SS3220_REG_GEN_CTRL,
drivers/usb/typec/hd3ss3220.c
133
dev_err(hd3ss3220->dev, "Failed to re-enable port after mode change: %d\n", err);
drivers/usb/typec/hd3ss3220.c
138
static int hd3ss3220_set_source_pref(struct hd3ss3220 *hd3ss3220, int prefer_role)
drivers/usb/typec/hd3ss3220.c
153
dev_err(hd3ss3220->dev, "bad role preference: %d\n", prefer_role);
drivers/usb/typec/hd3ss3220.c
157
return regmap_update_bits(hd3ss3220->regmap, HD3SS3220_REG_GEN_CTRL,
drivers/usb/typec/hd3ss3220.c
162
static enum usb_role hd3ss3220_get_attached_state(struct hd3ss3220 *hd3ss3220)
drivers/usb/typec/hd3ss3220.c
168
ret = regmap_read(hd3ss3220->regmap, HD3SS3220_REG_CN_STAT_CTRL,
drivers/usb/typec/hd3ss3220.c
190
struct hd3ss3220 *hd3ss3220 = typec_get_drvdata(port);
drivers/usb/typec/hd3ss3220.c
192
return hd3ss3220_set_source_pref(hd3ss3220, role);
drivers/usb/typec/hd3ss3220.c
197
struct hd3ss3220 *hd3ss3220 = typec_get_drvdata(port);
drivers/usb/typec/hd3ss3220.c
199
return hd3ss3220_set_port_type(hd3ss3220, type);
drivers/usb/typec/hd3ss3220.c
207
static void hd3ss3220_regulator_control(struct hd3ss3220 *hd3ss3220, bool on)
drivers/usb/typec/hd3ss3220.c
211
if (regulator_is_enabled(hd3ss3220->vbus) == on)
drivers/usb/typec/hd3ss3220.c
215
ret = regulator_enable(hd3ss3220->vbus);
drivers/usb/typec/hd3ss3220.c
217
ret = regulator_disable(hd3ss3220->vbus);
drivers/usb/typec/hd3ss3220.c
220
dev_err(hd3ss3220->dev,
drivers/usb/typec/hd3ss3220.c
224
static void hd3ss3220_set_role(struct hd3ss3220 *hd3ss3220)
drivers/usb/typec/hd3ss3220.c
226
enum usb_role role_state = hd3ss3220_get_attached_state(hd3ss3220);
drivers/usb/typec/hd3ss3220.c
228
usb_role_switch_set_role(hd3ss3220->role_sw, role_state);
drivers/usb/typec/hd3ss3220.c
232
typec_set_data_role(hd3ss3220->port, TYPEC_HOST);
drivers/usb/typec/hd3ss3220.c
235
typec_set_data_role(hd3ss3220->port, TYPEC_DEVICE);
drivers/usb/typec/hd3ss3220.c
241
if (hd3ss3220->vbus && !hd3ss3220->id_gpiod)
drivers/usb/typec/hd3ss3220.c
242
hd3ss3220_regulator_control(hd3ss3220, role_state == USB_ROLE_HOST);
drivers/usb/typec/hd3ss3220.c
244
hd3ss3220->role_state = role_state;
drivers/usb/typec/hd3ss3220.c
250
struct hd3ss3220 *hd3ss3220 = container_of(delayed_work,
drivers/usb/typec/hd3ss3220.c
251
struct hd3ss3220,
drivers/usb/typec/hd3ss3220.c
253
enum usb_role role_state = hd3ss3220_get_attached_state(hd3ss3220);
drivers/usb/typec/hd3ss3220.c
255
if (hd3ss3220->role_state != role_state)
drivers/usb/typec/hd3ss3220.c
256
hd3ss3220_set_role(hd3ss3220);
drivers/usb/typec/hd3ss3220.c
258
schedule_delayed_work(&hd3ss3220->output_poll_work, HZ);
drivers/usb/typec/hd3ss3220.c
261
static irqreturn_t hd3ss3220_irq(struct hd3ss3220 *hd3ss3220)
drivers/usb/typec/hd3ss3220.c
265
hd3ss3220_set_role(hd3ss3220);
drivers/usb/typec/hd3ss3220.c
266
err = regmap_write_bits(hd3ss3220->regmap, HD3SS3220_REG_CN_STAT_CTRL,
drivers/usb/typec/hd3ss3220.c
278
struct hd3ss3220 *hd3ss3220 = i2c_get_clientdata(client);
drivers/usb/typec/hd3ss3220.c
280
return hd3ss3220_irq(hd3ss3220);
drivers/usb/typec/hd3ss3220.c
283
static int hd3ss3220_configure_power_opmode(struct hd3ss3220 *hd3ss3220,
drivers/usb/typec/hd3ss3220.c
297
return hd3ss3220_set_power_opmode(hd3ss3220, power_opmode);
drivers/usb/typec/hd3ss3220.c
300
static int hd3ss3220_configure_port_type(struct hd3ss3220 *hd3ss3220,
drivers/usb/typec/hd3ss3220.c
319
return hd3ss3220_set_port_type(hd3ss3220, cap->type);
drivers/usb/typec/hd3ss3220.c
322
static int hd3ss3220_configure_source_pref(struct hd3ss3220 *hd3ss3220,
drivers/usb/typec/hd3ss3220.c
341
return hd3ss3220_set_source_pref(hd3ss3220, cap->prefer_role);
drivers/usb/typec/hd3ss3220.c
352
struct hd3ss3220 *hd3ss3220 = dev_id;
drivers/usb/typec/hd3ss3220.c
355
id = gpiod_get_value_cansleep(hd3ss3220->id_gpiod);
drivers/usb/typec/hd3ss3220.c
356
hd3ss3220_regulator_control(hd3ss3220, !id);
drivers/usb/typec/hd3ss3220.c
365
struct hd3ss3220 *hd3ss3220;
drivers/usb/typec/hd3ss3220.c
370
hd3ss3220 = devm_kzalloc(&client->dev, sizeof(struct hd3ss3220),
drivers/usb/typec/hd3ss3220.c
372
if (!hd3ss3220)
drivers/usb/typec/hd3ss3220.c
375
i2c_set_clientdata(client, hd3ss3220);
drivers/usb/typec/hd3ss3220.c
377
hd3ss3220->dev = &client->dev;
drivers/usb/typec/hd3ss3220.c
378
hd3ss3220->regmap = devm_regmap_init_i2c(client, &config);
drivers/usb/typec/hd3ss3220.c
379
if (IS_ERR(hd3ss3220->regmap))
drivers/usb/typec/hd3ss3220.c
380
return PTR_ERR(hd3ss3220->regmap);
drivers/usb/typec/hd3ss3220.c
383
connector = device_get_named_child_node(hd3ss3220->dev, "connector");
drivers/usb/typec/hd3ss3220.c
385
hd3ss3220->role_sw = fwnode_usb_role_switch_get(connector);
drivers/usb/typec/hd3ss3220.c
387
ep = fwnode_graph_get_next_endpoint(dev_fwnode(hd3ss3220->dev), NULL);
drivers/usb/typec/hd3ss3220.c
394
hd3ss3220->role_sw = usb_role_switch_get(hd3ss3220->dev);
drivers/usb/typec/hd3ss3220.c
397
if (IS_ERR(hd3ss3220->role_sw)) {
drivers/usb/typec/hd3ss3220.c
398
ret = PTR_ERR(hd3ss3220->role_sw);
drivers/usb/typec/hd3ss3220.c
402
vbus = devm_of_regulator_get_optional(hd3ss3220->dev,
drivers/usb/typec/hd3ss3220.c
407
dev_err(hd3ss3220->dev, "failed to get vbus: %d", ret);
drivers/usb/typec/hd3ss3220.c
411
hd3ss3220->vbus = (vbus == ERR_PTR(-ENODEV) ? NULL : vbus);
drivers/usb/typec/hd3ss3220.c
413
if (hd3ss3220->vbus) {
drivers/usb/typec/hd3ss3220.c
414
hd3ss3220->id_gpiod = devm_gpiod_get_optional(hd3ss3220->dev,
drivers/usb/typec/hd3ss3220.c
417
if (IS_ERR(hd3ss3220->id_gpiod)) {
drivers/usb/typec/hd3ss3220.c
418
ret = PTR_ERR(hd3ss3220->id_gpiod);
drivers/usb/typec/hd3ss3220.c
423
if (hd3ss3220->id_gpiod) {
drivers/usb/typec/hd3ss3220.c
424
hd3ss3220->id_irq = gpiod_to_irq(hd3ss3220->id_gpiod);
drivers/usb/typec/hd3ss3220.c
425
if (hd3ss3220->id_irq < 0) {
drivers/usb/typec/hd3ss3220.c
426
ret = hd3ss3220->id_irq;
drivers/usb/typec/hd3ss3220.c
427
dev_err(hd3ss3220->dev,
drivers/usb/typec/hd3ss3220.c
429
hd3ss3220->id_irq);
drivers/usb/typec/hd3ss3220.c
433
ret = devm_request_threaded_irq(hd3ss3220->dev,
drivers/usb/typec/hd3ss3220.c
434
hd3ss3220->id_irq, NULL,
drivers/usb/typec/hd3ss3220.c
438
dev_name(hd3ss3220->dev), hd3ss3220);
drivers/usb/typec/hd3ss3220.c
440
dev_err(hd3ss3220->dev, "failed to get ID irq: %d\n", ret);
drivers/usb/typec/hd3ss3220.c
446
typec_cap.driver_data = hd3ss3220;
drivers/usb/typec/hd3ss3220.c
452
ret = hd3ss3220_configure_source_pref(hd3ss3220, connector, &typec_cap);
drivers/usb/typec/hd3ss3220.c
456
ret = hd3ss3220_configure_port_type(hd3ss3220, connector, &typec_cap);
drivers/usb/typec/hd3ss3220.c
460
hd3ss3220->port = typec_register_port(&client->dev, &typec_cap);
drivers/usb/typec/hd3ss3220.c
461
if (IS_ERR(hd3ss3220->port)) {
drivers/usb/typec/hd3ss3220.c
462
ret = PTR_ERR(hd3ss3220->port);
drivers/usb/typec/hd3ss3220.c
466
ret = hd3ss3220_configure_power_opmode(hd3ss3220, connector);
drivers/usb/typec/hd3ss3220.c
470
hd3ss3220_set_role(hd3ss3220);
drivers/usb/typec/hd3ss3220.c
471
ret = regmap_read(hd3ss3220->regmap, HD3SS3220_REG_CN_STAT_CTRL, &data);
drivers/usb/typec/hd3ss3220.c
476
ret = regmap_write(hd3ss3220->regmap,
drivers/usb/typec/hd3ss3220.c
491
INIT_DELAYED_WORK(&hd3ss3220->output_poll_work, output_poll_execute);
drivers/usb/typec/hd3ss3220.c
492
hd3ss3220->poll = true;
drivers/usb/typec/hd3ss3220.c
501
if (hd3ss3220->poll)
drivers/usb/typec/hd3ss3220.c
502
schedule_delayed_work(&hd3ss3220->output_poll_work, HZ);
drivers/usb/typec/hd3ss3220.c
508
typec_unregister_port(hd3ss3220->port);
drivers/usb/typec/hd3ss3220.c
510
usb_role_switch_put(hd3ss3220->role_sw);
drivers/usb/typec/hd3ss3220.c
519
struct hd3ss3220 *hd3ss3220 = i2c_get_clientdata(client);
drivers/usb/typec/hd3ss3220.c
521
if (hd3ss3220->poll)
drivers/usb/typec/hd3ss3220.c
522
cancel_delayed_work_sync(&hd3ss3220->output_poll_work);
drivers/usb/typec/hd3ss3220.c
524
typec_unregister_port(hd3ss3220->port);
drivers/usb/typec/hd3ss3220.c
525
usb_role_switch_put(hd3ss3220->role_sw);
drivers/usb/typec/hd3ss3220.c
67
static int hd3ss3220_set_power_opmode(struct hd3ss3220 *hd3ss3220, int power_opmode)
drivers/usb/typec/hd3ss3220.c
83
dev_err(hd3ss3220->dev, "bad power operation mode: %d\n", power_opmode);
drivers/usb/typec/hd3ss3220.c
87
return regmap_update_bits(hd3ss3220->regmap, HD3SS3220_REG_CN_STAT,
drivers/usb/typec/hd3ss3220.c
92
static int hd3ss3220_set_port_type(struct hd3ss3220 *hd3ss3220, int type)