Skip to content

Commit

Permalink
drivers: serial: psoc6: Rework to support pinctrl
Browse files Browse the repository at this point in the history
The current serial driver uses hard code configuration.  Rework driver
to use pinctrl and enable full configuration from device tree.

Signed-off-by: Gerson Fernando Budke <[email protected]>
  • Loading branch information
nandojve authored and galak committed Apr 27, 2021
1 parent 66b6f07 commit e6cba8d
Show file tree
Hide file tree
Showing 7 changed files with 152 additions and 88 deletions.
8 changes: 0 additions & 8 deletions boards/arm/cy8ckit_062_ble/Kconfig.defconfig
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,5 @@ config BOARD
default "cy8ckit_062_ble_m0" if BOARD_CY8CKIT_062_BLE_M0
default "cy8ckit_062_ble_m4" if BOARD_CY8CKIT_062_BLE_M4

config UART_PSOC6_UART_5
default y
depends on UART_PSOC6

config UART_PSOC6_UART_6
default y
depends on UART_PSOC6

endif # BOARD_CY8CKIT_062_BLE_M0 || \
# BOARD_CY8CKIT_062_BLE_M4
8 changes: 0 additions & 8 deletions boards/arm/cy8ckit_062_wifi_bt/Kconfig.defconfig
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,5 @@ config BOARD
default "cy8ckit_062_wifi_bt_m0" if BOARD_CY8CKIT_062_WIFI_BT_M0
default "cy8ckit_062_wifi_bt_m4" if BOARD_CY8CKIT_062_WIFI_BT_M4

config UART_PSOC6_UART_5
default y
depends on UART_PSOC6

config UART_PSOC6_UART_6
default y
depends on UART_PSOC6

endif # BOARD_CY8CKIT_062_WIFI_BT_M0 || \
# BOARD_CY8CKIT_062_WIFI_BT_M4
23 changes: 6 additions & 17 deletions drivers/serial/Kconfig.psoc6
Original file line number Diff line number Diff line change
@@ -1,23 +1,12 @@
# Cypress UART configuration
# Cypress SCB[UART] configuration

# Copyright (c) 2018 Cypress
# Copyright (c) 2020 ATL Electronics
# SPDX-License-Identifier: Apache-2.0

menuconfig UART_PSOC6
bool "PSoC6 MCU serial driver"
select SERIAL_HAS_DRIVER
config UART_PSOC6
bool "PSoC-6 MCU SCB serial driver"
depends on SOC_FAMILY_PSOC6
select SERIAL_HAS_DRIVER
help
This option enables the UART driver for PSoC6 family of processors.

config UART_PSOC6_UART_5
bool "Enable PSOC6 SCB6 as UART_5 on Port 5"
depends on UART_PSOC6
help
Enable support for UART_5 on port 5 in the driver.

config UART_PSOC6_UART_6
bool "Enable PSOC6 SCB6 as UART_6 on Port 12"
depends on UART_PSOC6
help
Enable support for UART_6 on port 12 in the driver.
This option enables the SCB[UART] driver for PSoC-6 SoC family.
73 changes: 22 additions & 51 deletions drivers/serial/uart_psoc6.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
* SPDX-License-Identifier: Apache-2.0
*/

#define DT_DRV_COMPAT cypress_psoc6_uart

/** @file
* @brief UART driver for Cypress PSoC6 MCU family.
*
Expand All @@ -19,7 +21,6 @@

#include "cy_syslib.h"
#include "cy_sysclk.h"
#include "cy_gpio.h"
#include "cy_scb_uart.h"

/* UART desired baud rate is 115200 bps (Standard mode).
Expand All @@ -44,12 +45,9 @@

struct cypress_psoc6_config {
CySCB_Type *base;
GPIO_PRT_Type *port;
uint32_t rx_num;
uint32_t tx_num;
en_hsiom_sel_t rx_val;
en_hsiom_sel_t tx_val;
en_clk_dst_t scb_clock;
uint32_t periph_id;
uint32_t num_pins;
struct soc_gpio_pin pins[];
};

/* Populate configuration structure */
Expand Down Expand Up @@ -96,17 +94,10 @@ static int uart_psoc6_init(const struct device *dev)
{
const struct cypress_psoc6_config *config = dev->config;

/* Connect SCB5 UART function to pins */
Cy_GPIO_SetHSIOM(config->port, config->rx_num, config->rx_val);
Cy_GPIO_SetHSIOM(config->port, config->tx_num, config->tx_val);

/* Configure pins for UART operation */
Cy_GPIO_SetDrivemode(config->port, config->rx_num, CY_GPIO_DM_HIGHZ);
Cy_GPIO_SetDrivemode(config->port, config->tx_num,
CY_GPIO_DM_STRONG_IN_OFF);
soc_gpio_list_configure(config->pins, config->num_pins);

/* Connect assigned divider to be a clock source for UART */
Cy_SysClk_PeriphAssignDivider(config->scb_clock,
Cy_SysClk_PeriphAssignDivider(config->periph_id,
UART_PSOC6_UART_CLK_DIV_TYPE,
UART_PSOC6_UART_CLK_DIV_NUMBER);

Expand Down Expand Up @@ -147,38 +138,18 @@ static const struct uart_driver_api uart_psoc6_driver_api = {
.poll_out = uart_psoc6_poll_out,
};

#ifdef CONFIG_UART_PSOC6_UART_5
static const struct cypress_psoc6_config cypress_psoc6_uart5_config = {
.base = (CySCB_Type *)DT_REG_ADDR(DT_NODELABEL(uart5)),
.port = P5_0_PORT,
.rx_num = P5_0_NUM,
.tx_num = P5_1_NUM,
.rx_val = P5_0_SCB5_UART_RX,
.tx_val = P5_1_SCB5_UART_TX,
.scb_clock = PCLK_SCB5_CLOCK,
};

DEVICE_DT_DEFINE(DT_NODELABEL(uart5),
uart_psoc6_init, device_pm_control_nop, NULL,
&cypress_psoc6_uart5_config,
PRE_KERNEL_1, CONFIG_KERNEL_INIT_PRIORITY_DEVICE,
(void *)&uart_psoc6_driver_api);
#endif /* CONFIG_UART_PSOC6_UART_5 */

#ifdef CONFIG_UART_PSOC6_UART_6
static const struct cypress_psoc6_config cypress_psoc6_uart6_config = {
.base = (CySCB_Type *)DT_REG_ADDR(DT_NODELABEL(uart6)),
.port = P12_0_PORT,
.rx_num = P12_0_NUM,
.tx_num = P12_1_NUM,
.rx_val = P12_0_SCB6_UART_RX,
.tx_val = P12_1_SCB6_UART_TX,
.scb_clock = PCLK_SCB6_CLOCK,
};

DEVICE_DT_DEFINE(DT_NODELABEL(uart6),
uart_psoc6_init, device_pm_control_nop, NULL,
&cypress_psoc6_uart6_config,
PRE_KERNEL_1, CONFIG_KERNEL_INIT_PRIORITY_DEVICE,
(void *)&uart_psoc6_driver_api);
#endif /* CONFIG_UART_PSOC6_UART_6 */
#define CY_PSOC6_UART_INIT(n) \
static const struct cypress_psoc6_config cy_psoc6_uart##n##_config = { \
.base = (CySCB_Type *)DT_INST_REG_ADDR(n), \
.periph_id = DT_INST_PROP(n, peripheral_id), \
\
.num_pins = CY_PSOC6_DT_INST_NUM_PINS(n), \
.pins = CY_PSOC6_DT_INST_PINS(n), \
}; \
DEVICE_DT_INST_DEFINE(n, &uart_psoc6_init, device_pm_control_nop, \
NULL, \
&cy_psoc6_uart##n##_config, PRE_KERNEL_1, \
CONFIG_KERNEL_INIT_PRIORITY_DEVICE, \
&uart_psoc6_driver_api);

DT_INST_FOREACH_STATUS_OKAY(CY_PSOC6_UART_INIT)
44 changes: 44 additions & 0 deletions dts/arm/cypress/psoc6-pinctrl.dtsi
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,54 @@
soc {
pinctrl@40310000 {
/* instance, signal, port, pin, hsiom [, flag1, ... ] */
DT_CYPRESS_HSIOM(uart0, rx, 0, 2, act_6, input-enable);
DT_CYPRESS_HSIOM(uart0, tx, 0, 3, act_6, drive-push-pull);
DT_CYPRESS_HSIOM(uart0, rts, 0, 4, act_6, drive-push-pull);
DT_CYPRESS_HSIOM(uart0, cts, 0, 5, act_6, input-enable);
DT_CYPRESS_HSIOM(uart1, rx, 10, 0, act_6, input-enable);
DT_CYPRESS_HSIOM(uart1, tx, 10, 1, act_6, drive-push-pull);
DT_CYPRESS_HSIOM(uart1, rts, 10, 2, act_6, drive-push-pull);
DT_CYPRESS_HSIOM(uart1, cts, 10, 3, act_6, input-enable);
DT_CYPRESS_HSIOM(uart2, rx, 9, 0, act_6, input-enable);
DT_CYPRESS_HSIOM(uart2, tx, 9, 1, act_6, drive-push-pull);
DT_CYPRESS_HSIOM(uart2, rts, 9, 2, act_6, drive-push-pull);
DT_CYPRESS_HSIOM(uart2, cts, 9, 3, act_6, input-enable);
DT_CYPRESS_HSIOM(uart3, rx, 6, 0, act_6, input-enable);
DT_CYPRESS_HSIOM(uart3, tx, 6, 1, act_6, drive-push-pull);
DT_CYPRESS_HSIOM(uart3, rts, 6, 2, act_6, drive-push-pull);
DT_CYPRESS_HSIOM(uart3, cts, 6, 3, act_6, input-enable);
DT_CYPRESS_HSIOM(uart4, rx, 7, 0, act_6, input-enable);
DT_CYPRESS_HSIOM(uart4, tx, 7, 1, act_6, drive-push-pull);
DT_CYPRESS_HSIOM(uart4, rts, 7, 2, act_6, drive-push-pull);
DT_CYPRESS_HSIOM(uart4, cts, 7, 3, act_6, input-enable);
DT_CYPRESS_HSIOM(uart4, rx, 8, 0, act_6, input-enable);
DT_CYPRESS_HSIOM(uart4, tx, 8, 1, act_6, drive-push-pull);
DT_CYPRESS_HSIOM(uart4, rts, 8, 2, act_6, drive-push-pull);
DT_CYPRESS_HSIOM(uart4, cts, 8, 3, act_6, input-enable);
DT_CYPRESS_HSIOM(uart5, rx, 5, 0, act_6, input-enable);
DT_CYPRESS_HSIOM(uart5, tx, 5, 1, act_6, drive-push-pull);
DT_CYPRESS_HSIOM(uart5, rts, 5, 2, act_6, drive-push-pull);
DT_CYPRESS_HSIOM(uart5, cts, 5, 3, act_6, input-enable);
DT_CYPRESS_HSIOM(uart5, rx, 11, 0, act_6, input-enable);
DT_CYPRESS_HSIOM(uart5, tx, 11, 1, act_6, drive-push-pull);
DT_CYPRESS_HSIOM(uart5, rts, 11, 2, act_6, drive-push-pull);
DT_CYPRESS_HSIOM(uart5, cts, 11, 3, act_6, input-enable);
DT_CYPRESS_HSIOM(uart6, rx, 6, 4, act_6, input-enable);
DT_CYPRESS_HSIOM(uart6, tx, 6, 5, act_6, drive-push-pull);
DT_CYPRESS_HSIOM(uart6, rts, 6, 6, act_6, drive-push-pull);
DT_CYPRESS_HSIOM(uart6, cts, 6, 7, act_6, input-enable);
DT_CYPRESS_HSIOM(uart6, rx, 12, 0, act_6, input-enable);
DT_CYPRESS_HSIOM(uart6, tx, 12, 1, act_6, drive-push-pull);
DT_CYPRESS_HSIOM(uart6, rts, 12, 2, act_6, drive-push-pull);
DT_CYPRESS_HSIOM(uart6, cts, 12, 3, act_6, input-enable);
DT_CYPRESS_HSIOM(uart6, rx, 13, 0, act_6, input-enable);
DT_CYPRESS_HSIOM(uart6, tx, 13, 1, act_6, drive-push-pull);
DT_CYPRESS_HSIOM(uart6, rts, 13, 2, act_6, drive-push-pull);
DT_CYPRESS_HSIOM(uart6, cts, 13, 3, act_6, input-enable);
DT_CYPRESS_HSIOM(uart7, rx, 1, 0, act_6, input-enable);
DT_CYPRESS_HSIOM(uart7, tx, 1, 1, act_6, drive-push-pull);
DT_CYPRESS_HSIOM(uart7, rts, 1, 2, act_6, drive-push-pull);
DT_CYPRESS_HSIOM(uart7, cts, 1, 3, act_6, input-enable);
};
};
};
63 changes: 60 additions & 3 deletions dts/arm/cypress/psoc6.dtsi
Original file line number Diff line number Diff line change
Expand Up @@ -248,21 +248,78 @@
};
};

uart0: uart@40610000 {
compatible = "cypress,psoc6-uart";
reg = <0x40610000 0x10000>;
interrupts = <41 7>;
peripheral-id = <0>;
status = "disabled";
label = "uart_0";
};
uart1: uart@40620000 {
compatible = "cypress,psoc6-uart";
reg = <0x40620000 0x10000>;
interrupts = <42 7>;
peripheral-id = <1>;
status = "disabled";
label = "uart_1";
};
uart2: uart@40630000 {
compatible = "cypress,psoc6-uart";
reg = <0x40630000 0x10000>;
interrupts = <43 7>;
peripheral-id = <2>;
status = "disabled";
label = "uart_2";
};
uart3: uart@40640000 {
compatible = "cypress,psoc6-uart";
reg = <0x40640000 0x10000>;
interrupts = <44 7>;
peripheral-id = <3>;
status = "disabled";
label = "uart_3";
};
uart4: uart@40650000 {
compatible = "cypress,psoc6-uart";
reg = <0x40650000 0x10000>;
interrupts = <45 7>;
peripheral-id = <4>;
status = "disabled";
label = "uart_4";
};
uart5: uart@40660000 {
compatible = "cypress,psoc6-uart";
reg = <0x40660000 0x10000>;
interrupts = <2 1>;
interrupts = <46 7>;
peripheral-id = <5>;
status = "disabled";
label = "uart_5";
};

uart6: uart@40670000 {
compatible = "cypress,psoc6-uart";
reg = <0x40670000 0x10000>;
interrupts = <2 1>;
interrupts = <47 7>;
peripheral-id = <6>;
status = "disabled";
label = "uart_6";
};
uart7: uart@40680000 {
compatible = "cypress,psoc6-uart";
reg = <0x40680000 0x10000>;
interrupts = <48 7>;
peripheral-id = <7>;
status = "disabled";
label = "uart_7";
};
uart8: uart@40690000 {
compatible = "cypress,psoc6-uart";
reg = <0x40690000 0x10000>;
interrupts = <18 7>;
peripheral-id = <8>;
status = "disabled";
label = "uart_8";
};

uid: device_uid@16000600 {
compatible = "cypress,psoc6-uid";
Expand Down
21 changes: 20 additions & 1 deletion dts/bindings/serial/cypress,psoc6-uart.yaml
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
# Copyright (c) 2018, Cypress
# Copyright (c) 2020, ATL Electronics
# SPDX-License-Identifier: Apache-2.0

description: Cypress UART
description: Cypress SCB[UART]

compatible: "cypress,psoc6-uart"

Expand All @@ -13,3 +14,21 @@ properties:

interrupts:
required: true

peripheral-id:
type: int
description: peripheral ID
required: true

pinctrl-0:
type: phandles
description: |
Port pin configuration for RX & TX signals. We expect that the
phandles will reference pinctrl nodes. These nodes will have a
nodelabel that matches the Cypress SoC HAL defines and be of the
form p<port>_<pin>_<periph><inst>_<signal>.
For example the UART on PSoC-63 Pioneer Kit would be
pinctrl-0 = <&p5_0_uart5_rx &p5_1_uart5_tx>;
required: true

0 comments on commit e6cba8d

Please sign in to comment.