FILE
ps883x.c
File preview with syntax highlighting.
linux-6.19.14/drivers/usb/typec/mux/ps883x.c
1// SPDX-License-Identifier: GPL-2.0+ 2/* 3 * Parade ps883x usb retimer driver 4 * 5 * Copyright (C) 2024 Linaro Ltd. 6 */ 7 8#include <drm/bridge/aux-bridge.h> 9#include <linux/clk.h> 10#include <linux/gpio/consumer.h> 11#include <linux/i2c.h> 12#include <linux/kernel.h> 13#include <linux/module.h> 14#include <linux/mutex.h> 15#include <linux/regmap.h> 16#include <linux/regulator/consumer.h> 17#include <linux/usb/pd.h> 18#include <linux/usb/typec_altmode.h> 19#include <linux/usb/typec_dp.h> 20#include <linux/usb/typec_mux.h> 21#include <linux/usb/typec_retimer.h> 22#include <linux/usb/typec_tbt.h> 23 24#define REG_USB_PORT_CONN_STATUS_0 0x00 25 26#define CONN_STATUS_0_CONNECTION_PRESENT BIT(0) 27#define CONN_STATUS_0_ORIENTATION_REVERSED BIT(1) 28#define CONN_STATUS_0_ACTIVE_CABLE BIT(2) 29#define CONN_STATUS_0_USB_3_1_CONNECTED BIT(5) 30 31#define REG_USB_PORT_CONN_STATUS_1 0x01 32 33#define CONN_STATUS_1_DP_CONNECTED BIT(0) 34#define CONN_STATUS_1_DP_SINK_REQUESTED BIT(1) 35#define CONN_STATUS_1_DP_PIN_ASSIGNMENT_C_D BIT(2) 36#define CONN_STATUS_1_DP_HPD_LEVEL BIT(7) 37 38#define REG_USB_PORT_CONN_STATUS_2 0x02 39 40#define CONN_STATUS_2_TBT_CONNECTED BIT(0) 41#define CONN_STATUS_2_TBT_UNIDIR_LSRX_ACT_LT BIT(4) 42#define CONN_STATUS_2_USB4_CONNECTED BIT(7) 43 44struct ps883x_retimer { 45 struct i2c_client *client; 46 struct gpio_desc *reset_gpio; 47 struct regmap *regmap; 48 struct typec_switch_dev *sw; 49 struct typec_retimer *retimer; 50 struct clk *xo_clk; 51 struct regulator *vdd_supply; 52 struct regulator *vdd33_supply; 53 struct regulator *vdd33_cap_supply; 54 struct regulator *vddat_supply; 55 struct regulator *vddar_supply; 56 struct regulator *vddio_supply; 57 58 struct typec_switch *typec_switch; 59 struct typec_mux *typec_mux; 60 61 struct mutex lock; /* protect non-concurrent retimer & switch */ 62 63 enum typec_orientation orientation; 64 u8 cfg0; 65 u8 cfg1; 66 u8 cfg2; 67}; 68 69static int ps883x_configure(struct ps883x_retimer *retimer, int cfg0, 70 int cfg1, int cfg2) 71{ 72 struct device *dev = &retimer->client->dev; 73 int ret; 74 75 if (retimer->cfg0 == cfg0 && retimer->cfg1 == cfg1 && retimer->cfg2 == cfg2) 76 return 0; 77 78 ret = regmap_write(retimer->regmap, REG_USB_PORT_CONN_STATUS_0, cfg0); 79 if (ret) { 80 dev_err(dev, "failed to write conn_status_0: %d\n", ret); 81 return ret; 82 } 83 84 ret = regmap_write(retimer->regmap, REG_USB_PORT_CONN_STATUS_1, cfg1); 85 if (ret) { 86 dev_err(dev, "failed to write conn_status_1: %d\n", ret); 87 return ret; 88 } 89 90 ret = regmap_write(retimer->regmap, REG_USB_PORT_CONN_STATUS_2, cfg2); 91 if (ret) { 92 dev_err(dev, "failed to write conn_status_2: %d\n", ret); 93 return ret; 94 } 95 96 retimer->cfg0 = cfg0; 97 retimer->cfg1 = cfg1; 98 retimer->cfg2 = cfg2; 99 100 return 0; 101} 102 103static int ps883x_set(struct ps883x_retimer *retimer, struct typec_retimer_state *state) 104{ 105 struct typec_thunderbolt_data *tb_data; 106 const struct enter_usb_data *eudo_data; 107 int cfg0 = CONN_STATUS_0_CONNECTION_PRESENT; 108 int cfg1 = 0x00; 109 int cfg2 = 0x00; 110 111 if (retimer->orientation == TYPEC_ORIENTATION_REVERSE) 112 cfg0 |= CONN_STATUS_0_ORIENTATION_REVERSED; 113 114 if (state->alt) { 115 switch (state->alt->svid) { 116 case USB_TYPEC_DP_SID: 117 cfg1 |= CONN_STATUS_1_DP_CONNECTED | 118 CONN_STATUS_1_DP_HPD_LEVEL; 119 120 switch (state->mode) { 121 case TYPEC_DP_STATE_C: 122 cfg1 |= CONN_STATUS_1_DP_SINK_REQUESTED | 123 CONN_STATUS_1_DP_PIN_ASSIGNMENT_C_D; 124 fallthrough; 125 case TYPEC_DP_STATE_D: 126 cfg1 |= CONN_STATUS_0_USB_3_1_CONNECTED; 127 break; 128 default: /* MODE_E */ 129 break; 130 } 131 break; 132 case USB_TYPEC_TBT_SID: 133 tb_data = state->data; 134 135 /* Unconditional */ 136 cfg2 |= CONN_STATUS_2_TBT_CONNECTED; 137 138 if (tb_data->cable_mode & TBT_CABLE_ACTIVE_PASSIVE) 139 cfg0 |= CONN_STATUS_0_ACTIVE_CABLE; 140 141 if (tb_data->enter_vdo & TBT_ENTER_MODE_UNI_DIR_LSRX) 142 cfg2 |= CONN_STATUS_2_TBT_UNIDIR_LSRX_ACT_LT; 143 break; 144 default: 145 dev_err(&retimer->client->dev, "Got unsupported SID: 0x%x\n", 146 state->alt->svid); 147 return -EOPNOTSUPP; 148 } 149 } else { 150 switch (state->mode) { 151 case TYPEC_STATE_SAFE: 152 /* USB2 pins don't even go through this chip */ 153 case TYPEC_MODE_USB2: 154 break; 155 case TYPEC_STATE_USB: 156 case TYPEC_MODE_USB3: 157 cfg0 |= CONN_STATUS_0_USB_3_1_CONNECTED; 158 break; 159 case TYPEC_MODE_USB4: 160 eudo_data = state->data; 161 162 cfg2 |= CONN_STATUS_2_USB4_CONNECTED; 163 164 if (FIELD_GET(EUDO_CABLE_TYPE_MASK, eudo_data->eudo) != EUDO_CABLE_TYPE_PASSIVE) 165 cfg0 |= CONN_STATUS_0_ACTIVE_CABLE; 166 break; 167 default: 168 dev_err(&retimer->client->dev, "Got unsupported mode: %lu\n", 169 state->mode); 170 return -EOPNOTSUPP; 171 } 172 } 173 174 return ps883x_configure(retimer, cfg0, cfg1, cfg2); 175} 176 177static int ps883x_sw_set(struct typec_switch_dev *sw, 178 enum typec_orientation orientation) 179{ 180 struct ps883x_retimer *retimer = typec_switch_get_drvdata(sw); 181 int ret = 0; 182 183 ret = typec_switch_set(retimer->typec_switch, orientation); 184 if (ret) 185 return ret; 186 187 mutex_lock(&retimer->lock); 188 189 if (retimer->orientation != orientation) { 190 retimer->orientation = orientation; 191 192 ret = regmap_assign_bits(retimer->regmap, REG_USB_PORT_CONN_STATUS_0, 193 CONN_STATUS_0_ORIENTATION_REVERSED, 194 orientation == TYPEC_ORIENTATION_REVERSE); 195 if (ret) 196 dev_err(&retimer->client->dev, "failed to set orientation: %d\n", ret); 197 } 198 199 mutex_unlock(&retimer->lock); 200 201 return ret; 202} 203 204static int ps883x_retimer_set(struct typec_retimer *rtmr, 205 struct typec_retimer_state *state) 206{ 207 struct ps883x_retimer *retimer = typec_retimer_get_drvdata(rtmr); 208 struct typec_mux_state mux_state; 209 int ret = 0; 210 211 mutex_lock(&retimer->lock); 212 ret = ps883x_set(retimer, state); 213 mutex_unlock(&retimer->lock); 214 215 if (ret) 216 return ret; 217 218 mux_state.alt = state->alt; 219 mux_state.data = state->data; 220 mux_state.mode = state->mode; 221 222 return typec_mux_set(retimer->typec_mux, &mux_state); 223} 224 225static int ps883x_enable_vregs(struct ps883x_retimer *retimer) 226{ 227 struct device *dev = &retimer->client->dev; 228 int ret; 229 230 ret = regulator_enable(retimer->vdd33_supply); 231 if (ret) { 232 dev_err(dev, "cannot enable VDD 3.3V regulator: %d\n", ret); 233 return ret; 234 } 235 236 ret = regulator_enable(retimer->vdd33_cap_supply); 237 if (ret) { 238 dev_err(dev, "cannot enable VDD 3.3V CAP regulator: %d\n", ret); 239 goto err_vdd33_disable; 240 } 241 242 usleep_range(4000, 10000); 243 244 ret = regulator_enable(retimer->vdd_supply); 245 if (ret) { 246 dev_err(dev, "cannot enable VDD regulator: %d\n", ret); 247 goto err_vdd33_cap_disable; 248 } 249 250 ret = regulator_enable(retimer->vddar_supply); 251 if (ret) { 252 dev_err(dev, "cannot enable VDD AR regulator: %d\n", ret); 253 goto err_vdd_disable; 254 } 255 256 ret = regulator_enable(retimer->vddat_supply); 257 if (ret) { 258 dev_err(dev, "cannot enable VDD AT regulator: %d\n", ret); 259 goto err_vddar_disable; 260 } 261 262 ret = regulator_enable(retimer->vddio_supply); 263 if (ret) { 264 dev_err(dev, "cannot enable VDD IO regulator: %d\n", ret); 265 goto err_vddat_disable; 266 } 267 268 return 0; 269 270err_vddat_disable: 271 regulator_disable(retimer->vddat_supply); 272err_vddar_disable: 273 regulator_disable(retimer->vddar_supply); 274err_vdd_disable: 275 regulator_disable(retimer->vdd_supply); 276err_vdd33_cap_disable: 277 regulator_disable(retimer->vdd33_cap_supply); 278err_vdd33_disable: 279 regulator_disable(retimer->vdd33_supply); 280 281 return ret; 282} 283 284static void ps883x_disable_vregs(struct ps883x_retimer *retimer) 285{ 286 regulator_disable(retimer->vddio_supply); 287 regulator_disable(retimer->vddat_supply); 288 regulator_disable(retimer->vddar_supply); 289 regulator_disable(retimer->vdd_supply); 290 regulator_disable(retimer->vdd33_cap_supply); 291 regulator_disable(retimer->vdd33_supply); 292} 293 294static int ps883x_get_vregs(struct ps883x_retimer *retimer) 295{ 296 struct device *dev = &retimer->client->dev; 297 298 retimer->vdd_supply = devm_regulator_get(dev, "vdd"); 299 if (IS_ERR(retimer->vdd_supply)) 300 return dev_err_probe(dev, PTR_ERR(retimer->vdd_supply), 301 "failed to get VDD\n"); 302 303 retimer->vdd33_supply = devm_regulator_get(dev, "vdd33"); 304 if (IS_ERR(retimer->vdd33_supply)) 305 return dev_err_probe(dev, PTR_ERR(retimer->vdd33_supply), 306 "failed to get VDD 3.3V\n"); 307 308 retimer->vdd33_cap_supply = devm_regulator_get(dev, "vdd33-cap"); 309 if (IS_ERR(retimer->vdd33_cap_supply)) 310 return dev_err_probe(dev, PTR_ERR(retimer->vdd33_cap_supply), 311 "failed to get VDD CAP 3.3V\n"); 312 313 retimer->vddat_supply = devm_regulator_get(dev, "vddat"); 314 if (IS_ERR(retimer->vddat_supply)) 315 return dev_err_probe(dev, PTR_ERR(retimer->vddat_supply), 316 "failed to get VDD AT\n"); 317 318 retimer->vddar_supply = devm_regulator_get(dev, "vddar"); 319 if (IS_ERR(retimer->vddar_supply)) 320 return dev_err_probe(dev, PTR_ERR(retimer->vddar_supply), 321 "failed to get VDD AR\n"); 322 323 retimer->vddio_supply = devm_regulator_get(dev, "vddio"); 324 if (IS_ERR(retimer->vddio_supply)) 325 return dev_err_probe(dev, PTR_ERR(retimer->vddio_supply), 326 "failed to get VDD IO\n"); 327 328 return 0; 329} 330 331static const struct regmap_config ps883x_retimer_regmap = { 332 .max_register = 0x1f, 333 .reg_bits = 8, 334 .val_bits = 8, 335}; 336 337static int ps883x_retimer_probe(struct i2c_client *client) 338{ 339 struct device *dev = &client->dev; 340 struct typec_switch_desc sw_desc = { }; 341 struct typec_retimer_desc rtmr_desc = { }; 342 struct ps883x_retimer *retimer; 343 unsigned int val; 344 int ret; 345 346 retimer = devm_kzalloc(dev, sizeof(*retimer), GFP_KERNEL); 347 if (!retimer) 348 return -ENOMEM; 349 350 retimer->client = client; 351 352 mutex_init(&retimer->lock); 353 354 retimer->regmap = devm_regmap_init_i2c(client, &ps883x_retimer_regmap); 355 if (IS_ERR(retimer->regmap)) 356 return dev_err_probe(dev, PTR_ERR(retimer->regmap), 357 "failed to allocate register map\n"); 358 359 ret = ps883x_get_vregs(retimer); 360 if (ret) 361 return ret; 362 363 retimer->xo_clk = devm_clk_get(dev, NULL); 364 if (IS_ERR(retimer->xo_clk)) 365 return dev_err_probe(dev, PTR_ERR(retimer->xo_clk), 366 "failed to get xo clock\n"); 367 368 retimer->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_ASIS); 369 if (IS_ERR(retimer->reset_gpio)) 370 return dev_err_probe(dev, PTR_ERR(retimer->reset_gpio), 371 "failed to get reset gpio\n"); 372 373 retimer->typec_switch = typec_switch_get(dev); 374 if (IS_ERR(retimer->typec_switch)) 375 return dev_err_probe(dev, PTR_ERR(retimer->typec_switch), 376 "failed to acquire orientation-switch\n"); 377 378 retimer->typec_mux = typec_mux_get(dev); 379 if (IS_ERR(retimer->typec_mux)) { 380 ret = dev_err_probe(dev, PTR_ERR(retimer->typec_mux), 381 "failed to acquire mode-mux\n"); 382 goto err_switch_put; 383 } 384 385 ret = drm_aux_bridge_register(dev); 386 if (ret) 387 goto err_mux_put; 388 389 ret = ps883x_enable_vregs(retimer); 390 if (ret) 391 goto err_mux_put; 392 393 ret = clk_prepare_enable(retimer->xo_clk); 394 if (ret) { 395 dev_err(dev, "failed to enable XO: %d\n", ret); 396 goto err_vregs_disable; 397 } 398 399 /* skip resetting if already configured */ 400 if (regmap_test_bits(retimer->regmap, REG_USB_PORT_CONN_STATUS_0, 401 CONN_STATUS_0_CONNECTION_PRESENT) == 1) { 402 gpiod_direction_output(retimer->reset_gpio, 0); 403 } else { 404 gpiod_direction_output(retimer->reset_gpio, 1); 405 406 /* VDD IO supply enable to reset release delay */ 407 usleep_range(4000, 14000); 408 409 gpiod_set_value(retimer->reset_gpio, 0); 410 411 /* firmware initialization delay */ 412 msleep(60); 413 414 /* make sure device is accessible */ 415 ret = regmap_read(retimer->regmap, REG_USB_PORT_CONN_STATUS_0, 416 &val); 417 if (ret) { 418 dev_err(dev, "failed to read conn_status_0: %d\n", ret); 419 if (ret == -ENXIO) 420 ret = -EIO; 421 goto err_clk_disable; 422 } 423 } 424 425 sw_desc.drvdata = retimer; 426 sw_desc.fwnode = dev_fwnode(dev); 427 sw_desc.set = ps883x_sw_set; 428 429 retimer->sw = typec_switch_register(dev, &sw_desc); 430 if (IS_ERR(retimer->sw)) { 431 ret = PTR_ERR(retimer->sw); 432 dev_err(dev, "failed to register typec switch: %d\n", ret); 433 goto err_clk_disable; 434 } 435 436 rtmr_desc.drvdata = retimer; 437 rtmr_desc.fwnode = dev_fwnode(dev); 438 rtmr_desc.set = ps883x_retimer_set; 439 440 retimer->retimer = typec_retimer_register(dev, &rtmr_desc); 441 if (IS_ERR(retimer->retimer)) { 442 ret = PTR_ERR(retimer->retimer); 443 dev_err(dev, "failed to register typec retimer: %d\n", ret); 444 goto err_switch_unregister; 445 } 446 447 return 0; 448 449err_switch_unregister: 450 typec_switch_unregister(retimer->sw); 451err_clk_disable: 452 clk_disable_unprepare(retimer->xo_clk); 453err_vregs_disable: 454 gpiod_set_value(retimer->reset_gpio, 1); 455 ps883x_disable_vregs(retimer); 456err_mux_put: 457 typec_mux_put(retimer->typec_mux); 458err_switch_put: 459 typec_switch_put(retimer->typec_switch); 460 461 return ret; 462} 463 464static void ps883x_retimer_remove(struct i2c_client *client) 465{ 466 struct ps883x_retimer *retimer = i2c_get_clientdata(client); 467 468 typec_retimer_unregister(retimer->retimer); 469 typec_switch_unregister(retimer->sw); 470 471 gpiod_set_value(retimer->reset_gpio, 1); 472 473 clk_disable_unprepare(retimer->xo_clk); 474 475 ps883x_disable_vregs(retimer); 476 477 typec_mux_put(retimer->typec_mux); 478 typec_switch_put(retimer->typec_switch); 479} 480 481static const struct of_device_id ps883x_retimer_of_table[] = { 482 { .compatible = "parade,ps8830" }, 483 { } 484}; 485MODULE_DEVICE_TABLE(of, ps883x_retimer_of_table); 486 487static struct i2c_driver ps883x_retimer_driver = { 488 .driver = { 489 .name = "ps883x_retimer", 490 .of_match_table = ps883x_retimer_of_table, 491 }, 492 .probe = ps883x_retimer_probe, 493 .remove = ps883x_retimer_remove, 494}; 495 496module_i2c_driver(ps883x_retimer_driver); 497 498MODULE_DESCRIPTION("Parade ps883x Type-C Retimer driver"); 499MODULE_LICENSE("GPL");
~/
Read-only file preview.