/* Indexes and other defines for response received from the controller */ #define RESP_LEN 0 #define RESP_CMD 1 /* Echo of CMD byte from command */ #define RESP_DATA 2 /* Start of received data */
/* The TTY buffer should be big enough to take the entire cmd in one go */
ret = serdev_device_write_buf(to_serdev_device(dell_bl->dev), cmd, cmd_len); if (ret != cmd_len) {
dev_err(dell_bl->dev, "Error writing command: %d\n", ret);
dell_bl->status = (ret < 0) ? ret : -EIO; goto out;
}
ret = wait_event_timeout(dell_bl->wait_queue, dell_bl->status != -EBUSY,
DELL_BL_TIMEOUT); if (ret == 0) {
dev_err(dell_bl->dev, "Timed out waiting for response.\n"); /* Clear busy status to discard bytes received after this */
dell_bl->status = -ETIMEDOUT;
}
ret = dell_uart_bl_command(dell_bl, set_power, SET_CMD_LEN, resp, SET_RESP_LEN); if (ret) return ret;
dell_bl->power = power; return 0;
}
/* * There is no command to get backlight power status, * so we set the backlight power to "on" while initializing, * and then track and report its status by power variable.
*/ staticint dell_uart_get_bl_power(struct dell_uart_backlight *dell_bl)
{ return dell_bl->power;
}
/* Throw away unexpected bytes / remainder of response after an error */ if (dell_bl->status != -EBUSY) {
dev_warn(dell_bl->dev, "Bytes received out of band, dropping them.\n"); return len;
}
i = 0; while (i < len && dell_bl->resp_idx != dell_bl->resp_len) {
dell_bl->resp[dell_bl->resp_idx] = data[i++];
ret = devm_serdev_device_open(dev, serdev); if (ret) return dev_err_probe(dev, ret, "opening UART device\n");
/* 9600 bps, no flow control, these are the default but set them to be sure */
serdev_device_set_baudrate(serdev, 9600);
serdev_device_set_flow_control(serdev, false);
bl_type = acpi_video_get_backlight_type(); if (bl_type != acpi_backlight_dell_uart) {
dev_dbg(&pdev->dev, "Not loading (ACPI backlight type = %d)\n", bl_type); return -ENODEV;
}
ctrl_dev = get_serdev_controller("DELL0501", NULL, 0, "serial0"); if (IS_ERR(ctrl_dev)) return PTR_ERR(ctrl_dev);
serdev = serdev_device_alloc(to_serdev_controller(ctrl_dev));
put_device(ctrl_dev); if (!serdev) return -ENOMEM;
ret = serdev_device_add(serdev); if (ret) {
dev_err(&pdev->dev, "error %d adding serdev\n", ret);
serdev_device_put(serdev); return ret;
}
ret = serdev_device_driver_register(&dell_uart_bl_serdev_driver); if (ret) goto err_remove_serdev;
/* * serdev device <-> driver matching relies on OF or ACPI matches and * neither is available here, manually bind the driver.
*/
ret = device_driver_attach(&dell_uart_bl_serdev_driver.driver, &serdev->dev); if (ret) goto err_unregister_serdev_driver;
/* So that dell_uart_bl_pdev_remove() can remove the serdev */
platform_set_drvdata(pdev, serdev); return 0;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.