linux/drivers/staging/greybus/svc.c
<<
>>
Prefs
   1/*
   2 * SVC Greybus driver.
   3 *
   4 * Copyright 2015 Google Inc.
   5 * Copyright 2015 Linaro Ltd.
   6 *
   7 * Released under the GPLv2 only.
   8 */
   9
  10#include <linux/debugfs.h>
  11#include <linux/workqueue.h>
  12
  13#include "greybus.h"
  14
  15#define SVC_INTF_EJECT_TIMEOUT          9000
  16#define SVC_INTF_ACTIVATE_TIMEOUT       6000
  17#define SVC_INTF_RESUME_TIMEOUT         3000
  18
  19struct gb_svc_deferred_request {
  20        struct work_struct work;
  21        struct gb_operation *operation;
  22};
  23
  24
  25static int gb_svc_queue_deferred_request(struct gb_operation *operation);
  26
  27static ssize_t endo_id_show(struct device *dev,
  28                        struct device_attribute *attr, char *buf)
  29{
  30        struct gb_svc *svc = to_gb_svc(dev);
  31
  32        return sprintf(buf, "0x%04x\n", svc->endo_id);
  33}
  34static DEVICE_ATTR_RO(endo_id);
  35
  36static ssize_t ap_intf_id_show(struct device *dev,
  37                        struct device_attribute *attr, char *buf)
  38{
  39        struct gb_svc *svc = to_gb_svc(dev);
  40
  41        return sprintf(buf, "%u\n", svc->ap_intf_id);
  42}
  43static DEVICE_ATTR_RO(ap_intf_id);
  44
  45// FIXME
  46// This is a hack, we need to do this "right" and clean the interface up
  47// properly, not just forcibly yank the thing out of the system and hope for the
  48// best.  But for now, people want their modules to come out without having to
  49// throw the thing to the ground or get out a screwdriver.
  50static ssize_t intf_eject_store(struct device *dev,
  51                                struct device_attribute *attr, const char *buf,
  52                                size_t len)
  53{
  54        struct gb_svc *svc = to_gb_svc(dev);
  55        unsigned short intf_id;
  56        int ret;
  57
  58        ret = kstrtou16(buf, 10, &intf_id);
  59        if (ret < 0)
  60                return ret;
  61
  62        dev_warn(dev, "Forcibly trying to eject interface %d\n", intf_id);
  63
  64        ret = gb_svc_intf_eject(svc, intf_id);
  65        if (ret < 0)
  66                return ret;
  67
  68        return len;
  69}
  70static DEVICE_ATTR_WO(intf_eject);
  71
  72static ssize_t watchdog_show(struct device *dev, struct device_attribute *attr,
  73                             char *buf)
  74{
  75        struct gb_svc *svc = to_gb_svc(dev);
  76
  77        return sprintf(buf, "%s\n",
  78                       gb_svc_watchdog_enabled(svc) ? "enabled" : "disabled");
  79}
  80
  81static ssize_t watchdog_store(struct device *dev,
  82                              struct device_attribute *attr, const char *buf,
  83                              size_t len)
  84{
  85        struct gb_svc *svc = to_gb_svc(dev);
  86        int retval;
  87        bool user_request;
  88
  89        retval = strtobool(buf, &user_request);
  90        if (retval)
  91                return retval;
  92
  93        if (user_request)
  94                retval = gb_svc_watchdog_enable(svc);
  95        else
  96                retval = gb_svc_watchdog_disable(svc);
  97        if (retval)
  98                return retval;
  99        return len;
 100}
 101static DEVICE_ATTR_RW(watchdog);
 102
 103static ssize_t watchdog_action_show(struct device *dev,
 104                                    struct device_attribute *attr, char *buf)
 105{
 106        struct gb_svc *svc = to_gb_svc(dev);
 107
 108        if (svc->action == GB_SVC_WATCHDOG_BITE_PANIC_KERNEL)
 109                return sprintf(buf, "panic\n");
 110        else if (svc->action == GB_SVC_WATCHDOG_BITE_RESET_UNIPRO)
 111                return sprintf(buf, "reset\n");
 112
 113        return -EINVAL;
 114}
 115
 116static ssize_t watchdog_action_store(struct device *dev,
 117                                     struct device_attribute *attr,
 118                                     const char *buf, size_t len)
 119{
 120        struct gb_svc *svc = to_gb_svc(dev);
 121
 122        if (sysfs_streq(buf, "panic"))
 123                svc->action = GB_SVC_WATCHDOG_BITE_PANIC_KERNEL;
 124        else if (sysfs_streq(buf, "reset"))
 125                svc->action = GB_SVC_WATCHDOG_BITE_RESET_UNIPRO;
 126        else
 127                return -EINVAL;
 128
 129        return len;
 130}
 131static DEVICE_ATTR_RW(watchdog_action);
 132
 133static int gb_svc_pwrmon_rail_count_get(struct gb_svc *svc, u8 *value)
 134{
 135        struct gb_svc_pwrmon_rail_count_get_response response;
 136        int ret;
 137
 138        ret = gb_operation_sync(svc->connection,
 139                                GB_SVC_TYPE_PWRMON_RAIL_COUNT_GET, NULL, 0,
 140                                &response, sizeof(response));
 141        if (ret) {
 142                dev_err(&svc->dev, "failed to get rail count: %d\n", ret);
 143                return ret;
 144        }
 145
 146        *value = response.rail_count;
 147
 148        return 0;
 149}
 150
 151static int gb_svc_pwrmon_rail_names_get(struct gb_svc *svc,
 152                struct gb_svc_pwrmon_rail_names_get_response *response,
 153                size_t bufsize)
 154{
 155        int ret;
 156
 157        ret = gb_operation_sync(svc->connection,
 158                                GB_SVC_TYPE_PWRMON_RAIL_NAMES_GET, NULL, 0,
 159                                response, bufsize);
 160        if (ret) {
 161                dev_err(&svc->dev, "failed to get rail names: %d\n", ret);
 162                return ret;
 163        }
 164
 165        if (response->status != GB_SVC_OP_SUCCESS) {
 166                dev_err(&svc->dev,
 167                        "SVC error while getting rail names: %u\n",
 168                        response->status);
 169                return -EREMOTEIO;
 170        }
 171
 172        return 0;
 173}
 174
 175static int gb_svc_pwrmon_sample_get(struct gb_svc *svc, u8 rail_id,
 176                                    u8 measurement_type, u32 *value)
 177{
 178        struct gb_svc_pwrmon_sample_get_request request;
 179        struct gb_svc_pwrmon_sample_get_response response;
 180        int ret;
 181
 182        request.rail_id = rail_id;
 183        request.measurement_type = measurement_type;
 184
 185        ret = gb_operation_sync(svc->connection, GB_SVC_TYPE_PWRMON_SAMPLE_GET,
 186                                &request, sizeof(request),
 187                                &response, sizeof(response));
 188        if (ret) {
 189                dev_err(&svc->dev, "failed to get rail sample: %d\n", ret);
 190                return ret;
 191        }
 192
 193        if (response.result) {
 194                dev_err(&svc->dev,
 195                        "UniPro error while getting rail power sample (%d %d): %d\n",
 196                        rail_id, measurement_type, response.result);
 197                switch (response.result) {
 198                case GB_SVC_PWRMON_GET_SAMPLE_INVAL:
 199                        return -EINVAL;
 200                case GB_SVC_PWRMON_GET_SAMPLE_NOSUPP:
 201                        return -ENOMSG;
 202                default:
 203                        return -EREMOTEIO;
 204                }
 205        }
 206
 207        *value = le32_to_cpu(response.measurement);
 208
 209        return 0;
 210}
 211
 212int gb_svc_pwrmon_intf_sample_get(struct gb_svc *svc, u8 intf_id,
 213                                  u8 measurement_type, u32 *value)
 214{
 215        struct gb_svc_pwrmon_intf_sample_get_request request;
 216        struct gb_svc_pwrmon_intf_sample_get_response response;
 217        int ret;
 218
 219        request.intf_id = intf_id;
 220        request.measurement_type = measurement_type;
 221
 222        ret = gb_operation_sync(svc->connection,
 223                                GB_SVC_TYPE_PWRMON_INTF_SAMPLE_GET,
 224                                &request, sizeof(request),
 225                                &response, sizeof(response));
 226        if (ret) {
 227                dev_err(&svc->dev, "failed to get intf sample: %d\n", ret);
 228                return ret;
 229        }
 230
 231        if (response.result) {
 232                dev_err(&svc->dev,
 233                        "UniPro error while getting intf power sample (%d %d): %d\n",
 234                        intf_id, measurement_type, response.result);
 235                switch (response.result) {
 236                case GB_SVC_PWRMON_GET_SAMPLE_INVAL:
 237                        return -EINVAL;
 238                case GB_SVC_PWRMON_GET_SAMPLE_NOSUPP:
 239                        return -ENOMSG;
 240                default:
 241                        return -EREMOTEIO;
 242                }
 243        }
 244
 245        *value = le32_to_cpu(response.measurement);
 246
 247        return 0;
 248}
 249
 250static struct attribute *svc_attrs[] = {
 251        &dev_attr_endo_id.attr,
 252        &dev_attr_ap_intf_id.attr,
 253        &dev_attr_intf_eject.attr,
 254        &dev_attr_watchdog.attr,
 255        &dev_attr_watchdog_action.attr,
 256        NULL,
 257};
 258ATTRIBUTE_GROUPS(svc);
 259
 260int gb_svc_intf_device_id(struct gb_svc *svc, u8 intf_id, u8 device_id)
 261{
 262        struct gb_svc_intf_device_id_request request;
 263
 264        request.intf_id = intf_id;
 265        request.device_id = device_id;
 266
 267        return gb_operation_sync(svc->connection, GB_SVC_TYPE_INTF_DEVICE_ID,
 268                                 &request, sizeof(request), NULL, 0);
 269}
 270
 271int gb_svc_intf_eject(struct gb_svc *svc, u8 intf_id)
 272{
 273        struct gb_svc_intf_eject_request request;
 274        int ret;
 275
 276        request.intf_id = intf_id;
 277
 278        /*
 279         * The pulse width for module release in svc is long so we need to
 280         * increase the timeout so the operation will not return to soon.
 281         */
 282        ret = gb_operation_sync_timeout(svc->connection,
 283                                        GB_SVC_TYPE_INTF_EJECT, &request,
 284                                        sizeof(request), NULL, 0,
 285                                        SVC_INTF_EJECT_TIMEOUT);
 286        if (ret) {
 287                dev_err(&svc->dev, "failed to eject interface %u\n", intf_id);
 288                return ret;
 289        }
 290
 291        return 0;
 292}
 293
 294int gb_svc_intf_vsys_set(struct gb_svc *svc, u8 intf_id, bool enable)
 295{
 296        struct gb_svc_intf_vsys_request request;
 297        struct gb_svc_intf_vsys_response response;
 298        int type, ret;
 299
 300        request.intf_id = intf_id;
 301
 302        if (enable)
 303                type = GB_SVC_TYPE_INTF_VSYS_ENABLE;
 304        else
 305                type = GB_SVC_TYPE_INTF_VSYS_DISABLE;
 306
 307        ret = gb_operation_sync(svc->connection, type,
 308                        &request, sizeof(request),
 309                        &response, sizeof(response));
 310        if (ret < 0)
 311                return ret;
 312        if (response.result_code != GB_SVC_INTF_VSYS_OK)
 313                return -EREMOTEIO;
 314        return 0;
 315}
 316
 317int gb_svc_intf_refclk_set(struct gb_svc *svc, u8 intf_id, bool enable)
 318{
 319        struct gb_svc_intf_refclk_request request;
 320        struct gb_svc_intf_refclk_response response;
 321        int type, ret;
 322
 323        request.intf_id = intf_id;
 324
 325        if (enable)
 326                type = GB_SVC_TYPE_INTF_REFCLK_ENABLE;
 327        else
 328                type = GB_SVC_TYPE_INTF_REFCLK_DISABLE;
 329
 330        ret = gb_operation_sync(svc->connection, type,
 331                        &request, sizeof(request),
 332                        &response, sizeof(response));
 333        if (ret < 0)
 334                return ret;
 335        if (response.result_code != GB_SVC_INTF_REFCLK_OK)
 336                return -EREMOTEIO;
 337        return 0;
 338}
 339
 340int gb_svc_intf_unipro_set(struct gb_svc *svc, u8 intf_id, bool enable)
 341{
 342        struct gb_svc_intf_unipro_request request;
 343        struct gb_svc_intf_unipro_response response;
 344        int type, ret;
 345
 346        request.intf_id = intf_id;
 347
 348        if (enable)
 349                type = GB_SVC_TYPE_INTF_UNIPRO_ENABLE;
 350        else
 351                type = GB_SVC_TYPE_INTF_UNIPRO_DISABLE;
 352
 353        ret = gb_operation_sync(svc->connection, type,
 354                        &request, sizeof(request),
 355                        &response, sizeof(response));
 356        if (ret < 0)
 357                return ret;
 358        if (response.result_code != GB_SVC_INTF_UNIPRO_OK)
 359                return -EREMOTEIO;
 360        return 0;
 361}
 362
 363int gb_svc_intf_activate(struct gb_svc *svc, u8 intf_id, u8 *intf_type)
 364{
 365        struct gb_svc_intf_activate_request request;
 366        struct gb_svc_intf_activate_response response;
 367        int ret;
 368
 369        request.intf_id = intf_id;
 370
 371        ret = gb_operation_sync_timeout(svc->connection,
 372                        GB_SVC_TYPE_INTF_ACTIVATE,
 373                        &request, sizeof(request),
 374                        &response, sizeof(response),
 375                        SVC_INTF_ACTIVATE_TIMEOUT);
 376        if (ret < 0)
 377                return ret;
 378        if (response.status != GB_SVC_OP_SUCCESS) {
 379                dev_err(&svc->dev, "failed to activate interface %u: %u\n",
 380                                intf_id, response.status);
 381                return -EREMOTEIO;
 382        }
 383
 384        *intf_type = response.intf_type;
 385
 386        return 0;
 387}
 388
 389int gb_svc_intf_resume(struct gb_svc *svc, u8 intf_id)
 390{
 391        struct gb_svc_intf_resume_request request;
 392        struct gb_svc_intf_resume_response response;
 393        int ret;
 394
 395        request.intf_id = intf_id;
 396
 397        ret = gb_operation_sync_timeout(svc->connection,
 398                                        GB_SVC_TYPE_INTF_RESUME,
 399                                        &request, sizeof(request),
 400                                        &response, sizeof(response),
 401                                        SVC_INTF_RESUME_TIMEOUT);
 402        if (ret < 0) {
 403                dev_err(&svc->dev, "failed to send interface resume %u: %d\n",
 404                        intf_id, ret);
 405                return ret;
 406        }
 407
 408        if (response.status != GB_SVC_OP_SUCCESS) {
 409                dev_err(&svc->dev, "failed to resume interface %u: %u\n",
 410                        intf_id, response.status);
 411                return -EREMOTEIO;
 412        }
 413
 414        return 0;
 415}
 416
 417int gb_svc_dme_peer_get(struct gb_svc *svc, u8 intf_id, u16 attr, u16 selector,
 418                        u32 *value)
 419{
 420        struct gb_svc_dme_peer_get_request request;
 421        struct gb_svc_dme_peer_get_response response;
 422        u16 result;
 423        int ret;
 424
 425        request.intf_id = intf_id;
 426        request.attr = cpu_to_le16(attr);
 427        request.selector = cpu_to_le16(selector);
 428
 429        ret = gb_operation_sync(svc->connection, GB_SVC_TYPE_DME_PEER_GET,
 430                                &request, sizeof(request),
 431                                &response, sizeof(response));
 432        if (ret) {
 433                dev_err(&svc->dev, "failed to get DME attribute (%u 0x%04x %u): %d\n",
 434                                intf_id, attr, selector, ret);
 435                return ret;
 436        }
 437
 438        result = le16_to_cpu(response.result_code);
 439        if (result) {
 440                dev_err(&svc->dev, "UniPro error while getting DME attribute (%u 0x%04x %u): %u\n",
 441                                intf_id, attr, selector, result);
 442                return -EREMOTEIO;
 443        }
 444
 445        if (value)
 446                *value = le32_to_cpu(response.attr_value);
 447
 448        return 0;
 449}
 450
 451int gb_svc_dme_peer_set(struct gb_svc *svc, u8 intf_id, u16 attr, u16 selector,
 452                        u32 value)
 453{
 454        struct gb_svc_dme_peer_set_request request;
 455        struct gb_svc_dme_peer_set_response response;
 456        u16 result;
 457        int ret;
 458
 459        request.intf_id = intf_id;
 460        request.attr = cpu_to_le16(attr);
 461        request.selector = cpu_to_le16(selector);
 462        request.value = cpu_to_le32(value);
 463
 464        ret = gb_operation_sync(svc->connection, GB_SVC_TYPE_DME_PEER_SET,
 465                                &request, sizeof(request),
 466                                &response, sizeof(response));
 467        if (ret) {
 468                dev_err(&svc->dev, "failed to set DME attribute (%u 0x%04x %u %u): %d\n",
 469                                intf_id, attr, selector, value, ret);
 470                return ret;
 471        }
 472
 473        result = le16_to_cpu(response.result_code);
 474        if (result) {
 475                dev_err(&svc->dev, "UniPro error while setting DME attribute (%u 0x%04x %u %u): %u\n",
 476                                intf_id, attr, selector, value, result);
 477                return -EREMOTEIO;
 478        }
 479
 480        return 0;
 481}
 482
 483int gb_svc_connection_create(struct gb_svc *svc,
 484                                u8 intf1_id, u16 cport1_id,
 485                                u8 intf2_id, u16 cport2_id,
 486                                u8 cport_flags)
 487{
 488        struct gb_svc_conn_create_request request;
 489
 490        request.intf1_id = intf1_id;
 491        request.cport1_id = cpu_to_le16(cport1_id);
 492        request.intf2_id = intf2_id;
 493        request.cport2_id = cpu_to_le16(cport2_id);
 494        request.tc = 0;         /* TC0 */
 495        request.flags = cport_flags;
 496
 497        return gb_operation_sync(svc->connection, GB_SVC_TYPE_CONN_CREATE,
 498                                 &request, sizeof(request), NULL, 0);
 499}
 500
 501void gb_svc_connection_destroy(struct gb_svc *svc, u8 intf1_id, u16 cport1_id,
 502                               u8 intf2_id, u16 cport2_id)
 503{
 504        struct gb_svc_conn_destroy_request request;
 505        struct gb_connection *connection = svc->connection;
 506        int ret;
 507
 508        request.intf1_id = intf1_id;
 509        request.cport1_id = cpu_to_le16(cport1_id);
 510        request.intf2_id = intf2_id;
 511        request.cport2_id = cpu_to_le16(cport2_id);
 512
 513        ret = gb_operation_sync(connection, GB_SVC_TYPE_CONN_DESTROY,
 514                                &request, sizeof(request), NULL, 0);
 515        if (ret) {
 516                dev_err(&svc->dev, "failed to destroy connection (%u:%u %u:%u): %d\n",
 517                                intf1_id, cport1_id, intf2_id, cport2_id, ret);
 518        }
 519}
 520
 521/* Creates bi-directional routes between the devices */
 522int gb_svc_route_create(struct gb_svc *svc, u8 intf1_id, u8 dev1_id,
 523                               u8 intf2_id, u8 dev2_id)
 524{
 525        struct gb_svc_route_create_request request;
 526
 527        request.intf1_id = intf1_id;
 528        request.dev1_id = dev1_id;
 529        request.intf2_id = intf2_id;
 530        request.dev2_id = dev2_id;
 531
 532        return gb_operation_sync(svc->connection, GB_SVC_TYPE_ROUTE_CREATE,
 533                                 &request, sizeof(request), NULL, 0);
 534}
 535
 536/* Destroys bi-directional routes between the devices */
 537void gb_svc_route_destroy(struct gb_svc *svc, u8 intf1_id, u8 intf2_id)
 538{
 539        struct gb_svc_route_destroy_request request;
 540        int ret;
 541
 542        request.intf1_id = intf1_id;
 543        request.intf2_id = intf2_id;
 544
 545        ret = gb_operation_sync(svc->connection, GB_SVC_TYPE_ROUTE_DESTROY,
 546                                &request, sizeof(request), NULL, 0);
 547        if (ret) {
 548                dev_err(&svc->dev, "failed to destroy route (%u %u): %d\n",
 549                                intf1_id, intf2_id, ret);
 550        }
 551}
 552
 553int gb_svc_intf_set_power_mode(struct gb_svc *svc, u8 intf_id, u8 hs_series,
 554                               u8 tx_mode, u8 tx_gear, u8 tx_nlanes,
 555                               u8 tx_amplitude, u8 tx_hs_equalizer,
 556                               u8 rx_mode, u8 rx_gear, u8 rx_nlanes,
 557                               u8 flags, u32 quirks,
 558                               struct gb_svc_l2_timer_cfg *local,
 559                               struct gb_svc_l2_timer_cfg *remote)
 560{
 561        struct gb_svc_intf_set_pwrm_request request;
 562        struct gb_svc_intf_set_pwrm_response response;
 563        int ret;
 564        u16 result_code;
 565
 566        memset(&request, 0, sizeof(request));
 567
 568        request.intf_id = intf_id;
 569        request.hs_series = hs_series;
 570        request.tx_mode = tx_mode;
 571        request.tx_gear = tx_gear;
 572        request.tx_nlanes = tx_nlanes;
 573        request.tx_amplitude = tx_amplitude;
 574        request.tx_hs_equalizer = tx_hs_equalizer;
 575        request.rx_mode = rx_mode;
 576        request.rx_gear = rx_gear;
 577        request.rx_nlanes = rx_nlanes;
 578        request.flags = flags;
 579        request.quirks = cpu_to_le32(quirks);
 580        if (local)
 581                request.local_l2timerdata = *local;
 582        if (remote)
 583                request.remote_l2timerdata = *remote;
 584
 585        ret = gb_operation_sync(svc->connection, GB_SVC_TYPE_INTF_SET_PWRM,
 586                                &request, sizeof(request),
 587                                &response, sizeof(response));
 588        if (ret < 0)
 589                return ret;
 590
 591        result_code = response.result_code;
 592        if (result_code != GB_SVC_SETPWRM_PWR_LOCAL) {
 593                dev_err(&svc->dev, "set power mode = %d\n", result_code);
 594                return -EIO;
 595        }
 596
 597        return 0;
 598}
 599EXPORT_SYMBOL_GPL(gb_svc_intf_set_power_mode);
 600
 601int gb_svc_intf_set_power_mode_hibernate(struct gb_svc *svc, u8 intf_id)
 602{
 603        struct gb_svc_intf_set_pwrm_request request;
 604        struct gb_svc_intf_set_pwrm_response response;
 605        int ret;
 606        u16 result_code;
 607
 608        memset(&request, 0, sizeof(request));
 609
 610        request.intf_id = intf_id;
 611        request.hs_series = GB_SVC_UNIPRO_HS_SERIES_A;
 612        request.tx_mode = GB_SVC_UNIPRO_HIBERNATE_MODE;
 613        request.rx_mode = GB_SVC_UNIPRO_HIBERNATE_MODE;
 614
 615        ret = gb_operation_sync(svc->connection, GB_SVC_TYPE_INTF_SET_PWRM,
 616                                &request, sizeof(request),
 617                                &response, sizeof(response));
 618        if (ret < 0) {
 619                dev_err(&svc->dev,
 620                        "failed to send set power mode operation to interface %u: %d\n",
 621                        intf_id, ret);
 622                return ret;
 623        }
 624
 625        result_code = response.result_code;
 626        if (result_code != GB_SVC_SETPWRM_PWR_OK) {
 627                dev_err(&svc->dev,
 628                        "failed to hibernate the link for interface %u: %u\n",
 629                        intf_id, result_code);
 630                return -EIO;
 631        }
 632
 633        return 0;
 634}
 635
 636int gb_svc_ping(struct gb_svc *svc)
 637{
 638        return gb_operation_sync_timeout(svc->connection, GB_SVC_TYPE_PING,
 639                                         NULL, 0, NULL, 0,
 640                                         GB_OPERATION_TIMEOUT_DEFAULT * 2);
 641}
 642
 643static int gb_svc_version_request(struct gb_operation *op)
 644{
 645        struct gb_connection *connection = op->connection;
 646        struct gb_svc *svc = gb_connection_get_data(connection);
 647        struct gb_svc_version_request *request;
 648        struct gb_svc_version_response *response;
 649
 650        if (op->request->payload_size < sizeof(*request)) {
 651                dev_err(&svc->dev, "short version request (%zu < %zu)\n",
 652                                op->request->payload_size,
 653                                sizeof(*request));
 654                return -EINVAL;
 655        }
 656
 657        request = op->request->payload;
 658
 659        if (request->major > GB_SVC_VERSION_MAJOR) {
 660                dev_warn(&svc->dev, "unsupported major version (%u > %u)\n",
 661                                request->major, GB_SVC_VERSION_MAJOR);
 662                return -ENOTSUPP;
 663        }
 664
 665        svc->protocol_major = request->major;
 666        svc->protocol_minor = request->minor;
 667
 668        if (!gb_operation_response_alloc(op, sizeof(*response), GFP_KERNEL))
 669                return -ENOMEM;
 670
 671        response = op->response->payload;
 672        response->major = svc->protocol_major;
 673        response->minor = svc->protocol_minor;
 674
 675        return 0;
 676}
 677
 678static ssize_t pwr_debugfs_voltage_read(struct file *file, char __user *buf,
 679                                        size_t len, loff_t *offset)
 680{
 681        struct svc_debugfs_pwrmon_rail *pwrmon_rails =
 682                file_inode(file)->i_private;
 683        struct gb_svc *svc = pwrmon_rails->svc;
 684        int ret, desc;
 685        u32 value;
 686        char buff[16];
 687
 688        ret = gb_svc_pwrmon_sample_get(svc, pwrmon_rails->id,
 689                                       GB_SVC_PWRMON_TYPE_VOL, &value);
 690        if (ret) {
 691                dev_err(&svc->dev,
 692                        "failed to get voltage sample %u: %d\n",
 693                        pwrmon_rails->id, ret);
 694                return ret;
 695        }
 696
 697        desc = scnprintf(buff, sizeof(buff), "%u\n", value);
 698
 699        return simple_read_from_buffer(buf, len, offset, buff, desc);
 700}
 701
 702static ssize_t pwr_debugfs_current_read(struct file *file, char __user *buf,
 703                                        size_t len, loff_t *offset)
 704{
 705        struct svc_debugfs_pwrmon_rail *pwrmon_rails =
 706                file_inode(file)->i_private;
 707        struct gb_svc *svc = pwrmon_rails->svc;
 708        int ret, desc;
 709        u32 value;
 710        char buff[16];
 711
 712        ret = gb_svc_pwrmon_sample_get(svc, pwrmon_rails->id,
 713                                       GB_SVC_PWRMON_TYPE_CURR, &value);
 714        if (ret) {
 715                dev_err(&svc->dev,
 716                        "failed to get current sample %u: %d\n",
 717                        pwrmon_rails->id, ret);
 718                return ret;
 719        }
 720
 721        desc = scnprintf(buff, sizeof(buff), "%u\n", value);
 722
 723        return simple_read_from_buffer(buf, len, offset, buff, desc);
 724}
 725
 726static ssize_t pwr_debugfs_power_read(struct file *file, char __user *buf,
 727                                      size_t len, loff_t *offset)
 728{
 729        struct svc_debugfs_pwrmon_rail *pwrmon_rails =
 730                file_inode(file)->i_private;
 731        struct gb_svc *svc = pwrmon_rails->svc;
 732        int ret, desc;
 733        u32 value;
 734        char buff[16];
 735
 736        ret = gb_svc_pwrmon_sample_get(svc, pwrmon_rails->id,
 737                                       GB_SVC_PWRMON_TYPE_PWR, &value);
 738        if (ret) {
 739                dev_err(&svc->dev, "failed to get power sample %u: %d\n",
 740                        pwrmon_rails->id, ret);
 741                return ret;
 742        }
 743
 744        desc = scnprintf(buff, sizeof(buff), "%u\n", value);
 745
 746        return simple_read_from_buffer(buf, len, offset, buff, desc);
 747}
 748
 749static const struct file_operations pwrmon_debugfs_voltage_fops = {
 750        .read           = pwr_debugfs_voltage_read,
 751};
 752
 753static const struct file_operations pwrmon_debugfs_current_fops = {
 754        .read           = pwr_debugfs_current_read,
 755};
 756
 757static const struct file_operations pwrmon_debugfs_power_fops = {
 758        .read           = pwr_debugfs_power_read,
 759};
 760
 761static void gb_svc_pwrmon_debugfs_init(struct gb_svc *svc)
 762{
 763        int i;
 764        size_t bufsize;
 765        struct dentry *dent;
 766        struct gb_svc_pwrmon_rail_names_get_response *rail_names;
 767        u8 rail_count;
 768
 769        dent = debugfs_create_dir("pwrmon", svc->debugfs_dentry);
 770        if (IS_ERR_OR_NULL(dent))
 771                return;
 772
 773        if (gb_svc_pwrmon_rail_count_get(svc, &rail_count))
 774                goto err_pwrmon_debugfs;
 775
 776        if (!rail_count || rail_count > GB_SVC_PWRMON_MAX_RAIL_COUNT)
 777                goto err_pwrmon_debugfs;
 778
 779        bufsize = sizeof(*rail_names) +
 780                GB_SVC_PWRMON_RAIL_NAME_BUFSIZE * rail_count;
 781
 782        rail_names = kzalloc(bufsize, GFP_KERNEL);
 783        if (!rail_names)
 784                goto err_pwrmon_debugfs;
 785
 786        svc->pwrmon_rails = kcalloc(rail_count, sizeof(*svc->pwrmon_rails),
 787                                    GFP_KERNEL);
 788        if (!svc->pwrmon_rails)
 789                goto err_pwrmon_debugfs_free;
 790
 791        if (gb_svc_pwrmon_rail_names_get(svc, rail_names, bufsize))
 792                goto err_pwrmon_debugfs_free;
 793
 794        for (i = 0; i < rail_count; i++) {
 795                struct dentry *dir;
 796                struct svc_debugfs_pwrmon_rail *rail = &svc->pwrmon_rails[i];
 797                char fname[GB_SVC_PWRMON_RAIL_NAME_BUFSIZE];
 798
 799                snprintf(fname, sizeof(fname), "%s",
 800                         (char *)&rail_names->name[i]);
 801
 802                rail->id = i;
 803                rail->svc = svc;
 804
 805                dir = debugfs_create_dir(fname, dent);
 806                debugfs_create_file("voltage_now", 0444, dir, rail,
 807                                    &pwrmon_debugfs_voltage_fops);
 808                debugfs_create_file("current_now", 0444, dir, rail,
 809                                    &pwrmon_debugfs_current_fops);
 810                debugfs_create_file("power_now", 0444, dir, rail,
 811                                    &pwrmon_debugfs_power_fops);
 812        }
 813
 814        kfree(rail_names);
 815        return;
 816
 817err_pwrmon_debugfs_free:
 818        kfree(rail_names);
 819        kfree(svc->pwrmon_rails);
 820        svc->pwrmon_rails = NULL;
 821
 822err_pwrmon_debugfs:
 823        debugfs_remove(dent);
 824}
 825
 826static void gb_svc_debugfs_init(struct gb_svc *svc)
 827{
 828        svc->debugfs_dentry = debugfs_create_dir(dev_name(&svc->dev),
 829                                                 gb_debugfs_get());
 830        gb_svc_pwrmon_debugfs_init(svc);
 831}
 832
 833static void gb_svc_debugfs_exit(struct gb_svc *svc)
 834{
 835        debugfs_remove_recursive(svc->debugfs_dentry);
 836        kfree(svc->pwrmon_rails);
 837        svc->pwrmon_rails = NULL;
 838}
 839
 840static int gb_svc_hello(struct gb_operation *op)
 841{
 842        struct gb_connection *connection = op->connection;
 843        struct gb_svc *svc = gb_connection_get_data(connection);
 844        struct gb_svc_hello_request *hello_request;
 845        int ret;
 846
 847        if (op->request->payload_size < sizeof(*hello_request)) {
 848                dev_warn(&svc->dev, "short hello request (%zu < %zu)\n",
 849                                op->request->payload_size,
 850                                sizeof(*hello_request));
 851                return -EINVAL;
 852        }
 853
 854        hello_request = op->request->payload;
 855        svc->endo_id = le16_to_cpu(hello_request->endo_id);
 856        svc->ap_intf_id = hello_request->interface_id;
 857
 858        ret = device_add(&svc->dev);
 859        if (ret) {
 860                dev_err(&svc->dev, "failed to register svc device: %d\n", ret);
 861                return ret;
 862        }
 863
 864        ret = gb_svc_watchdog_create(svc);
 865        if (ret) {
 866                dev_err(&svc->dev, "failed to create watchdog: %d\n", ret);
 867                goto err_unregister_device;
 868        }
 869
 870        gb_svc_debugfs_init(svc);
 871
 872        return gb_svc_queue_deferred_request(op);
 873
 874err_unregister_device:
 875        gb_svc_watchdog_destroy(svc);
 876        device_del(&svc->dev);
 877        return ret;
 878}
 879
 880static struct gb_interface *gb_svc_interface_lookup(struct gb_svc *svc,
 881                                                        u8 intf_id)
 882{
 883        struct gb_host_device *hd = svc->hd;
 884        struct gb_module *module;
 885        size_t num_interfaces;
 886        u8 module_id;
 887
 888        list_for_each_entry(module, &hd->modules, hd_node) {
 889                module_id = module->module_id;
 890                num_interfaces = module->num_interfaces;
 891
 892                if (intf_id >= module_id &&
 893                                intf_id < module_id + num_interfaces) {
 894                        return module->interfaces[intf_id - module_id];
 895                }
 896        }
 897
 898        return NULL;
 899}
 900
 901static struct gb_module *gb_svc_module_lookup(struct gb_svc *svc, u8 module_id)
 902{
 903        struct gb_host_device *hd = svc->hd;
 904        struct gb_module *module;
 905
 906        list_for_each_entry(module, &hd->modules, hd_node) {
 907                if (module->module_id == module_id)
 908                        return module;
 909        }
 910
 911        return NULL;
 912}
 913
 914static void gb_svc_process_hello_deferred(struct gb_operation *operation)
 915{
 916        struct gb_connection *connection = operation->connection;
 917        struct gb_svc *svc = gb_connection_get_data(connection);
 918        int ret;
 919
 920        /*
 921         * XXX This is a hack/work-around to reconfigure the APBridgeA-Switch
 922         * link to PWM G2, 1 Lane, Slow Auto, so that it has sufficient
 923         * bandwidth for 3 audio streams plus boot-over-UniPro of a hot-plugged
 924         * module.
 925         *
 926         * The code should be removed once SW-2217, Heuristic for UniPro
 927         * Power Mode Changes is resolved.
 928         */
 929        ret = gb_svc_intf_set_power_mode(svc, svc->ap_intf_id,
 930                                         GB_SVC_UNIPRO_HS_SERIES_A,
 931                                         GB_SVC_UNIPRO_SLOW_AUTO_MODE,
 932                                         2, 1,
 933                                         GB_SVC_SMALL_AMPLITUDE,
 934                                         GB_SVC_NO_DE_EMPHASIS,
 935                                         GB_SVC_UNIPRO_SLOW_AUTO_MODE,
 936                                         2, 1,
 937                                         0, 0,
 938                                         NULL, NULL);
 939
 940        if (ret)
 941                dev_warn(&svc->dev,
 942                        "power mode change failed on AP to switch link: %d\n",
 943                        ret);
 944}
 945
 946static void gb_svc_process_module_inserted(struct gb_operation *operation)
 947{
 948        struct gb_svc_module_inserted_request *request;
 949        struct gb_connection *connection = operation->connection;
 950        struct gb_svc *svc = gb_connection_get_data(connection);
 951        struct gb_host_device *hd = svc->hd;
 952        struct gb_module *module;
 953        size_t num_interfaces;
 954        u8 module_id;
 955        u16 flags;
 956        int ret;
 957
 958        /* The request message size has already been verified. */
 959        request = operation->request->payload;
 960        module_id = request->primary_intf_id;
 961        num_interfaces = request->intf_count;
 962        flags = le16_to_cpu(request->flags);
 963
 964        dev_dbg(&svc->dev, "%s - id = %u, num_interfaces = %zu, flags = 0x%04x\n",
 965                        __func__, module_id, num_interfaces, flags);
 966
 967        if (flags & GB_SVC_MODULE_INSERTED_FLAG_NO_PRIMARY) {
 968                dev_warn(&svc->dev, "no primary interface detected on module %u\n",
 969                                module_id);
 970        }
 971
 972        module = gb_svc_module_lookup(svc, module_id);
 973        if (module) {
 974                dev_warn(&svc->dev, "unexpected module-inserted event %u\n",
 975                                module_id);
 976                return;
 977        }
 978
 979        module = gb_module_create(hd, module_id, num_interfaces);
 980        if (!module) {
 981                dev_err(&svc->dev, "failed to create module\n");
 982                return;
 983        }
 984
 985        ret = gb_module_add(module);
 986        if (ret) {
 987                gb_module_put(module);
 988                return;
 989        }
 990
 991        list_add(&module->hd_node, &hd->modules);
 992}
 993
 994static void gb_svc_process_module_removed(struct gb_operation *operation)
 995{
 996        struct gb_svc_module_removed_request *request;
 997        struct gb_connection *connection = operation->connection;
 998        struct gb_svc *svc = gb_connection_get_data(connection);
 999        struct gb_module *module;
1000        u8 module_id;
1001
1002        /* The request message size has already been verified. */
1003        request = operation->request->payload;
1004        module_id = request->primary_intf_id;
1005
1006        dev_dbg(&svc->dev, "%s - id = %u\n", __func__, module_id);
1007
1008        module = gb_svc_module_lookup(svc, module_id);
1009        if (!module) {
1010                dev_warn(&svc->dev, "unexpected module-removed event %u\n",
1011                                module_id);
1012                return;
1013        }
1014
1015        module->disconnected = true;
1016
1017        gb_module_del(module);
1018        list_del(&module->hd_node);
1019        gb_module_put(module);
1020}
1021
1022static void gb_svc_process_intf_oops(struct gb_operation *operation)
1023{
1024        struct gb_svc_intf_oops_request *request;
1025        struct gb_connection *connection = operation->connection;
1026        struct gb_svc *svc = gb_connection_get_data(connection);
1027        struct gb_interface *intf;
1028        u8 intf_id;
1029        u8 reason;
1030
1031        /* The request message size has already been verified. */
1032        request = operation->request->payload;
1033        intf_id = request->intf_id;
1034        reason = request->reason;
1035
1036        intf = gb_svc_interface_lookup(svc, intf_id);
1037        if (!intf) {
1038                dev_warn(&svc->dev, "unexpected interface-oops event %u\n",
1039                         intf_id);
1040                return;
1041        }
1042
1043        dev_info(&svc->dev, "Deactivating interface %u, interface oops reason = %u\n",
1044                 intf_id, reason);
1045
1046        mutex_lock(&intf->mutex);
1047        intf->disconnected = true;
1048        gb_interface_disable(intf);
1049        gb_interface_deactivate(intf);
1050        mutex_unlock(&intf->mutex);
1051}
1052
1053static void gb_svc_process_intf_mailbox_event(struct gb_operation *operation)
1054{
1055        struct gb_svc_intf_mailbox_event_request *request;
1056        struct gb_connection *connection = operation->connection;
1057        struct gb_svc *svc = gb_connection_get_data(connection);
1058        struct gb_interface *intf;
1059        u8 intf_id;
1060        u16 result_code;
1061        u32 mailbox;
1062
1063        /* The request message size has already been verified. */
1064        request = operation->request->payload;
1065        intf_id = request->intf_id;
1066        result_code = le16_to_cpu(request->result_code);
1067        mailbox = le32_to_cpu(request->mailbox);
1068
1069        dev_dbg(&svc->dev, "%s - id = %u, result = 0x%04x, mailbox = 0x%08x\n",
1070                        __func__, intf_id, result_code, mailbox);
1071
1072        intf = gb_svc_interface_lookup(svc, intf_id);
1073        if (!intf) {
1074                dev_warn(&svc->dev, "unexpected mailbox event %u\n", intf_id);
1075                return;
1076        }
1077
1078        gb_interface_mailbox_event(intf, result_code, mailbox);
1079}
1080
1081static void gb_svc_process_deferred_request(struct work_struct *work)
1082{
1083        struct gb_svc_deferred_request *dr;
1084        struct gb_operation *operation;
1085        struct gb_svc *svc;
1086        u8 type;
1087
1088        dr = container_of(work, struct gb_svc_deferred_request, work);
1089        operation = dr->operation;
1090        svc = gb_connection_get_data(operation->connection);
1091        type = operation->request->header->type;
1092
1093        switch (type) {
1094        case GB_SVC_TYPE_SVC_HELLO:
1095                gb_svc_process_hello_deferred(operation);
1096                break;
1097        case GB_SVC_TYPE_MODULE_INSERTED:
1098                gb_svc_process_module_inserted(operation);
1099                break;
1100        case GB_SVC_TYPE_MODULE_REMOVED:
1101                gb_svc_process_module_removed(operation);
1102                break;
1103        case GB_SVC_TYPE_INTF_MAILBOX_EVENT:
1104                gb_svc_process_intf_mailbox_event(operation);
1105                break;
1106        case GB_SVC_TYPE_INTF_OOPS:
1107                gb_svc_process_intf_oops(operation);
1108                break;
1109        default:
1110                dev_err(&svc->dev, "bad deferred request type: 0x%02x\n", type);
1111        }
1112
1113        gb_operation_put(operation);
1114        kfree(dr);
1115}
1116
1117static int gb_svc_queue_deferred_request(struct gb_operation *operation)
1118{
1119        struct gb_svc *svc = gb_connection_get_data(operation->connection);
1120        struct gb_svc_deferred_request *dr;
1121
1122        dr = kmalloc(sizeof(*dr), GFP_KERNEL);
1123        if (!dr)
1124                return -ENOMEM;
1125
1126        gb_operation_get(operation);
1127
1128        dr->operation = operation;
1129        INIT_WORK(&dr->work, gb_svc_process_deferred_request);
1130
1131        queue_work(svc->wq, &dr->work);
1132
1133        return 0;
1134}
1135
1136static int gb_svc_intf_reset_recv(struct gb_operation *op)
1137{
1138        struct gb_svc *svc = gb_connection_get_data(op->connection);
1139        struct gb_message *request = op->request;
1140        struct gb_svc_intf_reset_request *reset;
1141        u8 intf_id;
1142
1143        if (request->payload_size < sizeof(*reset)) {
1144                dev_warn(&svc->dev, "short reset request received (%zu < %zu)\n",
1145                                request->payload_size, sizeof(*reset));
1146                return -EINVAL;
1147        }
1148        reset = request->payload;
1149
1150        intf_id = reset->intf_id;
1151
1152        /* FIXME Reset the interface here */
1153
1154        return 0;
1155}
1156
1157static int gb_svc_module_inserted_recv(struct gb_operation *op)
1158{
1159        struct gb_svc *svc = gb_connection_get_data(op->connection);
1160        struct gb_svc_module_inserted_request *request;
1161
1162        if (op->request->payload_size < sizeof(*request)) {
1163                dev_warn(&svc->dev, "short module-inserted request received (%zu < %zu)\n",
1164                                op->request->payload_size, sizeof(*request));
1165                return -EINVAL;
1166        }
1167
1168        request = op->request->payload;
1169
1170        dev_dbg(&svc->dev, "%s - id = %u\n", __func__,
1171                        request->primary_intf_id);
1172
1173        return gb_svc_queue_deferred_request(op);
1174}
1175
1176static int gb_svc_module_removed_recv(struct gb_operation *op)
1177{
1178        struct gb_svc *svc = gb_connection_get_data(op->connection);
1179        struct gb_svc_module_removed_request *request;
1180
1181        if (op->request->payload_size < sizeof(*request)) {
1182                dev_warn(&svc->dev, "short module-removed request received (%zu < %zu)\n",
1183                                op->request->payload_size, sizeof(*request));
1184                return -EINVAL;
1185        }
1186
1187        request = op->request->payload;
1188
1189        dev_dbg(&svc->dev, "%s - id = %u\n", __func__,
1190                        request->primary_intf_id);
1191
1192        return gb_svc_queue_deferred_request(op);
1193}
1194
1195static int gb_svc_intf_oops_recv(struct gb_operation *op)
1196{
1197        struct gb_svc *svc = gb_connection_get_data(op->connection);
1198        struct gb_svc_intf_oops_request *request;
1199
1200        if (op->request->payload_size < sizeof(*request)) {
1201                dev_warn(&svc->dev, "short intf-oops request received (%zu < %zu)\n",
1202                         op->request->payload_size, sizeof(*request));
1203                return -EINVAL;
1204        }
1205
1206        return gb_svc_queue_deferred_request(op);
1207}
1208
1209static int gb_svc_intf_mailbox_event_recv(struct gb_operation *op)
1210{
1211        struct gb_svc *svc = gb_connection_get_data(op->connection);
1212        struct gb_svc_intf_mailbox_event_request *request;
1213
1214        if (op->request->payload_size < sizeof(*request)) {
1215                dev_warn(&svc->dev, "short mailbox request received (%zu < %zu)\n",
1216                                op->request->payload_size, sizeof(*request));
1217                return -EINVAL;
1218        }
1219
1220        request = op->request->payload;
1221
1222        dev_dbg(&svc->dev, "%s - id = %u\n", __func__, request->intf_id);
1223
1224        return gb_svc_queue_deferred_request(op);
1225}
1226
1227static int gb_svc_request_handler(struct gb_operation *op)
1228{
1229        struct gb_connection *connection = op->connection;
1230        struct gb_svc *svc = gb_connection_get_data(connection);
1231        u8 type = op->type;
1232        int ret = 0;
1233
1234        /*
1235         * SVC requests need to follow a specific order (at least initially) and
1236         * below code takes care of enforcing that. The expected order is:
1237         * - PROTOCOL_VERSION
1238         * - SVC_HELLO
1239         * - Any other request, but the earlier two.
1240         *
1241         * Incoming requests are guaranteed to be serialized and so we don't
1242         * need to protect 'state' for any races.
1243         */
1244        switch (type) {
1245        case GB_SVC_TYPE_PROTOCOL_VERSION:
1246                if (svc->state != GB_SVC_STATE_RESET)
1247                        ret = -EINVAL;
1248                break;
1249        case GB_SVC_TYPE_SVC_HELLO:
1250                if (svc->state != GB_SVC_STATE_PROTOCOL_VERSION)
1251                        ret = -EINVAL;
1252                break;
1253        default:
1254                if (svc->state != GB_SVC_STATE_SVC_HELLO)
1255                        ret = -EINVAL;
1256                break;
1257        }
1258
1259        if (ret) {
1260                dev_warn(&svc->dev, "unexpected request 0x%02x received (state %u)\n",
1261                                type, svc->state);
1262                return ret;
1263        }
1264
1265        switch (type) {
1266        case GB_SVC_TYPE_PROTOCOL_VERSION:
1267                ret = gb_svc_version_request(op);
1268                if (!ret)
1269                        svc->state = GB_SVC_STATE_PROTOCOL_VERSION;
1270                return ret;
1271        case GB_SVC_TYPE_SVC_HELLO:
1272                ret = gb_svc_hello(op);
1273                if (!ret)
1274                        svc->state = GB_SVC_STATE_SVC_HELLO;
1275                return ret;
1276        case GB_SVC_TYPE_INTF_RESET:
1277                return gb_svc_intf_reset_recv(op);
1278        case GB_SVC_TYPE_MODULE_INSERTED:
1279                return gb_svc_module_inserted_recv(op);
1280        case GB_SVC_TYPE_MODULE_REMOVED:
1281                return gb_svc_module_removed_recv(op);
1282        case GB_SVC_TYPE_INTF_MAILBOX_EVENT:
1283                return gb_svc_intf_mailbox_event_recv(op);
1284        case GB_SVC_TYPE_INTF_OOPS:
1285                return gb_svc_intf_oops_recv(op);
1286        default:
1287                dev_warn(&svc->dev, "unsupported request 0x%02x\n", type);
1288                return -EINVAL;
1289        }
1290}
1291
1292static void gb_svc_release(struct device *dev)
1293{
1294        struct gb_svc *svc = to_gb_svc(dev);
1295
1296        if (svc->connection)
1297                gb_connection_destroy(svc->connection);
1298        ida_destroy(&svc->device_id_map);
1299        destroy_workqueue(svc->wq);
1300        kfree(svc);
1301}
1302
1303struct device_type greybus_svc_type = {
1304        .name           = "greybus_svc",
1305        .release        = gb_svc_release,
1306};
1307
1308struct gb_svc *gb_svc_create(struct gb_host_device *hd)
1309{
1310        struct gb_svc *svc;
1311
1312        svc = kzalloc(sizeof(*svc), GFP_KERNEL);
1313        if (!svc)
1314                return NULL;
1315
1316        svc->wq = alloc_workqueue("%s:svc", WQ_UNBOUND, 1, dev_name(&hd->dev));
1317        if (!svc->wq) {
1318                kfree(svc);
1319                return NULL;
1320        }
1321
1322        svc->dev.parent = &hd->dev;
1323        svc->dev.bus = &greybus_bus_type;
1324        svc->dev.type = &greybus_svc_type;
1325        svc->dev.groups = svc_groups;
1326        svc->dev.dma_mask = svc->dev.parent->dma_mask;
1327        device_initialize(&svc->dev);
1328
1329        dev_set_name(&svc->dev, "%d-svc", hd->bus_id);
1330
1331        ida_init(&svc->device_id_map);
1332        svc->state = GB_SVC_STATE_RESET;
1333        svc->hd = hd;
1334
1335        svc->connection = gb_connection_create_static(hd, GB_SVC_CPORT_ID,
1336                                                gb_svc_request_handler);
1337        if (IS_ERR(svc->connection)) {
1338                dev_err(&svc->dev, "failed to create connection: %ld\n",
1339                                PTR_ERR(svc->connection));
1340                goto err_put_device;
1341        }
1342
1343        gb_connection_set_data(svc->connection, svc);
1344
1345        return svc;
1346
1347err_put_device:
1348        put_device(&svc->dev);
1349        return NULL;
1350}
1351
1352int gb_svc_add(struct gb_svc *svc)
1353{
1354        int ret;
1355
1356        /*
1357         * The SVC protocol is currently driven by the SVC, so the SVC device
1358         * is added from the connection request handler when enough
1359         * information has been received.
1360         */
1361        ret = gb_connection_enable(svc->connection);
1362        if (ret)
1363                return ret;
1364
1365        return 0;
1366}
1367
1368static void gb_svc_remove_modules(struct gb_svc *svc)
1369{
1370        struct gb_host_device *hd = svc->hd;
1371        struct gb_module *module, *tmp;
1372
1373        list_for_each_entry_safe(module, tmp, &hd->modules, hd_node) {
1374                gb_module_del(module);
1375                list_del(&module->hd_node);
1376                gb_module_put(module);
1377        }
1378}
1379
1380void gb_svc_del(struct gb_svc *svc)
1381{
1382        gb_connection_disable_rx(svc->connection);
1383
1384        /*
1385         * The SVC device may have been registered from the request handler.
1386         */
1387        if (device_is_registered(&svc->dev)) {
1388                gb_svc_debugfs_exit(svc);
1389                gb_svc_watchdog_destroy(svc);
1390                device_del(&svc->dev);
1391        }
1392
1393        flush_workqueue(svc->wq);
1394
1395        gb_svc_remove_modules(svc);
1396
1397        gb_connection_disable(svc->connection);
1398}
1399
1400void gb_svc_put(struct gb_svc *svc)
1401{
1402        put_device(&svc->dev);
1403}
1404