Merge remote-tracking branch 'origin/k1-dev' into k1-release

Change-Id: Id57b1298ae73d10fdc3344e88fe14adf00765a5f
This commit is contained in:
zhangmeng
2025-07-17 16:07:52 +08:00
10 changed files with 1232 additions and 47 deletions

View File

@@ -8,5 +8,5 @@ dtb-$(CONFIG_SOC_SPACEMIT_K1X) += k1-x_fpga.dtb k1-x_fpga_1x4.dtb k1-x_fpga_2x2.
k1-x_baton-camera.dtb k1-x_FusionOne.dtb k1-x_InnoBoard-Pi.dtb \
k1-x_ZT001H.dtb k1-x_uav.dtb k1-x_MUSE-Paper2.dtb \
k1-x_bit-brick.dtb k1-x_LX-V10.dtb k1-x_NetBridge-C1.dtb \
k1-x_MUSE-Pi-Pro.dtb k1-x_som.dtb k1-x_ZT_RVOH007.dtb
k1-x_MUSE-Pi-Pro.dtb k1-x_som.dtb k1-x_ZT_RVOH007.dtb k1-x_RV4B.dtb
obj-$(CONFIG_BUILTIN_DTB) += $(addsuffix .o, $(dtb-y))

File diff suppressed because it is too large Load Diff

View File

@@ -271,7 +271,7 @@
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_i2c1>;
spacemit,i2c-fast-mode;
status = "disabled";
status = "okay";
};
&i2c2 {
@@ -881,7 +881,7 @@
twsi-index = <0>;
status = "disabled";
status = "okay";
};
/* MIPI CSI3 data line2,3 clk lane2 */
@@ -919,12 +919,12 @@
//pwm-enable;
//pwms = <&pwm16 10000>;
status = "disabled";
status = "okay";
};
&csiphy0 {
status = "disabled";
status = "okay";
};
&csiphy1 {
@@ -934,25 +934,25 @@
&csiphy2 {
status = "disabled";
status = "okay";
};
&ccic0 {
power-domains = <&power K1X_PMU_ISP_PWR_DOMAIN>;
status = "disabled";
status = "okay";
};
&ccic1 {
power-domains = <&power K1X_PMU_ISP_PWR_DOMAIN>;
status = "disabled";
status = "okay";
};
&ccic2 {
power-domains = <&power K1X_PMU_ISP_PWR_DOMAIN>;
status = "disabled";
status = "okay";
};
&isp {

View File

@@ -1385,25 +1385,25 @@ static int camsnr_of_parse(struct cam_sensor_device *sensor)
}
sensor->dphy_no = (u8) dphy_no;
sensor->afvdd = devm_regulator_get_exclusive(dev, "af_2v8");
sensor->afvdd = devm_regulator_get(dev, "af_2v8");
if (IS_ERR(sensor->afvdd)) {
cam_dbg("Failed to get regulator, guess sensor no need to control af_2v8\n");
sensor->afvdd = NULL;
}
sensor->avdd = devm_regulator_get_exclusive(dev, "avdd_2v8");
sensor->avdd = devm_regulator_get(dev, "avdd_2v8");
if (IS_ERR(sensor->avdd)) {
cam_dbg("Failed to get regulator, guess sensor no need to control avdd_2v8\n");
sensor->avdd = NULL;
}
sensor->dovdd = devm_regulator_get_exclusive(dev, "dovdd_1v8");
sensor->dovdd = devm_regulator_get(dev, "dovdd_1v8");
if (IS_ERR(sensor->dovdd)) {
cam_dbg("Failed to get regulator, guess sensor no need to control dovdd_1v8\n");
sensor->dovdd = NULL;
}
sensor->dvdd = devm_regulator_get_exclusive(dev, "dvdd_1v2");
sensor->dvdd = devm_regulator_get(dev, "dvdd_1v2");
if (IS_ERR(sensor->dvdd)) {
cam_dbg("Failed to get regulator, guess sensor no need to control dvdd_1v2\n");
sensor->dvdd = NULL;

View File

@@ -1424,8 +1424,10 @@ static void spacemit_sdhci_request_done(struct sdhci_host *host,
mmc_request_done(host->mmc, mrq);
if (!(host->mmc->caps2 & MMC_CAP2_NO_SDIO))
if (!(host->mmc->caps2 & MMC_CAP2_NO_SDIO)) {
atomic_dec(&pdata->ref_count);
wake_up(&pdata->wait_queue);
}
}
static const struct sdhci_ops spacemit_sdhci_ops = {

View File

@@ -995,6 +995,12 @@ enum rtw_phl_status rtw_phl_init(void *drv_priv, void **phl,
goto error_vers_check;
}
if (false == rtw_phl_regu_interface_init(phl_info)) {
phl_status = RTW_PHL_STATUS_HAL_INIT_FAILURE;
PHL_ERR("rtw_phl_regu_interface_init failed\n");
goto error_phl_regu_interface_init;
}
hal_status = rtw_hal_init(drv_priv, phl_info->phl_com,
&(phl_info->hal), ic_info->ic_id);
if ((hal_status != RTW_HAL_STATUS_SUCCESS) || (phl_info->hal == NULL)) {
@@ -1096,8 +1102,10 @@ error_phl_var_init:
error_hal_var_init:
error_hal_read_chip_info:
rtw_hal_deinit(phl_info->phl_com, phl_info->hal);
error_vers_check:
error_hal_init:
rtw_phl_regu_interface_deinit(phl_info);
error_phl_regu_interface_init:
error_vers_check:
#ifdef CONFIG_RTW_ACS
phl_acs_info_deinit(phl_info);
error_phl_acs_info_init:
@@ -1156,6 +1164,7 @@ void rtw_phl_deinit(void *phl)
phl_qm_deinit(phl_info);
#endif /* CONFIG_QOS_MG */
rtw_hal_deinit(phl_info->phl_com, phl_info->hal);
rtw_phl_regu_interface_deinit(phl_info);
phl_var_deinit(phl_info);
#ifdef CONFIG_FSM
phl_fsm_module_deinit(phl_info);

View File

@@ -1547,6 +1547,19 @@ static int k1x_power_on(struct k1x_pcie *k1x, int on)
return 0;
}
static void k1x_pcie_hold_phy_rst(struct k1x_pcie *k1x)
{
u32 reg;
reg = k1x_pcie_readl(k1x, PCIECTRL_K1X_CONF_DEVICE_CMD);
if (reg & APP_HOLD_PHY_RST) {
dev_dbg(k1x->pci->dev, "k1x_pcie_hold_phy_rst: phy reset already held\n");
return;
}
reg |= APP_HOLD_PHY_RST;
k1x_pcie_writel(k1x, PCIECTRL_K1X_CONF_DEVICE_CMD, reg);
}
static int k1x_pcie_probe(struct platform_device *pdev)
{
u32 reg;
@@ -1650,6 +1663,8 @@ static int k1x_pcie_probe(struct platform_device *pdev)
k1x->pci = pci;
platform_set_drvdata(pdev, k1x);
k1x_pcie_hold_phy_rst(k1x);
pm_runtime_enable(&pdev->dev);
pm_runtime_get_sync(&pdev->dev);
pm_runtime_get_noresume(&pdev->dev);
@@ -1818,6 +1833,8 @@ static int k1x_pcie_resume_noirq(struct device *dev)
struct dw_pcie_rp *pp = &pci->pp;
u32 reg;
k1x_pcie_hold_phy_rst(k1x);
/* soft no reset */
reg = k1x_pcie_readl(k1x, PCIE_CTRL_LOGIC);
reg &= ~(1 << 0);

View File

@@ -501,6 +501,9 @@ static const struct pinmux_ops pcs_pinmux_ops = {
.get_function_groups = pinmux_generic_get_function_groups,
.set_mux = pcs_set_mux,
.gpio_request_enable = pcs_request_gpio,
#ifdef CONFIG_SOC_SPACEMIT_K1X
.strict = true,
#endif
};
/* Clear BIAS value */

View File

@@ -50,6 +50,8 @@
#define HUSB239_REG_SRC_PDO_5V 0x6A
#define HUSB239_REG_SRC_PDO_9V 0x6B
#define HUSB239_REG_SRC_PDO_12V 0x6C
#define HUSB239_REG_SRC_PDO_15V 0x6D
#define HUSB239_REG_SRC_PDO_20V 0x6E
#define HUSB239_REG_MAX 0xFF
@@ -156,6 +158,8 @@
#define HUSB239_PD_COMM(s) (!!((s) & BIT(4)))
#define HUSB239_POWER_ROLE(s) (!!((s) & BIT(6)))
#define PD_DEETCT_DELAY_MS 1000
enum husb239_snkcap {
SNKCAP_5V = 1,
SNKCAP_9V,
@@ -204,6 +208,7 @@ struct husb239 {
struct gpio_desc *int_gpiod;
int gpio_irq;
struct work_struct work;
struct delayed_work pd_work;
struct workqueue_struct *workqueue;
struct mutex lock;
@@ -347,10 +352,15 @@ static void husb239_update_operating_status(struct husb239 *husb239)
else
op_current = 3000 + (status1 - STEP_BOUNDARY) * 40;
/* covert mV/mA to uV/uA */
husb239->voltage = voltage * 1000;
husb239->op_current = op_current * 1000;
husb239->psy_online = true;
if ((husb239->voltage != voltage * 1000)
|| (husb239->op_current != op_current * 1000)) {
/* covert mV/mA to uV/uA */
husb239->voltage = voltage * 1000;
husb239->op_current = op_current * 1000;
husb239->psy_online = true;
goto out;
}
return;
out:
dev_info(husb239->dev, "update sink voltage: %d current: %d\n", husb239->voltage, husb239->op_current);
@@ -456,9 +466,9 @@ static int husb239_usbpd_detect(struct husb239 *husb239)
return ret;
dev_dbg(husb239->dev, "husb239 detect pd, contract status0: %x\n", status0);
if (((status0 & HUSB239_PD_CONTRACT_MASK) >> HUSB239_PD_CONTRACT_SHIFT) == SNKCAP_5V) {
if (((status0 & HUSB239_PD_CONTRACT_MASK) >> HUSB239_PD_CONTRACT_SHIFT)) {
husb239_update_operating_status(husb239);
break;
return 0;
}
/* check attach status */
ret = regmap_read(husb239->regmap, HUSB239_REG_STATUS, &status);
@@ -512,30 +522,30 @@ static int husb239_usbpd_request_voltage(struct husb239 *husb239)
break;
}
while(--count) {
ret = regmap_read(husb239->regmap, HUSB239_REG_SRC_PDO_5V + snk_sel - 1, &src_pdo);
if (ret)
return ret;
for (; snk_sel >= SNKCAP_5V; snk_sel--) {
for (count = 10; count > 0; count--) {
ret = regmap_read(husb239->regmap, HUSB239_REG_SRC_PDO_5V + snk_sel - 1, &src_pdo);
if (ret)
return ret;
dev_dbg(husb239->dev, "husb239_attach src_pdo: %x\n", src_pdo);
if (src_pdo & HUSB239_REG_SRC_DETECT)
break;
dev_dbg(husb239->dev, "husb239_attach src_pdo: %x\n", src_pdo);
if (src_pdo & HUSB239_REG_SRC_DETECT)
goto pd_detect;
/* check attach status */
ret = regmap_read(husb239->regmap, HUSB239_REG_STATUS, &status);
if (ret)
return ret;
/* check attach status */
ret = regmap_read(husb239->regmap, HUSB239_REG_STATUS, &status);
if (ret)
return ret;
if (!(status & HUSB239_REG_STATUS_ATTACH))
return -ENODEV;
if (!(status & HUSB239_REG_STATUS_ATTACH))
return -ENODEV;
msleep(100);
msleep(100);
}
}
if (count == 0)
return -EINVAL;
dev_info(husb239->dev, "pd detect \n");
pd_detect:
dev_info(husb239->dev, "pd detect, snk_sel: %d\n", snk_sel);
ret = regmap_update_bits(husb239->regmap, HUSB239_REG_SRC_PDO,
HUSB239_REG_SRC_PDO_SEL_MASK, (snk_sel << 3));
if (ret)
@@ -567,6 +577,8 @@ static int husb239_usbpd_request_voltage(struct husb239 *husb239)
if (ret)
return ret;
queue_delayed_work(husb239->workqueue,
&husb239->pd_work, msecs_to_jiffies(PD_DEETCT_DELAY_MS));
return ret;
}
@@ -810,6 +822,17 @@ static int husb239_chip_init(struct husb239 *husb239)
return 0;
}
static void husb239_pd_func(struct work_struct *work)
{
struct husb239 *husb239 = container_of(work, struct husb239, pd_work.work);
mutex_lock(&husb239->lock);
husb239_update_operating_status(husb239);
mutex_unlock(&husb239->lock);
return;
}
static void husb239_work_func(struct work_struct *work)
{
struct husb239 *husb239 = container_of(work, struct husb239, work);
@@ -856,6 +879,7 @@ static int husb239_irq_init(struct husb239 *husb239)
int ret, status;
INIT_WORK(&husb239->work, husb239_work_func);
INIT_DELAYED_WORK(&husb239->pd_work, husb239_pd_func);
husb239->workqueue = alloc_workqueue("husb239_work",
WQ_FREEZABLE |
WQ_MEM_RECLAIM,
@@ -1285,6 +1309,9 @@ static void husb239_remove(struct i2c_client *client)
struct husb239 *husb239 = i2c_get_clientdata(client);
struct typec_info *info = &husb239->info;
cancel_work_sync(&husb239->work);
cancel_delayed_work_sync(&husb239->pd_work);
if (husb239->workqueue)
destroy_workqueue(husb239->workqueue);
@@ -1303,6 +1330,10 @@ static int __maybe_unused husb239_suspend(struct device *dev)
{
struct husb239 *husb239 = dev_get_drvdata(dev);
/* Make sure any pending irq work is finished before suspends */
flush_work(&husb239->work);
flush_delayed_work(&husb239->pd_work);
/* Clear all interruption */
regmap_write(husb239->regmap, HUSB239_REG_INT, 0xFF);
regmap_write(husb239->regmap, HUSB239_REG_INT1, 0xFF);
@@ -1313,6 +1344,10 @@ static int __maybe_unused husb239_suspend(struct device *dev)
static int __maybe_unused husb239_resume(struct device *dev)
{
struct husb239 *husb239 = dev_get_drvdata(dev);
queue_delayed_work(husb239->workqueue,
&husb239->pd_work, msecs_to_jiffies(PD_DEETCT_DELAY_MS));
return 0;
}

View File

@@ -52,6 +52,8 @@
#define BITCLK_DIV_468 (0x0 << 27)
#define FRAME_48K_I2S (0x4 << 15)
#define SYSCLK_PRE_CTRL 0x08
/*
* ssp:sspa audio private data
*/
@@ -299,16 +301,16 @@ static int i2s_sspa_hw_params(struct snd_pcm_substream *substream,
sspa_priv->mclk_fs = sspa_priv->sysclk / (params_rate(params));
switch (sspa_priv->mclk_fs) {
case 64:
target = SYSCLK_BASE_156M | 4 << 15 | 200; //64fs
target = SYSCLK_BASE_156M | 326 << 15 | 32600; //64fs
break;
case 128:
target = SYSCLK_BASE_156M | 8 << 15 | 200; //128fs
target = SYSCLK_BASE_156M | 652 << 15 | 32600; //128fs
break;
case 256:
target = SYSCLK_BASE_156M | 16 << 15 | 200; //256fs
target = SYSCLK_BASE_156M | 1304 << 15 | 32600; //256fs
break;
default:
target = SYSCLK_BASE_156M | 16 << 15 | 200; //256fs
target = SYSCLK_BASE_156M | 1304 << 15 | 32600; //256fs
break;
}
@@ -333,6 +335,10 @@ static int i2s_sspa_hw_params(struct snd_pcm_substream *substream,
val = __raw_readl(sspa->pmumain + ISCCR1);
val = val & ~0x5FFFFFFF;
__raw_writel(val | target, sspa->pmumain + ISCCR1);
val = __raw_readl(sspa->pmumain + SYSCLK_PRE_CTRL);
val |= 1 << 29;
__raw_writel(val, sspa->pmumain + SYSCLK_PRE_CTRL);
return 0;
}
@@ -479,22 +485,26 @@ static void i2s_sspa_init(struct sspa_priv *priv)
switch (priv->mclk_fs) {
case 64:
target = SYSCLK_BASE_156M | 0 << 27| 4 << 15 | 200; //64fs
target = SYSCLK_BASE_156M | 0 << 27 | 326 << 15 | 32600; //64fs
break;
case 128:
target = SYSCLK_BASE_156M | 1 << 27| 8 << 15 | 200; //128fs
target = SYSCLK_BASE_156M | 1 << 27 | 652 << 15 | 32600; //128fs
break;
case 256:
target = SYSCLK_BASE_156M | 3 << 27| 16 << 15 | 200; //256fs
target = SYSCLK_BASE_156M | 3 << 27 | 1304 << 15 | 32600; //256fs
break;
default:
target = SYSCLK_BASE_156M | 3 << 27| 16 << 15 | 200; //256fs
target = SYSCLK_BASE_156M | 3 << 27 | 1304 << 15 | 32600; //256fs
break;
}
val = __raw_readl(sspa->pmumain + ISCCR1);
val = val & ~0x5FFFFFFF;
__raw_writel(val | target, sspa->pmumain + ISCCR1);
val = __raw_readl(sspa->pmumain + SYSCLK_PRE_CTRL);
val |= 1 << 29;
__raw_writel(val, sspa->pmumain + SYSCLK_PRE_CTRL);
}
static int i2s_sspa_suspend(struct device *dev)