| .. | .. |
|---|
| 90 | 90 | struct clk *pclk; |
|---|
| 91 | 91 | struct clk *ref_clk; |
|---|
| 92 | 92 | struct reset_control *rstc; |
|---|
| 93 | | - enum phy_mode mode; |
|---|
| 94 | 93 | unsigned int flags; |
|---|
| 95 | 94 | |
|---|
| 96 | 95 | u16 frac_div; |
|---|
| .. | .. |
|---|
| 229 | 228 | |
|---|
| 230 | 229 | return 0; |
|---|
| 231 | 230 | } |
|---|
| 231 | +EXPORT_SYMBOL(rk628_combtxphy_set_gvi_division_mode); |
|---|
| 232 | 232 | |
|---|
| 233 | 233 | static int rk628_combtxphy_power_on(struct phy *phy) |
|---|
| 234 | 234 | { |
|---|
| 235 | 235 | struct rk628_combtxphy *combtxphy = phy_get_drvdata(phy); |
|---|
| 236 | + enum phy_mode mode = phy_get_mode(phy); |
|---|
| 236 | 237 | |
|---|
| 237 | 238 | clk_prepare_enable(combtxphy->pclk); |
|---|
| 238 | 239 | reset_control_assert(combtxphy->rstc); |
|---|
| .. | .. |
|---|
| 247 | 248 | SW_TX_IDLE_MASK | SW_TX_PD_MASK | SW_PD_PLL_MASK, |
|---|
| 248 | 249 | SW_TX_IDLE(0x3ff) | SW_TX_PD(0x3ff) | SW_PD_PLL); |
|---|
| 249 | 250 | |
|---|
| 250 | | - switch (combtxphy->mode) { |
|---|
| 251 | | - case PHY_MODE_VIDEO_MIPI: |
|---|
| 251 | + switch (mode) { |
|---|
| 252 | + case PHY_MODE_MIPI_DPHY: |
|---|
| 252 | 253 | regmap_update_bits(combtxphy->grf, GRF_POST_PROC_CON, |
|---|
| 253 | 254 | SW_TXPHY_REFCLK_SEL_MASK, |
|---|
| 254 | 255 | SW_TXPHY_REFCLK_SEL(0)); |
|---|
| 255 | 256 | return rk628_combtxphy_dsi_power_on(combtxphy); |
|---|
| 256 | | - case PHY_MODE_VIDEO_LVDS: |
|---|
| 257 | + case PHY_MODE_LVDS: |
|---|
| 257 | 258 | regmap_update_bits(combtxphy->grf, GRF_POST_PROC_CON, |
|---|
| 258 | 259 | SW_TXPHY_REFCLK_SEL_MASK, |
|---|
| 259 | 260 | SW_TXPHY_REFCLK_SEL(1)); |
|---|
| 260 | 261 | return rk628_combtxphy_lvds_power_on(combtxphy); |
|---|
| 261 | | - case PHY_MODE_GVI: |
|---|
| 262 | + default: |
|---|
| 262 | 263 | regmap_update_bits(combtxphy->grf, GRF_POST_PROC_CON, |
|---|
| 263 | 264 | SW_TXPHY_REFCLK_SEL_MASK, |
|---|
| 264 | 265 | SW_TXPHY_REFCLK_SEL(2)); |
|---|
| 265 | 266 | return rk628_combtxphy_gvi_power_on(combtxphy); |
|---|
| 266 | | - default: |
|---|
| 267 | | - return -EINVAL; |
|---|
| 268 | 267 | } |
|---|
| 269 | 268 | |
|---|
| 270 | 269 | return 0; |
|---|
| .. | .. |
|---|
| 284 | 283 | return 0; |
|---|
| 285 | 284 | } |
|---|
| 286 | 285 | |
|---|
| 287 | | -static int rk628_combtxphy_set_mode(struct phy *phy, enum phy_mode mode) |
|---|
| 286 | +static int rk628_combtxphy_set_mode(struct phy *phy, enum phy_mode mode, |
|---|
| 287 | + int submode) |
|---|
| 288 | 288 | { |
|---|
| 289 | 289 | struct rk628_combtxphy *combtxphy = phy_get_drvdata(phy); |
|---|
| 290 | 290 | unsigned int bus_width = phy_get_bus_width(phy); |
|---|
| .. | .. |
|---|
| 292 | 292 | unsigned long fvco, fpfd; |
|---|
| 293 | 293 | |
|---|
| 294 | 294 | switch (mode) { |
|---|
| 295 | | - case PHY_MODE_VIDEO_MIPI: |
|---|
| 295 | + case PHY_MODE_MIPI_DPHY: |
|---|
| 296 | 296 | { |
|---|
| 297 | 297 | unsigned int fhsc = bus_width >> 8; |
|---|
| 298 | 298 | unsigned int flags = bus_width & 0xff; |
|---|
| .. | .. |
|---|
| 330 | 330 | phy_set_bus_width(phy, fhsc); |
|---|
| 331 | 331 | break; |
|---|
| 332 | 332 | } |
|---|
| 333 | | - case PHY_MODE_VIDEO_LVDS: |
|---|
| 333 | + case PHY_MODE_LVDS: |
|---|
| 334 | 334 | { |
|---|
| 335 | 335 | unsigned int flags = bus_width & 0xff; |
|---|
| 336 | 336 | unsigned int rate = (bus_width >> 8) * 7; |
|---|
| .. | .. |
|---|
| 348 | 348 | combtxphy->rate_div = 1; |
|---|
| 349 | 349 | break; |
|---|
| 350 | 350 | } |
|---|
| 351 | | - case PHY_MODE_GVI: |
|---|
| 351 | + default: |
|---|
| 352 | 352 | { |
|---|
| 353 | 353 | unsigned int i, delta_freq, best_delta_freq, fb_div; |
|---|
| 354 | 354 | unsigned long ref_clk; |
|---|
| .. | .. |
|---|
| 366 | 366 | ref_clk = clk_get_rate(combtxphy->ref_clk) / 1000; /* khz */ |
|---|
| 367 | 367 | if (combtxphy->division_mode) |
|---|
| 368 | 368 | ref_clk /= 2; |
|---|
| 369 | + |
|---|
| 370 | + if (!ref_clk) |
|---|
| 371 | + return -EINVAL; |
|---|
| 372 | + |
|---|
| 369 | 373 | /* |
|---|
| 370 | 374 | * the reference clock at PFD(FPFD = ref_clk / ref_div) about |
|---|
| 371 | 375 | * 25MHz is recommende, FPFD must range from 16MHz to 35MHz, |
|---|
| .. | .. |
|---|
| 399 | 403 | combtxphy->fb_div = fb_div; |
|---|
| 400 | 404 | |
|---|
| 401 | 405 | phy_set_bus_width(phy, bus_width); |
|---|
| 402 | | - |
|---|
| 403 | 406 | break; |
|---|
| 404 | 407 | } |
|---|
| 405 | | - default: |
|---|
| 406 | | - return -EINVAL; |
|---|
| 407 | 408 | } |
|---|
| 408 | | - |
|---|
| 409 | | - combtxphy->mode = mode; |
|---|
| 410 | 409 | |
|---|
| 411 | 410 | return 0; |
|---|
| 412 | 411 | } |
|---|