From cefbf1d0eae1bd6b3f2f1b7f9a7522052257aa9e Mon Sep 17 00:00:00 2001 From: =?utf8?q?=E9=92=A6=E5=B3=B0?= Date: Tue, 19 Mar 2024 14:39:48 +0800 Subject: [PATCH] 1:fix compile warning 2:add aon set magic Change-Id: I511dc51ff71ae9567dcc0b6b91f6bcac1ae61f3b --- arch/riscv/dts/light-a-val.dts | 3 +- arch/riscv/dts/light-b-product.dts | 4 +- arch/riscv/dts/light-lpi4a.dts | 2 +- board/thead/light-c910/board.c | 27 +- board/thead/light-c910/light.c | 1 - .../light-c910/lpddr4/include/ddr_retention.h | 1 + .../light-c910/lpddr4/src/ddr_retention.c | 3 +- board/thead/light-c910/spl.c | 1 - drivers/misc/light_regu.c | 418 +++++++++++++----- drivers/misc/light_regu.h | 246 ++++++----- 10 files changed, 468 insertions(+), 238 deletions(-) diff --git a/arch/riscv/dts/light-a-val.dts b/arch/riscv/dts/light-a-val.dts index a90a4917..87db40a9 100644 --- a/arch/riscv/dts/light-a-val.dts +++ b/arch/riscv/dts/light-a-val.dts @@ -513,8 +513,6 @@ compatible = "thead,light-dialog-pmic"; status = "okay"; - - soc_dvdd18_aon_reg: soc_dvdd18_aon { regulator-name = "soc_dvdd18_aon"; regulator-boot-on; @@ -669,6 +667,7 @@ status = "okay"; #address-cells = <1>; #size-cells = <0>; + iic-config = <0 0 2>; pmic_dev_0: pmic-dev@0 { pmic-name = "dialog,da9063,v1"; pmic-addr = <0x5a 0x5b>; diff --git a/arch/riscv/dts/light-b-product.dts b/arch/riscv/dts/light-b-product.dts index a932f5c9..cfd7dd97 100644 --- a/arch/riscv/dts/light-b-product.dts +++ b/arch/riscv/dts/light-b-product.dts @@ -663,8 +663,8 @@ compatible = "thead,light-pmic-conf"; status = "okay"; #address-cells = <1>; - #size-cells = <0>; - + #size-cells = <0>; + iic-config = <0 0 2>; pmic_dev_0: pmic-dev@0 { pmic-name = "ricoh,rn5t567,v0"; pmic-addr = <0x31>; diff --git a/arch/riscv/dts/light-lpi4a.dts b/arch/riscv/dts/light-lpi4a.dts index e252b462..485ead7e 100644 --- a/arch/riscv/dts/light-lpi4a.dts +++ b/arch/riscv/dts/light-lpi4a.dts @@ -677,7 +677,7 @@ #address-cells = <1>; #size-cells = <0>; - + iic-config = <0 0 2>; pmic_dev_0: pmic-dev@0 { pmic-name = "dialog,da9063,v1"; pmic-addr = <0x5a 0x5b>; diff --git a/board/thead/light-c910/board.c b/board/thead/light-c910/board.c index 91fd9e58..a5fa1cab 100644 --- a/board/thead/light-c910/board.c +++ b/board/thead/light-c910/board.c @@ -17,6 +17,7 @@ #ifdef CONFIG_LIGHT_AON_CONF #include "../../../drivers/misc/light_regu.h" #include "dm/device.h" +#include "dm/uclass.h" #endif #ifdef CONFIG_USB_DWC3 @@ -141,7 +142,7 @@ void boot_audio(void) #ifdef CONFIG_LIGHT_AON_CONF -int get_and_set_aon_config_data() +int get_and_set_aon_config_data(void) { int ret =0; struct udevice *dev; @@ -156,12 +157,12 @@ int get_and_set_aon_config_data() config_data = (struct mic_regu_platdata *)(dev->platdata); volatile aon_config_t* read_config = (aon_config_t* )C910_E902_START_ADDRESS; - if(strncmp(read_config->magic , AON_CONFIG_MAGIC, strlen(AON_CONFIG_MAGIC))) { + if(strncmp((const char*)read_config->magic , AON_CONFIG_MAGIC, strlen(AON_CONFIG_MAGIC))) { printf("No aon config magic found in aon bin, please check the aon bin\n"); return -1; } - if(strncmp(read_config->version, AON_CONFIG_VERSION, strlen(AON_CONFIG_VERSION))) { + if(strncmp((const char*)read_config->version, AON_CONFIG_VERSION, strlen(AON_CONFIG_VERSION))) { printf("Err aon config version, aon bin is:%s, u-boot is:%s\n", read_config->version, AON_CONFIG_VERSION); return -1; } @@ -174,25 +175,28 @@ int get_and_set_aon_config_data() /*set pmic dev info */ int pmic_dev_num = config_data->pmic_list.pmic_num; int pmic_dev_list_offset = sizeof(aon_config_t); - uintptr_t pmic_dev_start_addr = C910_E902_START_ADDRESS + pmic_dev_list_offset; + uint64_t pmic_dev_start_addr = C910_E902_START_ADDRESS + pmic_dev_list_offset; int regu_num = config_data->regu_id_list.regu_id_num; int regu_id_list_offset = pmic_dev_list_offset + pmic_dev_num * sizeof(pmic_dev_info_t); - uintptr_t regu_start_addr = C910_E902_START_ADDRESS + regu_id_list_offset; + uint64_t regu_start_addr = C910_E902_START_ADDRESS + regu_id_list_offset; int aon_bin_size = regu_id_list_offset + regu_num* sizeof(csi_regu_id_t); if( aon_bin_size > read_config->aon_config_partition_size) { - printf("Invalid aon partition size, aon bin support:%d, u-boot is %d\n", read_config->aon_config_partition_size, aon_bin_size); + printf("Invalid aon partition size, aon bin support:%lld, u-boot is %d\n", read_config->aon_config_partition_size, aon_bin_size); return -1; } - printf("pmic_dev_num:%d offset:%d addr:0x%10x\n",pmic_dev_num, pmic_dev_list_offset, pmic_dev_start_addr); + printf("pmic_dev_num:%d offset:%d addr:%lld\n",pmic_dev_num, pmic_dev_list_offset, pmic_dev_start_addr); - memcpy(pmic_dev_start_addr, config_data->pmic_list.pmic_list, pmic_dev_num * sizeof(pmic_dev_info_t)); - printf("regu_num:%d offset:%d addr:0x%10x\n",regu_num,regu_id_list_offset, regu_start_addr); + memcpy((void*)pmic_dev_start_addr, config_data->pmic_list.pmic_list, pmic_dev_num * sizeof(pmic_dev_info_t)); + printf("regu_num:%d offset:%d addr:%lld\n",regu_num,regu_id_list_offset, regu_start_addr); - memcpy(regu_start_addr, config_data->regu_id_list.regu_id_list, regu_num * sizeof(csi_regu_id_t)); + memcpy((void*)regu_start_addr, config_data->regu_id_list.regu_id_list, regu_num * sizeof(csi_regu_id_t)); read_config->wakeup_flag = config_data->wakeup_flag; + read_config->aon_pmic.iic_config.iic_id = config_data->iic_config.iic_id; + read_config->aon_pmic.iic_config.addr_mode = config_data->iic_config.addr_mode; + read_config->aon_pmic.iic_config.speed = config_data->iic_config.speed; read_config->aon_pmic.pmic_dev_num = pmic_dev_num; read_config->aon_pmic.pmic_dev_list_offset = pmic_dev_list_offset; @@ -200,11 +204,12 @@ int get_and_set_aon_config_data() read_config->aon_pmic.regu_num = regu_num; read_config->aon_pmic.regu_id_list_offset = regu_id_list_offset; + memcpy((void*)read_config->uboot_set_magic, UBOOT_CONFIG_MAGIC, strlen(UBOOT_CONFIG_MAGIC)); + flush_cache((uintptr_t)C910_E902_START_ADDRESS, aon_bin_size); printf("-->pmic_dev_num:%d offset:%d\n",read_config->aon_pmic.pmic_dev_num, read_config->aon_pmic.pmic_dev_list_offset); printf("-->regu_num:%d offset:%d\n",read_config->aon_pmic.regu_num,read_config->aon_pmic.regu_id_list_offset); - return 0; } #endif diff --git a/board/thead/light-c910/light.c b/board/thead/light-c910/light.c index 85395026..c777ad98 100644 --- a/board/thead/light-c910/light.c +++ b/board/thead/light-c910/light.c @@ -1476,7 +1476,6 @@ static void light_iopin_init(void) light_pin_cfg(AUDIO_PA29, PIN_SPEED_NORMAL, PIN_PN, 2); light_pin_mux(AUDIO_PA30, 0); light_pin_cfg(AUDIO_PA30, PIN_SPEED_NORMAL, PIN_PN, 2); - #warning "aon set to 3" light_pin_mux(AUDIO_PA30, 3); // light_pin_mux(AUDIO_PA9,3); ///AUDIO-PA-RESET diff --git a/board/thead/light-c910/lpddr4/include/ddr_retention.h b/board/thead/light-c910/lpddr4/include/ddr_retention.h index 0268bd38..42eb034f 100644 --- a/board/thead/light-c910/lpddr4/include/ddr_retention.h +++ b/board/thead/light-c910/lpddr4/include/ddr_retention.h @@ -31,5 +31,6 @@ typedef struct Ddr_Reg_Config { } Ddr_Reg_Config_t; int dwc_ddrphy_phyinit_regInterface(regInstr myRegInstr); +void dwc_ddr_misc_regu_save(void); #endif diff --git a/board/thead/light-c910/lpddr4/src/ddr_retention.c b/board/thead/light-c910/lpddr4/src/ddr_retention.c index fb628369..eed83aac 100644 --- a/board/thead/light-c910/lpddr4/src/ddr_retention.c +++ b/board/thead/light-c910/lpddr4/src/ddr_retention.c @@ -988,9 +988,8 @@ static const uint32_t RetRegList_addr[934] = 0x13840, }; -void dwc_ddr_misc_regu_save() +void dwc_ddr_misc_regu_save(void) { - uint32_t data = 0; ddr_Regu_Config->misc_reg_num = ARRAY_SIZE(MiscRegList); Reg_Misc_Addr_Val_t* misc_addr_t = (Reg_Misc_Addr_Val_t*)((char*)ddr_Regu_Config + 64); for(int i = 0; i < ddr_Regu_Config->misc_reg_num; i++) { diff --git a/board/thead/light-c910/spl.c b/board/thead/light-c910/spl.c index 7d9fa418..6358a930 100644 --- a/board/thead/light-c910/spl.c +++ b/board/thead/light-c910/spl.c @@ -377,7 +377,6 @@ int boundary_verify(unsigned long boundary) { int setup_ddr_addrmap(void) { - int ret; unsigned long boundary = (unsigned long)MAXIMAL_DDR_DENSITY_MB * UNIT_MB; // verify data accessing result firstly diff --git a/drivers/misc/light_regu.c b/drivers/misc/light_regu.c index 7d93a583..11376929 100644 --- a/drivers/misc/light_regu.c +++ b/drivers/misc/light_regu.c @@ -6,6 +6,7 @@ #include #include #include "light_regu.h" +#include #define FDT32_TO_CPU(x) (fdt32_to_cpu(x)) @@ -18,7 +19,7 @@ #endif #ifdef AON_CONF_DEBUG -#define AON_CONF_D(fmt, args...) printf(fmt,##args) +#define AON_CONF_D(fmt, args...) printf(fmt, ##args) #else #define AON_CONF_D(fmt, args...) #endif @@ -69,7 +70,7 @@ static int misc_regu_remove(struct udevice *dev) return 0; } -static soc_virtual_id_t *found_base_virtual_id(char *name) +static soc_virtual_id_t *found_base_virtual_id(const char *name) { for (int i = 0; i < ARRAY_SIZE(soc_base_virtual_id_list); i++) { @@ -111,7 +112,7 @@ static int misc_regu_get_virtual_regu_config(struct udevice *dev, ofnode parent_ soc_virtual_id_t *soc_base_id; ofnode_for_each_subnode(child_node, parent_node) { - //printf("sub node name: %s\n", ofnode_get_name(child_node)); + // printf("sub node name: %s\n", ofnode_get_name(child_node)); regu_num++; } @@ -134,8 +135,8 @@ static int misc_regu_get_virtual_regu_config(struct udevice *dev, ofnode parent_ ofnode_for_each_subnode(child_node, parent_node) { const char *virtual_id_name = ofnode_get_name(child_node); - int min_uv; - int max_uv; + uint32_t min_uv; + uint32_t max_uv; soc_base_id = found_base_virtual_id(virtual_id_name); if (soc_base_id) { @@ -173,7 +174,11 @@ static int misc_regu_get_virtual_regu_config(struct udevice *dev, ofnode parent_ { id_list[index].max_uv = max_uv; } -#warning "check double" + if (id_list[index].max_uv < id_list[index].min_uv) + { + printf("id:%d regulator-max-microvolt:%d is smaller than regulator-min-microvolt:%d\n", index, id_list[index].max_uv, id_list[index].min_uv); + return -1; + } // printf("Get virtual regu_id:[%d]:%s min_uv:%dmv max_uv:%dmv\n", id_list[index].id, id_list[index].virtual_id_name, // id_list[index].min_uv, id_list[index].max_uv); index++; @@ -185,12 +190,12 @@ static int misc_regu_get_virtual_regu_config(struct udevice *dev, ofnode parent_ return 0; } -static int misc_grep_pmic_dev_name_info(char *dev_name, pmic_dev_info_t *dev) +static int misc_grep_pmic_dev_name_info(const char *dev_name, pmic_dev_info_t *dev) { int flag_num = 0; int version_flag = 0; int index = 0; - char *dev_name_orig = dev_name; + const char *dev_name_orig = dev_name; while (*dev_name) { if (*dev_name == ',') @@ -235,20 +240,117 @@ static int get_node_index(const char *name) return strtoul(name, NULL, 10); } +static int misc_pmic_parent_io_ctrl_config(ofnode dev_node, pmic_parent_ctrl_info_t *ctrl_info) +{ + ofnode parent_ctrl_sub_node, parent_pmic_node; + int get_aon_ctrl_info_flag = 0; + int get_pmic_pin_ctrl_info_flag = 0; + uint32_t prop_size; + int prop_len; + const uint32_t *prop_val; + + ofnode_for_each_subnode(parent_ctrl_sub_node, dev_node) + { + const char *node_name = ofnode_get_name(parent_ctrl_sub_node); + if (!strncmp(node_name, PMIC_PARENT_CTRL_NAME, strlen(PMIC_PARENT_CTRL_NAME))) + { + if (ofnode_read_bool(parent_ctrl_sub_node, "aon_pin_ctrl_info")) + { + prop_val = ofnode_get_property(parent_ctrl_sub_node, "aon_pin_ctrl_info", &prop_len); + if (!prop_val) + { + printf("aon_pin_ctrl_info property not found\n"); + return -1; + } + prop_size = prop_len / sizeof(uint32_t); + if (prop_size != 3) + { + printf("invalid pmic-aon_pin_ctrl_info cell size %d, it should set format as aon_pin_ctrl_info = < >\n", prop_size); + return -1; + } + ctrl_info->pmic_ctrl_type = PMIC_CTRL_BY_AON_GPIO; + ctrl_info->info.aon_io.gpio_port = FDT32_TO_CPU(prop_val[0]); + ctrl_info->info.aon_io.pin = FDT32_TO_CPU(prop_val[1]); + ctrl_info->info.aon_io.activate_status = FDT32_TO_CPU(prop_val[2]); + if (ctrl_info->info.aon_io.activate_status != HW_ID_ACTIVATE_HIGH && ctrl_info->info.aon_io.activate_status != HW_ID_ACTIVATE_LOW) + { + printf("aon io activate should set to: ACTIVATE_HIGH:0 or ACTIVATE_LOW:1"); + return -1; + } + get_aon_ctrl_info_flag = 1; + } + + if (ofnode_read_bool(parent_ctrl_sub_node, "pmic_pin_ctrl_info")) + { + prop_val = ofnode_get_property(parent_ctrl_sub_node, "pmic_pin_ctrl_info", &prop_len); + if (!prop_val) + { + printf("pmic_pin_ctrl_info property not found\n"); + return -1; + } + prop_size = prop_len / sizeof(uint32_t); + if (prop_size != 3) + { + printf("invalid pmic-pmic_pin_ctrl_info cell size %d, it should set format as pmic_pin_ctrl_info = <<&pmic_dev> >\n", prop_size); + return -1; + } + + parent_pmic_node = ofnode_get_by_phandle(FDT32_TO_CPU(prop_val[0])); + if (!ofnode_valid(parent_pmic_node)) + { + printf("parent_pmic_node not found\n"); + return -1; + } + int parent_pmic_index = get_node_index(ofnode_get_name(parent_pmic_node)); + if (parent_pmic_index < 0) + { + printf("parent_pmic_node index not found\n"); + return -1; + } + + ctrl_info->pmic_ctrl_type = PMIC_CTRL_BY_PMIC_GPIO; + ctrl_info->info.pmic_io.pmic_id = parent_pmic_index; + ctrl_info->info.pmic_io.io_hw_id = FDT32_TO_CPU(prop_val[1]); + ctrl_info->info.pmic_io.activate_status = FDT32_TO_CPU(prop_val[2]); + if (ctrl_info->info.pmic_io.activate_status != HW_ID_ACTIVATE_HIGH && ctrl_info->info.pmic_io.activate_status != HW_ID_ACTIVATE_LOW) + { + printf("pmic io activate should set to: HW_ID_ACTIVATE_HIGH:0 or HW_ID_ACTIVATE_LOW:1"); + return -1; + } + get_pmic_pin_ctrl_info_flag = 1; + } + + if (get_aon_ctrl_info_flag && get_pmic_pin_ctrl_info_flag) + { + printf("aon_pin_ctrl_info or pmic_pin_ctrl_info should only support one for a pmic dev\n"); + return -1; + } + if (!get_aon_ctrl_info_flag && !get_pmic_pin_ctrl_info_flag) + { + printf("aon_pin_ctrl_info or pmic_pin_ctrl_info should only support one for a pmic dev\n"); + return -1; + } + return 0; + } + } + ctrl_info->pmic_ctrl_type = PMIC_CTRL_BY_NOTHINTG; + return 0; +} + static int misc_regu_get_pmic_dev_config(ofnode parent_node, pmic_dev_info_t *pmic_dev_info_list) { int ret = 0; - ofnode child_node, errio_node; - fdt_addr_t index; - char *pmic_name; + ofnode child_node; + int index; + const char *pmic_name; int pmic_wdt_flag = 0; int pmic_index = 0; int pmic_addr_len = 0, pmic_addr_size; int gpio_addr_len = 0, gpio_addr_size; char err_io_str[40] = "NOT_SUPPORT"; char lpm_io_str[40] = "NOT_SUPPORT"; + char parent_pmic_str[60] = "NOT_SUPPORT"; uint32_t port, pin, trigger_mode; - uint32_t phandle; const uint32_t *prop_val; ofnode_for_each_subnode(child_node, parent_node) @@ -266,7 +368,7 @@ static int misc_regu_get_pmic_dev_config(ofnode parent_node, pmic_dev_info_t *pm pmic_name = ofnode_read_string(child_node, "pmic-name"); if (!pmic_name) { - printf("pmic_name property not set for %s%d", PMIC_DEV_DTS_NAME, index); + printf("pmic_name property not set for %s %d", PMIC_DEV_DTS_NAME, index); return -1; } @@ -289,7 +391,7 @@ static int misc_regu_get_pmic_dev_config(ofnode parent_node, pmic_dev_info_t *pm } pmic_addr_size = pmic_addr_len / sizeof(uint32_t); - if (pmic_addr_size != 2 && pmic_addr_size!= 1) + if (pmic_addr_size != 2 && pmic_addr_size != 1) { printf("invalid pmic-addr cell size %d\n", pmic_addr_size); return -1; @@ -310,16 +412,23 @@ static int misc_regu_get_pmic_dev_config(ofnode parent_node, pmic_dev_info_t *pm else { port = FDT32_TO_CPU(prop_val[0]); - pin = 1 << FDT32_TO_CPU(prop_val[1]); + pin = FDT32_TO_CPU(prop_val[1]); trigger_mode = FDT32_TO_CPU(prop_val[2]); dev->flag |= PMIC_DEV_ENABLE_ERR_IO; dev->err_io_info.gpio_port = port; dev->err_io_info.pin = pin; dev->err_io_info.trigger_mode = trigger_mode; + if (dev->err_io_info.trigger_mode > GPIO_IRQ_MODE_HIGH_LEVEL) + { + printf("io trigger_mode support max:%d, it is set to %d\n", GPIO_IRQ_MODE_HIGH_LEVEL, dev->err_io_info.trigger_mode); + return -1; + } sprintf(err_io_str, "port:%d pin:%d trigger:%d", port, pin, trigger_mode); } - } else { - sprintf(err_io_str, "NOT_SUPPORT"); + } + else + { + sprintf(err_io_str, "NOT_SUPPORT"); } prop_val = ofnode_get_property(child_node, "lpm_gpio", &gpio_addr_len); @@ -334,24 +443,57 @@ static int misc_regu_get_pmic_dev_config(ofnode parent_node, pmic_dev_info_t *pm else { port = FDT32_TO_CPU(prop_val[0]); - pin = 1 << FDT32_TO_CPU(prop_val[1]); + pin = FDT32_TO_CPU(prop_val[1]); trigger_mode = FDT32_TO_CPU(prop_val[2]); dev->flag |= PMIC_DEV_ENABLE_LPM_IO; dev->lpm_io_info.gpio_port = port; dev->lpm_io_info.pin = pin; dev->lpm_io_info.trigger_mode = trigger_mode; + if (dev->lpm_io_info.trigger_mode > GPIO_IRQ_MODE_HIGH_LEVEL) + { + printf("io trigger_mode support max:%d, it is set to %d\n", GPIO_IRQ_MODE_HIGH_LEVEL, dev->lpm_io_info.trigger_mode); + return -1; + } sprintf(lpm_io_str, "port:%d pin:%d trigger:%d", port, pin, trigger_mode); } - } else { - sprintf(lpm_io_str,"NOT_SUPPORT"); + } + else + { + sprintf(lpm_io_str, "NOT_SUPPORT"); + } + ret = misc_pmic_parent_io_ctrl_config(child_node, &dev->ctrl_info); + if (ret) + { + printf("grep pmic parent io ctrl faild %d\n", ret); + return -1; + } + else + { + if (dev->ctrl_info.pmic_ctrl_type == PMIC_CTRL_BY_AON_GPIO) + { + sprintf(parent_pmic_str, "ctrl by aon io: port:%d pin:%d activate_status:%d", dev->ctrl_info.info.aon_io.gpio_port, dev->ctrl_info.info.aon_io.pin, dev->ctrl_info.info.aon_io.activate_status); + } + else if (dev->ctrl_info.pmic_ctrl_type == PMIC_CTRL_BY_PMIC_GPIO) + { + sprintf(parent_pmic_str, "ctrl by pmic io: pmic:%d hw_id:%d activate_status:%d", dev->ctrl_info.info.pmic_io.pmic_id, dev->ctrl_info.info.pmic_io.io_hw_id, dev->ctrl_info.info.pmic_io.activate_status); + } + else + { + sprintf(parent_pmic_str, "NOT_SUPPORT"); + } } dev->pmic_id = index; ret = misc_grep_pmic_dev_name_info(pmic_name, dev); pmic_index++; - AON_CONF_D("Get pmic dev:[%d]:%s|%s addr1:0x%02x addr2:0x%02x wdt:{%s} errio:{%s} lpm_io:{%s}\n", index, dev->device_name, dev->version_name, dev->addr1, dev->addr2, (dev->flag & PMIC_DEV_ENABLE_WDT ? "SUPPORT" : "NOT_SUPPORT"), err_io_str, lpm_io_str); + AON_CONF_D("Get pmic dev:[%d]:%s|%s addr1:0x%02x addr2:0x%02x wdt:{%s} errio:{%s} lpm_io:{%s} pmic_ctrl_info:{%s}\n", index, dev->device_name, dev->version_name, dev->addr1, dev->addr2, (dev->flag & PMIC_DEV_ENABLE_WDT ? "SUPPORT" : "NOT_SUPPORT"), err_io_str, lpm_io_str, parent_pmic_str); } } + if (!pmic_index) + { + printf("No %s node found\n", PMIC_DEV_DTS_NAME); + return -1; + } return 0; } @@ -383,15 +525,10 @@ static int misc_regu_get_pmic_dev_by_name(const char *name, int pmic_dev_num, pm static int misc_regu_get_each_regu_hw_id_config(ofnode regu_id_node, int pmic_dev_num, pmic_dev_info_t *pmic_dev_info_list, soc_virtual_id_t *virtual_id_info, pmic_hw_info_t *id) { - uint32_t phandle; ofnode pmic_node, pmic_parent_node; - char *pmic_name; - int prop_len, prop_size; - int on_order, on_delay_ms; - int off_order, off_delay_ms; - int pmic_index, parent_pmic_index; + int pmic_index; const uint32_t *prop_val; /*get pmic_dev = <&pmic_dev_0 DA9063_ID_BCORE1>*/ @@ -451,12 +588,14 @@ static int misc_regu_get_each_regu_hw_id_config(ofnode regu_id_node, int pmic_de } (*id).soft_power_ctrl_info.on_info.on_order = FDT32_TO_CPU(prop_val[0]); (*id).soft_power_ctrl_info.on_info.on_delay_ms = FDT32_TO_CPU(prop_val[1]); - if(prop_size == 3) { - (*id).soft_power_ctrl_info.on_info.init_target_uv = FDT32_TO_CPU(prop_val[2]); - } else { + if (prop_size == 3) + { + (*id).soft_power_ctrl_info.on_info.init_target_uv = FDT32_TO_CPU(prop_val[2]); + } + else + { (*id).soft_power_ctrl_info.on_info.init_target_uv = 0; } - } /*get auto_off_info = <1 1>*/ @@ -507,8 +646,12 @@ static int misc_regu_get_each_regu_hw_id_config(ofnode regu_id_node, int pmic_de (*id).parent_hw_info.pmic_id = pmic_dev_info_list[pmic_index].pmic_id; (*id).parent_hw_info.io_hw_id = FDT32_TO_CPU(prop_val[1]); -#warning "check status" (*id).parent_hw_info.activate_status = FDT32_TO_CPU(prop_val[2]); + if (FDT32_TO_CPU(prop_val[2]) != HW_ID_ACTIVATE_HIGH && FDT32_TO_CPU(prop_val[2]) != HW_ID_ACTIVATE_LOW) + { + printf("parent hw io activate should set to: HW_ID_ACTIVATE_HIGH:0 or HW_ID_ACTIVATE_LOW:1"); + return -1; + } } return 0; @@ -519,13 +662,11 @@ static int misc_regu_get_each_regu_config(ofnode regu_config_node, int pmic_dev_ int ret = 0; ofnode hw_id_node; ofnode coupling_node; - uint32_t phandle = 0; int index = 0; - char *regu_id_name; const uint32_t *prop_val; int prop_len = 0; int prop_size = 0; - int coupling_num = 0; + int coupling_num = 0; uint16_t hw_id_used_flag = 0x0; ofnode_for_each_subnode(hw_id_node, regu_config_node) @@ -540,9 +681,9 @@ static int misc_regu_get_each_regu_config(ofnode regu_config_node, int pmic_dev_ return -1; } - if (index >= PMIC_MAX_HW_ID_NUM || index >= 8 * sizeof(uint16_t)) + if (index >= PMIC_MAX_HW_ID_NUM || index >= 8 * 2) { - printf("regu_id index should less than %d\n", MIN(PMIC_MAX_HW_ID_NUM, 8 * sizeof(uint16_t))); + printf("regu_id index should less than %d\n", MIN(PMIC_MAX_HW_ID_NUM, 8 * 2)); return -1; } @@ -559,11 +700,10 @@ static int misc_regu_get_each_regu_config(ofnode regu_config_node, int pmic_dev_ ret = misc_regu_get_each_regu_hw_id_config(hw_id_node, pmic_dev_num, pmic_dev_info_list, regu_info, &pmic_regu_id_info->sub.id[index]); if (ret) { - printf("get hw_id@%d config faild %d\n", ret); + printf("get hw_id@%d config faild %d\n", index, ret); return -1; } } - } for (int i = PMIC_MAX_HW_ID_NUM - 1; i >= 0; i--) @@ -573,74 +713,81 @@ static int misc_regu_get_each_regu_config(ofnode regu_config_node, int pmic_dev_ (*pmic_regu_id_info).sub.id[i].pmic_id = PMIC_ID_INVALID; } } - + ofnode_for_each_subnode(coupling_node, regu_config_node) { const char *node_name = ofnode_get_name(coupling_node); if (!strncmp(node_name, COUPLING_ID_INFO_NAME, strlen(COUPLING_ID_INFO_NAME))) { - /*get info = <0 1 -5 30>;*/ - prop_val = ofnode_get_property(coupling_node, "info", &prop_len); - if (!prop_val) - { - printf("no info property set for %s", node_name); - return -1; - } else - { - prop_size = prop_len / sizeof(uint32_t); - if (prop_size != 4) - { - printf("coupling info property should set in format as info = \n"); + /*get info = <0 1 -5 30>;*/ + prop_val = ofnode_get_property(coupling_node, "info", &prop_len); + if (!prop_val) + { + printf("no info property set for %s", node_name); return -1; } + else + { + prop_size = prop_len / sizeof(uint32_t); + if (prop_size != 4) + { + printf("coupling info property should set in format as info = \n"); + return -1; + } - int id0 = FDT32_TO_CPU(prop_val[0]); - int id1 = FDT32_TO_CPU(prop_val[1]); - int8_t max_spread = FDT32_TO_CPU(prop_val[2]); - int8_t min_spread = FDT32_TO_CPU(prop_val[3]); + int id0 = FDT32_TO_CPU(prop_val[0]); + int id1 = FDT32_TO_CPU(prop_val[1]); + int8_t max_spread = FDT32_TO_CPU(prop_val[2]); + int8_t min_spread = FDT32_TO_CPU(prop_val[3]); - if(ofnode_read_bool(coupling_node, "negative-min")) { - min_spread = -min_spread; - } - if(ofnode_read_bool(coupling_node, "negative-max")) { - max_spread = -max_spread; - } - if(id0 == id1) { - printf("coupling info: id0 id1 should not be equal"); - return -1; - } - if(min_spread > max_spread) { - printf("coupling info: min_spread:%d is higher than max_spread:%d", min_spread, max_spread); - return -1; - } - if(id0 >= PMIC_MAX_HW_ID_NUM || id1 >= PMIC_MAX_HW_ID_NUM) { - printf("coupling info: id0:%d id1:%d is higher than max_id:%d", id0, id1, PMIC_MAX_HW_ID_NUM -1); - return -1; - } + if (ofnode_read_bool(coupling_node, "negative-min")) + { + min_spread = -min_spread; + } + if (ofnode_read_bool(coupling_node, "negative-max")) + { + max_spread = -max_spread; + } + if (id0 == id1) + { + printf("coupling info: id0 id1 should not be equal"); + return -1; + } + if (min_spread > max_spread) + { + printf("coupling info: min_spread:%d is higher than max_spread:%d", min_spread, max_spread); + return -1; + } + if (id0 >= PMIC_MAX_HW_ID_NUM || id1 >= PMIC_MAX_HW_ID_NUM) + { + printf("coupling info: id0:%d id1:%d is higher than max_id:%d", id0, id1, PMIC_MAX_HW_ID_NUM - 1); + return -1; + } - if((*pmic_regu_id_info).sub.id[id0].pmic_id == PMIC_ID_INVALID || (*pmic_regu_id_info).sub.id[id1].pmic_id == PMIC_ID_INVALID) { - printf("coupling info:id0:%d id1:%d is invalid", id0, id1); - return -1; - } - (*pmic_regu_id_info).sub.coupling_list[coupling_num].id0 = id0; - (*pmic_regu_id_info).sub.coupling_list[coupling_num].id1 = id1; - (*pmic_regu_id_info).sub.coupling_list[coupling_num].max_spread = max_spread; - (*pmic_regu_id_info).sub.coupling_list[coupling_num].min_spread = min_spread; - coupling_num++; - if(coupling_num > PMIC_MAX_COUPLING_NUM) { - printf("coupling info should no more than %d\n", coupling_num); - return -1; + if ((*pmic_regu_id_info).sub.id[id0].pmic_id == PMIC_ID_INVALID || (*pmic_regu_id_info).sub.id[id1].pmic_id == PMIC_ID_INVALID) + { + printf("coupling info:id0:%d id1:%d is invalid", id0, id1); + return -1; + } + (*pmic_regu_id_info).sub.coupling_list[coupling_num].id0 = id0; + (*pmic_regu_id_info).sub.coupling_list[coupling_num].id1 = id1; + (*pmic_regu_id_info).sub.coupling_list[coupling_num].max_spread = max_spread; + (*pmic_regu_id_info).sub.coupling_list[coupling_num].min_spread = min_spread; + coupling_num++; + if (coupling_num > PMIC_MAX_COUPLING_NUM) + { + printf("coupling info should no more than %d\n", coupling_num); + return -1; + } } - } } - } - for(int i = PMIC_MAX_COUPLING_NUM - 1; i >= coupling_num; i--) + for (int i = PMIC_MAX_COUPLING_NUM - 1; i >= coupling_num; i--) { - (*pmic_regu_id_info).sub.coupling_list[i].id0 = REGU_SUB_ID_INVALID; - (*pmic_regu_id_info).sub.coupling_list[i].id1 = REGU_SUB_ID_INVALID; + (*pmic_regu_id_info).sub.coupling_list[i].id0 = REGU_SUB_ID_INVALID; + (*pmic_regu_id_info).sub.coupling_list[i].id1 = REGU_SUB_ID_INVALID; } return 0; @@ -649,11 +796,10 @@ static int misc_regu_get_each_regu_config(ofnode regu_config_node, int pmic_dev_ static int misc_regu_get_regu_config(ofnode parent_node, int pmic_dev_num, pmic_dev_info_t *pmic_dev_info_list, int virtual_id_num, soc_virtual_id_t *regu_list, csi_regu_id_t *pmic_regu_id_list) { ofnode child_node; - int index = 0; uint32_t phandle = 0; int ret = 0; ofnode regu_virtual_node; - char *regu_id_name; + const char *regu_id_name; int virtual_id_index = 0; uint16_t virtual_id_config_flag = 0; int regu_config_index = 0; @@ -661,7 +807,7 @@ static int misc_regu_get_regu_config(ofnode parent_node, int pmic_dev_num, pmic_ ofnode_for_each_subnode(child_node, parent_node) { virtual_id_index = 0; - char *node_name = ofnode_get_name(child_node); + const char *node_name = ofnode_get_name(child_node); if (!strncmp(node_name, REGU_ID_CONF_NAME, strlen(REGU_ID_CONF_NAME))) { @@ -718,7 +864,7 @@ static int misc_regu_get_regu_config(ofnode parent_node, int pmic_dev_num, pmic_ return -1; } - AON_CONF_D("Get regu config, virtual_regu_id:[%d]:%s min_uv:%dmv max_uv:%dmv\n", virtual_id, regu_list[virtual_id_index].virtual_id_name, regu_list[virtual_id_index].min_uv,regu_list[virtual_id_index].max_uv); + AON_CONF_D("Get regu config, virtual_regu_id:[%d]:%s min_uv:%dmv max_uv:%dmv\n", virtual_id, regu_list[virtual_id_index].virtual_id_name, regu_list[virtual_id_index].min_uv, regu_list[virtual_id_index].max_uv); for (int i = 0; i < ARRAY_SIZE(regu_conf->sub.id); i++) { pmic_hw_info_t *sub = ®u_conf->sub.id[i]; @@ -758,24 +904,31 @@ static int misc_regu_get_regu_config(ofnode parent_node, int pmic_dev_num, pmic_ } } int temp_flag = 0; - for(int i = 0; i < ARRAY_SIZE(regu_conf->sub.coupling_list); i++) { - coupling_desc_t* coupling_info = ®u_conf->sub.coupling_list[i]; - if(coupling_info->id0 != REGU_SUB_ID_INVALID) { - if(!temp_flag) { - AON_CONF_D(">>>>>>"); + for (int i = 0; i < ARRAY_SIZE(regu_conf->sub.coupling_list); i++) + { + coupling_desc_t *coupling_info = ®u_conf->sub.coupling_list[i]; + if (coupling_info->id0 != REGU_SUB_ID_INVALID) + { + if (!temp_flag) + { + AON_CONF_D(">>>>>>"); temp_flag = 1; } - AON_CONF_D("%s@%d:{id0:%d id1:%d max_spreed:%dmv min_spreed:%dmv} ", COUPLING_ID_INFO_NAME, i,coupling_info->id0, coupling_info->id1, coupling_info->max_spread *10 , coupling_info->min_spread * 10); + AON_CONF_D("%s@%d:{id0:%d id1:%d max_spreed:%dmv min_spreed:%dmv} ", COUPLING_ID_INFO_NAME, i, coupling_info->id0, coupling_info->id1, coupling_info->max_spread * 10, coupling_info->min_spread * 10); } } - if(temp_flag) { + if (temp_flag) + { AON_CONF_D("\n"); } regu_config_index++; } } - -#warning "add no config check" + if (!regu_config_index) + { + printf("No %s node found\n", REGU_ID_CONF_NAME); + return -1; + } return 0; } @@ -816,7 +969,7 @@ static int misc_regu_get_aon_pmic_config(struct udevice *dev, ofnode parent_node if (ret) { printf("pmic dev config get faild %d", ret); -#warning "free" + free(pmic_dev_info_list); return -1; } @@ -846,7 +999,8 @@ static int misc_regu_get_aon_pmic_config(struct udevice *dev, ofnode parent_node if (ret) { printf("get regu config faild %d\n", ret); -#warning "free" + free(pmic_dev_info_list); + free(pmic_regu_id_list); return -1; } @@ -859,15 +1013,19 @@ static int misc_regu_get_aon_pmic_config(struct udevice *dev, ofnode parent_node return 0; } +extern int device_bind_ofnode(struct udevice *parent, const struct driver *driver, + const char *name, const void *platdata, ofnode node, + struct udevice **devp); + static int misc_regu_bind(struct udevice *dev) { struct mic_regu_platdata *plat = dev_get_platdata(dev); ofnode parent_node = dev->node; - + const uint32_t *prop_val; + int prop_len = 0; + int prop_size = 0; int ret; - ofnode child_node, node, regu_node, aon_conf_node; - const void *blob = gd->fdt_blob; - int subnode; + ofnode child_node, aon_conf_node = {0}, regu_node = {0}; struct udevice *dev_1; /* If this is a child device, there is nothing to do here */ @@ -888,7 +1046,7 @@ static int misc_regu_bind(struct udevice *dev) ofnode_for_each_subnode(child_node, parent_node) { /* Increment base_id for all subnodes, also the disabled ones */ - //printf("sub node name: %s\n", ofnode_get_name(child_node)); + // printf("sub node name: %s\n", ofnode_get_name(child_node)); if (!strncmp(ofnode_get_name(child_node), REGU_DTS_NAME, strlen(REGU_DTS_NAME))) { regu_node = child_node; @@ -901,8 +1059,6 @@ static int misc_regu_bind(struct udevice *dev) } } - - if (!get_regu_dts_flag) { printf("No %s node in dts\n", REGU_DTS_NAME); @@ -921,18 +1077,48 @@ static int misc_regu_bind(struct udevice *dev) return -ENOMEM; } - plat->wakeup_flag = 0; + plat->wakeup_flag = 0; - if (ofnode_read_bool(parent_node, "wakeup-by-gpio-on")) { + if (ofnode_read_bool(parent_node, "wakeup-by-gpio-on")) + { plat->wakeup_flag |= AON_WAKEUP_BY_GPIO; printf("aon wakeup by gpio enabled\n"); } - if (ofnode_read_bool(parent_node, "wakeup-by-rtc-on")) { + if (ofnode_read_bool(parent_node, "wakeup-by-rtc-on")) + { plat->wakeup_flag |= AON_WAKEUP_BY_RTC; printf("aon wakeup by rtc enabled\n"); } + /*grep ii-config info*/ + prop_val = ofnode_get_property(aon_conf_node, "iic-config", &prop_len); + if (!prop_val) + { + printf("pmic-addr property not found\n"); + return -1; + } + prop_size = prop_len / sizeof(uint32_t); + if (prop_size != 3) + { + printf("invalid iic-config cell size %d,it should set in format as iic-config = < >\n", prop_size); + return -1; + } + plat->iic_config.iic_id = FDT32_TO_CPU(prop_val[0]); + plat->iic_config.addr_mode = FDT32_TO_CPU(prop_val[1]); + plat->iic_config.speed = FDT32_TO_CPU(prop_val[2]); + if (plat->iic_config.addr_mode > IIC_ADDRESS_10BIT) + { + printf("iic addr_mode only support IIC_ADDRESS_7BIT:0 IIC_ADDRESS_10BIT:1\n"); + return -1; + } + if (plat->iic_config.speed > IIC_BUS_SPEED_HIGH) + { + printf("iic speed max support IIC_BUS_SPEED_HIGH:%d\n", IIC_BUS_SPEED_HIGH); + return -1; + } + printf("iic id:%d addr_mode:%d speed:%d\n", plat->iic_config.iic_id, plat->iic_config.addr_mode, plat->iic_config.speed); + ret = misc_regu_get_virtual_regu_config(dev, regu_node, &plat->regu_list); if (ret) { diff --git a/drivers/misc/light_regu.h b/drivers/misc/light_regu.h index c383ffa5..b1a38454 100644 --- a/drivers/misc/light_regu.h +++ b/drivers/misc/light_regu.h @@ -1,7 +1,6 @@ #ifndef __LIGHT_REGU_H__ #define __LIGHT_REGU_H__ - typedef enum { SOC_DVDD18_AON, /*da9063: ldo-3 */ @@ -35,25 +34,23 @@ typedef enum SOC_REGU_INVALID = 0xFF } soc_virtual_id_en; - #define REGU_DTS_NAME "light-regu-reg" #define AON_CONF_NAME "aon_pmic_config" #define PMIC_DEV_DTS_NAME "pmic-dev" +#define PMIC_PARENT_CTRL_NAME "pmic_ctrl_info" #define REGU_ID_CONF_NAME "regu_config" -#define REGU_ID_NAME "regu_id" -#define COUPLING_ID_INFO_NAME "coupling_info" - +#define REGU_ID_NAME "regu_id" +#define COUPLING_ID_INFO_NAME "coupling_info" +#define PMIC_DEV_ENABLE_WDT (1U << 0) +#define PMIC_DEV_ENABLE_ERR_IO (1U << 1) +#define PMIC_DEV_ENABLE_LPM_IO (1U << 2) -#define PMIC_DEV_ENABLE_WDT (1U << 0) -#define PMIC_DEV_ENABLE_ERR_IO (1U << 1) -#define PMIC_DEV_ENABLE_LPM_IO (1U << 2) - -#define HW_ID_NO_SOFT_AUTO_ON (0xff) -#define HW_ID_NO_SOFT_AUTO_OFF (0xff) -#define HW_ID_INVALID (0xff) -#define PMIC_ID_INVALID (0xff) -#define REGU_SUB_ID_INVALID (0xff) +#define HW_ID_NO_SOFT_AUTO_ON (0xff) +#define HW_ID_NO_SOFT_AUTO_OFF (0xff) +#define HW_ID_INVALID (0xff) +#define PMIC_ID_INVALID (0xff) +#define REGU_SUB_ID_INVALID (0xff) #define REGU_EXT_ID_NAME_LEN 30 #define PMIC_DEV_NAME_LEN 20 @@ -63,108 +60,148 @@ typedef enum #define PMIC_MAX_COUPLING_NUM 3 #define AON_WAKEUP_BY_GPIO (1 << 0) -#define AON_WAKEUP_BY_RTC (1 << 1) +#define AON_WAKEUP_BY_RTC (1 << 1) + +#define AON_CONFIG_MAGIC "AON_CONFIG" +#define UBOOT_CONFIG_MAGIC "UBOOT_SET" +#define AON_CONFIG_VERSION "1.0.0" -typedef enum { - HW_ID_ACTIVATE_HIGH = 0U, - HW_ID_ACTIVATE_LOW = 1U, +typedef enum +{ + HW_ID_ACTIVATE_HIGH = 0U, + HW_ID_ACTIVATE_LOW = 1U, } hw_activate_status_en; -typedef struct __packed { +typedef struct __packed +{ uint8_t pmic_id; - uint8_t io_hw_id; - uint8_t activate_status; + uint8_t io_hw_id; + uint8_t activate_status; } pmic_parent_hw_io_ctrl_info_t; -typedef struct __packed { - uint8_t on_order; - uint8_t on_delay_ms; - uint32_t init_target_uv; +typedef struct __packed +{ + uint8_t on_order; + uint8_t on_delay_ms; + uint32_t init_target_uv; } regu_soft_power_ctrl_on_t; -typedef struct __packed { - uint8_t off_order; +typedef struct __packed +{ + uint8_t off_order; uint8_t off_delay_ms; } regu_soft_power_ctrl_off_t; -typedef struct __packed { - regu_soft_power_ctrl_on_t on_info; - regu_soft_power_ctrl_off_t off_info; +typedef struct __packed +{ + regu_soft_power_ctrl_on_t on_info; + regu_soft_power_ctrl_off_t off_info; } regu_soft_power_ctrl_t; - -typedef struct __packed { +typedef struct __packed +{ uint8_t id0; uint8_t id1; int8_t max_spread; // mv/10 int8_t min_spread; // mv/10 -}coupling_desc_t; +} coupling_desc_t; +typedef enum +{ + GPIO_IRQ_MODE_RISING_EDGE = 0, ///< Interrupt mode for rising edge + GPIO_IRQ_MODE_FALLING_EDGE, ///< Interrupt mode for falling edge + GPIO_IRQ_MODE_BOTH_EDGE, ///< Interrupt mode for both edge + GPIO_IRQ_MODE_LOW_LEVEL, ///< Interrupt mode for low level + GPIO_IRQ_MODE_HIGH_LEVEL, ///< Interrupt mode for high level +} csi_gpio_irq_mode_t; -typedef struct __packed { - uint8_t pmic_id; - uint8_t hw_id; - uint8_t benable; - pmic_parent_hw_io_ctrl_info_t parent_hw_info; - regu_soft_power_ctrl_t soft_power_ctrl_info; -} pmic_hw_info_t; +typedef enum +{ + IIC_ADDRESS_7BIT = 0U, ///< 7-bit address mode + IIC_ADDRESS_10BIT ///< 10-bit address mode +} csi_iic_addr_mode_t; +typedef enum +{ + IIC_BUS_SPEED_STANDARD = 0U, ///< Standard Speed (<=100kHz) + IIC_BUS_SPEED_FAST, ///< Fast Speed (<=400kHz) + IIC_BUS_SPEED_FAST_PLUS, ///< Fast plus Speed (<= 1MHz) + IIC_BUS_SPEED_HIGH ///< High Speed (<=3.4MHz) +} csi_iic_speed_t; -typedef struct __packed{ +typedef struct __packed +{ + uint8_t pmic_id; + uint8_t hw_id; + uint8_t benable; + pmic_parent_hw_io_ctrl_info_t parent_hw_info; + regu_soft_power_ctrl_t soft_power_ctrl_info; +} pmic_hw_info_t; + +typedef struct __packed +{ coupling_desc_t coupling_list[PMIC_MAX_COUPLING_NUM]; - pmic_hw_info_t id[PMIC_MAX_HW_ID_NUM]; ///< sub id1 for single-rail or first src of dual-rail -}pmic_hw_id_t; - -typedef struct __packed { - uint8_t regu_ext_id; ///< virtual global regulator id - char regu_ext_id_name[REGU_EXT_ID_NAME_LEN]; ///< vitual regu-id name - pmic_hw_id_t sub; ///< sub id set for dual-rail/single-rail regulator -}csi_regu_id_t; - -typedef enum { - PMIC_CTRL_BY_AON_GPIO = 0U, - PMIC_CTRL_BY_PMIC_GPIO = 1U, - PMIC_CTRL_BY_NOTHINTG = 0xFF, + pmic_hw_info_t id[PMIC_MAX_HW_ID_NUM]; ///< sub id1 for single-rail or first src of dual-rail +} pmic_hw_id_t; + +typedef struct __packed +{ + uint8_t regu_ext_id; ///< virtual global regulator id + char regu_ext_id_name[REGU_EXT_ID_NAME_LEN]; ///< vitual regu-id name + pmic_hw_id_t sub; ///< sub id set for dual-rail/single-rail regulator +} csi_regu_id_t; + +typedef enum +{ + PMIC_CTRL_BY_AON_GPIO = 0U, + PMIC_CTRL_BY_PMIC_GPIO = 1U, + PMIC_CTRL_BY_NOTHINTG = 0xFF, } pmic_ctrl_info_en; -typedef struct __packed { - uint8_t port; +typedef struct __packed +{ + uint8_t gpio_port; uint8_t pin; - uint8_t activate_status; + uint8_t activate_status; } pmic_ctrl_by_aon_info_t; -typedef struct __packed { +typedef struct __packed +{ uint8_t pmic_id; - uint8_t io_hw_id; - uint8_t activate_status; + uint8_t io_hw_id; + uint8_t activate_status; } pmic_ctrl_by_pmic_info_t; -typedef struct __packed { - uint8_t pmic_ctrl_type; - union { - pmic_ctrl_by_aon_info_t aon_io_info; - pmic_ctrl_by_pmic_info_t pmic_io_info; - }; +typedef struct __packed +{ + uint8_t pmic_ctrl_type; + union + { + pmic_ctrl_by_aon_info_t aon_io; + pmic_ctrl_by_pmic_info_t pmic_io; + } info; } pmic_parent_ctrl_info_t; -typedef struct __packed{ - uint16_t gpio_port; - uint16_t pin; - uint8_t trigger_mode; +typedef struct __packed +{ + uint8_t gpio_port; + uint8_t pin; + uint8_t trigger_mode; } pmic_interrupt_io_info_t; -typedef struct __packed { - char device_name[PMIC_DEV_NAME_LEN]; - char version_name[PMIC_DEV_VERSION_LEN]; - uint8_t pmic_id; - uint8_t addr1; - uint8_t addr2; - uint8_t flag; /*support wdt|errio| lpm io*/ +typedef struct __packed +{ + char device_name[PMIC_DEV_NAME_LEN]; + char version_name[PMIC_DEV_VERSION_LEN]; + uint8_t pmic_id; + uint8_t addr1; + uint8_t addr2; + uint8_t flag; /*support wdt|errio| lpm io*/ uint8_t slew_rate; - uint32_t wdt_len; + uint32_t wdt_len; pmic_interrupt_io_info_t err_io_info; pmic_interrupt_io_info_t lpm_io_info; - pmic_parent_ctrl_info_t ctrl_info; + pmic_parent_ctrl_info_t ctrl_info; } pmic_dev_info_t; typedef struct @@ -193,37 +230,42 @@ typedef struct csi_regu_id_t *regu_id_list; } regu_id_list_t; +typedef struct __packed +{ + uint8_t iic_id; ///< iic id + uint8_t addr_mode; ///< iic addr_mode ---> csi_iic_addr_mode_t + uint8_t speed; ///< iic speed type ---> csi_iic_speed_t + uint8_t reserved[1]; +} csi_pmic_if_config_t; + struct mic_regu_platdata { const char *name; - uint32_t wakeup_flag; + uint32_t wakeup_flag; + csi_pmic_if_config_t iic_config; virtual_regu_list_t regu_list; pmic_dev_list_t pmic_list; regu_id_list_t regu_id_list; }; - -#define AON_CONFIG_MAGIC "AON_CONFIG" -#define AON_CONFIG_VERSION "1.0.0" - -typedef struct __packed{ - uint8_t iic_id; - uint8_t pmic_dev_num; - uint8_t regu_num; - int pmic_dev_list_offset; - int regu_id_list_offset; -}aon_pmic_config_t; - -typedef struct __packed{ - const char magic[11]; - const char version[11]; - uint8_t max_hw_id_num; - uint64_t aon_config_partition_size; - uint32_t wakeup_flag; - aon_pmic_config_t aon_pmic; +typedef struct __packed +{ + csi_pmic_if_config_t iic_config; + uint8_t pmic_dev_num; + uint8_t regu_num; + uint32_t pmic_dev_list_offset; + uint32_t regu_id_list_offset; +} aon_pmic_config_t; + +typedef struct __packed +{ + const char magic[11]; + const char version[11]; + const char uboot_set_magic[11]; + uint8_t max_hw_id_num; + uint64_t aon_config_partition_size; + uint32_t wakeup_flag; + aon_pmic_config_t aon_pmic; } aon_config_t; - - - #endif \ No newline at end of file -- 2.34.1