-
Notifications
You must be signed in to change notification settings - Fork 7.6k
drivers: firmware: Clock control TISCI driver support #90216
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
# Copyright 2024 Texas Instruments Incorporated. | ||
# SPDX-License-Identifier: Apache-2.0 | ||
|
||
config CLOCK_CONTROL_TISCI | ||
bool "TI SCI Clock Control driver" | ||
default y | ||
depends on DT_HAS_TI_K2G_SCI_CLK_ENABLED | ||
help | ||
Driver for TISCI based clock control. |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,90 @@ | ||
/* | ||
* Copyright (c) 2025, Texas Instruments | ||
* | ||
* SPDX-License-Identifier: Apache-2.0 | ||
*/ | ||
|
||
#define DT_DRV_COMPAT ti_k2g_sci_clk | ||
|
||
#include <zephyr/device.h> | ||
#include <zephyr/drivers/firmware/tisci/tisci.h> | ||
#include <zephyr/drivers/clock_control.h> | ||
#include <zephyr/drivers/clock_control/tisci_clock_control.h> | ||
#include <zephyr/devicetree.h> | ||
#include <zephyr/logging/log.h> | ||
|
||
LOG_MODULE_REGISTER(ti_k2g_sci_clk, CONFIG_CLOCK_CONTROL_LOG_LEVEL); | ||
|
||
const struct device *dmsc = DEVICE_DT_GET(DT_NODELABEL(dmsc)); | ||
|
||
static int tisci_get_rate(const struct device *dev, clock_control_subsys_t sys, uint32_t *rate) | ||
{ | ||
struct tisci_clock_config *req = (struct tisci_clock_config *)sys; | ||
uint64_t temp_rate; | ||
int ret = tisci_cmd_clk_get_freq(dmsc, req->dev_id, req->clk_id, &temp_rate); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Declare |
||
|
||
if (ret) { | ||
LOG_ERR("Failed to get clock freq: dev_id=%u clk_id=%u err=%d", req->dev_id, | ||
req->clk_id, ret); | ||
return ret; | ||
} | ||
|
||
*rate = (uint32_t)temp_rate; | ||
return 0; | ||
} | ||
|
||
static int tisci_set_rate(const struct device *dev, void *sys, void *rate) | ||
{ | ||
struct tisci_clock_config *req = (struct tisci_clock_config *)sys; | ||
uint64_t freq = *((uint64_t *)rate); | ||
int ret = tisci_cmd_clk_set_freq(dmsc, req->dev_id, req->clk_id, freq, freq, freq); | ||
|
||
if (ret) { | ||
LOG_ERR("Failed to set clock freq: dev_id=%u clk_id=%u freq=%llu err=%d", | ||
req->dev_id, req->clk_id, freq, ret); | ||
} | ||
return ret; | ||
} | ||
|
||
static inline enum clock_control_status tisci_get_status(const struct device *dev, | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. inline? |
||
clock_control_subsys_t sys) | ||
{ | ||
enum clock_control_status state = CLOCK_CONTROL_STATUS_UNKNOWN; | ||
struct tisci_clock_config *req = (struct tisci_clock_config *)sys; | ||
bool req_state = true; | ||
bool curr_state = true; | ||
int ret; | ||
|
||
ret = tisci_cmd_clk_is_on(dmsc, req->clk_id, req->dev_id, &req_state, &curr_state); | ||
if (ret) { | ||
LOG_ERR("Failed to get clock ON status: dev_id=%u clk_id=%u err=%d", req->dev_id, | ||
req->clk_id, ret); | ||
return CLOCK_CONTROL_STATUS_UNKNOWN; | ||
} | ||
if (curr_state) { | ||
return CLOCK_CONTROL_STATUS_ON; | ||
} | ||
if (req_state && !curr_state) { | ||
return CLOCK_CONTROL_STATUS_STARTING; | ||
} | ||
curr_state = true; | ||
ret = tisci_cmd_clk_is_off(dmsc, req->clk_id, req->dev_id, NULL, &curr_state); | ||
if (ret) { | ||
LOG_ERR("Failed to get clock OFF status: dev_id=%u clk_id=%u err=%d", req->dev_id, | ||
req->clk_id, ret); | ||
return CLOCK_CONTROL_STATUS_UNKNOWN; | ||
} | ||
if (curr_state) { | ||
return CLOCK_CONTROL_STATUS_OFF; | ||
} | ||
return state; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
|
||
} | ||
|
||
static DEVICE_API(clock_control, tisci_clock_driver_api) = { | ||
.get_rate = tisci_get_rate, .set_rate = tisci_set_rate, .get_status = tisci_get_status}; | ||
|
||
#define TI_K2G_SCI_CLK_INIT(_n) \ | ||
DEVICE_DT_INST_DEFINE(_n, NULL, NULL, NULL, NULL, PRE_KERNEL_1, \ | ||
CONFIG_CLOCK_CONTROL_INIT_PRIORITY, &tisci_clock_driver_api); | ||
|
||
DT_INST_FOREACH_STATUS_OKAY(TI_K2G_SCI_CLK_INIT) |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
# Copyright 2025 Texas Instruments Incorporated. | ||
# SPDX-License-Identifier: Apache-2.0 | ||
|
||
description: TI-SCI clock controller | ||
|
||
compatible: "ti,k2g-sci-clk" | ||
|
||
include: | ||
- clock-controller.yaml | ||
- base.yaml | ||
|
||
properties: | ||
"#clock-cells": | ||
type: int | ||
required: true | ||
description: > | ||
Number of cells required to specify a clock provided by this controller. | ||
const: 2 | ||
|
||
clock-cells: | ||
- devid | ||
- clkid |
Original file line number | Diff line number | Diff line change | ||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,39 @@ | ||||||||||||||||||||
/* | ||||||||||||||||||||
* Copyright (c) 2025 Texas Instruments | ||||||||||||||||||||
* | ||||||||||||||||||||
* SPDX-License-Identifier: Apache-2.0 | ||||||||||||||||||||
*/ | ||||||||||||||||||||
|
||||||||||||||||||||
#ifndef ZEPHYR_DRIVERS_CLOCK_CONTROL_TISCI_CLOCK_CONTROL_H_ | ||||||||||||||||||||
#define ZEPHYR_DRIVERS_CLOCK_CONTROL_TISCI_CLOCK_CONTROL_H_ | ||||||||||||||||||||
|
||||||||||||||||||||
/** | ||||||||||||||||||||
* @struct tisci_clock_config | ||||||||||||||||||||
* @brief Clock configuration structure | ||||||||||||||||||||
* | ||||||||||||||||||||
* This structure is used to define the configuration for a clock, including | ||||||||||||||||||||
* the device ID and clock ID. | ||||||||||||||||||||
* | ||||||||||||||||||||
* @param tisci_clock_config::dev_id | ||||||||||||||||||||
* Device ID associated with the clock. | ||||||||||||||||||||
* | ||||||||||||||||||||
* @param tisci_clock_config::clk_id | ||||||||||||||||||||
* Clock ID within the device. | ||||||||||||||||||||
*/ | ||||||||||||||||||||
#include <stdint.h> | ||||||||||||||||||||
struct tisci_clock_config { | ||||||||||||||||||||
uint32_t dev_id; | ||||||||||||||||||||
uint32_t clk_id; | ||||||||||||||||||||
}; | ||||||||||||||||||||
|
||||||||||||||||||||
#define TISCI_GET_CLOCK(_dev) DEVICE_DT_GET(DT_PHANDLE(DT_NODELABEL(_dev), clocks)) | ||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
I feel we should follow the |
||||||||||||||||||||
|
||||||||||||||||||||
#define TISCI_GET_CLOCK_DETAILS(_dev) \ | ||||||||||||||||||||
{.dev_id = DT_CLOCKS_CELL(DT_NODELABEL(_dev), devid), \ | ||||||||||||||||||||
.clk_id = DT_CLOCKS_CELL(DT_NODELABEL(_dev), clkid)} | ||||||||||||||||||||
|
||||||||||||||||||||
Comment on lines
+31
to
+34
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. same here |
||||||||||||||||||||
#define TISCI_GET_CLOCK_BY_INST(inst) DEVICE_DT_INST_GET(inst) | ||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||||||||||||
|
||||||||||||||||||||
#define TISCI_GET_CLOCK_DETAILS_BY_INST(inst) \ | ||||||||||||||||||||
{.dev_id = DT_INST_CLOCKS_CELL(inst, devid), .clk_id = DT_INST_CLOCKS_CELL(inst, clkid)} | ||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||||||||||||
#endif |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The above look unrelated, seems like you had some rebase issue going on here.