umcs.c (292080) | umcs.c (298300) |
---|---|
1/*- 2 * Copyright (c) 2010 Lev Serebryakov <lev@FreeBSD.org>. 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 24 unchanged lines hidden (view full) --- 33 * http://www.moschip.com. The datasheets don't contain full 34 * programming information for the chip. 35 * 36 * It is nornal to have only two enabled ports in devices, based on 37 * quad-port mos7840. 38 * 39 */ 40#include <sys/cdefs.h> | 1/*- 2 * Copyright (c) 2010 Lev Serebryakov <lev@FreeBSD.org>. 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 24 unchanged lines hidden (view full) --- 33 * http://www.moschip.com. The datasheets don't contain full 34 * programming information for the chip. 35 * 36 * It is nornal to have only two enabled ports in devices, based on 37 * quad-port mos7840. 38 * 39 */ 40#include <sys/cdefs.h> |
41__FBSDID("$FreeBSD: head/sys/dev/usb/serial/umcs.c 292080 2015-12-11 05:28:00Z imp $"); | 41__FBSDID("$FreeBSD: head/sys/dev/usb/serial/umcs.c 298300 2016-04-19 22:07:36Z pfg $"); |
42 43#include <sys/stdint.h> 44#include <sys/stddef.h> 45#include <sys/param.h> 46#include <sys/queue.h> 47#include <sys/types.h> 48#include <sys/systm.h> 49#include <sys/kernel.h> --- 1017 unchanged lines hidden (view full) --- 1067 err = umcs7840_set_UART_reg_sync(sc, portno, MCS7840_UART_REG_LCR, sc->sc_ports[portno].sc_lcr); 1068 if (err) 1069 return (err); 1070 return (0); 1071} 1072 1073/* Maximum speeds for standard frequences, when PLL is not used */ 1074static const uint32_t umcs7840_baudrate_divisors[] = {0, 115200, 230400, 403200, 460800, 806400, 921600, 1572864, 3145728,}; | 42 43#include <sys/stdint.h> 44#include <sys/stddef.h> 45#include <sys/param.h> 46#include <sys/queue.h> 47#include <sys/types.h> 48#include <sys/systm.h> 49#include <sys/kernel.h> --- 1017 unchanged lines hidden (view full) --- 1067 err = umcs7840_set_UART_reg_sync(sc, portno, MCS7840_UART_REG_LCR, sc->sc_ports[portno].sc_lcr); 1068 if (err) 1069 return (err); 1070 return (0); 1071} 1072 1073/* Maximum speeds for standard frequences, when PLL is not used */ 1074static const uint32_t umcs7840_baudrate_divisors[] = {0, 115200, 230400, 403200, 460800, 806400, 921600, 1572864, 3145728,}; |
1075static const uint8_t umcs7840_baudrate_divisors_len = sizeof(umcs7840_baudrate_divisors) / sizeof(umcs7840_baudrate_divisors[0]); | 1075static const uint8_t umcs7840_baudrate_divisors_len = nitems(umcs7840_baudrate_divisors); |
1076 1077static usb_error_t 1078umcs7840_calc_baudrate(uint32_t rate, uint16_t *divisor, uint8_t *clk) 1079{ 1080 uint8_t i = 0; 1081 1082 if (rate > umcs7840_baudrate_divisors[umcs7840_baudrate_divisors_len - 1]) 1083 return (-1); 1084 1085 for (i = 0; i < umcs7840_baudrate_divisors_len - 1 && 1086 !(rate > umcs7840_baudrate_divisors[i] && rate <= umcs7840_baudrate_divisors[i + 1]); ++i); 1087 if (rate == 0) 1088 *divisor = 1; /* XXX */ 1089 else 1090 *divisor = umcs7840_baudrate_divisors[i + 1] / rate; 1091 /* 0x00 .. 0x70 */ 1092 *clk = i << MCS7840_DEV_SPx_CLOCK_SHIFT; 1093 return (0); 1094} | 1076 1077static usb_error_t 1078umcs7840_calc_baudrate(uint32_t rate, uint16_t *divisor, uint8_t *clk) 1079{ 1080 uint8_t i = 0; 1081 1082 if (rate > umcs7840_baudrate_divisors[umcs7840_baudrate_divisors_len - 1]) 1083 return (-1); 1084 1085 for (i = 0; i < umcs7840_baudrate_divisors_len - 1 && 1086 !(rate > umcs7840_baudrate_divisors[i] && rate <= umcs7840_baudrate_divisors[i + 1]); ++i); 1087 if (rate == 0) 1088 *divisor = 1; /* XXX */ 1089 else 1090 *divisor = umcs7840_baudrate_divisors[i + 1] / rate; 1091 /* 0x00 .. 0x70 */ 1092 *clk = i << MCS7840_DEV_SPx_CLOCK_SHIFT; 1093 return (0); 1094} |